diff --git a/.clang-format b/.clang-format index 18c50583..f7a9e21e 100644 --- a/.clang-format +++ b/.clang-format @@ -7,28 +7,41 @@ BasedOnStyle: LLVM IndentWidth: 4 UseTab: Never -BreakBeforeBraces: Linux +# === Struct/Union/Class member indentation === +# These options control indentation of struct members to ensure consistent +# 4-space indentation for all struct/union/class members +IndentAccessModifiers: false +AccessModifierOffset: 0 +NamespaceIndentation: All +IndentPPDirectives: BeforeHash + +BreakBeforeBraces: Attach BraceWrapping: AfterControlStatement: false - AfterFunction: true + AfterFunction: false AfterClass: false AfterStruct: false + # AfterStruct: false keeps struct opening brace on same line (K&R style) + # Struct members will still be indented with IndentWidth: 4 AfterUnion: false AfterNamespace: false AfterEnum: false BeforeCatch: false BeforeElse: false IndentBraces: false + # IndentBraces: false ensures braces themselves are not indented, + # but content inside braces respects IndentWidth setting -ContinuationIndentWidth: 0 -AlignAfterOpenBracket: false AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AllowShortBlocksOnASingleLine: Always -IndentCaseLabels: false -SpaceAfterCStyleCast: true +# AllowShortFunctionsOnASingleLine: None enforces function bodies +# to always be on separate lines, following K&R convention AllowShortFunctionsOnASingleLine: None -ColumnLimit: 80 + +IndentCaseLabels: true +SpaceAfterCStyleCast: false +ColumnLimit: 150 MaxEmptyLinesToKeep: 1 Cpp11BracedListStyle: false AlignTrailingComments: true @@ -39,7 +52,9 @@ IncludeBlocks: Regroup IncludeCategories: - Regex: '<[[:alnum:].]+>' Priority: 1 + # System headers (angle brackets) have highest priority - Regex: '.*' Priority: 2 + # Project headers (quotes) have lower priority SortIncludes: CaseSensitive AlignEscapedNewlines: Left \ No newline at end of file diff --git a/COMPILING.md b/COMPILING.md index 5b2833af..8b832fcf 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -2,10 +2,8 @@ Horizon OC Compilation Instructions 1. Install devkitpro (https://devkitpro.org/wiki/Getting_Started) with switch-dev 2. Set up a development enviorment for compiling Atmosphere (https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/building.md) -3. Install GNU make and ENSURE THAT YOUR ENVIORMENT HAS A PYTHON3 COMMAND AVAILABLE! -4. Git clone atmosphere (git clone https://github.com/Atmosphere-NX/Atmosphere.git) -5. Clone the Horizon OC develop branch (git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules) -6. Create a new folder named "build" in the horizon oc repo -7. Copy atmosphere files into that build folder -8. Copy Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp to build/stratosphere/loader/source/ldr_process_creation.cpp, replacing any files if prompted -9. Run ./build.sh in the root directory +3. Git clone atmosphere (git clone https://github.com/Atmosphere-NX/Atmosphere.git) +4. Clone the Horizon OC develop branch (``git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules``) +5. Create a new folder named ``build`` in the horizon oc repo +6. Copy atmosphere files into that build folder +7. Run ./build.sh in the root directory diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index ee0b3c7a..3fd708bf 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -35,10 +35,8 @@ volatile CustomizeTable C = { /* Disables RAM powerdown */ .hpMode = DISABLED, -.commonEmcMemVolt = 1175000, /* LPDDR4(X) JEDEC Specification */ -.eristaEmcMaxClock = 1600000, /* Maximum HB-MGCH ram rating */ -.eristaEmcMaxClock1 = 1600000, -.eristaEmcMaxClock2 = 1600000, +.commonEmcMemVolt = 1175000, /* LPDDR4(X) JEDEC Specification */ +.eristaEmcMaxClock = 1600000, /* Maximum HB-MGCH ram rating */ /* Available: 66MHz step rate, 100MHz step rate, 133MHz step rate and jedec. */ /* Jedec freqs are 1333MHz, 1600MHz, 1866MHz, 2133MHz, 2400MHz, 2666MHz, 2933MHz, 3200MHz. */ @@ -84,24 +82,6 @@ volatile CustomizeTable C = { /* 2133 */ 0, }, -/* You can mix and match different latencies if needed */ -/* - * Read: - * 2133RL = 40 - * 1866RL = 36 - * 1600RL = 32 - * 1331RL = 28 - * Write: - * 2133WL = 18 - * 1866WL = 16 - * 1600WL = 14 - * 1331WL = 12 - */ - -/* Erista only. */ -.mem_burst_read_latency = RL_1600, -.mem_burst_write_latency = WL_1600, - .eristaCpuUV = 0, .eristaCpuVmin = 800, .eristaCpuMaxVolt = 1200, @@ -133,7 +113,7 @@ volatile CustomizeTable C = { .eristaGpuUV = 0, .eristaGpuVmin = 810, -.marikoGpuUV = 0, +.marikoGpuUV = 2, /* Vmin past 795mV won't work due boot voltage being 800mV (can be adjusted though). */ .marikoGpuVmin = 610, .marikoGpuBootVolt = 800, /* Used during boot and when temp is <20°C */ @@ -141,9 +121,6 @@ volatile CustomizeTable C = { .commonGpuVoltOffset = 0, -/* Speedo is automatically set by hoc-clk on first boot */ -.gpuSpeedo = 1450, - /* Setting DEACTIVATED_GPU_FREQ on any freq will disable it and all freqs greater than it. (the latter is a bug :/) */ /* AUTO: Voltage is optimally chosen; with commonGpuVoltOffset applied. */ /* AUTO only works up to 1305 GPU on Mariko and 998 GPU on Erista (it is reccomended to manually set your 998MHz voltage though) */ @@ -480,6 +457,47 @@ volatile CustomizeTable C = { }, .marikoGpuDvfsTable = { + { 76800, {}, { 610000, } }, + { 153600, {}, { 610000, } }, + { 230400, {}, { 610000, } }, + { 307200, {}, { 610000, } }, + { 384000, {}, { 610000, } }, + { 460800, {}, { 610000, } }, + { 537600, {}, { 801688, -10900, -163, 298, -10599, 162 } }, + { 614400, {}, { 824214, -5743, -452, 238, -6325, 81 } }, + { 691200, {}, { 848830, -3903, -552, 119, -4030, -2 } }, + { 768000, {}, { 891575, -4409, -584, 0, -2849, 39 } }, + { 844800, {}, { 940071, -5367, -602, -60, -63, -93 } }, + { 921600, {}, { 986765, -6637, -614, -179, 1905, -13 } }, + { 998400, {}, { 1098475, -13529, -497, -179, 3626, 9 } }, + // { 1075200, {}, { 1163644, -12688, -648, 0, 1077, 40 } }, + // { 1152000, {}, { 1204812, -9908, -830, 0, 1469, 110 } }, + // { 1228800, {}, { 1277303, -11675, -859, 0, 3722, 313 } }, + // { 1267200, {}, { 1335531, -12567, -867, 0, 3681, 559 } }, + // { 1305600, {}, { 1374130, -13725, -859, 0, 4442, 576 } }, +}, + +.marikoGpuDvfsTableSLT = { + { 76800, {}, { 590000, } }, + { 153600, {}, { 590000, } }, + { 230400, {}, { 590000, } }, + { 307200, {}, { 590000, } }, + { 384000, {}, { 590000, } }, + { 460800, {}, { 795089, -11096, -163, 298, -10421, 162 } }, + { 537600, {}, { 795089, -11096, -163, 298, -10421, 162 } }, + { 614400, {}, { 820606, -6285, -452, 238, -6182, 81 } }, + { 691200, {}, { 846289, -4565, -552, 119, -3958, -2 } }, + { 768000, {}, { 888720, -5110, -584, 0, -2849, 39 } }, + { 844800, {}, { 936634, -6089, -602, -60, -99, -93 } }, + { 921600, {}, { 982562, -7373, -614, -179, 1797, -13 } }, + { 998400, {}, { 1090179, -14125, -497, -179, 3518, 9 } }, + { 1075200, {}, { 1155798, -13465, -648, 0, 1077, 40 } }, + // { 1152000, {}, { 1198568, -10904, -830, 0, 1469, 110 } }, + // { 1228800, {}, { 1269988, -12707, -859, 0, 3722, 313 } }, + // { 1267200, {}, { 1308155, -13694, -867, 0, 3681, 559 } }, +}, + +.marikoGpuDvfsTableHiOPT = { { 76800, { }, { GPU_MIN_MIN_VOLT, } }, { 153600, { }, { GPU_MIN_MIN_VOLT, } }, { 230400, { }, { GPU_MIN_MIN_VOLT, } }, @@ -494,12 +512,12 @@ volatile CustomizeTable C = { { 921600, { }, { 970060,-10108, -614,-179, 1508, -13 } }, { 998400, { }, { 1065665,-16075, -497,-179, 3213, 9 } }, { 1075200, { }, { 1132576,-16093, -648, 0, 1077, 40 } }, -// { 1152000, { }, { 1180029,-14534, -830, 0, 1469, 110 } }, + { 1152000, { }, { 1180029,-14534, -830, 0, 1469, 110 } }, // { 1228800, { }, { 1248293,-16383, -859, 0, 3722, 313 } }, // { 1267200, { }, { 1286399,-17475, -867, 0, 3681, 559 } }, }, -.marikoGpuDvfsTableSLT = { +.marikoGpuDvfsTableHiOPT15 = { { 76800, { }, { GPU_MIN_MIN_VOLT, } }, { 153600, { }, { GPU_MIN_MIN_VOLT, } }, { 230400, { }, { GPU_MIN_MIN_VOLT, } }, @@ -515,11 +533,11 @@ volatile CustomizeTable C = { { 998400, { }, { 1065665, -16075, -497, -179, 3213, 9 } }, { 1075200, { }, { 1132576, -16093, -648, 0, 1077, 40 } }, { 1152000, { }, { 1180029, -14534, -830, 0, 1469, 110 } }, - { 1228800, { }, { 1238293, -16383, -859, 0, 3722, 313 } }, +// { 1228800, { }, { 1238293, -16383, -859, 0, 3722, 313 } }, // { 1267200, { }, { 1276399, -17475, -867, 0, 3681, 559 } }, }, -.marikoGpuDvfsTableHiOPT = { +.marikoGpuDvfsTableHighUV = { { 76800, { }, { GPU_MIN_MIN_VOLT, } }, { 153600, { }, { GPU_MIN_MIN_VOLT, } }, { 230400, { }, { GPU_MIN_MIN_VOLT, } }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index 5cfb87ca..6408eb17 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -70,8 +70,6 @@ struct CustomizeTable { u32 commonEmcMemVolt; u32 eristaEmcMaxClock; - u32 eristaEmcMaxClock1; - u32 eristaEmcMaxClock2; StepMode stepMode; u32 marikoEmcMaxClock; @@ -97,9 +95,6 @@ struct CustomizeTable { u32 readLatency[4]; u32 writeLatency[4]; - u32 mem_burst_read_latency; - u32 mem_burst_write_latency; - u32 eristaCpuUV; u32 eristaCpuVmin; u32 eristaCpuMaxVolt; @@ -124,9 +119,7 @@ struct CustomizeTable { u32 marikoGpuBootVolt; u32 marikoGpuVmax; - u32 commonGpuVoltOffset; - - u32 gpuSpeedo; + s32 commonGpuVoltOffset; u32 eristaGpuVoltArray[27]; u32 marikoGpuVoltArray[24]; @@ -152,6 +145,8 @@ struct CustomizeTable { CustomizeGpuDvfsTable marikoGpuDvfsTable; CustomizeGpuDvfsTable marikoGpuDvfsTableSLT; CustomizeGpuDvfsTable marikoGpuDvfsTableHiOPT; + CustomizeGpuDvfsTable marikoGpuDvfsTableHiOPT15; + CustomizeGpuDvfsTable marikoGpuDvfsTableHighUV; }; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.cpp index f83186ee..a8106726 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.cpp @@ -18,11 +18,122 @@ namespace ams::ldr::hoc::pcv::erista { - void CalculateTimings(double tCK_avg) { - tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; + void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) { + latency += index * latencyStep; + } + + static s32 GetMaxLatencyIndex(volatile u32 *latencyArray, u32 latencySize) { + s32 maxIndex = -1; + for (u32 i = 0; i < latencySize; ++i) { + if (latencyArray[i]) { + maxIndex = i; + } + } + + return maxIndex; + } + + void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { + if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ + latency += latencyStep * 2; + } else { /* 2133tRWL */ + latency += latencyStep * 3; + } + } + + void HandleLatency(u32 freq, volatile u32 &latency, volatile u32 *latencyArray, u32 indexMax, u32 latencyStep) { + for (u32 i = 0; i <= indexMax; ++i) { + if (latencyArray[i] != 0 && freq <= latencyArray[i]) { + SwitchLatency(latency, i, latencyStep); + return; + } + } + + SwitchLatency(latency, indexMax, latencyStep); + } + + void HandleLatency(u32 freq) { + static s32 rlIndexMax = GetMaxLatencyIndex(C.readLatency, std::size(C.readLatency)); + static s32 wlIndexMax = GetMaxLatencyIndex(C.writeLatency, std::size(C.writeLatency)); + constexpr u32 ReadLatencyStep = 4; + constexpr u32 WriteLatencyStep = 2; + bool autoLatencyRead = false, autoLatencyWrite = false; + + if (rlIndexMax == -1) { + AutoLatency(RL, freq, ReadLatencyStep); + autoLatencyRead = true; + } + + if (wlIndexMax == -1) { + AutoLatency(WL, freq, WriteLatencyStep); + autoLatencyWrite = true; + } + + if (autoLatencyRead && autoLatencyWrite) { + return; + } + + if (!autoLatencyRead) { + HandleLatency(freq, RL, C.readLatency, rlIndexMax, ReadLatencyStep); + } + + if (!autoLatencyWrite) { + HandleLatency(freq, WL, C.writeLatency, wlIndexMax, WriteLatencyStep); + } + } + + void CalculateMrw2() { + static const u8 rlMapDBI[8] = { + 6, 12, 16, 22, 28, 32, 36, 40 + }; + + static const u8 wlMapSetA[8] = { + 4, 6, 8, 10, 12, 14, 16, 18 + }; + + u32 rlIndex = 0; + u32 wlIndex = 0; + + for (u32 i = 0; i < std::size(rlMapDBI); ++i) { + if (rlMapDBI[i] == 32) { + rlIndex = i; + break; + } + } + + for (u32 i = 0; i < std::size(wlMapSetA); ++i) { + if (wlMapSetA[i] == WL) { + wlIndex = i; + break; + } + } + + /* DBI is always enabled. */ + mrw2 = static_cast(((rlIndex & 0x7) | ((wlIndex & 0x7) << 3) | ((0 & 0x1) << 6))); + } + + void CalculateTimings(double tCK_avg, u32 freq) { + RL = RL_1331; + WL = WL_1331; + + HandleLatency(freq); + CalculateMrw2(); + + tR2P = CEIL((RL * 0.426) - 2.0); + tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW; + + tW2P = (CEIL(WL * 1.7303) * 2) - 5; tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast(tW2P))) + (BL / 2)); tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR; + wdv = WL; + wsv = WL - 2; + wev = 0xA + (WL - 14); + + u32 obdlyHigh = 3 / FLOOR(MIN(static_cast(2), tCK_avg * (WL - 7))); + u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0); + obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow); + pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361))); tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.hpp index 3a58c83a..7a61386d 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/erista/calculate_timings_erista.hpp @@ -18,6 +18,6 @@ namespace ams::ldr::hoc::pcv::erista { - void CalculateTimings(double tCK_avg); + void CalculateTimings(double tCK_avg, u32 freq); } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp index fca368d8..d03feafa 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp @@ -46,7 +46,7 @@ namespace ams::ldr::hoc::pcv::mariko { } void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ + if (freq > 1600'000 && freq <= 1862'400) { /* 1866tRWL */ latency += latencyStep * 2; } else { /* 2133tRWL */ latency += latencyStep * 3; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 1b592f0e..623c18a0 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -33,10 +33,6 @@ namespace ams::ldr::hoc { /* Burst latency, not to be confused with base latency (tWRL). */ const u32 BL = 16; - /* Base latency for read and write (tWRL). */ - const u32 RL = C.mem_burst_read_latency; - const u32 WL = C.mem_burst_write_latency; - /* Precharge to Precharge Delay. (tCK) */ const u32 tPPD = 4; @@ -87,19 +83,30 @@ namespace ams::ldr::hoc { const u32 tFAW = static_cast(tRRD * 4.0); const double tRPab = tRPpb + 3; - const u32 tR2P = CEIL((RL * 0.426) - 2.0); + inline u32 RL; + inline u32 WL; + + inline u32 tR2P; inline u32 tR2W; inline u32 rext; - const u32 tW2P = (CEIL(WL * 1.7303) * 2) - 5; + inline u32 tW2P; inline u32 tWTPDEN; inline u32 tW2R; + inline u32 wdv; + inline u32 wsv; + inline u32 wev; + + inline u32 obdly; + inline u32 pdex2rw; inline u32 tCLKSTOP; inline double pdex2mrr; + + inline u8 mrw2; } namespace pcv::mariko { diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index a34c2dd6..ee76e87f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -134,8 +134,14 @@ namespace ams::ldr::hoc::pcv { case 2: marikoGpuDvfsMaxFreq = static_cast(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq); break; + case 3: + marikoGpuDvfsMaxFreq = static_cast(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT15)->freq); + break; + case 4: + marikoGpuDvfsMaxFreq = static_cast(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHighUV)->freq); + break; default: - marikoGpuDvfsMaxFreq = static_cast(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq); + marikoGpuDvfsMaxFreq = static_cast(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq); break; } @@ -147,7 +153,7 @@ namespace ams::ldr::hoc::pcv { { eristaCpuDvfsMaxFreq, 1785'000, 2397'000, panic::Cpu, }, { marikoCpuDvfsMaxFreq, 1785'000, 2703'000, panic::Cpu, }, { C.commonEmcMemVolt, 912'500, 1350'000, panic::Emc, }, /* Official vmax for the RAMs is 1400-1500mV */ - { GET_MAX_OF_ARR(erista::maxEmcClocks), 1600'000, 2600'000, panic::Emc, }, + { C.eristaEmcMaxClock, 1600'000, 2600'000, panic::Emc, }, { C.marikoEmcMaxClock, 1600'000, 3500'000, panic::Emc, }, { C.marikoEmcVddqVolt, 400'000, 750'000, panic::Emc, }, { C.marikoSocVmax, 1000, 1200, panic::Emc, }, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp index 3bd40045..4afaedbf 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp @@ -127,8 +127,14 @@ namespace ams::ldr::hoc::pcv { case 2: customize_table = const_cast(C.marikoGpuDvfsTableHiOPT); break; + case 3: + customize_table = const_cast(C.marikoGpuDvfsTableHiOPT15); + break; + case 4: + customize_table = const_cast(C.marikoGpuDvfsTableHighUV); + break; default: - customize_table = const_cast(C.marikoGpuDvfsTable); + customize_table = const_cast(C.marikoGpuDvfsTableHiOPT); break; } } else { @@ -169,14 +175,14 @@ namespace ams::ldr::hoc::pcv { PATCH_OFFSET(&(entry->cvb_pll_param.c0), (C.marikoGpuVoltArray[i] * 1000)); ClearCvbPllEntry(entry); } else { - PATCH_OFFSET(&(entry->cvb_pll_param.c0), (entry->cvb_pll_param.c0 - C.commonGpuVoltOffset * 1000)); + PATCH_OFFSET(&(entry->cvb_pll_param.c0), (u32)((s32)entry->cvb_pll_param.c0 + C.commonGpuVoltOffset * 1000)); } } else { if (C.eristaGpuVoltArray[i] != 0) { PATCH_OFFSET(&(entry->cvb_pll_param.c0), (C.eristaGpuVoltArray[i] * 1000)); ClearCvbPllEntry(entry); } else { - PATCH_OFFSET(&(entry->cvb_pll_param.c0), (entry->cvb_pll_param.c0 - C.commonGpuVoltOffset * 1000)); + PATCH_OFFSET(&(entry->cvb_pll_param.c0), (u32)((s32)entry->cvb_pll_param.c0 + C.commonGpuVoltOffset * 1000)); } } ++entry; @@ -184,7 +190,7 @@ namespace ams::ldr::hoc::pcv { if (C.commonGpuVoltOffset && !(isMariko ? C.marikoGpuUV : C.eristaGpuUV)) { cvb_entry_t *entry = static_cast(gpu_cvb_table_head); for (size_t i = 0; i < customize_entry_count; ++i) { - PATCH_OFFSET(&(entry->cvb_pll_param.c0), (entry->cvb_pll_param.c0 - C.commonGpuVoltOffset * 1000)); + PATCH_OFFSET(&(entry->cvb_pll_param.c0), (u32)((s32)entry->cvb_pll_param.c0 + C.commonGpuVoltOffset * 1000)); ++entry; } } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp index e8f24261..53ff75d5 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_asm.hpp @@ -24,7 +24,7 @@ namespace ams::ldr::hoc::pcv { - constexpr u32 NopIns = 0x1f2003d5; + constexpr u32 NopIns = 0xD503201F; template u32 *ScanAssembly(u32 *ptr, u32 scanLimit, u32 pattern, Compare comp) { @@ -76,6 +76,30 @@ namespace ams::ldr::hoc::pcv { SF | Op | S | | RM | Cond | 0 | 0 | Rn | Rd 31 | 30 | 29 | 28 27 26 25 24 23 | 20 19 18 17 16 | 15 14 13 12 | 11 | 10 | 9 8 7 6 5 | 4 3 2 1 0 */ + inline auto AsmCbzCompareOpcodeOnly = [](u32 ins1, u32 ins2) { + return ((ins1 ^ ins2) >> 24) == 0; + }; + + inline auto AsmBlCompareOpcodeOnly = [](u32 ins1, u32 ins2) { + return ((ins1 ^ ins2) >> 26) == 0; + }; + inline bool AsmComparePrologue(u32 ins1, u32 ins2, u32 ins3, u32 cmp1, u32 cmp2, u32 cmp3) { + constexpr u32 StpImmMask = ~((((1u << 7) - 1u) << 15)); + + bool firstMatch = (ins1 & StpImmMask) == (cmp1 & StpImmMask); + + constexpr u32 StpRegsImmMask = ~(((1u << 5) - 1u) |(((1u << 5) - 1u) << 10) | (((1u << 7) - 1u) << 15)); + + bool secondMatch = (ins2 & StpRegsImmMask) == (cmp2 & StpRegsImmMask); + + + constexpr u32 MovMask = ~((1u << 5) - 1u); + + bool thirdMatch = (ins3 & MovMask) == (cmp3 & MovMask); + + return firstMatch && secondMatch && thirdMatch; + } + inline auto AsmCompareCselNoReg = [](u32 ins1, u32 ins2) { constexpr u32 ClearReg = ~(((1 << 10) - 1) | (((1 << 5) - 1) << 16)); return ((ins1 & ClearReg) ^ (ins2 & ClearReg)) == 0; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp index 85ef4de2..0197bc5a 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp @@ -3,6 +3,8 @@ * * Copyright (c) 2023 hanai3Bi * + * Copyright (c) B3711 + * * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it @@ -18,6 +20,7 @@ * along with this program. If not, see . */ +#include #include "pcv.hpp" #include "../mtc_timing_value.hpp" #include "../erista/calculate_timings_erista.hpp" @@ -215,7 +218,7 @@ namespace ams::ldr::hoc::pcv::erista { const u32 dyn_self_ref_control = (static_cast(7605.0 / tCK_avg) + 260) | (table->burst_regs.emc_dyn_self_ref_control & 0xffff0000); - CalculateTimings(tCK_avg); + CalculateTimings(tCK_avg, table->rate_khz); WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD)); WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD)); @@ -254,16 +257,17 @@ namespace ams::ldr::hoc::pcv::erista { WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN); /* Accept imperfection or prepare for suffering. */ + // #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING) // WRITE_PARAM_ALL_REG(table, emc_einput, einput); // WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration); - // WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); + WRITE_PARAM_ALL_REG(table, emc_obdly, obdly); // WRITE_PARAM_ALL_REG(table, emc_ibdly, ibdly); // WRITE_PARAM_ALL_REG(table, emc_wdv_mask, wdv); // WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width); // WRITE_PARAM_ALL_REG(table, emc_quse, quse); - // WRITE_PARAM_ALL_REG(table, emc_wdv, wdv); - // WRITE_PARAM_ALL_REG(table, emc_wsv, wsv); - // WRITE_PARAM_ALL_REG(table, emc_wev, wev); + WRITE_PARAM_ALL_REG(table, emc_wdv, wdv); + WRITE_PARAM_ALL_REG(table, emc_wsv, wsv); + WRITE_PARAM_ALL_REG(table, emc_wev, wev); // WRITE_PARAM_ALL_REG(table, emc_qrst, qrst); // WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst); // WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe); @@ -276,8 +280,9 @@ namespace ams::ldr::hoc::pcv::erista { // WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv); // WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2); // WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv); - // table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); + table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast(mrw2); // table->dram_timings.rl = RL; + // #endif constexpr double MC_ARB_DIV = 4.0; constexpr u32 MC_ARB_SFA = 2; @@ -360,65 +365,176 @@ namespace ams::ldr::hoc::pcv::erista { table->min_volt = std::clamp(900 + (C.emcDvbShift * 25), 900, 1050); } - /* Probably more intuitive to point to 40800 rather than 1600000, but oh well. */ - Result MemFreqMtcTable(u32 *ptr) { - u32 khz_list[] = { 40800, 68000, 102000, 204000, 408000, 665600, 800000, 1065600, 1331200, 1600000 }; - std::sort(maxEmcClocks, maxEmcClocks + std::size(maxEmcClocks)); - u32 khz_list_size = std::size(khz_list); + namespace { + std::vector newEmcList; + u32 *nsoStart; + } - // Generate list for mtc table pointers - EristaMtcTable *table_list[khz_list_size]; - for (u32 i = 0; i < khz_list_size; i++) { - u32 mtcIndex = khz_list_size - 1 - i; - u8 *table = reinterpret_cast(ptr) - offsetof(EristaMtcTable, rate_khz) - i * sizeof(EristaMtcTable); - table_list[mtcIndex] = reinterpret_cast(table); - R_UNLESS(table_list[mtcIndex]->rate_khz == khz_list[mtcIndex], ldr::ResultInvalidMtcTable()); - R_UNLESS(table_list[mtcIndex]->rev == MTC_TABLE_REV, ldr::ResultInvalidMtcTable()); + /* The silicon instructs; the children obey... */ + void MtcGenerateFreqTables() { + newEmcList.clear(); + newEmcList.reserve(DvfsTableEntryCount); + newEmcList.insert(newEmcList.end(), std::begin(EmcListDefault), std::end(EmcListDefault)); + + if (C.eristaEmcMaxClock <= EmcClkOSLimit) { + return; } - if (GET_MAX_OF_ARR(maxEmcClocks) <= EmcClkOSLimit) { + /* This is scuffed, but Eristas step rate is... weird? */ + /* 1766MHz seems to cause crashes with other freqs near it... why is anyones guess... */ + u32 freqsLow[] = { 1633000, 1666000, 1700000, 1733000, 1800000, 1833000, 1862400, }; + constexpr size_t freqsLowSize = std::size(freqsLow); + + for (size_t i = 0; i < freqsLowSize; ++i) { + if (freqsLow[i] <= C.eristaEmcMaxClock) { + newEmcList.push_back(freqsLow[i]); + } else { + break; + } + } + + if (C.eristaEmcMaxClock <= freqsLow[freqsLowSize - 1]) { + return; + } + + /* High range. */ + constexpr u32 StepRate = 38400; + while (newEmcList.back() + StepRate < C.eristaEmcMaxClock) { + newEmcList.push_back(newEmcList.back() + StepRate); + } + + if (newEmcList.back() != C.eristaEmcMaxClock) { + newEmcList.push_back(static_cast(C.eristaEmcMaxClock)); + } + + constexpr u32 PllmToggleFrequency = 19200; + + /* A step of 19.2khz will cause hangs, crashes and other weirdness. */ + /* Why? ¯\_(ツ)_/¯ */ + if (C.eristaEmcMaxClock - newEmcList[newEmcList.size() - 2] <= PllmToggleFrequency) { + newEmcList.erase(newEmcList.begin() + newEmcList.size() - 2); + } + + newEmcList.resize(std::min(newEmcList.size(), DvfsTableEntryLimit)); + } + + /* TODO: Template this */ + Result VerifyMtcTable(EristaMtcTable *tableStart, u32 expectedFreq) { + R_UNLESS(tableStart->rate_khz == expectedFreq, ldr::ResultInvalidMtcTable()); + R_UNLESS(tableStart->rev == MTC_TABLE_REV, ldr::ResultInvalidMtcTable()); + + R_SUCCEED(); + } + + /* TODO: Template this */ + Result MtcValidateAllTables(EristaMtcTable *tableStart, const u32 *validationList, u32 tableCount) { + for (u32 i = 0; i < tableCount; ++i) { + R_TRY(VerifyMtcTable(&tableStart[i], validationList[i])); + } + + R_SUCCEED(); + } + + /* TODO: Put this into common. */ + DramId GetDramId() { + u64 id64; + splGetConfig(SplConfigItem_DramId, &id64); + return static_cast(id64); + } + + MtcTableIndex GetMtcDramIndex(DramId dramId) { + for (u32 i = 0; i < std::size(mtcIndexTable); ++i) { + if (mtcIndexTable[i].dramId == dramId) { + return mtcIndexTable[i].index; + } + } + + return MtcTableIndex_Invalid; + } + + NORETURN void AbortInvalidMtc(const char *crashMsg) { + panic::SmcError(panic::Emc); + CRASH(crashMsg); + } + + u32 GetMtcOffset(MtcTableIndex index) { + if (index < T210SdevEmcDvfsTableS6gb01) { + return index * erista::MtcFullTableSize; + } + + /* Account for the weird in between mariko table. */ + return index * erista::MtcFullTableSize + mariko::MtcFullTableSize; + } + + void PrepareMtcMemoryRegion(u8 *firstTable, EristaMtcTable *usedTable) { + memmove(firstTable, usedTable, erista::MtcFullTableSize); + + /* Clear all other tables. */ + /* The used table is excluded. */ + constexpr size_t RemainingRegionSize = (mariko::MtcFullTableSize) * (mariko::MtcFullTableCount) + (erista::MtcFullTableSize * (erista::MtcFullTableCount - 1)); + memset(firstTable + erista::MtcFullTableSize, 0, RemainingRegionSize); + } + + void MtcExtendTables(EristaMtcTable *table) { + for (u32 i = erista::MtcTableCountDefault; i < newEmcList.size(); ++i) { + std::memcpy(&table[i], &table[i - 1], sizeof(EristaMtcTable)); + table[i].rate_khz = newEmcList[i]; + } + } + + Result MemFreqMtcTable(u32 *ptr) { + static const DramId dramId = [] { + DramId id = GetDramId(); + return id; + }(); + + static const MtcTableIndex mtcIndex = [] { + MtcTableIndex idx = GetMtcDramIndex(dramId); + /* If for some reason this happens, there is no chance of recovering this. */ + if (idx == MtcTableIndex_Invalid) { + AbortInvalidMtc("Invalid dramId"); + } + return idx; + }(); + + static const u32 mtcOffset = GetMtcOffset(mtcIndex); + + constexpr u32 StartAdjustment = offsetof(EristaMtcTable, rate_khz) + sizeof(EristaMtcTable) * (erista::MtcTableCountDefault - 1); + u8 *startPtr = reinterpret_cast(ptr) - StartAdjustment; + + EristaMtcTable *table = reinterpret_cast(startPtr + mtcOffset); + R_TRY(MtcValidateAllTables(table, EmcListDefault, EmcListSizeDefault)); + + PrepareMtcMemoryRegion(startPtr, table); + table = reinterpret_cast(startPtr); + + if (R_FAILED(MtcValidateAllTables(table, EmcListDefault, EmcListSizeDefault))) { + AbortInvalidMtc("Failed mtc validation"); + } + + if (C.eristaEmcMaxClock <= EmcClkOSLimit) { R_SKIP(); } - /* If we oc ram at all, tables are always shifted by at least 1. */ - u32 tableShifts = 1; - for (u32 i = 0; i < std::size(maxEmcClocks) - 1; ++i) { - /* Duplicated mtc tables may cause pcv to not select frequencies properly, causing issues. */ - if (maxEmcClocks[i] != maxEmcClocks[i + 1] && maxEmcClocks[i] > EmcClkOSLimit) { - ++tableShifts; - } else { - maxEmcClocks[i] = 0; - } + MtcExtendTables(table); + + if (R_FAILED(MtcValidateAllTables(table, newEmcList.data(), newEmcList.size()))) { + AbortInvalidMtc("Failed mtc validation"); } - /* Erista has extra, useless mtc tables, such as 40.8 Mhz, overwrite them to make room for oc freqs. */ - /* More than 3 tables can be overwritten, but 3 is plenty. */ - std::memmove(table_list[0], table_list[tableShifts], sizeof(EristaMtcTable) * (khz_list_size - tableShifts)); - - /* Since we're not scaling r/w latency properly on Erista, we first overwrite the tables with the 1600 MHz table before scaling it. */ - for (u32 i = 0; i < tableShifts; ++i) { - std::memcpy(table_list[khz_list_size - i - 1], table_list[khz_list_size - tableShifts - 1], sizeof(EristaMtcTable)); - } - - for (u32 i = tableShifts, j = 0; i > 0 && j < std::size(maxEmcClocks); ++j) { - if (!maxEmcClocks[j]) { - continue; - } - - table_list[khz_list_size - i]->rate_khz = maxEmcClocks[j]; - MemMtcTableAutoAdjust(table_list[khz_list_size - i]); - --i; + for (u32 i = erista::MtcTableCountDefault; i < newEmcList.size(); ++i) { + MemMtcTableAutoAdjust(&table[i]); } R_SUCCEED(); } Result MemFreqMax(u32 *ptr) { - if (GET_MAX_OF_ARR(maxEmcClocks) <= EmcClkOSLimit) { + if (C.eristaEmcMaxClock <= EmcClkOSLimit) { R_SKIP(); } - PATCH_OFFSET(ptr, GET_MAX_OF_ARR(maxEmcClocks)); + PATCH_OFFSET(ptr, C.eristaEmcMaxClock); R_SUCCEED(); } @@ -450,7 +566,58 @@ namespace ams::ldr::hoc::pcv::erista { // R_SUCCEED(); // } + + Result MemMtcTableAsm(u32 *ptr) { + /* This is a mess but the compiler made this painful to patch so we must do it this way */ + constexpr s32 GoodAdrpOffset = -1; + constexpr s32 GoodMovOffset = -7; + constexpr s32 GoodBlOffset = 1; + constexpr u32 MtcGoodBlOpcode = 0x97fe6cfc; + + constexpr u32 MtcBadBlOpcode0 = 0x97ffae64; // bl nn::pcv::GetHardwareType + constexpr u32 MtcBadBlOpcode1 = 0x940036d5; // bl nn::pcv::GetHardwareType + constexpr u32 MtcBadAdrpAsm = 0xd00000a1; // adrp x1, s_ModuleResetStatus_ + + constexpr s32 MtcBadBlOffset0 = 2; + constexpr s32 MtcBadBlOffset1 = -1; + constexpr s32 MtcBadAdrpOffset = 1; + + /* Ensure we don't dereference memory before nso start. */ + R_UNLESS(ptr + GoodMovOffset >= nsoStart, ldr::ResultInvalidMtcTablePattern()); + + /* Check for GetHardwareType asm and skip if it is found */ + /* The pattern will match on the first time, but the location is bad, so it must be skipped */ + if(AsmCompareAdrpNoImm(*(ptr + MtcBadAdrpOffset), MtcBadAdrpAsm) && AsmBlCompareOpcodeOnly(*(ptr + MtcBadBlOffset0), MtcBadBlOpcode0) && AsmBlCompareOpcodeOnly(*(ptr + MtcBadBlOffset1), MtcBadBlOpcode1)) { + R_SKIP(); + } + + /* We don't check for matching register because both registers must be x0 in order to pass the previous checks. */ + /* The correct instructions will always be x0 since the mtcTable pointer is returned. */ + u32 adrp = *(ptr + GoodAdrpOffset); + R_UNLESS(AsmCompareAdrpNoImm(adrp, MtcAdrpAsm), ldr::ResultInvalidMtcTablePattern()); + + + /* Check for the branch instruction above the cbz to ensure we are patching the right location*/ + u32 bl = *(ptr + GoodBlOffset); + R_UNLESS(AsmBlCompareOpcodeOnly(bl, MtcGoodBlOpcode), ldr::ResultInvalidMtcTablePattern()); + + + /* Check for the mov that actually sets the mtc table count. */ + u32 mov = *(ptr + GoodMovOffset); + R_UNLESS(asm_compare_no_rd(mov, MtcMovAsm), ldr::ResultInvalidMtcTablePattern()); + + /* Patch out the count of the mov to our custom mtc table amount*/ + u32 movCountPatch = asm_set_rd(asm_set_imm16(MtcMovAsm, newEmcList.size()), asm_get_rd(mov)); + + PATCH_OFFSET(ptr + GoodMovOffset, movCountPatch); + + R_SUCCEED(); + } + void Patch(uintptr_t mapped_nso, size_t nso_size) { + nsoStart = reinterpret_cast(mapped_nso); + MtcGenerateFreqTables(); + u32 CpuCvbDefaultMaxFreq = static_cast(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq); u32 GpuCvbDefaultMaxFreq = static_cast(GetDvfsTableLastEntry(GpuCvbTableDefault)->freq); @@ -465,10 +632,11 @@ namespace ams::ldr::hoc::pcv::erista { {"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn }, {"GPU PLL Max", & GpuFreqPllMax, 1, nullptr, GpuClkPllMax }, // {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit }, - {"MEM Freq Mtc", &MemFreqMtcTable, 0, nullptr, EmcClkOSLimit }, + {"MEM Freq Mtc", &MemFreqMtcTable, 1, nullptr, EmcClkOSLimit }, {"MEM Freq Max", &MemFreqMax, 0, nullptr, EmcClkOSLimit }, {"MEM Freq PLLM", &MemFreqPllmLimit, 2, nullptr, EmcClkPllmLimit }, {"MEM Volt", &MemVoltHandler, 2, nullptr, MemVoltHOS }, + {"MEM Table Asm", &MemMtcTableAsm, 4, &MemMtcGetGetTablePatternFn }, }; for (uintptr_t ptr = mapped_nso; ptr <= mapped_nso + nso_size - sizeof(EristaMtcTable); ptr += sizeof(u32)) { @@ -480,9 +648,12 @@ namespace ams::ldr::hoc::pcv::erista { } } + // ViewLog(); + for (auto &entry : patches) { - LOGGING("%s Count: %zu", entry.description, entry.patched_count); + LOGGING("%s Count: %zu\n", entry.description, entry.patched_count); if (R_FAILED(entry.CheckResult())) { + // ViewLog(); panic::SmcError(panic::Patch); CRASH(entry.description); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.hpp index 11f9041d..cdea82a9 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.hpp @@ -26,9 +26,6 @@ namespace ams::ldr::hoc::pcv::erista { - static u32 maxEmcClocks[] = { C.eristaEmcMaxClock2, C.eristaEmcMaxClock1, C.eristaEmcMaxClock, }; - #define GET_MAX_OF_ARR(ARR) (*std::max_element(ARR, ARR + std::size(ARR))) - constexpr cvb_entry_t CpuCvbTableDefault[] = { // CPU_PLL_CVB_TABLE_ODN { 204000, {721094}, { } }, @@ -109,8 +106,11 @@ namespace ams::ldr::hoc::pcv::erista { { }, }; + constexpr u32 EmcListDefault[] = { 40800, 68000, 102000, 204000, 408000, 665600, 800000, 1065600, 1331200, 1600000, }; + constexpr u32 EmcListSizeDefault = std::size(EmcListDefault); + constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1; + constexpr u32 MemVoltHOS = 1125'000; - constexpr u32 EmcClkMinFreq = 40800; /* 40.8 MHz table only exists on erista. */ constexpr u32 EmcClkPllmLimit = 1866'000'000; constexpr u32 MTC_TABLE_REV = 7; @@ -147,6 +147,17 @@ namespace ams::ldr::hoc::pcv::erista { { ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE, T210SdevEmcDvfsTableH4gb01, }, }; + constexpr u32 MtcBrAsm = 0xD61F0140; + constexpr u32 MtcMovAsm = 0x52800148; + constexpr u32 MtcAdrpAsm = 0xD0000081; + constexpr u32 MtcBlIns = 0x97ffae64; + constexpr u32 MtcAddAsm = 0x91131821; + + ALWAYS_INLINE bool MemMtcGetGetTablePatternFn(u32 *ptr) { + /* This builds an address that gets returned, so the register must be x0 by convention. */ + return AsmCompareAddNoImm12(*ptr, MtcAddAsm); + } + void Patch(uintptr_t mapped_nso, size_t nso_size); -} +} \ No newline at end of file diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp index d5787206..05e1246b 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp @@ -3,6 +3,8 @@ * * Copyright (c) 2023 hanai3Bi * + * Copyright (c) B3711 + * * Copyright (c) Souldbminer and Horizon OC Contributors * * This program is free software; you can redistribute it and/or modify it @@ -50,11 +52,10 @@ namespace ams::ldr::hoc::pcv::mariko { R_THROW(ldr::ResultInvalidGpuDvfs()); } - - if(C.marikoGpuBootVolt) { - PATCH_OFFSET(ptr - 3, C.marikoGpuBootVolt); + if (C.marikoGpuBootVolt) { + PATCH_OFFSET(ptr - 3, C.marikoGpuBootVolt); } - + if (C.marikoGpuVmin) { PATCH_OFFSET(ptr, C.marikoGpuVmin); PATCH_OFFSET(ptr + 3, C.marikoGpuVmin); @@ -300,8 +301,14 @@ namespace ams::ldr::hoc::pcv::mariko { case 2: max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq; break; + case 3: + max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT15)->freq; + break; + case 4: + max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHighUV)->freq; + break; default: - max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq; + max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq; break; } @@ -638,14 +645,14 @@ namespace ams::ldr::hoc::pcv::mariko { } void MtcGenerateFreqTables() { - if (C.marikoEmcMaxClock <= EmcClkOSLimit) { - return; - } - newEmcList.clear(); newEmcList.reserve(DvfsTableEntryCount); newEmcList.insert(newEmcList.end(), std::begin(EmcListDefault), std::end(EmcListDefault)); + if (C.marikoEmcMaxClock <= EmcClkOSLimit) { + return; + } + u32 stepRate = 0; switch (C.stepMode) { case StepMode_66MHz: @@ -767,10 +774,6 @@ namespace ams::ldr::hoc::pcv::mariko { MarikoMtcTable *table = reinterpret_cast(startPtr + mtcOffset); R_TRY(MtcValidateAllTables(table, EmcListDefault, EmcListSizeDefault)); - if (C.marikoEmcMaxClock <= EmcClkOSLimit) { - R_SKIP(); - } - PrepareMtcMemoryRegion(startPtr, table); table = reinterpret_cast(startPtr); @@ -778,6 +781,10 @@ namespace ams::ldr::hoc::pcv::mariko { AbortInvalidMtc("Failed mtc validation"); } + if (C.marikoEmcMaxClock <= EmcClkOSLimit) { + R_SKIP(); + } + MtcExtendTables(table); if (R_FAILED(MtcValidateAllTables(table, newEmcList.data(), newEmcList.size()))) { @@ -837,33 +844,33 @@ namespace ams::ldr::hoc::pcv::mariko { DvbEntry emcDvbOcTableBrackets[] = { { 204000, { 637, 637, 637, }, }, { 1331200, { 650, 637, 637, }, }, - { 1600000, { 675, 650, 637, }, }, - { 1866000, { DVB(DvbVolt( 700, 675, 650)) }, }, - { 2133000, { DVB(DvbVolt( 725, 700, 675)) }, }, - { 2246000, { DVB(DvbVolt( 750, 725, 700)) }, }, - { 2400000, { DVB(DvbVolt( 775, 750, 725)) }, }, - { 2466000, { DVB(DvbVolt( 800, 775, 750)) }, }, - { 2533000, { DVB(DvbVolt( 810, 785, 760)) }, }, - { 2566000, { DVB(DvbVolt( 820, 795, 770)) }, }, - { 2600000, { DVB(DvbVolt( 830, 805, 780)) }, }, - { 2633000, { DVB(DvbVolt( 840, 815, 790)) }, }, - { 2666000, { DVB(DvbVolt( 850, 825, 800)) }, }, - { 2700000, { DVB(DvbVolt( 860, 835, 810)) }, }, - { 2733000, { DVB(DvbVolt( 870, 845, 820)) }, }, - { 2766000, { DVB(DvbVolt( 880, 855, 830)) }, }, - { 2800000, { DVB(DvbVolt( 895, 865, 840)) }, }, - { 2833000, { DVB(DvbVolt( 900, 875, 850)) }, }, - { 2866000, { DVB(DvbVolt( 910, 885, 860)) }, }, - { 2900000, { DVB(DvbVolt( 920, 895, 870)) }, }, - { 2933000, { DVB(DvbVolt( 950, 905, 880)) }, }, - { 2966000, { DVB(DvbVolt( 960, 915, 890)) }, }, - { 3000000, { DVB(DvbVolt( 970, 925, 900)) }, }, - { 3033000, { DVB(DvbVolt( 980, 940, 910)) }, }, - { 3066000, { DVB(DvbVolt(1000, 955, 920)) }, }, - { 3100000, { DVB(DvbVolt(1010, 990, 930)) }, }, - { 3133000, { DVB(DvbVolt(1025, 1005, 940)) }, }, - { 3166000, { DVB(DvbVolt(1035, 1015, 950)) }, }, - { 3200000, { DVB(DvbVolt(1050, 1025, 960)) }, }, + { 1600000, { 675, 650, 637, }, }, + { 1866000, { DVB(DvbVolt( 700, 675, 650)) }, }, + { 2000000, { DVB(DvbVolt( 712, 687, 662)) }, }, + { 2133000, { DVB(DvbVolt( 725, 700, 675)) }, }, + { 2200000, { DVB(DvbVolt( 737, 712, 687)) }, }, + { 2266000, { DVB(DvbVolt( 750, 725, 700)) }, }, + { 2333000, { DVB(DvbVolt( 762, 737, 712)) }, }, + { 2400000, { DVB(DvbVolt( 775, 750, 725)) }, }, + { 2433000, { DVB(DvbVolt( 787, 762, 737)) }, }, + { 2466000, { DVB(DvbVolt( 800, 775, 750)) }, }, + { 2533000, { DVB(DvbVolt( 812, 787, 762)) }, }, + { 2566000, { DVB(DvbVolt( 825, 800, 775)) }, }, + { 2600000, { DVB(DvbVolt( 837, 812, 787)) }, }, + { 2666000, { DVB(DvbVolt( 850, 825, 800)) }, }, + { 2700000, { DVB(DvbVolt( 875, 850, 825)) }, }, + { 2733000, { DVB(DvbVolt( 887, 862, 837)) }, }, + { 2766000, { DVB(DvbVolt( 912, 887, 862)) }, }, + { 2800000, { DVB(DvbVolt( 925, 900, 875)) }, }, + { 2833000, { DVB(DvbVolt( 937, 912, 887)) }, }, + { 2900000, { DVB(DvbVolt( 950, 925, 900)) }, }, + { 2933000, { DVB(DvbVolt( 962, 937, 912)) }, }, + { 3000000, { DVB(DvbVolt( 975, 950, 925)) }, }, + { 3033000, { DVB(DvbVolt( 987, 962, 937)) }, }, + { 3100000, { DVB(DvbVolt(1000, 975, 950)) }, }, + { 3133000, { DVB(DvbVolt(1025, 1000, 975)) }, }, + { 3166000, { DVB(DvbVolt(1037, 1012, 987)) }, }, + { 3200000, { DVB(DvbVolt(1050, 1025, 1000)) }, }, { ~0u, { }, }, }; #undef DVB diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.hpp index 43258993..65955f1a 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.hpp @@ -148,8 +148,6 @@ namespace ams::ldr::hoc::pcv::mariko { constexpr u32 EmcListDefault[] = { 204000, 1331200, 1600000, }; constexpr u32 EmcListSizeDefault = std::size(EmcListDefault); constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1; - constexpr u32 EmcRateStep = 33'000; - constexpr u32 EmcRateStepScale = 33'200; constexpr u32 EmcClkOSAlt = 1331'200; constexpr u32 EmcClkPllmLimit = 2133'000'000; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp index 7ae9183a..15917d0e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/ptm/ptm.cpp @@ -84,7 +84,7 @@ namespace ams::ldr::hoc::ptm { switch (entry->cpu_freq_1) { case cpuPtmBoost: - cpuPtmBoostPatch.Apply(entry); + R_DISCARD(cpuPtmBoostPatch.Apply(entry)); break; case cpuPtmDefault: case cpuPtmDevOC: @@ -99,7 +99,7 @@ namespace ams::ldr::hoc::ptm { case memPtmAlt: case memPtmClamp: if (isMariko) { - memPtmPatch.Apply(entry); + R_DISCARD(memPtmPatch.Apply(entry)); } break; default: @@ -109,13 +109,15 @@ namespace ams::ldr::hoc::ptm { } LOGGING("%s Count: %zu", cpuPtmBoostPatch.description, cpuPtmBoostPatch.patched_count); - if (R_FAILED(cpuPtmBoostPatch.CheckResult())) + if (R_FAILED(cpuPtmBoostPatch.CheckResult())) { CRASH(cpuPtmBoostPatch.description); + } if (isMariko) { LOGGING("%s Count: %zu", memPtmPatch.description, memPtmPatch.patched_count); - if (R_FAILED(memPtmPatch.CheckResult())) + if (R_FAILED(memPtmPatch.CheckResult())) { CRASH(memPtmPatch.description); + } } } diff --git a/Source/hoc-clk/assets/hoc.rgba b/Source/hoc-clk/assets/hoc.rgba index c39dbae2..dcb3812d 100644 Binary files a/Source/hoc-clk/assets/hoc.rgba and b/Source/hoc-clk/assets/hoc.rgba differ diff --git a/Source/hoc-clk/common/include/hocclk/board.h b/Source/hoc-clk/common/include/hocclk/board.h index 376b34ba..944e7271 100644 --- a/Source/hoc-clk/common/include/hocclk/board.h +++ b/Source/hoc-clk/common/include/hocclk/board.h @@ -125,7 +125,9 @@ typedef enum { } HocClkSpeedo; typedef enum { - GPUUVLevel_HiOPT = 0, + GPUUVLevel_NoUV = 0, + GPUUVLevel_SLT, + GPUUVLevel_HiOPT, GPUUVLevel_HiOPT15, GPUUVLevel_HighUV, GPUUVLevel_EnumMax, diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index afb333d9..5abd4f85 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -46,12 +46,8 @@ typedef enum { HocClkConfigValue_ThermalThrottle, HocClkConfigValue_ThermalThrottleThreshold, - HocClkConfigValue_HandheldTDP, - HocClkConfigValue_HandheldTDPLimit, - - HocClkConfigValue_LiteTDPLimit, - HocClkConfigValue_BatteryChargeCurrent, + HocClkConfigValue_InputCurrentLimit, HocClkConfigValue_OverwriteRefreshRate, HocClkConfigValue_MaxDisplayClockH, @@ -74,6 +70,10 @@ typedef enum { HocClkConfigValue_AulaDisplayColorPreset, HocClkConfigValue_MarikoMiddleFreqs, + + HocClkConfigValue_AutoRAMCPUOverclock, + HocClkConfigValue_AutoRamCpuCpuOCFreq, + HocClkConfigValue_AutoRamCpuRamOCThreshold, KipConfigValue_custRev, KipConfigValue_KipVersion, @@ -82,8 +82,6 @@ typedef enum { KipConfigValue_commonEmcMemVolt, KipConfigValue_eristaEmcMaxClock, - KipConfigValue_eristaEmcMaxClock1, - KipConfigValue_eristaEmcMaxClock2, KipConfigValue_stepMode, KipConfigValue_marikoEmcMaxClock, @@ -116,9 +114,6 @@ typedef enum { KipConfigValue_write_latency_1866, KipConfigValue_write_latency_2133, - KipConfigValue_mem_burst_read_latency, - KipConfigValue_mem_burst_write_latency, - KipConfigValue_eristaCpuUV, KipConfigValue_eristaCpuVmin, KipConfigValue_eristaCpuMaxVolt, @@ -143,7 +138,6 @@ typedef enum { KipConfigValue_marikoGpuVmax, KipConfigValue_commonGpuVoltOffset, - KipConfigValue_gpuSpeedo, KipConfigValue_g_volt_76800, KipConfigValue_g_volt_153600, @@ -241,17 +235,11 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case HocClkConfigValue_ThermalThrottleThreshold: return pretty ? "Thermal Throttle Threshold" : "thermal_throttle_threshold"; - case HocClkConfigValue_HandheldTDP: - return pretty ? "Handheld TDP" : "handheld_tdp"; - - case HocClkConfigValue_HandheldTDPLimit: - return pretty ? "Handheld TDP Limit" : "tdp_limit"; - - case HocClkConfigValue_LiteTDPLimit: - return pretty ? "Handheld TDP Limit" : "tdp_limit_l"; - case HocClkConfigValue_BatteryChargeCurrent: return pretty ? "Battery Charge Current" : "bat_charge_current"; + + case HocClkConfigValue_InputCurrentLimit: + return pretty ? "Input Current Limit" : "in_curr_limit"; case HocClkConfigValue_OverwriteRefreshRate: return pretty ? "Display Refresh Rate Changing" : "drr_changing"; @@ -294,6 +282,14 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr return pretty ? "Aula Display Color Preset" : "aula_color_preset"; case HocClkConfigValue_MarikoMiddleFreqs: return pretty ? "Mariko Middle Clocks" : "mariko_middle_freqs"; + + case HocClkConfigValue_AutoRAMCPUOverclock: + return pretty ? "Auto High RAM CPU OC" : "auto_high_ram_cpu_oc"; + case HocClkConfigValue_AutoRamCpuCpuOCFreq: + return pretty ? "Auto High RAM CPU OC Freq" : "auto_ram_cpu_cpu_oc_freq"; + case HocClkConfigValue_AutoRamCpuRamOCThreshold: + return pretty ? "Auto High RAM CPU OC RAM Threshold" : "auto_ram_cpu_ram_oc_threshold"; + // KIP config values case KipConfigValue_custRev: return pretty ? "Custom Revision" : "kip_cust_rev"; @@ -308,11 +304,7 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_commonEmcMemVolt: return pretty ? "Common EMC/MEM Voltage" : "common_emc_mem_volt"; case KipConfigValue_eristaEmcMaxClock: - return pretty ? "Erista EMC Max Clock 1" : "erista_emc_max_clock"; - case KipConfigValue_eristaEmcMaxClock1: - return pretty ? "Erista EMC Max Clock 2" : "erista_emc_max_clock1"; - case KipConfigValue_eristaEmcMaxClock2: - return pretty ? "Erista EMC Max Clock 3" : "erista_emc_max_clock2"; + return pretty ? "Erista EMC Max Clock" : "erista_emc_max_clock2"; case KipConfigValue_stepMode: return pretty ? "Step Mode:" : "step_mode"; case KipConfigValue_marikoEmcMaxClock: @@ -369,11 +361,6 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_write_latency_2133: return pretty ? "2133 Write Latency" : "write_latency_2133"; - case KipConfigValue_mem_burst_read_latency: - return pretty ? "Memory Burst Read Latency" : "mem_burst_read_latency"; - case KipConfigValue_mem_burst_write_latency: - return pretty ? "Memory Burst Write Latency" : "mem_burst_write_latency"; - // CPU – Erista case KipConfigValue_eristaCpuUV: return pretty ? "Erista CPU Undervolt" : "erista_cpu_uv"; @@ -424,8 +411,6 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_commonGpuVoltOffset: return pretty ? "Common GPU Voltage Offset" : "common_gpu_volt_offset"; - case KipConfigValue_gpuSpeedo: - return pretty ? "GPU Speedo" : "gpu_speedo"; // Mariko GPU voltages (24) case KipConfigValue_g_volt_76800: return pretty ? "Mariko GPU Volt 76 MHz" : "g_volt_76800"; @@ -505,6 +490,7 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_UncappedClocks: case HocClkConfigValue_OverwriteBoostMode: case HocClkConfigValue_BatteryChargeCurrent: + case HocClkConfigValue_InputCurrentLimit: case HocClkConfigValue_OverwriteRefreshRate: case HocClkConfigValue_GPUScheduling: case HocClkConfigValue_LiveCpuUv: @@ -521,16 +507,16 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) return 1963ULL; case HocClkConfigValue_ThermalThrottle: - case HocClkConfigValue_HandheldTDP: case HocClkConfigValue_IsFirstLoad: case HocClkConfigValue_DVFSMode: + case HocClkConfigValue_AutoRAMCPUOverclock: return 1ULL; + case HocClkConfigValue_AutoRamCpuCpuOCFreq: + return 1683000ULL; + case HocClkConfigValue_AutoRamCpuRamOCThreshold: + return 2666000ULL; case HocClkConfigValue_ThermalThrottleThreshold: return 70ULL; - case HocClkConfigValue_HandheldTDPLimit: - return 9600ULL; // 8600mW will trigger on erista stock, so raise it a bit - case HocClkConfigValue_LiteTDPLimit: - return 6400ULL; // 0.5C case HocClkConfigValue_CpuGovernorMinimumFreq: return 612000000ULL; // 612MHz case HocClkConfigValue_MaxDisplayClockH: @@ -551,8 +537,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_EristaMaxCpuClock: case HocClkConfigValue_MarikoMaxCpuClock: case HocClkConfigValue_ThermalThrottleThreshold: - case HocClkConfigValue_HandheldTDPLimit: - case HocClkConfigValue_LiteTDPLimit: case HocClkConfigValue_PollingIntervalMs: case HocClkConfigValue_MaxDisplayClockH: return input > 0; @@ -564,22 +548,21 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_UncappedClocks: case HocClkConfigValue_OverwriteBoostMode: case HocClkConfigValue_ThermalThrottle: - case HocClkConfigValue_HandheldTDP: case HocClkConfigValue_OverwriteRefreshRate: case HocClkConfigValue_IsFirstLoad: case HocClkConfigValue_EnableExperimentalSettings: case HocClkConfigValue_LiveCpuUv: case HocClkConfigValue_GPUSchedulingMethod: case HocClkConfigValue_MarikoMiddleFreqs: + case HocClkConfigValue_AutoRAMCPUOverclock: return (input & 0x1) == input; + case KipConfigValue_KipVersion: case KipConfigValue_custRev: // case KipConfigValue_mtcConf: case KipConfigValue_hpMode: case KipConfigValue_commonEmcMemVolt: case KipConfigValue_eristaEmcMaxClock: - case KipConfigValue_eristaEmcMaxClock1: - case KipConfigValue_eristaEmcMaxClock2: case KipConfigValue_stepMode: case KipConfigValue_marikoEmcMaxClock: case KipConfigValue_marikoEmcVddqVolt: @@ -605,8 +588,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_write_latency_1600: case KipConfigValue_write_latency_1866: case KipConfigValue_write_latency_2133: - case KipConfigValue_mem_burst_read_latency: - case KipConfigValue_mem_burst_write_latency: case KipConfigValue_eristaCpuUV: case KipConfigValue_eristaCpuMaxVolt: case KipConfigValue_marikoCpuUVLow: @@ -625,7 +606,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case KipConfigValue_marikoGpuBootVolt: case KipConfigValue_marikoGpuVmax: case KipConfigValue_commonGpuVoltOffset: - case KipConfigValue_gpuSpeedo: case KipConfigValue_g_volt_76800: case KipConfigValue_g_volt_153600: case KipConfigValue_g_volt_230400: @@ -690,13 +670,19 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_MemoryFrequencyMeasurementMode: case HocClkConfigValue_RamDisplayUnit: case HocClkConfigValue_AulaDisplayColorPreset: + case HocClkConfigValue_AutoRamCpuCpuOCFreq: + case HocClkConfigValue_AutoRamCpuRamOCThreshold: return true; case HocClkConfigValue_BatteryChargeCurrent: return ((input >= 1024) && (input <= 3072)) || !input; + + case HocClkConfigValue_InputCurrentLimit: + return ((input >= 100) && (input <= 3000)) || !input; + case HocClkConfigValue_DisplayVoltage: return ((input >= 800) && (input <= 1325)); default: return true; } -} \ No newline at end of file +} diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index cba8b621..dcd9ce5d 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -22,12 +22,12 @@ BUILD := build OUTDIR := out RESOURCES := res SOURCES := src src/ui/gui src/ui/elements ../common/src ../common/src/client -DATA := data +DATA := data ../assets INCLUDES := ../common/include EXEFS_SRC := exefs_src IS_MINIMAL := 0 -APP_TITLE := Horizon OC Gaea +APP_TITLE := Horizon OC NO_ICON := 1 @@ -166,6 +166,11 @@ $(OUTPUT).elf: $(OFILES) @echo $(notdir $<) @$(bin2o) +%.rgba.o : %.rgba +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + -include $(DEPENDS) #--------------------------------------------------------------------------------------- diff --git a/Source/hoc-clk/overlay/data/logo_rgba.bin b/Source/hoc-clk/overlay/data/logo_rgba.bin deleted file mode 100644 index d5b9ced7..00000000 Binary files a/Source/hoc-clk/overlay/data/logo_rgba.bin and /dev/null differ diff --git a/Source/hoc-clk/overlay/lang/de.json b/Source/hoc-clk/overlay/lang/de.json index d2eedf0b..00e05a56 100644 --- a/Source/hoc-clk/overlay/lang/de.json +++ b/Source/hoc-clk/overlay/lang/de.json @@ -1,37 +1,33 @@ { "Information": "Informationen", - "IDDQ:": "IDDQ:", - "Module: ": "Modul:", - "sys-dock status:": "Sys-Dock-Status:", - "SaltyNX status:": "SaltyNX-Status:", - "RR Display status:": "RR Anzeigestatus:", - "Wafer Position:": "Waferposition:", - "Credits": "Credits", - "Developers": "Entwickler", - "Contributors": "Mitwirkende", - "Testers": "Tester", - "Special Thanks": "Besonderer Dank", "Unknown": "Unbekannt", "Installed": "Installiert", "Not Installed": "Nicht installiert", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ", "Default": "Standard", "Do Not Override": "Nicht überschreiben", + "Do not override": "Nicht überschreiben", "Disabled": "Deaktiviert", "Enabled": "Aktiviert", - " \\ue0e3 Reset": "\\ue0e3 Zurücksetzen", - "Display": "Anzeige", - "Application changed\\n\\n": "Anwendung geändert\\n\\n", - "The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n", - "while editing was going on.": "während die Bearbeitung im Gange war.", - "Board": "Vorstand", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Aktiviert (Standard)", + "Enable": "Aktivieren", + "Fatal error": "Fataler Fehler", "Could not connect to hoc-clk sysmodule.\\n\\n": "Es konnte keine Verbindung zum hoc-clk-Systemmodul hergestellt werden.\\n\\n", "Please make sure everything is\\n\\n": "Bitte stellen Sie sicher, dass alles in Ordnung ist\\n\\n", "correctly installed and enabled.": "korrekt installiert und aktiviert.", - "Fatal error": "Fataler Fehler", + + "Edit App Profile": "App-Profil bearbeiten", + "Edit Global Profile": "Globales Profil bearbeiten", + "Temporary Overrides": "Temporäre Überschreibungen", "Temporary Overrides ": "Temporäre Überschreibungen", + "  Reset": " Zurücksetzen", + "Settings": "Einstellungen", + "About": "Über", + "Credits": "Credits", + + "Application changed\\n\\n": "Anwendung geändert\\n\\n", + "The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n", + "while editing was going on.": "während die Bearbeitung im Gange war.", + "Sleep Mode": "Schlafmodus", "Stock": "Lager", "Dev OC": "Entwickler OC", @@ -40,57 +36,74 @@ "Unsafe Max": "Unsicher max", "Absolute Max": "Absolutes Maximum", "Handheld Safe Max": "Handsafe max", - "Enable": "Aktivieren", - "Edit App Profile": "App-Profil bearbeiten", - "Edit Global Profile": "Globales Profil bearbeiten", - "Temporary Overrides": "Temporäre Überschreibungen", - "Settings": "Einstellungen", - "About": "Über", - "Compiling with minimal features": "Kompilieren mit minimalen Funktionen", + "General Settings": "Allgemeine Einstellungen", - "Governor Settings": "Gouverneurseinstellungen", + "Governor Settings": "Regler-Einstellungen", "Safety Settings": "Sicherheitseinstellungen", - "Save KIP Settings": "Speichern Sie die KIP-Einstellungen", + "Save KIP Settings": "KIP-Einstellungen speichern", "RAM Settings": "RAM-Einstellungen", "CPU Settings": "CPU-Einstellungen", "GPU Settings": "GPU-Einstellungen", "Display Settings": "Anzeigeeinstellungen", + "Experimental Settings": "Experimentelle Einstellungen", "Experimental": "Experimentell", + + " Settings marked in blue": "Blau markierte Einstellungen", + "don't require a reboot to apply!": "erfordern keinen Neustart zum Aktivieren!", + "You can also press  to show": "Drücken Sie auch  zum Anzeigen", + "information about each setting.": "von Informationen zu jeder Einstellung.", + + " Experimental Settings are incomplete ": "Experimentelle Einstellungen unvollständig", + "and may not work correctly or at all!": "und funktionieren möglicherweise gar nicht!", + "Here be dragons!": "Hier gibt es Drachen!", + + "RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus", + "RAM Display Unit": "RAM-Anzeigeeinheit", + "Polling Interval": "Abfrageintervall", + "GPU Scheduling Override Method": "GPU-Planungsüberschreibungsmethode", + "GPU Scheduling Override": "GPU-Planungsüberschreibung", + "GPU Boot Volt": "GPU Boot-Spannung", + "GPU Boot Voltage": "GPU Boot-Spannung", + "Memory Frequency Measurement Mode": "RAM-Frequenz-Messmodus", + " Overriding the charge current": "Überschreiben des Ladestroms", "can be dangerous and may cause": "kann gefährlich sein und verursachen", "damage to your battery or charger!": "Schäden an Ihrem Akku oder Ladegerät!", "Charge Current Override": "Ladestrom-Überbrückung", - "RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus", - "Polling Interval": "Abfrageintervall", + "Display Color Preset": "Farbprofil", + "Basic": "Standard", + "Saturated": "Gesättigt", + "Washed": "Verblasst", + "Natural": "Natürlich", + "Vivid": "Lebendig", + "CPU Governor Minimum Frequency": "Mindestfrequenz des CPU-Reglers", + " Usage of unsafe display": "Verwendung unsicherer Bildschirmfrequenzen", "refresh rates may cause stress": "Bildwiederholraten können Stress verursachen", "or damage to your display! ": "oder Schäden an Ihrem Display!", "Proceed at your own risk!": "Das Vorgehen erfolgt auf eigene Gefahr!", "Max Handheld Display": "Max Handheld-Display", + "Max Handheld Display Hz": "Max. Handheld-Hz", "Display Clock": "Uhr anzeigen", + " Adjust the display voltage": "Display-Spannung anpassen", + "with caution to avoid damage": "mit Vorsicht, um Schäden zu vermeiden", + "to your display panel! ": "am Display-Panel!", + "Display Voltage": "Display-Spannung", + + "Thermal Throttle Limit": "Thermische Drosselgrenze", "Official Rating": "Offizielle Bewertung", "TDP Threshold": "TDP-Schwellenwert", "Power": "Macht", - "Thermal Throttle Limit": "Thermische Drosselgrenze", "HP Mode": "HP-Modus", - "Default (Mariko)": "Standard (Mariko)", - "Default (Erista)": "Standard (Erista)", - "Rating": "Bewertung", - "Safe Max (Mariko)": "Safe Max (Mariko)", - "Safe Max (Erista)": "Safe Max (Erista)", + + "DVB Shift": "DVB-Versatz", + "SoC Max Volt": "SoC Max-Spannung", + "Step Mode": "Schritt-Modus", "RAM VDD2 Voltage": "RAM VDD2 Spannung", - "Voltage": "Spannung", "RAM VDDQ Voltage": "RAM-VDDQ-Spannung", + "Voltage": "Spannung", "RAM Frequency Editor": "RAM-Frequenzeditor", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Hoher Tacho erforderlich!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Tacho/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Tacho/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Tacho/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Tacho/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Tacho/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Tacho/PLL)", - "Ram Max Clock": "Ram Max Uhr", + "Ram Max Clock": "Ram Max Takt", "RAM Latency Editor": "RAM-Latenz-Editor", "RAM Timing Reductions": "Reduzierung des RAM-Timings", "Memory Timings": "Speicherzeiten", @@ -102,6 +115,15 @@ "Memory Latencies": "Speicherlatenzen", "Read Latency": "Leselatenz", "Write Latency": "Schreiblatenz", + "High speedo needed!": "Hoher Speedo-Wert erforderlich!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU-Boost-Takt", "CPU UV": "CPU-UV", "CPU Unlock": "CPU-Entsperrung", @@ -110,32 +132,84 @@ "CPU Max Clock": "Maximaler CPU-Takt", "Extreme UV Table": "Extremer UV-Tisch", "CPU UV Table": "CPU-UV-Tisch", - "CPU Low UV": "CPU-niedrige UV-Strahlung", - "CPU High UV": "CPU Hohe UV-Strahlung", + "CPU Low UV": "CPU niedrige UV", + "CPU High UV": "CPU hohe UV", "CPU Low VMIN": "CPU niedrig VMIN", "CPU High VMIN": "CPU hoch VMIN", + "No Undervolt": "Kein Undervolt", - "SLT Table": "SLT-Tisch", + "SLT Table": "SLT-Tabelle", "HiOPT Table": "HiOPT-Tabelle", "GPU Undervolt Table": "GPU-Unterspannungstabelle", "GPU Minimum Voltage": "GPU-Mindestspannung", - "Calculate GPU Vmin": "Berechnen Sie die GPU-Vmin", + "Calculate GPU Vmin": "GPU-Vmin berechnen", "GPU VMIN": "GPU-VMIN", "GPU Maximum Voltage": "Maximale GPU-Spannung", "GPU Voltage Offset": "GPU-Spannungsoffset", - "Do not override": "Nicht überschreiben", - "Enabled (Default)": "Aktiviert (Standard)", - "96.6% limit": "96,6 %-Grenze", - "99.7% limit": "99,7 %-Grenze", - "GPU Scheduling Override": "GPU-Planungsüberschreibung", - "Official Service": "Offizieller Dienst", "GPU DVFS Mode": "GPU-DVFS-Modus", "GPU DVFS Offset": "GPU-DVFS-Offset", "GPU Voltage Table": "GPU-Spannungstabelle", "GPU Custom Table (mV)": "Benutzerdefinierte GPU-Tabelle (mV)", + "Official Service": "Offizieller Dienst", + "96.6% limit": "96,6 %-Grenze", + "99.7% limit": "99,7 %-Grenze", + " Setting GPU Clocks past": "GPU-Takt überschreiten", + "1228MHz without a proper undervolt": "1228 MHz ohne korrekten Undervolt", + "can cause degradation or damage": "kann Degradierung oder Schäden verursachen", + "to your console!": "an Ihrer Konsole!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz ohne UV, 1152 MHz auf SLT", "or 1228MHz on HiOPT can cause ": "oder 1228 MHz auf HiOPT kann dazu führen", - "permanent damage to your Switch!": "Dauerhafter Schaden an Ihrem Switch!", + "permanent damage to your Switch!": "dauerhafter Schaden an Ihrem Switch!", "921MHz without UV and 960MHz on": "921 MHz ohne UV und 960 MHz eingeschaltet", - "SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen" + "SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen", + + "Default (Mariko)": "Standard (Mariko)", + "Default (Erista)": "Standard (Erista)", + "Rating": "Bewertung", + "Safe Max (Mariko)": "Safe Max (Mariko)", + "Safe Max (Erista)": "Safe Max (Erista)", + + "Voltages": "Spannungen", + "RAM Voltage:": "RAM-Spannung:", + "Display Voltage:": "Display-Spannung:", + "Temperatures": "Temperaturen", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Warm", + "Hot": "Heiß", + "Overheat": "Überhitzung", + "Not Patched": "Nicht gepatcht", + "Invalid": "Ungültig", + "RAM Bandwidth": "RAM-Bandbreite", + "RAM BW (Peak):": "RAM-BW (Max.):", + "RAM BW (All):": "RAM-BW (Ges.):", + "RAM BW (CPU):": "RAM-BW (CPU):", + "RAM BW (GPU):": "RAM-BW (GPU):", + "Hardware Info": "Hardware-Info", + "Console Type:": "Konsolentyp:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM-Modul: ", + "Software Info": "Software-Info", + "KIP version:": "KIP-Version:", + "sys-dock status:": "Sys-Dock-Status:", + "SaltyNX status:": "SaltyNX-Status:", + "RR Display status:": "RR Anzeigestatus:", + "Wafer Position:": "Waferposition:", + "IDDQ:": "IDDQ:", + "Module: ": "Modul:", + "Board": "Vorstand", + "Display": "Anzeige", + + "Developers": "Entwickler", + "Contributors": "Mitwirkende", + "Testers": "Tester", + "Translators": "Übersetzer", + "Special Thanks": "Besonderer Dank", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Kompilieren mit minimalen Funktionen", + "THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ" } diff --git a/Source/hoc-clk/overlay/lang/es.json b/Source/hoc-clk/overlay/lang/es.json index a938c1e3..7743bef3 100644 --- a/Source/hoc-clk/overlay/lang/es.json +++ b/Source/hoc-clk/overlay/lang/es.json @@ -1,37 +1,33 @@ { "Information": "Información", - "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", - "sys-dock status:": "Estado de sys-dock:", - "SaltyNX status:": "Estado de SaltyNX:", - "RR Display status:": "Estado de pantalla RR:", - "Wafer Position:": "Posición del wafer:", - "Credits": "Créditos", - "Developers": "Desarrolladores", - "Contributors": "Colaboradores", - "Testers": "Testers", - "Special Thanks": "Agradecimientos especiales", "Unknown": "Desconocido", "Installed": "Instalado", "Not Installed": "No instalado", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE", "Default": "Predeterminado", "Do Not Override": "No sobrescribir", + "Do not override": "No sobrescribir", "Disabled": "Desactivado", "Enabled": "Activado", - " \\ue0e3 Reset": "\\ue0e3 Restablecer", - "Display": "Pantalla", - "Application changed\\n\\n": "Aplicación cambiada\\n\\n", - "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", - "while editing was going on.": "mientras se estaba editando.", - "Board": "Placa", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Activado (predeterminado)", + "Enable": "Activar", + "Fatal error": "Error fatal", "Could not connect to hoc-clk sysmodule.\\n\\n": "No se pudo conectar al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Asegúrate de que todo esté\\n\\n", "correctly installed and enabled.": "correctamente instalado y activado.", - "Fatal error": "Error fatal", + + "Edit App Profile": "Editar perfil de aplicación", + "Edit Global Profile": "Editar perfil global", + "Temporary Overrides": "Ajustes temporales", "Temporary Overrides ": "Ajustes temporales", + "  Reset": " Restablecer", + "Settings": "Configuración", + "About": "Acerca de", + "Credits": "Créditos", + + "Application changed\\n\\n": "Aplicación cambiada\\n\\n", + "The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n", + "while editing was going on.": "mientras se estaba editando.", + "Sleep Mode": "Modo reposo", "Stock": "Valores de fábrica", "Dev OC": "OC de desarrollo", @@ -40,13 +36,7 @@ "Unsafe Max": "Máximo no seguro", "Absolute Max": "Máximo absoluto", "Handheld Safe Max": "Máximo seguro en portátil", - "Enable": "Activar", - "Edit App Profile": "Editar perfil de aplicación", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Ajustes temporales", - "Settings": "Configuración", - "About": "Acerca de", - "Compiling with minimal features": "Compilado con funciones mínimas", + "General Settings": "Configuración general", "Governor Settings": "Configuración del governor", "Safety Settings": "Configuración de seguridad", @@ -55,41 +45,64 @@ "CPU Settings": "Configuración de CPU", "GPU Settings": "Configuración de GPU", "Display Settings": "Configuración de pantalla", + "Experimental Settings": "Configuración experimental", "Experimental": "Experimental", + + " Settings marked in blue": "La configuración en azul", + "don't require a reboot to apply!": "no requiere reinicio para aplicarse.", + "You can also press  to show": "Pulsa  para mostrar", + "information about each setting.": "información sobre cada ajuste.", + + " Experimental Settings are incomplete ": "La configuración experimental está incompleta", + "and may not work correctly or at all!": "y puede que no funcione correctamente.", + "Here be dragons!": "¡Aquí hay dragones!", + + "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", + "RAM Display Unit": "Unidad de visualización RAM", + "Polling Interval": "Intervalo de sondeo", + "GPU Scheduling Override Method": "Método de sobrescritura del scheduling de GPU", + "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", + "GPU Boot Volt": "Voltaje de arranque GPU", + "GPU Boot Voltage": "Voltaje de arranque GPU", + "Memory Frequency Measurement Mode": "Modo de medición de frecuencia de memoria", + " Overriding the charge current": "Sobrescribir la corriente de carga", "can be dangerous and may cause": "puede ser peligroso y causar", "damage to your battery or charger!": "daños a la batería o al cargador.", "Charge Current Override": "Sobrescritura de corriente de carga", - "RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM", - "Polling Interval": "Intervalo de sondeo", + "Display Color Preset": "Preajuste de color", + "Basic": "Básico", + "Saturated": "Saturado", + "Washed": "Lavado", + "Natural": "Natural", + "Vivid": "Vívido", + "CPU Governor Minimum Frequency": "Frecuencia mínima del governor de CPU", + " Usage of unsafe display": "El uso de frecuencias de pantalla", "refresh rates may cause stress": "las tasas de refresco pueden causar estrés", "or damage to your display! ": "o dañar la pantalla.", "Proceed at your own risk!": "¡Úsalo bajo tu propio riesgo!", "Max Handheld Display": "Frecuencia máxima de pantalla en portátil", + "Max Handheld Display Hz": "Hz máximo en modo portátil", "Display Clock": "Frecuencia de pantalla", + " Adjust the display voltage": "Ajusta el voltaje de pantalla", + "with caution to avoid damage": "con cuidado para evitar daños", + "to your display panel! ": "al panel de pantalla.", + "Display Voltage": "Voltaje de pantalla", + + "Thermal Throttle Limit": "Límite de thermal throttling", "Official Rating": "Valor oficial", "TDP Threshold": "Umbral de TDP", "Power": "Potencia", - "Thermal Throttle Limit": "Límite de thermal throttling", "HP Mode": "Modo alto rendimiento", - "Default (Mariko)": "Predeterminado (Mariko)", - "Default (Erista)": "Predeterminado (Erista)", - "Rating": "Valor", - "Safe Max (Mariko)": "Máximo seguro (Mariko)", - "Safe Max (Erista)": "Máximo seguro (Erista)", + + "DVB Shift": "Desplazamiento DVB", + "SoC Max Volt": "Voltaje máximo del SoC", + "Step Mode": "Modo de paso", "RAM VDD2 Voltage": "Voltaje VDD2 de RAM", - "Voltage": "Voltaje", "RAM VDDQ Voltage": "Voltaje VDDQ de RAM", + "Voltage": "Voltaje", "RAM Frequency Editor": "Editor de frecuencia de RAM", - "JEDEC.": "JEDEC", - "High speedo needed!": "¡Se necesita alto speedo!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", "Ram Max Clock": "Frecuencia máxima de RAM", "RAM Latency Editor": "Editor de latencias de RAM", "RAM Timing Reductions": "Reducción de timings de RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latencias de memoria", "Read Latency": "Latencia de lectura", "Write Latency": "Latencia de escritura", + "High speedo needed!": "¡Se necesita alto speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)", + "JEDEC.": "JEDEC", + "CPU Boost Clock": "Frecuencia boost de CPU", "CPU UV": "Undervolt de CPU", "CPU Unlock": "Desbloqueo de CPU", @@ -114,6 +136,7 @@ "CPU High UV": "Undervolt alto de CPU", "CPU Low VMIN": "VMIN bajo de CPU", "CPU High VMIN": "VMIN alto de CPU", + "No Undervolt": "Sin undervolt", "SLT Table": "Tabla SLT", "HiOPT Table": "Tabla HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "VMIN de GPU", "GPU Maximum Voltage": "Voltaje máximo de GPU", "GPU Voltage Offset": "Offset de voltaje de GPU", - "Do not override": "No sobrescribir", - "Enabled (Default)": "Activado (predeterminado)", - "96.6% limit": "Límite 96,6%", - "99.7% limit": "Límite 99,7%", - "GPU Scheduling Override": "Sobrescritura de scheduling de GPU", - "Official Service": "Servicio oficial", "GPU DVFS Mode": "Modo DVFS de GPU", "GPU DVFS Offset": "Offset DVFS de GPU", "GPU Voltage Table": "Tabla de voltaje de GPU", "GPU Custom Table (mV)": "Tabla personalizada de GPU (mV)", + "Official Service": "Servicio oficial", + "96.6% limit": "Límite 96,6%", + "99.7% limit": "Límite 99,7%", + " Setting GPU Clocks past": "Ajustar frecuencias de GPU más allá", + "1228MHz without a proper undervolt": "1228MHz sin undervolt adecuado", + "can cause degradation or damage": "puede causar degradación o daños", + "to your console!": "a tu consola.", "1075MHz without UV, 1152MHz on SLT": "1075MHz sin undervolt, 1152MHz en SLT", "or 1228MHz on HiOPT can cause ": "o 1228MHz en HiOPT pueden causar ", "permanent damage to your Switch!": "¡daño permanente a tu Switch!", "921MHz without UV and 960MHz on": "921MHz sin undervolt y 960MHz en", - "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar " -} \ No newline at end of file + "SLT or HiOPT can cause ": "SLT o HiOPT pueden causar ", + + "Default (Mariko)": "Predeterminado (Mariko)", + "Default (Erista)": "Predeterminado (Erista)", + "Rating": "Valor", + "Safe Max (Mariko)": "Máximo seguro (Mariko)", + "Safe Max (Erista)": "Máximo seguro (Erista)", + + "Voltages": "Voltajes", + "RAM Voltage:": "Voltaje RAM:", + "Display Voltage:": "Voltaje de pantalla:", + "Temperatures": "Temperaturas", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Cálido", + "Hot": "Caliente", + "Overheat": "Sobrecalentamiento", + "Not Patched": "Sin parche", + "Invalid": "Inválido", + "RAM Bandwidth": "Ancho de banda RAM", + "RAM BW (Peak):": "BW RAM (Pico):", + "RAM BW (All):": "BW RAM (Todo):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info de hardware", + "Console Type:": "Tipo de consola:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Módulo DRAM: ", + "Software Info": "Info de software", + "KIP version:": "Versión KIP:", + "sys-dock status:": "Estado de sys-dock:", + "SaltyNX status:": "Estado de SaltyNX:", + "RR Display status:": "Estado de pantalla RR:", + "Wafer Position:": "Posición del wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Módulo:", + "Board": "Placa", + "Display": "Pantalla", + + "Developers": "Desarrolladores", + "Contributors": "Colaboradores", + "Testers": "Testers", + "Translators": "Traductores", + "Special Thanks": "Agradecimientos especiales", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilado con funciones mínimas", + "THE BEER-WARE LICENSE": "LICENCIA BEER-WARE" +} diff --git a/Source/hoc-clk/overlay/lang/fr.json b/Source/hoc-clk/overlay/lang/fr.json index e4e41177..c8f94ed2 100644 --- a/Source/hoc-clk/overlay/lang/fr.json +++ b/Source/hoc-clk/overlay/lang/fr.json @@ -1,37 +1,33 @@ { "Information": "Informations", - "IDDQ:": "IDDQ :", - "Module: ": "Module :", - "sys-dock status:": "Statut de sys-dock :", - "SaltyNX status:": "Statut de SaltyNX :", - "RR Display status:": "Statut de l'affichage RR :", - "Wafer Position:": "Position du wafer :", - "Credits": "Crédits", - "Developers": "Développeurs", - "Contributors": "Contributeurs", - "Testers": "Testeurs", - "Special Thanks": "Remerciements spéciaux", "Unknown": "Inconnu", "Installed": "Installé", "Not Installed": "Non installé", - "X: %u Y: %u": "X : %u Y : %u", - "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE", "Default": "Par défaut", "Do Not Override": "Ne pas remplacer", + "Do not override": "Ne pas remplacer", "Disabled": "Désactivé", "Enabled": "Activé", - " \\ue0e3 Reset": "\\ue0e3 Réinitialiser", - "Display": "Écran", - "Application changed\\n\\n": "Application modifiée\\n\\n", - "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", - "while editing was going on.": "pendant la modification.", - "Board": "Carte", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Activé (par défaut)", + "Enable": "Activer", + "Fatal error": "Erreur fatale", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossible de se connecter au sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Veuillez vous assurer que tout est\\n\\n", "correctly installed and enabled.": "correctement installé et activé.", - "Fatal error": "Erreur fatale", + + "Edit App Profile": "Modifier le profil de l'app", + "Edit Global Profile": "Modifier le profil global", + "Temporary Overrides": "Forçages temporaires", "Temporary Overrides ": "Forçages temporaires ", + "  Reset": " Réinitialiser", + "Settings": "Paramètres", + "About": "À propos", + "Credits": "Crédits", + + "Application changed\\n\\n": "Application modifiée\\n\\n", + "The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n", + "while editing was going on.": "pendant la modification.", + "Sleep Mode": "Mode veille", "Stock": "D'origine", "Dev OC": "OC Développeur", @@ -40,13 +36,7 @@ "Unsafe Max": "Max non sûr", "Absolute Max": "Max absolu", "Handheld Safe Max": "Max sûr (mode portable)", - "Enable": "Activer", - "Edit App Profile": "Modifier le profil de l'app", - "Edit Global Profile": "Modifier le profil global", - "Temporary Overrides": "Forçages temporaires", - "Settings": "Paramètres", - "About": "À propos", - "Compiling with minimal features": "Compilation avec fonctionnalités minimales", + "General Settings": "Paramètres généraux", "Governor Settings": "Paramètres du gouverneur", "Safety Settings": "Paramètres de sécurité", @@ -55,41 +45,64 @@ "CPU Settings": "Paramètres CPU", "GPU Settings": "Paramètres GPU", "Display Settings": "Paramètres d'affichage", + "Experimental Settings": "Paramètres expérimentaux", "Experimental": "Expérimental", + + " Settings marked in blue": "Les paramètres en bleu", + "don't require a reboot to apply!": "ne nécessitent pas de redémarrage !", + "You can also press  to show": "Appuyez aussi sur  pour afficher", + "information about each setting.": "les informations sur chaque paramètre.", + + " Experimental Settings are incomplete ": "Les paramètres expérimentaux sont incomplets", + "and may not work correctly or at all!": "et peuvent ne pas fonctionner du tout !", + "Here be dragons!": "Ici, il y a des dragons !", + + "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", + "RAM Display Unit": "Unité d'affichage RAM", + "Polling Interval": "Intervalle d'interrogation", + "GPU Scheduling Override Method": "Méthode de Forçage de l'ordonnancement GPU", + "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", + "GPU Boot Volt": "Tension d'amorçage GPU", + "GPU Boot Voltage": "Tension d'amorçage GPU", + "Memory Frequency Measurement Mode": "Mode de mesure de fréquence mémoire", + " Overriding the charge current": "Le forçage du courant de charge", "can be dangerous and may cause": "peut être dangereux et causer des", "damage to your battery or charger!": "dommages à votre batterie ou chargeur !", "Charge Current Override": "Forçage du courant de charge", - "RAM Voltage Display Mode": "Mode d'affichage de la tension RAM", - "Polling Interval": "Intervalle d'interrogation", + "Display Color Preset": "Préréglage de couleur", + "Basic": "Basique", + "Saturated": "Saturé", + "Washed": "Délavé", + "Natural": "Naturel", + "Vivid": "Vif", + "CPU Governor Minimum Frequency": "Fréquence minimale du gouverneur CPU", + " Usage of unsafe display": "L'utilisation de taux de rafraîchissement", "refresh rates may cause stress": "les taux de rafraîchissement peuvent stresser", "or damage to your display! ": "ou endommager votre écran !", "Proceed at your own risk!": "À utiliser à vos propres risques !", "Max Handheld Display": "Affichage portable max", + "Max Handheld Display Hz": "Hz max en mode portable", "Display Clock": "Fréquence d'affichage", + " Adjust the display voltage": "Réglez la tension d'affichage", + "with caution to avoid damage": "avec précaution pour éviter des dommages", + "to your display panel! ": "à votre dalle d'affichage !", + "Display Voltage": "Tension d'affichage", + + "Thermal Throttle Limit": "Limite d'étranglement thermique", "Official Rating": "Classement officiel", "TDP Threshold": "Seuil TDP", "Power": "Alimentation", - "Thermal Throttle Limit": "Limite d'étranglement thermique", "HP Mode": "Mode HP", - "Default (Mariko)": "Par défaut (Mariko)", - "Default (Erista)": "Par défaut (Erista)", - "Rating": "Évaluation", - "Safe Max (Mariko)": "Max sûr (Mariko)", - "Safe Max (Erista)": "Max sûr (Erista)", + + "DVB Shift": "Décalage DVB", + "SoC Max Volt": "Tension max SoC", + "Step Mode": "Mode pas à pas", "RAM VDD2 Voltage": "Tension RAM VDD2", - "Voltage": "Tension", "RAM VDDQ Voltage": "Tension RAM VDDQ", + "Voltage": "Tension", "RAM Frequency Editor": "Éditeur de fréquence RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Speedo élevé requis !", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", "Ram Max Clock": "Fréquence RAM max", "RAM Latency Editor": "Éditeur de latence RAM", "RAM Timing Reductions": "Réductions des timings RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latences mémoire", "Read Latency": "Latence de lecture", "Write Latency": "Latence d'écriture", + "High speedo needed!": "Speedo élevé requis !", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Fréquence Boost CPU", "CPU UV": "UV CPU", "CPU Unlock": "Déverrouillage CPU", @@ -114,6 +136,7 @@ "CPU High UV": "UV CPU élevé", "CPU Low VMIN": "VMIN CPU faible", "CPU High VMIN": "VMIN CPU élevé", + "No Undervolt": "Aucun Undervolt", "SLT Table": "Table SLT", "HiOPT Table": "Table HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Tension GPU maximale", "GPU Voltage Offset": "Offset de tension GPU", - "Do not override": "Ne pas remplacer", - "Enabled (Default)": "Activé (par défaut)", - "96.6% limit": "Limite de 96,6 %", - "99.7% limit": "Limite de 99,7 %", - "GPU Scheduling Override": "Forçage de l'ordonnancement GPU", - "Official Service": "Service officiel", "GPU DVFS Mode": "Mode GPU DVFS", "GPU DVFS Offset": "Offset GPU DVFS", "GPU Voltage Table": "Table de tension GPU", "GPU Custom Table (mV)": "Table de GPU personnalisée (mV)", + "Official Service": "Service officiel", + "96.6% limit": "Limite de 96,6 %", + "99.7% limit": "Limite de 99,7 %", + " Setting GPU Clocks past": "Régler les fréquences GPU au-delà", + "1228MHz without a proper undervolt": "1228 MHz sans undervolt approprié", + "can cause degradation or damage": "peut causer une dégradation ou des dommages", + "to your console!": "à votre console !", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sans UV, 1152 MHz sur SLT", "or 1228MHz on HiOPT can cause ": "ou 1228 MHz sur HiOPT peut causer des", "permanent damage to your Switch!": "dommages permanents à votre Switch !", "921MHz without UV and 960MHz on": "921 MHz sans UV et 960 MHz sur", - "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des" + "SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des", + + "Default (Mariko)": "Par défaut (Mariko)", + "Default (Erista)": "Par défaut (Erista)", + "Rating": "Évaluation", + "Safe Max (Mariko)": "Max sûr (Mariko)", + "Safe Max (Erista)": "Max sûr (Erista)", + + "Voltages": "Tensions", + "RAM Voltage:": "Tension RAM :", + "Display Voltage:": "Tension d'affichage :", + "Temperatures": "Températures", + "PLLX Temp:": "PLLX Temp :", + "AOTAG Temp:": "AOTAG Temp :", + "BQ24193 Temp:": "BQ24193 Temp :", + "Normal": "Normal", + "Warm": "Chaud", + "Hot": "Très chaud", + "Overheat": "Surchauffe", + "Not Patched": "Non patché", + "Invalid": "Invalide", + "RAM Bandwidth": "Bande passante RAM", + "RAM BW (Peak):": "BW RAM (Pic) :", + "RAM BW (All):": "BW RAM (Tout) :", + "RAM BW (CPU):": "BW RAM (CPU) :", + "RAM BW (GPU):": "BW RAM (GPU) :", + "Hardware Info": "Infos matériel", + "Console Type:": "Type de console :", + "Speedo:": "Speedo :", + "DRAM Module: ": "Module DRAM : ", + "Software Info": "Infos logiciel", + "KIP version:": "Version KIP :", + "sys-dock status:": "Statut de sys-dock :", + "SaltyNX status:": "Statut de SaltyNX :", + "RR Display status:": "Statut de l'affichage RR :", + "Wafer Position:": "Position du wafer :", + "IDDQ:": "IDDQ :", + "Module: ": "Module :", + "Board": "Carte", + "Display": "Écran", + + "Developers": "Développeurs", + "Contributors": "Contributeurs", + "Testers": "Testeurs", + "Translators": "Traducteurs", + "Special Thanks": "Remerciements spéciaux", + + "X: %u Y: %u": "X : %u Y : %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilation avec fonctionnalités minimales", + "THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE" } diff --git a/Source/hoc-clk/overlay/lang/it.json b/Source/hoc-clk/overlay/lang/it.json index 5e65fdae..9706a9b2 100644 --- a/Source/hoc-clk/overlay/lang/it.json +++ b/Source/hoc-clk/overlay/lang/it.json @@ -1,37 +1,33 @@ { "Information": "Informazioni", - "IDDQ:": "IDDQ:", - "Module: ": "Modulo:", - "sys-dock status:": "stato di sys-dock", - "SaltyNX status:": "Stato di SaltyNX:", - "RR Display status:": "Stato del RR:", - "Wafer Position:": "Posizione nel Wafer:", - "Credits": "Crediti", - "Developers": "Sviluppatori", - "Contributors": "Collaboratori", - "Testers": "Tester", - "Special Thanks": "Un Ringraziamento Speciale", "Unknown": "Sconosciuto", "Installed": "Installato", "Not Installed": "Non installato", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE", "Default": "Predefinito", "Do Not Override": "Non Sovrascrivere", + "Do not override": "Non sovrascrivere", "Disabled": "Disabilitato", "Enabled": "Abilitato", - " \\ue0e3 Reset": "\\ue0e3 Ripristina", - "Display": "Schermo", - "Application changed\\n\\n": "Applicazione modificata\\n\\n", - "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", - "while editing was going on.": "mentre era in corso la modifica.", - "Board": "Scheda", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Abilitato (impostazione predefinita)", + "Enable": "Abilita", + "Fatal error": "Errore fatale", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Assicurati che tutto sia\\n\\n", "correctly installed and enabled.": "correttamente installato e abilitato.", - "Fatal error": "Errore fatale", + + "Edit App Profile": "Modifica Profilo Dell'App", + "Edit Global Profile": "Modifica Profilo Globale", + "Temporary Overrides": "Sostituzioni Temporanee", "Temporary Overrides ": "Sostituzioni Temporanee", + "  Reset": " Ripristina", + "Settings": "Impostazioni", + "About": "A Riguardo Di", + "Credits": "Crediti", + + "Application changed\\n\\n": "Applicazione modificata\\n\\n", + "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", + "while editing was going on.": "mentre era in corso la modifica.", + "Sleep Mode": "Modalità di Sospensione", "Stock": "Originale", "Dev OC": "OC dev", @@ -40,13 +36,7 @@ "Unsafe Max": "Massimo Non Sicuro", "Absolute Max": "Massimo Assoluto", "Handheld Safe Max": "Massimo Sicuro Modalità Portatile", - "Enable": "Abilita", - "Edit App Profile": "Modifica Profilo Dell'App", - "Edit Global Profile": "Modifica Profilo Globale", - "Temporary Overrides": "Sostituzioni Temporanee", - "Settings": "Impostazioni", - "About": "A Riguardo Di", - "Compiling with minimal features": "Compilazione con funzionalità minime", + "General Settings": "Impostazioni Generali", "Governor Settings": "Impostazioni Del Governor", "Safety Settings": "Impostazioni Di Sicurezza", @@ -55,41 +45,64 @@ "CPU Settings": "Impostazioni della CPU", "GPU Settings": "Impostazioni della GPU", "Display Settings": "Impostazioni dello Schermo", + "Experimental Settings": "Impostazioni sperimentali", "Experimental": "Sperimentale", + + " Settings marked in blue": "Le impostazioni in blu", + "don't require a reboot to apply!": "non richiedono un riavvio per applicarsi!", + "You can also press  to show": "Premi anche  per mostrare", + "information about each setting.": "informazioni su ogni impostazione.", + + " Experimental Settings are incomplete ": "Le impostazioni sperimentali sono incomplete", + "and may not work correctly or at all!": "e potrebbero non funzionare correttamente!", + "Here be dragons!": "Qui ci sono draghi!", + + "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", + "RAM Display Unit": "Unità di visualizzazione RAM", + "Polling Interval": "Intervallo di polling", + "GPU Scheduling Override Method": "Metodo di override dello scheduling GPU", + "GPU Scheduling Override": "Override dello Scheduling GPU", + "GPU Boot Volt": "Tensione di avvio GPU", + "GPU Boot Voltage": "Tensione di avvio GPU", + "Memory Frequency Measurement Mode": "Modalità di misurazione della frequenza della memoria", + " Overriding the charge current": "L'override della corrente di carica", "can be dangerous and may cause": "può essere pericoloso e può causare", "damage to your battery or charger!": "danni alla batteria o al caricabatterie!", "Charge Current Override": "Override della Corrente di Carica", - "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM", - "Polling Interval": "Intervallo di polling", + "Display Color Preset": "Preimpostazione colore", + "Basic": "Base", + "Saturated": "Saturo", + "Washed": "Sbiadito", + "Natural": "Naturale", + "Vivid": "Vivace", + "CPU Governor Minimum Frequency": "Frequenza minima del Governor della CPU", + " Usage of unsafe display": "L'uso di frequenze di aggiornamento", "refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress", "or damage to your display! ": "o danni al display!", "Proceed at your own risk!": "Procedi a tuo rischio e pericolo!", "Max Handheld Display": "Display Massimo in Modalità Portatile", + "Max Handheld Display Hz": "Hz max in modalità portatile", "Display Clock": "Frequenza del Display", + " Adjust the display voltage": "Regola la tensione del display", + "with caution to avoid damage": "con cautela per evitare danni", + "to your display panel! ": "al pannello del display!", + "Display Voltage": "Tensione display", + + "Thermal Throttle Limit": "Limite Termico", "Official Rating": "Rating Ufficiale", "TDP Threshold": "Soglia TDP", "Power": "Potenza", - "Thermal Throttle Limit": "Limite Termico", "HP Mode": "Modalità HP", - "Default (Mariko)": "Predefinito (Mariko)", - "Default (Erista)": "Predefinito (Erista)", - "Rating": "Valutazione", - "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", - "Safe Max (Erista)": "Massimo Sicuro (Erista)", + + "DVB Shift": "Offset DVB", + "SoC Max Volt": "Tensione massima SoC", + "Step Mode": "Modalità passo", "RAM VDD2 Voltage": "Tensione RAM VDD2", - "Voltage": "Voltaggio", "RAM VDDQ Voltage": "Voltaggio VDDQ della RAM", + "Voltage": "Voltaggio", "RAM Frequency Editor": "Editor della frequenza RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Alto Valore Speedo Necessario!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", "Ram Max Clock": "Frequenza Massima Ram", "RAM Latency Editor": "Editor della Latenza RAM", "RAM Timing Reductions": "Riduzioni dei Timing della RAM", @@ -102,6 +115,15 @@ "Memory Latencies": "Latenza della Memoria", "Read Latency": "Latenza di Lettura", "Write Latency": "Latenza di Scrittura", + "High speedo needed!": "Alto Valore Speedo Necessario!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Frequenza CPU in Boost", "CPU UV": "Undervolt CPU", "CPU Unlock": "Sblocco della CPU", @@ -114,6 +136,7 @@ "CPU High UV": "CPU UV Alta Frequenza", "CPU Low VMIN": "CPU VMIN Bassa Frequenza", "CPU High VMIN": "CPU VMIN Alta Frequenza", + "No Undervolt": "Nessun Undervolt", "SLT Table": "Tabella SLT", "HiOPT Table": "Tabella HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Voltaggio massimo della GPU", "GPU Voltage Offset": "Offset di Voltaggio della GPU", - "Do not override": "Non sovrascrivere", - "Enabled (Default)": "Abilitato (impostazione predefinita)", - "96.6% limit": "Limite del 96,6%.", - "99.7% limit": "Limite del 99,7%.", - "GPU Scheduling Override": "Override dello Scheduling GPU", - "Official Service": "Servizio ufficiale", "GPU DVFS Mode": "Modalità DVFS GPU", "GPU DVFS Offset": "Offset DVFS della GPU", "GPU Voltage Table": "Tabella delle Tensioni della GPU", "GPU Custom Table (mV)": "Tabella GPU Personalizzata (mV)", + "Official Service": "Servizio ufficiale", + "96.6% limit": "Limite del 96,6%", + "99.7% limit": "Limite del 99,7%", + " Setting GPU Clocks past": "Impostare le frequenze GPU oltre", + "1228MHz without a proper undervolt": "1228 MHz senza undervolt appropriato", + "can cause degradation or damage": "può causare degrado o danni", + "to your console!": "alla tua console!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz senza UV, 1152 MHz su SLT", "or 1228MHz on HiOPT can cause ": "o 1228 MHz su HiOPT possono causare", "permanent damage to your Switch!": "danni permanenti alla tua Switch!", "921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz su", - "SLT or HiOPT can cause ": "SLT o HiOPT possono causare" + "SLT or HiOPT can cause ": "SLT o HiOPT possono causare", + + "Default (Mariko)": "Predefinito (Mariko)", + "Default (Erista)": "Predefinito (Erista)", + "Rating": "Valutazione", + "Safe Max (Mariko)": "Massimo Sicuro (Mariko)", + "Safe Max (Erista)": "Massimo Sicuro (Erista)", + + "Voltages": "Tensioni", + "RAM Voltage:": "Tensione RAM:", + "Display Voltage:": "Tensione display:", + "Temperatures": "Temperature", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normale", + "Warm": "Caldo", + "Hot": "Molto caldo", + "Overheat": "Surriscaldamento", + "Not Patched": "Non patchato", + "Invalid": "Non valido", + "RAM Bandwidth": "Banda RAM", + "RAM BW (Peak):": "BW RAM (Picco):", + "RAM BW (All):": "BW RAM (Tutto):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info hardware", + "Console Type:": "Tipo di console:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Modulo DRAM: ", + "Software Info": "Info software", + "KIP version:": "Versione KIP:", + "sys-dock status:": "stato di sys-dock", + "SaltyNX status:": "Stato di SaltyNX:", + "RR Display status:": "Stato del RR:", + "Wafer Position:": "Posizione nel Wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Modulo:", + "Board": "Scheda", + "Display": "Schermo", + + "Developers": "Sviluppatori", + "Contributors": "Collaboratori", + "Testers": "Tester", + "Translators": "Traduttori", + "Special Thanks": "Un Ringraziamento Speciale", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilazione con funzionalità minime", + "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE" } diff --git a/Source/hoc-clk/overlay/lang/ja.json b/Source/hoc-clk/overlay/lang/ja.json index fe415367..8dd8a981 100644 --- a/Source/hoc-clk/overlay/lang/ja.json +++ b/Source/hoc-clk/overlay/lang/ja.json @@ -1,52 +1,42 @@ { "Information": "情報", - "IDDQ:": "IDQ:", - "Module: ": "モジュール:", - "sys-dock status:": "システムドックのステータス:", - "SaltyNX status:": "SaltyNX ステータス:", - "RR Display status:": "RR 表示ステータス:", - "Wafer Position:": "ウェーハの位置:", - "Credits": "クレジット", - "Developers": "開発者", - "Contributors": "貢献者", - "Testers": "テスター", - "Special Thanks": "特別な感謝の気持ち", "Unknown": "不明", "Installed": "インストール済み", "Not Installed": "インストールされていません", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ビール製品ライセンス", "Default": "デフォルト", "Do Not Override": "上書きしないでください", - "Disabled": "障害者", + "Do not override": "上書きしないでください", + "Disabled": "無効", "Enabled": "有効", - " \\ue0e3 Reset": "\\ue0e3 リセット", - "Display": "ディスプレイ", - "Application changed\\n\\n": "アプリケーションが変更されました\\n\\n", - "The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n", - "while editing was going on.": "編集を進めている最中でした。", - "Board": "理事会", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "有効 (デフォルト)", + "Enable": "有効にする", + "Fatal error": "致命的なエラー", "Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk sysmodule に接続できませんでした。\\n\\n", "Please make sure everything is\\n\\n": "すべてが正しいことを確認してください\\n\\n", "correctly installed and enabled.": "正しくインストールされ、有効になっています。", - "Fatal error": "致命的なエラー", + + "Edit App Profile": "アプリプロファイルの編集", + "Edit Global Profile": "グローバルプロファイルの編集", + "Temporary Overrides": "一時的なオーバーライド", "Temporary Overrides ": "一時的なオーバーライド", + "  Reset": " リセット", + "Settings": "設定", + "About": "について", + "Credits": "クレジット", + + "Application changed\\n\\n": "アプリケーションが変更されました\\n\\n", + "The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n", + "while editing was going on.": "編集を進めている最中でした。", + "Sleep Mode": "スリープモード", - "Stock": "在庫", + "Stock": "標準", "Dev OC": "開発OC", "Boost Mode": "ブーストモード", "Safe Max": "セーフマックス", "Unsafe Max": "危険なマックス", "Absolute Max": "絶対最大値", - "Handheld Safe Max": "手持ち金庫マックス", - "Enable": "有効にする", - "Edit App Profile": "アプリプロファイルの編集", - "Edit Global Profile": "グローバルプロファイルの編集", - "Temporary Overrides": "一時的なオーバーライド", - "Settings": "設定", - "About": "について", - "Compiling with minimal features": "最小限の機能でコンパイルする", + "Handheld Safe Max": "手持ち安全マックス", + "General Settings": "一般設定", "Governor Settings": "ガバナーの設定", "Safety Settings": "安全設定", @@ -55,41 +45,64 @@ "CPU Settings": "CPUの設定", "GPU Settings": "GPU設定", "Display Settings": "表示設定", + "Experimental Settings": "実験的設定", "Experimental": "実験的", + + " Settings marked in blue": "青色でマークされた設定", + "don't require a reboot to apply!": "再起動なしで適用できます!", + "You can also press  to show": " を押して表示することもできます", + "information about each setting.": "各設定の情報を。", + + " Experimental Settings are incomplete ": "実験的設定は未完成です", + "and may not work correctly or at all!": "正しく動作しない場合があります!", + "Here be dragons!": "ここにドラゴンあり!", + + "RAM Voltage Display Mode": "RAM電圧表示モード", + "RAM Display Unit": "RAM表示単位", + "Polling Interval": "ポーリング間隔", + "GPU Scheduling Override Method": "GPU スケジューリング オーバーライド メソッド", + "GPU Scheduling Override": "GPU スケジュールのオーバーライド", + "GPU Boot Volt": "GPU起動電圧", + "GPU Boot Voltage": "GPU起動電圧", + "Memory Frequency Measurement Mode": "メモリ周波数測定モード", + " Overriding the charge current": "充電電流のオーバーライド", "can be dangerous and may cause": "危険であり、原因となる可能性があります", "damage to your battery or charger!": "バッテリーまたは充電器が損傷します。", "Charge Current Override": "充電電流オーバーライド", - "RAM Voltage Display Mode": "RAM電圧表示モード", - "Polling Interval": "ポーリング間隔", + "Display Color Preset": "ディスプレイカラープリセット", + "Basic": "ベーシック", + "Saturated": "鮮やか", + "Washed": "色あせ", + "Natural": "ナチュラル", + "Vivid": "ビビッド", + "CPU Governor Minimum Frequency": "CPU ガバナの最小周波数", + " Usage of unsafe display": "危険なリフレッシュレートの使用", "refresh rates may cause stress": "リフレッシュレートがストレスを引き起こす可能性がある", "or damage to your display! ": "ディスプレイに損傷を与えてしまいます。", "Proceed at your own risk!": "自己責任で進めてください!", "Max Handheld Display": "最大ハンドヘルドディスプレイ", + "Max Handheld Display Hz": "最大ハンドヘルドHz", "Display Clock": "時計の表示", + " Adjust the display voltage": "ディスプレイ電圧を調整", + "with caution to avoid damage": "損傷を避けるため注意して", + "to your display panel! ": "ディスプレイパネルに!", + "Display Voltage": "ディスプレイ電圧", + + "Thermal Throttle Limit": "サーマルスロットル制限", "Official Rating": "公式評価", "TDP Threshold": "TDP しきい値", "Power": "パワー", - "Thermal Throttle Limit": "サーマルスロットル制限", "HP Mode": "HPモード", - "Default (Mariko)": "デフォルト(マリコ)", - "Default (Erista)": "デフォルト(エリスタ)", - "Rating": "評価", - "Safe Max (Mariko)": "セーフマックス(マリコ)", - "Safe Max (Erista)": "セーフマックス(エリスタ)", + + "DVB Shift": "DVBシフト", + "SoC Max Volt": "SoC最大電圧", + "Step Mode": "ステップモード", "RAM VDD2 Voltage": "RAM VDD2 電圧", - "Voltage": "電圧", "RAM VDDQ Voltage": "RAM VDDQ 電圧", + "Voltage": "電圧", "RAM Frequency Editor": "RAM周波数エディター", - "JEDEC.": "JEDEC。", - "High speedo needed!": "ハイスピードが必要です!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)", "Ram Max Clock": "ラムマックスクロック", "RAM Latency Editor": "RAM レイテンシ エディター", "RAM Timing Reductions": "RAM タイミングの削減", @@ -102,6 +115,15 @@ "Memory Latencies": "メモリレイテンシ", "Read Latency": "読み取りレイテンシー", "Write Latency": "書き込みレイテンシ", + "High speedo needed!": "ハイスピードが必要です!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)", + "JEDEC.": "JEDEC。", + "CPU Boost Clock": "CPUブーストクロック", "CPU UV": "CPU UV", "CPU Unlock": "CPUロック解除", @@ -111,10 +133,11 @@ "Extreme UV Table": "エクストリーム UV テーブル", "CPU UV Table": "CPU UV テーブル", "CPU Low UV": "CPU 低 UV", - "CPU High UV": "CPU 高紫外線", + "CPU High UV": "CPU 高 UV", "CPU Low VMIN": "CPU 低 VMIN", - "CPU High VMIN": "CPU の高い VMIN", - "No Undervolt": "不足電圧なし", + "CPU High VMIN": "CPU 高 VMIN", + + "No Undervolt": "アンダーボルトなし", "SLT Table": "SLTテーブル", "HiOPT Table": "HiOPT テーブル", "GPU Undervolt Table": "GPUアンダーボルトテーブル", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU最大電圧", "GPU Voltage Offset": "GPU電圧オフセット", - "Do not override": "上書きしないでください", - "Enabled (Default)": "有効 (デフォルト)", - "96.6% limit": "96.6%制限", - "99.7% limit": "99.7%制限", - "GPU Scheduling Override": "GPU スケジュールのオーバーライド", - "Official Service": "正式サービス", "GPU DVFS Mode": "GPU DVFS モード", "GPU DVFS Offset": "GPU DVFS オフセット", "GPU Voltage Table": "GPU電圧テーブル", "GPU Custom Table (mV)": "GPUカスタムテーブル(mV)", + "Official Service": "正式サービス", + "96.6% limit": "96.6%制限", + "99.7% limit": "99.7%制限", + " Setting GPU Clocks past": "GPUクロックを超えて設定", + "1228MHz without a proper undervolt": "適切なアンダーボルトなしで1228MHz", + "can cause degradation or damage": "劣化や損傷を引き起こす可能性があります", + "to your console!": "あなたのコンソールに!", "1075MHz without UV, 1152MHz on SLT": "UVなしで1075MHz、SLTで1152MHz", - "or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると、次のような問題が発生する可能性があります。", + "or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると問題が発生する可能性があります。", "permanent damage to your Switch!": "Switch に永久的なダメージを与えます!", "921MHz without UV and 960MHz on": "921MHz(UVなし)、960MHz(UVあり)", - "SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります" + "SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります", + + "Default (Mariko)": "デフォルト(マリコ)", + "Default (Erista)": "デフォルト(エリスタ)", + "Rating": "評価", + "Safe Max (Mariko)": "セーフマックス(マリコ)", + "Safe Max (Erista)": "セーフマックス(エリスタ)", + + "Voltages": "電圧", + "RAM Voltage:": "RAM電圧:", + "Display Voltage:": "ディスプレイ電圧:", + "Temperatures": "温度", + "PLLX Temp:": "PLLX 温度:", + "AOTAG Temp:": "AOTAG 温度:", + "BQ24193 Temp:": "BQ24193 温度:", + "Normal": "正常", + "Warm": "温かい", + "Hot": "熱い", + "Overheat": "過熱", + "Not Patched": "パッチなし", + "Invalid": "無効", + "RAM Bandwidth": "RAM帯域幅", + "RAM BW (Peak):": "RAM帯域(最大):", + "RAM BW (All):": "RAM帯域(全):", + "RAM BW (CPU):": "RAM帯域(CPU):", + "RAM BW (GPU):": "RAM帯域(GPU):", + "Hardware Info": "ハードウェア情報", + "Console Type:": "コンソールタイプ:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAMモジュール: ", + "Software Info": "ソフトウェア情報", + "KIP version:": "KIPバージョン:", + "sys-dock status:": "システムドックのステータス:", + "SaltyNX status:": "SaltyNX ステータス:", + "RR Display status:": "RR 表示ステータス:", + "Wafer Position:": "ウェーハの位置:", + "IDDQ:": "IDQ:", + "Module: ": "モジュール:", + "Board": "理事会", + "Display": "ディスプレイ", + + "Developers": "開発者", + "Contributors": "貢献者", + "Testers": "テスター", + "Translators": "翻訳者", + "Special Thanks": "特別な感謝の気持ち", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "最小限の機能でコンパイルする", + "THE BEER-WARE LICENSE": "ビール製品ライセンス" } diff --git a/Source/hoc-clk/overlay/lang/ko.json b/Source/hoc-clk/overlay/lang/ko.json index 09e73e66..8865d37f 100644 --- a/Source/hoc-clk/overlay/lang/ko.json +++ b/Source/hoc-clk/overlay/lang/ko.json @@ -1,52 +1,42 @@ { "Information": "정보", - "IDDQ:": "IDDQ:", - "Module: ": "모듈:", - "sys-dock status:": "sys-dock 상태:", - "SaltyNX status:": "SaltyNX 상태:", - "RR Display status:": "RR 표시 상태:", - "Wafer Position:": "웨이퍼 위치:", - "Credits": "크레딧", - "Developers": "개발자", - "Contributors": "기여자", - "Testers": "테스터", - "Special Thanks": "특별한 분", "Unknown": "알 수 없음", "Installed": "설치됨", "Not Installed": "설치되지 않음", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "맥주 제품 라이센스", "Default": "기본값", "Do Not Override": "재정의하지 마십시오", + "Do not override": "재정의하지 않음", "Disabled": "비활성화", "Enabled": "활성화됨", - " \\ue0e3 Reset": "\\ue0e3 재설정", - "Display": "디스플레이", - "Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n", - "The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n", - "while editing was going on.": "편집이 진행되는 동안.", - "Board": "보드", - "%u.%u%u mV": "%u.%u%umV", + "Enabled (Default)": "활성화됨(기본값)", + "Enable": "활성화", + "Fatal error": "치명적인 오류", "Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk 시스템 모듈에 연결할 수 없습니다.\\n\\n", "Please make sure everything is\\n\\n": "모든 것이 올바른지 확인하십시오.\\n\\n", "correctly installed and enabled.": "올바르게 설치되고 활성화되었습니다.", - "Fatal error": "치명적인 오류", + + "Edit App Profile": "앱 프로필 편집", + "Edit Global Profile": "글로벌 프로필 편집", + "Temporary Overrides": "임시 재정의", "Temporary Overrides ": "임시 재정의", + "  Reset": " 재설정", + "Settings": "설정", + "About": "소개", + "Credits": "크레딧", + + "Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n", + "The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n", + "while editing was going on.": "편집이 진행되는 동안.", + "Sleep Mode": "절전 모드", - "Stock": "주식", + "Stock": "기본 설정", "Dev OC": "개발 OC", - "Overwrite Boost Mode": "부스트 모드 덮어쓰기", + "Boost Mode": "부스트 모드", "Safe Max": "안전함 최대값", "Unsafe Max": "불안정 최대값", "Absolute Max": "절대 최대값", "Handheld Safe Max": "휴대모드 안전함 최대값", - "Enable": "활성화", - "Edit App Profile": "앱 프로필 편집", - "Edit Global Profile": "글로벌 프로필 편집", - "Temporary Overrides": "임시 재정의", - "Settings": "설정", - "About": "소개", - "Compiling with minimal features": "최소한의 기능으로 컴파일하기", + "General Settings": "일반 설정", "Governor Settings": "거버너 설정", "Safety Settings": "안전 설정", @@ -55,41 +45,64 @@ "CPU Settings": "CPU 설정", "GPU Settings": "GPU 설정", "Display Settings": "디스플레이 설정", + "Experimental Settings": "실험적 설정", "Experimental": "실험적", + + " Settings marked in blue": "파란색으로 표시된 설정은", + "don't require a reboot to apply!": "재부팅 없이 적용됩니다!", + "You can also press  to show": "을 눌러 표시할 수도 있습니다", + "information about each setting.": "각 설정에 대한 정보를.", + + " Experimental Settings are incomplete ": "실험적 설정은 미완성입니다", + "and may not work correctly or at all!": "올바르게 작동하지 않을 수 있습니다!", + "Here be dragons!": "여기에 드래곤이 있습니다!", + + "RAM Voltage Display Mode": "RAM 전압 표시 모드", + "RAM Display Unit": "RAM 표시 단위", + "Polling Interval": "폴링 간격", + "GPU Scheduling Override Method": "GPU 스케줄링 재정의 방법", + "GPU Scheduling Override": "GPU 스케줄링 재정의", + "GPU Boot Volt": "GPU 부팅 전압", + "GPU Boot Voltage": "GPU 부팅 전압", + "Memory Frequency Measurement Mode": "메모리 주파수 측정 모드", + " Overriding the charge current": "충전 전류 오버라이드", "can be dangerous and may cause": "위험할 수 있고 원인이 될 수 있습니다.", "damage to your battery or charger!": "배터리나 충전기가 손상되었습니다!", "Charge Current Override": "충전 전류 오버라이드", - "RAM Voltage Display Mode": "RAM 전압 표시 모드", - "Polling Interval": "폴링 간격", + "Display Color Preset": "디스플레이 색상 프리셋", + "Basic": "기본", + "Saturated": "채도 높음", + "Washed": "연한색", + "Natural": "자연스러움", + "Vivid": "선명함", + "CPU Governor Minimum Frequency": "CPU 거버너 최소 주파수", + " Usage of unsafe display": "안전하지 않은 주사율 사용", "refresh rates may cause stress": "디스플레이 주사율 빈도 변경은", "or damage to your display! ": "기기에 손상이 발생될 수 있습니다!", "Proceed at your own risk!": "책임하에 주의해서 사용하십시오!", "Max Handheld Display": "최대 휴대용 디스플레이", + "Max Handheld Display Hz": "최대 휴대용 Hz", "Display Clock": "디스플레이 클럭", + " Adjust the display voltage": "디스플레이 전압 조정", + "with caution to avoid damage": "손상을 피하기 위해 주의하여", + "to your display panel! ": "디스플레이 패널에!", + "Display Voltage": "디스플레이 전압", + + "Thermal Throttle Limit": "열 스로틀 한계", "Official Rating": "공식 등급", "TDP Threshold": "TDP 임계값", "Power": "힘", - "Thermal Throttle Limit": "열 스로틀 한계", "HP Mode": "HP 모드", - "Default (Mariko)": "기본값(마리코)", - "Default (Erista)": "기본값(에리스타)", - "Rating": "표준값", - "Safe Max (Mariko)": "안전함 최대치(마리코)", - "Safe Max (Erista)": "안전함 최대치(에리스타)", + + "DVB Shift": "DVB 시프트", + "SoC Max Volt": "SoC 최대 전압", + "Step Mode": "스텝 모드", "RAM VDD2 Voltage": "RAM VDD2 전압", - "Voltage": "전압", "RAM VDDQ Voltage": "RAM VDDQ 전압", + "Voltage": "전압", "RAM Frequency Editor": "RAM 주파수 편집기", - "JEDEC.": "JEDEC.", - "High speedo needed!": "높은 스피도값이 필요합니다!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (말도 안 되는 Speedo/PLL 필요)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)", "Ram Max Clock": "RAM 최대 클럭", "RAM Latency Editor": "RAM 지연 시간 편집기", "RAM Timing Reductions": "RAM 타이밍 편집기", @@ -102,6 +115,15 @@ "Memory Latencies": "메모리 지연 시간", "Read Latency": "읽기 지연 시간", "Write Latency": "쓰기 지연 시간", + "High speedo needed!": "높은 스피도값이 필요합니다!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(터무니없는 Speedo/PLL 필요)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU 부스트 클럭", "CPU UV": "CPU 언더볼트", "CPU Unlock": "CPU 잠금 해제", @@ -114,6 +136,7 @@ "CPU High UV": "CPU 고주파 언더볼트", "CPU Low VMIN": "CPU 저주파 최소 전압", "CPU High VMIN": "CPU 고주파 최소 전압", + "No Undervolt": "언더볼트 없음", "SLT Table": "SLT 테이블", "HiOPT Table": "HiOPT 테이블", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU 최대 전압", "GPU Voltage Offset": "GPU 전압 오프셋", - "Do not override": "재정의하지 않음", - "Enabled (Default)": "활성화됨(기본값)", - "96.6% limit": "96.6% 한도", - "99.7% limit": "99.7% 한도", - "GPU Scheduling Override": "GPU 스케줄링 재정의", - "Official Service": "공식 서비스", "GPU DVFS Mode": "GPU DVFS 모드", "GPU DVFS Offset": "GPU DVFS 오프셋", "GPU Voltage Table": "GPU 전압 테이블", "GPU Custom Table (mV)": "GPU 사용자 정의 테이블(mV)", + "Official Service": "공식 서비스", + "96.6% limit": "96.6% 한도", + "99.7% limit": "99.7% 한도", + " Setting GPU Clocks past": "GPU 클럭을 초과 설정", + "1228MHz without a proper undervolt": "적절한 언더볼트 없이 1228MHz", + "can cause degradation or damage": "열화 또는 손상을 유발할 수 있습니다", + "to your console!": "콘솔에!", "1075MHz without UV, 1152MHz on SLT": "UV 없이 1075MHz, SLT에서 1152MHz", "or 1228MHz on HiOPT can cause ": "또는 HiOPT에서 1228MHz를 사용하면", "permanent damage to your Switch!": "스위치가 영구적으로 손상될 수 있습니다!", "921MHz without UV and 960MHz on": "UV가 없는 경우 921MHz, 켜진 경우에는 960MHz", - "SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다." + "SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다.", + + "Default (Mariko)": "기본값(마리코)", + "Default (Erista)": "기본값(에리스타)", + "Rating": "표준값", + "Safe Max (Mariko)": "안전함 최대치(마리코)", + "Safe Max (Erista)": "안전함 최대치(에리스타)", + + "Voltages": "전압", + "RAM Voltage:": "RAM 전압:", + "Display Voltage:": "디스플레이 전압:", + "Temperatures": "온도", + "PLLX Temp:": "PLLX 온도:", + "AOTAG Temp:": "AOTAG 온도:", + "BQ24193 Temp:": "BQ24193 온도:", + "Normal": "정상", + "Warm": "따뜻함", + "Hot": "뜨거움", + "Overheat": "과열", + "Not Patched": "패치 안 됨", + "Invalid": "유효하지 않음", + "RAM Bandwidth": "RAM 대역폭", + "RAM BW (Peak):": "RAM 대역폭 (최대):", + "RAM BW (All):": "RAM 대역폭 (전체):", + "RAM BW (CPU):": "RAM 대역폭 (CPU):", + "RAM BW (GPU):": "RAM 대역폭 (GPU):", + "Hardware Info": "하드웨어 정보", + "Console Type:": "콘솔 유형:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 모듈: ", + "Software Info": "소프트웨어 정보", + "KIP version:": "KIP 버전:", + "sys-dock status:": "sys-dock 상태:", + "SaltyNX status:": "SaltyNX 상태:", + "RR Display status:": "RR 표시 상태:", + "Wafer Position:": "웨이퍼 위치:", + "IDDQ:": "IDDQ:", + "Module: ": "모듈:", + "Board": "보드", + "Display": "디스플레이", + + "Developers": "개발자", + "Contributors": "기여자", + "Testers": "테스터", + "Translators": "번역자", + "Special Thanks": "특별한 분", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%umV", + "Compiling with minimal features": "최소한의 기능으로 컴파일하기", + "THE BEER-WARE LICENSE": "맥주 제품 라이센스" } diff --git a/Source/hoc-clk/overlay/lang/nl.json b/Source/hoc-clk/overlay/lang/nl.json index 1005d3c2..5095d2be 100644 --- a/Source/hoc-clk/overlay/lang/nl.json +++ b/Source/hoc-clk/overlay/lang/nl.json @@ -1,52 +1,42 @@ { "Information": "Informatie", - "IDDQ:": "IDDQ:", - "Module: ": "module:", - "sys-dock status:": "sys-dock-status:", - "SaltyNX status:": "SaltyNX-status:", - "RR Display status:": "RR Weergavestatus:", - "Wafer Position:": "Waferpositie:", - "Credits": "Kredieten", - "Developers": "Ontwikkelaars", - "Contributors": "Bijdragers", - "Testers": "Testers", - "Special Thanks": "Speciale dank", "Unknown": "Onbekend", "Installed": "Geïnstalleerd", "Not Installed": "Niet geïnstalleerd", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN", "Default": "Standaard", "Do Not Override": "Niet overschrijven", + "Do not override": "Niet overschrijven", "Disabled": "Uitgeschakeld", "Enabled": "Ingeschakeld", - " \\ue0e3 Reset": "\\ue0e3 Opnieuw instellen", - "Display": "Weergave", - "Application changed\\n\\n": "Applicatie gewijzigd\\n\\n", - "The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n", - "while editing was going on.": "terwijl er werd bewerkt.", - "Board": "Bord", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Ingeschakeld (standaard)", + "Enable": "Inschakelen", + "Fatal error": "Fatale fout", "Could not connect to hoc-clk sysmodule.\\n\\n": "Kan geen verbinding maken met hoc-clk sysmodule.\\n\\n", "Please make sure everything is\\n\\n": "Zorg ervoor dat alles in orde is\\n\\n", "correctly installed and enabled.": "correct geïnstalleerd en ingeschakeld.", - "Fatal error": "Fatale fout", + + "Edit App Profile": "App-profiel bewerken", + "Edit Global Profile": "Globaal profiel bewerken", + "Temporary Overrides": "Tijdelijke overschrijvingen", "Temporary Overrides ": "Tijdelijke overschrijvingen", + "  Reset": " Opnieuw instellen", + "Settings": "Instellingen", + "About": "Over", + "Credits": "Kredieten", + + "Application changed\\n\\n": "Applicatie gewijzigd\\n\\n", + "The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n", + "while editing was going on.": "terwijl er werd bewerkt.", + "Sleep Mode": "Slaapmodus", "Stock": "Voorraad", "Dev OC": "Ontwikkelaar OC", "Boost Mode": "Boost-modus", "Safe Max": "Veilig Max", - "Unsafe Max": "OnveiligMax", + "Unsafe Max": "Onveilig Max", "Absolute Max": "Absoluut Max", - "Handheld Safe Max": "Handkluis Max", - "Enable": "Inschakelen", - "Edit App Profile": "App-profiel bewerken", - "Edit Global Profile": "Globaal profiel bewerken", - "Temporary Overrides": "Tijdelijke overschrijvingen", - "Settings": "Instellingen", - "About": "Over", - "Compiling with minimal features": "Compileren met minimale functies", + "Handheld Safe Max": "Handheld Veilig Max", + "General Settings": "Algemene instellingen", "Governor Settings": "Gouverneur instellingen", "Safety Settings": "Veiligheidsinstellingen", @@ -55,41 +45,64 @@ "CPU Settings": "CPU-instellingen", "GPU Settings": "GPU-instellingen", "Display Settings": "Weergave-instellingen", + "Experimental Settings": "Experimentele instellingen", "Experimental": "Experimenteel", + + " Settings marked in blue": "In blauw gemarkeerde instellingen", + "don't require a reboot to apply!": "vereisen geen herstart om toe te passen!", + "You can also press  to show": "Druk ook op  om te tonen", + "information about each setting.": "informatie over elke instelling.", + + " Experimental Settings are incomplete ": "Experimentele instellingen zijn onvolledig", + "and may not work correctly or at all!": "en werken mogelijk helemaal niet!", + "Here be dragons!": "Hier zijn draken!", + + "RAM Voltage Display Mode": "Weergavemodus RAM-spanning", + "RAM Display Unit": "RAM-weergave-eenheid", + "Polling Interval": "Polling-interval", + "GPU Scheduling Override Method": "Methode voor het overschrijven van GPU-planning", + "GPU Scheduling Override": "GPU-planning negeren", + "GPU Boot Volt": "GPU opstartspanning", + "GPU Boot Voltage": "GPU opstartspanning", + "Memory Frequency Measurement Mode": "Geheugenfrequentie-meetmodus", + " Overriding the charge current": "Het overschrijven van de laadstroom", "can be dangerous and may cause": "kan gevaarlijk zijn en kan veroorzaken", "damage to your battery or charger!": "schade aan uw accu of lader!", "Charge Current Override": "Laadstroom overschrijven", - "RAM Voltage Display Mode": "Weergavemodus RAM-spanning", - "Polling Interval": "Polling-interval", + "Display Color Preset": "Kleurvoorinstelling", + "Basic": "Basis", + "Saturated": "Verzadigd", + "Washed": "Uitgewassen", + "Natural": "Natuurlijk", + "Vivid": "Levendig", + "CPU Governor Minimum Frequency": "Minimale frequentie CPU-regelaar", + " Usage of unsafe display": "Het gebruik van onveilige schermfrequenties", "refresh rates may cause stress": "vernieuwingsfrequenties kunnen stress veroorzaken", "or damage to your display! ": "of schade aan uw display!", "Proceed at your own risk!": "Ga verder op eigen risico!", "Max Handheld Display": "Maximaal handheld-display", + "Max Handheld Display Hz": "Max handheld Hz", "Display Clock": "Klok weergeven", + " Adjust the display voltage": "Pas de displayspanning aan", + "with caution to avoid damage": "met voorzichtigheid om schade te vermijden", + "to your display panel! ": "van uw beeldschermpaneel!", + "Display Voltage": "Displayspanning", + + "Thermal Throttle Limit": "Thermische gaslimiet", "Official Rating": "Officiële beoordeling", "TDP Threshold": "TDP-drempel", "Power": "Macht", - "Thermal Throttle Limit": "Thermische gaslimiet", "HP Mode": "HP-modus", - "Default (Mariko)": "Standaard (Mariko)", - "Default (Erista)": "Standaard (Erista)", - "Rating": "Beoordeling", - "Safe Max (Mariko)": "Veilig Max (Mariko)", - "Safe Max (Erista)": "Veilige Max (Erista)", + + "DVB Shift": "DVB-verschuiving", + "SoC Max Volt": "SoC max spanning", + "Step Mode": "Stappmodus", "RAM VDD2 Voltage": "RAM VDD2-spanning", - "Voltage": "Spanning", "RAM VDDQ Voltage": "RAM VDDQ-spanning", + "Voltage": "Spanning", "RAM Frequency Editor": "RAM-frequentie-editor", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Hoge snelheid nodig!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme snelheidsmeter/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme snelheidsmeter/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme snelheidsmeter/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke snelheidsmeter/PLL nodig)", "Ram Max Clock": "Ram Max-klok", "RAM Latency Editor": "RAM-latentie-editor", "RAM Timing Reductions": "RAM-timingreducties", @@ -102,6 +115,15 @@ "Memory Latencies": "Geheugenlatenties", "Read Latency": "Lees Latentie", "Write Latency": "Schrijf latentie", + "High speedo needed!": "Hoge Speedo-waarde nodig!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke Speedo/PLL nodig)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke Speedo/PLL nodig)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke Speedo/PLL nodig)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU-boostklok", "CPU UV": "CPU-UV", "CPU Unlock": "CPU-ontgrendeling", @@ -114,6 +136,7 @@ "CPU High UV": "CPU Hoge UV", "CPU Low VMIN": "CPU Lage VMIN", "CPU High VMIN": "CPU Hoge VMIN", + "No Undervolt": "Geen ondervolt", "SLT Table": "SLT-tabel", "HiOPT Table": "HiOPT-tabel", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU-VMIN", "GPU Maximum Voltage": "GPU maximale spanning", "GPU Voltage Offset": "GPU-spanningsoffset", - "Do not override": "Niet overschrijven", - "Enabled (Default)": "Ingeschakeld (standaard)", - "96.6% limit": "96,6% limiet", - "99.7% limit": "99,7% limiet", - "GPU Scheduling Override": "GPU-planning negeren", - "Official Service": "Officiële dienst", "GPU DVFS Mode": "GPU DVFS-modus", "GPU DVFS Offset": "GPU DVFS-offset", "GPU Voltage Table": "GPU-spanningstabel", "GPU Custom Table (mV)": "Aangepaste GPU-tabel (mV)", + "Official Service": "Officiële dienst", + "96.6% limit": "96,6% limiet", + "99.7% limit": "99,7% limiet", + " Setting GPU Clocks past": "GPU-klokken instellen voorbij", + "1228MHz without a proper undervolt": "1228MHz zonder goede onderspanning", + "can cause degradation or damage": "kan degradatie of schade veroorzaken", + "to your console!": "aan uw console!", "1075MHz without UV, 1152MHz on SLT": "1075MHz zonder UV, 1152MHz op SLT", "or 1228MHz on HiOPT can cause ": "of 1228MHz op HiOPT kan dit veroorzaken", "permanent damage to your Switch!": "blijvende schade aan uw Switch!", "921MHz without UV and 960MHz on": "921MHz zonder UV en 960MHz aan", - "SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken" + "SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken", + + "Default (Mariko)": "Standaard (Mariko)", + "Default (Erista)": "Standaard (Erista)", + "Rating": "Beoordeling", + "Safe Max (Mariko)": "Veilig Max (Mariko)", + "Safe Max (Erista)": "Veilige Max (Erista)", + + "Voltages": "Spanningen", + "RAM Voltage:": "RAM-spanning:", + "Display Voltage:": "Displayspanning:", + "Temperatures": "Temperaturen", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normaal", + "Warm": "Warm", + "Hot": "Heet", + "Overheat": "Oververhitting", + "Not Patched": "Niet gepatcht", + "Invalid": "Ongeldig", + "RAM Bandwidth": "RAM-bandbreedte", + "RAM BW (Peak):": "RAM-BW (Piek):", + "RAM BW (All):": "RAM-BW (Alle):", + "RAM BW (CPU):": "RAM-BW (CPU):", + "RAM BW (GPU):": "RAM-BW (GPU):", + "Hardware Info": "Hardware-info", + "Console Type:": "Consoletype:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM-module: ", + "Software Info": "Software-info", + "KIP version:": "KIP-versie:", + "sys-dock status:": "sys-dock-status:", + "SaltyNX status:": "SaltyNX-status:", + "RR Display status:": "RR Weergavestatus:", + "Wafer Position:": "Waferpositie:", + "IDDQ:": "IDDQ:", + "Module: ": "module:", + "Board": "Bord", + "Display": "Weergave", + + "Developers": "Ontwikkelaars", + "Contributors": "Bijdragers", + "Testers": "Testers", + "Translators": "Vertalers", + "Special Thanks": "Speciale dank", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compileren met minimale functies", + "THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN" } diff --git a/Source/hoc-clk/overlay/lang/pl.json b/Source/hoc-clk/overlay/lang/pl.json index 1233aa93..eecc5071 100644 --- a/Source/hoc-clk/overlay/lang/pl.json +++ b/Source/hoc-clk/overlay/lang/pl.json @@ -1,37 +1,33 @@ { "Information": "Informacje", - "IDDQ:": "IDDQ:", - "Module: ": "Moduł:", - "sys-dock status:": "stan sys-dock:", - "SaltyNX status:": "Stan SaltyNX:", - "RR Display status:": "Stan wyświetlacza:", - "Wafer Position:": "Pozycja wafla:", - "Credits": "Kredyty", - "Developers": "Deweloperzy", - "Contributors": "Współautorzy", - "Testers": "Testery", - "Special Thanks": "Specjalne podziękowania", "Unknown": "Nieznany", "Installed": "Zainstalowany", "Not Installed": "Nie zainstalowano", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE", "Default": "Domyślne", "Do Not Override": "Nie zastępuj", - "Disabled": "Niepełnosprawny", + "Do not override": "Nie zastępuj", + "Disabled": "Wyłączony", "Enabled": "Włączone", - " \\ue0e3 Reset": "\\ue0e3 Zresetuj", - "Display": "Wyświetlacz", - "Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n", - "The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n", - "while editing was going on.": "podczas gdy edycja była w toku.", - "Board": "Deska", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Włączone (domyślnie)", + "Enable": "Włącz", + "Fatal error": "Fatalny błąd", "Could not connect to hoc-clk sysmodule.\\n\\n": "Nie można połączyć się z modułem sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Upewnij się, że wszystko jest\\n\\n", "correctly installed and enabled.": "poprawnie zainstalowany i włączony.", - "Fatal error": "Fatalny błąd", + + "Edit App Profile": "Edytuj profil aplikacji", + "Edit Global Profile": "Edytuj profil globalny", + "Temporary Overrides": "Tymczasowe nadpisania", "Temporary Overrides ": "Tymczasowe nadpisania", + "  Reset": " Zresetuj", + "Settings": "Ustawienia", + "About": "O", + "Credits": "Kredyty", + + "Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n", + "The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n", + "while editing was going on.": "podczas gdy edycja była w toku.", + "Sleep Mode": "Tryb uśpienia", "Stock": "Zapas", "Dev OC": "Dev OC", @@ -39,14 +35,8 @@ "Safe Max": "Bezpieczny maks", "Unsafe Max": "Niebezpieczny maks", "Absolute Max": "Absolutny maks", - "Handheld Safe Max": "Sejf ręczny Max", - "Enable": "Włącz", - "Edit App Profile": "Edytuj profil aplikacji", - "Edit Global Profile": "Edytuj profil globalny", - "Temporary Overrides": "Tymczasowe nadpisania", - "Settings": "Ustawienia", - "About": "O", - "Compiling with minimal features": "Kompilacja z minimalnymi funkcjami", + "Handheld Safe Max": "Przenośny bezpieczny maks", + "General Settings": "Ustawienia ogólne", "Governor Settings": "Ustawienia gubernatora", "Safety Settings": "Ustawienia bezpieczeństwa", @@ -55,41 +45,64 @@ "CPU Settings": "Ustawienia procesora", "GPU Settings": "Ustawienia GPU", "Display Settings": "Ustawienia wyświetlania", + "Experimental Settings": "Ustawienia eksperymentalne", "Experimental": "Eksperymentalny", + + " Settings marked in blue": "Ustawienia zaznaczone na niebiesko", + "don't require a reboot to apply!": "nie wymagają ponownego uruchomienia!", + "You can also press  to show": "Możesz też wcisnąć  aby wyświetlić", + "information about each setting.": "informacje o każdym ustawieniu.", + + " Experimental Settings are incomplete ": "Ustawienia eksperymentalne są niekompletne", + "and may not work correctly or at all!": "i mogą w ogóle nie działać!", + "Here be dragons!": "Tu są smoki!", + + "RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM", + "RAM Display Unit": "Jednostka wyświetlania RAM", + "Polling Interval": "Interwał odpytywania", + "GPU Scheduling Override Method": "Metoda obejścia harmonogramu GPU", + "GPU Scheduling Override": "Zastąpienie harmonogramu GPU", + "GPU Boot Volt": "Napięcie startowe GPU", + "GPU Boot Voltage": "Napięcie startowe GPU", + "Memory Frequency Measurement Mode": "Tryb pomiaru częstotliwości pamięci", + " Overriding the charge current": "Nadpisanie prądu ładowania", "can be dangerous and may cause": "może być niebezpieczne i powodować", "damage to your battery or charger!": "uszkodzenie akumulatora lub ładowarki!", "Charge Current Override": "Obejście prądu ładowania", - "RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM", - "Polling Interval": "Interwał odpytywania", + "Display Color Preset": "Preset koloru", + "Basic": "Podstawowy", + "Saturated": "Nasycony", + "Washed": "Wyblakły", + "Natural": "Naturalny", + "Vivid": "Żywy", + "CPU Governor Minimum Frequency": "Minimalna częstotliwość regulatora procesora", + " Usage of unsafe display": "Użycie niebezpiecznych częstotliwości", "refresh rates may cause stress": "częstotliwości odświeżania mogą powodować stres", "or damage to your display! ": "lub uszkodzenie wyświetlacza!", "Proceed at your own risk!": "Postępuj na własne ryzyko!", "Max Handheld Display": "Maksymalny wyświetlacz ręczny", + "Max Handheld Display Hz": "Maks. Hz w trybie przenośnym", "Display Clock": "Wyświetl zegar", + " Adjust the display voltage": "Dostosuj napięcie wyświetlacza", + "with caution to avoid damage": "ostrożnie, aby uniknąć uszkodzeń", + "to your display panel! ": "panelu wyświetlacza!", + "Display Voltage": "Napięcie wyświetlacza", + + "Thermal Throttle Limit": "Limit przepustnicy termicznej", "Official Rating": "Oficjalna ocena", "TDP Threshold": "Próg TDP", "Power": "Moc", - "Thermal Throttle Limit": "Limit przepustnicy termicznej", "HP Mode": "Tryb HP", - "Default (Mariko)": "Domyślny (Mariko)", - "Default (Erista)": "Domyślny (Erista)", - "Rating": "Ocena", - "Safe Max (Mariko)": "Bezpieczny Max (Mariko)", - "Safe Max (Erista)": "Bezpieczny Max (Erista)", + + "DVB Shift": "Przesunięcie DVB", + "SoC Max Volt": "Maks. napięcie SoC", + "Step Mode": "Tryb krokowy", "RAM VDD2 Voltage": "Napięcie pamięci RAM VDD2", - "Voltage": "Napięcie", "RAM VDDQ Voltage": "Napięcie RAM VDDQ", + "Voltage": "Napięcie", "RAM Frequency Editor": "Edytor częstotliwości RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Potrzebna duża prędkość!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)", "Ram Max Clock": "Zegar Ram Max", "RAM Latency Editor": "Edytor opóźnień pamięci RAM", "RAM Timing Reductions": "Zmniejszenie taktowania pamięci RAM", @@ -100,8 +113,17 @@ "t7 tWTR Fine Tune": "t7 tWTR Dostosuj", "tWTR Fine Tune": "tWTR Dostosuj", "Memory Latencies": "Opóźnienia pamięci", - "Read Latency": "Przeczytaj Opóźnienie", + "Read Latency": "Opóźnienie odczytu", "Write Latency": "Opóźnienie zapisu", + "High speedo needed!": "Potrzebna duża wartość Speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Zegar wzmocnienia procesora", "CPU UV": "Procesor UV", "CPU Unlock": "Odblokowanie procesora", @@ -114,6 +136,7 @@ "CPU High UV": "Wysokie promieniowanie UV procesora", "CPU Low VMIN": "Niski poziom VMIN procesora", "CPU High VMIN": "Wysoki poziom VMIN procesora", + "No Undervolt": "Brak Undervolta", "SLT Table": "Stół SLT", "HiOPT Table": "Stół HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "VMIN GPU", "GPU Maximum Voltage": "Maksymalne napięcie procesora graficznego", "GPU Voltage Offset": "Przesunięcie napięcia GPU", - "Do not override": "Nie zastępuj", - "Enabled (Default)": "Włączone (domyślnie)", - "96.6% limit": "Limit 96,6%.", - "99.7% limit": "Limit 99,7%.", - "GPU Scheduling Override": "Zastąpienie harmonogramu GPU", - "Official Service": "Oficjalny serwis", "GPU DVFS Mode": "Tryb DVFS procesora graficznego", "GPU DVFS Offset": "Przesunięcie DVFS GPU", "GPU Voltage Table": "Tabela napięć GPU", "GPU Custom Table (mV)": "Tabela niestandardowa GPU (mV)", + "Official Service": "Oficjalny serwis", + "96.6% limit": "Limit 96,6%", + "99.7% limit": "Limit 99,7%", + " Setting GPU Clocks past": "Ustawianie zegarów GPU powyżej", + "1228MHz without a proper undervolt": "1228 MHz bez odpowiedniego undervolta", + "can cause degradation or damage": "może powodować degradację lub uszkodzenia", + "to your console!": "Twoją konsolę!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz bez UV, 1152 MHz na SLT", "or 1228MHz on HiOPT can cause ": "lub 1228 MHz na HiOPT może powodować", "permanent damage to your Switch!": "trwałe uszkodzenie Switcha!", "921MHz without UV and 960MHz on": "921 MHz bez UV i 960 MHz włączone", - "SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT" + "SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT", + + "Default (Mariko)": "Domyślny (Mariko)", + "Default (Erista)": "Domyślny (Erista)", + "Rating": "Ocena", + "Safe Max (Mariko)": "Bezpieczny Max (Mariko)", + "Safe Max (Erista)": "Bezpieczny Max (Erista)", + + "Voltages": "Napięcia", + "RAM Voltage:": "Napięcie RAM:", + "Display Voltage:": "Napięcie wyświetlacza:", + "Temperatures": "Temperatury", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normalny", + "Warm": "Ciepły", + "Hot": "Gorący", + "Overheat": "Przegrzanie", + "Not Patched": "Bez patcha", + "Invalid": "Nieprawidłowy", + "RAM Bandwidth": "Przepustowość RAM", + "RAM BW (Peak):": "BW RAM (Maks.):", + "RAM BW (All):": "BW RAM (Wszys.):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info o sprzęcie", + "Console Type:": "Typ konsoli:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Moduł DRAM: ", + "Software Info": "Info o oprogramowaniu", + "KIP version:": "Wersja KIP:", + "sys-dock status:": "stan sys-dock:", + "SaltyNX status:": "Stan SaltyNX:", + "RR Display status:": "Stan wyświetlacza:", + "Wafer Position:": "Pozycja wafla:", + "IDDQ:": "IDDQ:", + "Module: ": "Moduł:", + "Board": "Deska", + "Display": "Wyświetlacz", + + "Developers": "Deweloperzy", + "Contributors": "Współautorzy", + "Testers": "Testery", + "Translators": "Tłumacze", + "Special Thanks": "Specjalne podziękowania", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Kompilacja z minimalnymi funkcjami", + "THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE" } diff --git a/Source/hoc-clk/overlay/lang/pt.json b/Source/hoc-clk/overlay/lang/pt.json index fbddab17..906bab87 100644 --- a/Source/hoc-clk/overlay/lang/pt.json +++ b/Source/hoc-clk/overlay/lang/pt.json @@ -1,52 +1,42 @@ { "Information": "Informação", - "IDDQ:": "IDDQ:", - "Module: ": "Módulo:", - "sys-dock status:": "status do dock do sistema:", - "SaltyNX status:": "Status do SaltyNX:", - "RR Display status:": "Status de exibição do RR:", - "Wafer Position:": "Posição da bolacha:", - "Credits": "Créditos", - "Developers": "Desenvolvedores", - "Contributors": "Colaboradores", - "Testers": "Testadores", - "Special Thanks": "Agradecimentos especiais", "Unknown": "Desconhecido", "Installed": "Instalado", "Not Installed": "Não instalado", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA", "Default": "Padrão", "Do Not Override": "Não substituir", + "Do not override": "Não substitua", "Disabled": "Desativado", "Enabled": "Habilitado", - " \\ue0e3 Reset": "\\ue0e3 Redefinir", - "Display": "Exibição", - "Application changed\\n\\n": "Aplicativo alterado\\n\\n", - "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", - "while editing was going on.": "enquanto a edição estava acontecendo.", - "Board": "Conselho", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "Habilitado (padrão)", + "Enable": "Habilitar", + "Fatal error": "Erro fatal", "Could not connect to hoc-clk sysmodule.\\n\\n": "Não foi possível conectar-se ao sysmodule hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Verifique se tudo está\\n\\n", "correctly installed and enabled.": "corretamente instalado e ativado.", - "Fatal error": "Erro fatal", + + "Edit App Profile": "Editar perfil do aplicativo", + "Edit Global Profile": "Editar perfil global", + "Temporary Overrides": "Substituições temporárias", "Temporary Overrides ": "Substituições temporárias", + "  Reset": " Redefinir", + "Settings": "Configurações", + "About": "Sobre", + "Credits": "Créditos", + + "Application changed\\n\\n": "Aplicativo alterado\\n\\n", + "The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n", + "while editing was going on.": "enquanto a edição estava acontecendo.", + "Sleep Mode": "Modo de suspensão", - "Stock": "Estoque", + "Stock": "Padrão de fábrica", "Dev OC": "Desenvolvedor OC", "Boost Mode": "Modo de reforço", "Safe Max": "Máx. Seguro", "Unsafe Max": "Máximo inseguro", "Absolute Max": "Máximo absoluto", "Handheld Safe Max": "Portátil Seguro Máx.", - "Enable": "Habilitar", - "Edit App Profile": "Editar perfil do aplicativo", - "Edit Global Profile": "Editar perfil global", - "Temporary Overrides": "Substituições temporárias", - "Settings": "Configurações", - "About": "Sobre", - "Compiling with minimal features": "Compilando com recursos mínimos", + "General Settings": "Configurações Gerais", "Governor Settings": "Configurações do Governador", "Safety Settings": "Configurações de segurança", @@ -55,42 +45,65 @@ "CPU Settings": "Configurações de CPU", "GPU Settings": "Configurações de GPU", "Display Settings": "Configurações de exibição", + "Experimental Settings": "Configurações experimentais", "Experimental": "Experimental", + + " Settings marked in blue": "Configurações marcadas em azul", + "don't require a reboot to apply!": "não requerem reinicialização para aplicar!", + "You can also press  to show": "Pressione também  para mostrar", + "information about each setting.": "informações sobre cada configuração.", + + " Experimental Settings are incomplete ": "Configurações experimentais incompletas", + "and may not work correctly or at all!": "e podem não funcionar corretamente!", + "Here be dragons!": "Aqui há dragões!", + + "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", + "RAM Display Unit": "Unidade de exibição de RAM", + "Polling Interval": "Intervalo de sondagem", + "GPU Scheduling Override Method": "Método de substituição de agendamento de GPU", + "GPU Scheduling Override": "Substituição de agendamento de GPU", + "GPU Boot Volt": "Tensão de inicialização da GPU", + "GPU Boot Voltage": "Tensão de inicialização da GPU", + "Memory Frequency Measurement Mode": "Modo de medição de frequência de memória", + " Overriding the charge current": "Substituir a corrente de carga", "can be dangerous and may cause": "pode ser perigoso e causar", "damage to your battery or charger!": "danos à sua bateria ou carregador!", "Charge Current Override": "Substituição de corrente de carga", - "RAM Voltage Display Mode": "Modo de exibição de tensão RAM", - "Polling Interval": "Intervalo de votação", + "Display Color Preset": "Predefinição de cor", + "Basic": "Básico", + "Saturated": "Saturado", + "Washed": "Desbotado", + "Natural": "Natural", + "Vivid": "Vívido", + "CPU Governor Minimum Frequency": "Frequência Mínima do Governador da CPU", + " Usage of unsafe display": "O uso de frequências de tela", "refresh rates may cause stress": "taxas de atualização podem causar estresse", "or damage to your display! ": "ou danos ao seu monitor!", "Proceed at your own risk!": "Prossiga por sua conta e risco!", "Max Handheld Display": "Visor portátil máximo", + "Max Handheld Display Hz": "Hz máximo em modo portátil", "Display Clock": "Exibir relógio", + " Adjust the display voltage": "Ajuste a tensão do display", + "with caution to avoid damage": "com cuidado para evitar danos", + "to your display panel! ": "ao painel do display!", + "Display Voltage": "Tensão do display", + + "Thermal Throttle Limit": "Limite de aceleração térmica", "Official Rating": "Classificação Oficial", "TDP Threshold": "Limite de TDP", - "Power": "Poder", - "Thermal Throttle Limit": "Limite de aceleração térmica", + "Power": "Potência", "HP Mode": "Modo HP", - "Default (Mariko)": "Padrão (Mariko)", - "Default (Erista)": "Padrão (Erista)", - "Rating": "Avaliação", - "Safe Max (Mariko)": "Máximo Seguro (Mariko)", - "Safe Max (Erista)": "Seguro Max (Erista)", + + "DVB Shift": "Deslocamento DVB", + "SoC Max Volt": "Tensão máxima do SoC", + "Step Mode": "Modo passo", "RAM VDD2 Voltage": "Tensão RAM VDD2", - "Voltage": "Tensão", "RAM VDDQ Voltage": "Tensão RAM VDDQ", + "Voltage": "Tensão", "RAM Frequency Editor": "Editor de frequência RAM", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Alta velocidade necessária!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", - "Ram Max Clock": "Relógio máximo de Ram", + "Ram Max Clock": "Frequência máxima de Ram", "RAM Latency Editor": "Editor de latência de RAM", "RAM Timing Reductions": "Reduções de tempo de RAM", "Memory Timings": "Tempos de memória", @@ -102,6 +115,15 @@ "Memory Latencies": "Latências de memória", "Read Latency": "Latência de leitura", "Write Latency": "Latência de gravação", + "High speedo needed!": "Alto valor de Speedo necessário!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Relógio de aumento da CPU", "CPU UV": "UV da CPU", "CPU Unlock": "Desbloqueio da CPU", @@ -114,6 +136,7 @@ "CPU High UV": "CPU alta UV", "CPU Low VMIN": "CPU baixa VMIN", "CPU High VMIN": "VMIN alto da CPU", + "No Undervolt": "Sem subtensão", "SLT Table": "Tabela SLT", "HiOPT Table": "Tabela HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Tensão máxima da GPU", "GPU Voltage Offset": "Compensação de tensão da GPU", - "Do not override": "Não substitua", - "Enabled (Default)": "Habilitado (padrão)", - "96.6% limit": "Limite de 96,6%", - "99.7% limit": "Limite de 99,7%", - "GPU Scheduling Override": "Substituição de agendamento de GPU", - "Official Service": "Serviço Oficial", "GPU DVFS Mode": "Modo GPU DVFS", "GPU DVFS Offset": "Deslocamento DVFS da GPU", "GPU Voltage Table": "Tabela de tensão da GPU", "GPU Custom Table (mV)": "Tabela personalizada de GPU (mV)", + "Official Service": "Serviço Oficial", + "96.6% limit": "Limite de 96,6%", + "99.7% limit": "Limite de 99,7%", + " Setting GPU Clocks past": "Definir clocks de GPU além de", + "1228MHz without a proper undervolt": "1228MHz sem undervolt adequado", + "can cause degradation or damage": "pode causar degradação ou danos", + "to your console!": "ao seu console!", "1075MHz without UV, 1152MHz on SLT": "1075 MHz sem UV, 1152 MHz em SLT", "or 1228MHz on HiOPT can cause ": "ou 1228 MHz em HiOPT pode causar", "permanent damage to your Switch!": "danos permanentes ao seu Switch!", "921MHz without UV and 960MHz on": "921 MHz sem UV e 960 MHz ativado", - "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar" + "SLT or HiOPT can cause ": "SLT ou HiOPT podem causar", + + "Default (Mariko)": "Padrão (Mariko)", + "Default (Erista)": "Padrão (Erista)", + "Rating": "Avaliação", + "Safe Max (Mariko)": "Máximo Seguro (Mariko)", + "Safe Max (Erista)": "Seguro Max (Erista)", + + "Voltages": "Tensões", + "RAM Voltage:": "Tensão RAM:", + "Display Voltage:": "Tensão do display:", + "Temperatures": "Temperaturas", + "PLLX Temp:": "PLLX Temp:", + "AOTAG Temp:": "AOTAG Temp:", + "BQ24193 Temp:": "BQ24193 Temp:", + "Normal": "Normal", + "Warm": "Morno", + "Hot": "Quente", + "Overheat": "Superaquecimento", + "Not Patched": "Não corrigido", + "Invalid": "Inválido", + "RAM Bandwidth": "Largura de banda RAM", + "RAM BW (Peak):": "BW RAM (Pico):", + "RAM BW (All):": "BW RAM (Total):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Info de hardware", + "Console Type:": "Tipo de console:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Módulo DRAM: ", + "Software Info": "Info de software", + "KIP version:": "Versão KIP:", + "sys-dock status:": "status do dock do sistema:", + "SaltyNX status:": "Status do SaltyNX:", + "RR Display status:": "Status de exibição do RR:", + "Wafer Position:": "Posição do wafer:", + "IDDQ:": "IDDQ:", + "Module: ": "Módulo:", + "Board": "Placa", + "Display": "Exibição", + + "Developers": "Desenvolvedores", + "Contributors": "Colaboradores", + "Testers": "Testadores", + "Translators": "Tradutores", + "Special Thanks": "Agradecimentos especiais", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "Compilando com recursos mínimos", + "THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA" } diff --git a/Source/hoc-clk/overlay/lang/ru.json b/Source/hoc-clk/overlay/lang/ru.json index 7edb4408..3a428087 100644 --- a/Source/hoc-clk/overlay/lang/ru.json +++ b/Source/hoc-clk/overlay/lang/ru.json @@ -1,38 +1,33 @@ { "Information": "Информация", - "IDDQ:": "IDDQ:", - "Module: ": "Module:", - "sys-dock status:": "Статус sys-dock:", - "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус RR Display:", - "Wafer Position:": "Wafer Position:", - "Credits": "Благодарности", - "Developers": "Разработчики", - "Contributors": "Внесли вклад", - "Testers": "Тестеры", - "Special Thanks": "Особая благодарность", "Unknown": "Неизвестно", "Installed": "Установлено", "Not Installed": "Не установлено", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", "Default": "По умолчанию", "Do Not Override": "Не менять", + "Do not override": "Не менять", "Disabled": "Отключено", "Enabled": "Включено", - "Auto": "Авто", - " \\ue0e3 Reset": "\\ue0e3 Сброс", - "Display": "Дисплей", - "Application changed\\n\\n": "Приложение изменено\\n\\n", - "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", - "while editing was going on.": "пока шло редактирование.", - "Board": "Board", - "%u.%u%u mV": "%u.%u%u мВ", + "Enabled (Default)": "Включено (По умолчанию)", + "Enable": "Включено", + "Fatal error": "Фатальная ошибка", "Could not connect to hoc-clk sysmodule.\\n\\n": "Не удалось подключиться к сис-модулю hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Пожалуйста, убедитесь, что все\\n\\n", "correctly installed and enabled.": "правильно установлено и включено.", - "Fatal error": "Фатальная ошибка", + + "Edit App Profile": "Профиль приложения", + "Edit Global Profile": "Глобальный профиль", + "Temporary Overrides": "Временный профиль", "Temporary Overrides ": "Временный профиль", + "  Reset": " Сброс", + "Settings": "Настройки", + "About": "Сведения", + "Credits": "Благодарности", + + "Application changed\\n\\n": "Приложение изменено\\n\\n", + "The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n", + "while editing was going on.": "пока шло редактирование.", + "Sleep Mode": "Спящий режим", "Stock": "Стандарт", "Dev OC": "Разгон dev-кита", @@ -41,15 +36,7 @@ "Unsafe Max": "Опасный макс.", "Absolute Max": "Абсолютный макс.", "Handheld Safe Max": "Портативный безопасный макс.", - "Enable": "Включено", - "Edit App Profile": "Профиль приложения", - "Edit Global Profile": "Глобальный профиль", - "Temporary Overrides": "Временный профиль", - "Settings": "Настройки", - "About": "Сведения", - "Compiling with minimal features": "Собрано с урезанием функций", - "\uE150 Settings marked in blue": "Настройки помеченные синим", - "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "General Settings": "Основные настройки", "Governor Settings": "Настройки говернора", "Safety Settings": "Настройки безопасности", @@ -58,45 +45,76 @@ "CPU Settings": "Настройки CPU", "GPU Settings": "Настройки GPU", "Display Settings": "Настройки дисплея", - "Experimental": "Экспериментальный", - "Enable Experimental Settings": "Экспериментальные настройки", - "\uE150 Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", - "and may not work correctly or at all!": "Экспериментальные настройки не", - "Here be dragons!": "закончены и могут не работать!", "Experimental Settings": "Экспериментальные", - "Live CPU Undervolt": "Мгновенный андервольт CPU", - "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", - "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", - "\uE150 Overriding the charge current": "Перезапись зарядного тока может", - "can be dangerous and may cause": "Перезапись зарядного тока может", - "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", - "Charge Current Override": "Перезапись зарядного тока", + "Experimental": "Экспериментальный", + + " Settings marked in blue": "Настройки помеченные синим", + "don't require a reboot to apply!": "Синие настройки применяются сразу!", + "You can also press  to show": "Нажмите  для просмотра", + "information about each setting.": "информацию о каждом параметре.", + + " Experimental Settings are incomplete ": "Экспериментальные настройки не закончены", + "and may not work correctly or at all!": "Экспериментальные настройки могут не работать!", + "Here be dragons!": "Здесь будут драконы!", + "RAM Voltage Display Mode": "Показ вольтажа RAM", "RAM Display Unit": "Показ единицы измерения RAM", "Polling Interval": "Интервал опроса", + + "GPU Scheduling Override Method": "Метод перезаписи планировщика GPU", + "GPU Scheduling Override": "Перезапись планировщика", + "GPU Boot Volt": "Напряжение загрузки GPU", + "GPU Boot Voltage": "Напряжение загрузки GPU", + "Memory Frequency Measurement Mode": "Режим измерения частоты RAM", + " Overriding the charge current": "Перезапись зарядного тока может", + "can be dangerous and may cause": "Перезапись зарядного тока может", + "damage to your battery or charger!": "повреждить аккумулятор или зарядку!", + "Charge Current Override": "Перезапись зарядного тока", + "Display Color Preset": "Цветовой пресет", + "Basic": "Базовый", + "Saturated": "Насыщенный", + "Washed": "Бледный", + "Natural": "Натуральный", + "Vivid": "Яркий", + "CPU Governor Minimum Frequency": "Минимальная частота говернора CPU", - "\uE150 Usage of unsafe display": "\uE150 Использование не безопасной", + " Usage of unsafe display": "Использование не безопасной", "refresh rates may cause stress": "Не безопасная частота", "or damage to your display! ": "может повредить ваш экран", "Proceed at your own risk!": "Действуйте на свой страх и риск!", + "Max Handheld Display": "Макс. дисплей портатива", "Max Handheld Display Hz": "Макс. в портативе", "Display Clock": "Частота экрана", + " Adjust the display voltage": "Настройте напряжение экрана", + "with caution to avoid damage": "с осторожностью во избежание повреждений", + "to your display panel! ": "повреждений экрана!", + "Display Voltage": "Напряжение экрана", + + "Thermal Throttle Limit": "Предел троттлинга", "Official Rating": "Официальный рейтинг", "TDP Threshold": "Порог TDP", "Power": "Мощность", - "Thermal Throttle Limit": "Предел троттлинга", "HP Mode": "Режим HP", - "Default (Mariko)": "По умолчанию (M)", - "Default (Erista)": "По умолчанию (E)", - "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (M)", - "Safe Max (Erista)": "Сейф Макс (E)", - "RAM VDD2 Voltage": "Вольтаж VDD2", - "Voltage": "Вольтаж", - "RAM VDDQ Voltage": "Вольтаж VDDQ", + + "DVB Shift": "DVB сдвиг", + "SoC Max Volt": "Макс. вольт SoC", "Step Mode": "Частотный шаг", + "RAM VDD2 Voltage": "Вольтаж VDD2", + "RAM VDDQ Voltage": "Вольтаж VDDQ", + "Voltage": "Вольтаж", "RAM Frequency Editor": "Редактор частоты", - "JEDEC.": "JEDEC.", + "Ram Max Clock": "Макс. частота", + "RAM Latency Editor": "Редактор задержек", + "RAM Timing Reductions": "Настройка таймингов", + "Memory Timings": "Тайминги RAM", + "Advanced": "Расширенные", + "t6 tRTW Fine Tune": "Точная настройка t6 tRTW", + "tRTW Fine Tune": "Точная настройка tRTW", + "t7 tWTR Fine Tune": "Точная настройка t7 tWTR", + "tWTR Fine Tune": "Точная настройка tWTR", + "Memory Latencies": "Задержки памяти", + "Read Latency": "Задержка чтения", + "Write Latency": "Задержка записи", "High speedo needed!": "Для высоких speedo", "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (нужны невероятные speedo/PLL)", "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (нужны невероятные speedo/PLL)", @@ -104,43 +122,8 @@ "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (нужны безумные speedo/PLL)", "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (нужны безумные speedo/PLL)", "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (нужны безумные speedo/PLL)", - "Ram Max Clock": "Макс. частота", - "RAM Latency Editor": "Редактор задержек", - "1333 Latency Max": "1333 задержка", - "1600 Latency Max": "1600 задержка", - "1866 Latency Max": "1866 задержка", - "2133 Latency Max": "2133 задержка", - "RAM Timing Reductions": "Настройка таймингов", - "Memory Timings": "Тайминги RAM", - "RAM-Timing tBreak": "Разбитие таблицы таймингов", - "Memory": "RAM", - "mem": "RAM", - "MEM": "RAM", - "Profile": "Профиль", - "Governor": "Говернор", - "Advanced": "Расширенные", - "Docked": "В доке", - "Handheld": "Портатив", - "Charging": "На зарядке", - "USB Charger": "USB Зарядка", - "PD Charger": "PD Зарядка", - "Handheld TDP": "TPD в портативе", - "Thermal Throttle": "Троттлинг", - "Uncapped Clocks": "Максимальные частоты", - "SoC DVB Shift": "SoC DVB сдвиг", - "SoC Max Volt": "Макс. вольт SoC", - "Overwrite Boost Mode": "Перезапись буста", - "Display Refresh Rate Changing": "Изменение частоты экрана", - "Low t6 tRTW": "Нижний t6 tRTW", - "Low t7 tWTR": "Нижний t7 tWTR", - "1333WL t2 RP Cap": "Предел 1333WL t2 RP", - "t6 tRTW Fine Tune": " Точная настройка t6 tRTW", - "tRTW Fine Tune": " Точная настройка tRTW", - "t7 tWTR Fine Tune": " Точная настройка t7 tWTR", - "tWTR Fine Tune": " Точная настройка tWTR", - "Memory Latencies": "Задержки памяти", - "Read Latency": "Задержка чтения", - "Write Latency": "Задержка записи", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "Частота буста", "CPU UV": "Андервольт CPU", "CPU Unlock": "Разблокировка CPU", @@ -153,6 +136,7 @@ "CPU High UV": "Андервольт верхних частот", "CPU Low VMIN": "Мин. вольт. нижних частот", "CPU High VMIN": "Мин. вольт. верхних частот", + "No Undervolt": "Без андервольта", "SLT Table": "Таблица SLT", "HiOPT Table": "Таблица HiOPT", @@ -162,18 +146,71 @@ "GPU VMIN": "Мин. вольтаж", "GPU Maximum Voltage": "Макс. вольтаж", "GPU Voltage Offset": "Смещение вольтажа", - "Do not override": "Не менять", - "Enabled (Default)": "Включено (По умолчанию)", - "96.6% limit": "≤96,6%", - "99.7% limit": "≤99,7%", - "GPU Scheduling Override": "Перезапись планировщика", - "Official Service": "Официальная служба", "GPU DVFS Mode": "Режим DVFS", "GPU DVFS Offset": "Смещение DVFS", "GPU Voltage Table": "Таблица вольтажей", "GPU Custom Table (mV)": "Ручная таблица (мВ)", - "\uE150 Setting GPU Clocks past": "\uE150 Установка частот GPU выше", - "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", + "Official Service": "Официальная служба", + "96.6% limit": "≤96,6%", + "99.7% limit": "≤99,7%", + " Setting GPU Clocks past": "Установка частот GPU выше", + "1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц", "can cause degradation or damage": "без хорошего андервольта может", - "to your console!": "повредить вашу консоль!" + "to your console!": "повредить вашу консоль!", + "1075MHz without UV, 1152MHz on SLT": "1075 МГц без UV, 1152 МГц на SLT", + "or 1228MHz on HiOPT can cause ": "или 1228 МГц на HiOPT может привести к", + "permanent damage to your Switch!": "постоянному повреждению вашей Switch!", + "921MHz without UV and 960MHz on": "921 МГц без UV и 960 МГц на", + "SLT or HiOPT can cause ": "SLT или HiOPT могут привести к", + + "Default (Mariko)": "По умолчанию (M)", + "Default (Erista)": "По умолчанию (E)", + "Rating": "Рейтинг", + "Safe Max (Mariko)": "Сейф Макс (M)", + "Safe Max (Erista)": "Сейф Макс (E)", + + "Voltages": "Напряжения", + "RAM Voltage:": "Напряжение RAM:", + "Display Voltage:": "Напряжение дисплея:", + "Temperatures": "Температуры", + "PLLX Temp:": "PLLX Темп.:", + "AOTAG Temp:": "AOTAG Темп.:", + "BQ24193 Temp:": "BQ24193 Темп.:", + "Normal": "Нормальная", + "Warm": "Тёплая", + "Hot": "Горячая", + "Overheat": "Перегрев", + "Not Patched": "Не пропатчено", + "Invalid": "Недействительно", + "RAM Bandwidth": "Пропускная способность RAM", + "RAM BW (Peak):": "Полоса RAM (Макс.):", + "RAM BW (All):": "Полоса RAM (Всего):", + "RAM BW (CPU):": "Полоса RAM (CPU):", + "RAM BW (GPU):": "Полоса RAM (GPU):", + "Hardware Info": "Информация об оборудовании", + "Console Type:": "Тип консоли:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Модуль DRAM: ", + "Software Info": "Информация о программе", + "KIP version:": "Версия KIP:", + "sys-dock status:": "Статус sys-dock:", + "SaltyNX status:": "Статус SaltyNX:", + "RR Display status:": "Статус RR Display:", + "Wafer Position:": "Wafer Position:", + "IDDQ:": "IDDQ:", + "Module: ": "Module:", + "Board": "Board", + "Display": "Дисплей", + + "Developers": "Разработчики", + "Contributors": "Внесли вклад", + "Testers": "Тестеры", + "Translators": "Переводчики", + "Special Thanks": "Особая благодарность", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u мВ", + "Compiling with minimal features": "Собрано с урезанием функций", + "THE BEER-WARE LICENSE": "BEER-WARE LICENSE", + "Auto": "Авто" } diff --git a/Source/hoc-clk/overlay/lang/template.json b/Source/hoc-clk/overlay/lang/template.json new file mode 100644 index 00000000..51c51c1a --- /dev/null +++ b/Source/hoc-clk/overlay/lang/template.json @@ -0,0 +1,214 @@ +{ + "Information": "", + "Unknown": "", + "Installed": "", + "Not Installed": "", + "Default": "", + "Do Not Override": "", + "Do not override": "", + "Disabled": "", + "Enabled": "", + "Enabled (Default)": "", + "Enable": "", + "Fatal error": "", + "Could not connect to hoc-clk sysmodule.\\n\\n": "", + "Please make sure everything is\\n\\n": "", + "correctly installed and enabled.": "", + + "Edit App Profile": "", + "Edit Global Profile": "", + "Temporary Overrides": "", + "Temporary Overrides ": "", + "  Reset": "", + "Settings": "", + "About": "", + "Credits": "", + + "Application changed\\n\\n": "", + "The running application changed\\n\\n": "", + "while editing was going on.": "", + + "Sleep Mode": "", + "Stock": "", + "Dev OC": "", + "Boost Mode": "", + "Safe Max": "", + "Unsafe Max": "", + "Absolute Max": "", + "Handheld Safe Max": "", + + "General Settings": "", + "Governor Settings": "", + "Safety Settings": "", + "Save KIP Settings": "", + "RAM Settings": "", + "CPU Settings": "", + "GPU Settings": "", + "Display Settings": "", + "Experimental Settings": "", + "Experimental": "", + + " Settings marked in blue": "", + "don't require a reboot to apply!": "", + "You can also press  to show": "", + "information about each setting.": "", + + " Experimental Settings are incomplete ": "", + "and may not work correctly or at all!": "", + "Here be dragons!": "", + + "RAM Voltage Display Mode": "", + "RAM Display Unit": "", + "Polling Interval": "", + + "GPU Scheduling Override Method": "", + "GPU Scheduling Override": "", + "GPU Boot Volt": "", + "GPU Boot Voltage": "", + "Memory Frequency Measurement Mode": "", + " Overriding the charge current": "", + "can be dangerous and may cause": "", + "damage to your battery or charger!": "", + "Charge Current Override": "", + "Display Color Preset": "", + "Basic": "", + "Saturated": "", + "Washed": "", + "Natural": "", + "Vivid": "", + + "CPU Governor Minimum Frequency": "", + " Usage of unsafe display": "", + "refresh rates may cause stress": "", + "or damage to your display! ": "", + "Proceed at your own risk!": "", + "Max Handheld Display": "", + "Max Handheld Display Hz": "", + "Display Clock": "", + " Adjust the display voltage": "", + "with caution to avoid damage": "", + "to your display panel! ": "", + "Display Voltage": "", + + "Thermal Throttle Limit": "", + "Official Rating": "", + "TDP Threshold": "", + "Power": "", + "HP Mode": "", + + "DVB Shift": "", + "SoC Max Volt": "", + "Step Mode": "", + "RAM VDD2 Voltage": "", + "RAM VDDQ Voltage": "", + "Voltage": "", + "RAM Frequency Editor": "", + "Ram Max Clock": "", + "RAM Latency Editor": "", + "RAM Timing Reductions": "", + "Memory Timings": "", + "Advanced": "", + "t6 tRTW Fine Tune": "", + "tRTW Fine Tune": "", + "t7 tWTR Fine Tune": "", + "tWTR Fine Tune": "", + "Memory Latencies": "", + "Read Latency": "", + "Write Latency": "", + "High speedo needed!": "", + "3333MHz (Needs extreme Speedo/PLL)": "", + "3366MHz (Needs extreme Speedo/PLL)": "", + "3400MHz (Needs extreme Speedo/PLL)": "", + "3433MHz (Needs ridiculous Speedo/PLL)": "", + "3466MHz (Needs ridiculous Speedo/PLL)": "", + "3500MHz (Needs ridiculous Speedo/PLL)": "", + "JEDEC.": "", + + "CPU Boost Clock": "", + "CPU UV": "", + "CPU Unlock": "", + "CPU VMIN": "", + "CPU Max Voltage": "", + "CPU Max Clock": "", + "Extreme UV Table": "", + "CPU UV Table": "", + "CPU Low UV": "", + "CPU High UV": "", + "CPU Low VMIN": "", + "CPU High VMIN": "", + + "No Undervolt": "", + "SLT Table": "", + "HiOPT Table": "", + "GPU Undervolt Table": "", + "GPU Minimum Voltage": "", + "Calculate GPU Vmin": "", + "GPU VMIN": "", + "GPU Maximum Voltage": "", + "GPU Voltage Offset": "", + "GPU DVFS Mode": "", + "GPU DVFS Offset": "", + "GPU Voltage Table": "", + "GPU Custom Table (mV)": "", + "Official Service": "", + "96.6% limit": "", + "99.7% limit": "", + " Setting GPU Clocks past": "", + "1228MHz without a proper undervolt": "", + "can cause degradation or damage": "", + "to your console!": "", + "1075MHz without UV, 1152MHz on SLT": "", + "or 1228MHz on HiOPT can cause ": "", + "permanent damage to your Switch!": "", + "921MHz without UV and 960MHz on": "", + "SLT or HiOPT can cause ": "", + + "Default (Mariko)": "", + "Default (Erista)": "", + "Rating": "", + "Safe Max (Mariko)": "", + "Safe Max (Erista)": "", + + "Voltages": "", + "RAM Voltage:": "", + "Display Voltage:": "", + "Temperatures": "", + "PLLX Temp:": "", + "AOTAG Temp:": "", + "BQ24193 Temp:": "", + "Normal": "", + "Warm": "", + "Hot": "", + "Overheat": "", + "Not Patched": "", + "Invalid": "", + "RAM Bandwidth": "", + "RAM BW (Peak):": "", + "RAM BW (All):": "", + "RAM BW (CPU):": "", + "RAM BW (GPU):": "", + "Hardware Info": "", + "Console Type:": "", + "Speedo:": "", + "DRAM Module: ": "", + "Software Info": "", + "KIP version:": "", + "sys-dock status:": "", + "SaltyNX status:": "", + "RR Display status:": "", + "Wafer Position:": "", + "IDDQ:": "", + "Module: ": "", + "Board": "", + "Display": "", + + "Developers": "", + "Contributors": "", + "Testers": "", + "Translators": "", + "Special Thanks": "", + + "X: %u Y: %u": "", + "%u.%u%u mV": "", + "Compiling with minimal features": "", +} diff --git a/Source/hoc-clk/overlay/lang/uk.json b/Source/hoc-clk/overlay/lang/uk.json index c0239f8a..7af7040a 100644 --- a/Source/hoc-clk/overlay/lang/uk.json +++ b/Source/hoc-clk/overlay/lang/uk.json @@ -1,52 +1,42 @@ { "Information": "Інформація", - "IDDQ:": "IDDQ:", - "Module: ": "Модуль:", - "sys-dock status:": "стан sys-dock:", - "SaltyNX status:": "Статус SaltyNX:", - "RR Display status:": "Статус дисплея RR:", - "Wafer Position:": "Позиція пластини:", - "Credits": "Кредити", - "Developers": "Розробники", - "Contributors": "Дописувачі", - "Testers": "Тестери", - "Special Thanks": "Особлива подяка", "Unknown": "Невідомий", "Installed": "встановлено", "Not Installed": "Не встановлено", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД", "Default": "За замовчуванням", "Do Not Override": "Не перевизначати", + "Do not override": "Не перевизначати", "Disabled": "Вимкнено", "Enabled": "Увімкнено", - " \\ue0e3 Reset": "\\ue0e3 Скидання", - "Display": "Дисплей", - "Application changed\\n\\n": "Додаток змінено\\n\\n", - "The running application changed\\n\\n": "Запущена програма змінена\\n\\n", - "while editing was going on.": "поки йшло редагування.", - "Board": "дошка", - "%u.%u%u mV": "%u.%u%u мВ", + "Enabled (Default)": "Увімкнено (за замовчуванням)", + "Enable": "Увімкнути", + "Fatal error": "Фатальна помилка", "Could not connect to hoc-clk sysmodule.\\n\\n": "Не вдалося підключитися до системного модуля hoc-clk.\\n\\n", "Please make sure everything is\\n\\n": "Переконайтеся, що все\\n\\n", "correctly installed and enabled.": "правильно встановлено та включено.", - "Fatal error": "Фатальна помилка", + + "Edit App Profile": "Редагувати профіль програми", + "Edit Global Profile": "Редагувати глобальний профіль", + "Temporary Overrides": "Тимчасові перевизначення", "Temporary Overrides ": "Тимчасові перевизначення", + "  Reset": " Скидання", + "Settings": "Налаштування", + "About": "про", + "Credits": "Кредити", + + "Application changed\\n\\n": "Додаток змінено\\n\\n", + "The running application changed\\n\\n": "Запущена програма змінена\\n\\n", + "while editing was going on.": "поки йшло редагування.", + "Sleep Mode": "Режим сну", - "Stock": "Запас", + "Stock": "Стандарт", "Dev OC": "Розробник OC", "Boost Mode": "Режим посилення", "Safe Max": "Безпечний макс", "Unsafe Max": "Небезпечний макс", "Absolute Max": "Абсолютний макс", - "Handheld Safe Max": "Портативний сейф Макс", - "Enable": "Увімкнути", - "Edit App Profile": "Редагувати профіль програми", - "Edit Global Profile": "Редагувати глобальний профіль", - "Temporary Overrides": "Тимчасові перевизначення", - "Settings": "Налаштування", - "About": "про", - "Compiling with minimal features": "Компіляція з мінімальними можливостями", + "Handheld Safe Max": "Портативний безпечний макс", + "General Settings": "Загальні налаштування", "Governor Settings": "Налаштування губернатора", "Safety Settings": "Налаштування безпеки", @@ -55,41 +45,64 @@ "CPU Settings": "Налаштування ЦП", "GPU Settings": "Налаштування GPU", "Display Settings": "Налаштування дисплея", + "Experimental Settings": "Експериментальні налаштування", "Experimental": "Експериментальний", + + " Settings marked in blue": "Налаштування, позначені синім", + "don't require a reboot to apply!": "не потребують перезавантаження!", + "You can also press  to show": "Також натисніть  для показу", + "information about each setting.": "інформацію про кожне налаштування.", + + " Experimental Settings are incomplete ": "Експериментальні налаштування неповні", + "and may not work correctly or at all!": "і можуть взагалі не працювати!", + "Here be dragons!": "Тут є дракони!", + + "RAM Voltage Display Mode": "Режим відображення напруги RAM", + "RAM Display Unit": "Одиниця відображення RAM", + "Polling Interval": "Інтервал опитування", + "GPU Scheduling Override Method": "Метод перевизначення планування GPU", + "GPU Scheduling Override": "Перевизначення планування GPU", + "GPU Boot Volt": "Напруга завантаження GPU", + "GPU Boot Voltage": "Напруга завантаження GPU", + "Memory Frequency Measurement Mode": "Режим вимірювання частоти пам'яті", + " Overriding the charge current": "Перевизначення струму заряду", "can be dangerous and may cause": "може бути небезпечним і може спричинити", "damage to your battery or charger!": "пошкодження акумулятора або зарядного пристрою!", "Charge Current Override": "Перевизначення струму заряду", - "RAM Voltage Display Mode": "Режим відображення напруги RAM", - "Polling Interval": "Інтервал опитування", + "Display Color Preset": "Кольоровий пресет дисплея", + "Basic": "Базовий", + "Saturated": "Насичений", + "Washed": "Блідий", + "Natural": "Природний", + "Vivid": "Яскравий", + "CPU Governor Minimum Frequency": "Мінімальна частота регулятора ЦП", + " Usage of unsafe display": "Використання небезпечних частот екрана", "refresh rates may cause stress": "частоти оновлення можуть викликати стрес", "or damage to your display! ": "або пошкодження дисплея!", "Proceed at your own risk!": "Продовжуйте на свій страх і ризик!", "Max Handheld Display": "Максимальний портативний дисплей", + "Max Handheld Display Hz": "Макс. Гц в портативному режимі", "Display Clock": "Відображення годинника", + " Adjust the display voltage": "Налаштуйте напругу дисплея", + "with caution to avoid damage": "обережно, щоб уникнути пошкоджень", + "to your display panel! ": "до панелі дисплея!", + "Display Voltage": "Напруга дисплея", + + "Thermal Throttle Limit": "Термічний дросельний ліміт", "Official Rating": "Офіційний рейтинг", "TDP Threshold": "Поріг TDP", "Power": "потужність", - "Thermal Throttle Limit": "Термічний дросельний ліміт", "HP Mode": "Режим HP", - "Default (Mariko)": "За замовчуванням (Маріко)", - "Default (Erista)": "За замовчуванням (Erista)", - "Rating": "Рейтинг", - "Safe Max (Mariko)": "Сейф Макс (Маріко)", - "Safe Max (Erista)": "Сейф Макс (Еріста)", + + "DVB Shift": "DVB зсув", + "SoC Max Volt": "Макс. напруга SoC", + "Step Mode": "Покроковий режим", "RAM VDD2 Voltage": "Напруга RAM VDD2", - "Voltage": "Напруга", "RAM VDDQ Voltage": "Напруга RAM VDDQ", + "Voltage": "Напруга", "RAM Frequency Editor": "Редактор частоти оперативної пам'яті", - "JEDEC.": "JEDEC.", - "High speedo needed!": "Потрібна висока швидкість!", - "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)", "Ram Max Clock": "Годинник Ram Max", "RAM Latency Editor": "Редактор затримки оперативної пам'яті", "RAM Timing Reductions": "Скорочення оперативної пам'яті", @@ -100,20 +113,30 @@ "t7 tWTR Fine Tune": "t7 tWTR Точне налаштування", "tWTR Fine Tune": "Точна настройка tWTR", "Memory Latencies": "Затримки пам'яті", - "Read Latency": "Прочитати затримку", + "Read Latency": "Затримка читання", "Write Latency": "Затримка запису", + "High speedo needed!": "Потрібна висока швидкість Speedo!", + "3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)", + "JEDEC.": "JEDEC.", + "CPU Boost Clock": "CPU Boost Clock", "CPU UV": "CPU UV", "CPU Unlock": "Розблокування ЦП", "CPU VMIN": "CPU VMIN", "CPU Max Voltage": "Максимальна напруга ЦП", "CPU Max Clock": "Максимальна частота ЦП", - "Extreme UV Table": "Екстремальний ультрафіолетовий стіл", + "Extreme UV Table": "Екстремальна UV таблиця", "CPU UV Table": "CPU UV Таблиця", "CPU Low UV": "CPU Low UV", "CPU High UV": "CPU High UV", "CPU Low VMIN": "CPU Low VMIN", "CPU High VMIN": "CPU High VMIN", + "No Undervolt": "Без андервольта", "SLT Table": "Таблиця SLT", "HiOPT Table": "Таблиця HiOPT", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "Максимальна напруга GPU", "GPU Voltage Offset": "Зсув напруги GPU", - "Do not override": "Не перевизначати", - "Enabled (Default)": "Увімкнено (за замовчуванням)", - "96.6% limit": "96,6% обмеження", - "99.7% limit": "Обмеження 99,7%.", - "GPU Scheduling Override": "Перевизначення планування GPU", - "Official Service": "Офіційний сервіс", "GPU DVFS Mode": "Режим GPU DVFS", "GPU DVFS Offset": "GPU DVFS Offset", "GPU Voltage Table": "Таблиця напруги GPU", "GPU Custom Table (mV)": "Спеціальна таблиця GPU (мВ)", + "Official Service": "Офіційний сервіс", + "96.6% limit": "96,6% обмеження", + "99.7% limit": "99,7% обмеження", + " Setting GPU Clocks past": "Встановлення тактових частот GPU вище", + "1228MHz without a proper undervolt": "1228 МГц без належного підвольту", + "can cause degradation or damage": "може спричинити деградацію або пошкодження", + "to your console!": "вашій консолі!", "1075MHz without UV, 1152MHz on SLT": "1075 МГц без УФ, 1152 МГц на SLT", "or 1228MHz on HiOPT can cause ": "або 1228 МГц на HiOPT може спричинити", - "permanent damage to your Switch!": "незворотне пошкодження вашого комутатора!", + "permanent damage to your Switch!": "незворотне пошкодження вашого Switch!", "921MHz without UV and 960MHz on": "921 МГц без УФ і 960 МГц увімкнено", - "SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити" + "SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити", + + "Default (Mariko)": "За замовчуванням (Маріко)", + "Default (Erista)": "За замовчуванням (Erista)", + "Rating": "Рейтинг", + "Safe Max (Mariko)": "Сейф Макс (Маріко)", + "Safe Max (Erista)": "Сейф Макс (Еріста)", + + "Voltages": "Напруги", + "RAM Voltage:": "Напруга RAM:", + "Display Voltage:": "Напруга дисплея:", + "Temperatures": "Температури", + "PLLX Temp:": "PLLX Темп.:", + "AOTAG Temp:": "AOTAG Темп.:", + "BQ24193 Temp:": "BQ24193 Темп.:", + "Normal": "Нормально", + "Warm": "Тепло", + "Hot": "Гаряче", + "Overheat": "Перегрів", + "Not Patched": "Не виправлено", + "Invalid": "Недійсний", + "RAM Bandwidth": "Пропускна здатність RAM", + "RAM BW (Peak):": "BW RAM (Пік):", + "RAM BW (All):": "BW RAM (Усі):", + "RAM BW (CPU):": "BW RAM (CPU):", + "RAM BW (GPU):": "BW RAM (GPU):", + "Hardware Info": "Інфо про апаратне забезпечення", + "Console Type:": "Тип консолі:", + "Speedo:": "Speedo:", + "DRAM Module: ": "Модуль DRAM: ", + "Software Info": "Інфо про програмне забезпечення", + "KIP version:": "Версія KIP:", + "sys-dock status:": "стан sys-dock:", + "SaltyNX status:": "Статус SaltyNX:", + "RR Display status:": "Статус дисплея RR:", + "Wafer Position:": "Позиція пластини:", + "IDDQ:": "IDDQ:", + "Module: ": "Модуль:", + "Board": "дошка", + "Display": "Дисплей", + + "Developers": "Розробники", + "Contributors": "Дописувачі", + "Testers": "Тестери", + "Translators": "Перекладачі", + "Special Thanks": "Особлива подяка", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u мВ", + "Compiling with minimal features": "Компіляція з мінімальними можливостями", + "THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД" } diff --git a/Source/hoc-clk/overlay/lang/zh-cn.json b/Source/hoc-clk/overlay/lang/zh-cn.json index 53989929..a49c4d7a 100644 --- a/Source/hoc-clk/overlay/lang/zh-cn.json +++ b/Source/hoc-clk/overlay/lang/zh-cn.json @@ -1,37 +1,33 @@ { "Information": "信息", - "IDDQ:": "IDDQ:", - "Module: ": "模块: ", - "sys-dock status:": "sys-dock 状态:", - "SaltyNX status:": "SaltyNX 状态:", - "RR Display status:": "RR 显示状态:", - "Wafer Position:": "晶圆位置:", - "Credits": "致谢", - "Developers": "开发者", - "Contributors": "贡献者", - "Testers": "测试者", - "Special Thanks": "特别感谢", "Unknown": "未知", "Installed": "已安装", "Not Installed": "未安装", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "啤酒软件许可协议", "Default": "默认", "Do Not Override": "不修改", + "Do not override": "不修改", "Disabled": "已禁用", "Enabled": "已启用", - " \\ue0e3 Reset": " \\ue0e3 重置", - "Display": "显示", - "Application changed\\n\\n": "应用已变更\\n\\n", - "The running application changed\\n\\n": "正在运行的应用已变更\\n\\n", - "while editing was going on.": "编辑过程中发生变更。", - "Board": "主板", - "%u.%u%u mV": "%u.%u%u mV", + "Enabled (Default)": "已启用 (默认)", + "Enable": "启用", + "Fatal error": "致命错误", "Could not connect to hoc-clk sysmodule.\\n\\n": "无法连接到 hoc-clk 系统模块。\\n\\n", "Please make sure everything is\\n\\n": "请确保所有内容均已\\n\\n", "correctly installed and enabled.": "正确安装并启用。", - "Fatal error": "致命错误", + + "Edit App Profile": "编辑应用配置", + "Edit Global Profile": "编辑全局配置", + "Temporary Overrides": "临时配置", "Temporary Overrides ": "临时配置 ", + "  Reset": " 重置", + "Settings": "设置", + "About": "关于", + "Credits": "致谢", + + "Application changed\\n\\n": "应用已变更\\n\\n", + "The running application changed\\n\\n": "正在运行的应用已变更\\n\\n", + "while editing was going on.": "编辑过程中发生变更。", + "Sleep Mode": "睡眠模式", "Stock": "原厂默认", "Dev OC": "开发者超频", @@ -40,13 +36,7 @@ "Unsafe Max": "危险最大值", "Absolute Max": "绝对最大值", "Handheld Safe Max": "掌机模式安全最大值", - "Enable": "启用", - "Edit App Profile": "编辑应用配置", - "Edit Global Profile": "编辑全局配置", - "Temporary Overrides": "临时配置", - "Settings": "设置", - "About": "关于", - "Compiling with minimal features": "以最小功能编译", + "General Settings": "通用设置", "Governor Settings": "调频器设置", "Safety Settings": "安全设置", @@ -55,61 +45,69 @@ "CPU Settings": "CPU 设置", "GPU Settings": "GPU 设置", "Display Settings": "显示设置", + "Experimental Settings": "实验性设置", "Experimental": "实验性功能", + + " Settings marked in blue": "蓝色标注的设置", + "don't require a reboot to apply!": "无需重启即可应用!", + "You can also press  to show": "也可按  查看", + "information about each setting.": "每项设置的说明。", + + " Experimental Settings are incomplete ": "实验性设置尚未完成", + "and may not work correctly or at all!": "且可能无法正常工作!", + "Here be dragons!": "此处有险!", + + "RAM Voltage Display Mode": "内存电压显示模式", + "RAM Display Unit": "内存显示单位", + "Polling Interval": "刷新间隔", + "GPU Scheduling Override Method": "GPU 调度覆盖方式", + "GPU Scheduling Override": "GPU 调度修改", + "GPU Boot Volt": "GPU 启动电压", + "GPU Boot Voltage": "GPU 启动电压", + "Memory Frequency Measurement Mode": "内存频率测量模式", + " Overriding the charge current": "修改充电电流", "can be dangerous and may cause": "存在风险,可能导致", "damage to your battery or charger!": "电池或充电器损坏!", "Charge Current Override": "充电电流修改", - "RAM Voltage Display Mode": "内存电压显示模式", - "Polling Interval": "刷新间隔", + "Display Color Preset": "显示颜色预设", + "Basic": "基础", + "Saturated": "饱和", + "Washed": "淡色", + "Natural": "自然", + "Vivid": "鲜艳", + "CPU Governor Minimum Frequency": "CPU 调频器最低频率", - "\uE150 Usage of unsafe display": "\uE150 不安全的显示屏", + " Usage of unsafe display": "不安全的显示屏", "refresh rates may cause stress": "刷新率可能会对", "or damage to your display! ": "显示屏造成压力或损坏! ", "Proceed at your own risk!": "操作风险自负!", "Max Handheld Display": "掌机模式最大显示率", + "Max Handheld Display Hz": "掌机最大显示率 Hz", "Display Clock": "显示时钟", + " Adjust the display voltage": "调整显示电压", + "with caution to avoid damage": "请谨慎以避免损坏", + "to your display panel! ": "显示屏面板!", + "Display Voltage": "显示电压", + + "Thermal Throttle Limit": "温控设置", "Official Rating": "官方额定值", "TDP Threshold": "TDP 阈值", "Power": "电源", - "Thermal Throttle Limit": "温控设置", "HP Mode": "高性能模式", - "Default (Mariko)": "默认 (Mariko)", - "Default (Erista)": "默认 (Erista)", - "Rating": "额定值", - "Safe Max (Mariko)": "安全最大值 (Mariko)", - "Safe Max (Erista)": "安全最大值 (Erista)", + + "DVB Shift": "DVB 偏移", + "SoC Max Volt": "SoC 最大电压", + "Step Mode": "步进模式", "RAM VDD2 Voltage": "内存 VDD2 电压", - "Voltage": "电压", "RAM VDDQ Voltage": "内存 VDDQ 电压", + "Voltage": "电压", "RAM Frequency Editor": "内存频率编辑器", - "JEDEC.": "JEDEC 标准。", - "High speedo needed!": "需要高 Speedo 配置!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)", "Ram Max Clock": "内存最大频率", "RAM Latency Editor": "内存延迟编辑器", "RAM Timing Reductions": "内存时序优化", "Memory Timings": "内存时序", - "Memory": "内存", - "mem": "内存", - "Governor": "调频器", "Advanced": "高级", - "Docked": "底座模式", - "Handheld": "掌机模式", - "Charging": "充电中", - "USB Charger": "USB 充电器", - "PD Charger": "PD 充电器", - "Handheld TDP": "掌机模式功耗限制", - "Thermal Throttle": "温度控制", - "Uncapped Clocks": "解除频率上限", - "Soc DVB Shift": "SoC DVB偏移", - "Overwrite Boost Mode": "接管官方CPU调度", - "Display Refresh Rate Changing": "显示刷新率变更", "t6 tRTW Fine Tune": "t6 tRTW 微调", "tRTW Fine Tune": "tRTW 微调", "t7 tWTR Fine Tune": "t7 tWTR 微调", @@ -117,6 +115,15 @@ "Memory Latencies": "内存延迟", "Read Latency": "读取延迟", "Write Latency": "写入延迟", + "High speedo needed!": "需要高 Speedo 配置!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)", + "JEDEC.": "JEDEC 标准。", + "CPU Boost Clock": "CPU 超频频率", "CPU UV": "CPU 降压", "CPU Unlock": "CPU 解锁", @@ -129,6 +136,7 @@ "CPU High UV": "CPU 高压降压", "CPU Low VMIN": "CPU 低压最低电压", "CPU High VMIN": "CPU 高压最低电压", + "No Undervolt": "不降压", "SLT Table": "SLT 表", "HiOPT Table": "HiOPT 表", @@ -138,20 +146,70 @@ "GPU VMIN": "GPU 最低电压", "GPU Maximum Voltage": "GPU 最大电压", "GPU Voltage Offset": "GPU 电压偏移", - "Do not override": "不修改", - "Enabled (Default)": "已启用 (默认)", - "96.6% limit": "96.6% 限制", - "99.7% limit": "99.7% 限制", - "GPU Scheduling Override": "GPU 调度修改", - "Official Service": "官方服务", "GPU DVFS Mode": "GPU DVFS 模式", "GPU DVFS Offset": "GPU DVFS 偏移", "GPU Voltage Table": "GPU 电压表", "GPU Custom Table (mV)": "GPU 自定义表 (mV)", - "\uE150 Setting GPU Clocks past": "\uE150 将 GPU 频率设置超过", + "Official Service": "官方服务", + "96.6% limit": "96.6% 限制", + "99.7% limit": "99.7% 限制", + " Setting GPU Clocks past": " 将 GPU 频率设置超过", + "1228MHz without a proper undervolt": "没有适当降压的 1228MHz", + "can cause degradation or damage": "可能导致损耗或损坏", + "to your console!": "您的主机!", "1075MHz without UV, 1152MHz on SLT": "1075MHz 无降压,SLT 表下 1152MHz", "or 1228MHz on HiOPT can cause ": "或 HiOPT 表下 1228MHz 可能导致 ", "permanent damage to your Switch!": "Switch 永久损坏!", "921MHz without UV and 960MHz on": "921MHz 无降压,SLT/HiOPT 表下 960MHz", - "SLT or HiOPT can cause ": "可能导致 " + "SLT or HiOPT can cause ": "可能导致 ", + + "Default (Mariko)": "默认 (Mariko)", + "Default (Erista)": "默认 (Erista)", + "Rating": "额定值", + "Safe Max (Mariko)": "安全最大值 (Mariko)", + "Safe Max (Erista)": "安全最大值 (Erista)", + + "Voltages": "电压", + "RAM Voltage:": "内存电压:", + "Display Voltage:": "显示电压:", + "Temperatures": "温度", + "PLLX Temp:": "PLLX 温度:", + "AOTAG Temp:": "AOTAG 温度:", + "BQ24193 Temp:": "BQ24193 温度:", + "Normal": "正常", + "Warm": "温热", + "Hot": "过热", + "Overheat": "严重过热", + "Not Patched": "未修补", + "Invalid": "无效", + "RAM Bandwidth": "内存带宽", + "RAM BW (Peak):": "RAM带宽(峰值):", + "RAM BW (All):": "RAM带宽(全部):", + "RAM BW (CPU):": "RAM带宽(CPU):", + "RAM BW (GPU):": "RAM带宽(GPU):", + "Hardware Info": "硬件信息", + "Console Type:": "主机类型:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 模块: ", + "Software Info": "软件信息", + "KIP version:": "KIP 版本:", + "sys-dock status:": "sys-dock 状态:", + "SaltyNX status:": "SaltyNX 状态:", + "RR Display status:": "RR 显示状态:", + "Wafer Position:": "晶圆位置:", + "IDDQ:": "IDDQ:", + "Module: ": "模块: ", + "Board": "主板", + "Display": "显示", + + "Developers": "开发者", + "Contributors": "贡献者", + "Testers": "测试者", + "Translators": "翻译", + "Special Thanks": "特别感谢", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "以最小功能编译", + "THE BEER-WARE LICENSE": "啤酒软件许可协议" } diff --git a/Source/hoc-clk/overlay/lang/zh-tw.json b/Source/hoc-clk/overlay/lang/zh-tw.json index 5a8a5dfa..75765af9 100644 --- a/Source/hoc-clk/overlay/lang/zh-tw.json +++ b/Source/hoc-clk/overlay/lang/zh-tw.json @@ -1,52 +1,42 @@ { "Information": "資訊", - "IDDQ:": "國際電話號碼:", - "Module: ": "模組:", - "sys-dock status:": "系統塢站狀態:", - "SaltyNX status:": "SaltyNX 狀態:", - "RR Display status:": "RR 顯示狀態:", - "Wafer Position:": "晶圓位置:", - "Credits": "製作人員", - "Developers": "開發商", - "Contributors": "貢獻者", - "Testers": "測試人員", - "Special Thanks": "特別感謝", "Unknown": "未知", "Installed": "已安裝", "Not Installed": "未安裝", - "X: %u Y: %u": "X: %u Y: %u", - "THE BEER-WARE LICENSE": "啤酒製品許可證", "Default": "預設", "Do Not Override": "不要覆蓋", - "Disabled": "殘障人士", - "Enabled": "啟用", - " \\ue0e3 Reset": "\\ue0e3 重設", - "Display": "顯示", + "Do not override": "不要覆蓋", + "Disabled": "已停用", + "Enabled": "已啟用", + "Enabled (Default)": "已啟用(預設)", + "Enable": "啟用", + "Fatal error": "致命錯誤", + "Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。\\n\\n", + "Please make sure everything is\\n\\n": "請確保一切正常\\n\\n", + "correctly installed and enabled.": "正確安裝並啟用。", + + "Edit App Profile": "編輯應用程式設定檔", + "Edit Global Profile": "編輯全域設定檔", + "Temporary Overrides": "臨時覆蓋", + "Temporary Overrides ": "臨時覆蓋", + "  Reset": " 重設", + "Settings": "設定", + "About": "關於", + "Credits": "製作人員", + "Application changed\\n\\n": "應用程式已更改\\n\\n", "The running application changed\\n\\n": "正在運行的應用程式已更改\\n\\n", "while editing was going on.": "當編輯正在進行時。", - "Board": "董事會", - "%u.%u%u mV": "%u.%u%u mV", - "Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。 \\n\\n", - "Please make sure everything is\\n\\n": "請確保一切正常\\n\\n", - "correctly installed and enabled.": "正確安裝並啟用。", - "Fatal error": "致命錯誤", - "Temporary Overrides ": "臨時覆蓋", + "Sleep Mode": "睡眠模式", - "Stock": "庫存", + "Stock": "原廠預設", "Dev OC": "開發OC", "Boost Mode": "升壓模式", "Safe Max": "安全最大值", "Unsafe Max": "不安全最大值", "Absolute Max": "絕對最大值", - "Handheld Safe Max": "手持式安全最大", - "Enable": "啟用", - "Edit App Profile": "編輯應用程式設定檔", - "Edit Global Profile": "編輯全域設定檔", - "Temporary Overrides": "臨時覆蓋", - "Settings": "設定", - "About": "關於", - "Compiling with minimal features": "使用最少的功能進行編譯", + "Handheld Safe Max": "手持式安全最大值", + "General Settings": "常規設定", "Governor Settings": "調速器設定", "Safety Settings": "安全設定", @@ -55,42 +45,65 @@ "CPU Settings": "中央處理器設定", "GPU Settings": "GPU設定", "Display Settings": "顯示設定", + "Experimental Settings": "實驗性設定", "Experimental": "實驗性的", + + " Settings marked in blue": "藍色標示的設定", + "don't require a reboot to apply!": "無需重開機即可套用!", + "You can also press  to show": "也可按  顯示", + "information about each setting.": "每項設定的說明。", + + " Experimental Settings are incomplete ": "實驗性設定尚未完成", + "and may not work correctly or at all!": "且可能無法正常運作!", + "Here be dragons!": "此處有危險!", + + "RAM Voltage Display Mode": "RAM電壓顯示模式", + "RAM Display Unit": "記憶體顯示單位", + "Polling Interval": "輪詢間隔", + "GPU Scheduling Override Method": "GPU調度覆蓋方法", + "GPU Scheduling Override": "GPU 調度覆蓋", + "GPU Boot Volt": "GPU 啟動電壓", + "GPU Boot Voltage": "GPU 啟動電壓", + "Memory Frequency Measurement Mode": "記憶體頻率測量模式", + " Overriding the charge current": "覆蓋充電電流", "can be dangerous and may cause": "可能很危險並可能導致", "damage to your battery or charger!": "損壞電池或充電器!", "Charge Current Override": "充電電流覆蓋", - "RAM Voltage Display Mode": "RAM電壓顯示模式", - "Polling Interval": "輪詢間隔", + "Display Color Preset": "顯示顏色預設", + "Basic": "基本", + "Saturated": "飽和", + "Washed": "淡色", + "Natural": "自然", + "Vivid": "鮮艷", + "CPU Governor Minimum Frequency": "CPU調速器最低頻率", + " Usage of unsafe display": "不安全的顯示率", "refresh rates may cause stress": "刷新率可能會造成壓力", "or damage to your display! ": "或損壞您的顯示器!", "Proceed at your own risk!": "請自行承擔風險!", "Max Handheld Display": "最大手持顯示器", + "Max Handheld Display Hz": "最大手持顯示率 Hz", "Display Clock": "顯示時鐘", + " Adjust the display voltage": "調整顯示電壓", + "with caution to avoid damage": "請謹慎操作以避免損壞", + "to your display panel! ": "顯示面板!", + "Display Voltage": "顯示電壓", + + "Thermal Throttle Limit": "熱油門限制", "Official Rating": "官方評級", "TDP Threshold": "TDP閾值", "Power": "電源", - "Thermal Throttle Limit": "熱油門限制", - "HP Mode": "惠普模式", - "Default (Mariko)": "預設(真理子)", - "Default (Erista)": "預設(埃里斯塔)", - "Rating": "評級", - "Safe Max (Mariko)": "安全最大(真理子)", - "Safe Max (Erista)": "安全最大(埃里斯塔)", + "HP Mode": "高效能模式", + + "DVB Shift": "DVB 偏移", + "SoC Max Volt": "SoC 最大電壓", + "Step Mode": "步進模式", "RAM VDD2 Voltage": "RAM VDD2 電壓", - "Voltage": "電壓", "RAM VDDQ Voltage": "RAM VDDQ 電壓", + "Voltage": "電壓", "RAM Frequency Editor": "RAM頻率編輯器", - "JEDEC.": "JEDEC。", - "High speedo needed!": "需要高速!", - "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)", - "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)", - "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)", - "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)", - "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)", - "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)", - "Ram Max Clock": "記憶體最大時鐘", + "Ram Max Clock": "記憶體最大時脈", "RAM Latency Editor": "RAM 延遲編輯器", "RAM Timing Reductions": "RAM 時序減少", "Memory Timings": "記憶體時序", @@ -102,18 +115,28 @@ "Memory Latencies": "記憶體延遲", "Read Latency": "讀取延遲", "Write Latency": "寫入延遲", - "CPU Boost Clock": "CPU 升壓時鐘", - "CPU UV": "中央處理器紫外線", + "High speedo needed!": "需要高 Speedo 值!", + "3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)", + "3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)", + "3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)", + "3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)", + "3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)", + "3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)", + "JEDEC.": "JEDEC。", + + "CPU Boost Clock": "CPU 升壓時脈", + "CPU UV": "CPU 降壓", "CPU Unlock": "CPU解鎖", - "CPU VMIN": "CPU最低電壓", + "CPU VMIN": "CPU 最低電壓", "CPU Max Voltage": "CPU最大電壓", "CPU Max Clock": "CPU 最大時脈", - "Extreme UV Table": "極端紫外線表", - "CPU UV Table": "CPU UV表", - "CPU Low UV": "CPU低紫外線", - "CPU High UV": "CPU高紫外線", + "Extreme UV Table": "極限降壓表", + "CPU UV Table": "CPU 降壓表", + "CPU Low UV": "CPU 低壓降壓", + "CPU High UV": "CPU 高壓降壓", "CPU Low VMIN": "CPU 低 VMIN", "CPU High VMIN": "CPU 高 VMIN", + "No Undervolt": "無欠壓", "SLT Table": "SLT表", "HiOPT Table": "HiOPT表", @@ -123,19 +146,70 @@ "GPU VMIN": "GPU VMIN", "GPU Maximum Voltage": "GPU最大電壓", "GPU Voltage Offset": "GPU電壓偏移", - "Do not override": "不要覆蓋", - "Enabled (Default)": "啟用(預設)", - "96.6% limit": "96.6%限制", - "99.7% limit": "99.7%限制", - "GPU Scheduling Override": "GPU 調度覆蓋", - "Official Service": "官方服務", "GPU DVFS Mode": "GPU DVFS 模式", "GPU DVFS Offset": "GPU DVFS 偏移", "GPU Voltage Table": "GPU電壓表", "GPU Custom Table (mV)": "GPU 自訂表 (mV)", + "Official Service": "官方服務", + "96.6% limit": "96.6%限制", + "99.7% limit": "99.7%限制", + " Setting GPU Clocks past": "將 GPU 頻率設定超過", + "1228MHz without a proper undervolt": "1228MHz 未適當降壓", + "can cause degradation or damage": "可能導致劣化或損壞", + "to your console!": "您的主機!", "1075MHz without UV, 1152MHz on SLT": "無 UV 時為 1075MHz,SLT 時為 1152MHz", "or 1228MHz on HiOPT can cause ": "或 HiOPT 上的 1228MHz 可能會導致", "permanent damage to your Switch!": "對您的 Switch 造成永久性損壞!", "921MHz without UV and 960MHz on": "無 UV 時為 921MHz,開啟時為 960MHz", - "SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致" + "SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致", + + "Default (Mariko)": "預設 (Mariko)", + "Default (Erista)": "預設 (Erista)", + "Rating": "評級", + "Safe Max (Mariko)": "安全最大值 (Mariko)", + "Safe Max (Erista)": "安全最大值 (Erista)", + + "Voltages": "電壓", + "RAM Voltage:": "記憶體電壓:", + "Display Voltage:": "顯示電壓:", + "Temperatures": "溫度", + "PLLX Temp:": "PLLX 溫度:", + "AOTAG Temp:": "AOTAG 溫度:", + "BQ24193 Temp:": "BQ24193 溫度:", + "Normal": "正常", + "Warm": "溫熱", + "Hot": "過熱", + "Overheat": "嚴重過熱", + "Not Patched": "未修補", + "Invalid": "無效", + "RAM Bandwidth": "記憶體頻寬", + "RAM BW (Peak):": "RAM頻寬(峰值):", + "RAM BW (All):": "RAM頻寬(全部):", + "RAM BW (CPU):": "RAM頻寬(CPU):", + "RAM BW (GPU):": "RAM頻寬(GPU):", + "Hardware Info": "硬體資訊", + "Console Type:": "主機類型:", + "Speedo:": "Speedo:", + "DRAM Module: ": "DRAM 模組:", + "Software Info": "軟體資訊", + "KIP version:": "KIP 版本:", + "sys-dock status:": "系統塢站狀態:", + "SaltyNX status:": "SaltyNX 狀態:", + "RR Display status:": "RR 顯示狀態:", + "Wafer Position:": "晶圓位置:", + "IDDQ:": "IDDQ:", + "Module: ": "模組:", + "Board": "主板", + "Display": "顯示", + + "Developers": "開發商", + "Contributors": "貢獻者", + "Testers": "測試人員", + "Translators": "翻譯", + "Special Thanks": "特別感謝", + + "X: %u Y: %u": "X: %u Y: %u", + "%u.%u%u mV": "%u.%u%u mV", + "Compiling with minimal features": "使用最少的功能進行編譯", + "THE BEER-WARE LICENSE": "啤酒製品許可證" } diff --git a/Source/hoc-clk/overlay/src/ipc.h b/Source/hoc-clk/overlay/src/ipc.h index 04b4c56f..7f514aaa 100644 --- a/Source/hoc-clk/overlay/src/ipc.h +++ b/Source/hoc-clk/overlay/src/ipc.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,17 +24,16 @@ * -------------------------------------------------------------------------- */ - #pragma once #if defined(__cplusplus) -#include "cpp_util.hpp" + #include "cpp_util.hpp" -extern "C" -{ +extern "C" { #endif #include + #include #if defined(__cplusplus) diff --git a/Source/hoc-clk/overlay/src/main.cpp b/Source/hoc-clk/overlay/src/main.cpp index 579ae30e..80b311bd 100644 --- a/Source/hoc-clk/overlay/src/main.cpp +++ b/Source/hoc-clk/overlay/src/main.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,72 +24,62 @@ * -------------------------------------------------------------------------- */ - #define TESLA_INIT_IMPL #include + #include "ui/gui/fatal_gui.h" #include "ui/gui/main_gui.h" -class AppOverlay : public tsl::Overlay -{ +class AppOverlay : public tsl::Overlay { public: - AppOverlay() {} - ~AppOverlay() {} + AppOverlay() { + } + ~AppOverlay() { + } - //virtual void initServices() override { - // rgltrInitialize(); - //} + // virtual void initServices() override { + // rgltrInitialize(); + // } - virtual void exitServices() override { - hocclkIpcExit(); + virtual void exitServices() override { + hocclkIpcExit(); + } + + virtual std::unique_ptr loadInitialGui() override { + uint32_t apiVersion; + smInitialize(); + + tsl::hlp::ScopeGuard smGuard([] { smExit(); }); + + if (!hocclkIpcRunning()) { + return initially("hoc-clk is not running.\n\n" + "\n" + "Please make sure it is correctly\n\n" + "installed and enabled.", + ""); } - virtual std::unique_ptr loadInitialGui() override - { - uint32_t apiVersion; - smInitialize(); - - tsl::hlp::ScopeGuard smGuard([] { smExit(); }); - - if(!hocclkIpcRunning()) - { - return initially( - "hoc-clk is not running.\n\n" - "\n" - "Please make sure it is correctly\n\n" - "installed and enabled.", - "" - ); - } - - if(R_FAILED(hocclkIpcInitialize()) || R_FAILED(hocclkIpcGetAPIVersion(&apiVersion))) - { - return initially( - "Could not connect to hoc-clk.\n\n" - "\n" - "Please make sure it is correctly\n\n" - "installed and enabled.", - "" - ); - } - - if(HOCCLK_IPC_API_VERSION != apiVersion) - { - return initially( - "Overlay not compatible with\n\n" - "the running hoc-clk version.\n\n" - "\n" - "Please make sure everything is\n\n" - "installed and up to date.", - "" - ); - } - - return initially(); + if (R_FAILED(hocclkIpcInitialize()) || R_FAILED(hocclkIpcGetAPIVersion(&apiVersion))) { + return initially("Could not connect to hoc-clk.\n\n" + "\n" + "Please make sure it is correctly\n\n" + "installed and enabled.", + ""); } + + if (HOCCLK_IPC_API_VERSION != apiVersion) { + return initially("Overlay not compatible with\n\n" + "the running hoc-clk version.\n\n" + "\n" + "Please make sure everything is\n\n" + "installed and up to date.", + ""); + } + + return initially(); + } }; -int main(int argc, char **argv) -{ +int main(int argc, char **argv) { return tsl::loop(argc, argv); } diff --git a/Source/hoc-clk/overlay/src/ui/elements/base_frame.h b/Source/hoc-clk/overlay/src/ui/elements/base_frame.h index 58f6025f..be36ccef 100644 --- a/Source/hoc-clk/overlay/src/ui/elements/base_frame.h +++ b/Source/hoc-clk/overlay/src/ui/elements/base_frame.h @@ -28,20 +28,21 @@ #pragma once #include -#include "../gui/base_gui.h" + +class BaseGui; + +static constexpr u16 HOC_HEADER_HEIGHT = 287; +// Bottom edge of the drawn box: 106 + TOP_Y_OFFSET(15) + 156 = 277 +static constexpr u16 HOC_BOX_BOTTOM = 277; class BaseFrame : public tsl::elm::HeaderOverlayFrame { public: - BaseFrame(BaseGui* gui) : tsl::elm::HeaderOverlayFrame(234) { + BaseFrame(BaseGui* gui, u16 headerHeight = HOC_HEADER_HEIGHT) : tsl::elm::HeaderOverlayFrame(headerHeight) { this->gui = gui; } - void draw(tsl::gfx::Renderer* renderer) override - { - tsl::elm::HeaderOverlayFrame::draw(renderer); - this->gui->preDraw(renderer); - } + void draw(tsl::gfx::Renderer* renderer) override; protected: BaseGui* gui; diff --git a/Source/hoc-clk/overlay/src/ui/format.h b/Source/hoc-clk/overlay/src/ui/format.h index 3dc15e25..f8900b06 100644 --- a/Source/hoc-clk/overlay/src/ui/format.h +++ b/Source/hoc-clk/overlay/src/ui/format.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,20 +24,18 @@ * -------------------------------------------------------------------------- */ - #pragma once +#include #include #include -#include + #include #define FREQ_DEFAULT_TEXT "Do not override" -static inline std::string formatListFreqMHz(std::uint32_t mhz) -{ - if(mhz == 0) - { +static inline std::string formatListFreqMHz(std::uint32_t mhz) { + if (mhz == 0) { return FREQ_DEFAULT_TEXT; } @@ -45,17 +43,17 @@ static inline std::string formatListFreqMHz(std::uint32_t mhz) return std::string(buf, snprintf(buf, sizeof(buf), "%u MHz", mhz)); } -static inline std::string formatListFreqHz(uint32_t hz) { return formatListFreqMHz(hz / 1000000); } +static inline std::string formatListFreqHz(uint32_t hz) { + return formatListFreqMHz(hz / 1000000); +} -static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) -{ - if(mhz == 0) +static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) { + if (mhz == 0) return FREQ_DEFAULT_TEXT; uint32_t mts = mhz * 2; char buf[24]; - switch(unit) - { + switch (unit) { case RamDisplayUnit_MHz: snprintf(buf, sizeof(buf), "%u MHz", mhz); break; @@ -70,18 +68,15 @@ static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) return buf; } -static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit) -{ +static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit) { return formatListFreqMem(hz / 1000000, unit); } -static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit) -{ +static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit) { uint32_t mhz = khz / 1000; uint32_t mts = khz / 500; char buf[32]; - switch(unit) - { + switch (unit) { case RamDisplayUnit_MHz: snprintf(buf, sizeof(buf), "%u MHz", mhz); break; diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 3ce4f1d0..d62fb4d9 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -41,11 +41,11 @@ tsl::elm::ListItem* ramBWItemMax = NULL; tsl::elm::ListItem* bqtempitem = NULL; tsl::elm::ListItem* aotagTempItem = NULL; tsl::elm::ListItem* cTypeItem = NULL; +tsl::elm::ListItem* creditsItem = NULL; -ImageElement* CatImage = NULL; -HideableCategoryHeader* CatHeader = NULL; -HideableCustomDrawer* CatSpacer = NULL; -int lightosClickCount = 0; +#define R_ARROW "\u2192" + +class CreditsSubMenu; AboutGui::AboutGui() { @@ -166,156 +166,19 @@ void AboutGui::listUI() this->listElement->addItem(saltyNXStatusItem); this->listElement->addItem( - new tsl::elm::CategoryHeader("Credits") + new tsl::elm::CategoryHeader("General Info") ); - this->listElement->addItem( - new tsl::elm::CategoryHeader("Developers") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Souldbminer") - ); - - // Create special clickable item for Lightos - auto lightosItem = new tsl::elm::ListItem("Lightos_"); - lightosItem->setClickListener([this](u64 keys) -> bool { + creditsItem = new tsl::elm::ListItem("Credits"); + creditsItem->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { - lightosClickCount++; - if (lightosClickCount >= 10) { - if (CatImage != NULL) CatImage->setVisible(true); - if (CatHeader != NULL) CatHeader->setVisible(true); - if (CatSpacer != NULL) CatSpacer->setVisible(true); - } + tsl::changeTo(); return true; } return false; }); - this->listElement->addItem(lightosItem); - - // ---- Contributors ---- - this->listElement->addItem( - new tsl::elm::CategoryHeader("Contributors") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Dom") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Blaise25") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("tetetete-ctrl") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("B3711") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("TDRR") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("MasaGratoR") - ); - - // ---- Testers ---- - this->listElement->addItem( - new tsl::elm::CategoryHeader("Testers") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Samybigio2011") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("arcdelta") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Miki1305") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Happy") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Winnerboi77") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Blaise25") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("WE1ZARD") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Alvise") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("agjeococh") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Xenshen") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("Frost") - ); - - // ---- Special Thanks ---- - this->listElement->addItem( - new tsl::elm::CategoryHeader("Special Thanks") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("SciresM - Atmosphere CFW") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("KazushiMe - Switch OC Suite") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("hanai3Bi - Switch OC Suite & EOS") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("NaGaa95 - L4T-OC-Kernel") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("RetroNX - sys-clk") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("ppkantorski - Ultrahand") - ); - - this->listElement->addItem( - new tsl::elm::ListItem("CtCaer - Hekate, L4T and Proper Timings") - ); - - // Create cat elements but hide them initially - CatHeader = new HideableCategoryHeader("Cat"); - CatHeader->setVisible(false); - this->listElement->addItem(CatHeader); - - CatImage = new ImageElement(CAT_DATA, CAT_WIDTH, CAT_HEIGHT); - CatImage->setVisible(false); - this->listElement->addItem(CatImage); - - CatSpacer = new HideableCustomDrawer(75); - CatSpacer->setVisible(false); - this->listElement->addItem(CatSpacer); + creditsItem->setValue(R_ARROW); + this->listElement->addItem(creditsItem); } std::string AboutGui::formatRamModule() { @@ -446,5 +309,158 @@ void AboutGui::refresh() bqtempitem->setValue(strings[10]); cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true)); - } + +class CreditsSubMenu : public AboutGui { + public: + CreditsSubMenu() { } + + protected: + ImageElement* CatImage = NULL; + HideableCategoryHeader* CatHeader = NULL; + HideableCustomDrawer* CatSpacer = NULL; + int lightosClickCount = 0; + + void listUI() override { + this->listElement->addItem( + new tsl::elm::CategoryHeader("Developers") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Souldbminer") + ); + + // Create special clickable item for Lightos + auto lightosItem = new tsl::elm::ListItem("Lightos_"); + lightosItem->setClickListener([this](u64 keys) -> bool { + if (keys & HidNpadButton_A) { + lightosClickCount++; + if (lightosClickCount >= 10) { + if (CatImage != NULL) CatImage->setVisible(true); + if (CatHeader != NULL) CatHeader->setVisible(true); + if (CatSpacer != NULL) CatSpacer->setVisible(true); + } + return true; + } + return false; + }); + this->listElement->addItem(lightosItem); + + // ---- Contributors ---- + this->listElement->addItem( + new tsl::elm::CategoryHeader("Contributors") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Dom") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Blaise25") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("tetetete-ctrl") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("B3711") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("TDRR") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("MasaGratoR") + ); + + // ---- Testers ---- + this->listElement->addItem( + new tsl::elm::CategoryHeader("Testers") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Samybigio2011") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("arcdelta") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Miki1305") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Happy") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Winnerboi77") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Blaise25") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("WE1ZARD") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Alvise") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("agjeococh") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("Frost") + ); + + // ---- Special Thanks ---- + this->listElement->addItem( + new tsl::elm::CategoryHeader("Special Thanks") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("SciresM, hexkyz and Alula - Atmosphere CFW") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("KazushiMe - Switch OC Suite") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("hanai3Bi - Switch OC Suite & EOS") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("RetroNX - sys-clk") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("ppkantorski - Ultrahand") + ); + + this->listElement->addItem( + new tsl::elm::ListItem("CtCaer - Hekate, L4T and Proper Timings") + ); + + // Create cat elements but hide them initially + CatHeader = new HideableCategoryHeader("Cat"); + CatHeader->setVisible(false); + this->listElement->addItem(CatHeader); + + CatImage = new ImageElement(CAT_DATA, CAT_WIDTH, CAT_HEIGHT); + CatImage->setVisible(false); + this->listElement->addItem(CatImage); + + CatSpacer = new HideableCustomDrawer(75); + CatSpacer->setVisible(false); + this->listElement->addItem(CatSpacer); + } + +}; diff --git a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp index 2b1bdbea..8d1965e1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.cpp @@ -25,6 +25,7 @@ */ +#include "ult_ext.h" #include "app_profile_gui.h" #include "../format.h" @@ -303,7 +304,7 @@ public: static constexpr struct { const char* label; int shift; } kAll[] = { {"CPU", 0}, {"GPU", 8}, {"VRR", 16} }; - int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] || this->context->isUsingRetroSuper ? 3 : 2; + int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] || this->context->isUsingRetroSuper || this->context->profile == HocClkProfile_Docked ? 3 : 2; for (int i = 0; i < count; i++) { u8 cur = (this->profileList->mhzMap[this->profile][HocClkModule_Governor] >> kAll[i].shift) & 0xFF; diff --git a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h index 291d2164..d3e38c8d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/app_profile_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -28,53 +28,29 @@ #include "base_menu_gui.h" #include "freq_choice_gui.h" #include "value_choice_gui.h" -class AppProfileGui : public BaseMenuGui -{ +class AppProfileGui : public BaseMenuGui { protected: - std::uint64_t applicationId; - HocClkTitleProfileList* profileList; - void openFreqChoiceGui(tsl::elm::ListItem* listItem, HocClkProfile profile, HocClkModule module); - void addModuleListItem(HocClkProfile profile, HocClkModule module); - void addModuleListItemToggle(HocClkProfile profile, HocClkModule module); - void openValueChoiceGui( - tsl::elm::ListItem* listItem, - std::uint32_t currentValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds = ValueThresholds(), - bool enableThresholds = false, - const std::map& labels = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true - ); - std::string formatValueDisplay( - std::uint32_t value, - const std::vector& namedValues, - const std::string& suffix, - std::uint32_t divisor, - int decimalPlaces - ); - void addModuleListItemValue( - HocClkProfile profile, - HocClkModule module, - const std::string& categoryName, - std::uint32_t min, - std::uint32_t max, - std::uint32_t step, - const std::string& suffix, - std::uint32_t divisor, - int decimalPlaces, - ValueThresholds thresholds, - std::vector namedValues = {}, - bool showDefaultValue = true - ); - void addGovernorSection(HocClkProfile profile); - void addProfileUI(HocClkProfile profile); + std::uint64_t applicationId; + HocClkTitleProfileList *profileList; + void openFreqChoiceGui(tsl::elm::ListItem *listItem, HocClkProfile profile, HocClkModule module); + void addModuleListItem(HocClkProfile profile, HocClkModule module); + void addModuleListItemToggle(HocClkProfile profile, HocClkModule module); + void openValueChoiceGui(tsl::elm::ListItem *listItem, std::uint32_t currentValue, const ValueRange &range, const std::string &categoryName, + ValueChoiceListener listener, const ValueThresholds &thresholds = ValueThresholds(), bool enableThresholds = false, + const std::map &labels = {}, const std::vector &namedValues = {}, + bool showDefaultValue = true); + std::string formatValueDisplay(std::uint32_t value, const std::vector &namedValues, const std::string &suffix, std::uint32_t divisor, + int decimalPlaces); + void addModuleListItemValue(HocClkProfile profile, HocClkModule module, const std::string &categoryName, std::uint32_t min, std::uint32_t max, + std::uint32_t step, const std::string &suffix, std::uint32_t divisor, int decimalPlaces, ValueThresholds thresholds, + std::vector namedValues = {}, bool showDefaultValue = true); + void addGovernorSection(HocClkProfile profile); + void addProfileUI(HocClkProfile profile); + public: - AppProfileGui(std::uint64_t applicationId, HocClkTitleProfileList* profileList); - ~AppProfileGui(); - void listUI() override; - static void changeTo(std::uint64_t applicationId); - void update() override; + AppProfileGui(std::uint64_t applicationId, HocClkTitleProfileList *profileList); + ~AppProfileGui(); + void listUI() override; + static void changeTo(std::uint64_t applicationId); + void update() override; }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp index 49a2b955..7aee9637 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ /* -------------------------------------------------------------------------- @@ -24,21 +24,41 @@ * -------------------------------------------------------------------------- */ +#include "../elements/base_frame.h" #include "base_gui.h" -#include "../elements/base_frame.h" -#include +void BaseFrame::draw(tsl::gfx::Renderer *renderer) { + tsl::elm::HeaderOverlayFrame::draw(renderer); + this->gui->preDraw(renderer); +} + #include +#include + + +#define LOGO_Y_REAL 65 #define LOGO_X 20 -#define LOGO_Y 50 +#define LOGO_Y 60 #define LOGO_LABEL_FONT_SIZE 45 -#define VERSION_X (LOGO_X + 250) +#define TEXT_Y 57 + +#define LOGO_IMG_W 50 +#define LOGO_IMG_H 50 +#define LOGO_IMG_PAD 8 +#define LOGO_TEXT_X (LOGO_X + LOGO_IMG_W + LOGO_IMG_PAD) + +#define VERSION_X (LOGO_TEXT_X + 185) #define VERSION_Y (LOGO_Y - 40) #define VERSION_FONT_SIZE 15 +extern "C" { +extern const u8 hoc_rgba[]; +extern const u32 hoc_rgba_size; +} + std::string getVersionString() { char buf[0x100] = ""; Result rc = hocclkIpcGetVersionString(buf, sizeof(buf)); @@ -48,35 +68,28 @@ std::string getVersionString() { return std::string(buf); } -static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(0, 15, 3, 15); -static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(0, 8, 1, 15); -static constexpr tsl::Color STATIC_GREEN = tsl::Color(0, 15, 0, 15); -const std::string name = "Horizon OC Gaea"; +static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(7, 15, 15, 15); +static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(2, 8, 11, 15); +static constexpr tsl::Color STATIC_TEAL = tsl::Color(7, 15, 15, 15); +const std::string name = " Horizon OC"; -static s32 drawDynamicUltraText( - tsl::gfx::Renderer* renderer, - s32 startX, - s32 y, - u32 fontSize, - const tsl::Color& staticColor, - bool useNotificationMethod = false) -{ +static s32 drawDynamicUltraText(tsl::gfx::Renderer *renderer, s32 startX, s32 y, u32 fontSize, const tsl::Color &staticColor, + bool useNotificationMethod = false) { static constexpr double cycleDuration = 1.6; s32 currentX = startX; const u64 currentTime_ns = armTicksToNs(armGetSystemTick()); const double timeNow = static_cast(currentTime_ns) / 1e9; - const double timeBase = fmod(timeNow, cycleDuration); const double waveScale = 2.0 * M_PI / cycleDuration; - for (size_t i = 0; i < name.size(); i++) - { + for (size_t i = 0; i < name.size(); i++) { char letter = name[i]; - if (letter == '\0') break; + if (letter == '\0') + break; - double phase = waveScale * (timeBase + i * 0.12); + double phase = waveScale * (timeNow + i * 0.12); double raw = cos(phase); double n = (raw + 1.0) * 0.5; @@ -86,15 +99,9 @@ static s32 drawDynamicUltraText( double glow = (cos(phase * 1.5) + 1.0) * 0.5; double brightness = 0.75 + glow * 0.25; - u8 r = static_cast( - (dynamicLogoRGB1.r + (dynamicLogoRGB2.r - dynamicLogoRGB1.r) * blend) * brightness - ); - u8 g = static_cast( - (dynamicLogoRGB1.g + (dynamicLogoRGB2.g - dynamicLogoRGB1.g) * blend) * brightness - ); - u8 b = static_cast( - (dynamicLogoRGB1.b + (dynamicLogoRGB2.b - dynamicLogoRGB1.b) * blend) * brightness - ); + u8 r = static_cast(((int)dynamicLogoRGB1.r + ((int)dynamicLogoRGB2.r - (int)dynamicLogoRGB1.r) * blend) * brightness); + u8 g = static_cast(((int)dynamicLogoRGB1.g + ((int)dynamicLogoRGB2.g - (int)dynamicLogoRGB1.g) * blend) * brightness); + u8 b = static_cast(((int)dynamicLogoRGB1.b + ((int)dynamicLogoRGB2.b - (int)dynamicLogoRGB1.b) * blend) * brightness); r = std::clamp(r, 0, 15); g = std::clamp(g, 0, 15); @@ -120,25 +127,34 @@ static s32 drawDynamicUltraText( return currentX; } -void BaseGui::preDraw(tsl::gfx::Renderer* renderer) { - drawDynamicUltraText( - renderer, - LOGO_X, - LOGO_Y, - LOGO_LABEL_FONT_SIZE, - STATIC_GREEN, - false - ); +void BaseGui::preDraw(tsl::gfx::Renderer *renderer) { + renderer->drawBitmap(LOGO_X, LOGO_Y_REAL - LOGO_LABEL_FONT_SIZE, LOGO_IMG_W, LOGO_IMG_H, hoc_rgba); + + drawDynamicUltraText(renderer, LOGO_TEXT_X, TEXT_Y, LOGO_LABEL_FONT_SIZE, STATIC_TEAL, false); + + static const std::string versionStr = "Version " + getVersionString() + " \"Gaea\""; + static constexpr tsl::Color versionColor(9, 9, 9, 15); + static constexpr s32 vx = LOGO_TEXT_X + 15; + static constexpr s32 vy = TEXT_Y + 18; + static constexpr s32 fs = 15; + static constexpr s32 skew = 3; + static constexpr s32 passes = 25; + for (s32 i = 0; i < passes; i++) { + s32 sliceY = (vy - fs) + i * fs / passes; + s32 sliceH = fs / passes + 1; + s32 xOff = skew - (skew * i / (passes - 1)); + renderer->enableScissoring(0, sliceY, tsl::cfg::FramebufferWidth, sliceH); + renderer->drawString(versionStr.c_str(), false, vx + xOff, vy, fs, versionColor); + renderer->disableScissoring(); + } } -tsl::elm::Element* BaseGui::createUI() -{ - BaseFrame* rootFrame = new BaseFrame(this); +tsl::elm::Element *BaseGui::createUI() { + BaseFrame *rootFrame = new BaseFrame(this, this->headerHeight()); rootFrame->setContent(this->baseUI()); return rootFrame; } -void BaseGui::update() -{ +void BaseGui::update() { this->refresh(); } \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_gui.h b/Source/hoc-clk/overlay/src/ui/gui/base_gui.h index eca76c09..8726a526 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/base_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,30 +24,36 @@ * -------------------------------------------------------------------------- */ - #pragma once -#include -#include -#include -#include #include +#include +#include +#include +#include -#include "../style.h" #include "../../ipc.h" +#include "../elements/base_frame.h" +#include "../style.h" -class BaseGui : public tsl::Gui -{ + +class BaseGui : public tsl::Gui { public: - BaseGui() {} - ~BaseGui() {} - virtual void preDraw(tsl::gfx::Renderer* renderer); - void update() override; - tsl::elm::Element* createUI() override; - virtual tsl::elm::Element* baseUI() = 0; - virtual void refresh() {} + BaseGui() { + } + ~BaseGui() { + } + virtual void preDraw(tsl::gfx::Renderer *renderer); + void update() override; + tsl::elm::Element *createUI() override; + virtual tsl::elm::Element *baseUI() = 0; + virtual void refresh() { + } + virtual u16 headerHeight() const { + return HOC_HEADER_HEIGHT; + } + private: }; - extern std::string getVersionString(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp index 67f2d2e6..548a2bc1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.cpp @@ -24,21 +24,24 @@ * -------------------------------------------------------------------------- */ - +#include "../format.h" #include "base_menu_gui.h" #include "fatal_gui.h" -#include "../format.h" + + +#define TOP_Y_OFFSET 15 // Cache hardware model to avoid repeated syscalls -BaseMenuGui::BaseMenuGui() : tempColors{ tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), } -{ +BaseMenuGui::BaseMenuGui() + : tempColors{ + tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), + } { tsl::initializeThemeVars(); this->context = nullptr; this->lastContextUpdate = 0; this->listElement = nullptr; - // Pre-cache hardware model during initialization IsAula(); IsMariko(); @@ -49,20 +52,19 @@ BaseMenuGui::BaseMenuGui() : tempColors{ tsl::Color(0), tsl::Color(0), tsl::Colo } BaseMenuGui::~BaseMenuGui() { - delete this->context; // delete handles nullptr automatically + delete this->context; // delete handles nullptr automatically } // Fast preDraw - just renders pre-computed strings -void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { +void BaseMenuGui::preDraw(tsl::gfx::Renderer *renderer) { BaseGui::preDraw(renderer); - if(!this->context) [[unlikely]] return; // All constants pre-calculated and cached - const char* labels[] = { - "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() ? "OLED" : "LCD", "FPS", "RES" - }; + const char *labels[] = { "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", + "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() || this->context->isUsingRetroSuper ? "OLED" : "LCD", + "FPS", "RES" }; - static constexpr u32 dataPositions[6] = {63-3+3, 200-1, 344-1-3, 200-1, 342-1, 321-1}; + static constexpr u32 dataPositions[6] = { 63 - 3 + 3, 200 - 1, 344 - 1 - 3, 200 - 1, 342 - 1, 321 - 1 }; static u32 labelWidths[10]; static bool positionsInitialized = false; @@ -73,14 +75,23 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { } positionsInitialized = true; } - static u32 positions[10] = {24-1, 310-labelWidths[1], 24-1, 192-labelWidths[3], 332-labelWidths[4], 24-1, 192 - labelWidths[6], 332-labelWidths[7], 192 - labelWidths[8], 332-labelWidths[9]}; + static u32 positions[10] = { 24 - 1, + 310 - labelWidths[1], + 24 - 1, + 192 - labelWidths[3], + 332 - labelWidths[4], + 24 - 1, + 192 - labelWidths[6], + 332 - labelWidths[7], + 192 - labelWidths[8], + 332 - labelWidths[9] }; - static u32 maxProfileValueWidth = renderer->getTextDimensions("USB Charger", false, SMALL_TEXT_SIZE).first; // longest word + static u32 maxProfileValueWidth = renderer->getTextDimensions("USB Charger", false, SMALL_TEXT_SIZE).first; // longest word - u32 y = 91; + u32 y = 91 + TOP_Y_OFFSET; // === TOP SECTION === - renderer->drawRoundedRect(14, 70-1, 420, 30+2, 12.0f, renderer->aWithOpacity(tsl::tableBGColor)); + renderer->drawRoundedRect(14, 70 - 1 + TOP_Y_OFFSET, 420, 30 + 2, 12.0f, renderer->aWithOpacity(tsl::tableBGColor)); // App ID - use pre-formatted string renderer->drawString(labels[0], false, positions[0], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); @@ -90,10 +101,10 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { renderer->drawString(labels[1], false, 423 - maxProfileValueWidth - labelWidths[1] - 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(displayStrings[1], false, 423 - maxProfileValueWidth, y, SMALL_TEXT_SIZE, tsl::infoTextColor); - y += 38; // Direct assignment instead of += 38 + y += 38; // Direct assignment instead of += 38 // === MAIN DATA SECTION === - renderer->drawRoundedRect(14, 106, 420, 156, 10.0f, renderer->aWithOpacity(tsl::tableBGColor)); + renderer->drawRoundedRect(14, 106 + TOP_Y_OFFSET, 420, 156, 10.0f, renderer->aWithOpacity(tsl::tableBGColor)); // === FREQUENCY SECTION === // Labels first (better cache locality) @@ -105,8 +116,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { renderer->drawString(displayStrings[3], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU renderer->drawString(displayStrings[4], false, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // MEM - y += 20; // Direct assignment (129 + 20) - + y += 20; // Direct assignment (129 + 20) renderer->drawString(displayStrings[5], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU real renderer->drawString(displayStrings[6], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU real @@ -118,19 +128,20 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { // === REAL FREQUENCIES === - y += 20; // Direct assignment (149 + 20) + y += 20; // Direct assignment (149 + 20) // === VOLTAGES === - renderer->drawString(displayStrings[8], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU voltage - renderer->drawString(displayStrings[9], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU voltage + renderer->drawString(displayStrings[8], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU voltage + renderer->drawString(displayStrings[9], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU voltage - renderer->drawStringWithColoredSections(displayStrings[10], false, {""}, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor, tsl::separatorColor); + renderer->drawStringWithColoredSections(displayStrings[10], false, { "" }, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor, + tsl::separatorColor); renderer->drawString(displayStrings[19], false, positions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU Usage renderer->drawString(displayStrings[17], false, positions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU Usage renderer->drawString(displayStrings[18], false, positions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RAM Usage - y += 22; // Direct assignment (169 + 22) + y += 22; // Direct assignment (169 + 22) // === TEMPERATURE SECTION === // Labels @@ -140,59 +151,57 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { // Temperatures with color - use pre-computed colors renderer->drawString(displayStrings[11], false, dataPositions[0] - 1, y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_SOC]); // SOC - renderer->drawString(displayStrings[12], false, dataPositions[1], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB - renderer->drawString(displayStrings[13], false, dataPositions[2], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin + renderer->drawString(displayStrings[12], false, dataPositions[1], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB + renderer->drawString(displayStrings[13], false, dataPositions[2], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin - y += 20; // Direct assignment (191 + 20) + y += 20; // Direct assignment (191 + 20) - renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // SOC voltage + renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // SOC voltage // Power labels and values - renderer->drawString(labels[8], false, positions[8]-1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); + renderer->drawString(labels[8], false, positions[8] - 1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(labels[9], false, positions[9], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(displayStrings[15], false, dataPositions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Power now renderer->drawString(displayStrings[16], false, dataPositions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Power avg - y+=20; + y += 20; renderer->drawString(labels[10], false, positions[2], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(displayStrings[20], false, dataPositions[0], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Battery]); // Battery - renderer->drawString(labels[12], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label + renderer->drawString(labels[12], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label - renderer->drawString(displayStrings[24], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed + renderer->drawString(displayStrings[24], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed - renderer->drawString(labels[13], false, positions[4] + 4, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // disp label + renderer->drawString(labels[13], false, positions[4] + 4, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // disp label - renderer->drawString(displayStrings[25], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq + renderer->drawString(displayStrings[25], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq - y+=20; + y += 20; - renderer->drawString(displayStrings[21], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat voltage + renderer->drawString(displayStrings[21], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat voltage renderer->drawString(displayStrings[23], false, positions[2] - 2, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat Age - if(this->context->isSaltyNXInstalled) { + if (this->context->isSaltyNXInstalled) { - renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label - renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES - - renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label - renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS + renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label + renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES + renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label + renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS } - y+=20; + y += 20; } // Optimized refresh - now does all the string formatting once per second -void BaseMenuGui::refresh() -{ +void BaseMenuGui::refresh() { const u64 ticks = armGetSystemTick(); // Use cached comparison - 1 billion nanoseconds if (armTicksToNs(ticks - this->lastContextUpdate) <= 1000000000UL) [[likely]] { - return; // Early exit for most calls + return; // Early exit for most calls } this->lastContextUpdate = ticks; @@ -223,22 +232,22 @@ void BaseMenuGui::refresh() strcpy(displayStrings[1], hocclkFormatProfile(context->profile, true)); // Current frequencies - u32 hz = context->freqs[HocClkModule_CPU]; // CPU + u32 hz = context->freqs[HocClkModule_CPU]; // CPU sprintf(displayStrings[2], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->freqs[HocClkModule_GPU]; // GPU + hz = context->freqs[HocClkModule_GPU]; // GPU sprintf(displayStrings[3], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->freqs[HocClkModule_MEM]; // MEM + hz = context->freqs[HocClkModule_MEM]; // MEM std::uint32_t unit = configList.values[HocClkConfigValue_RamDisplayUnit]; std::uint32_t mhz = hz / 1000000U; std::uint32_t mts = mhz * 2; std::uint32_t tenth = (hz / 100000U) % 10U; - if(unit == RamDisplayUnit_MTs) + if (unit == RamDisplayUnit_MTs) sprintf(displayStrings[4], "%u MT/s", mts); - else if(unit == RamDisplayUnit_MHz) + else if (unit == RamDisplayUnit_MHz) sprintf(displayStrings[4], "%u.%u MHz", mhz, tenth); - else if(unit == RamDisplayUnit_MHzMTs) { + else if (unit == RamDisplayUnit_MHzMTs) { hz = context->realFreqs[HocClkModule_MEM]; mhz = hz / 1000000U; tenth = (hz / 100000U) % 10U; @@ -246,18 +255,18 @@ void BaseMenuGui::refresh() } // Real frequencies - hz = context->realFreqs[HocClkModule_CPU]; // CPU + hz = context->realFreqs[HocClkModule_CPU]; // CPU sprintf(displayStrings[5], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->realFreqs[HocClkModule_GPU]; // GPU + hz = context->realFreqs[HocClkModule_GPU]; // GPU sprintf(displayStrings[6], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U); - hz = context->realFreqs[HocClkModule_MEM]; // MEM + hz = context->realFreqs[HocClkModule_MEM]; // MEM unit = configList.values[HocClkConfigValue_RamDisplayUnit]; mhz = hz / 1000000U; mts = mhz * 2; tenth = (hz / 100000U) % 10U; - if(unit == RamDisplayUnit_MTs || unit == RamDisplayUnit_MHzMTs) + if (unit == RamDisplayUnit_MTs || unit == RamDisplayUnit_MHzMTs) sprintf(displayStrings[7], "%u MT/s", mts); else sprintf(displayStrings[7], "%u.%u MHz", mhz, tenth); @@ -266,12 +275,14 @@ void BaseMenuGui::refresh() sprintf(displayStrings[8], "%.1f mV", context->voltages[HocClkVoltage_CPU] / 1000.0); sprintf(displayStrings[9], "%.1f mV", context->voltages[HocClkVoltage_GPU] / 1000.0); - switch(configList.values[HocClkConfigValue_RAMVoltDisplayMode]) { + switch (configList.values[HocClkConfigValue_RAMVoltDisplayMode]) { case RamDisplayMode_VDD2: - sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U); + sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, + (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U); break; case RamDisplayMode_VDDQ: - sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U, (context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U); + sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U, + (context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U); break; default: strcpy(displayStrings[10], "N/A"); @@ -279,15 +290,15 @@ void BaseMenuGui::refresh() } // Temperatures and pre-compute colors - u32 millis = context->temps[HocClkThermalSensor_SOC]; // SOC + u32 millis = context->temps[HocClkThermalSensor_SOC]; // SOC sprintf(displayStrings[11], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_SOC] = tsl::GradientColor(millis * 0.001f); - millis = context->temps[HocClkThermalSensor_PCB]; // PCB + millis = context->temps[HocClkThermalSensor_PCB]; // PCB sprintf(displayStrings[12], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_PCB] = tsl::GradientColor(millis * 0.001f); - millis = context->temps[HocClkThermalSensor_Skin]; // Skin + millis = context->temps[HocClkThermalSensor_Skin]; // Skin sprintf(displayStrings[13], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_Skin] = tsl::GradientColor(millis * 0.001f); @@ -295,26 +306,26 @@ void BaseMenuGui::refresh() sprintf(displayStrings[14], "%u mV", context->voltages[HocClkVoltage_SOC] / 1000U); // Power - sprintf(displayStrings[15], "%d mW", context->power[0]); // Now - sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg + sprintf(displayStrings[15], "%d mW", context->power[0]); // Now + sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg sprintf(displayStrings[17], "%u%%", context->partLoad[HocClkPartLoad_GPU] / 10); sprintf(displayStrings[18], "%u%%", context->partLoad[HocClkPartLoad_EMC] / 10); sprintf(displayStrings[19], "%u%%", context->partLoad[HocClkPartLoad_CPUMax] / 10); - millis = context->temps[HocClkThermalSensor_Battery]; // Battery + millis = context->temps[HocClkThermalSensor_Battery]; // Battery sprintf(displayStrings[20], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_Battery] = tsl::GradientColor(millis * 0.001f); - sprintf(displayStrings[21], "%d mV", context->voltages[HocClkVoltage_Battery]); // BAT AVG + sprintf(displayStrings[21], "%d mV", context->voltages[HocClkVoltage_Battery]); // BAT AVG sprintf(displayStrings[23], "%u%%", context->partLoad[HocClkPartLoad_BAT] / 1000); sprintf(displayStrings[24], "%u%%", context->partLoad[HocClkPartLoad_FAN]); sprintf(displayStrings[25], "%u Hz", context->realFreqs[HocClkModule_Display]); - if(this->context->isSaltyNXInstalled) { - if(context->fps == 254) { + if (this->context->isSaltyNXInstalled) { + if (context->fps == 254) { strcpy(displayStrings[26], "N/A"); } else { memset(displayStrings[26], 0, sizeof(displayStrings[26])); @@ -322,8 +333,8 @@ void BaseMenuGui::refresh() } } - if(this->context->isSaltyNXInstalled) { - if(context->resolutionHeight == 0) { + if (this->context->isSaltyNXInstalled) { + if (context->resolutionHeight == 0) { strcpy(displayStrings[27], "N/A"); } else { memset(displayStrings[27], 0, sizeof(displayStrings[27])); @@ -342,13 +353,10 @@ void BaseMenuGui::refresh() millis = context->temps[HocClkThermalSensor_MEM]; sprintf(displayStrings[30], "%u.%u", millis / 1000U, (millis % 1000U) / 100U); tempColors[HocClkThermalSensor_MEM] = tsl::GradientColor(millis * 0.001f); - } -tsl::elm::Element* BaseMenuGui::baseUI() -{ - auto* list = new tsl::elm::List(); - list->addItem(new tsl::elm::CustomDrawer([](tsl::gfx::Renderer*, s32, s32, s32, s32) {}), 35); // add a bit of space +tsl::elm::Element *BaseMenuGui::baseUI() { + auto *list = new tsl::elm::List(); this->listElement = list; this->listUI(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h index 46d9c237..eb0758ff 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/base_menu_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,68 +24,66 @@ * -------------------------------------------------------------------------- */ - #pragma once #include "../../ipc.h" #include "base_gui.h" -class BaseMenuGui : public BaseGui -{ +class BaseMenuGui : public BaseGui { protected: - public: - // u8 dockedHighestAllowedRefreshRate = 60; - HocClkContext* context; - std::uint64_t lastContextUpdate; - HocClkConfigValueList configList; - bool g_hardwareModelCached = false; - bool g_isMariko = false; - bool g_isAula = false; - bool g_isHoag = false; - SetSysProductModel HWmodel = SetSysProductModel_Invalid; - - bool IsAula() { - if (!g_hardwareModelCached) { - setsysGetProductModel(&HWmodel); - g_hardwareModelCached = true; - } - g_isAula = (HWmodel == SetSysProductModel_Aula); - return g_isAula; - } - bool IsHoag() { - if (!g_hardwareModelCached) { - setsysGetProductModel(&HWmodel); - g_hardwareModelCached = true; - } - g_isHoag = (HWmodel == SetSysProductModel_Hoag); - return g_isHoag; - } - bool IsMariko() { - if (!g_hardwareModelCached) { - setsysGetProductModel(&HWmodel); - g_hardwareModelCached = true; - } - g_isMariko = (HWmodel == SetSysProductModel_Iowa || - HWmodel == SetSysProductModel_Hoag || - HWmodel == SetSysProductModel_Calcio || - HWmodel == SetSysProductModel_Aula); + // u8 dockedHighestAllowedRefreshRate = 60; + HocClkContext *context; + std::uint64_t lastContextUpdate; + HocClkConfigValueList configList; + bool g_hardwareModelCached = false; + bool g_isMariko = false; + bool g_isAula = false; + bool g_isHoag = false; + SetSysProductModel HWmodel = SetSysProductModel_Invalid; - return g_isMariko; + bool IsAula() { + if (!g_hardwareModelCached) { + setsysGetProductModel(&HWmodel); + g_hardwareModelCached = true; } + g_isAula = (HWmodel == SetSysProductModel_Aula); + return g_isAula; + } + bool IsHoag() { + if (!g_hardwareModelCached) { + setsysGetProductModel(&HWmodel); + g_hardwareModelCached = true; + } + g_isHoag = (HWmodel == SetSysProductModel_Hoag); + return g_isHoag; + } + bool IsMariko() { + if (!g_hardwareModelCached) { + setsysGetProductModel(&HWmodel); + g_hardwareModelCached = true; + } + g_isMariko = (HWmodel == SetSysProductModel_Iowa || HWmodel == SetSysProductModel_Hoag || HWmodel == SetSysProductModel_Calcio || + HWmodel == SetSysProductModel_Aula); - bool IsErista() { - return !IsMariko(); - } - BaseMenuGui(); - ~BaseMenuGui(); - void preDraw(tsl::gfx::Renderer* renderer) override; - tsl::elm::List* listElement; - tsl::elm::Element* baseUI() override; - void refresh() override; - virtual void listUI() = 0; + return g_isMariko; + } + + bool IsErista() { + return !IsMariko(); + } + BaseMenuGui(); + ~BaseMenuGui(); + void preDraw(tsl::gfx::Renderer *renderer) override; + tsl::elm::List *listElement; + tsl::elm::Element *baseUI() override; + void refresh() override; + virtual void listUI() = 0; + u16 headerHeight() const override { + return HOC_BOX_BOTTOM + 9; + } private: - char displayStrings[48][32]; // Pre-formatted display strings - tsl::Color tempColors[HocClkThermalSensor_EnumMax]; // Pre-computed temperature colors + char displayStrings[48][32]; // Pre-formatted display strings + tsl::Color tempColors[HocClkThermalSensor_EnumMax]; // Pre-computed temperature colors }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/cat.h b/Source/hoc-clk/overlay/src/ui/gui/cat.h index a4c56ff4..8ab37d01 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/cat.h +++ b/Source/hoc-clk/overlay/src/ui/gui/cat.h @@ -12,4107 +12,2059 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ // this is a generated file, do not edit manually. // cat.png - 96x128 static const unsigned int CAT_WIDTH = 96; static const unsigned int CAT_HEIGHT = 128; static const unsigned char CAT_DATA[] = { - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, - 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xD6, 0xD7, 0xD4, 0xFF, 0x56, 0x57, 0x54, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x39, 0x39, 0x3B, 0xFF, - 0xB7, 0xB7, 0xB7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, - 0xE4, 0xE5, 0xDE, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, - 0xD5, 0xD6, 0xD1, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, - 0xDF, 0xDD, 0xD9, 0xFF, 0xF0, 0xEF, 0xEB, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, - 0xE1, 0xE0, 0xDC, 0xFF, 0xDE, 0xDA, 0xD7, 0xFF, 0xD5, 0xD1, 0xCE, 0xFF, - 0xE7, 0xE3, 0xE0, 0xFF, 0xE9, 0xE5, 0xE1, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, - 0xEC, 0xE6, 0xE4, 0xFF, 0xEC, 0xE6, 0xE4, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xA3, 0xA3, 0xA1, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, 0x22, 0x21, 0x24, 0xFF, - 0x6A, 0x6A, 0x6A, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE5, 0xE7, 0xDF, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xEE, 0xEF, 0xE7, 0xFF, - 0xF0, 0xF1, 0xEA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, - 0xE6, 0xE4, 0xE0, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, - 0xD2, 0xD0, 0xCC, 0xFF, 0x9F, 0x9B, 0x98, 0xFF, 0x9D, 0x99, 0x96, 0xFF, - 0xB7, 0xB2, 0xAF, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, - 0xD9, 0xD2, 0xD0, 0xFF, 0xD9, 0xD2, 0xD0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0x77, 0x77, 0x75, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, 0x13, 0x12, 0x15, 0xFF, - 0x1E, 0x1E, 0x1E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xDD, 0xDE, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, - 0xEE, 0xEF, 0xE7, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, 0xF1, 0xF2, 0xED, 0xFF, - 0xF0, 0xF1, 0xEC, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE0, 0xDE, 0xDA, 0xFF, 0xBB, 0xB9, 0xB5, 0xFF, 0x7D, 0x7B, 0x77, 0xFF, - 0x37, 0x36, 0x32, 0xFF, 0x24, 0x20, 0x1D, 0xFF, 0x73, 0x6F, 0x6C, 0xFF, - 0xC4, 0xC0, 0xBD, 0xFF, 0xEE, 0xEA, 0xE7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, - 0xE0, 0xD9, 0xD7, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xDD, 0xDE, 0xDB, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0x5C, 0x5C, 0x5A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x13, 0x12, 0x15, 0xFF, 0x13, 0x12, 0x15, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, - 0xE4, 0xE5, 0xDE, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, - 0xEC, 0xED, 0xE8, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0x70, 0x6F, 0x6B, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, - 0x10, 0x0E, 0x0A, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0xB2, 0xAE, 0xAB, 0xFF, - 0xF4, 0xF0, 0xED, 0xFF, 0xE6, 0xE2, 0xDF, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, - 0xEA, 0xE4, 0xE1, 0xFF, 0xEA, 0xE4, 0xE1, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, - 0x30, 0x30, 0x2E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x33, 0x34, 0x2F, 0xFF, - 0x21, 0x1F, 0x1B, 0xFF, 0x25, 0x23, 0x1F, 0xFF, 0x28, 0x26, 0x22, 0xFF, - 0x46, 0x45, 0x41, 0xFF, 0xBB, 0xB7, 0xB4, 0xFF, 0xED, 0xE9, 0xE6, 0xFF, - 0xEA, 0xE6, 0xE3, 0xFF, 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, - 0xDC, 0xD6, 0xD3, 0xFF, 0xE3, 0xDD, 0xDA, 0xFF, 0xF1, 0xEB, 0xE8, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, - 0x24, 0x24, 0x22, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x15, 0x15, 0x17, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x53, 0x53, 0x51, 0xFF, - 0xCF, 0xD0, 0xCB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xF5, 0xF5, 0xF0, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, - 0xD4, 0xD5, 0xD0, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x0E, 0x0D, 0x09, 0xFF, 0x0E, 0x0D, 0x09, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, - 0x9B, 0x9A, 0x96, 0xFF, 0xDD, 0xD9, 0xD6, 0xFF, 0xE3, 0xDF, 0xDC, 0xFF, - 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xDC, 0xD9, 0xFF, 0xF6, 0xEF, 0xED, 0xFF, - 0xF5, 0xEE, 0xEC, 0xFF, 0xE8, 0xE1, 0xDF, 0xFF, 0xD5, 0xCF, 0xCC, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xEA, 0xEA, 0xE8, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x13, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x26, 0x27, 0x24, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xEB, 0xEC, 0xE7, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x07, 0x08, 0x03, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x63, 0x62, 0x5E, 0xFF, - 0xC4, 0xC2, 0xBE, 0xFF, 0xE8, 0xE7, 0xE3, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, - 0xE6, 0xE4, 0xE0, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xD9, 0xD5, 0xD2, 0xFF, - 0xD0, 0xCC, 0xC9, 0xFF, 0xB7, 0xB2, 0xAF, 0xFF, 0x9C, 0x98, 0x94, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0x63, 0x63, 0x61, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x17, 0x17, 0x19, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x5D, 0x5E, 0x59, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, - 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xD6, 0xD7, 0xD2, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, - 0x97, 0x98, 0x93, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x1B, 0x1A, 0x16, 0xFF, 0x42, 0x40, 0x3C, 0xFF, 0xAE, 0xAC, 0xA8, 0xFF, - 0xE1, 0xE0, 0xDC, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, - 0xD6, 0xD4, 0xD0, 0xFF, 0xC5, 0xC4, 0xC0, 0xFF, 0x97, 0x93, 0x90, 0xFF, - 0x96, 0x92, 0x8F, 0xFF, 0xA3, 0x9F, 0x9B, 0xFF, 0xB4, 0xB0, 0xAD, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x1C, 0x1C, 0x1E, 0xFF, 0x16, 0x16, 0x18, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x86, 0x87, 0x80, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, - 0xC9, 0xCB, 0xC3, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, - 0xCC, 0xCD, 0xC8, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, - 0xE5, 0xE7, 0xDF, 0xFF, 0xEC, 0xEE, 0xE6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xE1, 0xE2, 0xDB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, - 0xF0, 0xF1, 0xEC, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xEA, 0xEB, 0xE6, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, - 0x5D, 0x5E, 0x59, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x48, 0x49, 0x44, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x4C, 0x4C, 0x48, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xD3, 0xD4, 0xCF, 0xFF, 0xB5, 0xB3, 0xAF, 0xFF, 0xAA, 0xA9, 0xA5, 0xFF, - 0x9E, 0x9C, 0x98, 0xFF, 0x93, 0x92, 0x8E, 0xFF, 0xA6, 0xA4, 0xA0, 0xFF, - 0xBB, 0xB9, 0xB5, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE8, 0xE8, 0xE6, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x4E, 0x4E, 0x4C, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x55, 0x56, 0x4F, 0xFF, - 0x58, 0x5A, 0x52, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, - 0x41, 0x42, 0x3D, 0xFF, 0x55, 0x56, 0x51, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0xA2, 0xA3, 0x9C, 0xFF, 0xC2, 0xC4, 0xBC, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, - 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, - 0xDB, 0xDC, 0xD7, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, - 0xB7, 0xB8, 0xB3, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xB3, 0xB4, 0xAF, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x9A, 0x98, 0x94, 0xFF, 0xA7, 0xA5, 0xA1, 0xFF, - 0xBA, 0xB8, 0xB4, 0xFF, 0xC6, 0xC5, 0xC1, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, - 0xD9, 0xD7, 0xD3, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE7, 0xE7, 0xE5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x53, 0x53, 0x51, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x1A, 0x1B, 0x14, 0xFF, 0x24, 0x25, 0x1E, 0xFF, - 0x2B, 0x2C, 0x25, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x35, 0x30, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, - 0x46, 0x47, 0x40, 0xFF, 0x4E, 0x4F, 0x48, 0xFF, 0x6F, 0x70, 0x69, 0xFF, - 0x8F, 0x90, 0x89, 0xFF, 0xB0, 0xB1, 0xA8, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, - 0xA5, 0xA7, 0x9F, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x45, 0x46, 0x3F, 0xFF, - 0x22, 0x23, 0x1C, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x0C, 0x0C, 0x08, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, - 0xB8, 0xB9, 0xB4, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, - 0xDD, 0xDE, 0xD9, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x55, 0x55, 0x53, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x15, 0x16, 0x0F, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, - 0x28, 0x29, 0x22, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, - 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x2B, 0xFF, 0x31, 0x32, 0x2B, 0xFF, - 0x41, 0x42, 0x3B, 0xFF, 0x44, 0x45, 0x3B, 0xFF, 0x37, 0x38, 0x2F, 0xFF, - 0x30, 0x31, 0x2A, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x21, 0x22, 0x1B, 0xFF, - 0x26, 0x28, 0x20, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x22, 0x23, 0x1E, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, - 0xDA, 0xDB, 0xD6, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0x61, 0x61, 0x5F, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x14, 0x13, 0x16, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x32, 0x33, 0x2C, 0xFF, 0x38, 0x39, 0x32, 0xFF, 0x28, 0x29, 0x22, 0xFF, - 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x29, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, - 0x2D, 0x2F, 0x27, 0xFF, 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, - 0x1C, 0x1D, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, - 0xDE, 0xDF, 0xDA, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xD2, 0xD2, 0xCE, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0x65, 0x66, 0x63, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x08, 0x08, 0x0A, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x09, 0x0A, 0x07, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x26, 0x27, 0x22, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x29, 0x2A, 0x23, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x36, 0x37, 0x30, 0xFF, - 0x38, 0x39, 0x32, 0xFF, 0x34, 0x36, 0x2C, 0xFF, 0x2A, 0x2B, 0x22, 0xFF, - 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, - 0x16, 0x17, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x85, 0x86, 0x81, 0xFF, - 0xB6, 0xB6, 0xB2, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xEF, 0xEF, 0xEB, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE3, 0xE4, 0xDF, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xDC, 0xDD, 0xD8, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0x6B, 0x6C, 0x69, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, 0x17, 0x17, 0x19, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x09, 0x0A, 0x07, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x25, 0x26, 0x21, 0xFF, - 0x2A, 0x2B, 0x24, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x22, 0x23, 0x1C, 0xFF, - 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x28, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, - 0x30, 0x31, 0x2A, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x24, 0x25, 0x1E, 0xFF, - 0x1E, 0x1F, 0x18, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x07, 0x07, 0x05, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, - 0xC6, 0xC7, 0xC2, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, - 0xD9, 0xD9, 0xD5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, - 0xD7, 0xD8, 0xD3, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x70, 0x70, 0x6E, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0E, 0x0F, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x13, 0x13, 0x0F, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, - 0x28, 0x28, 0x24, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x2A, 0xFF, - 0x34, 0x36, 0x2E, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x2C, 0x2D, 0x26, 0xFF, - 0x2A, 0x2B, 0x24, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x1E, 0x1F, 0x18, 0xFF, - 0x1A, 0x1B, 0x14, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x53, 0x53, 0x4F, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, - 0xE5, 0xE6, 0xE1, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, - 0xE9, 0xEA, 0xE5, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE4, 0xE5, 0xE0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, - 0xDD, 0xDE, 0xD9, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE5, 0xE6, 0xE3, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0x63, 0x63, 0x63, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x22, 0x22, 0x22, 0xFF, - 0x1C, 0x1C, 0x1C, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x36, 0x2E, 0xFF, 0x2F, 0x30, 0x29, 0xFF, - 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1A, 0x1E, 0x18, 0xFF, - 0x13, 0x17, 0x11, 0xFF, 0x10, 0x13, 0x0D, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x15, 0x17, 0x16, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x02, 0x05, 0x01, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, - 0xC5, 0xC6, 0xC1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x64, 0x64, 0x64, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x22, 0x23, 0x1E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x32, 0x33, 0x2C, 0xFF, - 0x28, 0x2C, 0x26, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x26, 0x29, 0x24, 0xFF, - 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x1D, 0x20, 0x1A, 0xFF, - 0x16, 0x19, 0x13, 0xFF, 0x11, 0x14, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x09, 0x0B, 0x0A, 0xFF, 0x0A, 0x0C, 0x0C, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x25, 0x27, 0x26, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x66, 0x66, 0x66, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x32, 0x33, 0x2C, 0xFF, 0x34, 0x36, 0x2E, 0xFF, - 0x28, 0x2C, 0x26, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2B, 0x2E, 0x28, 0xFF, - 0x2C, 0x2F, 0x29, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x20, 0x23, 0x1E, 0xFF, - 0x19, 0x1C, 0x17, 0xFF, 0x15, 0x18, 0x12, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x0C, 0x0F, 0x0E, 0xFF, - 0x2C, 0x2E, 0x2D, 0xFF, 0x80, 0x80, 0x7E, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, - 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, - 0xD3, 0xD3, 0xD1, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, - 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, - 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0x69, 0x69, 0x69, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, - 0x27, 0x2A, 0x25, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2F, 0x33, 0x2D, 0xFF, - 0x32, 0x35, 0x2F, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1A, 0x1E, 0x18, 0xFF, 0x17, 0x1A, 0x14, 0xFF, 0x10, 0x13, 0x0F, 0xFF, - 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x08, 0x0A, 0x09, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x32, 0x34, 0x33, 0xFF, 0x81, 0x82, 0x7F, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, - 0xC8, 0xC9, 0xC2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, - 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, - 0xBF, 0xC0, 0xBB, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, - 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, - 0xD2, 0xD2, 0xCE, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, - 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x6A, 0x6A, 0x6A, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x25, 0x26, 0x23, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x32, 0x33, 0x2E, 0xFF, - 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, - 0x25, 0x28, 0x22, 0xFF, 0x2D, 0x30, 0x2D, 0xFF, 0x25, 0x28, 0x24, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, - 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x0C, 0x0E, 0x10, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x17, 0x19, 0x18, 0xFF, - 0x4C, 0x4F, 0x4E, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, - 0xCD, 0xCE, 0xC7, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, - 0xE0, 0xE1, 0xDA, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xC9, 0xCB, 0xC3, 0xFF, 0xBA, 0xBB, 0xB4, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, - 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, - 0xB8, 0xB9, 0xB4, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, - 0xC7, 0xC8, 0xC3, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, - 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, - 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x69, 0x69, 0x69, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x23, 0x23, 0x21, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x2D, 0x30, 0x2B, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, - 0x21, 0x25, 0x1F, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x24, 0x26, 0x23, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x11, 0x14, 0x11, 0xFF, - 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x0C, 0x0E, 0x10, 0xFF, 0x1C, 0x1E, 0x1F, 0xFF, 0x20, 0x23, 0x22, 0xFF, - 0x6C, 0x6E, 0x6D, 0xFF, 0xB6, 0xB6, 0xB4, 0xFF, 0xCE, 0xCF, 0xCA, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, - 0xDE, 0xE0, 0xD8, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xD5, 0xD6, 0xCF, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, - 0xC0, 0xC1, 0xBA, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, - 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, - 0xBE, 0xBF, 0xBA, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, - 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0x65, 0x65, 0x65, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x1F, 0x20, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, - 0x32, 0x35, 0x2F, 0xFF, 0x2C, 0x2F, 0x29, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1D, 0x20, 0x1A, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x21, 0x24, 0x21, 0xFF, - 0x1D, 0x1F, 0x1C, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x19, 0x1B, 0x1D, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, - 0x91, 0x94, 0x93, 0xFF, 0xCC, 0xCC, 0xCA, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xCC, 0xCD, 0xC6, 0xFF, 0xC6, 0xC7, 0xC0, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, - 0xA8, 0xA9, 0xA2, 0xFF, 0x93, 0x94, 0x8D, 0xFF, 0x82, 0x84, 0x7C, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, - 0xB4, 0xB5, 0xB0, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC2, 0xC3, 0xBE, 0xFF, - 0xCB, 0xCB, 0xC7, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, - 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, - 0xDD, 0xDE, 0xDB, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, 0x63, 0x63, 0x63, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0D, 0x0C, 0x0F, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x1D, 0x1D, 0x1B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, - 0x35, 0x38, 0x33, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x21, 0x25, 0x1F, 0xFF, - 0x19, 0x1C, 0x17, 0xFF, 0x23, 0x25, 0x22, 0xFF, 0x20, 0x23, 0x20, 0xFF, - 0x1E, 0x21, 0x1D, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x12, 0x14, 0x16, 0xFF, 0x1D, 0x1F, 0x20, 0xFF, 0x4B, 0x4E, 0x4D, 0xFF, - 0xBB, 0xBD, 0xBD, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, - 0xDC, 0xDD, 0xD6, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, - 0xDE, 0xE0, 0xD6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, - 0xBF, 0xC0, 0xB9, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, - 0x90, 0x92, 0x8A, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x66, 0x68, 0x60, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, - 0xB2, 0xB3, 0xAC, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, - 0xBB, 0xBC, 0xB7, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, - 0xE1, 0xE1, 0xDD, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, - 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, - 0xE1, 0xE1, 0xDF, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD6, 0xD7, 0xD4, 0xFF, - 0xE0, 0xE0, 0xDE, 0xFF, 0xC5, 0xC5, 0xC3, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, - 0xDA, 0xDA, 0xD8, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x3B, 0x3C, 0x39, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x24, 0x25, 0x20, 0xFF, - 0x30, 0x34, 0x2E, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x23, 0x26, 0x20, 0xFF, - 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, - 0x1E, 0x21, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x12, 0x14, 0x16, 0xFF, 0x20, 0x22, 0x24, 0xFF, 0x91, 0x94, 0x93, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, - 0xE7, 0xE8, 0xE0, 0xFF, 0xDB, 0xDC, 0xD3, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, - 0xDE, 0xE0, 0xD6, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD2, 0xD3, 0xCC, 0xFF, 0xC7, 0xC8, 0xC1, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, - 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x96, 0x97, 0x90, 0xFF, - 0x7D, 0x7E, 0x77, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, - 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, - 0xB0, 0xB1, 0xAA, 0xFF, 0xB1, 0xB2, 0xAB, 0xFF, 0xB0, 0xB1, 0xAA, 0xFF, - 0xB6, 0xB6, 0xB2, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, - 0xCD, 0xCE, 0xC9, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, - 0xD6, 0xD7, 0xD2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, - 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, - 0xC2, 0xC3, 0xC0, 0xFF, 0xB4, 0xB5, 0xB2, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, - 0xB7, 0xB7, 0xB5, 0xFF, 0x7E, 0x7E, 0x7C, 0xFF, 0x29, 0x29, 0x27, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, - 0x21, 0x25, 0x1F, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, - 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x12, 0x15, 0x12, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x16, 0x18, 0x19, 0xFF, 0x24, 0x26, 0x27, 0xFF, 0x6F, 0x72, 0x71, 0xFF, - 0x95, 0x97, 0x96, 0xFF, 0xCB, 0xCB, 0xC9, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, - 0xE1, 0xE2, 0xDB, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, - 0xDD, 0xDF, 0xD5, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, - 0xC9, 0xCB, 0xC3, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, - 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, 0x74, 0x76, 0x6E, 0xFF, - 0x61, 0x62, 0x5B, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x50, 0x52, 0x4A, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xAC, 0xAD, 0xA8, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA5, 0xFF, - 0xAB, 0xAC, 0xA5, 0xFF, 0xAC, 0xAD, 0xA6, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, - 0xBB, 0xBC, 0xB7, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, - 0xC4, 0xC4, 0xC0, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, - 0xCE, 0xCE, 0xCC, 0xFF, 0xBF, 0xBF, 0xBD, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, - 0xAF, 0xAF, 0xAD, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAA, 0xAA, 0xA8, 0xFF, - 0x9A, 0x9A, 0x98, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x1E, 0x21, 0x1B, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x27, 0x2A, 0x25, 0xFF, - 0x23, 0x26, 0x20, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, - 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x13, 0x16, 0x13, 0xFF, - 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x0E, 0x10, 0x11, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x42, 0x44, 0x44, 0xFF, - 0x71, 0x73, 0x72, 0xFF, 0xBD, 0xBD, 0xBB, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, - 0xCF, 0xD0, 0xC9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, - 0xDD, 0xDF, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, - 0xC0, 0xC1, 0xBA, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, - 0x8D, 0x8E, 0x87, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x56, 0x57, 0x50, 0xFF, - 0x4B, 0x4C, 0x44, 0xFF, 0x53, 0x54, 0x4D, 0xFF, 0x69, 0x6A, 0x63, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, - 0xAD, 0xAE, 0xA9, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, - 0xA8, 0xA9, 0xA2, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, - 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, - 0xB8, 0xB8, 0xB6, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x9E, 0x9F, 0x9C, 0xFF, - 0x96, 0x97, 0x94, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, - 0x7A, 0x7B, 0x78, 0xFF, 0x3D, 0x3D, 0x3B, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x15, 0x18, 0x12, 0xFF, 0x1E, 0x21, 0x1B, 0xFF, 0x24, 0x27, 0x21, 0xFF, - 0x25, 0x28, 0x24, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x17, 0x1A, 0x16, 0xFF, - 0x17, 0x1A, 0x16, 0xFF, 0x16, 0x18, 0x15, 0xFF, 0x15, 0x17, 0x14, 0xFF, - 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x17, 0x19, 0x1A, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x3B, 0x3D, 0x3D, 0xFF, - 0x87, 0x89, 0x86, 0xFF, 0xC9, 0xCA, 0xC5, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xD7, 0xD9, 0xCF, 0xFF, 0xE1, 0xE2, 0xD9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, - 0xB9, 0xBA, 0xB3, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, - 0x78, 0x79, 0x72, 0xFF, 0x69, 0x6A, 0x63, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, - 0x48, 0x49, 0x42, 0xFF, 0x61, 0x62, 0x5B, 0xFF, 0x86, 0x87, 0x80, 0xFF, - 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xAC, 0xAD, 0xA8, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA4, 0xFF, - 0xA8, 0xA9, 0xA2, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, - 0xA7, 0xA7, 0xA2, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, - 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x99, 0x99, 0x97, 0xFF, - 0x94, 0x94, 0x92, 0xFF, 0x95, 0x95, 0x93, 0xFF, 0x82, 0x83, 0x80, 0xFF, - 0x4E, 0x4E, 0x4C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, - 0x25, 0x28, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x17, 0x19, 0x18, 0xFF, - 0x17, 0x19, 0x18, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x16, 0x18, 0x17, 0xFF, - 0x18, 0x1A, 0x1A, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, - 0x21, 0x24, 0x23, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x4F, 0x51, 0x50, 0xFF, - 0xB3, 0xB6, 0xB2, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, - 0xE5, 0xE7, 0xDD, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xDB, 0xDC, 0xD5, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, - 0xCF, 0xD0, 0xCB, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x8F, 0x92, 0x8C, 0xFF, 0x72, 0x75, 0x6F, 0xFF, - 0x61, 0x65, 0x5F, 0xFF, 0x49, 0x4C, 0x46, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, - 0x51, 0x54, 0x4F, 0xFF, 0x7C, 0x7F, 0x7A, 0xFF, 0x8C, 0x90, 0x8A, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, - 0xA5, 0xA7, 0x9F, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, - 0xA4, 0xA5, 0xA0, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, - 0x9A, 0x9A, 0x98, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0x97, 0x98, 0x95, 0xFF, - 0x9B, 0x9B, 0x99, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x77, 0x77, 0x75, 0xFF, - 0x41, 0x42, 0x3F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x12, 0x15, 0x12, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, - 0x23, 0x25, 0x22, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x15, 0x17, 0x16, 0xFF, - 0x15, 0x17, 0x16, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x16, 0x18, 0x17, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, - 0x23, 0x25, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, - 0xBD, 0xC0, 0xBD, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, - 0xC4, 0xC4, 0xC0, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, 0x60, 0x63, 0x5E, 0xFF, - 0x52, 0x55, 0x50, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, - 0x58, 0x5B, 0x56, 0xFF, 0x83, 0x86, 0x81, 0xFF, 0x8A, 0x8D, 0x88, 0xFF, - 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0xA9, 0xAA, 0xA5, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA7, 0x9F, 0xFF, - 0xA3, 0xA4, 0x9D, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x99, 0x99, 0x94, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x94, 0x94, 0x92, 0xFF, - 0x90, 0x91, 0x8E, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, 0x87, 0x87, 0x85, 0xFF, - 0x87, 0x87, 0x85, 0xFF, 0x7B, 0x7C, 0x79, 0xFF, 0x68, 0x68, 0x66, 0xFF, - 0x3F, 0x3F, 0x3D, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0F, 0x12, 0x0E, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, - 0x21, 0x24, 0x21, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x15, 0x17, 0x16, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, - 0x20, 0x23, 0x22, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, 0x44, 0x47, 0x44, 0xFF, - 0xAF, 0xB2, 0xAF, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, - 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, - 0xB2, 0xB3, 0xAE, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, 0x53, 0x57, 0x51, 0xFF, - 0x48, 0x4B, 0x45, 0xFF, 0x35, 0x38, 0x33, 0xFF, 0x36, 0x39, 0x34, 0xFF, - 0x63, 0x66, 0x60, 0xFF, 0x8E, 0x91, 0x8B, 0xFF, 0x87, 0x8A, 0x84, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, - 0xA2, 0xA3, 0x9C, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, - 0xA1, 0xA1, 0x9D, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x92, 0x92, 0x90, 0xFF, - 0x87, 0x87, 0x85, 0xFF, 0x78, 0x78, 0x76, 0xFF, 0x6D, 0x6E, 0x6B, 0xFF, - 0x47, 0x47, 0x45, 0xFF, 0x45, 0x45, 0x43, 0xFF, 0x45, 0x45, 0x43, 0xFF, - 0x2D, 0x2E, 0x2B, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x07, 0x07, 0x05, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0C, 0x0F, 0x0C, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x17, 0x1A, 0x16, 0xFF, - 0x1D, 0x1F, 0x1C, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x10, 0x12, 0x11, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x16, 0x18, 0x17, 0xFF, - 0x16, 0x18, 0x17, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x37, 0x3A, 0x37, 0xFF, - 0x8E, 0x91, 0x8B, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, - 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, - 0xD2, 0xD3, 0xCC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x4B, 0x4E, 0x49, 0xFF, - 0x43, 0x46, 0x41, 0xFF, 0x30, 0x34, 0x2E, 0xFF, 0x34, 0x37, 0x32, 0xFF, - 0x6B, 0x6E, 0x68, 0xFF, 0x96, 0x99, 0x93, 0xFF, 0x84, 0x88, 0x82, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, - 0xA7, 0xA7, 0xA2, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0x9B, 0x9C, 0x95, 0xFF, - 0x8E, 0x8F, 0x88, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x61, 0x61, 0x5D, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x56, 0x57, 0x52, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x08, 0x08, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x26, 0x27, 0x24, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, - 0xCE, 0xCF, 0xC8, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xC8, 0xC9, 0xC2, 0xFF, - 0xCE, 0xCF, 0xC8, 0xFF, 0xC7, 0xC8, 0xC3, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0x99, 0x99, 0x94, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, - 0x63, 0x66, 0x60, 0xFF, 0x47, 0x4A, 0x44, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, - 0x31, 0x37, 0x30, 0xFF, 0x2B, 0x31, 0x2B, 0xFF, 0x2F, 0x34, 0x2E, 0xFF, - 0x60, 0x65, 0x5F, 0xFF, 0x7E, 0x84, 0x7D, 0xFF, 0x77, 0x7D, 0x76, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x66, 0x68, 0x60, 0xFF, - 0x50, 0x52, 0x4A, 0xFF, 0x46, 0x47, 0x40, 0xFF, 0x45, 0x45, 0x41, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x21, 0x21, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0xC5, 0xC6, 0xBF, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, - 0xD7, 0xD9, 0xD1, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x6B, 0x6E, 0x68, 0xFF, - 0x56, 0x59, 0x53, 0xFF, 0x4E, 0x51, 0x4B, 0xFF, 0x3B, 0x3E, 0x39, 0xFF, - 0x2A, 0x30, 0x29, 0xFF, 0x1F, 0x24, 0x1E, 0xFF, 0x30, 0x36, 0x2F, 0xFF, - 0x5C, 0x62, 0x5B, 0xFF, 0x7B, 0x80, 0x7A, 0xFF, 0x78, 0x7E, 0x77, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, - 0xA1, 0xA1, 0x9D, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, - 0x48, 0x49, 0x44, 0xFF, 0x48, 0x49, 0x42, 0xFF, 0x44, 0x45, 0x3D, 0xFF, - 0x49, 0x4B, 0x43, 0xFF, 0x57, 0x58, 0x51, 0xFF, 0x69, 0x6A, 0x65, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x42, 0x43, 0x3E, 0xFF, - 0x25, 0x26, 0x21, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0D, 0x0D, 0x0D, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x05, 0x05, 0x05, 0xFF, - 0x08, 0x08, 0x08, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x52, 0x52, 0x4D, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, - 0xDA, 0xDB, 0xD4, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, - 0xB9, 0xBA, 0xB3, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, - 0x82, 0x83, 0x7E, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x68, 0x6C, 0x66, 0xFF, - 0x53, 0x57, 0x51, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x32, 0x35, 0x2F, 0xFF, - 0x2B, 0x31, 0x2B, 0xFF, 0x28, 0x2D, 0x27, 0xFF, 0x29, 0x2F, 0x28, 0xFF, - 0x4C, 0x52, 0x4B, 0xFF, 0x6A, 0x70, 0x69, 0xFF, 0x71, 0x77, 0x70, 0xFF, - 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x9A, 0x9A, 0x96, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, - 0x53, 0x53, 0x4F, 0xFF, 0x40, 0x41, 0x3C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x54, 0x55, 0x50, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x68, 0x69, 0x62, 0xFF, - 0x7F, 0x80, 0x79, 0xFF, 0x94, 0x95, 0x8E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, - 0x6C, 0x6D, 0x68, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x24, 0x24, 0x22, 0xFF, 0x40, 0x40, 0x3E, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x73, 0x74, 0x6F, 0xFF, 0xB6, 0xB7, 0xB0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, - 0xD4, 0xD5, 0xCE, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, 0xCD, 0xCE, 0xC7, 0xFF, - 0xB3, 0xB4, 0xAD, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, 0x53, 0x57, 0x51, 0xFF, - 0x42, 0x45, 0x3F, 0xFF, 0x43, 0x46, 0x41, 0xFF, 0x33, 0x36, 0x30, 0xFF, - 0x24, 0x2A, 0x24, 0xFF, 0x1C, 0x22, 0x1B, 0xFF, 0x1B, 0x21, 0x1A, 0xFF, - 0x39, 0x3F, 0x39, 0xFF, 0x58, 0x5D, 0x57, 0xFF, 0x63, 0x69, 0x62, 0xFF, - 0xA7, 0xA7, 0xA2, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x79, 0x7A, 0x75, 0xFF, - 0x62, 0x63, 0x5E, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x45, 0x45, 0x41, 0xFF, - 0x49, 0x4A, 0x45, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, - 0x78, 0x79, 0x74, 0xFF, 0x8E, 0x8F, 0x88, 0xFF, 0x97, 0x99, 0x91, 0xFF, - 0xA0, 0xA1, 0x99, 0xFF, 0x99, 0x9A, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x84, 0x84, 0x80, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x63, 0x64, 0x5F, 0xFF, - 0x5A, 0x5A, 0x56, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x25, 0x26, 0x21, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x25, 0x26, 0x23, 0xFF, - 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, - 0x14, 0x13, 0x16, 0xFF, 0x1E, 0x1E, 0x20, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, - 0x11, 0x11, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x3B, 0x3C, 0x39, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x36, 0x36, 0x32, 0xFF, - 0x78, 0x79, 0x74, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, - 0xCB, 0xCB, 0xC7, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0x62, 0x62, 0x60, 0xFF, 0x66, 0x67, 0x64, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, - 0x72, 0x74, 0x71, 0xFF, 0x78, 0x7D, 0x79, 0xFF, 0x64, 0x6A, 0x66, 0xFF, - 0x3D, 0x42, 0x3E, 0xFF, 0x19, 0x21, 0x1C, 0xFF, 0x17, 0x1F, 0x1A, 0xFF, - 0x26, 0x2E, 0x29, 0xFF, 0x48, 0x50, 0x4B, 0xFF, 0x6A, 0x71, 0x6D, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, - 0x9A, 0x9A, 0x96, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x69, 0x6A, 0x65, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x36, 0x36, 0x32, 0xFF, - 0x4D, 0x4E, 0x49, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0x79, 0x7A, 0x75, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0x95, 0x96, 0x8F, 0xFF, 0x9A, 0x9B, 0x94, 0xFF, - 0x92, 0x93, 0x8B, 0xFF, 0x7F, 0x80, 0x79, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x69, 0x6A, 0x65, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x39, 0x3A, 0x35, 0xFF, 0x21, 0x21, 0x1D, 0xFF, - 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x09, 0x0A, 0x07, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, - 0x08, 0x08, 0x0A, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0xFF, - 0x15, 0x15, 0x17, 0xFF, 0x32, 0x32, 0x32, 0xFF, 0x46, 0x46, 0x46, 0xFF, - 0x82, 0x83, 0x80, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xC8, 0xC9, 0xC4, 0xFF, - 0xBA, 0xBB, 0xB6, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x88, 0x89, 0x86, 0xFF, 0x90, 0x91, 0x8E, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, - 0xA3, 0xA5, 0xA2, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, - 0x5C, 0x63, 0x5F, 0xFF, 0x43, 0x4B, 0x46, 0xFF, 0x30, 0x37, 0x32, 0xFF, - 0x2C, 0x34, 0x2F, 0xFF, 0x3A, 0x42, 0x3D, 0xFF, 0x56, 0x5E, 0x59, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, - 0x73, 0x74, 0x6F, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x44, 0x44, 0x3F, 0xFF, - 0x45, 0x45, 0x41, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x85, 0x86, 0x7F, 0xFF, 0x89, 0x8B, 0x83, 0xFF, - 0x7F, 0x80, 0x79, 0xFF, 0x6F, 0x70, 0x69, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, - 0x69, 0x6A, 0x65, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x63, 0x64, 0x5F, 0xFF, - 0x45, 0x45, 0x41, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, - 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x08, 0x08, 0x08, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x3A, 0x3A, 0x3A, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0xAD, 0xAE, 0xAB, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA5, 0x9F, 0xFF, - 0xA7, 0xAA, 0xA5, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, - 0xAE, 0xB1, 0xAE, 0xFF, 0xAE, 0xB1, 0xAE, 0xFF, 0xAB, 0xAE, 0xAA, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, - 0x8D, 0x94, 0x90, 0xFF, 0x6C, 0x74, 0x6F, 0xFF, 0x65, 0x6D, 0x68, 0xFF, - 0x41, 0x49, 0x44, 0xFF, 0x31, 0x38, 0x34, 0xFF, 0x32, 0x3A, 0x35, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, - 0x47, 0x48, 0x43, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x85, 0x86, 0x81, 0xFF, 0x80, 0x81, 0x7A, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, - 0x73, 0x74, 0x6D, 0xFF, 0x6D, 0x6F, 0x67, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, - 0x64, 0x65, 0x60, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x53, 0x53, 0x4F, 0xFF, - 0x3F, 0x40, 0x3B, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x3A, 0x3B, 0x36, 0xFF, 0x38, 0x38, 0x36, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0A, 0x0B, 0x08, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x1E, 0x1E, 0x1E, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x29, 0x29, 0x29, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, - 0xA0, 0xA0, 0x9D, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x56, 0x57, 0x52, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, - 0xB4, 0xB5, 0xB0, 0xFF, 0xBB, 0xBC, 0xB7, 0xFF, 0xB4, 0xB7, 0xB2, 0xFF, - 0xC1, 0xC4, 0xBE, 0xFF, 0xC4, 0xC8, 0xC2, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, - 0xB3, 0xB6, 0xB2, 0xFF, 0xB4, 0xB7, 0xB4, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, - 0xB4, 0xB9, 0xB5, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, - 0xA4, 0xAC, 0xA7, 0xFF, 0x8E, 0x96, 0x91, 0xFF, 0x79, 0x81, 0x7C, 0xFF, - 0x55, 0x5C, 0x58, 0xFF, 0x3B, 0x43, 0x3E, 0xFF, 0x35, 0x3D, 0x38, 0xFF, - 0x4D, 0x4E, 0x49, 0xFF, 0x58, 0x59, 0x54, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x76, 0x76, 0x72, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0xAB, 0xAC, 0xA7, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8D, 0x8E, 0x89, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x7D, 0x7E, 0x77, 0xFF, 0x77, 0x78, 0x71, 0xFF, - 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x65, 0xFF, - 0x62, 0x63, 0x5E, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, - 0x34, 0x35, 0x30, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x23, 0x24, 0x1F, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x76, 0x76, 0x72, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x32, 0x33, 0x2E, 0xFF, - 0x82, 0x83, 0x7E, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x05, 0x05, 0x01, 0xFF, - 0x08, 0x09, 0x04, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x16, 0x16, 0x16, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x25, 0x25, 0x25, 0xFF, - 0x09, 0x09, 0x09, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x7A, 0x7B, 0x78, 0xFF, - 0x88, 0x89, 0x86, 0xFF, 0x48, 0x49, 0x46, 0xFF, 0x66, 0x67, 0x62, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, - 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, - 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, - 0xB7, 0xBC, 0xB8, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0xB4, 0xB9, 0xB5, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xB9, 0xC1, 0xBC, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, - 0x8A, 0x92, 0x8D, 0xFF, 0x6B, 0x73, 0x6E, 0xFF, 0x51, 0x59, 0x54, 0xFF, - 0x74, 0x75, 0x70, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x90, 0x91, 0x8C, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, - 0xA3, 0xA4, 0x9F, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x87, 0x88, 0x83, 0xFF, - 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x74, 0x76, 0x6E, 0xFF, - 0x6D, 0x6F, 0x67, 0xFF, 0x68, 0x69, 0x62, 0xFF, 0x65, 0x66, 0x61, 0xFF, - 0x5E, 0x5F, 0x5A, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, - 0x09, 0x0A, 0x05, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x06, 0x06, 0x06, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, - 0x30, 0x30, 0x30, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, - 0x42, 0x42, 0x42, 0xFF, 0x70, 0x70, 0x6E, 0xFF, 0xAF, 0xAF, 0xAD, 0xFF, - 0x71, 0x71, 0x6F, 0xFF, 0x50, 0x51, 0x4E, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, - 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xBB, 0xFF, - 0xBB, 0xBE, 0xBB, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, - 0xB6, 0xBB, 0xB7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, - 0xBC, 0xC1, 0xBD, 0xFF, 0xB4, 0xBC, 0xB7, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, - 0xBF, 0xC6, 0xC2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0x98, 0xA0, 0x9B, 0xFF, 0x87, 0x8F, 0x8A, 0xFF, 0x73, 0x7B, 0x76, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, - 0xAA, 0xAB, 0xA6, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x79, 0x7A, 0x73, 0xFF, 0x73, 0x74, 0x6D, 0xFF, - 0x6C, 0x6D, 0x66, 0xFF, 0x66, 0x68, 0x60, 0xFF, 0x63, 0x64, 0x5F, 0xFF, - 0x5C, 0x5D, 0x58, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x48, 0x49, 0x44, 0xFF, - 0x2F, 0x2F, 0x2B, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, - 0x42, 0x43, 0x3E, 0xFF, 0x68, 0x68, 0x64, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, - 0x3B, 0x3D, 0x35, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x09, 0x02, 0xFF, - 0x2F, 0x30, 0x29, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x78, 0x79, 0x74, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x14, 0x15, 0x10, 0xFF, - 0x0C, 0x0C, 0x08, 0xFF, 0x09, 0x0A, 0x05, 0xFF, 0x08, 0x09, 0x04, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x2D, 0x2E, 0x2B, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0xA9, 0xA9, 0xA7, 0xFF, - 0x94, 0x94, 0x92, 0xFF, 0x8B, 0x8B, 0x89, 0xFF, 0x77, 0x77, 0x75, 0xFF, - 0x50, 0x51, 0x4E, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, - 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, - 0xB9, 0xBF, 0xBB, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xBE, 0xC5, 0xC0, 0xFF, 0xC2, 0xCA, 0xC5, 0xFF, - 0xBE, 0xC5, 0xC0, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, - 0xC3, 0xCB, 0xC6, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, - 0xA2, 0xA9, 0xA4, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, - 0xB1, 0xB2, 0xAD, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, - 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, 0x90, 0x91, 0x8C, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, - 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x71, 0xFF, 0x71, 0x72, 0x6B, 0xFF, - 0x6A, 0x6B, 0x64, 0xFF, 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, - 0x5A, 0x5A, 0x56, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x46, 0x47, 0x42, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x45, 0x45, 0x41, 0xFF, - 0x4B, 0x4B, 0x46, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, - 0x8E, 0x8F, 0x88, 0xFF, 0x55, 0x56, 0x4F, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, - 0x76, 0x76, 0x72, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x52, 0x52, 0x4D, 0xFF, - 0x03, 0x04, 0x00, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x08, 0x09, 0x04, 0xFF, 0x05, 0x05, 0x03, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x17, 0x18, 0x15, 0xFF, 0x44, 0x44, 0x42, 0xFF, 0x53, 0x53, 0x51, 0xFF, - 0x4C, 0x4C, 0x4A, 0xFF, 0x52, 0x52, 0x4F, 0xFF, 0x46, 0x46, 0x44, 0xFF, - 0x38, 0x38, 0x36, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, - 0xC0, 0xC1, 0xBC, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, - 0xBA, 0xBD, 0xB7, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, - 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, - 0xB6, 0xBD, 0xB8, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, - 0xBD, 0xC4, 0xBF, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC5, 0xCC, 0xC7, 0xFF, - 0xC8, 0xD0, 0xCB, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, - 0xAA, 0xB1, 0xAD, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x84, 0x84, 0x80, 0xFF, - 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, - 0x77, 0x78, 0x73, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, - 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x28, 0x28, 0x24, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x15, 0x16, 0x11, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x29, 0x2A, 0x25, 0xFF, - 0x48, 0x49, 0x44, 0xFF, 0x33, 0x34, 0x2F, 0xFF, 0x46, 0x47, 0x42, 0xFF, - 0x84, 0x84, 0x80, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x24, 0x24, 0x22, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x25, 0x26, 0x23, 0xFF, 0x39, 0x39, 0x37, 0xFF, 0x36, 0x36, 0x34, 0xFF, - 0x2F, 0x2F, 0x2D, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, 0x57, 0x58, 0x55, 0xFF, - 0x3D, 0x3D, 0x3B, 0xFF, 0x82, 0x83, 0x80, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, - 0xC6, 0xC6, 0xC4, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, - 0xC3, 0xC6, 0xC3, 0xFF, 0xBD, 0xC0, 0xBD, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xB9, 0xBF, 0xBB, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, - 0xCC, 0xD1, 0xCD, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, - 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, - 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, - 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, - 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x73, 0xFF, - 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, - 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x40, 0x41, 0x3C, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x33, 0x34, 0x2F, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x2A, 0x2A, 0x28, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1E, 0x1F, 0x1C, 0xFF, 0x2C, 0x2D, 0x2A, 0xFF, 0x4D, 0x4D, 0x4B, 0xFF, - 0x47, 0x47, 0x45, 0xFF, 0x42, 0x43, 0x40, 0xFF, 0x33, 0x34, 0x31, 0xFF, - 0x64, 0x65, 0x62, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0xB8, 0xB8, 0xB6, 0xFF, - 0xC0, 0xC1, 0xBE, 0xFF, 0xBA, 0xBD, 0xB9, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, - 0xC1, 0xC4, 0xC0, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xC4, 0xC9, 0xC5, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, - 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x74, 0x75, 0x70, 0xFF, - 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, - 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x29, 0x2A, 0x25, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x3E, 0x3E, 0x3A, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x32, 0x33, 0x2E, 0xFF, - 0x28, 0x28, 0x24, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1F, 0x20, 0x1D, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x2F, 0x2F, 0x2D, 0xFF, - 0x3F, 0x3F, 0x3D, 0xFF, 0x47, 0x47, 0x45, 0xFF, 0x55, 0x55, 0x53, 0xFF, - 0x92, 0x92, 0x90, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, - 0xB9, 0xBA, 0xB7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, - 0xBF, 0xC1, 0xBE, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, - 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, - 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x78, 0x79, 0x74, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x70, 0x71, 0x6C, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x69, 0x6A, 0x63, 0xFF, - 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, - 0x57, 0x58, 0x53, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x29, 0x29, 0x27, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x31, 0x32, 0x2D, 0xFF, - 0x34, 0x35, 0x32, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, - 0x21, 0x21, 0x1F, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, - 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x36, 0x36, 0x34, 0xFF, - 0x36, 0x36, 0x34, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x5D, 0x5E, 0x5B, 0xFF, - 0xB2, 0xB3, 0xB0, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAB, 0xAC, 0xA9, 0xFF, - 0xB4, 0xB5, 0xB2, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, - 0xBD, 0xC0, 0xBD, 0xFF, 0xB3, 0xB6, 0xB2, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, - 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, - 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, - 0xCA, 0xCF, 0xCB, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, - 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, - 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x63, 0xFF, - 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1B, 0x1B, 0x1B, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x25, 0x26, 0x23, 0xFF, - 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, - 0x2A, 0x2A, 0x28, 0xFF, 0x26, 0x26, 0x26, 0xFF, 0x23, 0x23, 0x23, 0xFF, - 0x1E, 0x20, 0x1F, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x1C, 0x1C, 0x1C, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x34, 0x34, 0x34, 0xFF, - 0x3A, 0x3A, 0x3A, 0xFF, 0x57, 0x57, 0x57, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xC5, 0xC5, 0xC5, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, - 0xBA, 0xBA, 0xBA, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, - 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, - 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x88, 0x89, 0x84, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x68, 0x69, 0x62, 0xFF, - 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, - 0x22, 0x22, 0x20, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x22, 0x22, 0x22, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, - 0x3F, 0x3F, 0x3F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, - 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x68, 0x69, 0x62, 0xFF, - 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, - 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x16, 0x16, 0x16, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1B, 0x1B, 0x19, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x21, 0x21, 0x21, 0xFF, - 0x20, 0x23, 0x22, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x44, 0x44, 0x44, 0xFF, - 0x3B, 0x3B, 0x3B, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, - 0xC8, 0xC8, 0xC8, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xCD, 0xD2, 0xD0, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x87, 0x88, 0x83, 0xFF, - 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x66, 0x68, 0x60, 0xFF, - 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, - 0x23, 0x25, 0x24, 0xFF, 0x25, 0x27, 0x26, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x44, 0x44, 0x44, 0xFF, - 0x4D, 0x4D, 0x4D, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, - 0xBD, 0xBD, 0xBD, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, - 0x1D, 0x1D, 0x1F, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x22, 0x21, 0x24, 0xFF, - 0x1E, 0x1E, 0x20, 0xFF, 0x13, 0x15, 0x17, 0xFF, 0x09, 0x0B, 0x0C, 0xFF, - 0x0B, 0x0D, 0x0F, 0xFF, 0x0F, 0x11, 0x12, 0xFF, 0x12, 0x14, 0x16, 0xFF, - 0x15, 0x17, 0x18, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, - 0x1D, 0x1D, 0x1D, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, - 0x50, 0x50, 0x50, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xCD, 0xCD, 0xCD, 0xFF, 0xCE, 0xCE, 0xCE, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, - 0xC2, 0xC2, 0xC2, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x34, 0x35, 0x30, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x16, 0x16, 0x18, 0xFF, - 0x1A, 0x19, 0x1C, 0xFF, 0x1D, 0x1D, 0x1F, 0xFF, 0x2D, 0x2D, 0x2F, 0xFF, - 0x31, 0x31, 0x33, 0xFF, 0x21, 0x23, 0x25, 0xFF, 0x11, 0x13, 0x15, 0xFF, - 0x09, 0x0B, 0x0C, 0xFF, 0x10, 0x12, 0x13, 0xFF, 0x16, 0x18, 0x19, 0xFF, - 0x19, 0x1B, 0x1D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, - 0x2B, 0x2B, 0x2B, 0xFF, 0x3B, 0x3B, 0x3B, 0xFF, 0x47, 0x47, 0x47, 0xFF, - 0x48, 0x48, 0x48, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, - 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xC5, 0xC5, 0xC5, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x37, 0x37, 0x33, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x32, 0x32, 0x32, 0xFF, - 0x36, 0x36, 0x36, 0xFF, 0x2C, 0x2E, 0x2D, 0xFF, 0x17, 0x19, 0x18, 0xFF, - 0x0B, 0x0E, 0x0D, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, - 0x24, 0x26, 0x25, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, - 0x3D, 0x3D, 0x3D, 0xFF, 0x49, 0x49, 0x49, 0xFF, 0x45, 0x45, 0x45, 0xFF, - 0x4E, 0x4E, 0x4E, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, - 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, - 0xC7, 0xC7, 0xC7, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, - 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, - 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, - 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, - 0x38, 0x39, 0x34, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, - 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, - 0x30, 0x30, 0x30, 0xFF, 0x26, 0x28, 0x28, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x28, 0x28, 0x28, 0xFF, - 0x30, 0x30, 0x30, 0xFF, 0x33, 0x33, 0x33, 0xFF, 0x26, 0x26, 0x26, 0xFF, - 0x48, 0x48, 0x48, 0xFF, 0x4C, 0x4C, 0x4C, 0xFF, 0x49, 0x49, 0x49, 0xFF, - 0x5D, 0x5D, 0x5D, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, - 0xCD, 0xCD, 0xCD, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xA2, 0xA3, 0x9E, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x99, 0x99, 0x94, 0xFF, - 0x95, 0x96, 0x91, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x37, 0x37, 0x33, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x0C, 0x0C, 0x08, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, - 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x08, 0x09, 0x06, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x14, 0x12, 0x13, 0xFF, 0x1B, 0x19, 0x1A, 0xFF, - 0x1A, 0x1A, 0x1A, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, - 0x2F, 0x2F, 0x2F, 0xFF, 0x2A, 0x2A, 0x2A, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x17, 0x17, 0x17, 0xFF, 0x19, 0x16, 0x17, 0xFF, 0x22, 0x20, 0x21, 0xFF, - 0x2D, 0x2D, 0x2D, 0xFF, 0x34, 0x34, 0x34, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, - 0x53, 0x53, 0x53, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, - 0x69, 0x69, 0x69, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, - 0xCE, 0xCE, 0xCE, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0x9B, 0x9C, 0x97, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, - 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x25, 0x22, 0x23, 0xFF, - 0x23, 0x23, 0x23, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x28, 0x28, 0x28, 0xFF, - 0x31, 0x31, 0x31, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x24, 0x24, 0x24, 0xFF, - 0x21, 0x1F, 0x1F, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x21, 0x1F, 0x1F, 0xFF, - 0x2A, 0x28, 0x29, 0xFF, 0x3E, 0x3E, 0x3E, 0xFF, 0x37, 0x37, 0x37, 0xFF, - 0x42, 0x42, 0x42, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x62, 0x62, 0x62, 0xFF, - 0x89, 0x89, 0x89, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, - 0xC6, 0xC6, 0xC6, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, - 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, - 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0C, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, - 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x15, 0x15, 0x13, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x28, 0x26, 0x24, 0xFF, - 0x26, 0x27, 0x24, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x28, 0x28, 0x26, 0xFF, - 0x2B, 0x2B, 0x29, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, - 0x2E, 0x2C, 0x2A, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, - 0x25, 0x22, 0x21, 0xFF, 0x36, 0x36, 0x36, 0xFF, 0x39, 0x39, 0x39, 0xFF, - 0x3E, 0x3E, 0x3E, 0xFF, 0x50, 0x50, 0x50, 0xFF, 0x80, 0x80, 0x80, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, - 0xBB, 0xBB, 0xBB, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, - 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, - 0xD0, 0xD2, 0xD2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xB0, 0xB1, 0xAC, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, - 0x94, 0x95, 0x90, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, - 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, - 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, - 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, - 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, 0x65, 0x66, 0x5F, 0xFF, - 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, - 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, - 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x15, 0x15, 0x13, 0xFF, - 0x13, 0x11, 0x0F, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x23, 0x21, 0x20, 0xFF, - 0x23, 0x21, 0x20, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x22, 0x20, 0x1F, 0xFF, - 0x22, 0x20, 0x1F, 0xFF, 0x27, 0x25, 0x23, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, - 0x37, 0x35, 0x34, 0xFF, 0x2A, 0x28, 0x27, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, - 0x21, 0x1F, 0x1D, 0xFF, 0x3C, 0x39, 0x3A, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, - 0x63, 0x63, 0x63, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0xB2, 0xB2, 0xB2, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xB7, 0xB7, 0xB7, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, - 0xCC, 0xCC, 0xCC, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCA, 0xCD, 0xCC, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC0, 0xC1, 0xBE, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xA5, 0xA6, 0xA3, 0xFF, - 0x9C, 0x9C, 0x9A, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, 0x99, 0x99, 0x97, 0xFF, - 0x94, 0x94, 0x92, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x8E, 0x90, 0x8D, 0xFF, - 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x82, 0x85, 0x82, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1A, 0x1A, 0x16, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, - 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1A, 0x18, 0x14, 0xFF, - 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, - 0x10, 0x0E, 0x0C, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, - 0x23, 0x21, 0x20, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, - 0x19, 0x17, 0x15, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x27, 0x23, 0x22, 0xFF, - 0x24, 0x1F, 0x1F, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x20, 0x1C, 0x1B, 0xFF, - 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x2B, 0x26, 0x26, 0xFF, - 0x3A, 0x35, 0x35, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x38, 0x33, 0x32, 0xFF, - 0x3D, 0x39, 0x38, 0xFF, 0x6A, 0x68, 0x69, 0xFF, 0x83, 0x80, 0x81, 0xFF, - 0x9B, 0x99, 0x9A, 0xFF, 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xC0, 0xC0, 0xC0, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xCE, 0xCE, 0xCE, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xD7, 0xD9, 0xD9, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xCE, 0xCE, 0xCC, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, - 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, - 0x97, 0x98, 0x95, 0xFF, 0x93, 0x93, 0x91, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, - 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, 0x84, 0x87, 0x84, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, - 0x1E, 0x1C, 0x18, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, - 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x19, 0x17, 0x13, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x13, 0x11, 0x0F, 0xFF, - 0x17, 0x15, 0x13, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x22, 0x20, 0x1F, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x22, 0x21, 0xFF, 0x2A, 0x25, 0x24, 0xFF, - 0x26, 0x22, 0x21, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, - 0x27, 0x23, 0x22, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x35, 0x31, 0x30, 0xFF, - 0x44, 0x40, 0x3F, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, 0x44, 0x40, 0x3F, 0xFF, - 0x51, 0x4D, 0x4C, 0xFF, 0x86, 0x84, 0x85, 0xFF, 0x95, 0x93, 0x94, 0xFF, - 0xAF, 0xAD, 0xAD, 0xFF, 0xAD, 0xAA, 0xAB, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, - 0xC1, 0xC1, 0xC1, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, - 0xC5, 0xC5, 0xC5, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, - 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, - 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xDB, 0xDB, 0xD9, 0xFF, 0xD5, 0xD5, 0xD3, 0xFF, 0xC7, 0xC7, 0xC5, 0xFF, - 0xB6, 0xB6, 0xB4, 0xFF, 0xA4, 0xA5, 0xA2, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, - 0x9B, 0x9B, 0x99, 0xFF, 0x96, 0x97, 0x94, 0xFF, 0x90, 0x93, 0x90, 0xFF, - 0x8E, 0x90, 0x8D, 0xFF, 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x22, 0x21, 0x1D, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, - 0x1C, 0x1B, 0x17, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x19, 0x17, 0x13, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, - 0x21, 0x1F, 0x1D, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, - 0x22, 0x20, 0x1F, 0xFF, 0x23, 0x21, 0x20, 0xFF, 0x25, 0x22, 0x21, 0xFF, - 0x26, 0x24, 0x22, 0xFF, 0x2A, 0x25, 0x24, 0xFF, 0x2D, 0x29, 0x28, 0xFF, - 0x2A, 0x25, 0x24, 0xFF, 0x25, 0x21, 0x20, 0xFF, 0x2B, 0x26, 0x26, 0xFF, - 0x31, 0x2C, 0x2B, 0xFF, 0x39, 0x34, 0x34, 0xFF, 0x44, 0x40, 0x3F, 0xFF, - 0x4D, 0x48, 0x47, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, - 0x50, 0x4C, 0x4B, 0xFF, 0x88, 0x85, 0x86, 0xFF, 0x97, 0x94, 0x95, 0xFF, - 0xAE, 0xAC, 0xAC, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, - 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, - 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, - 0xCB, 0xCE, 0xCD, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xDD, 0xDE, 0xDB, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, - 0xC8, 0xC9, 0xC6, 0xFF, 0xB1, 0xB1, 0xAF, 0xFF, 0xA0, 0xA0, 0x9D, 0xFF, - 0x9C, 0x9C, 0x9A, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x92, 0x95, 0x92, 0xFF, - 0x8F, 0x92, 0x8E, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, - 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, - 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, - 0x30, 0x31, 0x2C, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x25, 0x23, 0x1F, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x20, 0x1E, 0x1A, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1A, 0x18, 0x14, 0xFF, - 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x28, 0x26, 0x24, 0xFF, - 0x28, 0x26, 0x24, 0xFF, 0x26, 0x24, 0x22, 0xFF, 0x25, 0x22, 0x21, 0xFF, - 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, - 0x2C, 0x29, 0x28, 0xFF, 0x2C, 0x28, 0x27, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, - 0x2C, 0x28, 0x27, 0xFF, 0x27, 0x23, 0x22, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, - 0x36, 0x32, 0x31, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x4F, 0x4A, 0x4A, 0xFF, - 0x4E, 0x49, 0x48, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, 0x2B, 0x26, 0x26, 0xFF, - 0x3A, 0x35, 0x35, 0xFF, 0x9A, 0x98, 0x99, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, - 0xBB, 0xB8, 0xB9, 0xFF, 0xB8, 0xB6, 0xB7, 0xFF, 0x97, 0x97, 0x97, 0xFF, - 0x9E, 0x9E, 0x9E, 0xFF, 0xA9, 0xA9, 0xA9, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, - 0xBE, 0xBE, 0xBE, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xC9, 0xC9, 0xC9, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, - 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xD7, 0xD7, 0xD7, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, - 0xDC, 0xDC, 0xDC, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, - 0x9F, 0xA2, 0xA1, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0x96, 0x98, 0x97, 0xFF, - 0x91, 0x94, 0x93, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x80, 0x82, 0x7F, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, - 0x73, 0x76, 0x72, 0xFF, 0x6F, 0x73, 0x6D, 0xFF, 0x71, 0x74, 0x6E, 0xFF, - 0x67, 0x6A, 0x65, 0xFF, 0x59, 0x5C, 0x57, 0xFF, 0x55, 0x56, 0x51, 0xFF, - 0x4B, 0x4B, 0x46, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x33, 0x34, 0x2F, 0xFF, - 0x2B, 0x2C, 0x27, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, - 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, - 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x27, 0x26, 0x1F, 0xFF, - 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, - 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, 0x23, 0x1F, 0x19, 0xFF, - 0x21, 0x1E, 0x18, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x13, 0x12, 0x0B, 0xFF, - 0x14, 0x13, 0x0D, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x33, 0x31, 0x2D, 0xFF, - 0x2E, 0x2C, 0x28, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x35, 0x33, 0x2F, 0xFF, 0x38, 0x37, 0x33, 0xFF, - 0x31, 0x30, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, - 0x2A, 0x26, 0x22, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x35, 0x31, 0x2E, 0xFF, - 0x41, 0x3D, 0x3A, 0xFF, 0x47, 0x43, 0x3F, 0xFF, 0x46, 0x42, 0x3E, 0xFF, - 0x33, 0x2E, 0x2E, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x2C, 0x28, 0x27, 0xFF, - 0x52, 0x4E, 0x4D, 0xFF, 0x93, 0x91, 0x90, 0xFF, 0xA0, 0x9E, 0x9C, 0xFF, - 0xA7, 0xA5, 0xA3, 0xFF, 0xA5, 0xA3, 0xA1, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xB6, 0xB6, 0xB6, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, - 0xC9, 0xC9, 0xC9, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, - 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xE1, 0xE1, 0xE1, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, - 0xD3, 0xD3, 0xD3, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, - 0xAB, 0xAD, 0xAC, 0xFF, 0xA0, 0xA3, 0xA2, 0xFF, 0x8E, 0x90, 0x8F, 0xFF, - 0x8A, 0x8D, 0x8C, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x82, 0x86, 0x85, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, - 0x74, 0x77, 0x74, 0xFF, 0x6A, 0x6D, 0x67, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, - 0x66, 0x69, 0x64, 0xFF, 0x5A, 0x5E, 0x58, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, - 0x41, 0x42, 0x3D, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x23, 0x24, 0x1F, 0xFF, - 0x2C, 0x2D, 0x28, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, - 0x1C, 0x1D, 0x18, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, - 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x23, 0x22, 0x1C, 0xFF, - 0x28, 0x27, 0x20, 0xFF, 0x2A, 0x29, 0x23, 0xFF, 0x2A, 0x29, 0x23, 0xFF, - 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, 0x24, 0x20, 0x1B, 0xFF, - 0x21, 0x1E, 0x18, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x17, 0x15, 0x0F, 0xFF, - 0x1F, 0x1D, 0x17, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, - 0x2E, 0x2C, 0x28, 0xFF, 0x2C, 0x2A, 0x26, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x2A, 0x29, 0x25, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x34, 0x32, 0x2E, 0xFF, - 0x31, 0x30, 0x2C, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x2B, 0x27, 0x24, 0xFF, - 0x2C, 0x28, 0x25, 0xFF, 0x31, 0x2D, 0x29, 0xFF, 0x44, 0x40, 0x3D, 0xFF, - 0x4B, 0x47, 0x44, 0xFF, 0x4A, 0x46, 0x43, 0xFF, 0x40, 0x3C, 0x39, 0xFF, - 0x2B, 0x26, 0x26, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x36, 0x32, 0x31, 0xFF, - 0x5D, 0x58, 0x58, 0xFF, 0x89, 0x87, 0x85, 0xFF, 0x97, 0x95, 0x93, 0xFF, - 0xA1, 0x9F, 0x9D, 0xFF, 0xA1, 0x9F, 0x9D, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xB0, 0xB0, 0xB0, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xD4, 0xD4, 0xD4, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, - 0xE0, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, - 0xAF, 0xB2, 0xB1, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, - 0x92, 0x95, 0x94, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x7C, 0x7F, 0x7C, 0xFF, 0x79, 0x7B, 0x78, 0xFF, 0x74, 0x77, 0x74, 0xFF, - 0x6B, 0x6D, 0x6A, 0xFF, 0x56, 0x59, 0x53, 0xFF, 0x5C, 0x5F, 0x59, 0xFF, - 0x5A, 0x5E, 0x58, 0xFF, 0x51, 0x54, 0x4F, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, - 0x48, 0x49, 0x44, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x42, 0x43, 0x3E, 0xFF, - 0x32, 0x33, 0x2E, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, - 0x16, 0x17, 0x12, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, - 0x1C, 0x1B, 0x15, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x20, 0x1F, 0x18, 0xFF, - 0x23, 0x22, 0x1C, 0xFF, 0x28, 0x27, 0x20, 0xFF, 0x28, 0x27, 0x20, 0xFF, - 0x2C, 0x28, 0x23, 0xFF, 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, - 0x23, 0x1F, 0x19, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x21, 0x20, 0x19, 0xFF, - 0x28, 0x27, 0x20, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x28, 0x26, 0x22, 0xFF, - 0x2F, 0x2D, 0x29, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x29, 0x28, 0x24, 0xFF, - 0x2D, 0x2B, 0x27, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, - 0x33, 0x31, 0x2D, 0xFF, 0x27, 0x23, 0x20, 0xFF, 0x28, 0x24, 0x21, 0xFF, - 0x34, 0x30, 0x2D, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x48, 0x44, 0x41, 0xFF, - 0x4A, 0x46, 0x43, 0xFF, 0x44, 0x40, 0x3D, 0xFF, 0x36, 0x32, 0x2F, 0xFF, - 0x1E, 0x1A, 0x19, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x43, 0x3F, 0x3E, 0xFF, - 0x6C, 0x68, 0x67, 0xFF, 0x83, 0x81, 0x7F, 0xFF, 0x94, 0x92, 0x91, 0xFF, - 0xA3, 0xA1, 0xA0, 0xFF, 0xA6, 0xA4, 0xA2, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, - 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, - 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, - 0xD6, 0xD6, 0xD6, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, - 0xBF, 0xC1, 0xC0, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0x8F, 0x91, 0x90, 0xFF, - 0x8A, 0x8D, 0x8C, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x80, 0x85, 0x84, 0xFF, - 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x66, 0x69, 0x66, 0xFF, - 0x59, 0x5C, 0x59, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x66, 0x69, 0x64, 0xFF, - 0x67, 0x6A, 0x65, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, - 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, - 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, - 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, - 0x1B, 0x1A, 0x14, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, - 0x1F, 0x1D, 0x17, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x27, 0x24, 0x1E, 0xFF, - 0x2C, 0x28, 0x23, 0xFF, 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, - 0x24, 0x20, 0x1B, 0xFF, 0x2D, 0x29, 0x24, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, - 0x29, 0x28, 0x22, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x2F, 0x2D, 0x29, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, - 0x2F, 0x2D, 0x29, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x29, 0x28, 0x24, 0xFF, - 0x32, 0x2E, 0x2B, 0xFF, 0x2B, 0x27, 0x24, 0xFF, 0x2E, 0x2A, 0x27, 0xFF, - 0x3D, 0x39, 0x36, 0xFF, 0x52, 0x4E, 0x4B, 0xFF, 0x3D, 0x39, 0x36, 0xFF, - 0x41, 0x3D, 0x3A, 0xFF, 0x3D, 0x39, 0x36, 0xFF, 0x35, 0x31, 0x2E, 0xFF, - 0x1A, 0x16, 0x15, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, - 0x7B, 0x77, 0x76, 0xFF, 0x86, 0x84, 0x83, 0xFF, 0x9A, 0x98, 0x97, 0xFF, - 0xAD, 0xAB, 0xA9, 0xFF, 0xB1, 0xAF, 0xAE, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, - 0xB6, 0xB6, 0xB6, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xE1, 0xE0, 0xE3, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE5, 0xE5, 0xE7, 0xFF, - 0xE3, 0xE3, 0xE5, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xD5, 0xD5, 0xD7, 0xFF, - 0xB8, 0xBA, 0xBB, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x7E, 0x82, 0x83, 0xFF, - 0x78, 0x7D, 0x7D, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x73, 0x74, 0xFF, - 0x5D, 0x62, 0x61, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, - 0x5D, 0x62, 0x61, 0xFF, 0x6D, 0x70, 0x6D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, - 0x6D, 0x70, 0x6D, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x68, 0x68, 0x66, 0xFF, - 0x4B, 0x4B, 0x48, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, - 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x16, 0x10, 0xFF, - 0x19, 0x16, 0x10, 0xFF, 0x1C, 0x18, 0x12, 0xFF, 0x1D, 0x19, 0x14, 0xFF, - 0x2B, 0x25, 0x22, 0xFF, 0x2E, 0x27, 0x25, 0xFF, 0x29, 0x22, 0x20, 0xFF, - 0x23, 0x1D, 0x1A, 0xFF, 0x3B, 0x37, 0x34, 0xFF, 0x35, 0x31, 0x2E, 0xFF, - 0x27, 0x23, 0x20, 0xFF, 0x1C, 0x18, 0x14, 0xFF, 0x23, 0x1E, 0x1D, 0xFF, - 0x3B, 0x37, 0x36, 0xFF, 0x40, 0x3B, 0x3B, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, - 0x32, 0x2D, 0x2D, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, - 0x3D, 0x39, 0x38, 0xFF, 0x40, 0x39, 0x39, 0xFF, 0x40, 0x39, 0x39, 0xFF, - 0x3F, 0x38, 0x38, 0xFF, 0x3F, 0x38, 0x38, 0xFF, 0x31, 0x2A, 0x2A, 0xFF, - 0x3F, 0x38, 0x38, 0xFF, 0x3C, 0x38, 0x37, 0xFF, 0x2D, 0x29, 0x28, 0xFF, - 0x22, 0x1B, 0x1B, 0xFF, 0x3C, 0x35, 0x35, 0xFF, 0x72, 0x6D, 0x6D, 0xFF, - 0x96, 0x91, 0x91, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, 0xA4, 0x9F, 0xA1, 0xFF, - 0xA8, 0xA6, 0xA7, 0xFF, 0xA9, 0xA7, 0xA8, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, - 0x9B, 0x99, 0x9A, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, - 0xB4, 0xB4, 0xB4, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, - 0x9D, 0x9D, 0x9D, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, - 0xC7, 0xC7, 0xC7, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xDC, 0xDC, 0xDE, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, - 0xDB, 0xDA, 0xDD, 0xFF, 0xC9, 0xC9, 0xCB, 0xFF, 0xBD, 0xBC, 0xBF, 0xFF, - 0xA1, 0xA3, 0xA5, 0xFF, 0x8B, 0x8D, 0x8F, 0xFF, 0x84, 0x88, 0x89, 0xFF, - 0x7B, 0x7F, 0x80, 0xFF, 0x74, 0x7B, 0x7B, 0xFF, 0x6B, 0x72, 0x72, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x6F, 0x74, 0x72, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x5A, 0x5D, 0x5A, 0xFF, - 0x66, 0x69, 0x66, 0xFF, 0x76, 0x79, 0x76, 0xFF, 0x73, 0x74, 0x71, 0xFF, - 0x5A, 0x5A, 0x58, 0xFF, 0x41, 0x42, 0x3F, 0xFF, 0x36, 0x36, 0x34, 0xFF, - 0x33, 0x34, 0x2F, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x22, 0x23, 0x1E, 0xFF, - 0x15, 0x16, 0x11, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, - 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x16, 0x12, 0x0D, 0xFF, - 0x17, 0x13, 0x0E, 0xFF, 0x18, 0x14, 0x0F, 0xFF, 0x19, 0x16, 0x10, 0xFF, - 0x1E, 0x18, 0x16, 0xFF, 0x24, 0x1E, 0x1B, 0xFF, 0x28, 0x21, 0x1F, 0xFF, - 0x27, 0x20, 0x1E, 0xFF, 0x33, 0x2F, 0x2C, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, - 0x27, 0x23, 0x20, 0xFF, 0x1F, 0x1B, 0x18, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, - 0x41, 0x3C, 0x3C, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x38, 0x33, 0x32, 0xFF, - 0x3D, 0x39, 0x38, 0xFF, 0x41, 0x3C, 0x3C, 0xFF, 0x49, 0x45, 0x44, 0xFF, - 0x52, 0x4E, 0x4D, 0xFF, 0x4D, 0x46, 0x46, 0xFF, 0x45, 0x3E, 0x3E, 0xFF, - 0x39, 0x32, 0x32, 0xFF, 0x30, 0x29, 0x29, 0xFF, 0x35, 0x2E, 0x2E, 0xFF, - 0x3A, 0x34, 0x34, 0xFF, 0x34, 0x30, 0x2F, 0xFF, 0x26, 0x22, 0x21, 0xFF, - 0x28, 0x21, 0x21, 0xFF, 0x4C, 0x45, 0x45, 0xFF, 0x7F, 0x7A, 0x79, 0xFF, - 0x98, 0x94, 0x93, 0xFF, 0xA5, 0xA0, 0xA2, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, - 0x97, 0x94, 0x95, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x98, 0x95, 0x96, 0xFF, - 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xBF, 0xBF, 0xBF, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, - 0x9C, 0x9C, 0x9C, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, - 0xC9, 0xCB, 0xCB, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xDF, 0xE1, 0xE3, 0xFF, 0xD2, 0xD4, 0xD6, 0xFF, 0xBD, 0xBF, 0xC1, 0xFF, - 0xAB, 0xAD, 0xAE, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x9D, 0x9F, 0xA0, 0xFF, - 0xA6, 0xA8, 0xAA, 0xFF, 0xAF, 0xB3, 0xB4, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7B, 0x83, 0x80, 0xFF, - 0x6B, 0x70, 0x6F, 0xFF, 0x74, 0x79, 0x75, 0xFF, 0x74, 0x79, 0x75, 0xFF, - 0x6B, 0x71, 0x6D, 0xFF, 0x5C, 0x61, 0x5D, 0xFF, 0x5F, 0x64, 0x60, 0xFF, - 0x63, 0x68, 0x64, 0xFF, 0x6A, 0x6C, 0x69, 0xFF, 0x65, 0x68, 0x64, 0xFF, - 0x63, 0x65, 0x62, 0xFF, 0x4F, 0x52, 0x4E, 0xFF, 0x37, 0x3A, 0x37, 0xFF, - 0x3B, 0x3C, 0x37, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, - 0x1D, 0x1E, 0x19, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, - 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x19, 0x16, 0x10, 0xFF, - 0x18, 0x14, 0x0F, 0xFF, 0x16, 0x12, 0x0D, 0xFF, 0x17, 0x13, 0x0E, 0xFF, - 0x19, 0x12, 0x10, 0xFF, 0x20, 0x19, 0x17, 0xFF, 0x26, 0x22, 0x1F, 0xFF, - 0x2C, 0x28, 0x25, 0xFF, 0x38, 0x34, 0x30, 0xFF, 0x34, 0x30, 0x2D, 0xFF, - 0x2A, 0x29, 0x25, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x2F, 0x2D, 0x2B, 0xFF, - 0x3E, 0x3C, 0x3B, 0xFF, 0x42, 0x40, 0x3E, 0xFF, 0x3E, 0x3C, 0x3B, 0xFF, - 0x3D, 0x3B, 0x39, 0xFF, 0x44, 0x42, 0x40, 0xFF, 0x49, 0x47, 0x45, 0xFF, - 0x4B, 0x47, 0x46, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x38, 0x33, 0x32, 0xFF, - 0x30, 0x29, 0x29, 0xFF, 0x2A, 0x23, 0x23, 0xFF, 0x37, 0x30, 0x30, 0xFF, - 0x39, 0x32, 0x32, 0xFF, 0x35, 0x31, 0x30, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, - 0x40, 0x39, 0x39, 0xFF, 0x69, 0x62, 0x62, 0xFF, 0x8F, 0x8A, 0x8A, 0xFF, - 0x9B, 0x96, 0x95, 0xFF, 0xA1, 0x9F, 0xA0, 0xFF, 0x8E, 0x8C, 0x8D, 0xFF, - 0x84, 0x82, 0x82, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x99, 0x97, 0x97, 0xFF, - 0xA6, 0xA3, 0xA4, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, - 0xB6, 0xB6, 0xB6, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, - 0x9D, 0x9D, 0x9D, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, - 0xB9, 0xB9, 0xB9, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xA4, 0xA6, 0xA7, 0xFF, 0xAC, 0xAE, 0xB0, 0xFF, 0xB6, 0xB8, 0xBA, 0xFF, - 0xBB, 0xBD, 0xBF, 0xFF, 0xB8, 0xBA, 0xBB, 0xFF, 0xAB, 0xAD, 0xAE, 0xFF, - 0xA4, 0xA9, 0xAA, 0xFF, 0xAA, 0xAF, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, - 0x67, 0x6C, 0x68, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x6F, 0x74, 0x70, 0xFF, - 0x67, 0x6C, 0x68, 0xFF, 0x4F, 0x55, 0x51, 0xFF, 0x56, 0x5C, 0x58, 0xFF, - 0x4F, 0x55, 0x51, 0xFF, 0x40, 0x46, 0x42, 0xFF, 0x5D, 0x60, 0x5C, 0xFF, - 0x7B, 0x7E, 0x7B, 0xFF, 0x7E, 0x81, 0x7E, 0xFF, 0x6B, 0x6D, 0x6A, 0xFF, - 0x41, 0x42, 0x3D, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, 0x30, 0x31, 0x2C, 0xFF, - 0x23, 0x24, 0x1F, 0xFF, 0x21, 0x20, 0x19, 0xFF, 0x21, 0x20, 0x19, 0xFF, - 0x21, 0x20, 0x19, 0xFF, 0x22, 0x21, 0x1B, 0xFF, 0x1D, 0x19, 0x14, 0xFF, - 0x1C, 0x18, 0x12, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x18, 0x14, 0x0F, 0xFF, - 0x1B, 0x14, 0x12, 0xFF, 0x1E, 0x18, 0x16, 0xFF, 0x26, 0x22, 0x1F, 0xFF, - 0x2F, 0x2B, 0x28, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x3D, 0x39, 0x36, 0xFF, - 0x2E, 0x2C, 0x28, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, - 0x33, 0x30, 0x2F, 0xFF, 0x3D, 0x3B, 0x39, 0xFF, 0x42, 0x40, 0x3E, 0xFF, - 0x33, 0x30, 0x2F, 0xFF, 0x38, 0x36, 0x35, 0xFF, 0x34, 0x32, 0x30, 0xFF, - 0x28, 0x26, 0x24, 0xFF, 0x1C, 0x17, 0x16, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, - 0x2A, 0x25, 0x24, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, 0x35, 0x31, 0x30, 0xFF, - 0x39, 0x34, 0x34, 0xFF, 0x3F, 0x3D, 0x3C, 0xFF, 0x47, 0x45, 0x44, 0xFF, - 0x68, 0x64, 0x63, 0xFF, 0x89, 0x85, 0x84, 0xFF, 0x9A, 0x98, 0x97, 0xFF, - 0x98, 0x96, 0x94, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x81, 0x7E, 0x7F, 0xFF, - 0x79, 0x79, 0x79, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, - 0xAF, 0xAD, 0xAD, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, - 0x9D, 0x9D, 0x9D, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x99, 0x99, 0x99, 0xFF, - 0xA1, 0xA1, 0xA1, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, - 0xAD, 0xAD, 0xAD, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, - 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC3, 0xC3, 0xFF, 0xB4, 0xB8, 0xB9, 0xFF, 0xB1, 0xB6, 0xB6, 0xFF, - 0xB7, 0xBC, 0xBC, 0xFF, 0xBB, 0xBF, 0xC0, 0xFF, 0xA8, 0xAC, 0xAD, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0x8F, 0x97, 0x92, 0xFF, - 0x69, 0x70, 0x6D, 0xFF, 0x5E, 0x65, 0x63, 0xFF, 0x5A, 0x61, 0x5E, 0xFF, - 0x5D, 0x64, 0x62, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, - 0x5B, 0x60, 0x5E, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, - 0x64, 0x66, 0x65, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x87, 0x89, 0x86, 0xFF, - 0x61, 0x64, 0x61, 0xFF, 0x40, 0x42, 0x3F, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, - 0x24, 0x25, 0x20, 0xFF, 0x15, 0x14, 0x10, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, - 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1C, 0x18, 0x14, 0xFF, - 0x27, 0x23, 0x20, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x25, 0x21, 0x1E, 0xFF, - 0x21, 0x1D, 0x1A, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, - 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, - 0x1B, 0x19, 0x18, 0xFF, 0x1B, 0x19, 0x18, 0xFF, 0x17, 0x15, 0x13, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, - 0x26, 0x27, 0x24, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x33, 0x34, 0x31, 0xFF, - 0x32, 0x32, 0x30, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, 0x68, 0x6B, 0x68, 0xFF, - 0x78, 0x78, 0x76, 0xFF, 0x8E, 0x8E, 0x8C, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, - 0x97, 0x98, 0x95, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x80, 0x80, 0x80, 0xFF, - 0x85, 0x85, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x9B, 0x9B, 0x9B, 0xFF, - 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0x97, 0x97, 0x97, 0xFF, - 0x8E, 0x8E, 0x8E, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, - 0xA1, 0xA1, 0xA1, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, - 0xAD, 0xAD, 0xAD, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, - 0xCD, 0xCF, 0xCE, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, - 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xB4, 0xB8, 0xB9, 0xFF, 0xB5, 0xB9, 0xBA, 0xFF, 0xBC, 0xC0, 0xC1, 0xFF, - 0xC2, 0xC6, 0xC7, 0xFF, 0xB9, 0xBE, 0xBF, 0xFF, 0xA9, 0xAE, 0xAE, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x94, 0x9B, 0x97, 0xFF, - 0x81, 0x88, 0x86, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, - 0x80, 0x87, 0x85, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, - 0x5D, 0x5F, 0x5E, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, - 0x7D, 0x80, 0x7D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, 0x43, 0x46, 0x41, 0xFF, - 0x2D, 0x2E, 0x29, 0xFF, 0x17, 0x15, 0x11, 0xFF, 0x22, 0x21, 0x1D, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x28, 0x26, 0x22, 0xFF, - 0x27, 0x25, 0x21, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x26, 0x24, 0x20, 0xFF, - 0x33, 0x2F, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x26, 0x22, 0x1F, 0xFF, - 0x21, 0x1D, 0x1A, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x14, 0x13, 0x0F, 0xFF, - 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x12, 0x11, 0xFF, - 0x18, 0x16, 0x14, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x11, 0x0F, 0x0D, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x13, 0x11, 0x0F, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x23, 0x25, 0x22, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x2E, 0x31, 0x2E, 0xFF, - 0x44, 0x47, 0x44, 0xFF, 0x69, 0x6E, 0x6A, 0xFF, 0x7F, 0x84, 0x80, 0xFF, - 0x81, 0x84, 0x80, 0xFF, 0x85, 0x88, 0x85, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, - 0x92, 0x95, 0x92, 0xFF, 0x7A, 0x7A, 0x7A, 0xFF, 0x76, 0x76, 0x76, 0xFF, - 0x7A, 0x7A, 0x7A, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, - 0x90, 0x90, 0x90, 0xFF, 0x93, 0x93, 0x93, 0xFF, 0x94, 0x94, 0x94, 0xFF, - 0x8F, 0x8F, 0x8F, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, - 0xB1, 0xB1, 0xB1, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, - 0xA3, 0xA3, 0xA3, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xCA, 0xCD, 0xCC, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xD1, 0xD4, 0xD3, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, - 0xB2, 0xB9, 0xB9, 0xFF, 0xBB, 0xC2, 0xC2, 0xFF, 0xC2, 0xC9, 0xC9, 0xFF, - 0xC0, 0xC7, 0xC7, 0xFF, 0xB4, 0xBB, 0xBB, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, - 0x8E, 0x96, 0x91, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x7B, 0x83, 0x7E, 0xFF, - 0x78, 0x7F, 0x7B, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, - 0x72, 0x79, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, - 0x62, 0x67, 0x65, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, 0x62, 0x67, 0x63, 0xFF, - 0x83, 0x86, 0x83, 0xFF, 0x8B, 0x8E, 0x8B, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, - 0x3D, 0x3D, 0x39, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x23, 0x22, 0x1E, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x2A, 0x29, 0x25, 0xFF, - 0x2C, 0x2A, 0x26, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, - 0x39, 0x35, 0x32, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, - 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0C, 0x0A, 0x06, 0xFF, - 0x10, 0x11, 0x0C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, - 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x16, 0x17, 0x14, 0xFF, - 0x1F, 0x22, 0x1F, 0xFF, 0x27, 0x2A, 0x27, 0xFF, 0x36, 0x39, 0x36, 0xFF, - 0x4C, 0x4F, 0x4C, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x85, 0x8A, 0x86, 0xFF, - 0x7C, 0x7F, 0x7C, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, - 0x7B, 0x7E, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x6F, 0x72, 0x71, 0xFF, - 0x74, 0x76, 0x76, 0xFF, 0x7E, 0x81, 0x80, 0xFF, 0x89, 0x89, 0x89, 0xFF, - 0x8E, 0x8E, 0x8E, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, - 0xA9, 0xA9, 0xA9, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, - 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, - 0xAA, 0xAA, 0xAA, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xD5, 0xD7, 0xD6, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xBD, 0xC3, 0xC3, 0xFF, 0xC6, 0xCD, 0xCD, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, - 0xB7, 0xBE, 0xBD, 0xFF, 0xB3, 0xBA, 0xBA, 0xFF, 0xAB, 0xB2, 0xB2, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x93, 0x9A, 0x97, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, - 0xA4, 0xAC, 0xA7, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA4, 0xAC, 0xA5, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0x97, 0x9F, 0x9A, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, - 0x8C, 0x93, 0x8E, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x82, 0x8A, 0x87, 0xFF, - 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, - 0x68, 0x6D, 0x6B, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, - 0x79, 0x7B, 0x78, 0xFF, 0x91, 0x94, 0x91, 0xFF, 0x88, 0x8B, 0x85, 0xFF, - 0x58, 0x5B, 0x56, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x25, 0x23, 0x1F, 0xFF, - 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, - 0x29, 0x28, 0x24, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, - 0x36, 0x32, 0x2F, 0xFF, 0x23, 0x1F, 0x1B, 0xFF, 0x12, 0x10, 0x0C, 0xFF, - 0x0D, 0x0C, 0x08, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0B, 0x09, 0x05, 0xFF, - 0x0F, 0x10, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, - 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, - 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x1D, 0x1F, 0x1C, 0xFF, 0x24, 0x26, 0x23, 0xFF, 0x2F, 0x32, 0x2F, 0xFF, - 0x34, 0x37, 0x34, 0xFF, 0x43, 0x48, 0x44, 0xFF, 0x58, 0x5D, 0x59, 0xFF, - 0x6C, 0x6F, 0x6B, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6F, 0x72, 0x6F, 0xFF, - 0x5E, 0x61, 0x5D, 0xFF, 0x7A, 0x7C, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, - 0x79, 0x7B, 0x7A, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, - 0x95, 0x95, 0x95, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, - 0xB0, 0xB0, 0xB0, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, - 0xB2, 0xB2, 0xB2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, - 0xA7, 0xA6, 0xA7, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, - 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xAF, 0xB5, 0xB5, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, - 0xAF, 0xB5, 0xB5, 0xFF, 0xB0, 0xB7, 0xB6, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0xB1, 0xB8, 0xB4, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0x8E, 0x96, 0x91, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, - 0x93, 0x9A, 0x95, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0x87, 0x8E, 0x8C, 0xFF, - 0x7F, 0x86, 0x84, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, - 0x72, 0x77, 0x78, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x52, 0x57, 0x55, 0xFF, - 0x6F, 0x72, 0x6F, 0xFF, 0x93, 0x96, 0x93, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, - 0x75, 0x78, 0x75, 0xFF, 0x24, 0x24, 0x22, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x1D, 0x1D, 0x1B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x28, 0x26, 0x24, 0xFF, - 0x23, 0x21, 0x20, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x26, 0x24, 0x22, 0xFF, - 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, - 0x17, 0x19, 0x18, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x24, 0x26, 0x25, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x1D, 0x22, 0x21, 0xFF, - 0x3C, 0x3F, 0x3E, 0xFF, 0x51, 0x53, 0x53, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, - 0x64, 0x66, 0x65, 0xFF, 0x78, 0x7A, 0x79, 0xFF, 0x7E, 0x81, 0x80, 0xFF, - 0x84, 0x87, 0x86, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x87, 0x89, 0x88, 0xFF, - 0x96, 0x98, 0x97, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, - 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, - 0xAD, 0xAF, 0xAF, 0xFF, 0xD2, 0xD5, 0xD4, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xA8, 0xAB, 0xAA, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xD5, 0xDA, 0xD9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xA8, 0xAE, 0xAE, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, 0xB2, 0xB9, 0xB9, 0xFF, - 0xBB, 0xC2, 0xC2, 0xFF, 0xB6, 0xBC, 0xBC, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x93, 0x9A, 0x95, 0xFF, - 0x9D, 0xA5, 0xA0, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, - 0x95, 0x9D, 0x98, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x9C, 0xA4, 0x9F, 0xFF, - 0x98, 0xA0, 0x9B, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x94, 0x9B, 0x99, 0xFF, - 0x82, 0x8A, 0x87, 0xFF, 0x74, 0x7C, 0x79, 0xFF, 0x78, 0x7D, 0x7D, 0xFF, - 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x5D, 0x62, 0x61, 0xFF, - 0x7A, 0x7D, 0x79, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x98, 0x9B, 0x98, 0xFF, - 0x83, 0x86, 0x83, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, - 0x1C, 0x1C, 0x1A, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, - 0x1C, 0x1A, 0x19, 0xFF, 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x24, 0x22, 0xFF, - 0x2A, 0x28, 0x27, 0xFF, 0x15, 0x13, 0x12, 0xFF, 0x09, 0x07, 0x05, 0xFF, - 0x10, 0x0E, 0x0C, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, - 0x16, 0x18, 0x17, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x13, 0x16, 0x15, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0D, 0x12, 0x10, 0xFF, - 0x1E, 0x20, 0x1F, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x51, 0x53, 0x53, 0xFF, - 0x6A, 0x6C, 0x6B, 0xFF, 0x76, 0x79, 0x78, 0xFF, 0x82, 0x84, 0x84, 0xFF, - 0x8C, 0x8F, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0x92, 0x95, 0x94, 0xFF, - 0x9C, 0x9E, 0x9D, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, - 0xAA, 0xAC, 0xAB, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, - 0xBD, 0xC0, 0xBF, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, - 0xCF, 0xD1, 0xD0, 0xFF, 0xD9, 0xDC, 0xDB, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, - 0xD2, 0xD5, 0xD4, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, - 0xCD, 0xD4, 0xD2, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xAB, 0xB2, 0xB2, 0xFF, 0xA5, 0xAC, 0xAC, 0xFF, 0xAD, 0xB4, 0xB4, 0xFF, - 0xBF, 0xC6, 0xC6, 0xFF, 0xBE, 0xC5, 0xC4, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x9D, 0xA5, 0xA0, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, - 0xB4, 0xBC, 0xB7, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x87, 0x8E, 0x8C, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, - 0x75, 0x79, 0x7A, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, - 0x76, 0x79, 0x76, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x90, 0x93, 0x90, 0xFF, - 0x96, 0x99, 0x95, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x19, 0x17, 0x15, 0xFF, - 0x1A, 0x18, 0x16, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x2C, 0x29, 0x28, 0xFF, - 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, - 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x09, 0x0B, 0x0A, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x03, 0x07, 0x06, 0xFF, - 0x10, 0x12, 0x11, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x43, 0x46, 0x45, 0xFF, - 0x66, 0x68, 0x68, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x7C, 0x7F, 0x7E, 0xFF, - 0x8B, 0x8E, 0x8D, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, - 0xA8, 0xAB, 0xAA, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, - 0x93, 0x96, 0x95, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, - 0xA7, 0xAA, 0xA9, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, - 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xB8, 0xBF, 0xBF, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, - 0xB8, 0xBF, 0xBF, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xAA, 0xB1, 0xAD, 0xFF, - 0x9A, 0xA1, 0x9C, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0x96, 0x9E, 0x99, 0xFF, - 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0xA8, 0xAF, 0xAA, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0x8F, 0x96, 0x94, 0xFF, 0x82, 0x8A, 0x87, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, - 0x72, 0x77, 0x78, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6F, 0x74, 0x72, 0xFF, - 0x6E, 0x71, 0x6E, 0xFF, 0x66, 0x69, 0x66, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, - 0x97, 0x9A, 0x97, 0xFF, 0x32, 0x32, 0x30, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, - 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x19, 0x17, 0x15, 0xFF, - 0x1C, 0x1A, 0x19, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x35, 0x33, 0x31, 0xFF, - 0x3F, 0x3D, 0x3C, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0A, 0x08, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, - 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, - 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, - 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x18, 0x18, 0x18, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x08, 0x0A, 0x09, 0xFF, - 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x01, 0x06, 0x05, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x33, 0x35, 0x34, 0xFF, - 0x4E, 0x50, 0x4F, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, 0x72, 0x74, 0x73, 0xFF, - 0x84, 0x87, 0x86, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, - 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, - 0x95, 0x97, 0x96, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, - 0xC6, 0xC8, 0xC7, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, 0xA4, 0xAC, 0xA7, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x70, 0x75, 0x73, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, - 0x70, 0x75, 0x73, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x75, 0x7A, 0x76, 0xFF, - 0x7A, 0x7D, 0x79, 0xFF, 0x37, 0x3A, 0x37, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x14, 0x14, 0x12, 0xFF, - 0x07, 0x07, 0x05, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x45, 0x45, 0x43, 0xFF, - 0x7C, 0x79, 0x7A, 0xFF, 0x4C, 0x4A, 0x4B, 0xFF, 0x47, 0x47, 0x47, 0xFF, - 0x29, 0x29, 0x29, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, - 0x14, 0x14, 0x14, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x01, 0x01, 0x01, 0xFF, - 0x10, 0x10, 0x10, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, - 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, - 0x2B, 0x2B, 0x2B, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, - 0x12, 0x15, 0x14, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, - 0x01, 0x03, 0x02, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0C, 0x11, 0x0F, 0xFF, - 0x00, 0x00, 0x00, 0xFF, 0x27, 0x2C, 0x2A, 0xFF, 0x46, 0x4B, 0x49, 0xFF, - 0x58, 0x5C, 0x5B, 0xFF, 0x49, 0x4D, 0x4C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, - 0x72, 0x77, 0x76, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x9A, 0x9D, 0x9C, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, - 0xAF, 0xB2, 0xB1, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, 0x95, 0x97, 0x96, 0xFF, - 0x8B, 0x8E, 0x8D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, - 0xAE, 0xB1, 0xB0, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xAC, 0xB4, 0xAF, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x7F, 0x84, 0x82, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, - 0x63, 0x68, 0x66, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x6D, 0x72, 0x6E, 0xFF, - 0x70, 0x75, 0x71, 0xFF, 0x35, 0x38, 0x35, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, - 0x1A, 0x1D, 0x1A, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, 0x23, 0x23, 0x21, 0xFF, - 0x13, 0x13, 0x11, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, - 0x8A, 0x87, 0x88, 0xFF, 0x6E, 0x6B, 0x6C, 0xFF, 0x8B, 0x8B, 0x8B, 0xFF, - 0x9A, 0x9A, 0x9A, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x96, 0x96, 0x96, 0xFF, - 0x78, 0x78, 0x78, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x30, 0x30, 0x30, 0xFF, - 0x24, 0x24, 0x24, 0xFF, 0x25, 0x25, 0x25, 0xFF, 0x31, 0x31, 0x31, 0xFF, - 0x4F, 0x4F, 0x4F, 0xFF, 0x65, 0x65, 0x65, 0xFF, 0x77, 0x77, 0x77, 0xFF, - 0x79, 0x79, 0x79, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, - 0x53, 0x56, 0x55, 0xFF, 0x3A, 0x3C, 0x3B, 0xFF, 0x15, 0x17, 0x16, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x24, 0x29, 0x28, 0xFF, 0x03, 0x07, 0x06, 0xFF, - 0x2F, 0x34, 0x32, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x4A, 0x4E, 0x4D, 0xFF, - 0x69, 0x6E, 0x6C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, - 0x66, 0x6A, 0x69, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, 0x8F, 0x91, 0x90, 0xFF, - 0x93, 0x96, 0x95, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xA1, 0xA4, 0xA3, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, - 0xA3, 0xA5, 0xA4, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, - 0x63, 0x68, 0x66, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x66, 0x6B, 0x67, 0xFF, - 0x6B, 0x71, 0x6D, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x19, 0x1C, 0x19, 0xFF, - 0x19, 0x1C, 0x19, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, - 0x14, 0x14, 0x12, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x71, 0x71, 0x6F, 0xFF, - 0x97, 0x94, 0x95, 0xFF, 0x7F, 0x7D, 0x7E, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, - 0xAB, 0xAB, 0xAB, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, - 0x9E, 0x9E, 0x9E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, - 0x8D, 0x8D, 0x8D, 0xFF, 0x88, 0x88, 0x88, 0xFF, 0x82, 0x82, 0x82, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x86, 0x86, 0x86, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x78, 0x78, 0x78, 0xFF, - 0x71, 0x73, 0x72, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x88, 0x8A, 0x89, 0xFF, - 0x66, 0x68, 0x68, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, 0x76, 0x7B, 0x79, 0xFF, - 0x5F, 0x63, 0x62, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x7E, 0x83, 0x81, 0xFF, - 0x76, 0x7B, 0x79, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, - 0x82, 0x86, 0x85, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, - 0x89, 0x8B, 0x8B, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, - 0xB2, 0xB4, 0xB3, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0x88, 0x8F, 0x8D, 0xFF, 0x89, 0x90, 0x8E, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x84, 0x89, 0x87, 0xFF, - 0x76, 0x7B, 0x79, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6E, 0x73, 0x6F, 0xFF, - 0x6F, 0x74, 0x70, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, - 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x29, 0x29, 0x27, 0xFF, - 0x1F, 0x20, 0x1D, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x77, 0x77, 0x75, 0xFF, - 0x8A, 0x87, 0x88, 0xFF, 0x8C, 0x8A, 0x8B, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0xAA, 0xAA, 0xAA, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, - 0xB7, 0xB7, 0xB7, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, - 0x70, 0x70, 0x70, 0xFF, 0x68, 0x68, 0x68, 0xFF, 0x77, 0x77, 0x77, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, - 0x88, 0x88, 0x88, 0xFF, 0x86, 0x86, 0x86, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, - 0x7A, 0x7C, 0x7B, 0xFF, 0x82, 0x84, 0x84, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0x6D, 0x6F, 0x6F, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x75, 0x7A, 0x78, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x7C, 0x81, 0x7F, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, - 0x97, 0x99, 0x99, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, - 0xAD, 0xAF, 0xAF, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, - 0xBC, 0xBF, 0xBE, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, - 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x9B, 0xA0, 0x9E, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0x79, 0x7E, 0x7D, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x77, 0x7C, 0x7A, 0xFF, - 0x71, 0x76, 0x74, 0xFF, 0x27, 0x2A, 0x29, 0xFF, 0x16, 0x18, 0x17, 0xFF, - 0x0E, 0x10, 0x0F, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, - 0x1F, 0x21, 0x21, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, 0x76, 0x76, 0x76, 0xFF, - 0x87, 0x87, 0x87, 0xFF, 0x9C, 0x9C, 0x9C, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, - 0x9E, 0x9E, 0x9E, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, - 0x96, 0x96, 0x96, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0x72, 0x72, 0x72, 0xFF, - 0x76, 0x76, 0x76, 0xFF, 0x7B, 0x7B, 0x7B, 0xFF, 0x86, 0x86, 0x86, 0xFF, - 0x77, 0x77, 0x77, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, - 0x9A, 0x9A, 0x9A, 0xFF, 0x94, 0x94, 0x94, 0xFF, 0x92, 0x92, 0x92, 0xFF, - 0x8F, 0x91, 0x90, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, - 0xA5, 0xA7, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xDE, 0xE2, 0xE1, 0xFF, 0xDC, 0xE1, 0xE0, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0x9D, 0xA4, 0xA2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, - 0x62, 0x67, 0x65, 0xFF, 0x2B, 0x2D, 0x2C, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, - 0x0F, 0x11, 0x10, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, - 0x17, 0x19, 0x18, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x73, 0x75, 0x74, 0xFF, - 0x8C, 0x8C, 0x8C, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, - 0x90, 0x90, 0x90, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0x99, 0x99, 0x99, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x6B, 0x6B, 0x6B, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, - 0x7E, 0x7E, 0x7E, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x79, 0x79, 0x79, 0xFF, - 0x8C, 0x8C, 0x8C, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, - 0x85, 0x85, 0x85, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, - 0xAB, 0xAD, 0xAC, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, - 0xC3, 0xC6, 0xC5, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x71, 0x76, 0x74, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0x85, 0x8A, 0x88, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x55, 0x5A, 0x58, 0xFF, - 0x4E, 0x53, 0x52, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x1F, 0x21, 0x21, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x2B, 0x30, 0x2F, 0xFF, - 0x1B, 0x20, 0x1E, 0xFF, 0x29, 0x2E, 0x2C, 0xFF, 0x6F, 0x72, 0x71, 0xFF, - 0x9F, 0xA2, 0xA1, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xA7, 0xAA, 0xA9, 0xFF, 0x64, 0x64, 0x64, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, - 0x6F, 0x6F, 0x6F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x72, 0x72, 0x72, 0xFF, - 0x7D, 0x7D, 0x7D, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0x95, 0x95, 0x95, 0xFF, - 0x8E, 0x90, 0x8F, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, - 0x96, 0x98, 0x97, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, - 0xB4, 0xB6, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x79, 0x7B, 0x7A, 0xFF, - 0xA7, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0x89, 0x8D, 0x8C, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x5F, 0x63, 0x62, 0xFF, 0x47, 0x4C, 0x4B, 0xFF, - 0x3F, 0x44, 0x42, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x20, 0x23, 0x22, 0xFF, - 0x11, 0x13, 0x13, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x26, 0x2A, 0x29, 0xFF, - 0x1F, 0x23, 0x22, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x9F, 0xA2, 0xA1, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x85, 0x88, 0x87, 0xFF, - 0x67, 0x6A, 0x69, 0xFF, 0x61, 0x61, 0x61, 0xFF, 0x62, 0x62, 0x62, 0xFF, - 0x69, 0x69, 0x69, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x72, 0x72, 0x72, 0xFF, - 0x7F, 0x7F, 0x7F, 0xFF, 0x92, 0x92, 0x92, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, - 0x9A, 0x9D, 0x9C, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, - 0xA0, 0xA3, 0xA2, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xAE, 0xB1, 0xB0, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x85, 0x88, 0x87, 0xFF, - 0x90, 0x92, 0x92, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0x85, 0x8A, 0x88, 0xFF, - 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0x9C, 0xA3, 0xA1, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x34, 0x38, 0x37, 0xFF, - 0x24, 0x29, 0x28, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, - 0x0E, 0x13, 0x11, 0xFF, 0x28, 0x2D, 0x2B, 0xFF, 0x26, 0x2A, 0x29, 0xFF, - 0x23, 0x28, 0x26, 0xFF, 0x6E, 0x73, 0x71, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x74, 0x76, 0x76, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, 0x49, 0x4B, 0x4B, 0xFF, - 0x56, 0x58, 0x57, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, - 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, - 0x83, 0x86, 0x85, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x85, 0x8A, 0x88, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xD0, 0xD8, 0xD5, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xDA, 0xE1, 0xDE, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x53, 0x58, 0x56, 0xFF, 0x2A, 0x2F, 0x2D, 0xFF, - 0x19, 0x1E, 0x1C, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x0F, 0x14, 0x13, 0xFF, - 0x14, 0x19, 0x17, 0xFF, 0x20, 0x25, 0x23, 0xFF, 0x21, 0x26, 0x24, 0xFF, - 0x28, 0x2D, 0x2B, 0xFF, 0x55, 0x5A, 0x58, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, - 0x4E, 0x50, 0x4F, 0xFF, 0x56, 0x58, 0x57, 0xFF, 0x53, 0x56, 0x55, 0xFF, - 0x50, 0x52, 0x52, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x65, 0x67, 0x66, 0xFF, - 0x72, 0x74, 0x73, 0xFF, 0x74, 0x76, 0x76, 0xFF, 0x6E, 0x71, 0x70, 0xFF, - 0x8C, 0x8F, 0x8E, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xB1, 0xB3, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x95, 0x9A, 0x99, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x8D, 0x92, 0x90, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, - 0xD6, 0xDD, 0xDB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x5C, 0x61, 0x5F, 0xFF, 0x32, 0x37, 0x36, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, - 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x15, 0x1A, 0x18, 0xFF, - 0x1A, 0x1F, 0x1D, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x25, 0x2C, 0x2A, 0xFF, - 0x26, 0x2E, 0x2B, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x3F, 0x44, 0x42, 0xFF, - 0x40, 0x45, 0x44, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, - 0x53, 0x58, 0x56, 0xFF, 0x71, 0x73, 0x72, 0xFF, 0x74, 0x76, 0x76, 0xFF, - 0x75, 0x78, 0x77, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x74, 0x76, 0x76, 0xFF, - 0x9C, 0x9E, 0x9D, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD4, 0xDB, 0xD9, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCC, 0xD3, 0xD0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x30, 0x35, 0x33, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0F, 0x14, 0x13, 0xFF, - 0x0A, 0x0E, 0x0D, 0xFF, 0x0E, 0x13, 0x11, 0xFF, 0x1D, 0x22, 0x21, 0xFF, - 0x1D, 0x22, 0x21, 0xFF, 0x1A, 0x1F, 0x1D, 0xFF, 0x2B, 0x32, 0x30, 0xFF, - 0x23, 0x2A, 0x28, 0xFF, 0x3A, 0x41, 0x3F, 0xFF, 0x57, 0x5E, 0x5C, 0xFF, - 0x5A, 0x5F, 0x5D, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, 0x6D, 0x71, 0x70, 0xFF, - 0x82, 0x86, 0x85, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x80, 0x82, 0x81, 0xFF, - 0x78, 0x7A, 0x79, 0xFF, 0x89, 0x8B, 0x8B, 0xFF, 0x78, 0x7A, 0x79, 0xFF, - 0xA5, 0xA7, 0xA7, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, - 0x16, 0x1B, 0x1A, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, - 0x08, 0x0D, 0x0C, 0xFF, 0x07, 0x0C, 0x0A, 0xFF, 0x0D, 0x12, 0x10, 0xFF, - 0x08, 0x0D, 0x0C, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0E, 0x15, 0x13, 0xFF, - 0x25, 0x2C, 0x2A, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x5F, 0x67, 0x64, 0xFF, - 0x6A, 0x6F, 0x6D, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x82, 0x84, 0x84, 0xFF, - 0x92, 0x95, 0x94, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, - 0x93, 0x96, 0x95, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x59, 0x5E, 0x5C, 0xFF, - 0x1A, 0x1F, 0x1D, 0xFF, 0x0F, 0x14, 0x13, 0xFF, 0x13, 0x18, 0x16, 0xFF, - 0x0C, 0x11, 0x0F, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, - 0x07, 0x0C, 0x0A, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0F, 0x16, 0x14, 0xFF, - 0x46, 0x4D, 0x4B, 0xFF, 0x61, 0x68, 0x65, 0xFF, 0x6B, 0x72, 0x70, 0xFF, - 0x6F, 0x74, 0x72, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, - 0x9A, 0x9D, 0x9C, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0x9A, 0x9D, 0x9C, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xD1, 0xD9, 0xD6, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xC7, 0xCE, 0xCC, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xCC, 0xD3, 0xD0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, - 0x22, 0x27, 0x25, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, - 0x13, 0x18, 0x16, 0xFF, 0x04, 0x09, 0x07, 0xFF, 0x0E, 0x13, 0x11, 0xFF, - 0x0F, 0x14, 0x13, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x35, 0x32, 0xFF, - 0x6B, 0x72, 0x70, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, 0x7F, 0x86, 0x84, 0xFF, - 0x80, 0x85, 0x84, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, - 0xA3, 0xA5, 0xA4, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xD5, 0xDC, 0xDA, 0xFF, 0xD6, 0xDD, 0xDB, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCD, 0xD4, 0xD2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0x29, 0x2E, 0x2C, 0xFF, 0x1C, 0x21, 0x1F, 0xFF, 0x1D, 0x22, 0x21, 0xFF, - 0x14, 0x19, 0x17, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x14, 0x19, 0x17, 0xFF, - 0x19, 0x1E, 0x1C, 0xFF, 0x1F, 0x23, 0x22, 0xFF, 0x61, 0x68, 0x65, 0xFF, - 0x7E, 0x85, 0x82, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, - 0x8E, 0x90, 0x8F, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, - 0xAA, 0xAC, 0xAB, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x9B, 0xA0, 0x9E, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0x93, 0x98, 0x96, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xDA, 0xE1, 0xDE, 0xFF, - 0xD0, 0xD8, 0xD5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xDC, 0xE1, 0xE0, 0xFF, 0xD9, 0xDE, 0xDC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC7, 0xCE, 0xCC, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xD8, 0xE0, 0xDD, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x79, 0x7E, 0x7D, 0xFF, 0x36, 0x3B, 0x39, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, - 0x1B, 0x20, 0x1E, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x31, 0x30, 0xFF, - 0x3B, 0x3F, 0x3E, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x7D, 0x82, 0x80, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xDE, 0xE2, 0xE1, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xD9, 0xDE, 0xDC, 0xFF, 0xD8, 0xDD, 0xDB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xCC, 0xD3, 0xD0, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xD1, 0xD9, 0xD6, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xD2, 0xD7, 0xD5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x89, 0x8D, 0x8C, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0x82, 0x86, 0x85, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, - 0x67, 0x6C, 0x6A, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, - 0x68, 0x6D, 0x6B, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, - 0x84, 0x89, 0x87, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x95, 0x9A, 0x99, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xD9, 0xDE, 0xDC, 0xFF, 0xDB, 0xE0, 0xDE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, - 0x7C, 0x81, 0x7F, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x7D, 0x82, 0x80, 0xFF, - 0x84, 0x89, 0x87, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, - 0xD8, 0xDD, 0xDB, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x91, 0x96, 0x94, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xCA, 0xCF, 0xCD, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xDB, 0xE0, 0xDE, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xD3, 0xD8, 0xD6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x82, 0x86, 0x85, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x9B, 0xA0, 0x9E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x8B, 0x90, 0x8E, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0x7D, 0x82, 0x80, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0x8C, 0x91, 0x8F, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0x91, 0x96, 0x94, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, - 0xD1, 0xD6, 0xD4, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x8D, 0x92, 0x90, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x8E, 0x95, 0x93, 0xFF, 0x82, 0x8A, 0x87, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, - 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0x9A, 0xA1, 0x9E, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0x9F, 0xA7, 0xA4, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x83, 0x88, 0x86, 0xFF, - 0x88, 0x8F, 0x8D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x83, 0x8B, 0x88, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, - 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, - 0xAE, 0xB1, 0xB0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xCB, 0xD0, 0xCE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x8A, 0x8F, 0x8D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0x89, 0x8D, 0x8C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0x97, 0x9E, 0x9C, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, - 0xD8, 0xE2, 0xDE, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0x80, 0x89, 0x86, 0xFF, - 0xAF, 0xB9, 0xB6, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, - 0xCB, 0xD5, 0xD2, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xD5, 0xDE, 0xDB, 0xFF, - 0xB3, 0xBC, 0xB9, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x90, 0x99, 0x96, 0xFF, - 0x8F, 0x98, 0x95, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, - 0x9D, 0xA6, 0xA3, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0x8E, 0x95, 0x93, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, - 0xAC, 0xAE, 0xAD, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0x97, 0x9B, 0x9A, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x72, 0x77, 0x76, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0x71, 0x76, 0x74, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, - 0x86, 0x8D, 0x8B, 0xFF, 0x81, 0x88, 0x86, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0xD5, 0xDE, 0xDB, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x92, 0x9C, 0x99, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, - 0x8D, 0x97, 0x94, 0xFF, 0x8B, 0x95, 0x92, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xBA, 0xC3, 0xC0, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, - 0x9A, 0xA4, 0xA1, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, - 0x8A, 0x92, 0x8F, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, - 0xAC, 0xAE, 0xAD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, - 0x8B, 0x90, 0x8E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, - 0x77, 0x7C, 0x7A, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x80, 0x85, 0x84, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x87, 0x90, 0x8D, 0xFF, 0x85, 0x8F, 0x8C, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, - 0xC8, 0xD4, 0xD0, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, - 0xBE, 0xCA, 0xC6, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0x79, 0x85, 0x81, 0xFF, - 0x9C, 0xA8, 0xA4, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, - 0xD2, 0xDE, 0xDA, 0xFF, 0xD6, 0xE2, 0xDE, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, - 0x96, 0xA2, 0x9E, 0xFF, 0x76, 0x82, 0x7E, 0xFF, 0x9A, 0xA6, 0xA2, 0xFF, - 0xAB, 0xB7, 0xB3, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, - 0x9F, 0xAB, 0xA7, 0xFF, 0xA1, 0xAD, 0xA9, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, - 0x91, 0x99, 0x96, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0xA5, 0xAC, 0xAA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB5, 0xB8, 0xB7, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, - 0xAC, 0xAE, 0xAD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x93, 0x98, 0x96, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x84, 0x89, 0x87, 0xFF, - 0x72, 0x77, 0x76, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x7F, 0x84, 0x82, 0xFF, - 0x7F, 0x84, 0x82, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xA0, 0xA5, 0xA3, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, - 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, - 0x99, 0xA3, 0xA0, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, - 0xC0, 0xCC, 0xC8, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, - 0xCC, 0xD8, 0xD4, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, - 0xA7, 0xB3, 0xAF, 0xFF, 0xC3, 0xCF, 0xCB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, - 0x9A, 0xA6, 0xA2, 0xFF, 0x73, 0x7F, 0x7B, 0xFF, 0x88, 0x94, 0x90, 0xFF, - 0x9A, 0xA6, 0xA2, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, 0xA7, 0xB3, 0xAF, 0xFF, - 0xAA, 0xB6, 0xB2, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, - 0xA8, 0xAF, 0xAA, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x95, 0x9D, 0x98, 0xFF, - 0x9B, 0xA2, 0x9D, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, - 0xC4, 0xC9, 0xC5, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, - 0xC6, 0xC8, 0xC5, 0xFF, 0xAF, 0xB2, 0xAF, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, - 0x9F, 0xA4, 0xA0, 0xFF, 0x82, 0x87, 0x83, 0xFF, 0x75, 0x7A, 0x76, 0xFF, - 0x8E, 0x94, 0x90, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x91, 0x96, 0x94, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x7E, 0x83, 0x81, 0xFF, - 0x76, 0x7B, 0x79, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x7E, 0x83, 0x81, 0xFF, - 0x86, 0x8B, 0x89, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x89, 0x90, 0x8E, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, - 0x8D, 0x97, 0x94, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA4, 0xA0, 0xFF, - 0x8A, 0x96, 0x92, 0xFF, 0x8E, 0x9A, 0x96, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, - 0xD4, 0xE0, 0xDC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, - 0xC1, 0xCE, 0xC9, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, - 0xC5, 0xD1, 0xCD, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, - 0x9F, 0xAB, 0xA7, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x7B, 0x84, 0x81, 0xFF, - 0x90, 0x99, 0x96, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0x9B, 0xA5, 0xA2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, - 0xA2, 0xA9, 0xA4, 0xFF, 0xB1, 0xB6, 0xB2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC8, 0xCB, 0xC7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, - 0xC0, 0xC2, 0xBF, 0xFF, 0xA0, 0xA3, 0xA0, 0xFF, 0x87, 0x8D, 0x89, 0xFF, - 0x91, 0x96, 0x92, 0xFF, 0x80, 0x86, 0x82, 0xFF, 0x80, 0x86, 0x82, 0xFF, - 0x90, 0x95, 0x91, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x83, 0x88, 0x86, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x92, 0x97, 0x95, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x86, 0x8B, 0x89, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0x8C, 0x93, 0x90, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x91, 0x9D, 0x99, 0xFF, - 0x79, 0x85, 0x81, 0xFF, 0x91, 0x9D, 0x99, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, - 0xCC, 0xD8, 0xD4, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, - 0xC8, 0xD4, 0xD0, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, - 0xC3, 0xCF, 0xCB, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, - 0xA0, 0xAC, 0xA8, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, 0x82, 0x8B, 0x88, 0xFF, - 0x84, 0x8E, 0x8B, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0xA0, 0xAA, 0xA7, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0xAB, 0xB3, 0xAE, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0xAB, 0xB3, 0xAE, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, - 0xA0, 0xA5, 0xA1, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, 0xA8, 0xAB, 0xA8, 0xFF, - 0x9F, 0xA2, 0x9F, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x75, 0x7A, 0x76, 0xFF, - 0x80, 0x86, 0x82, 0xFF, 0x77, 0x7C, 0x78, 0xFF, 0x89, 0x8E, 0x8A, 0xFF, - 0x8B, 0x90, 0x8C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0x9F, 0xA3, 0xA2, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, - 0x7E, 0x83, 0x81, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, - 0xB4, 0xB8, 0xB7, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB6, 0xBB, 0xB9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, - 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, - 0xA8, 0xB2, 0xAF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, - 0xA2, 0xAE, 0xAA, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xD2, 0xDE, 0xDA, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, - 0xAC, 0xB9, 0xB4, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0x85, 0x8F, 0x8C, 0xFF, 0x91, 0x9B, 0x97, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, - 0x9B, 0xA5, 0xA2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, - 0xA6, 0xAE, 0xA9, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, - 0xB2, 0xBA, 0xB5, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, 0x98, 0x9D, 0x99, 0xFF, - 0x97, 0x9C, 0x98, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xC5, 0xCA, 0xC6, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, 0x99, 0x9C, 0x99, 0xFF, - 0x97, 0x9A, 0x97, 0xFF, 0x95, 0x97, 0x94, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, - 0x98, 0x9D, 0x99, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, - 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0x8E, 0x93, 0x92, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x80, 0x85, 0x84, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, - 0xC9, 0xCD, 0xCC, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xAA, 0xAF, 0xAD, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, - 0xCE, 0xD3, 0xD2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0xA0, 0xAA, 0xA7, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, - 0xB6, 0xC2, 0xBE, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, - 0xCB, 0xD7, 0xD3, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, - 0xB6, 0xC2, 0xBE, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0x98, 0xA2, 0x9E, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x8B, 0x95, 0x92, 0xFF, - 0x91, 0x9B, 0x97, 0xFF, 0xA2, 0xAC, 0xA9, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, - 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, - 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, - 0xAE, 0xB3, 0xAF, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, - 0xB6, 0xBB, 0xB7, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, - 0x97, 0x9C, 0x98, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, 0x90, 0x95, 0x91, 0xFF, - 0x84, 0x89, 0x83, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, - 0xA7, 0xAC, 0xA6, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, - 0x99, 0x9E, 0x9A, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8A, 0x8F, 0x8B, 0xFF, - 0x90, 0x95, 0x91, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x97, 0x9C, 0x98, 0xFF, - 0x9A, 0x9F, 0x9B, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x9D, 0xA4, 0xA2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xCF, 0xD6, 0xD4, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, - 0xB3, 0xBC, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xD4, 0xE0, 0xDC, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, - 0xBC, 0xC6, 0xC2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, - 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, - 0x9A, 0xA1, 0x9C, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, - 0xA4, 0xAA, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xB6, 0xBC, 0xB5, 0xFF, - 0xAB, 0xB1, 0xAD, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, - 0x71, 0x77, 0x70, 0xFF, 0x7E, 0x83, 0x7F, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, - 0x98, 0x9D, 0x97, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, - 0x99, 0x9E, 0x98, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x82, 0x87, 0x81, 0xFF, - 0x86, 0x8B, 0x87, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, 0x91, 0x96, 0x92, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x94, 0x99, 0x95, 0xFF, - 0x9F, 0xA4, 0xA0, 0xFF, 0xA8, 0xAD, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, - 0xC7, 0xCC, 0xCB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, - 0xD2, 0xDE, 0xDA, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xAA, 0xB6, 0xB2, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, - 0xB7, 0xC1, 0xBE, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xB9, 0xC2, 0xBF, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, - 0x97, 0x9E, 0x9C, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, - 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, - 0x9A, 0xA1, 0x9C, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xB6, 0xBB, 0xB7, 0xFF, - 0xA9, 0xAE, 0xAA, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xBB, 0xC0, 0xBA, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, - 0x8C, 0x92, 0x8B, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, - 0xB0, 0xB6, 0xAF, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, - 0x9C, 0xA2, 0x9B, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x93, 0x99, 0x92, 0xFF, - 0xA0, 0xA5, 0xA1, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, - 0x9E, 0xA3, 0x9F, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, 0x86, 0x8B, 0x87, 0xFF, - 0x8C, 0x91, 0x8D, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xC4, 0xC9, 0xC7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xA6, 0xAA, 0xA9, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xD7, 0xDF, 0xDC, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, - 0xA3, 0xAF, 0xAB, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, - 0x9C, 0xA8, 0xA4, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, - 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, - 0xD5, 0xE1, 0xDD, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0x8D, 0x99, 0x95, 0xFF, - 0x94, 0x9E, 0x9B, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, - 0xAE, 0xB8, 0xB4, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, - 0xBD, 0xC7, 0xC4, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xA5, 0xAD, 0xA6, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, - 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, - 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, - 0x98, 0x9D, 0x99, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, - 0xB1, 0xB7, 0xB0, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, - 0xA3, 0xA9, 0xA2, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x8C, 0x92, 0x8B, 0xFF, - 0x94, 0x9A, 0x93, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, - 0x9E, 0xA3, 0x9F, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, 0x95, 0x9B, 0x97, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0x99, 0x9E, 0x9A, 0xFF, - 0x99, 0x9E, 0x9A, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, - 0xC1, 0xC8, 0xC6, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, - 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, - 0x9C, 0xA8, 0xA4, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, - 0xB1, 0xBD, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, - 0xDD, 0xE9, 0xE5, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, - 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0x95, 0x9C, 0x9A, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xAA, 0xB2, 0xA9, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0x98, 0xA1, 0x97, 0xFF, - 0x91, 0x99, 0x92, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, - 0xAA, 0xB2, 0xAB, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB6, 0xB1, 0xFF, - 0x90, 0x98, 0x93, 0xFF, 0x85, 0x8D, 0x85, 0xFF, 0x90, 0x98, 0x91, 0xFF, - 0x90, 0x98, 0x93, 0xFF, 0x8A, 0x92, 0x8D, 0xFF, 0x93, 0x9B, 0x93, 0xFF, - 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, - 0x94, 0x9A, 0x93, 0xFF, 0x91, 0x97, 0x8E, 0xFF, 0x97, 0x9C, 0x96, 0xFF, - 0xA6, 0xAB, 0xA5, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, - 0x90, 0x95, 0x8F, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, - 0x93, 0x98, 0x94, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x93, 0x9A, 0x97, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0x9D, 0xA4, 0xA2, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, - 0xA3, 0xAF, 0xAB, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, - 0xDE, 0xE7, 0xE4, 0xFF, 0xDA, 0xE4, 0xE1, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, - 0xCD, 0xD4, 0xD2, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, - 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xA4, 0xAC, 0xA3, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, 0xA9, 0xB1, 0xA7, 0xFF, - 0xAA, 0xB2, 0xA9, 0xFF, 0xA6, 0xAE, 0xA7, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, - 0x9B, 0xA3, 0x9B, 0xFF, 0x96, 0x9E, 0x97, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, - 0x87, 0x8F, 0x8A, 0xFF, 0x82, 0x8A, 0x83, 0xFF, 0x8C, 0x94, 0x8C, 0xFF, - 0x94, 0x9B, 0x97, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, - 0xAC, 0xB4, 0xAD, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, - 0x97, 0x9C, 0x94, 0xFF, 0x8C, 0x92, 0x89, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, - 0xA4, 0xAA, 0xA4, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, - 0x92, 0x97, 0x91, 0xFF, 0x92, 0x97, 0x91, 0xFF, 0x97, 0x9C, 0x98, 0xFF, - 0x9F, 0xA4, 0xA0, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0x97, 0x9C, 0x98, 0xFF, - 0xA2, 0xA7, 0xA3, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xA8, 0xAD, 0xAB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8D, 0x94, 0x92, 0xFF, - 0x9C, 0xA3, 0xA1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, - 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, - 0xC8, 0xD1, 0xCE, 0xFF, 0xCB, 0xD5, 0xD2, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0xB2, 0xBE, 0xBA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, - 0xA3, 0xAF, 0xAB, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, - 0xB1, 0xBD, 0xB9, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, - 0xD1, 0xDB, 0xD7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, - 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, - 0x99, 0x9E, 0x9C, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x85, 0x8A, 0x88, 0xFF, - 0x9E, 0xA7, 0x9D, 0xFF, 0xA4, 0xAC, 0xA3, 0xFF, 0xAB, 0xB3, 0xAA, 0xFF, - 0xB1, 0xB9, 0xB0, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0x9F, 0xA7, 0xA0, 0xFF, - 0x94, 0x9C, 0x94, 0xFF, 0x8A, 0x92, 0x8B, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, - 0xA8, 0xB0, 0xA8, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, - 0xBD, 0xC5, 0xBD, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, - 0xBB, 0xC3, 0xBC, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, - 0x87, 0x8D, 0x87, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, - 0x8D, 0x93, 0x8C, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x98, 0x9D, 0x97, 0xFF, - 0x98, 0x9D, 0x97, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, - 0xA9, 0xAF, 0xA8, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, - 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xA6, 0xAE, 0xAB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0x8D, 0x94, 0x92, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, - 0xD1, 0xD6, 0xD4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, - 0xA8, 0xAF, 0xAC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB1, 0xB8, 0xB6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, - 0x97, 0x9E, 0x9C, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xB4, 0xBE, 0xBA, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, - 0xBF, 0xCB, 0xC7, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, - 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, - 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, - 0xCC, 0xD6, 0xD3, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, - 0xA6, 0xB0, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0x9C, 0xA3, 0xA1, 0xFF, 0x8F, 0x96, 0x94, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, - 0x9D, 0xA5, 0x9C, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0x9F, 0xA8, 0x9E, 0xFF, - 0xA1, 0xA9, 0x9F, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x94, 0x9C, 0x94, 0xFF, - 0x97, 0x9F, 0x98, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x93, 0x9B, 0x93, 0xFF, - 0x9E, 0xA6, 0x9F, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, - 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x91, 0x99, 0x92, 0xFF, - 0x79, 0x81, 0x7A, 0xFF, 0x83, 0x88, 0x82, 0xFF, 0x95, 0x9B, 0x94, 0xFF, - 0x82, 0x87, 0x81, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, - 0x97, 0x9C, 0x96, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, - 0x9F, 0xA4, 0x9E, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, - 0xAA, 0xB0, 0xA9, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, - 0xAE, 0xB3, 0xAF, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, - 0xAA, 0xB1, 0xAF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, - 0x88, 0x8F, 0x8D, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, - 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, - 0xB2, 0xB9, 0xB7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, - 0x87, 0x8E, 0x8C, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0x96, 0x9F, 0x9C, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xDC, 0xE5, 0xE2, 0xFF, - 0xCE, 0xDA, 0xD6, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, - 0xC7, 0xD3, 0xCF, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, - 0xC7, 0xD3, 0xCF, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xD2, 0xDC, 0xD9, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xA9, 0xB3, 0xB0, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x80, 0x87, 0x85, 0xFF, - 0xA4, 0xAC, 0xA3, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, - 0x83, 0x8C, 0x82, 0xFF, 0x80, 0x88, 0x7F, 0xFF, 0x78, 0x80, 0x77, 0xFF, - 0xB0, 0xB8, 0xAE, 0xFF, 0x90, 0x99, 0x8F, 0xFF, 0x78, 0x80, 0x79, 0xFF, - 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB7, 0xAF, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, - 0x80, 0x88, 0x81, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x75, 0x7D, 0x76, 0xFF, - 0x88, 0x90, 0x89, 0xFF, 0x79, 0x7F, 0x79, 0xFF, 0x94, 0x9A, 0x93, 0xFF, - 0x8E, 0x94, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0xAE, 0xB3, 0xAD, 0xFF, - 0xA0, 0xA5, 0x9F, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, - 0xA3, 0xA9, 0xA4, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, - 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0x9A, 0xA1, 0x9E, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0x8C, 0x93, 0x90, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, - 0xAB, 0xB2, 0xB0, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, - 0x98, 0xA0, 0x9D, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xE1, 0xEB, 0xE8, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, - 0xBE, 0xCA, 0xC6, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, - 0xBD, 0xC7, 0xC4, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, - 0xC1, 0xCA, 0xC7, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, - 0xBE, 0xC8, 0xC5, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, - 0xAE, 0xB8, 0xB4, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, - 0x86, 0x8E, 0x85, 0xFF, 0x9A, 0xA2, 0x98, 0xFF, 0x9D, 0xA5, 0x9C, 0xFF, - 0xB1, 0xB9, 0xB0, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x90, 0x99, 0x8F, 0xFF, - 0xB7, 0xBF, 0xB5, 0xFF, 0x8C, 0x94, 0x8A, 0xFF, 0x7C, 0x84, 0x7D, 0xFF, - 0xAA, 0xB2, 0xAB, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0x96, 0x9E, 0x97, 0xFF, - 0x7F, 0x87, 0x80, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x7E, 0x86, 0x7E, 0xFF, - 0x8D, 0x95, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, - 0x9E, 0xA3, 0x9D, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xB1, 0xB7, 0xB0, 0xFF, - 0xA0, 0xA5, 0x9F, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, - 0xA4, 0xAA, 0xA6, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, - 0xAB, 0xB1, 0xAD, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, - 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xA4, 0xAB, 0xA9, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, - 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xBE, 0xC8, 0xC5, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, - 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, - 0xB9, 0xC2, 0xBF, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, - 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, - 0xC5, 0xCC, 0xC9, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, - 0xC7, 0xD0, 0xCD, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xBB, 0xC5, 0xC1, 0xFF, - 0x82, 0x8B, 0x81, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0x98, 0xA1, 0x97, 0xFF, - 0xC7, 0xCF, 0xC6, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, - 0xB6, 0xBE, 0xB4, 0xFF, 0x78, 0x80, 0x77, 0xFF, 0x72, 0x7A, 0x71, 0xFF, - 0x93, 0x9B, 0x91, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x79, 0x81, 0x78, 0xFF, - 0x8A, 0x92, 0x8B, 0xFF, 0x94, 0x9C, 0x94, 0xFF, 0x95, 0x9D, 0x96, 0xFF, - 0x9E, 0xA6, 0x9F, 0xFF, 0xA9, 0xAF, 0xA8, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, - 0xB2, 0xB8, 0xB2, 0xFF, 0xBE, 0xC4, 0xBD, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, - 0xAA, 0xB0, 0xA9, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, - 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, - 0xAB, 0xB1, 0xAD, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, - 0xB9, 0xC1, 0xBC, 0xFF, 0xBB, 0xC3, 0xBE, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, - 0xB4, 0xBE, 0xBA, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xAF, 0xB9, 0xB6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, - 0xCA, 0xD4, 0xD0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, - 0xCD, 0xD9, 0xD5, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, - 0xA8, 0xB2, 0xAF, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, - 0xA6, 0xB0, 0xAC, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBA, 0xC1, 0xBF, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, - 0xAC, 0xB9, 0xB4, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, - 0x9D, 0xA5, 0x9C, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0x97, 0xA0, 0x96, 0xFF, - 0xBA, 0xC3, 0xB9, 0xFF, 0x81, 0x8A, 0x80, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, - 0xAB, 0xB3, 0xAA, 0xFF, 0x61, 0x69, 0x5F, 0xFF, 0x5E, 0x67, 0x5D, 0xFF, - 0x7C, 0x85, 0x7B, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x71, 0x79, 0x70, 0xFF, - 0x9B, 0xA3, 0x9B, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, 0xB0, 0xB8, 0xB0, 0xFF, - 0xB4, 0xBC, 0xB5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, - 0xC2, 0xC7, 0xC1, 0xFF, 0xB5, 0xBA, 0xB4, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, - 0xBC, 0xC1, 0xBB, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, - 0xA2, 0xA7, 0xA3, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, - 0x93, 0x98, 0x94, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, - 0xBB, 0xC3, 0xBE, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, - 0xAE, 0xB8, 0xB4, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xB2, 0xBB, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, - 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, - 0xB8, 0xBD, 0xBB, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, - 0xB7, 0xBC, 0xBA, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, - 0xD3, 0xDD, 0xDA, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, - 0xBD, 0xC9, 0xC5, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, - 0xD3, 0xDF, 0xDB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, - 0x97, 0xA0, 0x9D, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, 0x88, 0x91, 0x8E, 0xFF, - 0x8D, 0x97, 0x94, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, - 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, - 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xA8, 0xB4, 0xB0, 0xFF, - 0x9C, 0xA4, 0x9B, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0xBB, 0xC4, 0xBA, 0xFF, - 0xAF, 0xB7, 0xAD, 0xFF, 0x86, 0x8E, 0x85, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, - 0x7C, 0x85, 0x7B, 0xFF, 0x51, 0x5A, 0x50, 0xFF, 0x53, 0x5B, 0x51, 0xFF, - 0x83, 0x8C, 0x82, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x9C, 0xA4, 0x9B, 0xFF, - 0xC1, 0xC9, 0xC2, 0xFF, 0xBE, 0xC6, 0xBE, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, - 0xB7, 0xBF, 0xB7, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, - 0xB7, 0xBD, 0xB6, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, 0x91, 0x96, 0x92, 0xFF, - 0xA7, 0xAC, 0xA8, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x93, 0x98, 0x94, 0xFF, - 0x9A, 0x9F, 0x9B, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x98, 0x9D, 0x99, 0xFF, - 0x9B, 0xA0, 0x9C, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xCA, 0xD2, 0xCD, 0xFF, - 0xC3, 0xCB, 0xC6, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x8C, 0x96, 0x93, 0xFF, - 0xAB, 0xB4, 0xB1, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, - 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xA3, 0xA8, 0xA7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, - 0x9E, 0xA2, 0xA1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, - 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xC9, 0xD1, 0xCE, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, - 0xC9, 0xD3, 0xCF, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xAE, 0xBA, 0xB6, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, - 0xD8, 0xE4, 0xE0, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, - 0xAC, 0xB5, 0xB2, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, - 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, - 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, - 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, - 0xB5, 0xC1, 0xBD, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, - 0xB1, 0xBD, 0xB9, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, - 0x91, 0x9A, 0x90, 0xFF, 0x82, 0x8B, 0x81, 0xFF, 0xB9, 0xC1, 0xB8, 0xFF, - 0x95, 0x9D, 0x94, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x98, 0xA1, 0x97, 0xFF, - 0x82, 0x8B, 0x81, 0xFF, 0x73, 0x7C, 0x72, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, - 0xA5, 0xAE, 0xA4, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, 0xAF, 0xB7, 0xAD, 0xFF, - 0xB9, 0xC1, 0xBA, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, - 0xB7, 0xBF, 0xB7, 0xFF, 0x95, 0x9B, 0x94, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, - 0xBB, 0xC0, 0xBA, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x92, 0x97, 0x93, 0xFF, - 0x8D, 0x92, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9D, 0xFF, - 0xA4, 0xAA, 0xA6, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, - 0x9B, 0xA0, 0x9C, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC6, 0xCD, 0xC9, 0xFF, - 0xB2, 0xBA, 0xB5, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, - 0xB0, 0xBA, 0xB7, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, - 0xA1, 0xAB, 0xA8, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, - 0xBD, 0xC7, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xC8, 0xCF, 0xCD, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, - 0x90, 0x94, 0x93, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, - 0x94, 0x99, 0x97, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, - 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, - 0xC6, 0xCB, 0xC9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, - 0xC3, 0xCD, 0xC9, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, - 0x9D, 0xA9, 0xA5, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, - 0xD1, 0xDD, 0xD9, 0xFF, 0xD6, 0xDF, 0xDC, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, - 0xC8, 0xD1, 0xCE, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, - 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, - 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, - 0x9A, 0xA1, 0x9E, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, - 0xC1, 0xCE, 0xC9, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, - 0xA9, 0xB5, 0xB1, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, - 0x7F, 0x87, 0x7E, 0xFF, 0x97, 0xA0, 0x96, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, - 0x7E, 0x86, 0x7C, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, 0x95, 0x9D, 0x94, 0xFF, - 0x90, 0x99, 0x8F, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, - 0xA2, 0xAA, 0xA0, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, - 0xAD, 0xB5, 0xAE, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, - 0xA8, 0xB0, 0xA8, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, - 0xB9, 0xBF, 0xB9, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0x91, 0x96, 0x92, 0xFF, - 0x83, 0x88, 0x84, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, - 0xA3, 0xA9, 0xA4, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, - 0x8E, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, - 0x9D, 0xA5, 0xA0, 0xFF, 0x89, 0x91, 0x8C, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, - 0xB9, 0xC2, 0xBF, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, - 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAD, 0xAA, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, - 0xAB, 0xB4, 0xB1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, - 0xC3, 0xCB, 0xC8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x8E, 0x93, 0x92, 0xFF, - 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x90, 0x94, 0x93, 0xFF, - 0x91, 0x96, 0x94, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, - 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, - 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, - 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, - 0xBB, 0xC5, 0xC1, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, - 0x9A, 0xA6, 0xA2, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, - 0xC4, 0xD0, 0xCC, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, - 0xD2, 0xDC, 0xD9, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, - 0xB3, 0xBA, 0xB8, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, - 0x94, 0x9B, 0x99, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, - 0xBD, 0xC9, 0xC5, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, - 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, - 0x72, 0x7A, 0x71, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, 0x8A, 0x93, 0x89, 0xFF, - 0x7E, 0x86, 0x7C, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, - 0x9C, 0xA4, 0x9B, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, - 0x8D, 0x95, 0x8B, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, - 0xB1, 0xB9, 0xB2, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, - 0x93, 0x9B, 0x93, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0xB8, 0xBE, 0xB7, 0xFF, - 0xB4, 0xB9, 0xB3, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8E, 0x94, 0x90, 0xFF, - 0x92, 0x97, 0x93, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, - 0xB5, 0xBA, 0xB6, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, - 0x97, 0x9C, 0x98, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, - 0xB1, 0xB8, 0xB4, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, - 0xB7, 0xC1, 0xBE, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, - 0x93, 0x9D, 0x9A, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, - 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, - 0xCA, 0xD2, 0xCF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, - 0x95, 0x9A, 0x99, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB2, 0xB7, 0xB6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, - 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, - 0xB7, 0xBE, 0xBB, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, - 0xBB, 0xC3, 0xC0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, - 0xAD, 0xB5, 0xB2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, - 0xB5, 0xBF, 0xBB, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, - 0xA6, 0xB2, 0xAD, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, - 0xB9, 0xC5, 0xC1, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, - 0xD2, 0xDC, 0xD9, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, - 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, - 0xD0, 0xD4, 0xD3, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, - 0xA2, 0xA9, 0xA7, 0xFF, 0x90, 0x99, 0x96, 0xFF, 0x83, 0x8D, 0x89, 0xFF, - 0xA4, 0xB0, 0xAC, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, - 0xB7, 0xC3, 0xBF, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF + 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xD6, 0xD7, 0xD4, 0xFF, 0x56, 0x57, 0x54, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x39, 0x39, 0x3B, 0xFF, + 0xB7, 0xB7, 0xB7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, + 0xDF, 0xDD, 0xD9, 0xFF, 0xF0, 0xEF, 0xEB, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xDE, 0xDA, 0xD7, 0xFF, 0xD5, 0xD1, 0xCE, 0xFF, + 0xE7, 0xE3, 0xE0, 0xFF, 0xE9, 0xE5, 0xE1, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, 0xEC, 0xE6, 0xE4, 0xFF, 0xEC, 0xE6, 0xE4, 0xFF, 0xDA, 0xD3, 0xD1, 0xFF, + 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE6, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xA3, 0xA3, 0xA1, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, 0x22, 0x21, 0x24, 0xFF, + 0x6A, 0x6A, 0x6A, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE5, 0xE7, 0xDF, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xEE, 0xEF, 0xE7, 0xFF, 0xF0, 0xF1, 0xEA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xDB, 0xDC, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xEA, 0xEB, 0xE6, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, + 0xE6, 0xE4, 0xE0, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0xD2, 0xD0, 0xCC, 0xFF, 0x9F, 0x9B, 0x98, 0xFF, 0x9D, 0x99, 0x96, 0xFF, + 0xB7, 0xB2, 0xAF, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, 0xD9, 0xD2, 0xD0, 0xFF, 0xD9, 0xD2, 0xD0, 0xFF, 0xEB, 0xE5, 0xE3, 0xFF, + 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, + 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0x77, 0x77, 0x75, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, 0x13, 0x12, 0x15, 0xFF, + 0x1E, 0x1E, 0x1E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, + 0xEE, 0xEF, 0xE7, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, 0xF1, 0xF2, 0xED, 0xFF, 0xF0, 0xF1, 0xEC, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE0, 0xDE, 0xDA, 0xFF, 0xBB, 0xB9, 0xB5, 0xFF, 0x7D, 0x7B, 0x77, 0xFF, 0x37, 0x36, 0x32, 0xFF, 0x24, 0x20, 0x1D, 0xFF, 0x73, 0x6F, 0x6C, 0xFF, + 0xC4, 0xC0, 0xBD, 0xFF, 0xEE, 0xEA, 0xE7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xF2, 0xEC, 0xE9, 0xFF, + 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, + 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xDD, 0xDE, 0xDB, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, + 0x5C, 0x5C, 0x5A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x13, 0x12, 0x15, 0xFF, 0x13, 0x12, 0x15, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, + 0xE4, 0xE5, 0xDE, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, + 0x70, 0x6F, 0x6B, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x10, 0x0E, 0x0A, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0xB2, 0xAE, 0xAB, 0xFF, + 0xF4, 0xF0, 0xED, 0xFF, 0xE6, 0xE2, 0xDF, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, 0xEA, 0xE4, 0xE1, 0xFF, 0xEA, 0xE4, 0xE1, 0xFF, 0xD8, 0xD1, 0xCF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, + 0x30, 0x30, 0x2E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0A, 0x0A, 0x0C, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE4, 0xE5, 0xDE, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xD9, 0xD9, 0xD5, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE5, 0xE6, 0xE1, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x33, 0x34, 0x2F, 0xFF, + 0x21, 0x1F, 0x1B, 0xFF, 0x25, 0x23, 0x1F, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x46, 0x45, 0x41, 0xFF, 0xBB, 0xB7, 0xB4, 0xFF, 0xED, 0xE9, 0xE6, 0xFF, + 0xEA, 0xE6, 0xE3, 0xFF, 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xD9, 0xD7, 0xFF, 0xDC, 0xD6, 0xD3, 0xFF, 0xE3, 0xDD, 0xDA, 0xFF, 0xF1, 0xEB, 0xE8, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, + 0x24, 0x24, 0x22, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x15, 0x15, 0x17, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x53, 0x53, 0x51, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xF1, 0xF2, 0xEB, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xE8, 0xE9, 0xE2, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xE5, 0xE6, 0xE1, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xF5, 0xF5, 0xF0, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, + 0xD4, 0xD5, 0xD0, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, + 0x0E, 0x0D, 0x09, 0xFF, 0x0E, 0x0D, 0x09, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x9B, 0x9A, 0x96, 0xFF, 0xDD, 0xD9, 0xD6, 0xFF, 0xE3, 0xDF, 0xDC, 0xFF, + 0xDC, 0xD8, 0xD5, 0xFF, 0xE0, 0xDC, 0xD9, 0xFF, 0xF6, 0xEF, 0xED, 0xFF, 0xF5, 0xEE, 0xEC, 0xFF, 0xE8, 0xE1, 0xDF, 0xFF, 0xD5, 0xCF, 0xCC, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xEA, 0xEA, 0xE8, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xEB, 0xEC, 0xE9, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, + 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x13, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x26, 0x27, 0x24, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xEB, 0xEC, 0xE7, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xEE, 0xEE, 0xE9, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x07, 0x08, 0x03, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x30, 0x31, 0x2C, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x63, 0x62, 0x5E, 0xFF, 0xC4, 0xC2, 0xBE, 0xFF, 0xE8, 0xE7, 0xE3, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, + 0xE6, 0xE4, 0xE0, 0xFF, 0xE7, 0xE3, 0xE0, 0xFF, 0xD9, 0xD5, 0xD2, 0xFF, 0xD0, 0xCC, 0xC9, 0xFF, 0xB7, 0xB2, 0xAF, 0xFF, 0x9C, 0x98, 0x94, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0x63, 0x63, 0x61, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x17, 0x17, 0x19, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE8, 0xE0, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, + 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, 0xEA, 0xEB, 0xE4, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, + 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE7, 0xE7, 0xE3, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, + 0xD6, 0xD7, 0xD2, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x31, 0x32, 0x2D, 0xFF, + 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, + 0x1B, 0x1A, 0x16, 0xFF, 0x42, 0x40, 0x3C, 0xFF, 0xAE, 0xAC, 0xA8, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, + 0xD6, 0xD4, 0xD0, 0xFF, 0xC5, 0xC4, 0xC0, 0xFF, 0x97, 0x93, 0x90, 0xFF, 0x96, 0x92, 0x8F, 0xFF, 0xA3, 0x9F, 0x9B, 0xFF, 0xB4, 0xB0, 0xAD, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE9, 0xE9, 0xE7, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, + 0x1E, 0x1F, 0x1C, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x1C, 0x1C, 0x1E, 0xFF, 0x16, 0x16, 0x18, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x86, 0x87, 0x80, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, + 0xC9, 0xCB, 0xC3, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, + 0xE5, 0xE7, 0xDF, 0xFF, 0xEC, 0xEE, 0xE6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xE5, 0xE7, 0xDF, 0xFF, 0xEB, 0xEC, 0xE5, 0xFF, + 0xF0, 0xF1, 0xEC, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, + 0xEA, 0xEB, 0xE6, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, + 0x5D, 0x5E, 0x59, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, + 0x4C, 0x4C, 0x48, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xB5, 0xB3, 0xAF, 0xFF, 0xAA, 0xA9, 0xA5, 0xFF, + 0x9E, 0x9C, 0x98, 0xFF, 0x93, 0x92, 0x8E, 0xFF, 0xA6, 0xA4, 0xA0, 0xFF, 0xBB, 0xB9, 0xB5, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x4E, 0x4E, 0x4C, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, + 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x08, 0x09, 0x06, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x55, 0x56, 0x4F, 0xFF, + 0x58, 0x5A, 0x52, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x55, 0x56, 0x51, 0xFF, 0x74, 0x75, 0x70, 0xFF, + 0xA2, 0xA3, 0x9C, 0xFF, 0xC2, 0xC4, 0xBC, 0xFF, 0xE3, 0xE4, 0xDD, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, 0xE9, 0xEA, 0xE3, 0xFF, 0xE8, 0xE9, 0xE2, 0xFF, + 0xDB, 0xDC, 0xD7, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, + 0x24, 0x25, 0x20, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xB3, 0xB4, 0xAF, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x9A, 0x98, 0x94, 0xFF, 0xA7, 0xA5, 0xA1, 0xFF, + 0xBA, 0xB8, 0xB4, 0xFF, 0xC6, 0xC5, 0xC1, 0xFF, 0xD0, 0xCE, 0xCA, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x53, 0x53, 0x51, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x1A, 0x1B, 0x14, 0xFF, 0x24, 0x25, 0x1E, 0xFF, + 0x2B, 0x2C, 0x25, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x35, 0x30, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, + 0x46, 0x47, 0x40, 0xFF, 0x4E, 0x4F, 0x48, 0xFF, 0x6F, 0x70, 0x69, 0xFF, 0x8F, 0x90, 0x89, 0xFF, 0xB0, 0xB1, 0xA8, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, + 0xA5, 0xA7, 0x9F, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x45, 0x46, 0x3F, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x31, 0x32, 0x2D, 0xFF, + 0x2D, 0x2E, 0x29, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x16, 0x17, 0x12, 0xFF, + 0x16, 0x17, 0x12, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x71, 0x72, 0x6D, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xCB, 0xCB, 0xC7, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, + 0xDD, 0xDE, 0xD9, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0x55, 0x55, 0x53, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x15, 0x16, 0x0F, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, + 0x28, 0x29, 0x22, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, + 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x2B, 0xFF, 0x31, 0x32, 0x2B, 0xFF, 0x41, 0x42, 0x3B, 0xFF, 0x44, 0x45, 0x3B, 0xFF, 0x37, 0x38, 0x2F, 0xFF, + 0x30, 0x31, 0x2A, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x21, 0x22, 0x1B, 0xFF, 0x26, 0x28, 0x20, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, + 0x22, 0x23, 0x1E, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, + 0xA3, 0xA4, 0x9F, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE7, 0xE7, 0xE3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, 0xE3, 0xE4, 0xDF, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0x61, 0x61, 0x5F, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x14, 0x13, 0x16, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, + 0x32, 0x33, 0x2C, 0xFF, 0x38, 0x39, 0x32, 0xFF, 0x28, 0x29, 0x22, 0xFF, 0x2F, 0x30, 0x29, 0xFF, 0x31, 0x32, 0x29, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, + 0x2D, 0x2F, 0x27, 0xFF, 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, + 0xDE, 0xDF, 0xDA, 0xFF, 0xF2, 0xF3, 0xEE, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, + 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0x65, 0x66, 0x63, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x08, 0x08, 0x0A, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, + 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, + 0x29, 0x2A, 0x23, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x36, 0x37, 0x30, 0xFF, 0x38, 0x39, 0x32, 0xFF, 0x34, 0x36, 0x2C, 0xFF, 0x2A, 0x2B, 0x22, 0xFF, + 0x28, 0x29, 0x22, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x1C, 0x1D, 0x16, 0xFF, 0x16, 0x17, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xD4, 0xD5, 0xD0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, + 0xD9, 0xD9, 0xD5, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xEF, 0xEF, 0xEB, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE3, 0xE4, 0xDF, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0x6B, 0x6C, 0x69, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, 0x17, 0x17, 0x19, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x13, 0x13, 0x0F, 0xFF, + 0x13, 0x13, 0x0F, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x25, 0x26, 0x21, 0xFF, + 0x2A, 0x2B, 0x24, 0xFF, 0x2D, 0x2F, 0x27, 0xFF, 0x22, 0x23, 0x1C, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x28, 0xFF, 0x2C, 0x2E, 0x24, 0xFF, + 0x30, 0x31, 0x2A, 0xFF, 0x2A, 0x2B, 0x24, 0xFF, 0x24, 0x25, 0x1E, 0xFF, 0x1E, 0x1F, 0x18, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x08, 0x09, 0x06, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x07, 0x07, 0x05, 0xFF, + 0x29, 0x2A, 0x25, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, + 0xE1, 0xE1, 0xDD, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, + 0xD7, 0xD8, 0xD3, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xED, 0xE8, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0x70, 0x70, 0x6E, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x23, 0x24, 0x1F, 0xFF, + 0x28, 0x28, 0x24, 0xFF, 0x2B, 0x2C, 0x25, 0xFF, 0x30, 0x31, 0x2A, 0xFF, 0x34, 0x36, 0x2E, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x2C, 0x2D, 0x26, 0xFF, + 0x2A, 0x2B, 0x24, 0xFF, 0x25, 0x26, 0x1F, 0xFF, 0x1E, 0x1F, 0x18, 0xFF, 0x1A, 0x1B, 0x14, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x53, 0x53, 0x4F, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xDE, 0xDF, 0xDA, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, + 0xE9, 0xEA, 0xE5, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xE9, 0xEA, 0xE5, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, + 0xE4, 0xE5, 0xE0, 0xFF, 0xE5, 0xE6, 0xE1, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xDB, 0xDC, 0xD7, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE5, 0xE6, 0xE3, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE5, 0xE6, 0xE3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0x63, 0x63, 0x63, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, + 0x24, 0x25, 0x20, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x34, 0x36, 0x2E, 0xFF, 0x2F, 0x30, 0x29, 0xFF, + 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1A, 0x1E, 0x18, 0xFF, + 0x13, 0x17, 0x11, 0xFF, 0x10, 0x13, 0x0D, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x15, 0x17, 0x16, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x02, 0x05, 0x01, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, + 0xC5, 0xC6, 0xC1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, + 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x64, 0x64, 0x64, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x22, 0x23, 0x1E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, 0x32, 0x33, 0x2C, 0xFF, + 0x28, 0x2C, 0x26, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x1D, 0x20, 0x1A, 0xFF, + 0x16, 0x19, 0x13, 0xFF, 0x11, 0x14, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x09, 0x0B, 0x0A, 0xFF, 0x0A, 0x0C, 0x0C, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x25, 0x27, 0x26, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, + 0xD4, 0xD5, 0xCE, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x66, 0x66, 0x66, 0xFF, + 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x32, 0x33, 0x2C, 0xFF, 0x34, 0x36, 0x2E, 0xFF, + 0x28, 0x2C, 0x26, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2B, 0x2E, 0x28, 0xFF, 0x2C, 0x2F, 0x29, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x20, 0x23, 0x1E, 0xFF, + 0x19, 0x1C, 0x17, 0xFF, 0x15, 0x18, 0x12, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x0C, 0x0F, 0x0E, 0xFF, 0x2C, 0x2E, 0x2D, 0xFF, 0x80, 0x80, 0x7E, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, + 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, + 0xD4, 0xD4, 0xD2, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, 0xE4, 0xE5, 0xE2, 0xFF, + 0xE4, 0xE5, 0xE2, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0x69, 0x69, 0x69, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x33, 0x34, 0x2D, 0xFF, + 0x27, 0x2A, 0x25, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x2F, 0x33, 0x2D, 0xFF, 0x32, 0x35, 0x2F, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x23, 0x26, 0x20, 0xFF, + 0x1A, 0x1E, 0x18, 0xFF, 0x17, 0x1A, 0x14, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x13, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x08, 0x0A, 0x09, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x32, 0x34, 0x33, 0xFF, 0x81, 0x82, 0x7F, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, + 0xC8, 0xC9, 0xC2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, + 0xE2, 0xE3, 0xDC, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, + 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, + 0xC0, 0xC1, 0xBC, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, 0xD2, 0xD2, 0xCE, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, + 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, + 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0x6A, 0x6A, 0x6A, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x1A, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x25, 0x26, 0x23, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x32, 0x33, 0x2E, 0xFF, + 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x26, 0x29, 0x24, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x2D, 0x30, 0x2D, 0xFF, 0x25, 0x28, 0x24, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, + 0x0C, 0x0E, 0x10, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x4C, 0x4F, 0x4E, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, + 0xCD, 0xCE, 0xC7, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xD9, 0xDA, 0xD3, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, + 0xD4, 0xD5, 0xCE, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xBA, 0xBB, 0xB4, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, + 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB8, 0xB9, 0xB4, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, + 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xC7, 0xC8, 0xC3, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, + 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE2, 0xE2, 0xE0, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, + 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0x69, 0x69, 0x69, 0xFF, + 0x15, 0x15, 0x15, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x17, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x30, 0x31, 0x2C, 0xFF, + 0x2D, 0x30, 0x2B, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x24, 0x26, 0x23, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x11, 0x13, 0x13, 0xFF, + 0x0C, 0x0E, 0x10, 0xFF, 0x1C, 0x1E, 0x1F, 0xFF, 0x20, 0x23, 0x22, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0xB6, 0xB6, 0xB4, 0xFF, 0xCE, 0xCF, 0xCA, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, + 0xDE, 0xE0, 0xD8, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xD5, 0xD6, 0xCF, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, + 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, + 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBA, 0xBB, 0xB6, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, + 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0x65, 0x65, 0x65, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x12, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, + 0x32, 0x35, 0x2F, 0xFF, 0x2C, 0x2F, 0x29, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x1D, 0x20, 0x1A, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x21, 0x24, 0x21, 0xFF, + 0x1D, 0x1F, 0x1C, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x19, 0x1B, 0x1D, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, 0x91, 0x94, 0x93, 0xFF, 0xCC, 0xCC, 0xCA, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xDB, 0xDC, 0xD5, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, + 0xCC, 0xCD, 0xC6, 0xFF, 0xC6, 0xC7, 0xC0, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0x93, 0x94, 0x8D, 0xFF, 0x82, 0x84, 0x7C, 0xFF, + 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, + 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC2, 0xC3, 0xBE, 0xFF, + 0xCB, 0xCB, 0xC7, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, 0xDE, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, + 0xDE, 0xDF, 0xDC, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xDD, 0xDE, 0xDB, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, 0x63, 0x63, 0x63, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x0D, 0x0C, 0x0F, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, + 0x35, 0x38, 0x33, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x19, 0x1C, 0x17, 0xFF, 0x23, 0x25, 0x22, 0xFF, 0x20, 0x23, 0x20, 0xFF, + 0x1E, 0x21, 0x1D, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x12, 0x14, 0x16, 0xFF, 0x1D, 0x1F, 0x20, 0xFF, 0x4B, 0x4E, 0x4D, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xD4, 0xD4, 0xD2, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, + 0xDC, 0xDD, 0xD6, 0xFF, 0xDC, 0xDE, 0xD4, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD3, 0xD4, 0xCD, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, + 0xBF, 0xC0, 0xB9, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0x90, 0x92, 0x8A, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x66, 0x68, 0x60, 0xFF, + 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, + 0xB1, 0xB2, 0xAD, 0xFF, 0xB1, 0xB2, 0xAD, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, + 0xBB, 0xBC, 0xB7, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, 0xE1, 0xE1, 0xDD, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xDA, 0xDB, 0xD6, 0xFF, + 0xDD, 0xDE, 0xD9, 0xFF, 0xE0, 0xE0, 0xDC, 0xFF, 0xDC, 0xDC, 0xDA, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD6, 0xD7, 0xD4, 0xFF, + 0xE0, 0xE0, 0xDE, 0xFF, 0xC5, 0xC5, 0xC3, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, 0xDA, 0xDA, 0xD8, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x3B, 0x3C, 0x39, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x24, 0x25, 0x20, 0xFF, + 0x30, 0x34, 0x2E, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x1F, 0x22, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, + 0x1E, 0x21, 0x1D, 0xFF, 0x1F, 0x22, 0x1F, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x12, 0x14, 0x16, 0xFF, 0x20, 0x22, 0x24, 0xFF, 0x91, 0x94, 0x93, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, + 0xE7, 0xE8, 0xE0, 0xFF, 0xDB, 0xDC, 0xD3, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xDE, 0xE0, 0xD6, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC7, 0xC8, 0xC1, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, + 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x96, 0x97, 0x90, 0xFF, 0x7D, 0x7E, 0x77, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, + 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xAF, 0xAB, 0xFF, 0xAF, 0xB0, 0xA9, 0xFF, 0xB0, 0xB1, 0xAA, 0xFF, 0xB1, 0xB2, 0xAB, 0xFF, 0xB0, 0xB1, 0xAA, 0xFF, + 0xB6, 0xB6, 0xB2, 0xFF, 0xBD, 0xBD, 0xB9, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xCD, 0xCE, 0xC9, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xD3, 0xD4, 0xCF, 0xFF, + 0xD6, 0xD7, 0xD2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xDE, 0xDF, 0xDC, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xC4, 0xC4, 0xC2, 0xFF, + 0xC2, 0xC3, 0xC0, 0xFF, 0xB4, 0xB5, 0xB2, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, 0xB7, 0xB7, 0xB5, 0xFF, 0x7E, 0x7E, 0x7C, 0xFF, 0x29, 0x29, 0x27, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, + 0x29, 0x2D, 0x27, 0xFF, 0x29, 0x2D, 0x27, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x21, 0x25, 0x1F, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, + 0x1C, 0x1E, 0x1B, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x12, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, + 0x16, 0x18, 0x19, 0xFF, 0x24, 0x26, 0x27, 0xFF, 0x6F, 0x72, 0x71, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0xCB, 0xCB, 0xC9, 0xFF, 0xD5, 0xD6, 0xD1, 0xFF, + 0xE1, 0xE2, 0xDB, 0xFF, 0xE2, 0xE3, 0xDA, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xBE, 0xBF, 0xB8, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, + 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, 0x74, 0x76, 0x6E, 0xFF, 0x61, 0x62, 0x5B, 0xFF, 0x52, 0x53, 0x4B, 0xFF, 0x50, 0x52, 0x4A, 0xFF, + 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, + 0xAC, 0xAD, 0xA8, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA5, 0xFF, 0xAB, 0xAC, 0xA5, 0xFF, 0xAC, 0xAD, 0xA6, 0xFF, 0xAD, 0xAF, 0xA7, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xBB, 0xBC, 0xB7, 0xFF, 0xBE, 0xBF, 0xBA, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, + 0xC4, 0xC4, 0xC0, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xD3, 0xD3, 0xD1, 0xFF, 0xCE, 0xCE, 0xCC, 0xFF, 0xBF, 0xBF, 0xBD, 0xFF, 0xAD, 0xAE, 0xAB, 0xFF, + 0xAF, 0xAF, 0xAD, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAA, 0xAA, 0xA8, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x1E, 0x21, 0x1B, 0xFF, 0x25, 0x28, 0x22, 0xFF, 0x27, 0x2A, 0x25, 0xFF, 0x23, 0x26, 0x20, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, + 0x19, 0x1C, 0x19, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, + 0x0E, 0x10, 0x11, 0xFF, 0x17, 0x19, 0x1A, 0xFF, 0x42, 0x44, 0x44, 0xFF, 0x71, 0x73, 0x72, 0xFF, 0xBD, 0xBD, 0xBB, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, + 0xCF, 0xD0, 0xC9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, + 0xD6, 0xD7, 0xD0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, 0xB2, 0xB3, 0xAC, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, + 0x8D, 0x8E, 0x87, 0xFF, 0x78, 0x79, 0x72, 0xFF, 0x56, 0x57, 0x50, 0xFF, 0x4B, 0x4C, 0x44, 0xFF, 0x53, 0x54, 0x4D, 0xFF, 0x69, 0x6A, 0x63, 0xFF, + 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, 0xA9, 0xAA, 0xA3, 0xFF, + 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, 0xB8, 0xB8, 0xB6, 0xFF, 0xAC, 0xAD, 0xAA, 0xFF, 0x9E, 0x9F, 0x9C, 0xFF, + 0x96, 0x97, 0x94, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, 0x7A, 0x7B, 0x78, 0xFF, 0x3D, 0x3D, 0x3B, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x16, 0x11, 0xFF, + 0x15, 0x18, 0x12, 0xFF, 0x1E, 0x21, 0x1B, 0xFF, 0x24, 0x27, 0x21, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x17, 0x1A, 0x16, 0xFF, + 0x17, 0x1A, 0x16, 0xFF, 0x16, 0x18, 0x15, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x13, 0x16, 0x13, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, + 0x17, 0x19, 0x1A, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x3B, 0x3D, 0x3D, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0xC9, 0xCA, 0xC5, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xD7, 0xD9, 0xCF, 0xFF, 0xE1, 0xE2, 0xD9, 0xFF, 0xDD, 0xDF, 0xD5, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, + 0xD2, 0xD3, 0xCC, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xC0, 0xC1, 0xBA, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0x8D, 0x8E, 0x87, 0xFF, + 0x78, 0x79, 0x72, 0xFF, 0x69, 0x6A, 0x63, 0xFF, 0x4D, 0x4E, 0x47, 0xFF, 0x48, 0x49, 0x42, 0xFF, 0x61, 0x62, 0x5B, 0xFF, 0x86, 0x87, 0x80, 0xFF, + 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, + 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAA, 0xAB, 0xA4, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, 0xA7, 0xA8, 0xA0, 0xFF, + 0xA7, 0xA7, 0xA2, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA7, 0xA7, 0xA4, 0xFF, 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x99, 0x99, 0x97, 0xFF, + 0x94, 0x94, 0x92, 0xFF, 0x95, 0x95, 0x93, 0xFF, 0x82, 0x83, 0x80, 0xFF, 0x4E, 0x4E, 0x4C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0A, 0x0A, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x25, 0x28, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x17, 0x19, 0x18, 0xFF, + 0x17, 0x19, 0x18, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, + 0x21, 0x24, 0x23, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x4F, 0x51, 0x50, 0xFF, 0xB3, 0xB6, 0xB2, 0xFF, 0xDC, 0xDD, 0xD8, 0xFF, 0xDE, 0xE0, 0xD8, 0xFF, + 0xE5, 0xE7, 0xDD, 0xFF, 0xD5, 0xD7, 0xCD, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xDB, 0xDC, 0xD5, 0xFF, 0xDD, 0xDE, 0xD9, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, + 0xCF, 0xD0, 0xCB, 0xFF, 0xC4, 0xC4, 0xC0, 0xFF, 0xB2, 0xB3, 0xAE, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x8F, 0x92, 0x8C, 0xFF, 0x72, 0x75, 0x6F, 0xFF, + 0x61, 0x65, 0x5F, 0xFF, 0x49, 0x4C, 0x46, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x51, 0x54, 0x4F, 0xFF, 0x7C, 0x7F, 0x7A, 0xFF, 0x8C, 0x90, 0x8A, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, + 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA9, 0xA2, 0xFF, 0xA5, 0xA7, 0x9F, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, + 0xA4, 0xA5, 0xA0, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0x97, 0x98, 0x95, 0xFF, + 0x9B, 0x9B, 0x99, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x77, 0x77, 0x75, 0xFF, 0x41, 0x42, 0x3F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x12, 0x15, 0x12, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x23, 0x25, 0x22, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x15, 0x17, 0x16, 0xFF, + 0x15, 0x17, 0x16, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x16, 0x18, 0x17, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, 0x1C, 0x1E, 0x1D, 0xFF, + 0x23, 0x25, 0x24, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, 0xBD, 0xC0, 0xBD, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, + 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, 0xD7, 0xD8, 0xD3, 0xFF, 0xCC, 0xCD, 0xC8, 0xFF, + 0xC4, 0xC4, 0xC0, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, 0x60, 0x63, 0x5E, 0xFF, + 0x52, 0x55, 0x50, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, 0x58, 0x5B, 0x56, 0xFF, 0x83, 0x86, 0x81, 0xFF, 0x8A, 0x8D, 0x88, 0xFF, + 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, + 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA5, 0xA7, 0x9F, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, + 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x99, 0x99, 0x94, 0xFF, + 0x99, 0x99, 0x94, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x94, 0x94, 0x92, 0xFF, 0x90, 0x91, 0x8E, 0xFF, 0x8C, 0x8C, 0x8A, 0xFF, 0x87, 0x87, 0x85, 0xFF, + 0x87, 0x87, 0x85, 0xFF, 0x7B, 0x7C, 0x79, 0xFF, 0x68, 0x68, 0x66, 0xFF, 0x3F, 0x3F, 0x3D, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0F, 0x12, 0x0E, 0xFF, 0x15, 0x17, 0x14, 0xFF, 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, + 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, + 0x20, 0x23, 0x22, 0xFF, 0x29, 0x2C, 0x2B, 0xFF, 0x44, 0x47, 0x44, 0xFF, 0xAF, 0xB2, 0xAF, 0xFF, 0xD6, 0xD7, 0xD2, 0xFF, 0xDD, 0xDE, 0xD7, 0xFF, + 0xE0, 0xE1, 0xD7, 0xFF, 0xE0, 0xE1, 0xD7, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xD7, 0xD9, 0xD1, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, 0xBF, 0xC0, 0xBB, 0xFF, + 0xB2, 0xB3, 0xAE, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, 0x53, 0x57, 0x51, 0xFF, + 0x48, 0x4B, 0x45, 0xFF, 0x35, 0x38, 0x33, 0xFF, 0x36, 0x39, 0x34, 0xFF, 0x63, 0x66, 0x60, 0xFF, 0x8E, 0x91, 0x8B, 0xFF, 0x87, 0x8A, 0x84, 0xFF, + 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA4, 0xA5, 0x9E, 0xFF, 0xA2, 0xA3, 0x9C, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, 0xA1, 0xA2, 0x9B, 0xFF, + 0xA1, 0xA1, 0x9D, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x87, 0x87, 0x85, 0xFF, 0x78, 0x78, 0x76, 0xFF, 0x6D, 0x6E, 0x6B, 0xFF, + 0x47, 0x47, 0x45, 0xFF, 0x45, 0x45, 0x43, 0xFF, 0x45, 0x45, 0x43, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x07, 0x07, 0x05, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0C, 0x0F, 0x0C, 0xFF, 0x11, 0x14, 0x11, 0xFF, 0x17, 0x1A, 0x16, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x10, 0x12, 0x11, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x16, 0x18, 0x17, 0xFF, + 0x16, 0x18, 0x17, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x37, 0x3A, 0x37, 0xFF, 0x8E, 0x91, 0x8B, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xE0, 0xE1, 0xDA, 0xFF, + 0xD7, 0xD9, 0xCF, 0xFF, 0xD6, 0xD8, 0xCE, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, 0xC5, 0xC6, 0xC1, 0xFF, 0xB6, 0xB6, 0xB2, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x4B, 0x4E, 0x49, 0xFF, + 0x43, 0x46, 0x41, 0xFF, 0x30, 0x34, 0x2E, 0xFF, 0x34, 0x37, 0x32, 0xFF, 0x6B, 0x6E, 0x68, 0xFF, 0x96, 0x99, 0x93, 0xFF, 0x84, 0x88, 0x82, 0xFF, + 0xA2, 0xA3, 0x9E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, + 0x9B, 0x9C, 0x97, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0xA3, 0xA4, 0x9D, 0xFF, 0x9B, 0x9C, 0x95, 0xFF, + 0x8E, 0x8F, 0x88, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x61, 0x61, 0x5D, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x56, 0x57, 0x52, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0E, 0x0E, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x08, 0x08, 0x08, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x22, 0x22, 0x20, 0xFF, 0x26, 0x27, 0x24, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xD6, 0xD7, 0xD0, 0xFF, + 0xCE, 0xCF, 0xC8, 0xFF, 0xD5, 0xD6, 0xCF, 0xFF, 0xC8, 0xC9, 0xC2, 0xFF, 0xCE, 0xCF, 0xC8, 0xFF, 0xC7, 0xC8, 0xC3, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, + 0x99, 0x99, 0x94, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x7B, 0x7E, 0x79, 0xFF, 0x63, 0x66, 0x60, 0xFF, 0x47, 0x4A, 0x44, 0xFF, 0x3A, 0x3D, 0x37, 0xFF, + 0x31, 0x37, 0x30, 0xFF, 0x2B, 0x31, 0x2B, 0xFF, 0x2F, 0x34, 0x2E, 0xFF, 0x60, 0x65, 0x5F, 0xFF, 0x7E, 0x84, 0x7D, 0xFF, 0x77, 0x7D, 0x76, 0xFF, + 0xAA, 0xAB, 0xA6, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x96, 0x97, 0x92, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x66, 0x68, 0x60, 0xFF, + 0x50, 0x52, 0x4A, 0xFF, 0x46, 0x47, 0x40, 0xFF, 0x45, 0x45, 0x41, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x77, 0x78, 0x73, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x21, 0x21, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0xC5, 0xC6, 0xBF, 0xFF, 0xDC, 0xDD, 0xD6, 0xFF, + 0xD7, 0xD9, 0xD1, 0xFF, 0xCC, 0xCD, 0xC6, 0xFF, 0xE1, 0xE2, 0xDB, 0xFF, 0xD4, 0xD5, 0xCE, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0x99, 0x99, 0x94, 0xFF, + 0x86, 0x87, 0x82, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x6B, 0x6E, 0x68, 0xFF, 0x56, 0x59, 0x53, 0xFF, 0x4E, 0x51, 0x4B, 0xFF, 0x3B, 0x3E, 0x39, 0xFF, + 0x2A, 0x30, 0x29, 0xFF, 0x1F, 0x24, 0x1E, 0xFF, 0x30, 0x36, 0x2F, 0xFF, 0x5C, 0x62, 0x5B, 0xFF, 0x7B, 0x80, 0x7A, 0xFF, 0x78, 0x7E, 0x77, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, + 0xA1, 0xA1, 0x9D, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0xAB, 0xAC, 0xA7, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x96, 0x97, 0x92, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x48, 0x49, 0x42, 0xFF, 0x44, 0x45, 0x3D, 0xFF, + 0x49, 0x4B, 0x43, 0xFF, 0x57, 0x58, 0x51, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, + 0x8B, 0x8B, 0x87, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x42, 0x43, 0x3E, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x0D, 0x0D, 0x0D, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x05, 0x05, 0x05, 0xFF, 0x08, 0x08, 0x08, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, + 0x22, 0x22, 0x20, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x52, 0x52, 0x4D, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0xB7, 0xB8, 0xB1, 0xFF, 0xDA, 0xDB, 0xD4, 0xFF, + 0xDA, 0xDB, 0xD4, 0xFF, 0xC9, 0xCB, 0xC3, 0xFF, 0xCB, 0xCC, 0xC5, 0xFF, 0xB9, 0xBA, 0xB3, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, + 0x82, 0x83, 0x7E, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x68, 0x6C, 0x66, 0xFF, 0x53, 0x57, 0x51, 0xFF, 0x3C, 0x3F, 0x3A, 0xFF, 0x32, 0x35, 0x2F, 0xFF, + 0x2B, 0x31, 0x2B, 0xFF, 0x28, 0x2D, 0x27, 0xFF, 0x29, 0x2F, 0x28, 0xFF, 0x4C, 0x52, 0x4B, 0xFF, 0x6A, 0x70, 0x69, 0xFF, 0x71, 0x77, 0x70, 0xFF, + 0xA8, 0xA8, 0xA4, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA8, 0xA8, 0xA4, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x96, 0x97, 0x92, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, + 0x53, 0x53, 0x4F, 0xFF, 0x40, 0x41, 0x3C, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x68, 0x69, 0x62, 0xFF, + 0x7F, 0x80, 0x79, 0xFF, 0x94, 0x95, 0x8E, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, + 0x6C, 0x6D, 0x68, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x24, 0x24, 0x22, 0xFF, 0x40, 0x40, 0x3E, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0xB6, 0xB7, 0xB0, 0xFF, 0xD2, 0xD3, 0xCC, 0xFF, + 0xD4, 0xD5, 0xCE, 0xFF, 0xCF, 0xD0, 0xC9, 0xFF, 0xCD, 0xCE, 0xC7, 0xFF, 0xB3, 0xB4, 0xAD, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, + 0x71, 0x72, 0x6D, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, 0x53, 0x57, 0x51, 0xFF, 0x42, 0x45, 0x3F, 0xFF, 0x43, 0x46, 0x41, 0xFF, 0x33, 0x36, 0x30, 0xFF, + 0x24, 0x2A, 0x24, 0xFF, 0x1C, 0x22, 0x1B, 0xFF, 0x1B, 0x21, 0x1A, 0xFF, 0x39, 0x3F, 0x39, 0xFF, 0x58, 0x5D, 0x57, 0xFF, 0x63, 0x69, 0x62, 0xFF, + 0xA7, 0xA7, 0xA2, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0xA5, 0xA6, 0xA1, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, + 0x9B, 0x9C, 0x97, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x45, 0x45, 0x41, 0xFF, + 0x49, 0x4A, 0x45, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x8E, 0x8F, 0x88, 0xFF, 0x97, 0x99, 0x91, 0xFF, + 0xA0, 0xA1, 0x99, 0xFF, 0x99, 0x9A, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x6F, 0x6F, 0x6B, 0xFF, 0x63, 0x64, 0x5F, 0xFF, + 0x5A, 0x5A, 0x56, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x25, 0x26, 0x23, 0xFF, + 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0F, 0x10, 0x0D, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x0E, 0x0E, 0x10, 0xFF, + 0x14, 0x13, 0x16, 0xFF, 0x1E, 0x1E, 0x20, 0xFF, 0x0F, 0x0F, 0x11, 0xFF, 0x11, 0x11, 0x13, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, + 0x3B, 0x3C, 0x39, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xCF, 0xD0, 0xCB, 0xFF, + 0xCB, 0xCB, 0xC7, 0xFF, 0xD0, 0xD1, 0xCC, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x74, 0x75, 0x70, 0xFF, + 0x62, 0x62, 0x60, 0xFF, 0x66, 0x67, 0x64, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x72, 0x74, 0x71, 0xFF, 0x78, 0x7D, 0x79, 0xFF, 0x64, 0x6A, 0x66, 0xFF, + 0x3D, 0x42, 0x3E, 0xFF, 0x19, 0x21, 0x1C, 0xFF, 0x17, 0x1F, 0x1A, 0xFF, 0x26, 0x2E, 0x29, 0xFF, 0x48, 0x50, 0x4B, 0xFF, 0x6A, 0x71, 0x6D, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, + 0x69, 0x6A, 0x65, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x74, 0x75, 0x70, 0xFF, + 0x79, 0x7A, 0x75, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x95, 0x96, 0x8F, 0xFF, 0x9A, 0x9B, 0x94, 0xFF, + 0x92, 0x93, 0x8B, 0xFF, 0x7F, 0x80, 0x79, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, + 0x4E, 0x4F, 0x4A, 0xFF, 0x39, 0x3A, 0x35, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, + 0x21, 0x21, 0x1F, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x09, 0x0A, 0x07, 0xFF, + 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x0C, 0x0B, 0x0E, 0xFF, + 0x08, 0x08, 0x0A, 0xFF, 0x0D, 0x0C, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x15, 0x15, 0x17, 0xFF, 0x32, 0x32, 0x32, 0xFF, 0x46, 0x46, 0x46, 0xFF, + 0x82, 0x83, 0x80, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0xC6, 0xC7, 0xC2, 0xFF, 0xC8, 0xC9, 0xC4, 0xFF, + 0xBA, 0xBB, 0xB6, 0xFF, 0xB4, 0xB5, 0xB0, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x80, 0x81, 0x7C, 0xFF, + 0x88, 0x89, 0x86, 0xFF, 0x90, 0x91, 0x8E, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, 0xA3, 0xA5, 0xA2, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, + 0x5C, 0x63, 0x5F, 0xFF, 0x43, 0x4B, 0x46, 0xFF, 0x30, 0x37, 0x32, 0xFF, 0x2C, 0x34, 0x2F, 0xFF, 0x3A, 0x42, 0x3D, 0xFF, 0x56, 0x5E, 0x59, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x44, 0x44, 0x3F, 0xFF, + 0x45, 0x45, 0x41, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x85, 0x86, 0x7F, 0xFF, 0x89, 0x8B, 0x83, 0xFF, + 0x7F, 0x80, 0x79, 0xFF, 0x6F, 0x70, 0x69, 0xFF, 0x6C, 0x6D, 0x68, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x63, 0x64, 0x5F, 0xFF, + 0x45, 0x45, 0x41, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x08, 0x08, 0x08, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x95, 0x95, 0x95, 0xFF, + 0xAD, 0xAE, 0xAB, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0xB7, 0xB8, 0xB3, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, + 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0xA1, 0xA5, 0x9F, 0xFF, 0xA7, 0xAA, 0xA5, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, 0xAB, 0xAE, 0xA8, 0xFF, + 0xAE, 0xB1, 0xAE, 0xFF, 0xAE, 0xB1, 0xAE, 0xFF, 0xAB, 0xAE, 0xAA, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, + 0x8D, 0x94, 0x90, 0xFF, 0x6C, 0x74, 0x6F, 0xFF, 0x65, 0x6D, 0x68, 0xFF, 0x41, 0x49, 0x44, 0xFF, 0x31, 0x38, 0x34, 0xFF, 0x32, 0x3A, 0x35, 0xFF, + 0x72, 0x73, 0x6E, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x93, 0x93, 0x8F, 0xFF, 0xA3, 0xA4, 0x9F, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x80, 0x81, 0x7A, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, + 0x73, 0x74, 0x6D, 0xFF, 0x6D, 0x6F, 0x67, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, 0x64, 0x65, 0x60, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x53, 0x53, 0x4F, 0xFF, + 0x3F, 0x40, 0x3B, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x17, 0x18, 0x13, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x72, 0x73, 0x6E, 0xFF, + 0x1C, 0x1D, 0x18, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x3A, 0x3B, 0x36, 0xFF, 0x38, 0x38, 0x36, 0xFF, 0x22, 0x22, 0x20, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x09, 0x0A, 0x07, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0C, 0x0C, 0x0A, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x1E, 0x1E, 0x1E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x29, 0x29, 0x29, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, + 0xA0, 0xA0, 0x9D, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, + 0xB4, 0xB5, 0xB0, 0xFF, 0xBB, 0xBC, 0xB7, 0xFF, 0xB4, 0xB7, 0xB2, 0xFF, 0xC1, 0xC4, 0xBE, 0xFF, 0xC4, 0xC8, 0xC2, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, + 0xB3, 0xB6, 0xB2, 0xFF, 0xB4, 0xB7, 0xB4, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, + 0xA4, 0xAC, 0xA7, 0xFF, 0x8E, 0x96, 0x91, 0xFF, 0x79, 0x81, 0x7C, 0xFF, 0x55, 0x5C, 0x58, 0xFF, 0x3B, 0x43, 0x3E, 0xFF, 0x35, 0x3D, 0x38, 0xFF, + 0x4D, 0x4E, 0x49, 0xFF, 0x58, 0x59, 0x54, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x96, 0x97, 0x92, 0xFF, + 0xAB, 0xAC, 0xA7, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xAC, 0xAD, 0xA8, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8D, 0x8E, 0x89, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x7D, 0x7E, 0x77, 0xFF, 0x77, 0x78, 0x71, 0xFF, + 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x65, 0xFF, 0x62, 0x63, 0x5E, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, + 0x34, 0x35, 0x30, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x21, 0x21, 0x1D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x2B, 0x2C, 0x27, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x76, 0x76, 0x72, 0xFF, + 0x13, 0x13, 0x0F, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x05, 0x05, 0x01, 0xFF, 0x08, 0x09, 0x04, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x16, 0x16, 0x16, 0xFF, + 0x16, 0x16, 0x16, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x25, 0x25, 0x25, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x7A, 0x7B, 0x78, 0xFF, + 0x88, 0x89, 0x86, 0xFF, 0x48, 0x49, 0x46, 0xFF, 0x66, 0x67, 0x62, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, + 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, + 0xB7, 0xBC, 0xB8, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, + 0xB9, 0xC1, 0xBC, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0x8A, 0x92, 0x8D, 0xFF, 0x6B, 0x73, 0x6E, 0xFF, 0x51, 0x59, 0x54, 0xFF, + 0x74, 0x75, 0x70, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xA4, 0xA5, 0xA0, 0xFF, + 0xA3, 0xA4, 0x9F, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x87, 0x88, 0x83, 0xFF, + 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x7A, 0x7B, 0x74, 0xFF, 0x74, 0x76, 0x6E, 0xFF, + 0x6D, 0x6F, 0x67, 0xFF, 0x68, 0x69, 0x62, 0xFF, 0x65, 0x66, 0x61, 0xFF, 0x5E, 0x5F, 0x5A, 0xFF, 0x56, 0x57, 0x52, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, + 0x1E, 0x1F, 0x1A, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x17, 0x18, 0x13, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x71, 0x72, 0x6D, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x09, 0x0A, 0x05, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x06, 0x06, 0x06, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, + 0x30, 0x30, 0x30, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0x42, 0x42, 0x42, 0xFF, 0x70, 0x70, 0x6E, 0xFF, 0xAF, 0xAF, 0xAD, 0xFF, + 0x71, 0x71, 0x6F, 0xFF, 0x50, 0x51, 0x4E, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0xB0, 0xB1, 0xAC, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, + 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xBB, 0xFF, 0xBB, 0xBE, 0xBB, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, + 0xB6, 0xBB, 0xB7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xB4, 0xBC, 0xB7, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, + 0xBF, 0xC6, 0xC2, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x87, 0x8F, 0x8A, 0xFF, 0x73, 0x7B, 0x76, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0xA2, 0xA3, 0x9E, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0xAA, 0xAB, 0xA6, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9E, 0x9F, 0x9A, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x79, 0x7A, 0x73, 0xFF, 0x73, 0x74, 0x6D, 0xFF, + 0x6C, 0x6D, 0x66, 0xFF, 0x66, 0x68, 0x60, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x48, 0x49, 0x44, 0xFF, + 0x2F, 0x2F, 0x2B, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x44, 0x44, 0x3F, 0xFF, 0x42, 0x43, 0x3E, 0xFF, 0x68, 0x68, 0x64, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, + 0x3B, 0x3D, 0x35, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x08, 0x09, 0x02, 0xFF, 0x2F, 0x30, 0x29, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x78, 0x79, 0x74, 0xFF, + 0x18, 0x19, 0x14, 0xFF, 0x0E, 0x0F, 0x0A, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x0C, 0x0C, 0x08, 0xFF, 0x09, 0x0A, 0x05, 0xFF, 0x08, 0x09, 0x04, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x2D, 0x2E, 0x2B, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0xA9, 0xA9, 0xA7, 0xFF, 0x94, 0x94, 0x92, 0xFF, 0x8B, 0x8B, 0x89, 0xFF, 0x77, 0x77, 0x75, 0xFF, + 0x50, 0x51, 0x4E, 0xFF, 0x5C, 0x5C, 0x5A, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0xB9, 0xBA, 0xB5, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, 0xBA, 0xBD, 0xB7, 0xFF, + 0xBB, 0xBE, 0xB9, 0xFF, 0xBB, 0xBE, 0xB9, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, + 0xB2, 0xB8, 0xB4, 0xFF, 0xBE, 0xC5, 0xC0, 0xFF, 0xC2, 0xCA, 0xC5, 0xFF, 0xBE, 0xC5, 0xC0, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, + 0xC3, 0xCB, 0xC6, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, + 0xB1, 0xB2, 0xAD, 0xFF, 0xA9, 0xAA, 0xA5, 0xFF, 0xA0, 0xA0, 0x9B, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x7B, 0x7C, 0x77, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x71, 0xFF, 0x71, 0x72, 0x6B, 0xFF, + 0x6A, 0x6B, 0x64, 0xFF, 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x60, 0x5B, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x46, 0x47, 0x42, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x45, 0x45, 0x41, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x8F, 0x90, 0x8B, 0xFF, + 0x8E, 0x8F, 0x88, 0xFF, 0x55, 0x56, 0x4F, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x76, 0x76, 0x72, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x52, 0x52, 0x4D, 0xFF, + 0x03, 0x04, 0x00, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x08, 0x09, 0x04, 0xFF, 0x05, 0x05, 0x03, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x08, 0x09, 0x06, 0xFF, + 0x17, 0x18, 0x15, 0xFF, 0x44, 0x44, 0x42, 0xFF, 0x53, 0x53, 0x51, 0xFF, 0x4C, 0x4C, 0x4A, 0xFF, 0x52, 0x52, 0x4F, 0xFF, 0x46, 0x46, 0x44, 0xFF, + 0x38, 0x38, 0x36, 0xFF, 0x64, 0x65, 0x62, 0xFF, 0xAD, 0xAE, 0xA9, 0xFF, 0xC0, 0xC1, 0xBC, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, 0xB9, 0xBC, 0xB6, 0xFF, + 0xBA, 0xBD, 0xB7, 0xFF, 0xBD, 0xC1, 0xBB, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, + 0xB6, 0xBD, 0xB8, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, 0xBF, 0xC6, 0xC2, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC5, 0xCC, 0xC7, 0xFF, + 0xC8, 0xD0, 0xCB, 0xFF, 0xC1, 0xC9, 0xC4, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0xAA, 0xB1, 0xAD, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, + 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x84, 0x84, 0x80, 0xFF, + 0x80, 0x81, 0x7C, 0xFF, 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, + 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x28, 0x28, 0x24, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x18, 0x19, 0x14, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x33, 0x34, 0x2F, 0xFF, 0x46, 0x47, 0x42, 0xFF, + 0x84, 0x84, 0x80, 0xFF, 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x63, 0x64, 0x5F, 0xFF, 0x4F, 0x50, 0x4D, 0xFF, 0x24, 0x24, 0x22, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x25, 0x26, 0x23, 0xFF, 0x39, 0x39, 0x37, 0xFF, 0x36, 0x36, 0x34, 0xFF, 0x2F, 0x2F, 0x2D, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, 0x57, 0x58, 0x55, 0xFF, + 0x3D, 0x3D, 0x3B, 0xFF, 0x82, 0x83, 0x80, 0xFF, 0xBA, 0xBB, 0xB8, 0xFF, 0xC6, 0xC6, 0xC4, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, + 0xC3, 0xC6, 0xC3, 0xFF, 0xBD, 0xC0, 0xBD, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xB9, 0xBF, 0xBB, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, + 0xCC, 0xD1, 0xCD, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, 0xB8, 0xBD, 0xB9, 0xFF, + 0x9E, 0x9F, 0x9A, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, + 0x90, 0x91, 0x8C, 0xFF, 0x8E, 0x8F, 0x8A, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, + 0x7D, 0x7D, 0x79, 0xFF, 0x79, 0x7A, 0x75, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, + 0x64, 0x65, 0x5E, 0xFF, 0x5F, 0x61, 0x59, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x40, 0x41, 0x3C, 0xFF, 0x32, 0x33, 0x2E, 0xFF, 0x33, 0x34, 0x2F, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x2F, 0x2F, 0x2B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x2A, 0x2A, 0x28, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0B, 0x0E, 0x0D, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, + 0x1E, 0x1F, 0x1C, 0xFF, 0x2C, 0x2D, 0x2A, 0xFF, 0x4D, 0x4D, 0x4B, 0xFF, 0x47, 0x47, 0x45, 0xFF, 0x42, 0x43, 0x40, 0xFF, 0x33, 0x34, 0x31, 0xFF, + 0x64, 0x65, 0x62, 0xFF, 0x99, 0x99, 0x97, 0xFF, 0xB8, 0xB8, 0xB6, 0xFF, 0xC0, 0xC1, 0xBE, 0xFF, 0xBA, 0xBD, 0xB9, 0xFF, 0xB5, 0xB8, 0xB5, 0xFF, + 0xC1, 0xC4, 0xC0, 0xFF, 0xBC, 0xBF, 0xBC, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xBB, 0xC0, 0xBC, 0xFF, 0xC4, 0xC9, 0xC5, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, + 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, 0xBB, 0xC0, 0xBC, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x82, 0x83, 0x7E, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x77, 0x78, 0x73, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, + 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4D, 0x4E, 0x49, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x29, 0x2A, 0x25, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x3E, 0x3E, 0x3A, 0xFF, 0x38, 0x39, 0x34, 0xFF, 0x32, 0x33, 0x2E, 0xFF, + 0x28, 0x28, 0x24, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x1F, 0x20, 0x1D, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x2F, 0x2F, 0x2D, 0xFF, 0x3F, 0x3F, 0x3D, 0xFF, 0x47, 0x47, 0x45, 0xFF, 0x55, 0x55, 0x53, 0xFF, + 0x92, 0x92, 0x90, 0xFF, 0xB0, 0xB0, 0xAE, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, 0xB9, 0xBA, 0xB7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, + 0xBF, 0xC1, 0xBE, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC3, 0xC8, 0xC4, 0xFF, 0xC9, 0xCE, 0xCA, 0xFF, + 0xCB, 0xD0, 0xCC, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, 0xBF, 0xC4, 0xC0, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x78, 0x79, 0x74, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x70, 0x71, 0x6A, 0xFF, 0x69, 0x6A, 0x63, 0xFF, + 0x63, 0x64, 0x5D, 0xFF, 0x5E, 0x5F, 0x58, 0xFF, 0x5C, 0x5D, 0x58, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, + 0x2A, 0x2B, 0x26, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x34, 0x35, 0x32, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, + 0x21, 0x21, 0x1F, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x0F, 0x12, 0x0E, 0xFF, 0x0A, 0x0D, 0x0A, 0xFF, + 0x0E, 0x10, 0x0F, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x1B, 0x1B, 0x19, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x36, 0x36, 0x34, 0xFF, 0x36, 0x36, 0x34, 0xFF, 0x37, 0x37, 0x35, 0xFF, 0x5D, 0x5E, 0x5B, 0xFF, + 0xB2, 0xB3, 0xB0, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xAB, 0xAC, 0xA9, 0xFF, 0xB4, 0xB5, 0xB2, 0xFF, 0xC3, 0xC6, 0xC3, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, + 0xBD, 0xC0, 0xBD, 0xFF, 0xB3, 0xB6, 0xB2, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, 0xBD, 0xC2, 0xBE, 0xFF, + 0xBB, 0xC0, 0xBC, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xCA, 0xCF, 0xCB, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, + 0xCA, 0xCF, 0xCB, 0xFF, 0xC6, 0xCB, 0xC7, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, 0xC2, 0xC7, 0xC3, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x69, 0x6A, 0x63, 0xFF, + 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x4C, 0x4C, 0x48, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x21, 0x21, 0x21, 0xFF, 0x25, 0x26, 0x23, 0xFF, + 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x26, 0x26, 0x26, 0xFF, 0x23, 0x23, 0x23, 0xFF, + 0x1E, 0x20, 0x1F, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x1C, 0x1C, 0x1C, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, 0x34, 0x34, 0x34, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, 0x57, 0x57, 0x57, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0xC5, 0xC5, 0xC5, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, + 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x93, 0x93, 0x8F, 0xFF, + 0x8F, 0x90, 0x8B, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, + 0x7A, 0x7B, 0x76, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6A, 0x6B, 0x64, 0xFF, 0x68, 0x69, 0x62, 0xFF, + 0x62, 0x63, 0x5C, 0xFF, 0x5D, 0x5E, 0x57, 0xFF, 0x5B, 0x5C, 0x57, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0x2B, 0x2C, 0x27, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, + 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x22, 0x22, 0x20, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x22, 0x22, 0x22, 0xFF, + 0x1F, 0x21, 0x21, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x11, 0x13, 0x13, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x18, 0x18, 0x18, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, + 0xC6, 0xC6, 0xC6, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, + 0xC6, 0xC6, 0xC6, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x86, 0x87, 0x82, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x80, 0x81, 0x7C, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x72, 0x73, 0x6E, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x68, 0x69, 0x62, 0xFF, + 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x50, 0x51, 0x4C, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x41, 0x42, 0x3D, 0xFF, + 0x2B, 0x2C, 0x27, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x16, 0x16, 0x16, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x18, 0x18, 0x18, 0xFF, + 0x18, 0x19, 0x16, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, 0x21, 0x21, 0x21, 0xFF, + 0x20, 0x23, 0x22, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, + 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x44, 0x44, 0x44, 0xFF, 0x3B, 0x3B, 0x3B, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, + 0xC8, 0xC8, 0xC8, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, + 0xC6, 0xC6, 0xC6, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xCD, 0xD2, 0xD0, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x87, 0x88, 0x83, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, 0x7F, 0x80, 0x7B, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x66, 0x68, 0x60, 0xFF, + 0x61, 0x62, 0x5B, 0xFF, 0x5C, 0x5D, 0x56, 0xFF, 0x5A, 0x5A, 0x56, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x49, 0x4A, 0x45, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x1F, 0x20, 0x1B, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, + 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, + 0x23, 0x25, 0x24, 0xFF, 0x25, 0x27, 0x26, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x10, 0x12, 0x11, 0xFF, 0x0E, 0x10, 0x0F, 0xFF, 0x0B, 0x0E, 0x0D, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x0F, 0x0F, 0x0F, 0xFF, 0x23, 0x23, 0x23, 0xFF, 0x44, 0x44, 0x44, 0xFF, 0x4D, 0x4D, 0x4D, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, + 0xBD, 0xBD, 0xBD, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xD0, 0xD4, 0xD3, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x16, 0x16, 0x18, 0xFF, 0x1A, 0x19, 0x1C, 0xFF, + 0x1D, 0x1D, 0x1F, 0xFF, 0x1F, 0x1F, 0x21, 0xFF, 0x22, 0x21, 0x24, 0xFF, 0x1E, 0x1E, 0x20, 0xFF, 0x13, 0x15, 0x17, 0xFF, 0x09, 0x0B, 0x0C, 0xFF, + 0x0B, 0x0D, 0x0F, 0xFF, 0x0F, 0x11, 0x12, 0xFF, 0x12, 0x14, 0x16, 0xFF, 0x15, 0x17, 0x18, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1F, 0x1F, 0x1F, 0xFF, + 0x1D, 0x1D, 0x1D, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x50, 0x50, 0x50, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCE, 0xCE, 0xCE, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, + 0xC2, 0xC2, 0xC2, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, + 0xCD, 0xCF, 0xCE, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x88, 0x89, 0x84, 0xFF, 0x82, 0x83, 0x7E, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7B, 0x7C, 0x77, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x34, 0x35, 0x30, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x13, 0x16, 0xFF, 0x16, 0x16, 0x18, 0xFF, + 0x1A, 0x19, 0x1C, 0xFF, 0x1D, 0x1D, 0x1F, 0xFF, 0x2D, 0x2D, 0x2F, 0xFF, 0x31, 0x31, 0x33, 0xFF, 0x21, 0x23, 0x25, 0xFF, 0x11, 0x13, 0x15, 0xFF, + 0x09, 0x0B, 0x0C, 0xFF, 0x10, 0x12, 0x13, 0xFF, 0x16, 0x18, 0x19, 0xFF, 0x19, 0x1B, 0x1D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, + 0x2B, 0x2B, 0x2B, 0xFF, 0x3B, 0x3B, 0x3B, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x48, 0x48, 0x48, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, + 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, + 0xC5, 0xC5, 0xC5, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x37, 0x37, 0x33, 0xFF, 0x29, 0x2A, 0x25, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x18, 0x19, 0x14, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x32, 0x32, 0x32, 0xFF, 0x36, 0x36, 0x36, 0xFF, 0x2C, 0x2E, 0x2D, 0xFF, 0x17, 0x19, 0x18, 0xFF, + 0x0B, 0x0E, 0x0D, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x24, 0x26, 0x25, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1D, 0x1D, 0x1D, 0xFF, + 0x3D, 0x3D, 0x3D, 0xFF, 0x49, 0x49, 0x49, 0xFF, 0x45, 0x45, 0x45, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, + 0xB8, 0xB8, 0xB8, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCF, 0xCF, 0xCF, 0xFF, + 0xC7, 0xC7, 0xC7, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xC1, 0xC3, 0xC2, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, + 0x9C, 0x9D, 0x98, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x96, 0x97, 0x92, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x92, 0x92, 0x8E, 0xFF, + 0x8E, 0x8F, 0x8A, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x8C, 0x8C, 0x88, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x7E, 0x7F, 0x7A, 0xFF, + 0x7D, 0x7D, 0x79, 0xFF, 0x74, 0x75, 0x70, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6D, 0x6E, 0x69, 0xFF, 0x6C, 0x6D, 0x66, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5D, 0x5E, 0x57, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, + 0x38, 0x39, 0x34, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, + 0x14, 0x14, 0x12, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, + 0x0E, 0x0E, 0x0C, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x13, 0x13, 0x13, 0xFF, + 0x11, 0x11, 0x11, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, + 0x15, 0x15, 0x15, 0xFF, 0x17, 0x17, 0x17, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x30, 0x30, 0x30, 0xFF, 0x26, 0x28, 0x28, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x1B, 0x1B, 0x1B, 0xFF, 0x28, 0x28, 0x28, 0xFF, 0x30, 0x30, 0x30, 0xFF, 0x33, 0x33, 0x33, 0xFF, 0x26, 0x26, 0x26, 0xFF, + 0x48, 0x48, 0x48, 0xFF, 0x4C, 0x4C, 0x4C, 0xFF, 0x49, 0x49, 0x49, 0xFF, 0x5D, 0x5D, 0x5D, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, + 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xC9, 0xCB, 0xCB, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, + 0xA2, 0xA3, 0x9E, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x99, 0x99, 0x94, 0xFF, 0x95, 0x96, 0x91, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x37, 0x37, 0x33, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x0C, 0x0C, 0x08, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x06, 0xFF, + 0x0A, 0x0B, 0x06, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x08, 0x09, 0x06, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, + 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1C, 0x1C, 0x1A, 0xFF, 0x14, 0x12, 0x13, 0xFF, 0x1B, 0x19, 0x1A, 0xFF, + 0x1A, 0x1A, 0x1A, 0xFF, 0x13, 0x13, 0x13, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x2A, 0x2A, 0x2A, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x17, 0x17, 0x17, 0xFF, 0x19, 0x16, 0x17, 0xFF, 0x22, 0x20, 0x21, 0xFF, 0x2D, 0x2D, 0x2D, 0xFF, 0x34, 0x34, 0x34, 0xFF, 0x3A, 0x3A, 0x3A, 0xFF, + 0x53, 0x53, 0x53, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x3F, 0x3F, 0x3F, 0xFF, 0x69, 0x69, 0x69, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, + 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xCE, 0xCE, 0xCE, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, + 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, + 0xA0, 0xA0, 0x9B, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x9B, 0x9C, 0x97, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x89, 0x8A, 0x85, 0xFF, 0x84, 0x84, 0x80, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x14, 0x15, 0x10, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, + 0x0D, 0x0E, 0x09, 0xFF, 0x0D, 0x0E, 0x09, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x15, 0x15, 0x13, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x25, 0x22, 0x23, 0xFF, + 0x23, 0x23, 0x23, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x28, 0x28, 0x28, 0xFF, 0x31, 0x31, 0x31, 0xFF, 0x2F, 0x2F, 0x2F, 0xFF, 0x24, 0x24, 0x24, 0xFF, + 0x21, 0x1F, 0x1F, 0xFF, 0x1E, 0x1B, 0x1C, 0xFF, 0x21, 0x1F, 0x1F, 0xFF, 0x2A, 0x28, 0x29, 0xFF, 0x3E, 0x3E, 0x3E, 0xFF, 0x37, 0x37, 0x37, 0xFF, + 0x42, 0x42, 0x42, 0xFF, 0x4B, 0x4B, 0x4B, 0xFF, 0x62, 0x62, 0x62, 0xFF, 0x89, 0x89, 0x89, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, + 0xA9, 0xA9, 0xA9, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, + 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xA5, 0xA6, 0xA1, 0xFF, 0xA1, 0xA1, 0x9D, 0xFF, 0x9D, 0x9E, 0x99, 0xFF, 0x9A, 0x9A, 0x96, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x65, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0C, 0xFF, + 0x10, 0x11, 0x0C, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, + 0x0F, 0x10, 0x0B, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x11, 0x12, 0x0F, 0xFF, + 0x18, 0x19, 0x16, 0xFF, 0x17, 0x18, 0x15, 0xFF, 0x16, 0x17, 0x14, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x28, 0x26, 0x24, 0xFF, + 0x26, 0x27, 0x24, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, + 0x2E, 0x2C, 0x2A, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x36, 0x36, 0x36, 0xFF, 0x39, 0x39, 0x39, 0xFF, + 0x3E, 0x3E, 0x3E, 0xFF, 0x50, 0x50, 0x50, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0xA9, 0xA9, 0xA9, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, + 0xA9, 0xA9, 0xA9, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xD4, 0xD4, 0xD4, 0xFF, 0xD0, 0xD0, 0xD0, 0xFF, + 0xC8, 0xC8, 0xC8, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, + 0xCF, 0xD1, 0xD0, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xB0, 0xB1, 0xAC, 0xFF, 0xA7, 0xA7, 0xA2, 0xFF, 0x9C, 0x9D, 0x98, 0xFF, 0x94, 0x95, 0x90, 0xFF, 0x97, 0x98, 0x93, 0xFF, 0x95, 0x96, 0x91, 0xFF, + 0x93, 0x93, 0x8F, 0xFF, 0x92, 0x92, 0x8E, 0xFF, 0x8D, 0x8E, 0x89, 0xFF, 0x8B, 0x8B, 0x87, 0xFF, 0x85, 0x86, 0x81, 0xFF, 0x81, 0x82, 0x7D, 0xFF, + 0x7E, 0x7F, 0x7A, 0xFF, 0x78, 0x79, 0x74, 0xFF, 0x73, 0x74, 0x6F, 0xFF, 0x71, 0x72, 0x6D, 0xFF, 0x6B, 0x6C, 0x67, 0xFF, 0x65, 0x66, 0x5F, 0xFF, + 0x5E, 0x5F, 0x58, 0xFF, 0x58, 0x5A, 0x52, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x17, 0x18, 0x13, 0xFF, + 0x15, 0x16, 0x11, 0xFF, 0x14, 0x15, 0x10, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, + 0x11, 0x12, 0x0D, 0xFF, 0x11, 0x12, 0x0D, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x15, 0x15, 0x13, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x18, 0x19, 0x16, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x13, 0x11, 0x0F, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x23, 0x21, 0x20, 0xFF, + 0x23, 0x21, 0x20, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x27, 0x25, 0x23, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, + 0x37, 0x35, 0x34, 0xFF, 0x2A, 0x28, 0x27, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x3C, 0x39, 0x3A, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, + 0x63, 0x63, 0x63, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, + 0xCC, 0xCC, 0xCC, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xCA, 0xCD, 0xCC, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, + 0xC0, 0xC1, 0xBE, 0xFF, 0xB3, 0xB4, 0xB1, 0xFF, 0xA5, 0xA6, 0xA3, 0xFF, 0x9C, 0x9C, 0x9A, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, 0x99, 0x99, 0x97, 0xFF, + 0x94, 0x94, 0x92, 0xFF, 0x92, 0x92, 0x90, 0xFF, 0x8E, 0x90, 0x8D, 0xFF, 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x82, 0x85, 0x82, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1A, 0x1A, 0x16, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, + 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, 0x19, 0x17, 0x13, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x10, 0x0E, 0x0C, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, + 0x23, 0x21, 0x20, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x27, 0x23, 0x22, 0xFF, + 0x24, 0x1F, 0x1F, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x20, 0x1C, 0x1B, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x2B, 0x26, 0x26, 0xFF, + 0x3A, 0x35, 0x35, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x38, 0x33, 0x32, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x6A, 0x68, 0x69, 0xFF, 0x83, 0x80, 0x81, 0xFF, + 0x9B, 0x99, 0x9A, 0xFF, 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xBF, 0xBF, 0xBF, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, + 0xCE, 0xCE, 0xCE, 0xFF, 0xD2, 0xD2, 0xD2, 0xFF, 0xD7, 0xD9, 0xD9, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, + 0xBF, 0xC1, 0xC0, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xCE, 0xCE, 0xCC, 0xFF, 0xC2, 0xC3, 0xC0, 0xFF, 0xB2, 0xB3, 0xB0, 0xFF, 0xA3, 0xA3, 0xA1, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, + 0x97, 0x98, 0x95, 0xFF, 0x93, 0x93, 0x91, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, 0x84, 0x87, 0x84, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, + 0x1F, 0x1D, 0x19, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x19, 0x17, 0x13, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x13, 0x11, 0x0F, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, + 0x22, 0x20, 0x1F, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x22, 0x21, 0xFF, 0x2A, 0x25, 0x24, 0xFF, + 0x26, 0x22, 0x21, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x27, 0x23, 0x22, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x35, 0x31, 0x30, 0xFF, + 0x44, 0x40, 0x3F, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, 0x44, 0x40, 0x3F, 0xFF, 0x51, 0x4D, 0x4C, 0xFF, 0x86, 0x84, 0x85, 0xFF, 0x95, 0x93, 0x94, 0xFF, + 0xAF, 0xAD, 0xAD, 0xFF, 0xAD, 0xAA, 0xAB, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, + 0xC1, 0xC1, 0xC1, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, + 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, + 0xC1, 0xC3, 0xC2, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xDB, 0xDB, 0xD9, 0xFF, 0xD5, 0xD5, 0xD3, 0xFF, 0xC7, 0xC7, 0xC5, 0xFF, 0xB6, 0xB6, 0xB4, 0xFF, 0xA4, 0xA5, 0xA2, 0xFF, 0x9D, 0x9E, 0x9B, 0xFF, + 0x9B, 0x9B, 0x99, 0xFF, 0x96, 0x97, 0x94, 0xFF, 0x90, 0x93, 0x90, 0xFF, 0x8E, 0x90, 0x8D, 0xFF, 0x8A, 0x8D, 0x8A, 0xFF, 0x87, 0x89, 0x86, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x26, 0x27, 0x22, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x23, 0x22, 0x1E, 0xFF, + 0x22, 0x21, 0x1D, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x19, 0x17, 0x13, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, + 0x22, 0x20, 0x1F, 0xFF, 0x23, 0x21, 0x20, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x26, 0x24, 0x22, 0xFF, 0x2A, 0x25, 0x24, 0xFF, 0x2D, 0x29, 0x28, 0xFF, + 0x2A, 0x25, 0x24, 0xFF, 0x25, 0x21, 0x20, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x31, 0x2C, 0x2B, 0xFF, 0x39, 0x34, 0x34, 0xFF, 0x44, 0x40, 0x3F, 0xFF, + 0x4D, 0x48, 0x47, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x3F, 0x3A, 0x39, 0xFF, 0x50, 0x4C, 0x4B, 0xFF, 0x88, 0x85, 0x86, 0xFF, 0x97, 0x94, 0x95, 0xFF, + 0xAE, 0xAC, 0xAC, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC2, 0xC2, 0xC2, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, + 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xDD, 0xDE, 0xDB, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xD9, 0xD9, 0xD7, 0xFF, 0xC8, 0xC9, 0xC6, 0xFF, 0xB1, 0xB1, 0xAF, 0xFF, 0xA0, 0xA0, 0x9D, 0xFF, + 0x9C, 0x9C, 0x9A, 0xFF, 0x9A, 0x9A, 0x98, 0xFF, 0x92, 0x95, 0x92, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x88, 0x8B, 0x87, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x70, 0x71, 0x6C, 0xFF, 0x6A, 0x6B, 0x66, 0xFF, + 0x63, 0x64, 0x5F, 0xFF, 0x5D, 0x5E, 0x59, 0xFF, 0x57, 0x58, 0x53, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x46, 0x47, 0x42, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, + 0x30, 0x31, 0x2C, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, + 0x1B, 0x1C, 0x17, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, + 0x25, 0x23, 0x1F, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x20, 0x1E, 0x1A, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1A, 0x18, 0x14, 0xFF, + 0x17, 0x15, 0x11, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x26, 0x24, 0x22, 0xFF, 0x25, 0x22, 0x21, 0xFF, + 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x2C, 0x29, 0x28, 0xFF, 0x2C, 0x28, 0x27, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, + 0x2C, 0x28, 0x27, 0xFF, 0x27, 0x23, 0x22, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x4F, 0x4A, 0x4A, 0xFF, + 0x4E, 0x49, 0x48, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x3A, 0x35, 0x35, 0xFF, 0x9A, 0x98, 0x99, 0xFF, 0xA8, 0xA6, 0xA7, 0xFF, + 0xBB, 0xB8, 0xB9, 0xFF, 0xB8, 0xB6, 0xB7, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xA9, 0xA9, 0xA9, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, + 0xBE, 0xBE, 0xBE, 0xFF, 0xC1, 0xC1, 0xC1, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, + 0xD0, 0xD0, 0xD0, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xD7, 0xD7, 0xD7, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, + 0x9F, 0xA2, 0xA1, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0x96, 0x98, 0x97, 0xFF, 0x91, 0x94, 0x93, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x80, 0x82, 0x7F, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x73, 0x76, 0x72, 0xFF, 0x6F, 0x73, 0x6D, 0xFF, 0x71, 0x74, 0x6E, 0xFF, + 0x67, 0x6A, 0x65, 0xFF, 0x59, 0x5C, 0x57, 0xFF, 0x55, 0x56, 0x51, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x3F, 0x40, 0x3B, 0xFF, 0x33, 0x34, 0x2F, 0xFF, + 0x2B, 0x2C, 0x27, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1E, 0x1F, 0x1A, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, + 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x27, 0x26, 0x1F, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, + 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, 0x23, 0x1F, 0x19, 0xFF, 0x21, 0x1E, 0x18, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x13, 0x12, 0x0B, 0xFF, + 0x14, 0x13, 0x0D, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x35, 0x33, 0x2F, 0xFF, 0x38, 0x37, 0x33, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, + 0x2A, 0x26, 0x22, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x35, 0x31, 0x2E, 0xFF, 0x41, 0x3D, 0x3A, 0xFF, 0x47, 0x43, 0x3F, 0xFF, 0x46, 0x42, 0x3E, 0xFF, + 0x33, 0x2E, 0x2E, 0xFF, 0x1F, 0x1B, 0x1A, 0xFF, 0x2C, 0x28, 0x27, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, 0x93, 0x91, 0x90, 0xFF, 0xA0, 0x9E, 0x9C, 0xFF, + 0xA7, 0xA5, 0xA3, 0xFF, 0xA5, 0xA3, 0xA1, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0xB6, 0xB6, 0xB6, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC9, 0xC9, 0xC9, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xD1, 0xD4, 0xD3, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, + 0xC4, 0xC7, 0xC6, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xE1, 0xE1, 0xE1, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD3, 0xD3, 0xD3, 0xFF, 0xCB, 0xCB, 0xCB, 0xFF, 0xBA, 0xBA, 0xBA, 0xFF, + 0xAB, 0xAD, 0xAC, 0xFF, 0xA0, 0xA3, 0xA2, 0xFF, 0x8E, 0x90, 0x8F, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x82, 0x86, 0x85, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6A, 0x6D, 0x67, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, + 0x66, 0x69, 0x64, 0xFF, 0x5A, 0x5E, 0x58, 0xFF, 0x4F, 0x50, 0x4B, 0xFF, 0x41, 0x42, 0x3D, 0xFF, 0x31, 0x32, 0x2D, 0xFF, 0x23, 0x24, 0x1F, 0xFF, + 0x2C, 0x2D, 0x28, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, + 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x28, 0x27, 0x20, 0xFF, 0x2A, 0x29, 0x23, 0xFF, 0x2A, 0x29, 0x23, 0xFF, + 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, 0x24, 0x20, 0x1B, 0xFF, 0x21, 0x1E, 0x18, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x17, 0x15, 0x0F, 0xFF, + 0x1F, 0x1D, 0x17, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x2C, 0x2A, 0x26, 0xFF, 0x27, 0x25, 0x21, 0xFF, + 0x2A, 0x29, 0x25, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x34, 0x32, 0x2E, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x2B, 0x27, 0x24, 0xFF, + 0x2C, 0x28, 0x25, 0xFF, 0x31, 0x2D, 0x29, 0xFF, 0x44, 0x40, 0x3D, 0xFF, 0x4B, 0x47, 0x44, 0xFF, 0x4A, 0x46, 0x43, 0xFF, 0x40, 0x3C, 0x39, 0xFF, + 0x2B, 0x26, 0x26, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, 0x36, 0x32, 0x31, 0xFF, 0x5D, 0x58, 0x58, 0xFF, 0x89, 0x87, 0x85, 0xFF, 0x97, 0x95, 0x93, 0xFF, + 0xA1, 0x9F, 0x9D, 0xFF, 0xA1, 0x9F, 0x9D, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, + 0xB0, 0xB0, 0xB0, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xBE, 0xBE, 0xBE, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, + 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xD4, 0xD4, 0xD4, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, + 0xAF, 0xB2, 0xB1, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x7C, 0x7F, 0x7C, 0xFF, 0x79, 0x7B, 0x78, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6B, 0x6D, 0x6A, 0xFF, 0x56, 0x59, 0x53, 0xFF, 0x5C, 0x5F, 0x59, 0xFF, + 0x5A, 0x5E, 0x58, 0xFF, 0x51, 0x54, 0x4F, 0xFF, 0x4B, 0x4B, 0x46, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x47, 0x48, 0x43, 0xFF, 0x42, 0x43, 0x3E, 0xFF, + 0x32, 0x33, 0x2E, 0xFF, 0x25, 0x26, 0x21, 0xFF, 0x1B, 0x1C, 0x17, 0xFF, 0x16, 0x17, 0x12, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, + 0x1C, 0x1B, 0x15, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x20, 0x1F, 0x18, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x28, 0x27, 0x20, 0xFF, 0x28, 0x27, 0x20, 0xFF, + 0x2C, 0x28, 0x23, 0xFF, 0x27, 0x24, 0x1E, 0xFF, 0x25, 0x21, 0x1C, 0xFF, 0x23, 0x1F, 0x19, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x21, 0x20, 0x19, 0xFF, + 0x28, 0x27, 0x20, 0xFF, 0x2C, 0x2A, 0x24, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x29, 0x28, 0x24, 0xFF, + 0x2D, 0x2B, 0x27, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, 0x33, 0x31, 0x2D, 0xFF, 0x27, 0x23, 0x20, 0xFF, 0x28, 0x24, 0x21, 0xFF, + 0x34, 0x30, 0x2D, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x48, 0x44, 0x41, 0xFF, 0x4A, 0x46, 0x43, 0xFF, 0x44, 0x40, 0x3D, 0xFF, 0x36, 0x32, 0x2F, 0xFF, + 0x1E, 0x1A, 0x19, 0xFF, 0x24, 0x1F, 0x1F, 0xFF, 0x43, 0x3F, 0x3E, 0xFF, 0x6C, 0x68, 0x67, 0xFF, 0x83, 0x81, 0x7F, 0xFF, 0x94, 0x92, 0x91, 0xFF, + 0xA3, 0xA1, 0xA0, 0xFF, 0xA6, 0xA4, 0xA2, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB7, 0xB7, 0xB7, 0xFF, + 0xA8, 0xA8, 0xA8, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC5, 0xC5, 0xC5, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, + 0xBF, 0xC1, 0xC0, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, + 0xBF, 0xC1, 0xC0, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0x8F, 0x91, 0x90, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x80, 0x85, 0x84, 0xFF, + 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x66, 0x69, 0x66, 0xFF, 0x59, 0x5C, 0x59, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x66, 0x69, 0x64, 0xFF, + 0x67, 0x6A, 0x65, 0xFF, 0x61, 0x65, 0x5F, 0xFF, 0x54, 0x55, 0x50, 0xFF, 0x4E, 0x4F, 0x4A, 0xFF, 0x48, 0x49, 0x44, 0xFF, 0x40, 0x41, 0x3C, 0xFF, + 0x36, 0x36, 0x32, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1A, 0x1A, 0x16, 0xFF, 0x13, 0x13, 0x0F, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, 0x1B, 0x1A, 0x14, 0xFF, + 0x1B, 0x1A, 0x14, 0xFF, 0x1C, 0x1B, 0x15, 0xFF, 0x1E, 0x1C, 0x16, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x23, 0x22, 0x1C, 0xFF, 0x27, 0x24, 0x1E, 0xFF, + 0x2C, 0x28, 0x23, 0xFF, 0x2A, 0x26, 0x20, 0xFF, 0x26, 0x22, 0x1D, 0xFF, 0x24, 0x20, 0x1B, 0xFF, 0x2D, 0x29, 0x24, 0xFF, 0x2F, 0x2E, 0x27, 0xFF, + 0x29, 0x28, 0x22, 0xFF, 0x1E, 0x1C, 0x18, 0xFF, 0x23, 0x22, 0x1E, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, 0x31, 0x30, 0x2C, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, + 0x2F, 0x2D, 0x29, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x29, 0x28, 0x24, 0xFF, 0x32, 0x2E, 0x2B, 0xFF, 0x2B, 0x27, 0x24, 0xFF, 0x2E, 0x2A, 0x27, 0xFF, + 0x3D, 0x39, 0x36, 0xFF, 0x52, 0x4E, 0x4B, 0xFF, 0x3D, 0x39, 0x36, 0xFF, 0x41, 0x3D, 0x3A, 0xFF, 0x3D, 0x39, 0x36, 0xFF, 0x35, 0x31, 0x2E, 0xFF, + 0x1A, 0x16, 0x15, 0xFF, 0x2B, 0x26, 0x26, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, 0x7B, 0x77, 0x76, 0xFF, 0x86, 0x84, 0x83, 0xFF, 0x9A, 0x98, 0x97, 0xFF, + 0xAD, 0xAB, 0xA9, 0xFF, 0xB1, 0xAF, 0xAE, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xB6, 0xB6, 0xB6, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, + 0xE1, 0xE0, 0xE3, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE5, 0xE5, 0xE7, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xD5, 0xD5, 0xD7, 0xFF, + 0xB8, 0xBA, 0xBB, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x7E, 0x82, 0x83, 0xFF, 0x78, 0x7D, 0x7D, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x73, 0x74, 0xFF, + 0x5D, 0x62, 0x61, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x5D, 0x62, 0x61, 0xFF, 0x6D, 0x70, 0x6D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, + 0x6D, 0x70, 0x6D, 0xFF, 0x78, 0x7A, 0x77, 0xFF, 0x68, 0x68, 0x66, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, 0x3E, 0x3E, 0x3C, 0xFF, + 0x2D, 0x2E, 0x29, 0xFF, 0x28, 0x28, 0x24, 0xFF, 0x1C, 0x1D, 0x18, 0xFF, 0x0F, 0x10, 0x0B, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, + 0x19, 0x18, 0x11, 0xFF, 0x19, 0x18, 0x11, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x1C, 0x18, 0x12, 0xFF, 0x1D, 0x19, 0x14, 0xFF, + 0x2B, 0x25, 0x22, 0xFF, 0x2E, 0x27, 0x25, 0xFF, 0x29, 0x22, 0x20, 0xFF, 0x23, 0x1D, 0x1A, 0xFF, 0x3B, 0x37, 0x34, 0xFF, 0x35, 0x31, 0x2E, 0xFF, + 0x27, 0x23, 0x20, 0xFF, 0x1C, 0x18, 0x14, 0xFF, 0x23, 0x1E, 0x1D, 0xFF, 0x3B, 0x37, 0x36, 0xFF, 0x40, 0x3B, 0x3B, 0xFF, 0x33, 0x2E, 0x2E, 0xFF, + 0x32, 0x2D, 0x2D, 0xFF, 0x2D, 0x29, 0x28, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x40, 0x39, 0x39, 0xFF, 0x40, 0x39, 0x39, 0xFF, + 0x3F, 0x38, 0x38, 0xFF, 0x3F, 0x38, 0x38, 0xFF, 0x31, 0x2A, 0x2A, 0xFF, 0x3F, 0x38, 0x38, 0xFF, 0x3C, 0x38, 0x37, 0xFF, 0x2D, 0x29, 0x28, 0xFF, + 0x22, 0x1B, 0x1B, 0xFF, 0x3C, 0x35, 0x35, 0xFF, 0x72, 0x6D, 0x6D, 0xFF, 0x96, 0x91, 0x91, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, 0xA4, 0x9F, 0xA1, 0xFF, + 0xA8, 0xA6, 0xA7, 0xFF, 0xA9, 0xA7, 0xA8, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, 0x9B, 0x99, 0x9A, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, + 0xB4, 0xB4, 0xB4, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, + 0xC7, 0xC7, 0xC7, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC1, 0xC3, 0xC2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xDC, 0xDC, 0xDE, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, 0xDD, 0xDD, 0xDF, 0xFF, 0xDB, 0xDA, 0xDD, 0xFF, 0xC9, 0xC9, 0xCB, 0xFF, 0xBD, 0xBC, 0xBF, 0xFF, + 0xA1, 0xA3, 0xA5, 0xFF, 0x8B, 0x8D, 0x8F, 0xFF, 0x84, 0x88, 0x89, 0xFF, 0x7B, 0x7F, 0x80, 0xFF, 0x74, 0x7B, 0x7B, 0xFF, 0x6B, 0x72, 0x72, 0xFF, + 0x67, 0x6C, 0x6A, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x5A, 0x5D, 0x5A, 0xFF, + 0x66, 0x69, 0x66, 0xFF, 0x76, 0x79, 0x76, 0xFF, 0x73, 0x74, 0x71, 0xFF, 0x5A, 0x5A, 0x58, 0xFF, 0x41, 0x42, 0x3F, 0xFF, 0x36, 0x36, 0x34, 0xFF, + 0x33, 0x34, 0x2F, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x22, 0x23, 0x1E, 0xFF, 0x15, 0x16, 0x11, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, + 0x1A, 0x19, 0x12, 0xFF, 0x1A, 0x19, 0x12, 0xFF, 0x16, 0x12, 0x0D, 0xFF, 0x17, 0x13, 0x0E, 0xFF, 0x18, 0x14, 0x0F, 0xFF, 0x19, 0x16, 0x10, 0xFF, + 0x1E, 0x18, 0x16, 0xFF, 0x24, 0x1E, 0x1B, 0xFF, 0x28, 0x21, 0x1F, 0xFF, 0x27, 0x20, 0x1E, 0xFF, 0x33, 0x2F, 0x2C, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, + 0x27, 0x23, 0x20, 0xFF, 0x1F, 0x1B, 0x18, 0xFF, 0x2F, 0x2B, 0x2A, 0xFF, 0x41, 0x3C, 0x3C, 0xFF, 0x42, 0x3E, 0x3D, 0xFF, 0x38, 0x33, 0x32, 0xFF, + 0x3D, 0x39, 0x38, 0xFF, 0x41, 0x3C, 0x3C, 0xFF, 0x49, 0x45, 0x44, 0xFF, 0x52, 0x4E, 0x4D, 0xFF, 0x4D, 0x46, 0x46, 0xFF, 0x45, 0x3E, 0x3E, 0xFF, + 0x39, 0x32, 0x32, 0xFF, 0x30, 0x29, 0x29, 0xFF, 0x35, 0x2E, 0x2E, 0xFF, 0x3A, 0x34, 0x34, 0xFF, 0x34, 0x30, 0x2F, 0xFF, 0x26, 0x22, 0x21, 0xFF, + 0x28, 0x21, 0x21, 0xFF, 0x4C, 0x45, 0x45, 0xFF, 0x7F, 0x7A, 0x79, 0xFF, 0x98, 0x94, 0x93, 0xFF, 0xA5, 0xA0, 0xA2, 0xFF, 0x9E, 0x99, 0x9B, 0xFF, + 0x97, 0x94, 0x95, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x98, 0x95, 0x96, 0xFF, 0x9C, 0x9A, 0x9B, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, + 0xBF, 0xBF, 0xBF, 0xFF, 0xAD, 0xAD, 0xAD, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0x9C, 0x9C, 0x9C, 0xFF, 0xA3, 0xA3, 0xA3, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, + 0xC4, 0xC4, 0xC4, 0xFF, 0xC6, 0xC6, 0xC6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, + 0xC9, 0xCB, 0xCB, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xDF, 0xE1, 0xE3, 0xFF, 0xD2, 0xD4, 0xD6, 0xFF, 0xBD, 0xBF, 0xC1, 0xFF, 0xAB, 0xAD, 0xAE, 0xFF, 0x9A, 0x9C, 0x9E, 0xFF, 0x9D, 0x9F, 0xA0, 0xFF, + 0xA6, 0xA8, 0xAA, 0xFF, 0xAF, 0xB3, 0xB4, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7B, 0x83, 0x80, 0xFF, + 0x6B, 0x70, 0x6F, 0xFF, 0x74, 0x79, 0x75, 0xFF, 0x74, 0x79, 0x75, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x5C, 0x61, 0x5D, 0xFF, 0x5F, 0x64, 0x60, 0xFF, + 0x63, 0x68, 0x64, 0xFF, 0x6A, 0x6C, 0x69, 0xFF, 0x65, 0x68, 0x64, 0xFF, 0x63, 0x65, 0x62, 0xFF, 0x4F, 0x52, 0x4E, 0xFF, 0x37, 0x3A, 0x37, 0xFF, + 0x3B, 0x3C, 0x37, 0xFF, 0x36, 0x36, 0x32, 0xFF, 0x2A, 0x2B, 0x26, 0xFF, 0x1D, 0x1E, 0x19, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, + 0x1F, 0x1D, 0x17, 0xFF, 0x1F, 0x1D, 0x17, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x18, 0x14, 0x0F, 0xFF, 0x16, 0x12, 0x0D, 0xFF, 0x17, 0x13, 0x0E, 0xFF, + 0x19, 0x12, 0x10, 0xFF, 0x20, 0x19, 0x17, 0xFF, 0x26, 0x22, 0x1F, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x38, 0x34, 0x30, 0xFF, 0x34, 0x30, 0x2D, 0xFF, + 0x2A, 0x29, 0x25, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x2F, 0x2D, 0x2B, 0xFF, 0x3E, 0x3C, 0x3B, 0xFF, 0x42, 0x40, 0x3E, 0xFF, 0x3E, 0x3C, 0x3B, 0xFF, + 0x3D, 0x3B, 0x39, 0xFF, 0x44, 0x42, 0x40, 0xFF, 0x49, 0x47, 0x45, 0xFF, 0x4B, 0x47, 0x46, 0xFF, 0x3D, 0x39, 0x38, 0xFF, 0x38, 0x33, 0x32, 0xFF, + 0x30, 0x29, 0x29, 0xFF, 0x2A, 0x23, 0x23, 0xFF, 0x37, 0x30, 0x30, 0xFF, 0x39, 0x32, 0x32, 0xFF, 0x35, 0x31, 0x30, 0xFF, 0x32, 0x2D, 0x2D, 0xFF, + 0x40, 0x39, 0x39, 0xFF, 0x69, 0x62, 0x62, 0xFF, 0x8F, 0x8A, 0x8A, 0xFF, 0x9B, 0x96, 0x95, 0xFF, 0xA1, 0x9F, 0xA0, 0xFF, 0x8E, 0x8C, 0x8D, 0xFF, + 0x84, 0x82, 0x82, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x99, 0x97, 0x97, 0xFF, 0xA6, 0xA3, 0xA4, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, + 0xB6, 0xB6, 0xB6, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, + 0xB9, 0xB9, 0xB9, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, + 0xCD, 0xCF, 0xCE, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xA4, 0xA6, 0xA7, 0xFF, 0xAC, 0xAE, 0xB0, 0xFF, 0xB6, 0xB8, 0xBA, 0xFF, 0xBB, 0xBD, 0xBF, 0xFF, 0xB8, 0xBA, 0xBB, 0xFF, 0xAB, 0xAD, 0xAE, 0xFF, + 0xA4, 0xA9, 0xAA, 0xFF, 0xAA, 0xAF, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, + 0x67, 0x6C, 0x68, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x67, 0x6C, 0x68, 0xFF, 0x4F, 0x55, 0x51, 0xFF, 0x56, 0x5C, 0x58, 0xFF, + 0x4F, 0x55, 0x51, 0xFF, 0x40, 0x46, 0x42, 0xFF, 0x5D, 0x60, 0x5C, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x7E, 0x81, 0x7E, 0xFF, 0x6B, 0x6D, 0x6A, 0xFF, + 0x41, 0x42, 0x3D, 0xFF, 0x3B, 0x3C, 0x37, 0xFF, 0x30, 0x31, 0x2C, 0xFF, 0x23, 0x24, 0x1F, 0xFF, 0x21, 0x20, 0x19, 0xFF, 0x21, 0x20, 0x19, 0xFF, + 0x21, 0x20, 0x19, 0xFF, 0x22, 0x21, 0x1B, 0xFF, 0x1D, 0x19, 0x14, 0xFF, 0x1C, 0x18, 0x12, 0xFF, 0x19, 0x16, 0x10, 0xFF, 0x18, 0x14, 0x0F, 0xFF, + 0x1B, 0x14, 0x12, 0xFF, 0x1E, 0x18, 0x16, 0xFF, 0x26, 0x22, 0x1F, 0xFF, 0x2F, 0x2B, 0x28, 0xFF, 0x43, 0x3F, 0x3C, 0xFF, 0x3D, 0x39, 0x36, 0xFF, + 0x2E, 0x2C, 0x28, 0xFF, 0x22, 0x21, 0x1D, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x33, 0x30, 0x2F, 0xFF, 0x3D, 0x3B, 0x39, 0xFF, 0x42, 0x40, 0x3E, 0xFF, + 0x33, 0x30, 0x2F, 0xFF, 0x38, 0x36, 0x35, 0xFF, 0x34, 0x32, 0x30, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x1C, 0x17, 0x16, 0xFF, 0x21, 0x1D, 0x1C, 0xFF, + 0x2A, 0x25, 0x24, 0xFF, 0x2E, 0x2A, 0x29, 0xFF, 0x35, 0x31, 0x30, 0xFF, 0x39, 0x34, 0x34, 0xFF, 0x3F, 0x3D, 0x3C, 0xFF, 0x47, 0x45, 0x44, 0xFF, + 0x68, 0x64, 0x63, 0xFF, 0x89, 0x85, 0x84, 0xFF, 0x9A, 0x98, 0x97, 0xFF, 0x98, 0x96, 0x94, 0xFF, 0x95, 0x93, 0x94, 0xFF, 0x81, 0x7E, 0x7F, 0xFF, + 0x79, 0x79, 0x79, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA2, 0xA0, 0xA1, 0xFF, 0xAF, 0xAD, 0xAD, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, + 0x9D, 0x9D, 0x9D, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, + 0xAD, 0xAD, 0xAD, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xC9, 0xCB, 0xCB, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, + 0xCE, 0xD0, 0xCF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBE, 0xC3, 0xC3, 0xFF, 0xB4, 0xB8, 0xB9, 0xFF, 0xB1, 0xB6, 0xB6, 0xFF, 0xB7, 0xBC, 0xBC, 0xFF, 0xBB, 0xBF, 0xC0, 0xFF, 0xA8, 0xAC, 0xAD, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0x8F, 0x97, 0x92, 0xFF, + 0x69, 0x70, 0x6D, 0xFF, 0x5E, 0x65, 0x63, 0xFF, 0x5A, 0x61, 0x5E, 0xFF, 0x5D, 0x64, 0x62, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, + 0x5B, 0x60, 0x5E, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x87, 0x89, 0x86, 0xFF, + 0x61, 0x64, 0x61, 0xFF, 0x40, 0x42, 0x3F, 0xFF, 0x2D, 0x30, 0x2B, 0xFF, 0x24, 0x25, 0x20, 0xFF, 0x15, 0x14, 0x10, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x21, 0x1F, 0x1B, 0xFF, 0x1F, 0x1D, 0x19, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x1C, 0x18, 0x14, 0xFF, + 0x27, 0x23, 0x20, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x25, 0x21, 0x1E, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x23, 0x22, 0x1E, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x25, 0x22, 0x21, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x2D, 0x2B, 0x29, 0xFF, + 0x1B, 0x19, 0x18, 0xFF, 0x1B, 0x19, 0x18, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x17, 0x15, 0x13, 0xFF, 0x1E, 0x1C, 0x1A, 0xFF, + 0x26, 0x27, 0x24, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x33, 0x34, 0x31, 0xFF, 0x32, 0x32, 0x30, 0xFF, 0x4B, 0x4E, 0x4B, 0xFF, 0x68, 0x6B, 0x68, 0xFF, + 0x78, 0x78, 0x76, 0xFF, 0x8E, 0x8E, 0x8C, 0xFF, 0x9B, 0x9B, 0x99, 0xFF, 0x97, 0x98, 0x95, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x80, 0x80, 0x80, 0xFF, + 0x85, 0x85, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x9B, 0x9B, 0x9B, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0x97, 0x97, 0x97, 0xFF, + 0x8E, 0x8E, 0x8E, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA1, 0xA1, 0xA1, 0xFF, 0xA2, 0xA2, 0xA2, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, + 0xAD, 0xAD, 0xAD, 0xFF, 0xAF, 0xAF, 0xAF, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xD0, 0xD2, 0xD2, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, + 0xC0, 0xC2, 0xC1, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, + 0xB4, 0xB8, 0xB9, 0xFF, 0xB5, 0xB9, 0xBA, 0xFF, 0xBC, 0xC0, 0xC1, 0xFF, 0xC2, 0xC6, 0xC7, 0xFF, 0xB9, 0xBE, 0xBF, 0xFF, 0xA9, 0xAE, 0xAE, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x94, 0x9B, 0x97, 0xFF, + 0x81, 0x88, 0x86, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, + 0x67, 0x6C, 0x6A, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, 0x6C, 0x6F, 0x6B, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, + 0x7D, 0x80, 0x7D, 0xFF, 0x67, 0x6A, 0x67, 0xFF, 0x43, 0x46, 0x41, 0xFF, 0x2D, 0x2E, 0x29, 0xFF, 0x17, 0x15, 0x11, 0xFF, 0x22, 0x21, 0x1D, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x28, 0x26, 0x22, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x26, 0x24, 0x20, 0xFF, 0x26, 0x24, 0x20, 0xFF, + 0x33, 0x2F, 0x2C, 0xFF, 0x2C, 0x28, 0x25, 0xFF, 0x26, 0x22, 0x1F, 0xFF, 0x21, 0x1D, 0x1A, 0xFF, 0x1C, 0x1B, 0x17, 0xFF, 0x14, 0x13, 0x0F, 0xFF, + 0x1A, 0x18, 0x14, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x18, 0x16, 0x14, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, + 0x11, 0x0F, 0x0D, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x13, 0x11, 0x0F, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x14, 0x12, 0x11, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, + 0x23, 0x25, 0x22, 0xFF, 0x29, 0x2C, 0x29, 0xFF, 0x2E, 0x31, 0x2E, 0xFF, 0x44, 0x47, 0x44, 0xFF, 0x69, 0x6E, 0x6A, 0xFF, 0x7F, 0x84, 0x80, 0xFF, + 0x81, 0x84, 0x80, 0xFF, 0x85, 0x88, 0x85, 0xFF, 0x8C, 0x8F, 0x8C, 0xFF, 0x92, 0x95, 0x92, 0xFF, 0x7A, 0x7A, 0x7A, 0xFF, 0x76, 0x76, 0x76, 0xFF, + 0x7A, 0x7A, 0x7A, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, 0x90, 0x90, 0x90, 0xFF, 0x93, 0x93, 0x93, 0xFF, 0x94, 0x94, 0x94, 0xFF, + 0x8F, 0x8F, 0x8F, 0xFF, 0x96, 0x96, 0x96, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, 0xA0, 0xA0, 0xA0, 0xFF, + 0xA3, 0xA3, 0xA3, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xCE, 0xD0, 0xCF, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xD1, 0xD4, 0xD3, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, + 0xB2, 0xB9, 0xB9, 0xFF, 0xBB, 0xC2, 0xC2, 0xFF, 0xC2, 0xC9, 0xC9, 0xFF, 0xC0, 0xC7, 0xC7, 0xFF, 0xB4, 0xBB, 0xBB, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, + 0x9F, 0xA7, 0xA4, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x8E, 0x96, 0x91, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, + 0x9E, 0xA6, 0xA1, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x7B, 0x83, 0x7E, 0xFF, 0x78, 0x7F, 0x7B, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, + 0x72, 0x79, 0x77, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, 0x62, 0x67, 0x63, 0xFF, + 0x83, 0x86, 0x83, 0xFF, 0x8B, 0x8E, 0x8B, 0xFF, 0x6C, 0x6F, 0x69, 0xFF, 0x3D, 0x3D, 0x39, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x23, 0x22, 0x1E, 0xFF, + 0x29, 0x28, 0x24, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x2A, 0x29, 0x25, 0xFF, 0x2C, 0x2A, 0x26, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2E, 0x2C, 0x28, 0xFF, + 0x39, 0x35, 0x32, 0xFF, 0x2A, 0x26, 0x22, 0xFF, 0x1B, 0x1A, 0x16, 0xFF, 0x1A, 0x18, 0x14, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0C, 0x0A, 0x06, 0xFF, + 0x10, 0x11, 0x0C, 0xFF, 0x10, 0x11, 0x0C, 0xFF, 0x0A, 0x0B, 0x08, 0xFF, 0x0E, 0x0E, 0x0C, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0F, 0x10, 0x0D, 0xFF, 0x16, 0x17, 0x14, 0xFF, + 0x1F, 0x22, 0x1F, 0xFF, 0x27, 0x2A, 0x27, 0xFF, 0x36, 0x39, 0x36, 0xFF, 0x4C, 0x4F, 0x4C, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x85, 0x8A, 0x86, 0xFF, + 0x7C, 0x7F, 0x7C, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x7B, 0x7E, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x6F, 0x72, 0x71, 0xFF, + 0x74, 0x76, 0x76, 0xFF, 0x7E, 0x81, 0x80, 0xFF, 0x89, 0x89, 0x89, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, + 0xA9, 0xA9, 0xA9, 0xFF, 0xB4, 0xB4, 0xB4, 0xFF, 0xB9, 0xB9, 0xB9, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xC4, 0xC4, 0xC4, 0xFF, 0xB3, 0xB3, 0xB3, 0xFF, + 0xAA, 0xAA, 0xAA, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xC7, 0xC9, 0xC8, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, + 0xD5, 0xD7, 0xD6, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, + 0xBD, 0xC3, 0xC3, 0xFF, 0xC6, 0xCD, 0xCD, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, 0xB3, 0xBA, 0xBA, 0xFF, 0xAB, 0xB2, 0xB2, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0x93, 0x9A, 0x97, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xA4, 0xAC, 0xA7, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA4, 0xAC, 0xA5, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0x97, 0x9F, 0x9A, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x8C, 0x93, 0x8E, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x82, 0x8A, 0x87, 0xFF, + 0x80, 0x87, 0x85, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x5B, 0x60, 0x5C, 0xFF, + 0x79, 0x7B, 0x78, 0xFF, 0x91, 0x94, 0x91, 0xFF, 0x88, 0x8B, 0x85, 0xFF, 0x58, 0x5B, 0x56, 0xFF, 0x21, 0x21, 0x1D, 0xFF, 0x25, 0x23, 0x1F, 0xFF, + 0x2A, 0x29, 0x25, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x27, 0x25, 0x21, 0xFF, 0x29, 0x28, 0x24, 0xFF, 0x2D, 0x2B, 0x27, 0xFF, 0x2F, 0x2D, 0x29, 0xFF, + 0x36, 0x32, 0x2F, 0xFF, 0x23, 0x1F, 0x1B, 0xFF, 0x12, 0x10, 0x0C, 0xFF, 0x0D, 0x0C, 0x08, 0xFF, 0x14, 0x13, 0x0F, 0xFF, 0x0B, 0x09, 0x05, 0xFF, + 0x0F, 0x10, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x10, 0x11, 0x0E, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x18, 0x19, 0x16, 0xFF, + 0x0D, 0x0D, 0x0B, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x14, 0x14, 0x12, 0xFF, + 0x1D, 0x1F, 0x1C, 0xFF, 0x24, 0x26, 0x23, 0xFF, 0x2F, 0x32, 0x2F, 0xFF, 0x34, 0x37, 0x34, 0xFF, 0x43, 0x48, 0x44, 0xFF, 0x58, 0x5D, 0x59, 0xFF, + 0x6C, 0x6F, 0x6B, 0xFF, 0x74, 0x77, 0x74, 0xFF, 0x6F, 0x72, 0x6F, 0xFF, 0x5E, 0x61, 0x5D, 0xFF, 0x7A, 0x7C, 0x7B, 0xFF, 0x75, 0x78, 0x77, 0xFF, + 0x79, 0x7B, 0x7A, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, + 0xB0, 0xB0, 0xB0, 0xFF, 0xB8, 0xB8, 0xB8, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0xB2, 0xB2, 0xB2, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, + 0xA7, 0xA6, 0xA7, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, + 0xC8, 0xCA, 0xC9, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0xAF, 0xB5, 0xB5, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, 0xB1, 0xB8, 0xB8, 0xFF, 0xAF, 0xB5, 0xB5, 0xFF, 0xB0, 0xB7, 0xB6, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, + 0x8E, 0x96, 0x91, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0x87, 0x8E, 0x8C, 0xFF, + 0x7F, 0x86, 0x84, 0xFF, 0x79, 0x80, 0x7E, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, 0x72, 0x77, 0x78, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x52, 0x57, 0x55, 0xFF, + 0x6F, 0x72, 0x6F, 0xFF, 0x93, 0x96, 0x93, 0xFF, 0x9A, 0x9D, 0x9A, 0xFF, 0x75, 0x78, 0x75, 0xFF, 0x24, 0x24, 0x22, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, + 0x1D, 0x1D, 0x1B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, 0x28, 0x26, 0x24, 0xFF, 0x23, 0x21, 0x20, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x26, 0x24, 0x22, 0xFF, + 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, + 0x17, 0x19, 0x18, 0xFF, 0x1A, 0x1D, 0x1C, 0xFF, 0x24, 0x26, 0x25, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x1D, 0x22, 0x21, 0xFF, + 0x3C, 0x3F, 0x3E, 0xFF, 0x51, 0x53, 0x53, 0xFF, 0x5D, 0x5F, 0x5E, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x78, 0x7A, 0x79, 0xFF, 0x7E, 0x81, 0x80, 0xFF, + 0x84, 0x87, 0x86, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x87, 0x89, 0x88, 0xFF, 0x96, 0x98, 0x97, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, + 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xD2, 0xD5, 0xD4, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, + 0xA8, 0xAB, 0xAA, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xA8, 0xAE, 0xAE, 0xFF, 0xAA, 0xB1, 0xB1, 0xFF, 0xB2, 0xB9, 0xB9, 0xFF, 0xBB, 0xC2, 0xC2, 0xFF, 0xB6, 0xBC, 0xBC, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x9D, 0xA5, 0xA0, 0xFF, 0xA5, 0xAD, 0xA8, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, + 0x95, 0x9D, 0x98, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x9C, 0xA4, 0x9F, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x94, 0x9B, 0x99, 0xFF, + 0x82, 0x8A, 0x87, 0xFF, 0x74, 0x7C, 0x79, 0xFF, 0x78, 0x7D, 0x7D, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x5D, 0x62, 0x61, 0xFF, + 0x7A, 0x7D, 0x79, 0xFF, 0x8F, 0x92, 0x8E, 0xFF, 0x98, 0x9B, 0x98, 0xFF, 0x83, 0x86, 0x83, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, + 0x1C, 0x1C, 0x1A, 0xFF, 0x1B, 0x1B, 0x19, 0xFF, 0x20, 0x1E, 0x1C, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x1F, 0x1D, 0x1B, 0xFF, 0x26, 0x24, 0x22, 0xFF, + 0x2A, 0x28, 0x27, 0xFF, 0x15, 0x13, 0x12, 0xFF, 0x09, 0x07, 0x05, 0xFF, 0x10, 0x0E, 0x0C, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x15, 0x15, 0x15, 0xFF, + 0x16, 0x18, 0x17, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0D, 0x12, 0x10, 0xFF, + 0x1E, 0x20, 0x1F, 0xFF, 0x36, 0x39, 0x38, 0xFF, 0x51, 0x53, 0x53, 0xFF, 0x6A, 0x6C, 0x6B, 0xFF, 0x76, 0x79, 0x78, 0xFF, 0x82, 0x84, 0x84, 0xFF, + 0x8C, 0x8F, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, + 0xAA, 0xAC, 0xAB, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xCF, 0xD1, 0xD0, 0xFF, 0xCB, 0xCE, 0xCD, 0xFF, + 0xCF, 0xD1, 0xD0, 0xFF, 0xD9, 0xDC, 0xDB, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC2, 0xC4, 0xC4, 0xFF, 0xC0, 0xC2, 0xC1, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, + 0xD2, 0xD5, 0xD4, 0xFF, 0xD3, 0xD6, 0xD5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xAB, 0xB2, 0xB2, 0xFF, 0xA5, 0xAC, 0xAC, 0xFF, 0xAD, 0xB4, 0xB4, 0xFF, 0xBF, 0xC6, 0xC6, 0xFF, 0xBE, 0xC5, 0xC4, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x9D, 0xA5, 0xA0, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, 0xB1, 0xB8, 0xB4, 0xFF, + 0xB4, 0xBC, 0xB7, 0xFF, 0xA9, 0xB0, 0xAB, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, + 0x87, 0x8E, 0x8C, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, 0x76, 0x7A, 0x7B, 0xFF, 0x75, 0x79, 0x7A, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, + 0x76, 0x79, 0x76, 0xFF, 0x7D, 0x80, 0x7D, 0xFF, 0x90, 0x93, 0x90, 0xFF, 0x96, 0x99, 0x95, 0xFF, 0x2D, 0x2E, 0x2B, 0xFF, 0x1E, 0x1F, 0x1C, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x15, 0x15, 0x13, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x1A, 0x18, 0x16, 0xFF, 0x21, 0x1F, 0x1D, 0xFF, 0x2C, 0x29, 0x28, 0xFF, + 0x30, 0x2E, 0x2D, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x0A, 0x08, 0x06, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x17, 0x17, 0x17, 0xFF, + 0x13, 0x16, 0x15, 0xFF, 0x12, 0x15, 0x14, 0xFF, 0x09, 0x0B, 0x0A, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x03, 0x07, 0x06, 0xFF, + 0x10, 0x12, 0x11, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x43, 0x46, 0x45, 0xFF, 0x66, 0x68, 0x68, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x7C, 0x7F, 0x7E, 0xFF, + 0x8B, 0x8E, 0x8D, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, + 0x93, 0x96, 0x95, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, + 0xC6, 0xC8, 0xC7, 0xFF, 0xD5, 0xD7, 0xD6, 0xFF, 0xC8, 0xCA, 0xC9, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, + 0xCB, 0xCE, 0xCD, 0xFF, 0xCD, 0xCF, 0xCE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xB8, 0xBF, 0xBF, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, 0xA6, 0xAD, 0xAD, 0xFF, 0xB8, 0xBF, 0xBF, 0xFF, 0xC3, 0xCA, 0xCA, 0xFF, 0xB7, 0xBE, 0xBD, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xAA, 0xB1, 0xAD, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0x91, 0x99, 0x94, 0xFF, 0x96, 0x9E, 0x99, 0xFF, + 0x98, 0xA0, 0x9B, 0xFF, 0x93, 0x9A, 0x95, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, + 0x8F, 0x96, 0x94, 0xFF, 0x82, 0x8A, 0x87, 0xFF, 0x79, 0x7E, 0x7F, 0xFF, 0x72, 0x77, 0x78, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6F, 0x74, 0x72, 0xFF, + 0x6E, 0x71, 0x6E, 0xFF, 0x66, 0x69, 0x66, 0xFF, 0x7C, 0x7F, 0x7C, 0xFF, 0x97, 0x9A, 0x97, 0xFF, 0x32, 0x32, 0x30, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, + 0x1A, 0x1A, 0x18, 0xFF, 0x11, 0x12, 0x0F, 0xFF, 0x19, 0x17, 0x15, 0xFF, 0x1C, 0x1A, 0x19, 0xFF, 0x29, 0x27, 0x26, 0xFF, 0x35, 0x33, 0x31, 0xFF, + 0x3F, 0x3D, 0x3C, 0xFF, 0x22, 0x20, 0x1F, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, 0x0E, 0x0C, 0x0B, 0xFF, 0x0C, 0x0A, 0x08, 0xFF, + 0x0C, 0x0C, 0x0A, 0xFF, 0x0D, 0x0D, 0x0B, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x0F, 0x0F, 0x0F, 0xFF, + 0x0A, 0x0A, 0x0A, 0xFF, 0x0E, 0x0E, 0x0E, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, 0x18, 0x18, 0x18, 0xFF, + 0x12, 0x15, 0x14, 0xFF, 0x0F, 0x11, 0x10, 0xFF, 0x08, 0x0A, 0x09, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x01, 0x06, 0x05, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x33, 0x35, 0x34, 0xFF, 0x4E, 0x50, 0x4F, 0xFF, 0x5C, 0x5E, 0x5D, 0xFF, 0x72, 0x74, 0x73, 0xFF, + 0x84, 0x87, 0x86, 0xFF, 0x92, 0x95, 0x94, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, + 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xCA, 0xCD, 0xCC, 0xFF, 0xC6, 0xC8, 0xC7, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xA1, 0xA8, 0xA3, 0xFF, 0xA4, 0xAC, 0xA7, 0xFF, + 0xA5, 0xAC, 0xAA, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x70, 0x75, 0x73, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, 0x6A, 0x6F, 0x6D, 0xFF, + 0x70, 0x75, 0x73, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x75, 0x7A, 0x76, 0xFF, 0x7A, 0x7D, 0x79, 0xFF, 0x37, 0x3A, 0x37, 0xFF, 0x1D, 0x1F, 0x1C, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x1D, 0x1D, 0x1B, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x07, 0x07, 0x05, 0xFF, 0x2A, 0x2A, 0x28, 0xFF, 0x45, 0x45, 0x43, 0xFF, + 0x7C, 0x79, 0x7A, 0xFF, 0x4C, 0x4A, 0x4B, 0xFF, 0x47, 0x47, 0x47, 0xFF, 0x29, 0x29, 0x29, 0xFF, 0x22, 0x22, 0x22, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x09, 0x09, 0x09, 0xFF, 0x01, 0x01, 0x01, 0xFF, 0x10, 0x10, 0x10, 0xFF, 0x15, 0x15, 0x15, 0xFF, 0x0C, 0x0C, 0x0C, 0xFF, + 0x0C, 0x0C, 0x0C, 0xFF, 0x0D, 0x0D, 0x0D, 0xFF, 0x1A, 0x1A, 0x1A, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x2B, 0x2B, 0x2B, 0xFF, 0x1C, 0x1C, 0x1C, 0xFF, + 0x12, 0x15, 0x14, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x01, 0x03, 0x02, 0xFF, 0x06, 0x0B, 0x09, 0xFF, 0x0C, 0x11, 0x0F, 0xFF, + 0x00, 0x00, 0x00, 0xFF, 0x27, 0x2C, 0x2A, 0xFF, 0x46, 0x4B, 0x49, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, 0x49, 0x4D, 0x4C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, + 0x72, 0x77, 0x76, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x9A, 0x9D, 0x9C, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xBB, 0xBD, 0xBD, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, + 0xAF, 0xB2, 0xB1, 0xFF, 0xA6, 0xA8, 0xA8, 0xFF, 0x95, 0x97, 0x96, 0xFF, 0x8B, 0x8E, 0x8D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, + 0xAE, 0xB1, 0xB0, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAC, 0xB4, 0xAF, 0xFF, 0xB0, 0xB7, 0xB2, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x7F, 0x84, 0x82, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, + 0x63, 0x68, 0x66, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, 0x6D, 0x72, 0x6E, 0xFF, 0x70, 0x75, 0x71, 0xFF, 0x35, 0x38, 0x35, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, + 0x1A, 0x1D, 0x1A, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, 0x23, 0x23, 0x21, 0xFF, 0x13, 0x13, 0x11, 0xFF, 0x28, 0x28, 0x26, 0xFF, 0x4B, 0x4B, 0x48, 0xFF, + 0x8A, 0x87, 0x88, 0xFF, 0x6E, 0x6B, 0x6C, 0xFF, 0x8B, 0x8B, 0x8B, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x96, 0x96, 0x96, 0xFF, + 0x78, 0x78, 0x78, 0xFF, 0x4E, 0x4E, 0x4E, 0xFF, 0x30, 0x30, 0x30, 0xFF, 0x24, 0x24, 0x24, 0xFF, 0x25, 0x25, 0x25, 0xFF, 0x31, 0x31, 0x31, 0xFF, + 0x4F, 0x4F, 0x4F, 0xFF, 0x65, 0x65, 0x65, 0xFF, 0x77, 0x77, 0x77, 0xFF, 0x79, 0x79, 0x79, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, + 0x53, 0x56, 0x55, 0xFF, 0x3A, 0x3C, 0x3B, 0xFF, 0x15, 0x17, 0x16, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x24, 0x29, 0x28, 0xFF, 0x03, 0x07, 0x06, 0xFF, + 0x2F, 0x34, 0x32, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x4A, 0x4E, 0x4D, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, + 0x66, 0x6A, 0x69, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, 0x8F, 0x91, 0x90, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xB8, 0xBA, 0xB9, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9F, 0xA2, 0xA1, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, + 0xA3, 0xA5, 0xA4, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, + 0x63, 0x68, 0x66, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x66, 0x6B, 0x67, 0xFF, 0x6B, 0x71, 0x6D, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x19, 0x1C, 0x19, 0xFF, + 0x19, 0x1C, 0x19, 0xFF, 0x1C, 0x1E, 0x1B, 0xFF, 0x1A, 0x1A, 0x18, 0xFF, 0x14, 0x14, 0x12, 0xFF, 0x30, 0x30, 0x2E, 0xFF, 0x71, 0x71, 0x6F, 0xFF, + 0x97, 0x94, 0x95, 0xFF, 0x7F, 0x7D, 0x7E, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, 0xB0, 0xB0, 0xB0, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, + 0x9E, 0x9E, 0x9E, 0xFF, 0x9D, 0x9D, 0x9D, 0xFF, 0x8E, 0x8E, 0x8E, 0xFF, 0x8D, 0x8D, 0x8D, 0xFF, 0x88, 0x88, 0x88, 0xFF, 0x82, 0x82, 0x82, 0xFF, + 0x7D, 0x7D, 0x7D, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0x86, 0x86, 0x86, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x78, 0x78, 0x78, 0xFF, + 0x71, 0x73, 0x72, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x88, 0x8A, 0x89, 0xFF, 0x66, 0x68, 0x68, 0xFF, 0x6B, 0x70, 0x6F, 0xFF, 0x76, 0x7B, 0x79, 0xFF, + 0x5F, 0x63, 0x62, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x76, 0x7B, 0x79, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, + 0x82, 0x86, 0x85, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0x89, 0x8B, 0x8B, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0xA8, 0xAB, 0xAA, 0xFF, + 0xBC, 0xBF, 0xBE, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, + 0xB1, 0xB3, 0xB2, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0x88, 0x8F, 0x8D, 0xFF, 0x89, 0x90, 0x8E, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, + 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x84, 0x89, 0x87, 0xFF, + 0x76, 0x7B, 0x79, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x6E, 0x73, 0x6F, 0xFF, 0x6F, 0x74, 0x70, 0xFF, 0x33, 0x36, 0x32, 0xFF, 0x1A, 0x1D, 0x1A, 0xFF, + 0x19, 0x1C, 0x19, 0xFF, 0x21, 0x24, 0x21, 0xFF, 0x29, 0x29, 0x27, 0xFF, 0x1F, 0x20, 0x1D, 0xFF, 0x2B, 0x2B, 0x29, 0xFF, 0x77, 0x77, 0x75, 0xFF, + 0x8A, 0x87, 0x88, 0xFF, 0x8C, 0x8A, 0x8B, 0xFF, 0x95, 0x95, 0x95, 0xFF, 0xAA, 0xAA, 0xAA, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xAB, 0xAB, 0xAB, 0xFF, + 0xB7, 0xB7, 0xB7, 0xFF, 0xB1, 0xB1, 0xB1, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x68, 0x68, 0x68, 0xFF, 0x77, 0x77, 0x77, 0xFF, + 0x7D, 0x7D, 0x7D, 0xFF, 0x78, 0x78, 0x78, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x88, 0x88, 0x88, 0xFF, 0x86, 0x86, 0x86, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, + 0x7A, 0x7C, 0x7B, 0xFF, 0x82, 0x84, 0x84, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0x6D, 0x6F, 0x6F, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0x75, 0x7A, 0x78, 0xFF, 0x6F, 0x74, 0x72, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x74, 0x78, 0x77, 0xFF, 0x91, 0x96, 0x94, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, + 0xAD, 0xAF, 0xAF, 0xFF, 0xB3, 0xB5, 0xB4, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xBC, 0xBF, 0xBE, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC4, 0xC7, 0xC6, 0xFF, + 0xC7, 0xC9, 0xC8, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, + 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0x9B, 0xA0, 0x9E, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0x79, 0x7E, 0x7D, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x77, 0x7C, 0x7A, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x27, 0x2A, 0x29, 0xFF, 0x16, 0x18, 0x17, 0xFF, + 0x0E, 0x10, 0x0F, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x1D, 0x1F, 0x1E, 0xFF, 0x76, 0x76, 0x76, 0xFF, + 0x87, 0x87, 0x87, 0xFF, 0x9C, 0x9C, 0x9C, 0xFF, 0xA7, 0xA6, 0xA7, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, 0x97, 0x97, 0x97, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, + 0x96, 0x96, 0x96, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0x72, 0x72, 0x72, 0xFF, 0x76, 0x76, 0x76, 0xFF, 0x7B, 0x7B, 0x7B, 0xFF, 0x86, 0x86, 0x86, 0xFF, + 0x77, 0x77, 0x77, 0xFF, 0x74, 0x74, 0x74, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x94, 0x94, 0x94, 0xFF, 0x92, 0x92, 0x92, 0xFF, + 0x8F, 0x91, 0x90, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xDE, 0xE2, 0xE1, 0xFF, 0xDC, 0xE1, 0xE0, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0x9D, 0xA4, 0xA2, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0x7E, 0x83, 0x81, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x62, 0x67, 0x65, 0xFF, 0x2B, 0x2D, 0x2C, 0xFF, 0x19, 0x1C, 0x1B, 0xFF, + 0x0F, 0x11, 0x10, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x17, 0x19, 0x18, 0xFF, 0x1F, 0x21, 0x21, 0xFF, 0x73, 0x75, 0x74, 0xFF, + 0x8C, 0x8C, 0x8C, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xA8, 0xA8, 0xA8, 0xFF, 0x90, 0x90, 0x90, 0xFF, 0xBB, 0xBB, 0xBB, 0xFF, 0x99, 0x99, 0x99, 0xFF, + 0x7D, 0x7D, 0x7D, 0xFF, 0x6B, 0x6B, 0x6B, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x7E, 0x7E, 0x7E, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x79, 0x79, 0x79, 0xFF, + 0x8C, 0x8C, 0x8C, 0xFF, 0x9A, 0x9A, 0x9A, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0x85, 0x85, 0x85, 0xFF, 0x87, 0x87, 0x87, 0xFF, 0xA4, 0xA4, 0xA4, 0xFF, + 0xAB, 0xAD, 0xAC, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0xC3, 0xC6, 0xC5, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x71, 0x76, 0x74, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x87, 0x8C, 0x8B, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0x85, 0x8A, 0x88, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x55, 0x5A, 0x58, 0xFF, 0x4E, 0x53, 0x52, 0xFF, 0x21, 0x24, 0x23, 0xFF, 0x1F, 0x21, 0x21, 0xFF, + 0x11, 0x13, 0x13, 0xFF, 0x1E, 0x20, 0x1F, 0xFF, 0x2B, 0x30, 0x2F, 0xFF, 0x1B, 0x20, 0x1E, 0xFF, 0x29, 0x2E, 0x2C, 0xFF, 0x6F, 0x72, 0x71, 0xFF, + 0x9F, 0xA2, 0xA1, 0xFF, 0xB9, 0xBB, 0xBA, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0x64, 0x64, 0x64, 0xFF, 0x6C, 0x6C, 0x6C, 0xFF, + 0x6F, 0x6F, 0x6F, 0xFF, 0x70, 0x70, 0x70, 0xFF, 0x72, 0x72, 0x72, 0xFF, 0x7D, 0x7D, 0x7D, 0xFF, 0x8C, 0x8C, 0x8C, 0xFF, 0x95, 0x95, 0x95, 0xFF, + 0x8E, 0x90, 0x8F, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0x96, 0x98, 0x97, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, + 0xB4, 0xB6, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x79, 0x7B, 0x7A, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x83, 0x88, 0x86, 0xFF, + 0x89, 0x8D, 0x8C, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0x8E, 0x93, 0x92, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xC9, 0xCD, 0xCC, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xA5, 0xAC, 0xAA, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, + 0xA3, 0xAA, 0xA8, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xAA, 0xB1, 0xAF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0x8A, 0x8F, 0x8D, 0xFF, 0x5F, 0x63, 0x62, 0xFF, 0x47, 0x4C, 0x4B, 0xFF, 0x3F, 0x44, 0x42, 0xFF, 0x13, 0x16, 0x15, 0xFF, 0x20, 0x23, 0x22, 0xFF, + 0x11, 0x13, 0x13, 0xFF, 0x18, 0x1A, 0x1A, 0xFF, 0x26, 0x2A, 0x29, 0xFF, 0x1F, 0x23, 0x22, 0xFF, 0x4C, 0x51, 0x4F, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, + 0x9F, 0xA2, 0xA1, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x67, 0x6A, 0x69, 0xFF, 0x61, 0x61, 0x61, 0xFF, 0x62, 0x62, 0x62, 0xFF, + 0x69, 0x69, 0x69, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x72, 0x72, 0x72, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x92, 0x92, 0x92, 0xFF, 0x9E, 0x9E, 0x9E, 0xFF, + 0x9A, 0x9D, 0x9C, 0xFF, 0xA7, 0xAA, 0xA9, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0xA0, 0xA3, 0xA2, 0xFF, 0x99, 0x9C, 0x9B, 0xFF, 0xAE, 0xB1, 0xB0, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x85, 0x88, 0x87, 0xFF, 0x90, 0x92, 0x92, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0x85, 0x8A, 0x88, 0xFF, + 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0x92, 0x97, 0x95, 0xFF, 0x75, 0x7A, 0x78, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, + 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0x9F, 0xA7, 0xA4, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0x61, 0x66, 0x64, 0xFF, 0x34, 0x38, 0x37, 0xFF, 0x24, 0x29, 0x28, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, + 0x0E, 0x13, 0x11, 0xFF, 0x28, 0x2D, 0x2B, 0xFF, 0x26, 0x2A, 0x29, 0xFF, 0x23, 0x28, 0x26, 0xFF, 0x6E, 0x73, 0x71, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x74, 0x76, 0x76, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, 0x49, 0x4B, 0x4B, 0xFF, 0x56, 0x58, 0x57, 0xFF, 0x64, 0x66, 0x65, 0xFF, 0x59, 0x5C, 0x5B, 0xFF, + 0x6F, 0x72, 0x71, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0x6C, 0x6E, 0x6D, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, + 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0x9E, 0xA2, 0xA1, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xD0, 0xD8, 0xD5, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xDA, 0xE1, 0xDE, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xA6, 0xAE, 0xAB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0x8E, 0x93, 0x92, 0xFF, 0x53, 0x58, 0x56, 0xFF, 0x2A, 0x2F, 0x2D, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x0F, 0x14, 0x13, 0xFF, + 0x14, 0x19, 0x17, 0xFF, 0x20, 0x25, 0x23, 0xFF, 0x21, 0x26, 0x24, 0xFF, 0x28, 0x2D, 0x2B, 0xFF, 0x55, 0x5A, 0x58, 0xFF, 0x56, 0x5B, 0x5A, 0xFF, + 0x4E, 0x50, 0x4F, 0xFF, 0x56, 0x58, 0x57, 0xFF, 0x53, 0x56, 0x55, 0xFF, 0x50, 0x52, 0x52, 0xFF, 0x68, 0x6B, 0x6A, 0xFF, 0x65, 0x67, 0x66, 0xFF, + 0x72, 0x74, 0x73, 0xFF, 0x74, 0x76, 0x76, 0xFF, 0x6E, 0x71, 0x70, 0xFF, 0x8C, 0x8F, 0x8E, 0xFF, 0xAB, 0xAD, 0xAC, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, + 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xD6, 0xDD, 0xDB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x5C, 0x61, 0x5F, 0xFF, 0x32, 0x37, 0x36, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x15, 0x1A, 0x18, 0xFF, + 0x1A, 0x1F, 0x1D, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x25, 0x2C, 0x2A, 0xFF, 0x26, 0x2E, 0x2B, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x3F, 0x44, 0x42, 0xFF, + 0x40, 0x45, 0x44, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x5A, 0x5F, 0x5D, 0xFF, 0x53, 0x58, 0x56, 0xFF, 0x71, 0x73, 0x72, 0xFF, 0x74, 0x76, 0x76, 0xFF, + 0x75, 0x78, 0x77, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x74, 0x76, 0x76, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x87, 0x8C, 0x8B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0xC6, 0xCD, 0xCB, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD4, 0xDB, 0xD9, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, + 0x30, 0x35, 0x33, 0xFF, 0x18, 0x1C, 0x1B, 0xFF, 0x0F, 0x14, 0x13, 0xFF, 0x0A, 0x0E, 0x0D, 0xFF, 0x0E, 0x13, 0x11, 0xFF, 0x1D, 0x22, 0x21, 0xFF, + 0x1D, 0x22, 0x21, 0xFF, 0x1A, 0x1F, 0x1D, 0xFF, 0x2B, 0x32, 0x30, 0xFF, 0x23, 0x2A, 0x28, 0xFF, 0x3A, 0x41, 0x3F, 0xFF, 0x57, 0x5E, 0x5C, 0xFF, + 0x5A, 0x5F, 0x5D, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x75, 0x78, 0x77, 0xFF, 0x80, 0x82, 0x81, 0xFF, + 0x78, 0x7A, 0x79, 0xFF, 0x89, 0x8B, 0x8B, 0xFF, 0x78, 0x7A, 0x79, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xAF, 0xB2, 0xB1, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xC1, 0xC8, 0xC6, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x5C, 0x61, 0x5F, 0xFF, + 0x16, 0x1B, 0x1A, 0xFF, 0x0B, 0x10, 0x0E, 0xFF, 0x12, 0x17, 0x15, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x07, 0x0C, 0x0A, 0xFF, 0x0D, 0x12, 0x10, 0xFF, + 0x08, 0x0D, 0x0C, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0E, 0x15, 0x13, 0xFF, 0x25, 0x2C, 0x2A, 0xFF, 0x40, 0x47, 0x45, 0xFF, 0x5F, 0x67, 0x64, 0xFF, + 0x6A, 0x6F, 0x6D, 0xFF, 0x6D, 0x71, 0x70, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x81, 0x83, 0x82, 0xFF, 0x82, 0x84, 0x84, 0xFF, + 0x92, 0x95, 0x94, 0xFF, 0x83, 0x86, 0x85, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x93, 0x96, 0x95, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xBD, 0xC0, 0xBF, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, + 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xBA, 0xC1, 0xBF, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC0, 0xC5, 0xC4, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x59, 0x5E, 0x5C, 0xFF, + 0x1A, 0x1F, 0x1D, 0xFF, 0x0F, 0x14, 0x13, 0xFF, 0x13, 0x18, 0x16, 0xFF, 0x0C, 0x11, 0x0F, 0xFF, 0x01, 0x06, 0x05, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, + 0x07, 0x0C, 0x0A, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x0F, 0x16, 0x14, 0xFF, 0x46, 0x4D, 0x4B, 0xFF, 0x61, 0x68, 0x65, 0xFF, 0x6B, 0x72, 0x70, 0xFF, + 0x6F, 0x74, 0x72, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x9C, 0x9E, 0x9D, 0xFF, 0x98, 0x9B, 0x9A, 0xFF, + 0x9A, 0x9D, 0x9C, 0xFF, 0x8A, 0x8D, 0x8C, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0x9A, 0x9D, 0x9C, 0xFF, 0xAD, 0xAF, 0xAF, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, + 0xB4, 0xBC, 0xB9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, + 0xBE, 0xC5, 0xC2, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xBB, 0xC3, 0xC0, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xCC, 0xD3, 0xD0, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x68, 0x6D, 0x6B, 0xFF, + 0x22, 0x27, 0x25, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, 0x16, 0x1B, 0x1A, 0xFF, 0x13, 0x18, 0x16, 0xFF, 0x04, 0x09, 0x07, 0xFF, 0x0E, 0x13, 0x11, 0xFF, + 0x0F, 0x14, 0x13, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x35, 0x32, 0xFF, 0x6B, 0x72, 0x70, 0xFF, 0x7A, 0x81, 0x7F, 0xFF, 0x7F, 0x86, 0x84, 0xFF, + 0x80, 0x85, 0x84, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, + 0x92, 0x95, 0x94, 0xFF, 0x97, 0x99, 0x99, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xA3, 0xA5, 0xA4, 0xFF, 0xA4, 0xA6, 0xA5, 0xFF, 0xB6, 0xB9, 0xB8, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xD5, 0xDC, 0xDA, 0xFF, 0xD6, 0xDD, 0xDB, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, + 0xC6, 0xCD, 0xCB, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xCD, 0xD4, 0xD2, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x83, 0x88, 0x86, 0xFF, + 0x29, 0x2E, 0x2C, 0xFF, 0x1C, 0x21, 0x1F, 0xFF, 0x1D, 0x22, 0x21, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x08, 0x0D, 0x0C, 0xFF, 0x14, 0x19, 0x17, 0xFF, + 0x19, 0x1E, 0x1C, 0xFF, 0x1F, 0x23, 0x22, 0xFF, 0x61, 0x68, 0x65, 0xFF, 0x7E, 0x85, 0x82, 0xFF, 0x78, 0x7F, 0x7D, 0xFF, 0x93, 0x9A, 0x97, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, + 0x8E, 0x90, 0x8F, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xA5, 0xA7, 0xA7, 0xFF, 0xAA, 0xAC, 0xAB, 0xFF, 0x9E, 0xA0, 0xA0, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0x9B, 0xA0, 0x9E, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0x93, 0x98, 0x96, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xDA, 0xE1, 0xDE, 0xFF, + 0xD0, 0xD8, 0xD5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, + 0xCE, 0xD5, 0xD3, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xDC, 0xE1, 0xE0, 0xFF, 0xD9, 0xDE, 0xDC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xC7, 0xCE, 0xCC, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD8, 0xE0, 0xDD, 0xFF, 0xCC, 0xD3, 0xD0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xC7, 0xCC, 0xCB, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x79, 0x7E, 0x7D, 0xFF, 0x36, 0x3B, 0x39, 0xFF, 0x19, 0x1E, 0x1C, 0xFF, 0x1B, 0x20, 0x1E, 0xFF, 0x14, 0x19, 0x17, 0xFF, 0x2D, 0x31, 0x30, 0xFF, + 0x3B, 0x3F, 0x3E, 0xFF, 0x69, 0x6E, 0x6C, 0xFF, 0x7D, 0x82, 0x80, 0xFF, 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x92, 0x97, 0x95, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xC9, 0xCD, 0xCC, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, + 0xDE, 0xE2, 0xE1, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xD9, 0xDE, 0xDC, 0xFF, 0xD8, 0xDD, 0xDB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xCC, 0xD3, 0xD0, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xD2, 0xD7, 0xD5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0x82, 0x86, 0x85, 0xFF, 0x52, 0x57, 0x55, 0xFF, 0x58, 0x5C, 0x5B, 0xFF, 0x67, 0x6C, 0x6A, 0xFF, 0x64, 0x69, 0x68, 0xFF, 0x64, 0x69, 0x68, 0xFF, + 0x68, 0x6D, 0x6B, 0xFF, 0x7C, 0x81, 0x7F, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x95, 0x9A, 0x99, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, + 0xD9, 0xDE, 0xDC, 0xFF, 0xDB, 0xE0, 0xDE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC3, 0xC8, 0xC6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0x86, 0x8B, 0x89, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x78, 0x7D, 0x7B, 0xFF, + 0x7C, 0x81, 0x7F, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x7D, 0x82, 0x80, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x92, 0x97, 0x95, 0xFF, + 0x97, 0x9B, 0x9A, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x86, 0x8B, 0x89, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, + 0xD8, 0xDD, 0xDB, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xD7, 0xDB, 0xDA, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC0, 0xC5, 0xC4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, + 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x71, 0x76, 0x74, 0xFF, + 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x92, 0x97, 0x95, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0x86, 0x8B, 0x89, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xCA, 0xCF, 0xCD, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, + 0xDB, 0xE0, 0xDE, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xD3, 0xD8, 0xD6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, + 0xAA, 0xB1, 0xAF, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xD0, 0xD4, 0xD3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x82, 0x86, 0x85, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x9B, 0xA0, 0x9E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0x7D, 0x82, 0x80, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xCB, 0xD0, 0xCE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xD5, 0xDA, 0xD9, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xCE, 0xD3, 0xD2, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0x91, 0x96, 0x94, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, + 0x95, 0x9A, 0x99, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xA9, 0xAE, 0xAC, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, + 0x94, 0x9B, 0x99, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x8E, 0x95, 0x93, 0xFF, 0x82, 0x8A, 0x87, 0xFF, + 0x98, 0xA0, 0x9D, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xD0, 0xD8, 0xD5, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, + 0x9A, 0xA1, 0x9E, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, + 0xAC, 0xB3, 0xB1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xB8, 0xBD, 0xBB, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x83, 0x88, 0x86, 0xFF, + 0x88, 0x8F, 0x8D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x83, 0x8B, 0x88, 0xFF, + 0x98, 0xA0, 0x9D, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0x94, 0x9B, 0x99, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xB4, 0xB6, 0xB6, 0xFF, 0xB1, 0xB3, 0xB2, 0xFF, 0xAE, 0xB1, 0xB0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x8A, 0x8F, 0x8D, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x91, 0x96, 0x94, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0x93, 0x9A, 0x97, 0xFF, + 0x97, 0x9E, 0x9C, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xD8, 0xE2, 0xDE, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0x80, 0x89, 0x86, 0xFF, + 0xAF, 0xB9, 0xB6, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCB, 0xD5, 0xD2, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xD5, 0xDE, 0xDB, 0xFF, + 0xB3, 0xBC, 0xB9, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x90, 0x99, 0x96, 0xFF, 0x8F, 0x98, 0x95, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, + 0xC0, 0xC9, 0xC6, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0x8E, 0x95, 0x93, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xBF, 0xC1, 0xC0, 0xFF, 0xBA, 0xBC, 0xBB, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0xA2, 0xA7, 0xA5, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x8E, 0x93, 0x92, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x8D, 0x92, 0x90, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0x9C, 0xA1, 0xA0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0x9F, 0xA3, 0xA2, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xA0, 0xA5, 0xA3, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x71, 0x76, 0x74, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xC9, 0xCD, 0xCC, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, + 0x86, 0x8D, 0x8B, 0xFF, 0x81, 0x88, 0x86, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, 0xD5, 0xDE, 0xDB, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x92, 0x9C, 0x99, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, + 0xC0, 0xC9, 0xC6, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9E, 0xA7, 0xA4, 0xFF, 0x8D, 0x97, 0x94, 0xFF, 0x8B, 0x95, 0x92, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, + 0xBA, 0xC3, 0xC0, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0x9A, 0xA4, 0xA1, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, + 0x8A, 0x92, 0x8F, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xB5, 0xB8, 0xB7, 0xFF, 0xB2, 0xB4, 0xB3, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xCE, 0xD3, 0xD2, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x91, 0x96, 0x94, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0x9B, 0xA0, 0x9E, 0xFF, + 0x8B, 0x90, 0x8E, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x80, 0x85, 0x84, 0xFF, + 0x77, 0x7C, 0x7A, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, + 0xC6, 0xCB, 0xC9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, + 0x87, 0x90, 0x8D, 0xFF, 0x85, 0x8F, 0x8C, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, + 0xBE, 0xCA, 0xC6, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0x79, 0x85, 0x81, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, + 0xD2, 0xDE, 0xDA, 0xFF, 0xD6, 0xE2, 0xDE, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0x76, 0x82, 0x7E, 0xFF, 0x9A, 0xA6, 0xA2, 0xFF, + 0xAB, 0xB7, 0xB3, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, 0x9F, 0xAB, 0xA7, 0xFF, 0xA1, 0xAD, 0xA9, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, + 0x91, 0x99, 0x96, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, + 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, + 0xB5, 0xB8, 0xB7, 0xFF, 0xA1, 0xA4, 0xA3, 0xFF, 0x9D, 0x9F, 0x9E, 0xFF, 0xAC, 0xAE, 0xAD, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0x93, 0x98, 0x96, 0xFF, + 0x7E, 0x83, 0x81, 0xFF, 0x80, 0x85, 0x84, 0xFF, 0x86, 0x8B, 0x89, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0x84, 0x89, 0x87, 0xFF, 0x72, 0x77, 0x76, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x7F, 0x84, 0x82, 0xFF, + 0x7F, 0x84, 0x82, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x93, 0x98, 0x96, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, + 0x98, 0x9C, 0x9B, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xC0, 0xC5, 0xC4, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, + 0x99, 0xA3, 0xA0, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, + 0xCC, 0xD8, 0xD4, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0x96, 0xA2, 0x9E, 0xFF, 0xA7, 0xB3, 0xAF, 0xFF, 0xC3, 0xCF, 0xCB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0x9A, 0xA6, 0xA2, 0xFF, 0x73, 0x7F, 0x7B, 0xFF, 0x88, 0x94, 0x90, 0xFF, + 0x9A, 0xA6, 0xA2, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, 0xA7, 0xB3, 0xAF, 0xFF, 0xAA, 0xB6, 0xB2, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, + 0xA8, 0xAF, 0xAA, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0x95, 0x9D, 0x98, 0xFF, 0x9B, 0xA2, 0x9D, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, + 0xC4, 0xC9, 0xC5, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xB6, 0xB9, 0xB6, 0xFF, 0xB8, 0xBA, 0xB7, 0xFF, + 0xC6, 0xC8, 0xC5, 0xFF, 0xAF, 0xB2, 0xAF, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x82, 0x87, 0x83, 0xFF, 0x75, 0x7A, 0x76, 0xFF, + 0x8E, 0x94, 0x90, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0x91, 0x96, 0x94, 0xFF, + 0x99, 0x9E, 0x9C, 0xFF, 0x82, 0x86, 0x85, 0xFF, 0x7E, 0x83, 0x81, 0xFF, 0x76, 0x7B, 0x79, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0x7E, 0x83, 0x81, 0xFF, + 0x86, 0x8B, 0x89, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, + 0x95, 0x9A, 0x99, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xB4, 0xB8, 0xB7, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x89, 0x90, 0x8E, 0xFF, 0x80, 0x87, 0x85, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, + 0x8D, 0x97, 0x94, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA4, 0xA0, 0xFF, 0x8A, 0x96, 0x92, 0xFF, 0x8E, 0x9A, 0x96, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, + 0xD4, 0xE0, 0xDC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, + 0xC5, 0xD1, 0xCD, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0x9F, 0xAB, 0xA7, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x7B, 0x84, 0x81, 0xFF, + 0x90, 0x99, 0x96, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xB1, 0xB6, 0xB2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, + 0xB2, 0xB8, 0xB4, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA1, 0xA6, 0xA4, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC8, 0xCB, 0xC7, 0xFF, 0xC0, 0xC2, 0xBF, 0xFF, + 0xC0, 0xC2, 0xBF, 0xFF, 0xA0, 0xA3, 0xA0, 0xFF, 0x87, 0x8D, 0x89, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0x80, 0x86, 0x82, 0xFF, 0x80, 0x86, 0x82, 0xFF, + 0x90, 0x95, 0x91, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x83, 0x88, 0x86, 0xFF, 0x7B, 0x7F, 0x7E, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, + 0xA3, 0xA8, 0xA7, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x92, 0x97, 0x95, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xAB, 0xB0, 0xAF, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x86, 0x8B, 0x89, 0xFF, + 0x94, 0x99, 0x97, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xB9, 0xBE, 0xBD, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x94, 0x99, 0x97, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xAE, 0xB3, 0xB1, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0x86, 0x8D, 0x8B, 0xFF, 0x93, 0x9A, 0x97, 0xFF, + 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0x91, 0x9D, 0x99, 0xFF, 0x79, 0x85, 0x81, 0xFF, 0x91, 0x9D, 0x99, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, + 0xCC, 0xD8, 0xD4, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, + 0xC3, 0xCF, 0xCB, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, 0x82, 0x8B, 0x88, 0xFF, + 0x84, 0x8E, 0x8B, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0xA0, 0xAA, 0xA7, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xD0, 0xD9, 0xD6, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0xAB, 0xB3, 0xAE, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xAB, 0xB3, 0xAE, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, + 0xA0, 0xA5, 0xA1, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA7, 0xAC, 0xAA, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xBF, 0xC1, 0xBE, 0xFF, 0xA8, 0xAB, 0xA8, 0xFF, + 0x9F, 0xA2, 0x9F, 0xFF, 0x87, 0x89, 0x86, 0xFF, 0x75, 0x7A, 0x76, 0xFF, 0x80, 0x86, 0x82, 0xFF, 0x77, 0x7C, 0x78, 0xFF, 0x89, 0x8E, 0x8A, 0xFF, + 0x8B, 0x90, 0x8C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, 0x89, 0x8D, 0x8C, 0xFF, + 0x7E, 0x83, 0x81, 0xFF, 0x83, 0x88, 0x86, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xAF, 0xB4, 0xB2, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, + 0x9A, 0x9F, 0x9D, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, + 0xA8, 0xB2, 0xAF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xD2, 0xDE, 0xDA, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, + 0xB9, 0xC5, 0xC1, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0x85, 0x8F, 0x8C, 0xFF, 0x91, 0x9B, 0x97, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, + 0xA6, 0xAE, 0xA9, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, 0x98, 0x9D, 0x99, 0xFF, + 0x97, 0x9C, 0x98, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB5, 0xBA, 0xB8, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC5, 0xCA, 0xC6, 0xFF, 0xB9, 0xBC, 0xB8, 0xFF, 0x99, 0x9C, 0x99, 0xFF, + 0x97, 0x9A, 0x97, 0xFF, 0x95, 0x97, 0x94, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0xAD, 0xB2, 0xAE, 0xFF, + 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x85, 0x8A, 0x88, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x80, 0x85, 0x84, 0xFF, 0x8B, 0x90, 0x8E, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xAA, 0xAF, 0xAD, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD4, 0xD9, 0xD7, 0xFF, + 0xCE, 0xD3, 0xD2, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, + 0xA0, 0xAA, 0xA7, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCF, 0xDB, 0xD7, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, + 0xCB, 0xD7, 0xD3, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, + 0xB6, 0xC2, 0xBE, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, + 0x98, 0xA2, 0x9E, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0x8B, 0x95, 0x92, 0xFF, 0x91, 0x9B, 0x97, 0xFF, 0xA2, 0xAC, 0xA9, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, + 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, + 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xAF, 0xB4, 0xB0, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, + 0xB6, 0xBB, 0xB7, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, 0x90, 0x95, 0x91, 0xFF, + 0x84, 0x89, 0x83, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, + 0x99, 0x9E, 0x9A, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8A, 0x8F, 0x8B, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x97, 0x9C, 0x98, 0xFF, + 0x9A, 0x9F, 0x9B, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xC9, 0xCD, 0xCC, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, + 0x9D, 0xA4, 0xA2, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xBA, 0xC1, 0xBF, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xCF, 0xD6, 0xD4, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA1, 0xAB, 0xA8, 0xFF, + 0xB3, 0xBC, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xD4, 0xE0, 0xDC, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, + 0xBC, 0xC6, 0xC2, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, + 0xAC, 0xB5, 0xB2, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x98, 0xA0, 0x9D, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, + 0x9A, 0xA1, 0x9C, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xB6, 0xBC, 0xB5, 0xFF, + 0xAB, 0xB1, 0xAD, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, 0x71, 0x77, 0x70, 0xFF, 0x7E, 0x83, 0x7F, 0xFF, 0x8B, 0x90, 0x8C, 0xFF, + 0x98, 0x9D, 0x97, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, 0x99, 0x9E, 0x98, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x82, 0x87, 0x81, 0xFF, + 0x86, 0x8B, 0x87, 0xFF, 0x8C, 0x91, 0x8D, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x94, 0x99, 0x95, 0xFF, + 0x9F, 0xA4, 0xA0, 0xFF, 0xA8, 0xAD, 0xA9, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xD2, 0xD7, 0xD5, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC4, 0xC9, 0xC7, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xAC, 0xB3, 0xB1, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, + 0xCE, 0xD5, 0xD3, 0xFF, 0xD3, 0xDA, 0xD7, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, + 0xAF, 0xBB, 0xB7, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, + 0xD2, 0xDE, 0xDA, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xAA, 0xB6, 0xB2, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, + 0xB7, 0xC1, 0xBE, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, + 0xB9, 0xC2, 0xBF, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x9C, 0xA4, 0x9D, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x9E, 0xA6, 0xA1, 0xFF, + 0x9A, 0xA1, 0x9C, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xB6, 0xBB, 0xB7, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xBB, 0xC0, 0xBA, 0xFF, + 0xA7, 0xAC, 0xA8, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, 0x8C, 0x92, 0x8B, 0xFF, 0xA9, 0xAE, 0xAA, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, + 0xB0, 0xB6, 0xAF, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x93, 0x99, 0x92, 0xFF, + 0xA0, 0xA5, 0xA1, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x9E, 0xA3, 0x9F, 0xFF, 0x7D, 0x82, 0x7E, 0xFF, 0x86, 0x8B, 0x87, 0xFF, + 0x8C, 0x91, 0x8D, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xA6, 0xAA, 0xA9, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, + 0xA3, 0xAA, 0xA8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xA4, 0xAB, 0xA9, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xD7, 0xDF, 0xDC, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, + 0xA3, 0xAF, 0xAB, 0xFF, 0xA4, 0xB0, 0xAC, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xC6, 0xD2, 0xCE, 0xFF, + 0xBD, 0xC9, 0xC5, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD5, 0xE1, 0xDD, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0x8D, 0x99, 0x95, 0xFF, + 0x94, 0x9E, 0x9B, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, + 0xBD, 0xC7, 0xC4, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, + 0xA5, 0xAD, 0xA6, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0x9A, 0xA1, 0x9C, 0xFF, + 0x9E, 0xA6, 0xA1, 0xFF, 0xA2, 0xA9, 0xA4, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, + 0x92, 0x97, 0x93, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0xB1, 0xB7, 0xB0, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, + 0xA3, 0xA9, 0xA2, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x8C, 0x92, 0x8B, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, + 0x9E, 0xA3, 0x9F, 0xFF, 0x9A, 0x9F, 0x9B, 0xFF, 0x95, 0x9B, 0x97, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0x99, 0x9E, 0x9A, 0xFF, + 0x99, 0x9E, 0x9A, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, + 0xA8, 0xAD, 0xAB, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xC5, 0xCA, 0xC8, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, + 0xA8, 0xAF, 0xAC, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xCD, 0xD4, 0xD2, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, + 0xAE, 0xBA, 0xB6, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0x9B, 0xA7, 0xA3, 0xFF, 0x9C, 0xA8, 0xA4, 0xFF, 0xC1, 0xCE, 0xC9, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, + 0xB1, 0xBD, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xDD, 0xE9, 0xE5, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0x8A, 0x94, 0x90, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xA7, 0xB1, 0xAD, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, + 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xAA, 0xB2, 0xA9, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0x98, 0xA1, 0x97, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, + 0xAA, 0xB2, 0xAB, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB6, 0xB1, 0xFF, 0x90, 0x98, 0x93, 0xFF, 0x85, 0x8D, 0x85, 0xFF, 0x90, 0x98, 0x91, 0xFF, + 0x90, 0x98, 0x93, 0xFF, 0x8A, 0x92, 0x8D, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8A, 0x8F, 0x89, 0xFF, + 0x94, 0x9A, 0x93, 0xFF, 0x91, 0x97, 0x8E, 0xFF, 0x97, 0x9C, 0x96, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, + 0x90, 0x95, 0x8F, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x93, 0x98, 0x94, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, + 0xA7, 0xAC, 0xA8, 0xFF, 0xAE, 0xB3, 0xAF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xCD, 0xD2, 0xD0, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0x9C, 0xA1, 0xA0, 0xFF, 0x93, 0x9A, 0x97, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0x9D, 0xA4, 0xA2, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x9F, 0xA7, 0xA4, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, + 0xB7, 0xC3, 0xBF, 0xFF, 0xBD, 0xC9, 0xC5, 0xFF, 0x9D, 0xA9, 0xA5, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, + 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xDE, 0xE7, 0xE4, 0xFF, 0xDA, 0xE4, 0xE1, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, + 0xAB, 0xB2, 0xB0, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, + 0xCD, 0xD4, 0xD2, 0xFF, 0xCF, 0xD6, 0xD4, 0xFF, 0xCC, 0xD1, 0xCF, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x97, 0x9B, 0x9A, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xA4, 0xAC, 0xA3, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, 0xA9, 0xB1, 0xA7, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xA6, 0xAE, 0xA7, 0xFF, 0xA2, 0xAA, 0xA2, 0xFF, + 0x9B, 0xA3, 0x9B, 0xFF, 0x96, 0x9E, 0x97, 0xFF, 0x98, 0xA0, 0x9B, 0xFF, 0x87, 0x8F, 0x8A, 0xFF, 0x82, 0x8A, 0x83, 0xFF, 0x8C, 0x94, 0x8C, 0xFF, + 0x94, 0x9B, 0x97, 0xFF, 0x96, 0x9E, 0x99, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, 0xAC, 0xB4, 0xAD, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, + 0x97, 0x9C, 0x94, 0xFF, 0x8C, 0x92, 0x89, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, 0x9F, 0xA4, 0x9E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, + 0x92, 0x97, 0x91, 0xFF, 0x92, 0x97, 0x91, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0x97, 0x9C, 0x98, 0xFF, + 0xA2, 0xA7, 0xA3, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, + 0xBD, 0xC2, 0xC0, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xD0, 0xD4, 0xD3, 0xFF, + 0xCC, 0xD1, 0xCF, 0xFF, 0xA1, 0xA6, 0xA4, 0xFF, 0x8D, 0x94, 0x92, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, + 0xB2, 0xB9, 0xB7, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xAC, 0xB3, 0xB1, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, + 0xA9, 0xB0, 0xAD, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC8, 0xD1, 0xCE, 0xFF, 0xCB, 0xD5, 0xD2, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, + 0xB2, 0xBE, 0xBA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, 0xA3, 0xAF, 0xAB, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, + 0xB1, 0xBD, 0xB9, 0xFF, 0xB0, 0xBC, 0xB8, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xC6, 0xCD, 0xCB, 0xFF, + 0xCE, 0xD5, 0xD3, 0xFF, 0xD1, 0xD9, 0xD6, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0x99, 0x9E, 0x9C, 0xFF, 0x8C, 0x91, 0x8F, 0xFF, 0x85, 0x8A, 0x88, 0xFF, + 0x9E, 0xA7, 0x9D, 0xFF, 0xA4, 0xAC, 0xA3, 0xFF, 0xAB, 0xB3, 0xAA, 0xFF, 0xB1, 0xB9, 0xB0, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0x9F, 0xA7, 0xA0, 0xFF, + 0x94, 0x9C, 0x94, 0xFF, 0x8A, 0x92, 0x8B, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0xA8, 0xB0, 0xA8, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, + 0xBD, 0xC5, 0xBD, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, 0xC1, 0xC9, 0xC2, 0xFF, 0xBB, 0xC3, 0xBC, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, + 0x87, 0x8D, 0x87, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0x9C, 0xA2, 0x9B, 0xFF, 0x8D, 0x93, 0x8C, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0x98, 0x9D, 0x97, 0xFF, + 0x98, 0x9D, 0x97, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xA9, 0xAF, 0xA8, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, + 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0x8D, 0x94, 0x92, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xCB, 0xD0, 0xCE, 0xFF, + 0xD1, 0xD6, 0xD4, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0x9D, 0xA4, 0xA2, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xB3, 0xBA, 0xB8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, + 0x97, 0x9E, 0x9C, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, + 0xBF, 0xCB, 0xC7, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, + 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB7, 0xB3, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xC0, 0xC9, 0xC6, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0x8F, 0x96, 0x94, 0xFF, 0x75, 0x7D, 0x7A, 0xFF, + 0x9D, 0xA5, 0x9C, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0x9F, 0xA8, 0x9E, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x94, 0x9C, 0x94, 0xFF, + 0x97, 0x9F, 0x98, 0xFF, 0x9A, 0xA2, 0x9A, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, + 0xA4, 0xAC, 0xA5, 0xFF, 0xA3, 0xAB, 0xA4, 0xFF, 0x91, 0x99, 0x92, 0xFF, 0x79, 0x81, 0x7A, 0xFF, 0x83, 0x88, 0x82, 0xFF, 0x95, 0x9B, 0x94, 0xFF, + 0x82, 0x87, 0x81, 0xFF, 0x7D, 0x82, 0x7C, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0x97, 0x9C, 0x96, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, + 0x9F, 0xA4, 0x9E, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, 0xB5, 0xBA, 0xB6, 0xFF, 0xBC, 0xC1, 0xBD, 0xFF, + 0xAE, 0xB3, 0xAF, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x9C, 0xA3, 0xA1, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0x97, 0x9E, 0x9C, 0xFF, 0x88, 0x8F, 0x8D, 0xFF, 0xC7, 0xCC, 0xCB, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xCC, 0xD1, 0xCF, 0xFF, 0xCA, 0xCF, 0xCD, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, + 0xC2, 0xCA, 0xC7, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xB0, 0xB7, 0xB4, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x9B, 0xA2, 0xA0, 0xFF, + 0x87, 0x8E, 0x8C, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, 0x96, 0x9F, 0x9C, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xDC, 0xE5, 0xE2, 0xFF, + 0xCE, 0xDA, 0xD6, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, + 0xC7, 0xD3, 0xCF, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0x80, 0x87, 0x85, 0xFF, + 0xA4, 0xAC, 0xA3, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, 0xA3, 0xAB, 0xA2, 0xFF, 0x83, 0x8C, 0x82, 0xFF, 0x80, 0x88, 0x7F, 0xFF, 0x78, 0x80, 0x77, 0xFF, + 0xB0, 0xB8, 0xAE, 0xFF, 0x90, 0x99, 0x8F, 0xFF, 0x78, 0x80, 0x79, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, 0xAF, 0xB7, 0xAF, 0xFF, 0xB6, 0xBE, 0xB6, 0xFF, + 0x80, 0x88, 0x81, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x75, 0x7D, 0x76, 0xFF, 0x88, 0x90, 0x89, 0xFF, 0x79, 0x7F, 0x79, 0xFF, 0x94, 0x9A, 0x93, 0xFF, + 0x8E, 0x94, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0xAE, 0xB3, 0xAD, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, + 0xA3, 0xA9, 0xA4, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, + 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0x8C, 0x93, 0x90, 0xFF, 0xC7, 0xCE, 0xCC, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, + 0xC2, 0xC6, 0xC5, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xAA, 0xAF, 0xAD, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, + 0xBD, 0xC4, 0xC1, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, + 0x98, 0xA0, 0x9D, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xE1, 0xEB, 0xE8, 0xFF, + 0xD3, 0xDF, 0xDB, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xCB, 0xD7, 0xD3, 0xFF, 0xBE, 0xCA, 0xC6, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xB6, 0xC0, 0xBD, 0xFF, + 0xBD, 0xC7, 0xC4, 0xFF, 0xCF, 0xD8, 0xD5, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, + 0xB8, 0xBF, 0xBD, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, + 0xBE, 0xC8, 0xC5, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, 0x99, 0xA3, 0xA0, 0xFF, 0x98, 0xA2, 0x9E, 0xFF, + 0x86, 0x8E, 0x85, 0xFF, 0x9A, 0xA2, 0x98, 0xFF, 0x9D, 0xA5, 0x9C, 0xFF, 0xB1, 0xB9, 0xB0, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x90, 0x99, 0x8F, 0xFF, + 0xB7, 0xBF, 0xB5, 0xFF, 0x8C, 0x94, 0x8A, 0xFF, 0x7C, 0x84, 0x7D, 0xFF, 0xAA, 0xB2, 0xAB, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0x96, 0x9E, 0x97, 0xFF, + 0x7F, 0x87, 0x80, 0xFF, 0x8E, 0x96, 0x8F, 0xFF, 0x7E, 0x86, 0x7E, 0xFF, 0x8D, 0x95, 0x8E, 0xFF, 0x98, 0x9D, 0x97, 0xFF, 0x9A, 0xA0, 0x99, 0xFF, + 0x9E, 0xA3, 0x9D, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0xB1, 0xB7, 0xB0, 0xFF, 0xA0, 0xA5, 0x9F, 0xFF, 0xA6, 0xAB, 0xA5, 0xFF, 0xAF, 0xB5, 0xAE, 0xFF, + 0xA4, 0xAA, 0xA6, 0xFF, 0xB0, 0xB5, 0xB1, 0xFF, 0xB2, 0xB8, 0xB4, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xAD, 0xB5, 0xB0, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, + 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xCA, 0xD2, 0xCF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xB7, 0xBC, 0xBA, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, + 0xC3, 0xC8, 0xC6, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, + 0xC6, 0xCD, 0xCB, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, + 0x9B, 0xA2, 0xA0, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xD2, 0xDC, 0xD9, 0xFF, + 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, + 0xB9, 0xC2, 0xBF, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, + 0xC5, 0xCC, 0xC9, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, + 0xC7, 0xD0, 0xCD, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0xBB, 0xC5, 0xC1, 0xFF, + 0x82, 0x8B, 0x81, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0x98, 0xA1, 0x97, 0xFF, 0xC7, 0xCF, 0xC6, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, + 0xB6, 0xBE, 0xB4, 0xFF, 0x78, 0x80, 0x77, 0xFF, 0x72, 0x7A, 0x71, 0xFF, 0x93, 0x9B, 0x91, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x79, 0x81, 0x78, 0xFF, + 0x8A, 0x92, 0x8B, 0xFF, 0x94, 0x9C, 0x94, 0xFF, 0x95, 0x9D, 0x96, 0xFF, 0x9E, 0xA6, 0x9F, 0xFF, 0xA9, 0xAF, 0xA8, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, + 0xB2, 0xB8, 0xB2, 0xFF, 0xBE, 0xC4, 0xBD, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, 0xAA, 0xB0, 0xA9, 0xFF, 0xA4, 0xAA, 0xA4, 0xFF, 0xAD, 0xB2, 0xAC, 0xFF, + 0xB2, 0xB8, 0xB4, 0xFF, 0xB9, 0xBF, 0xBB, 0xFF, 0xB7, 0xBC, 0xB8, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xA8, 0xAF, 0xAA, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, + 0xB9, 0xC1, 0xBC, 0xFF, 0xBB, 0xC3, 0xBE, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, + 0xB4, 0xBE, 0xBA, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xB4, 0xB8, 0xB7, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xC0, 0xC5, 0xC4, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA4, 0xA9, 0xA8, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x95, 0x9C, 0x9A, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, 0xA6, 0xAE, 0xAB, 0xFF, + 0x9E, 0xA5, 0xA3, 0xFF, 0xAB, 0xB2, 0xB0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, + 0xC4, 0xD0, 0xCC, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xCD, 0xD9, 0xD5, 0xFF, 0xCA, 0xD4, 0xD0, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, + 0xA8, 0xB2, 0xAF, 0xFF, 0xAC, 0xB5, 0xB2, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xA6, 0xB0, 0xAC, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xC8, 0xCF, 0xCD, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, 0xBC, 0xC6, 0xC2, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, + 0xC4, 0xD0, 0xCC, 0xFF, 0xCC, 0xD8, 0xD4, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, + 0x9D, 0xA5, 0x9C, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0x97, 0xA0, 0x96, 0xFF, 0xBA, 0xC3, 0xB9, 0xFF, 0x81, 0x8A, 0x80, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, + 0xAB, 0xB3, 0xAA, 0xFF, 0x61, 0x69, 0x5F, 0xFF, 0x5E, 0x67, 0x5D, 0xFF, 0x7C, 0x85, 0x7B, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x71, 0x79, 0x70, 0xFF, + 0x9B, 0xA3, 0x9B, 0xFF, 0xA1, 0xA9, 0xA1, 0xFF, 0xB0, 0xB8, 0xB0, 0xFF, 0xB4, 0xBC, 0xB5, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, + 0xC2, 0xC7, 0xC1, 0xFF, 0xB5, 0xBA, 0xB4, 0xFF, 0x9B, 0xA1, 0x9A, 0xFF, 0xBC, 0xC1, 0xBB, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, 0xA2, 0xA8, 0xA1, 0xFF, + 0xA2, 0xA7, 0xA3, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0xA0, 0xA5, 0xA1, 0xFF, 0x93, 0x98, 0x94, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xB9, 0xC1, 0xBC, 0xFF, + 0xBB, 0xC3, 0xBE, 0xFF, 0xBA, 0xC2, 0xBD, 0xFF, 0x9D, 0xA6, 0xA3, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, + 0xBF, 0xC6, 0xC4, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0xA0, 0xA5, 0xA3, 0xFF, 0xAE, 0xB3, 0xB1, 0xFF, + 0xA4, 0xA9, 0xA8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, + 0xB1, 0xB6, 0xB4, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xA6, 0xAA, 0xA9, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xA1, 0xA8, 0xA5, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xC4, 0xCE, 0xCB, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, + 0xBD, 0xC9, 0xC5, 0xFF, 0xCA, 0xD6, 0xD2, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xD3, 0xDF, 0xDB, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, + 0x97, 0xA0, 0x9D, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, 0x88, 0x91, 0x8E, 0xFF, 0x8D, 0x97, 0x94, 0xFF, 0x97, 0xA0, 0x9D, 0xFF, 0x9E, 0xA5, 0xA3, 0xFF, + 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0xC5, 0xCF, 0xCC, 0xFF, + 0xB9, 0xC5, 0xC1, 0xFF, 0xC8, 0xD4, 0xD0, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xB3, 0xC0, 0xBB, 0xFF, 0xBF, 0xCB, 0xC7, 0xFF, 0xA8, 0xB4, 0xB0, 0xFF, + 0x9C, 0xA4, 0x9B, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0xBB, 0xC4, 0xBA, 0xFF, 0xAF, 0xB7, 0xAD, 0xFF, 0x86, 0x8E, 0x85, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, + 0x7C, 0x85, 0x7B, 0xFF, 0x51, 0x5A, 0x50, 0xFF, 0x53, 0x5B, 0x51, 0xFF, 0x83, 0x8C, 0x82, 0xFF, 0x8F, 0x97, 0x8E, 0xFF, 0x9C, 0xA4, 0x9B, 0xFF, + 0xC1, 0xC9, 0xC2, 0xFF, 0xBE, 0xC6, 0xBE, 0xFF, 0xA9, 0xB1, 0xA9, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0xA7, 0xAC, 0xA6, 0xFF, 0x9E, 0xA3, 0x9D, 0xFF, + 0xB7, 0xBD, 0xB6, 0xFF, 0xA8, 0xAE, 0xA7, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0xA7, 0xAC, 0xA8, 0xFF, 0x9F, 0xA4, 0xA0, 0xFF, 0x93, 0x98, 0x94, 0xFF, + 0x9A, 0x9F, 0x9B, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x98, 0x9D, 0x99, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xB2, 0xBA, 0xB5, 0xFF, 0xCA, 0xD2, 0xCD, 0xFF, + 0xC3, 0xCB, 0xC6, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0x8C, 0x96, 0x93, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xAF, 0xB9, 0xB6, 0xFF, + 0xB5, 0xBF, 0xBB, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xC1, 0xCA, 0xC7, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xA9, 0xAE, 0xAC, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, + 0x9E, 0xA2, 0xA1, 0xFF, 0xB0, 0xB5, 0xB3, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xBB, 0xBF, 0xBE, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, + 0xBB, 0xBF, 0xBE, 0xFF, 0xBD, 0xC2, 0xC0, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, 0xBF, 0xC4, 0xC2, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xC9, 0xD1, 0xCE, 0xFF, 0xC5, 0xCC, 0xC9, 0xFF, 0xB4, 0xBC, 0xB9, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, + 0xAE, 0xBA, 0xB6, 0xFF, 0xC7, 0xD3, 0xCF, 0xFF, 0xD9, 0xE5, 0xE1, 0xFF, 0xD8, 0xE4, 0xE0, 0xFF, 0xD3, 0xDD, 0xDA, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, + 0xAC, 0xB5, 0xB2, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xA3, 0xAA, 0xA8, 0xFF, 0xA1, 0xA8, 0xA5, 0xFF, 0xA8, 0xAF, 0xAC, 0xFF, + 0xAD, 0xB1, 0xB0, 0xFF, 0xA2, 0xA7, 0xA5, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, + 0xB5, 0xC1, 0xBD, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xB1, 0xBD, 0xB9, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, 0xA0, 0xAC, 0xA8, 0xFF, + 0x91, 0x9A, 0x90, 0xFF, 0x82, 0x8B, 0x81, 0xFF, 0xB9, 0xC1, 0xB8, 0xFF, 0x95, 0x9D, 0x94, 0xFF, 0x89, 0x92, 0x88, 0xFF, 0x98, 0xA1, 0x97, 0xFF, + 0x82, 0x8B, 0x81, 0xFF, 0x73, 0x7C, 0x72, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, 0xAF, 0xB7, 0xAD, 0xFF, + 0xB9, 0xC1, 0xBA, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB7, 0xBF, 0xB7, 0xFF, 0x95, 0x9B, 0x94, 0xFF, 0xA1, 0xA7, 0xA0, 0xFF, + 0xBB, 0xC0, 0xBA, 0xFF, 0xB2, 0xB8, 0xB2, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0x8D, 0x92, 0x8E, 0xFF, 0x90, 0x95, 0x91, 0xFF, 0x9C, 0xA2, 0x9D, 0xFF, + 0xA4, 0xAA, 0xA6, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, 0xA2, 0xA7, 0xA3, 0xFF, 0x9B, 0xA0, 0x9C, 0xFF, 0xBD, 0xC4, 0xBF, 0xFF, 0xC6, 0xCD, 0xC9, 0xFF, + 0xB2, 0xBA, 0xB5, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0xA5, 0xAE, 0xAB, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, + 0xA1, 0xAB, 0xA8, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0xC2, 0xCC, 0xC8, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, + 0xC8, 0xCF, 0xCD, 0xFF, 0xB7, 0xBE, 0xBB, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x90, 0x94, 0x93, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, 0x94, 0x99, 0x97, 0xFF, + 0x94, 0x99, 0x97, 0xFF, 0xA7, 0xAC, 0xAA, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xBC, 0xC1, 0xBF, 0xFF, + 0xBF, 0xC4, 0xC2, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xC6, 0xCB, 0xC9, 0xFF, 0xC4, 0xC9, 0xC7, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xC0, 0xC7, 0xC5, 0xFF, 0xC3, 0xCB, 0xC8, 0xFF, 0xC0, 0xC7, 0xC5, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xB2, 0xB9, 0xB7, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0xC3, 0xCD, 0xC9, 0xFF, 0xBE, 0xC8, 0xC5, 0xFF, 0xAE, 0xB8, 0xB4, 0xFF, + 0x9D, 0xA9, 0xA5, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xCE, 0xDA, 0xD6, 0xFF, 0xD1, 0xDD, 0xD9, 0xFF, 0xD6, 0xDF, 0xDC, 0xFF, 0xCC, 0xD6, 0xD3, 0xFF, + 0xC8, 0xD1, 0xCE, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xC9, 0xD1, 0xCE, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xAD, 0xB5, 0xB2, 0xFF, 0xAF, 0xB6, 0xB3, 0xFF, + 0xB0, 0xB5, 0xB3, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0x96, 0x9D, 0x9B, 0xFF, 0x9A, 0xA1, 0x9E, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xCE, 0xD7, 0xD4, 0xFF, + 0xC1, 0xCE, 0xC9, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xA6, 0xB2, 0xAD, 0xFF, 0xA9, 0xB5, 0xB1, 0xFF, 0xB5, 0xC1, 0xBD, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, + 0x7F, 0x87, 0x7E, 0xFF, 0x97, 0xA0, 0x96, 0xFF, 0xA5, 0xAE, 0xA4, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0x8E, 0x96, 0x8D, 0xFF, 0x95, 0x9D, 0x94, 0xFF, + 0x90, 0x99, 0x8F, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xAA, 0xB2, 0xA9, 0xFF, 0xAD, 0xB6, 0xAC, 0xFF, + 0xAD, 0xB5, 0xAE, 0xFF, 0xAD, 0xB5, 0xAE, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, 0xA8, 0xB0, 0xA8, 0xFF, 0x8E, 0x94, 0x8E, 0xFF, 0xAB, 0xB1, 0xAB, 0xFF, + 0xB9, 0xBF, 0xB9, 0xFF, 0xB0, 0xB6, 0xAF, 0xFF, 0x91, 0x96, 0x92, 0xFF, 0x83, 0x88, 0x84, 0xFF, 0x94, 0x99, 0x95, 0xFF, 0xA6, 0xAB, 0xA7, 0xFF, + 0xA3, 0xA9, 0xA4, 0xFF, 0xAA, 0xB0, 0xAB, 0xFF, 0xA1, 0xA6, 0xA2, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, 0xA6, 0xAE, 0xA9, 0xFF, + 0x9D, 0xA5, 0xA0, 0xFF, 0x89, 0x91, 0x8C, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xA8, 0xB2, 0xAF, 0xFF, + 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAD, 0xAA, 0xFF, 0xC0, 0xC9, 0xC6, 0xFF, 0xAB, 0xB4, 0xB1, 0xFF, 0xBD, 0xC4, 0xC1, 0xFF, 0xC2, 0xCA, 0xC7, 0xFF, + 0xC3, 0xCB, 0xC8, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x8E, 0x93, 0x92, 0xFF, 0x87, 0x8C, 0x8B, 0xFF, 0x93, 0x98, 0x96, 0xFF, 0x90, 0x94, 0x93, 0xFF, + 0x91, 0x96, 0x94, 0xFF, 0xA3, 0xA8, 0xA7, 0xFF, 0xB1, 0xB6, 0xB4, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB8, 0xBD, 0xBB, 0xFF, + 0xBC, 0xC1, 0xBF, 0xFF, 0xBE, 0xC3, 0xC1, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xB7, 0xBC, 0xBA, 0xFF, 0x9F, 0xA3, 0xA2, 0xFF, + 0xAF, 0xB6, 0xB3, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB8, 0xBF, 0xBD, 0xFF, 0xB1, 0xB8, 0xB6, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xB9, 0xC0, 0xBE, 0xFF, 0xB4, 0xBE, 0xBA, 0xFF, 0xBB, 0xC5, 0xC1, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, + 0x9A, 0xA6, 0xA2, 0xFF, 0xB2, 0xBE, 0xBA, 0xFF, 0xC5, 0xD1, 0xCD, 0xFF, 0xC4, 0xD0, 0xCC, 0xFF, 0xD1, 0xDB, 0xD7, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, + 0xD2, 0xDC, 0xD9, 0xFF, 0xC7, 0xD0, 0xCD, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB3, 0xBA, 0xB8, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, + 0xC3, 0xC8, 0xC6, 0xFF, 0xB9, 0xBE, 0xBD, 0xFF, 0xA5, 0xAC, 0xAA, 0xFF, 0x94, 0x9B, 0x99, 0xFF, 0x9B, 0xA5, 0xA2, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, + 0xBD, 0xC9, 0xC5, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xAB, 0xB7, 0xB3, 0xFF, 0xAF, 0xBB, 0xB7, 0xFF, 0xAE, 0xBA, 0xB6, 0xFF, 0xBA, 0xC7, 0xC2, 0xFF, + 0x72, 0x7A, 0x71, 0xFF, 0xAC, 0xB5, 0xAB, 0xFF, 0x8A, 0x93, 0x89, 0xFF, 0x7E, 0x86, 0x7C, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, + 0x9C, 0xA4, 0x9B, 0xFF, 0x9E, 0xA7, 0x9D, 0xFF, 0xA1, 0xA9, 0x9F, 0xFF, 0x8D, 0x95, 0x8B, 0xFF, 0xA2, 0xAA, 0xA0, 0xFF, 0xA6, 0xAF, 0xA5, 0xFF, + 0xB1, 0xB9, 0xB2, 0xFF, 0xAB, 0xB3, 0xAC, 0xFF, 0xB1, 0xB9, 0xB2, 0xFF, 0x93, 0x9B, 0x93, 0xFF, 0x94, 0x9A, 0x93, 0xFF, 0xB8, 0xBE, 0xB7, 0xFF, + 0xB4, 0xB9, 0xB3, 0xFF, 0xA3, 0xA9, 0xA2, 0xFF, 0x8E, 0x94, 0x90, 0xFF, 0x92, 0x97, 0x93, 0xFF, 0xAB, 0xB1, 0xAD, 0xFF, 0xA4, 0xAA, 0xA6, 0xFF, + 0xB5, 0xBA, 0xB6, 0xFF, 0xC0, 0xC6, 0xC2, 0xFF, 0xB4, 0xB9, 0xB5, 0xFF, 0x97, 0x9C, 0x98, 0xFF, 0x8D, 0x94, 0x90, 0xFF, 0x9F, 0xA7, 0xA2, 0xFF, + 0xB1, 0xB8, 0xB4, 0xFF, 0xB8, 0xBF, 0xBB, 0xFF, 0xB9, 0xC2, 0xBF, 0xFF, 0xB7, 0xC1, 0xBE, 0xFF, 0xB3, 0xBC, 0xB9, 0xFF, 0xB2, 0xBB, 0xB8, 0xFF, + 0x93, 0x9D, 0x9A, 0xFF, 0x9F, 0xA9, 0xA5, 0xFF, 0xBA, 0xC3, 0xC0, 0xFF, 0x93, 0x9D, 0x9A, 0xFF, 0xA4, 0xAB, 0xA9, 0xFF, 0xBA, 0xC1, 0xBF, 0xFF, + 0xCA, 0xD2, 0xCF, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0x9A, 0x9F, 0x9D, 0xFF, 0x95, 0x9A, 0x99, 0xFF, 0x9E, 0xA2, 0xA1, 0xFF, 0x98, 0x9C, 0x9B, 0xFF, + 0x95, 0x9A, 0x99, 0xFF, 0xA8, 0xAD, 0xAB, 0xFF, 0xB6, 0xBB, 0xB9, 0xFF, 0xB2, 0xB7, 0xB6, 0xFF, 0xAD, 0xB1, 0xB0, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xB2, 0xB7, 0xB6, 0xFF, 0xB5, 0xBA, 0xB8, 0xFF, 0xAB, 0xB0, 0xAF, 0xFF, 0xC2, 0xC6, 0xC5, 0xFF, 0xC3, 0xC8, 0xC6, 0xFF, 0xAF, 0xB4, 0xB2, 0xFF, + 0xB7, 0xBE, 0xBB, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xC1, 0xC8, 0xC6, 0xFF, 0xBB, 0xC3, 0xC0, 0xFF, 0xB6, 0xBD, 0xBA, 0xFF, 0xAA, 0xB1, 0xAF, 0xFF, + 0xAD, 0xB5, 0xB2, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xB0, 0xBA, 0xB7, 0xFF, 0xB5, 0xBF, 0xBB, 0xFF, 0xA9, 0xB3, 0xB0, 0xFF, 0x94, 0x9E, 0x9B, 0xFF, + 0xA6, 0xB2, 0xAD, 0xFF, 0xB8, 0xC4, 0xC0, 0xFF, 0xC0, 0xCC, 0xC8, 0xFF, 0xB9, 0xC5, 0xC1, 0xFF, 0xC9, 0xD3, 0xCF, 0xFF, 0xD7, 0xE0, 0xDD, 0xFF, + 0xD2, 0xDC, 0xD9, 0xFF, 0xBD, 0xC7, 0xC4, 0xFF, 0xBE, 0xC5, 0xC2, 0xFF, 0xB0, 0xB7, 0xB4, 0xFF, 0xA9, 0xB0, 0xAD, 0xFF, 0xAC, 0xB3, 0xB1, 0xFF, + 0xD0, 0xD4, 0xD3, 0xFF, 0xD1, 0xD6, 0xD4, 0xFF, 0xBF, 0xC6, 0xC4, 0xFF, 0xA2, 0xA9, 0xA7, 0xFF, 0x90, 0x99, 0x96, 0xFF, 0x83, 0x8D, 0x89, 0xFF, + 0xA4, 0xB0, 0xAC, 0xFF, 0xAC, 0xB9, 0xB4, 0xFF, 0xBC, 0xC8, 0xC4, 0xFF, 0xB7, 0xC3, 0xBF, 0xFF, 0xA2, 0xAE, 0xAA, 0xFF, 0xB6, 0xC2, 0xBE, 0xFF }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp index fb53a489..809bed56 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.cpp @@ -90,6 +90,13 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, isHoag ? "Default: 1664 mA" : "2048 mA" }; + + case HocClkConfigValue_InputCurrentLimit: + return { + "Overrides the maximum input current from the charger.", + isHoag ? "Default: 900 mA" : "1200 mA" + }; + case HocClkConfigValue_AulaDisplayColorPreset: return { "Current display color preset. Default is Basic", @@ -98,8 +105,8 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "- Washed: Washed out colors.", "- Basic: Real natural profile.", "- Natural: Not actually natural.. Extra saturation.", - "- Vivid: Saturated.", - "Default: Do not override" + "- Vivid: Saturated.", + "Default: Do not override" }; case HocClkConfigValue_CpuGovernorMinimumFreq: @@ -137,13 +144,17 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Warning: Enabling this may cause damage to your device without a proper undervolt. Use with caution!", "Clock cappings:", "- Handheld:", - " - GPU (HiOPT): 614 MHz", - " - GPU (HiOPT - 15mV): 691 MHz", - " - GPU (High UV): 768 MHz", + " - GPU (No UV): 614 MHz", + " - GPU (SLT): 691 MHz", + " - GPU (HiOPT): 768 MHz", + " - GPU (HiOPT - 15mV): 844 MHz", + " - GPU (High UV): 921 MHz", "- USB Charger", - " - GPU (HiOPT): 844 MHz", - " - GPU (HiOPT - 15mV): 921 MHz", - " - GPU (High UV): 998 MHz", + " - GPU (No UV): 844 MHz", + " - GPU (SLT): 921 MHz", + " - GPU (HiOPT): 998 MHz", + " - GPU (HiOPT - 15mV): 1075 MHz", + " - GPU (High UV): 1152 MHz", "- PD Charger / Docked:", " - No capping applied", "Default: OFF" @@ -170,19 +181,6 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: ON", }; - case HocClkConfigValue_HandheldTDP: - return { - "If enabled, Resets to stock clocks when power consumption is above the threshold in handheld mode", - "Default: ON", - }; - - case HocClkConfigValue_HandheldTDPLimit: - case HocClkConfigValue_LiteTDPLimit: - return { - "The power consumption threshold (in mW) for resetting to stock clocks in handheld mode when Handheld TDP is enabled.", - isHoag ? "Default: 6400mW" : "Default: 9600mW" - }; - case HocClkConfigValue_ThermalThrottleThreshold: return { "The temperature threshold (in °C) for resetting to stock clocks when Thermal Throttle is enabled.", @@ -227,7 +225,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Default: 600 mV" }; - case KipConfigValue_stepMode: + case KipConfigValue_stepMode: return { "The step that RAM clocks take.", "Options (with examples):", @@ -250,8 +248,6 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, }; case KipConfigValue_eristaEmcMaxClock: - case KipConfigValue_eristaEmcMaxClock1: - case KipConfigValue_eristaEmcMaxClock2: return { "The RAM frequency used in the particular slot. Higher frequencies may cause instability, so increase this gradually and test for stability.", "Default: Disabled (1600 MHz)" @@ -363,19 +359,6 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "These properties apply for both write and read latencies, and you can mix-and-match the brackets if necessary", "Default: -" }; - - case KipConfigValue_mem_burst_read_latency: - return { - "The read latency for the ram", - "Default: 1600 RL" - }; - - case KipConfigValue_mem_burst_write_latency: - return { - "The write latency for the ram", - "Default: 1600 WL" - }; - case KipConfigValue_marikoCpuUVLow: return { "The CPU UV level used before tBreak", @@ -463,6 +446,23 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "The clock used for the CPU in \"boost mode\"", "Default: 1785 MHz" }; + case HocClkConfigValue_AutoRAMCPUOverclock: + return { + "When enabled, automatically raises the CPU clock to the configured OC frequency when RAM clock meets or exceeds the threshold to meet the increased voltage requirement.", + "Default: ON" + }; + + case HocClkConfigValue_AutoRamCpuCpuOCFreq: + return { + "The CPU clock (in MHz) applied when Auto High RAM CPU OC is enabled and the RAM threshold is met.", + "Default: 1683 MHz" + }; + + case HocClkConfigValue_AutoRamCpuRamOCThreshold: + return { + "The RAM clock threshold (in MHz) at or above which the Auto High RAM CPU OC will activate.", + "Default: 2133MHz" + }; case HocClkConfigValue_OverwriteBoostMode: return { @@ -474,10 +474,12 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, return { "GPU undervolt level", "Options:", - " - HiOPT: L4T Custom HiOPT table", + " - No Undervolt: No Undervolt, HOS default", + " - SLT Table: NVIDIA custom SLT Table", + " - HiOPT: L4T Custom HiOPT table, HOC Default", " - HiOPT - 15mV: L4T Custom HiOPT table with a 15mV offset", - " - High UV: The highest undervolt table, recommended", - "Default: HiOPT" + " - High UV: The highest undervolt table", + "Default: No Undervolt" }; case KipConfigValue_marikoGpuVmin: @@ -492,7 +494,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, "Maximum GPU voltage", "Default: 800 mV" }; - + case HocClkConfigValue_DVFSMode: return { "The mode used for GPU DVFS", @@ -513,10 +515,10 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, return { "GPU undervolt level", "Options:", + " - No Undervolt: No Undervolt...", + " - SLT Table: NVIDIA custom SLT Table", " - HiOPT: L4T Custom HiOPT table", - " - HiOPT - 15mV: L4T Custom HiOPT table with a 15mV offset", - " - High UV: The highest undervolt table, recommended", - "Default: HiOPT" + "Default: No Undervolt" }; case KipConfigValue_eristaGpuVmin: @@ -527,7 +529,7 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, case KipConfigValue_commonGpuVoltOffset: return { - "The offset added/subtracted to all AUTO GPU voltages", + "The offset added/subtracted to all GPU voltages marked as \"auto\"", "Default: 0 mV (Disabled)" }; @@ -549,4 +551,4 @@ std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, default: return {}; } -} +} \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h index 595abbee..bffde185 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h +++ b/Source/hoc-clk/overlay/src/ui/gui/config_info_strings.h @@ -16,8 +16,9 @@ * */ #pragma once -#include "misc_gui.h" -#include #include +#include + +#include "misc_gui.h" std::vector ConfigInfoStrings(HocClkConfigValue val, bool isMariko, bool isHoag); diff --git a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp index fa2c6c89..995dec81 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,45 +24,37 @@ * -------------------------------------------------------------------------- */ - #include "fatal_gui.h" -FatalGui::FatalGui(const std::string message, const std::string info) -{ +FatalGui::FatalGui(const std::string message, const std::string info) { this->message = message; this->info = info; } -void FatalGui::openWithResultCode(std::string tag, Result rc) -{ +void FatalGui::openWithResultCode(std::string tag, Result rc) { char rcStr[32]; std::string info = tag; info.append(rcStr, snprintf(rcStr, sizeof(rcStr), "\n\n[0x%x] %04d-%04d", rc, R_MODULE(rc), R_DESCRIPTION(rc))); - tsl::changeTo( - "Could not connect to hoc-clk sysmodule.\n\n" - "\n" - "Please make sure everything is\n\n" - "correctly installed and enabled.", - info - ); + tsl::changeTo("Could not connect to hoc-clk sysmodule.\n\n" + "\n" + "Please make sure everything is\n\n" + "correctly installed and enabled.", + info); } -tsl::elm::Element* FatalGui::baseUI() -{ - tsl::elm::CustomDrawer* drawer = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer* renderer, u16 x, u16 y, u16 w, u16 h) { +tsl::elm::Element *FatalGui::baseUI() { + tsl::elm::CustomDrawer *drawer = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { renderer->drawString("\uE150", false, 40, 210, 40, TEXT_COLOR); renderer->drawString("Fatal error", false, 100, 210, 30, TEXT_COLOR); std::uint32_t txtY = 255; - if(!this->message.empty()) - { + if (!this->message.empty()) { txtY += renderer->drawString(this->message.c_str(), false, 40, txtY, 23, TEXT_COLOR).second; txtY += 55; } - if(!this->info.empty()) - { + if (!this->info.empty()) { renderer->drawString(this->info.c_str(), false, 40, txtY, 18, DESC_COLOR); } }); @@ -70,11 +62,10 @@ tsl::elm::Element* FatalGui::baseUI() return drawer; } -bool FatalGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight) -{ - if((keysDown & HidNpadButton_A) == HidNpadButton_A || (keysDown & HidNpadButton_B) == HidNpadButton_B) - { - while(tsl::Overlay::get()->getCurrentGui() != nullptr) { +bool FatalGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, + HidAnalogStickState joyStickPosRight) { + if ((keysDown & HidNpadButton_A) == HidNpadButton_A || (keysDown & HidNpadButton_B) == HidNpadButton_B) { + while (tsl::Overlay::get()->getCurrentGui() != nullptr) { tsl::goBack(); } return true; diff --git a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h index 61616e58..eb76bd14 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/fatal_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,23 +24,23 @@ * -------------------------------------------------------------------------- */ - #pragma once #include #include "base_gui.h" -class FatalGui : public BaseGui -{ +class FatalGui : public BaseGui { protected: - std::string message; - std::string info; + std::string message; + std::string info; public: - FatalGui(const std::string message, const std::string info); - ~FatalGui() {} - tsl::elm::Element* baseUI() override; - bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight); - static void openWithResultCode(std::string tag, Result rc); + FatalGui(const std::string message, const std::string info); + ~FatalGui() { + } + tsl::elm::Element *baseUI() override; + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, + HidAnalogStickState joyStickPosRight); + static void openWithResultCode(std::string tag, Result rc); }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp index cc1325d2..fce953be 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,20 +24,13 @@ * -------------------------------------------------------------------------- */ - -#include "freq_choice_gui.h" - #include "../format.h" #include "fatal_gui.h" +#include "freq_choice_gui.h" +#include "ult_ext.h" -FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, - std::uint32_t* hzList, - std::uint32_t hzCount, - HocClkModule module, - FreqChoiceListener listener, - bool checkMax, - std::map labels) -{ +FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, std::uint32_t *hzList, std::uint32_t hzCount, HocClkModule module, FreqChoiceListener listener, + bool checkMax, std::map labels) { this->selectedHz = selectedHz; this->hzList = hzList; this->hzCount = hzCount; @@ -45,18 +38,16 @@ FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, this->listener = listener; this->checkMax = checkMax; this->labels = labels; - this->configList = new HocClkConfigValueList {}; + this->configList = new HocClkConfigValueList{}; } -FreqChoiceGui::~FreqChoiceGui() -{ +FreqChoiceGui::~FreqChoiceGui() { delete this->configList; } -tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool selected, int safety) -{ +tsl::elm::ListItem *FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool selected, int safety) { std::string text; - if(module == HocClkModule_MEM) + if (module == HocClkModule_MEM) text = formatListFreqHzMem(hz, (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]); else text = formatListFreqHz(hz); @@ -67,35 +58,32 @@ tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool sel rightText = it->second; if (selected) - const_cast(rightText) = "\uE14B"; + const_cast(rightText) = "\uE14B"; - tsl::elm::ListItem* listItem = - new tsl::elm::ListItem(text, rightText, false); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, rightText, false); - switch (safety) - { - case 0: - listItem->setTextColor(tsl::Color(255, 255, 255, 255)); - listItem->setValueColor(tsl::Color(255, 255, 255, 255)); - break; - case 1: - listItem->setTextColor(tsl::Color(255, 165, 0, 255)); - listItem->setValueColor(tsl::Color(255, 165, 0, 255)); - break; - case 2: - listItem->setTextColor(tsl::Color(255, 0, 0, 255)); - listItem->setValueColor(tsl::Color(255, 0, 0, 255)); - break; + switch (safety) { + case 0: + listItem->setTextColor(tsl::Color(255, 255, 255, 255)); + listItem->setValueColor(tsl::Color(255, 255, 255, 255)); + break; + case 1: + listItem->setTextColor(tsl::Color(255, 165, 0, 255)); + listItem->setValueColor(tsl::Color(255, 165, 0, 255)); + break; + case 2: + listItem->setTextColor(tsl::Color(255, 0, 0, 255)); + listItem->setValueColor(tsl::Color(255, 0, 0, 255)); + break; } // Make annotation grey if (!rightText.empty() && !selected) listItem->setValueColor(tsl::Color(180, 180, 180, 255)); - else if(selected) + else if (selected) listItem->setValueColor(tsl::infoTextColor); - listItem->setClickListener([this, hz](u64 keys) - { + listItem->setClickListener([this, hz](u64 keys) { if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) { if (this->listener(hz)) { tsl::goBack(); @@ -108,8 +96,7 @@ tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool sel return listItem; } -void FreqChoiceGui::listUI() -{ +void FreqChoiceGui::listUI() { hocclkIpcGetConfigValues(this->configList); // Header based on CPU/GPU/MEM module @@ -117,11 +104,9 @@ void FreqChoiceGui::listUI() this->listElement->addItem(new tsl::elm::CategoryHeader(moduleName)); // Default option - this->listElement->addItem( - this->createFreqListItem(0, this->selectedHz == 0, 0)); + this->listElement->addItem(this->createFreqListItem(0, this->selectedHz == 0, 0)); - for (std::uint32_t i = 0; i < this->hzCount; i++) - { + for (std::uint32_t i = 0; i < this->hzCount; i++) { std::uint32_t hz = this->hzList[i]; uint32_t mhz = hz / 1000000; @@ -159,23 +144,14 @@ void FreqChoiceGui::listUI() uint32_t danger_cpu; uint32_t danger_gpu; - if (IsMariko()) - { + if (IsMariko()) { unsafe_cpu = this->configList->values[KipConfigValue_marikoCpuUVHigh] ? 2398 : 1964; - if(this->configList->values[KipConfigValue_marikoGpuUV] == 0) { - unsafe_gpu = 1076; - } else if (this->configList->values[KipConfigValue_marikoGpuUV] == 1) { - unsafe_gpu = 1153; - } else { - unsafe_gpu = 1229; - } + unsafe_gpu = 1229; danger_cpu = this->configList->values[KipConfigValue_marikoCpuUVHigh] ? 2500 : 2398; danger_gpu = 1306; - } - else - { + } else { unsafe_cpu = this->configList->values[KipConfigValue_eristaCpuUV] ? 2092 : 1786; - if(this->configList->values[KipConfigValue_eristaGpuUV] == 0) { + if (this->configList->values[KipConfigValue_eristaGpuUV] == GPUUVLevel_NoUV) { unsafe_gpu = 922; } else { unsafe_gpu = 961; @@ -207,16 +183,9 @@ void FreqChoiceGui::listUI() } else if (moduleName == "mem") { safety = 0; - } - this->listElement->addItem( - this->createFreqListItem( - hz, - (mhz == this->selectedHz / 1000000), - safety - ) - ); + this->listElement->addItem(this->createFreqListItem(hz, (mhz == this->selectedHz / 1000000), safety)); } this->listElement->jumpToItem("", ""); diff --git a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h index 56b04ce2..98440941 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/freq_choice_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,22 +24,21 @@ * -------------------------------------------------------------------------- */ - #pragma once -#include #include +#include #include + #include "base_menu_gui.h" using FreqChoiceListener = std::function; -class FreqChoiceGui : public BaseMenuGui -{ -protected: - HocClkConfigValueList* configList; +class FreqChoiceGui : public BaseMenuGui { + protected: + HocClkConfigValueList *configList; std::uint32_t selectedHz; - std::uint32_t* hzList; + std::uint32_t *hzList; std::uint32_t hzCount; HocClkModule module; FreqChoiceListener listener; @@ -47,16 +46,11 @@ protected: std::map labels; - tsl::elm::ListItem* createFreqListItem(std::uint32_t hz, bool selected, int safety); + tsl::elm::ListItem *createFreqListItem(std::uint32_t hz, bool selected, int safety); -public: - FreqChoiceGui(std::uint32_t selectedHz, - std::uint32_t* hzList, - std::uint32_t hzCount, - HocClkModule module, - FreqChoiceListener listener, - bool checkMax = true, - std::map labels = {}); + public: + FreqChoiceGui(std::uint32_t selectedHz, std::uint32_t *hzList, std::uint32_t hzCount, HocClkModule module, FreqChoiceListener listener, + bool checkMax = true, std::map labels = {}); ~FreqChoiceGui(); diff --git a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp index 1bdf2ab0..197b8d53 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.cpp @@ -16,6 +16,7 @@ * */ +#include "ult_ext.h" #include "../format.h" #include "fatal_gui.h" #include "global_override_gui.h" diff --git a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h index 1f57be35..51cfd075 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/global_override_gui.h @@ -13,9 +13,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -25,50 +25,33 @@ * -------------------------------------------------------------------------- */ #pragma once +#include + #include "../../ipc.h" #include "base_menu_gui.h" #include "freq_choice_gui.h" -#include #include "value_choice_gui.h" -class GlobalOverrideGui : public BaseMenuGui -{ +class GlobalOverrideGui : public BaseMenuGui { protected: - std::map> customFormatModules; - tsl::elm::ListItem* listItems[HocClkModule_EnumMax]; - std::uint32_t listHz[HocClkModule_EnumMax]; - void openFreqChoiceGui(HocClkModule module); - void addGovernorSection(); - void addModuleListItem(HocClkModule module); - void addModuleToggleItem(HocClkModule module); - void openValueChoiceGui( - tsl::elm::ListItem* listItem, - std::uint32_t currentValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds, - bool enableThresholds, - const std::map& labels, - const std::vector& namedValues, - bool showDefaultValue - ); - void addModuleListItemValue( - HocClkModule module, - const std::string& categoryName, - std::uint32_t min, - std::uint32_t max, - std::uint32_t step, - const std::string& suffix, - std::uint32_t divisor, - int decimalPlaces, - ValueThresholds thresholds = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true - ); + std::map> customFormatModules; + tsl::elm::ListItem *listItems[HocClkModule_EnumMax]; + std::uint32_t listHz[HocClkModule_EnumMax]; + void openFreqChoiceGui(HocClkModule module); + void addGovernorSection(); + void addModuleListItem(HocClkModule module); + void addModuleToggleItem(HocClkModule module); + void openValueChoiceGui(tsl::elm::ListItem *listItem, std::uint32_t currentValue, const ValueRange &range, const std::string &categoryName, + ValueChoiceListener listener, const ValueThresholds &thresholds, bool enableThresholds, + const std::map &labels, const std::vector &namedValues, bool showDefaultValue); + void addModuleListItemValue(HocClkModule module, const std::string &categoryName, std::uint32_t min, std::uint32_t max, std::uint32_t step, + const std::string &suffix, std::uint32_t divisor, int decimalPlaces, ValueThresholds thresholds = {}, + const std::vector &namedValues = {}, bool showDefaultValue = true); + public: - GlobalOverrideGui(); - ~GlobalOverrideGui() {} - void listUI() override; - void refresh() override; - void setModuleCustomFormat(HocClkModule module, const std::string& suffix, std::uint32_t divisor, int decimalPlaces); + GlobalOverrideGui(); + ~GlobalOverrideGui() { + } + void listUI() override; + void refresh() override; + void setModuleCustomFormat(HocClkModule module, const std::string &suffix, std::uint32_t divisor, int decimalPlaces); }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp index aa4e4869..3a339d5b 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/info_gui.cpp @@ -16,72 +16,70 @@ * */ -#include "info_gui.h" -#include "ult_ext.h" #include -InfoGui::InfoGui(std::string title, std::vector strings) - : m_title(std::move(title)), m_strings(std::move(strings)) {} +#include "info_gui.h" +#include "ult_ext.h" -static constexpr s32 TEXT_SIZE = 16; -static constexpr s32 LINE_H = 22; -static constexpr s32 PARA_GAP = 10; -static constexpr s32 MARGIN_L = 20; -static constexpr s32 MARGIN_R = 35; +InfoGui::InfoGui(std::string title, std::vector strings) : m_title(std::move(title)), m_strings(std::move(strings)) { +} -static std::vector wrapText(const std::string& text, s32 maxWidth) -{ +static constexpr s32 TEXT_SIZE = 16; +static constexpr s32 LINE_H = 22; +static constexpr s32 PARA_GAP = 10; +static constexpr s32 MARGIN_L = 20; +static constexpr s32 MARGIN_R = 35; + +static std::vector wrapText(const std::string &text, s32 maxWidth) { constexpr float CHAR_W = 10.0f; // Preserve leading whitespace as an indent prefix for wrapped continuation lines. std::string indent; for (char c : text) { - if (c == ' ') indent += ' '; - else break; + if (c == ' ') + indent += ' '; + else + break; } std::vector lines; std::istringstream ss(text); - std::string word, line = indent; // seed with indent so first word inherits it + std::string word, line = indent; // seed with indent so first word inherits it bool first = true; while (ss >> word) { - std::string candidate = (first && !indent.empty()) ? indent + word - : line.empty() ? word - : line + " " + word; + std::string candidate = (first && !indent.empty()) ? indent + word : line.empty() ? word : line + " " + word; first = false; if (static_cast(candidate.size() * CHAR_W) <= maxWidth) line = std::move(candidate); else { - if (!line.empty() && line != indent) lines.push_back(line); + if (!line.empty() && line != indent) + lines.push_back(line); line = indent + word; } } - if (!line.empty() && line != indent) lines.push_back(line); - if (lines.empty()) lines.emplace_back(""); + if (!line.empty() && line != indent) + lines.push_back(line); + if (lines.empty()) + lines.emplace_back(""); return lines; } -void InfoGui::listUI() -{ +void InfoGui::listUI() { this->listElement->addItem(new tsl::elm::CategoryHeader(m_title)); const s32 maxWidth = tsl::cfg::FramebufferWidth - MARGIN_L - MARGIN_R; - for (const auto& para : m_strings) { - for (const auto& lineText : wrapText(para, maxWidth)) { - auto* d = new FocusableDrawer( - [lineText](tsl::gfx::Renderer* r, s32 x, s32 y, s32 w, s32 h) { - r->drawString((lineText + "\n").c_str(), false, - x + MARGIN_L, y + LINE_H - 5, - TEXT_SIZE, tsl::style::color::ColorText); - }); + for (const auto ¶ : m_strings) { + for (const auto &lineText : wrapText(para, maxWidth)) { + auto *d = new FocusableDrawer([lineText](tsl::gfx::Renderer *r, s32 x, s32 y, s32 w, s32 h) { + r->drawString((lineText + "\n").c_str(), false, x + MARGIN_L, y + LINE_H - 5, TEXT_SIZE, tsl::style::color::ColorText); + }); d->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, LINE_H); this->listElement->addItem(d, LINE_H); } // paragraph gap - auto* gap = new tsl::elm::CustomDrawer( - [](tsl::gfx::Renderer*, s32, s32, s32, s32) {}); + auto *gap = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); gap->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, PARA_GAP); this->listElement->addItem(gap, PARA_GAP); } diff --git a/Source/hoc-clk/overlay/src/ui/gui/info_gui.h b/Source/hoc-clk/overlay/src/ui/gui/info_gui.h index 8e5bf437..a1ae8e9d 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/info_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/info_gui.h @@ -16,18 +16,18 @@ * */ #pragma once -#include "base_menu_gui.h" #include #include -class InfoGui : public BaseMenuGui -{ -public: +#include "base_menu_gui.h" + +class InfoGui : public BaseMenuGui { + public: InfoGui(std::string title, std::vector strings); ~InfoGui() = default; void listUI() override; -private: + private: std::string m_title; std::vector m_strings; }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp index de3b11ad..55f59189 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/labels.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/labels.cpp @@ -12,124 +12,73 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include #include +#include #include std::map cpu_freq_label_m = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Boost Mode"}, - {1963000000, "Safe Max"}, - {2397000000, "Unsafe Max"}, - {2703000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, + { 1963000000, "Safe Max" }, { 2397000000, "Unsafe Max" }, { 2703000000, "Absolute Max" }, }; std::map cpu_freq_label_m_uv = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Boost Mode"}, - {2397000000, "Safe Max"}, - {2499000000, "Unsafe Max"}, - {2703000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, + { 2397000000, "Safe Max" }, { 2499000000, "Unsafe Max" }, { 2703000000, "Absolute Max" }, }; std::map cpu_freq_label_e = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Safe Max"}, - {2091000000, "Unsafe Max"}, - {2397000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, + { 1785000000, "Safe Max" }, { 2091000000, "Unsafe Max" }, { 2397000000, "Absolute Max" }, }; std::map cpu_freq_label_e_uv = { - {612000000, "Sleep Mode"}, - {1020000000, "Stock"}, - {1224000000, "Dev OC"}, - {1785000000, "Boost Mode"}, - {2091000000, "Safe Max"}, - {2193000000, "Unsafe Max"}, - {2397000000, "Absolute Max"}, + { 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" }, + { 2091000000, "Safe Max" }, { 2193000000, "Unsafe Max" }, { 2397000000, "Absolute Max" }, }; - std::map gpu_freq_label_e = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {921600000, "Safe Max"}, - {960000000, "Unsafe Max"}, - {1075200000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, + { 422400000, "Handheld" }, { 460800000, "Handheld Safe Max" }, { 768000000, "Docked" }, { 921600000, "Safe Max" }, + { 960000000, "Unsafe Max" }, { 1075200000, "Absolute Max" }, }; std::map gpu_freq_label_e_uv = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {960000000, "Safe Max"}, - {1075200000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, + { 384000000, "Handheld" }, { 422400000, "Handheld" }, { 460800000, "Handheld Safe Max" }, + { 768000000, "Docked" }, { 960000000, "Safe Max" }, { 1075200000, "Absolute Max" }, }; std::map gpu_freq_label_m = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {345600000, "Handheld"}, - {384000000, "Handheld"}, - {422400000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {1075200000, "Safe Max"}, - {1305600000, "Unsafe Max"}, - {1536000000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, { 422400000, "Handheld" }, + { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, { 998400000, "Safe Max" }, }; std::map gpu_freq_label_m_slt = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {384000000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {1152200000, "Safe Max"}, - {1305600000, "Unsafe Max"}, - {1536000000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, + { 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, + { 1075200000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, }; std::map gpu_freq_label_m_hiopt = { - {76800000, "Boost Mode"}, - {307200000, "Handheld"}, - {384000000, "Handheld"}, - {460800000, "Handheld"}, - {614400000, "Handheld Safe Max"}, - {768000000, "Docked"}, - {1228800000, "Safe Max"}, - {1305600000, "Unsafe Max"}, - {1536000000, "Absolute Max"}, + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, + { 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, + { 1152000000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, }; -std::map* marikoUV[3] { - &gpu_freq_label_m, - &gpu_freq_label_m_slt, - &gpu_freq_label_m_hiopt, +std::map gpu_freq_label_m_highuv = { + { 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 384000000, "Handheld" }, + { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, + { 1228800000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" }, }; +std::map *marikoUV[5]{ + &gpu_freq_label_m, &gpu_freq_label_m_slt, &gpu_freq_label_m_hiopt, &gpu_freq_label_m_hiopt, &gpu_freq_label_m_highuv, +}; -std::map* eristaUV[3] { +std::map *eristaUV[3]{ &gpu_freq_label_e, &gpu_freq_label_e_uv, &gpu_freq_label_e_uv, diff --git a/Source/hoc-clk/overlay/src/ui/gui/labels.h b/Source/hoc-clk/overlay/src/ui/gui/labels.h index bbebef02..5c087026 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/labels.h +++ b/Source/hoc-clk/overlay/src/ui/gui/labels.h @@ -27,8 +27,10 @@ extern std::map cpu_freq_label_e_uv; extern std::map gpu_freq_label_m; extern std::map gpu_freq_label_m_slt; extern std::map gpu_freq_label_m_hiopt; +extern std::map gpu_freq_label_m_highuv; + extern std::map gpu_freq_label_e; extern std::map gpu_freq_label_e_uv; -extern std::map* marikoUV[3]; +extern std::map* marikoUV[5]; extern std::map* eristaUV[3]; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp index 133be0f4..4b2021e8 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/main_gui.cpp @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,17 +24,23 @@ * -------------------------------------------------------------------------- */ - -#include "main_gui.h" - -#include "fatal_gui.h" -#include "app_profile_gui.h" -#include "global_override_gui.h" -#include "misc_gui.h" #include "about_gui.h" +#include "app_profile_gui.h" +#include "fatal_gui.h" +#include "global_override_gui.h" +#include "main_gui.h" +#include "misc_gui.h" +#include "ult_ext.h" -void MainGui::listUI() -{ + +tsl::elm::Element *MainGui::baseUI() { + auto *list = new BoxClippedList(); + this->listElement = list; + this->listUI(); + return list; +} + +void MainGui::listUI() { // this->enabledToggle = new tsl::elm::ToggleListItem("Enable", false); // enabledToggle->setStateChangedListener([this](bool state) { // Result rc = hocclkIpcSetEnabled(state); @@ -48,10 +54,9 @@ void MainGui::listUI() // }); // this->listElement->addItem(this->enabledToggle); - tsl::elm::ListItem* appProfileItem = new tsl::elm::ListItem("Edit App Profile"); + tsl::elm::ListItem *appProfileItem = new tsl::elm::ListItem("Edit App Profile"); appProfileItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { AppProfileGui::changeTo(this->context->applicationId); return true; } @@ -60,11 +65,9 @@ void MainGui::listUI() }); this->listElement->addItem(appProfileItem); - - tsl::elm::ListItem* globalProfileItem = new tsl::elm::ListItem("Edit Global Profile"); + tsl::elm::ListItem *globalProfileItem = new tsl::elm::ListItem("Edit Global Profile"); globalProfileItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { AppProfileGui::changeTo(HOCCLK_GLOBAL_PROFILE_TID); return true; } @@ -73,10 +76,9 @@ void MainGui::listUI() }); this->listElement->addItem(globalProfileItem); - tsl::elm::ListItem* globalOverrideItem = new tsl::elm::ListItem("Temporary Overrides"); + tsl::elm::ListItem *globalOverrideItem = new tsl::elm::ListItem("Temporary Overrides"); globalOverrideItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { tsl::changeTo(); return true; } @@ -85,12 +87,11 @@ void MainGui::listUI() }); this->listElement->addItem(globalOverrideItem); - //this->listElement->addItem(new tsl::elm::CategoryHeader("Misc")); + // this->listElement->addItem(new tsl::elm::CategoryHeader("Misc")); - tsl::elm::ListItem* miscItem = new tsl::elm::ListItem("Settings"); + tsl::elm::ListItem *miscItem = new tsl::elm::ListItem("Settings"); miscItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { tsl::changeTo(); return true; } @@ -99,10 +100,9 @@ void MainGui::listUI() }); this->listElement->addItem(miscItem); - tsl::elm::ListItem* aboutItem = new tsl::elm::ListItem("About"); + tsl::elm::ListItem *aboutItem = new tsl::elm::ListItem("About"); aboutItem->setClickListener([this](u64 keys) { - if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) - { + if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) { tsl::changeTo(); return true; } @@ -110,14 +110,12 @@ void MainGui::listUI() return false; }); this->listElement->addItem(aboutItem); - } -void MainGui::refresh() -{ +void MainGui::refresh() { BaseMenuGui::refresh(); - //if(this->context) + // if(this->context) //{ - // this->enabledToggle->setState(this->context->enabled); - //} + // this->enabledToggle->setState(this->context->enabled); + // } } diff --git a/Source/hoc-clk/overlay/src/ui/gui/main_gui.h b/Source/hoc-clk/overlay/src/ui/gui/main_gui.h index 6eae080c..363811b7 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/main_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/main_gui.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,16 +24,20 @@ * -------------------------------------------------------------------------- */ - #pragma once #include "base_menu_gui.h" -class MainGui : public BaseMenuGui -{ +class MainGui : public BaseMenuGui { public: - MainGui() {} - ~MainGui() {} - void listUI() override; - void refresh() override; + MainGui() { + } + ~MainGui() { + } + tsl::elm::Element *baseUI() override; + void listUI() override; + void refresh() override; + u16 headerHeight() const override { + return HOC_HEADER_HEIGHT - 25; + } }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 0ff44c7e..23e65f54 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -16,17 +16,20 @@ * */ -#include "misc_gui.h" -#include "fatal_gui.h" -#include "config_info_strings.h" -#include "../format.h" #include #include #include + +#include "../format.h" +#include "config_info_strings.h" +#include "fatal_gui.h" #include "labels.h" +#include "misc_gui.h" +#include "ult_ext.h" + // This workaround *may* not be nessasary, but it seems to help with reducing stutter -static void kipDataThreadFunc(void*) { +static void kipDataThreadFunc(void *) { hocClkIpcSetKipData(); } @@ -45,7 +48,7 @@ static void sendKipData() { } } #if IS_MINIMAL == 1 -#pragma message("Compiling with minimal features") + #pragma message("Compiling with minimal features") #endif #define A_BTN "\ue0e0" @@ -61,16 +64,13 @@ class RamLatenciesSubmenuGui; class CpuSubmenuGui; class GpuSubmenuGui; class GpuCustomTableSubmenuGui; -class RamTableEditor; class ExperimentalSettingsSubMenuGui; -MiscGui::MiscGui() -{ - this->configList = new HocClkConfigValueList {}; +MiscGui::MiscGui() { + this->configList = new HocClkConfigValueList{}; } -MiscGui::~MiscGui() -{ +MiscGui::~MiscGui() { if (shouldSaveKip) { sendKipData(); shouldSaveKip = false; @@ -87,15 +87,16 @@ MiscGui::~MiscGui() this->configRanges.clear(); } -void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char* altName, bool kip) { - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char *altName, bool kip) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); struct YAwareToggle : tsl::elm::ToggleListItem { std::vector m_info; std::string m_title; - YAwareToggle(const char* text, bool state, std::string title, std::vector info) - : tsl::elm::ToggleListItem(text, state), m_info(std::move(info)), m_title(std::move(title)) {} + YAwareToggle(const char *text, bool state, std::string title, std::vector info) + : tsl::elm::ToggleListItem(text, state), m_info(std::move(info)), m_title(std::move(title)) { + } bool onClick(u64 keys) override { if (!m_info.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { tsl::changeTo(m_title, m_info); @@ -105,8 +106,7 @@ void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char* altName, } }; - auto* toggle = new YAwareToggle(configName, this->configList->values[configVal], - configName, std::move(infoStrings)); + auto *toggle = new YAwareToggle(configName, this->configList->values[configVal], configName, std::move(infoStrings)); if (!kip) toggle->setTextColor(tsl::Color(120, 235, 255, 255)); toggle->setStateChangedListener([this, configVal, kip](bool state) { @@ -123,27 +123,27 @@ void MiscGui::addConfigToggle(HocClkConfigValue configVal, const char* altName, this->configToggles[configVal] = toggle; } -void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char* altName, const ValueRange& range, bool kip) { +void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char *altName, const ValueRange &range, bool kip) { auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); struct IndexedBar : tsl::elm::NamedStepTrackBar { std::vector m_info; std::string m_title; - IndexedBar(const char* label, const ValueRange& r, std::string title, std::vector info) - : tsl::elm::NamedStepTrackBar("", {""}, true, label), - m_info(std::move(info)), m_title(std::move(title)) { + IndexedBar(const char *label, const ValueRange &r, std::string title, std::vector info) + : tsl::elm::NamedStepTrackBar("", { "" }, true, label), m_info(std::move(info)), m_title(std::move(title)) { m_stepDescriptions.clear(); u32 numSteps = (r.max - r.min) / r.step + 1; for (u32 i = 0; i < numSteps; i++) { u32 disp = (r.min + i * r.step) / r.divisor; std::string s = std::to_string(disp); - if (!r.suffix.empty()) s += " " + r.suffix; + if (!r.suffix.empty()) + s += " " + r.suffix; m_stepDescriptions.push_back(s); } m_numSteps = (u8)m_stepDescriptions.size(); m_selection = m_stepDescriptions[0]; } - bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState& touchPos, - HidAnalogStickState leftJoyStick, HidAnalogStickState rightJoyStick) override { + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { if (!m_info.empty() && (keysDown & HidNpadButton_Y) && !(keysDown & ~HidNpadButton_Y)) { tsl::changeTo(m_title, m_info); return true; @@ -151,8 +151,8 @@ void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char* altName return tsl::elm::NamedStepTrackBar::handleInput(keysDown, keysHeld, touchPos, leftJoyStick, rightJoyStick); } }; - const char* name = altName ? altName : hocclkFormatConfigValue(configVal, true); - auto* bar = new IndexedBar(name, range, name, std::move(infoStrings)); + const char *name = altName ? altName : hocclkFormatConfigValue(configVal, true); + auto *bar = new IndexedBar(name, range, name, std::move(infoStrings)); u32 cur = (u32)this->configList->values[configVal]; u16 curStep = 0; if (cur >= range.min && cur <= range.max && range.step > 0 && (cur - range.min) % range.step == 0) @@ -161,26 +161,27 @@ void MiscGui::addConfigTrackbar(HocClkConfigValue configVal, const char* altName bar->setValueChangedListener([this, configVal, kip, range](u16 v) { this->configList->values[configVal] = range.min + (u32)v * range.step; Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - if (kip) shouldSaveKip = true; + if (R_FAILED(rc)) + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + if (kip) + shouldSaveKip = true; }); this->listElement->addItem(bar); } -void MiscGui::addMappedConfigTrackbar(HocClkConfigValue configVal, const char* altName, - std::vector vals, - std::initializer_list names, bool kip) { - const char* name = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addMappedConfigTrackbar(HocClkConfigValue configVal, const char *altName, std::vector vals, + std::initializer_list names, bool kip) { + const char *name = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); struct YAwareTrackBar : tsl::elm::NamedStepTrackBar { std::vector m_info; std::string m_title; - YAwareTrackBar(const char* label, std::initializer_list steps, std::string title, std::vector info) - : tsl::elm::NamedStepTrackBar("", steps, true, label), - m_info(std::move(info)), m_title(std::move(title)) {} - bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState& touchPos, - HidAnalogStickState leftJoyStick, HidAnalogStickState rightJoyStick) override { + YAwareTrackBar(const char *label, std::initializer_list steps, std::string title, std::vector info) + : tsl::elm::NamedStepTrackBar("", steps, true, label), m_info(std::move(info)), m_title(std::move(title)) { + } + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { if (!m_info.empty() && (keysDown & HidNpadButton_Y) && !(keysDown & ~HidNpadButton_Y)) { tsl::changeTo(m_title, m_info); return true; @@ -189,38 +190,35 @@ void MiscGui::addMappedConfigTrackbar(HocClkConfigValue configVal, const char* a } }; - auto* bar = new YAwareTrackBar(name, names, name, std::move(infoStrings)); + auto *bar = new YAwareTrackBar(name, names, name, std::move(infoStrings)); u32 cur = (u32)this->configList->values[configVal]; u16 curIdx = 0; for (u16 i = 0; i < (u16)vals.size(); i++) { - if (vals[i] == cur) { curIdx = i; break; } + if (vals[i] == cur) { + curIdx = i; + break; + } } bar->setProgress(curIdx); bar->setValueChangedListener([this, configVal, kip, vals](u16 idx) { if (idx < (u16)vals.size()) this->configList->values[configVal] = vals[idx]; Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - if (kip) shouldSaveKip = true; + if (R_FAILED(rc)) + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + if (kip) + shouldSaveKip = true; }); this->listElement->addItem(bar); } - -void MiscGui::addConfigButton(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels, - const std::vector& namedValues, - bool showDefaultValue, - bool kip) -{ - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addConfigButton(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels, + const std::vector &namedValues, bool showDefaultValue, bool kip) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(configName); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(configName); if (!kip) listItem->setTextColor(tsl::Color(120, 235, 255, 255)); @@ -230,7 +228,7 @@ void MiscGui::addConfigButton(HocClkConfigValue configVal, snprintf(valueText, sizeof(valueText), "%s", VALUE_DEFAULT_TEXT); } else { bool foundNamedValue = false; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str()); foundNamedValue = true; @@ -251,79 +249,62 @@ void MiscGui::addConfigButton(HocClkConfigValue configVal, ValueThresholds thresholdsCopy = (thresholds ? *thresholds : ValueThresholds{}); - listItem->setClickListener( - [this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, - infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) - { - if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { - tsl::changeTo(configName, infoStrings); - return true; - } - - if ((keys & HidNpadButton_A) == 0) - return false; - - std::uint32_t currentValue = this->configList->values[configVal]; - - // Look up live namedValues so relabeling in refresh() is reflected - auto nvIt = this->configNamedValues.find(configVal); - const std::vector& liveNamedValues = (nvIt != this->configNamedValues.end()) - ? nvIt->second : std::vector(); - - if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - thresholdsCopy, - true, - labels, - liveNamedValues, - showDefaultValue - ); - } else { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - ValueThresholds(), - false, - labels, - liveNamedValues, - showDefaultValue - ); - } - + listItem->setClickListener([this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, + infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) { + if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { + tsl::changeTo(configName, infoStrings); return true; - }); + } + + if ((keys & HidNpadButton_A) == 0) + return false; + + std::uint32_t currentValue = this->configList->values[configVal]; + + // Look up live namedValues so relabeling in refresh() is reflected + auto nvIt = this->configNamedValues.find(configVal); + const std::vector &liveNamedValues = (nvIt != this->configNamedValues.end()) ? nvIt->second : std::vector(); + + if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + thresholdsCopy, true, labels, liveNamedValues, showDefaultValue); + } else { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + ValueThresholds(), false, labels, liveNamedValues, showDefaultValue); + } + + return true; + }); this->listElement->addItem(listItem); this->configButtons[configVal] = listItem; @@ -331,20 +312,12 @@ void MiscGui::addConfigButton(HocClkConfigValue configVal, this->configNamedValues[configVal] = namedValues; } -void MiscGui::addConfigButtonS(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels, - const std::vector& namedValues, - bool showDefaultValue, - const char* subText, - bool kip) -{ - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addConfigButtonS(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels, + const std::vector &namedValues, bool showDefaultValue, const char *subText, bool kip) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(""); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(""); if (!kip) listItem->setTextColor(tsl::Color(120, 235, 255, 255)); @@ -354,7 +327,7 @@ void MiscGui::addConfigButtonS(HocClkConfigValue configVal, snprintf(valueText, sizeof(valueText), "%s", VALUE_DEFAULT_TEXT); } else { bool foundNamedValue = false; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str()); foundNamedValue = true; @@ -377,79 +350,62 @@ void MiscGui::addConfigButtonS(HocClkConfigValue configVal, ValueThresholds thresholdsCopy = (thresholds ? *thresholds : ValueThresholds{}); - listItem->setClickListener( - [this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, - infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) - { - if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { - tsl::changeTo(configName, infoStrings); - return true; - } - - if ((keys & HidNpadButton_A) == 0) - return false; - - std::uint32_t currentValue = this->configList->values[configVal]; - - // Look up live namedValues so relabeling in refresh() is reflected - auto nvIt = this->configNamedValues.find(configVal); - const std::vector& liveNamedValues = (nvIt != this->configNamedValues.end()) - ? nvIt->second : std::vector(); - - if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - thresholdsCopy, - true, - labels, - liveNamedValues, - showDefaultValue - ); - } else { - - tsl::changeTo( - currentValue, - range, - categoryName, - [this, configVal, kip](std::uint32_t value) { - this->configList->values[configVal] = value; - Result rc = hocclkIpcSetConfigValues(this->configList); - if (R_FAILED(rc)) { - FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); - return false; - } - if (kip) { - shouldSaveKip = true; - } - this->lastContextUpdate = armGetSystemTick(); - return true; - }, - ValueThresholds(), - false, - labels, - liveNamedValues, - showDefaultValue - ); - } - + listItem->setClickListener([this, configVal, range, categoryName, thresholdsCopy, labels, showDefaultValue, kip, + infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) { + if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { + tsl::changeTo(configName, infoStrings); return true; - }); + } + + if ((keys & HidNpadButton_A) == 0) + return false; + + std::uint32_t currentValue = this->configList->values[configVal]; + + // Look up live namedValues so relabeling in refresh() is reflected + auto nvIt = this->configNamedValues.find(configVal); + const std::vector &liveNamedValues = (nvIt != this->configNamedValues.end()) ? nvIt->second : std::vector(); + + if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + thresholdsCopy, true, labels, liveNamedValues, showDefaultValue); + } else { + + tsl::changeTo( + currentValue, range, categoryName, + [this, configVal, kip](std::uint32_t value) { + this->configList->values[configVal] = value; + Result rc = hocclkIpcSetConfigValues(this->configList); + if (R_FAILED(rc)) { + FatalGui::openWithResultCode("hocclkIpcSetConfigValues", rc); + return false; + } + if (kip) { + shouldSaveKip = true; + } + this->lastContextUpdate = armGetSystemTick(); + return true; + }, + ValueThresholds(), false, labels, liveNamedValues, showDefaultValue); + } + + return true; + }); this->listElement->addItem(listItem); this->configButtons[configVal] = listItem; @@ -461,21 +417,17 @@ void MiscGui::addConfigButtonS(HocClkConfigValue configVal, } void MiscGui::updateConfigToggles() { - for (const auto& [value, toggle] : this->configToggles) { + for (const auto &[value, toggle] : this->configToggles) { if (toggle != nullptr) toggle->setState(this->configList->values[value]); } } -void MiscGui::addFreqButton(HocClkConfigValue configVal, - const char* altName, - HocClkModule module, - const std::map& labels) -{ - const char* configName = altName ? altName : hocclkFormatConfigValue(configVal, true); +void MiscGui::addFreqButton(HocClkConfigValue configVal, const char *altName, HocClkModule module, const std::map &labels) { + const char *configName = altName ? altName : hocclkFormatConfigValue(configVal, true); auto infoStrings = ConfigInfoStrings(configVal, IsMariko(), IsHoag()); - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(configName); + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(configName); uint64_t currentMHz = this->configList->values[configVal]; char valueText[32]; @@ -483,9 +435,7 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, listItem->setValue(valueText); listItem->setClickListener( - [this, configVal, module, labels, - infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) - { + [this, configVal, module, labels, infoStrings = std::move(infoStrings), configName = std::string(configName)](u64 keys) { if (!infoStrings.empty() && (keys & HidNpadButton_Y) && !(keys & ~HidNpadButton_Y)) { tsl::changeTo(configName, infoStrings); return true; @@ -506,12 +456,8 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, std::uint32_t currentHz = this->configList->values[configVal] * 1'000'000; tsl::changeTo( - currentHz, - hzList, - hzCount, - module, - [this, configVal](std::uint32_t hz) - { + currentHz, hzList, hzCount, module, + [this, configVal](std::uint32_t hz) { uint64_t mhz = hz / 1'000'000; this->configList->values[configVal] = mhz; @@ -524,9 +470,7 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, this->lastContextUpdate = armGetSystemTick(); return true; }, - false, - labels - ); + false, labels); return true; }); @@ -537,8 +481,7 @@ void MiscGui::addFreqButton(HocClkConfigValue configVal, this->configRanges[configVal] = ValueRange(0, 0, 0, "MHz", 1); } -void MiscGui::listUI() -{ +void MiscGui::listUI() { Result rc = hocclkIpcGetConfigValues(configList); if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); @@ -548,19 +491,18 @@ void MiscGui::listUI() ValueThresholds thresholdsDisabled(0, 0); std::vector noNamedValues = {}; - this->listElement->addItem(new tsl::elm::CategoryHeader("Settings")); + this->listElement->addItem(new CompactCategoryHeader("Settings")); - tsl::elm::CustomDrawer* rebootSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *rebootSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Settings marked in blue", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("don't require a reboot to apply!", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("You can also press \ue0e3 to show", false, x + 20, y + 70, 18, tsl::style::color::ColorText); renderer->drawString("information about each setting.", false, x + 20, y + 90, 18, tsl::style::color::ColorText); - }); rebootSetWarning->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); this->listElement->addItem(rebootSetWarning); - tsl::elm::ListItem* sysmoduleSettingsSubMenu = new tsl::elm::ListItem("General Settings"); + tsl::elm::ListItem *sysmoduleSettingsSubMenu = new tsl::elm::ListItem("General Settings"); sysmoduleSettingsSubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -571,7 +513,7 @@ void MiscGui::listUI() sysmoduleSettingsSubMenu->setValue(R_ARROW); this->listElement->addItem(sysmoduleSettingsSubMenu); - tsl::elm::ListItem* governorSettingsSubMenu = new tsl::elm::ListItem("Governor Settings"); + tsl::elm::ListItem *governorSettingsSubMenu = new tsl::elm::ListItem("Governor Settings"); governorSettingsSubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -582,7 +524,7 @@ void MiscGui::listUI() governorSettingsSubMenu->setValue(R_ARROW); this->listElement->addItem(governorSettingsSubMenu); - tsl::elm::ListItem* safetySubmenu = new tsl::elm::ListItem("Safety Settings"); + tsl::elm::ListItem *safetySubmenu = new tsl::elm::ListItem("Safety Settings"); safetySubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -593,7 +535,7 @@ void MiscGui::listUI() safetySubmenu->setValue(R_ARROW); this->listElement->addItem(safetySubmenu); - tsl::elm::ListItem* ramSubmenu = new tsl::elm::ListItem("RAM Settings"); + tsl::elm::ListItem *ramSubmenu = new tsl::elm::ListItem("RAM Settings"); ramSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -604,7 +546,7 @@ void MiscGui::listUI() ramSubmenu->setValue(R_ARROW); this->listElement->addItem(ramSubmenu); - tsl::elm::ListItem* cpuSubmenu = new tsl::elm::ListItem("CPU Settings"); + tsl::elm::ListItem *cpuSubmenu = new tsl::elm::ListItem("CPU Settings"); cpuSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -615,7 +557,7 @@ void MiscGui::listUI() cpuSubmenu->setValue(R_ARROW); this->listElement->addItem(cpuSubmenu); - tsl::elm::ListItem* gpuSubmenu = new tsl::elm::ListItem("GPU Settings"); + tsl::elm::ListItem *gpuSubmenu = new tsl::elm::ListItem("GPU Settings"); gpuSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -626,7 +568,7 @@ void MiscGui::listUI() gpuSubmenu->setValue(R_ARROW); this->listElement->addItem(gpuSubmenu); - tsl::elm::ListItem* displaySubMenu = new tsl::elm::ListItem("Display Settings"); + tsl::elm::ListItem *displaySubMenu = new tsl::elm::ListItem("Display Settings"); displaySubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -637,8 +579,8 @@ void MiscGui::listUI() displaySubMenu->setValue(R_ARROW); this->listElement->addItem(displaySubMenu); - if(this->configList->values[HocClkConfigValue_EnableExperimentalSettings]) { - tsl::elm::ListItem* experimentalSubMenu = new tsl::elm::ListItem("Experimental Settings"); + if (this->configList->values[HocClkConfigValue_EnableExperimentalSettings]) { + tsl::elm::ListItem *experimentalSubMenu = new tsl::elm::ListItem("Experimental Settings"); experimentalSubMenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -649,18 +591,21 @@ void MiscGui::listUI() experimentalSubMenu->setValue(R_ARROW); this->listElement->addItem(experimentalSubMenu); } - } class GeneralSettingsSubMenuGui : public MiscGui { -public: - GeneralSettingsSubMenuGui() { } + public: + GeneralSettingsSubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("General Settings")); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("General Settings")); ValueThresholds thresholdsDisabled(0, 0); std::vector ramVoltDispModes = { @@ -668,8 +613,9 @@ protected: NamedValue("VDDQ", RamDisplayMode_VDDQ), }; - if(IsMariko()) { - addConfigButton(HocClkConfigValue_RAMVoltDisplayMode, "RAM Voltage Display Mode", ValueRange(0, 12, 1, "", 0), "RAM Voltage Display Mode", &thresholdsDisabled, {}, ramVoltDispModes, false); + if (IsMariko()) { + addConfigButton(HocClkConfigValue_RAMVoltDisplayMode, "RAM Voltage Display Mode", ValueRange(0, 12, 1, "", 0), "RAM Voltage Display Mode", + &thresholdsDisabled, {}, ramVoltDispModes, false); } std::vector RamDisplayUnitValues = { @@ -677,30 +623,15 @@ protected: NamedValue("MT/s", RamDisplayUnit_MTs), NamedValue("MHz and MT/s", RamDisplayUnit_MHzMTs), }; - addConfigButton( - HocClkConfigValue_RamDisplayUnit, - "RAM Display Unit", - ValueRange(0, 0, 2, "", 0), - "RAM Display Unit", - &thresholdsDisabled, - {}, - RamDisplayUnitValues, - false + addConfigButton(HocClkConfigValue_RamDisplayUnit, "RAM Display Unit", ValueRange(0, 0, 2, "", 0), "RAM Display Unit", &thresholdsDisabled, {}, + RamDisplayUnitValues, false ); - - addConfigButton( - HocClkConfigValue_PollingIntervalMs, - "Polling Interval", - ValueRange(50, 1000, 50, "ms", 1), - "Polling Interval", - &thresholdsDisabled, - {}, - {}, - false - ); - tsl::elm::CustomDrawer* exSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + addConfigButton(HocClkConfigValue_PollingIntervalMs, "Polling Interval", ValueRange(50, 1000, 50, "ms", 1), "Polling Interval", + &thresholdsDisabled, {}, {}, false); + + tsl::elm::CustomDrawer *exSetWarning = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Experimental Settings are incomplete ", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("and may not work correctly or at all!", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("Here be dragons!", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -713,112 +644,100 @@ protected: }; class ExperimentalSettingsSubMenuGui : public MiscGui { -public: - ExperimentalSettingsSubMenuGui() { } + public: + ExperimentalSettingsSubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental Settings")); - ValueThresholds thresholdsDisabled(0, 0); - if(IsMariko()) { - addConfigToggle(HocClkConfigValue_MarikoMiddleFreqs, nullptr, true); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("Experimental Settings")); + ValueThresholds thresholdsDisabled(0, 0); + if (IsMariko()) { + addConfigToggle(HocClkConfigValue_MarikoMiddleFreqs, nullptr, true); + addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); } - addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); std::vector gpuSchedMethodValues = { NamedValue("INI", GpuSchedulingOverrideMethod_Ini), NamedValue("NV Service", GpuSchedulingOverrideMethod_NvService), }; - addConfigButton( - HocClkConfigValue_GPUSchedulingMethod, - "GPU Scheduling Override Method", - ValueRange(0, 0, 1, "", 0), - "GPU Scheduling Override Method", - &thresholdsDisabled, - {}, - gpuSchedMethodValues, - false - ); + addConfigButton(HocClkConfigValue_GPUSchedulingMethod, "GPU Scheduling Override Method", ValueRange(0, 0, 1, "", 0), + "GPU Scheduling Override Method", &thresholdsDisabled, {}, gpuSchedMethodValues, false); + addConfigButton(KipConfigValue_marikoGpuBootVolt, "GPU Boot Volt", ValueRange(700, 800, 5, "mV", 1), "GPU Boot Voltage", &thresholdsDisabled, + {}, {}, false, true); std::vector ramRFMeasurementMethods = { NamedValue("PLL", MemoryFrequencyMeasurementMode_PLL), NamedValue("Actmon", MemoryFrequencyMeasurementMode_Actmon), }; - addConfigButton( - HocClkConfigValue_MemoryFrequencyMeasurementMode, - "Memory Frequency Measurement Mode", - ValueRange(0, 0, 1, "", 0), - "Memory Frequency Measurement Mode", - &thresholdsDisabled, - {}, - ramRFMeasurementMethods, - false - ); + addConfigButton(HocClkConfigValue_MemoryFrequencyMeasurementMode, "Memory Frequency Measurement Mode", ValueRange(0, 0, 1, "", 0), + "Memory Frequency Measurement Mode", &thresholdsDisabled, {}, ramRFMeasurementMethods, false); - tsl::elm::CustomDrawer* chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *chargeWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Overriding the charge current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("can be dangerous and may cause", false, x + 20, y + 50, 18, tsl::style::color::ColorText); - renderer->drawString("damage to your battery or charger!", false, x + 20, y + 70, 18, tsl::style::color::ColorText); + renderer->drawString("damage to your battery or orcodeus!", false, x + 20, y + 70, 18, tsl::style::color::ColorText); }); chargeWarningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 90); this->listElement->addItem(chargeWarningText); - if(!IsHoag()) { - std::vector chargerCurrents = { - NamedValue("Disabled", 0), - NamedValue("1024mA", 1024), - NamedValue("1280mA", 1280), - NamedValue("1536mA", 1536), - NamedValue("1792mA", 1792), - NamedValue("2048mA", 2048), - NamedValue("2304mA", 2304), - NamedValue("2560mA", 2560), - NamedValue("2816mA", 2816), - NamedValue("3072mA", 3072), - }; + if (!IsHoag()) { + std::vector chargerCurrents = { + NamedValue("Disabled", 0), NamedValue("1024mA", 1024), NamedValue("1280mA", 1280), NamedValue("1536mA", 1536), + NamedValue("1792mA", 1792), NamedValue("2048mA", 2048), NamedValue("2304mA", 2304), NamedValue("2560mA", 2560), + NamedValue("2816mA", 2816), NamedValue("3072mA", 3072), + }; - ValueThresholds chargerThresholds(2048, 2049); + ValueThresholds chargerThresholds(2048, 2049); - addConfigButton( - HocClkConfigValue_BatteryChargeCurrent, - "Charge Current Override", - ValueRange(0, 0, 1, "", 0), - "Charge Current Override", - &chargerThresholds, - {}, - chargerCurrents, - false - ); + addConfigButton(HocClkConfigValue_BatteryChargeCurrent, "Charge Current Override", ValueRange(0, 0, 1, "", 0), "Charge Current Override", + &chargerThresholds, {}, chargerCurrents, false); } else { std::vector chargerCurrents = { - NamedValue("Disabled", 0), - NamedValue("1024mA", 1024), - NamedValue("1280mA", 1280), - NamedValue("1536mA", 1536), - NamedValue("1664mA", 1664), // Why Nintendo? - NamedValue("1792mA", 1792), - NamedValue("2048mA", 2048), - NamedValue("2304mA", 2304), - NamedValue("2560mA", 2560), + NamedValue("Disabled", 0), NamedValue("1024mA", 1024), NamedValue("1280mA", 1280), NamedValue("1536mA", 1536), + NamedValue("1664mA", 1664), // Why Nintendo? + NamedValue("1792mA", 1792), NamedValue("2048mA", 2048), NamedValue("2304mA", 2304), NamedValue("2560mA", 2560), }; ValueThresholds chargerThresholds(1664, 1793); - addConfigButton( - HocClkConfigValue_BatteryChargeCurrent, - "Charge Current Override", - ValueRange(0, 0, 1, "", 0), - "Charge Current Override", - &chargerThresholds, - {}, - chargerCurrents, - false - ); - + addConfigButton(HocClkConfigValue_BatteryChargeCurrent, "Charge Current Override", ValueRange(0, 0, 1, "", 0), "Charge Current Override", + &chargerThresholds, {}, chargerCurrents, false); } - if(IsAula()) { + + tsl::elm::CustomDrawer *inputLimitWarningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + renderer->drawString("\uE150 Overriding the input current", false, x + 20, y + 30, 18, tsl::style::color::ColorText); + renderer->drawString("limit increases power draw from", false, x + 20, y + 50, 18, tsl::style::color::ColorText); + renderer->drawString("your charger. Use only with the", false, x + 20, y + 70, 18, tsl::style::color::ColorText); + renderer->drawString("official Nintendo charger!", false, x + 20, y + 90, 18, tsl::style::color::ColorText); + }); + inputLimitWarningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); + this->listElement->addItem(inputLimitWarningText); + + // having an option for hoag would be cool and disabling 100-500 and 2000+ + std::vector inputCurrentLimits = { + NamedValue("Disabled", 0), + NamedValue("100mA", 100), + NamedValue("150mA", 150), + NamedValue("500mA", 500), + NamedValue("900mA", 900, "Hoag Default"), + NamedValue("1200mA", 1200, "Default"), + NamedValue("1500mA", 1500), + NamedValue("2000mA", 2000), + NamedValue("3000mA", 3000), + }; + + ValueThresholds inputLimitThresholds(2000, 2001); + + addConfigButton(HocClkConfigValue_InputCurrentLimit, "Input Current Limit Override", ValueRange(0, 0, 1, "", 0), + "Input Current Limit Override", &inputLimitThresholds, {}, inputCurrentLimits, false); + + if (IsAula()) { std::vector displayClrPreset = { NamedValue("Do Not Override", AulaDisplayColorMode_DoNotOverride), NamedValue("Basic", AulaDisplayColorMode_Basic), @@ -832,75 +751,59 @@ protected: NamedValue("Vivid", AulaDisplayColorMode_Night3, "Night"), }; - addConfigButton( - HocClkConfigValue_AulaDisplayColorPreset, - "Display Color Preset", - ValueRange(0, 1, 1, "", 0), - "Display Color Preset", - &thresholdsDisabled, - {}, - displayClrPreset, - false, - false - ); + addConfigButton(HocClkConfigValue_AulaDisplayColorPreset, "Display Color Preset", ValueRange(0, 1, 1, "", 0), "Display Color Preset", + &thresholdsDisabled, {}, displayClrPreset, false, false); } } }; - class GovernorSettingsSubMenuGui : public MiscGui { -public: - GovernorSettingsSubMenuGui() { } + public: + GovernorSettingsSubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("Governor Settings")); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("Governor Settings")); ValueThresholds thresholdsDisabled(0, 0); std::vector GovernorMinHz = { - NamedValue("510 MHz", 510000000), - NamedValue("612 MHz", 612000000), - NamedValue("714 MHz", 714000000), - NamedValue("816 MHz", 816000000), - NamedValue("918 MHz", 918000000), - NamedValue("1020 MHz", 1020000000), + NamedValue("510 MHz", 510000000), NamedValue("612 MHz", 612000000), NamedValue("714 MHz", 714000000), + NamedValue("816 MHz", 816000000), NamedValue("918 MHz", 918000000), NamedValue("1020 MHz", 1020000000), }; - addConfigButton( - HocClkConfigValue_CpuGovernorMinimumFreq, - "CPU Governor Minimum Frequency", - ValueRange(0, 0, 1, "", 0), - "CPU Governor Minimum Frequency", - &thresholdsDisabled, - {}, - GovernorMinHz, - false - ); - + addConfigButton(HocClkConfigValue_CpuGovernorMinimumFreq, "CPU Governor Minimum Frequency", ValueRange(0, 0, 1, "", 0), + "CPU Governor Minimum Frequency", &thresholdsDisabled, {}, GovernorMinHz, false); } }; - class DisplaySubMenuGui : public MiscGui { -public: - DisplaySubMenuGui() { } + public: + DisplaySubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } ValueThresholds thresholdsDisabled(0, 0); - BaseMenuGui::refresh(); // get latest context - if(!this->context) + BaseMenuGui::refresh(); // get latest context + if (!this->context) return; - this->listElement->addItem(new tsl::elm::CategoryHeader("Display Settings")); + this->listElement->addItem(new CompactCategoryHeader("Display Settings")); addConfigToggle(HocClkConfigValue_OverwriteRefreshRate, nullptr); - if(!this->context->isUsingRetroSuper) { - tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + if (!this->context->isUsingRetroSuper) { + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Usage of unsafe display", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("refresh rates may cause stress", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("or damage to your display! ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -910,19 +813,11 @@ protected: warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); this->listElement->addItem(warningText); ValueThresholds displayThresholds(60, 65); - addConfigButton( - HocClkConfigValue_MaxDisplayClockH, - "Max Handheld Display Hz", - ValueRange(60, IsAula() ? 65 : 75, 1, " Hz", 1), - "Display Clock", - &displayThresholds, - {}, - {}, - false - ); + addConfigButton(HocClkConfigValue_MaxDisplayClockH, "Max Handheld Display Hz", ValueRange(60, IsAula() ? 65 : 75, 1, " Hz", 1), + "Display Clock", &displayThresholds, {}, {}, false); } - if(!IsAula()) { - tsl::elm::CustomDrawer* warningTextDV = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + if (!IsAula()) { + tsl::elm::CustomDrawer *warningTextDV = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Adjust the display voltage", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("with caution to avoid damage", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("to your display panel! ", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -930,102 +825,69 @@ protected: }); warningTextDV->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110); this->listElement->addItem(warningTextDV); - addConfigButton( - HocClkConfigValue_DisplayVoltage, - "Display Voltage", - ValueRange(800, 1200, 25, " mV", 1), - "Display Voltage", - &thresholdsDisabled, - {}, - {}, - false - ); + addConfigButton(HocClkConfigValue_DisplayVoltage, "Display Voltage", ValueRange(800, 1200, 25, " mV", 1), "Display Voltage", + &thresholdsDisabled, {}, {}, false); } } }; class SafetySubMenuGui : public MiscGui { -public: - SafetySubMenuGui() { } + public: + SafetySubMenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("Safety Settings")); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("Safety Settings")); addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr); addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr); - addConfigToggle(HocClkConfigValue_HandheldTDP, nullptr); - #if IS_MINIMAL == 0 - std::map labels_pwr_l = { - {6400, "Official Rating"} - }; - - if(IsHoag()) { - ValueThresholds tdpThresholdsLite(6400, 7500); - addConfigButton( - HocClkConfigValue_LiteTDPLimit, - "TDP Threshold", - ValueRange(4000, 8000, 100, "mW", 1), - "Power", - &tdpThresholdsLite, - labels_pwr_l - ); - } else { - ValueThresholds tdpThresholds(9600, 11000); - addConfigButton( - HocClkConfigValue_HandheldTDPLimit, - "TDP Threshold", - ValueRange(8000, 12000, 100, "mW", 1), - "Power", - &tdpThresholds - ); - } - - ValueThresholds throttleThresholds(70, 80); - addConfigButton( - HocClkConfigValue_ThermalThrottleThreshold, - "Thermal Throttle Limit", - ValueRange(50, 85, 1, "°C", 1), - "Temp", - &throttleThresholds - ); - #endif +#if IS_MINIMAL == 0 + ValueThresholds throttleThresholds(70, 80); + addConfigButton(HocClkConfigValue_ThermalThrottleThreshold, "Thermal Throttle Limit", ValueRange(50, 85, 1, "°C", 1), "Temp", + &throttleThresholds); +#endif } }; class RamSubmenuGui : public MiscGui { -public: - RamSubmenuGui() { } + public: + RamSubmenuGui() { + } -protected: + protected: void listUI() override { BaseMenuGui::refresh(); - if(!this->context) + if (!this->context) return; Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } ValueThresholds thresholdsDisabled(0, 0); std::vector noNamedValues = {}; + this->listElement->addItem(new CompactCategoryHeader("RAM Settings")); - - this->listElement->addItem(new tsl::elm::CategoryHeader("RAM Settings")); - addMappedConfigTrackbar(KipConfigValue_emcDvbShift, "DVB Shift", - {0xFFFFFFFCu, 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u}, - {"-4", "-3", "-2", "-1", " 0", "1", "2", "3", "4", "5", "6", "7", "8"}); + { 0xFFFFFFFCu, 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u }, + { "-4", "-3", "-2", "-1", " 0", "1", "2", "3", "4", "5", "6", "7", "8" }); - if(IsMariko()) { + if (IsMariko()) { u32 socSpeedo = this->context->speedos[HocClkSpeedo_SOC]; std::string autoText = "1000 mV"; if (socSpeedo <= 1597) { autoText = "1050 mV"; } else if (socSpeedo <= 1708) { autoText = "1025 mV"; - } else if(socSpeedo >= 1709) { + } else if (socSpeedo >= 1709) { autoText = "1000 mV"; } @@ -1043,83 +905,84 @@ protected: }; ValueThresholds marikovmaxT(1075, 1150); - addConfigButton( - KipConfigValue_marikoSocVmax, - "SoC Max Volt", - ValueRange(0, 12, 1, "", 0), - "SoC Max Volt", - &marikovmaxT, - {}, - marikovmaxconf, - false, - true - ); + addConfigButton(KipConfigValue_marikoSocVmax, "SoC Max Volt", ValueRange(0, 12, 1, "", 0), "SoC Max Volt", &marikovmaxT, {}, + marikovmaxconf, false, true); } - + addConfigToggle(KipConfigValue_hpMode, "HP Mode", true); std::map emc_voltage_label = { - {1100000, "Default (Mariko)"}, - {1125000, "Default (Erista)"}, - {1175000, "Rating"}, - {1212500, "Safe Max (Mariko)"}, - {1237500, "Safe Max (Erista)"}, - {1250000, "Unsafe Max"}, + { 1100000, "Default (Mariko)" }, { 1125000, "Default (Erista)" }, { 1175000, "Rating" }, + { 1212500, "Safe Max (Mariko)" }, { 1237500, "Safe Max (Erista)" }, { 1250000, "Unsafe Max" }, }; ValueThresholds vdd2Thresholds(IsMariko() ? 1212500 : 1237500, IsMariko() ? 1250000 : 1275000); - addConfigButton( - KipConfigValue_commonEmcMemVolt, - "RAM VDD2 Voltage", - ValueRange(912500, 1350000, 12500, "mV", 1000, 1), - "Voltage", - &vdd2Thresholds, - emc_voltage_label, - noNamedValues, - false, - true - ); + addConfigButton(KipConfigValue_commonEmcMemVolt, "RAM VDD2 Voltage", ValueRange(912500, 1350000, 12500, "mV", 1000, 1), "Voltage", + &vdd2Thresholds, emc_voltage_label, noNamedValues, false, true); - if(IsMariko()) { + if (IsMariko()) { ValueThresholds vddqThresholds(675000, 725000); - addConfigButton( - KipConfigValue_marikoEmcVddqVolt, - "RAM VDDQ Voltage", - ValueRange(400000, 750000, 5000, "mV", 1000), - "RAM VDDQ Voltage", - &vddqThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoEmcVddqVolt, "RAM VDDQ Voltage", ValueRange(400000, 750000, 5000, "mV", 1000), "RAM VDDQ Voltage", + &vddqThresholds, {}, {}, false, true); } if (IsMariko()) { std::vector stepMode = { NamedValue("66MHz", 0), NamedValue("100MHz", 1), - NamedValue("133MHz", 3), // Mantain compatability + NamedValue("133MHz", 3), // Mantain compatability NamedValue("JEDEC.", 2), }; - addConfigButton(KipConfigValue_stepMode, "Step Mode", ValueRange(0, 0, 2, "", 0), "Step Mode", &thresholdsDisabled, {}, stepMode, false, true); + addConfigButton(KipConfigValue_stepMode, "Step Mode", ValueRange(0, 0, 2, "", 0), "Step Mode", &thresholdsDisabled, {}, stepMode, false, + true); } + std::vector emcMaxClock = {}; + RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; + if (IsErista()) { - tsl::elm::ListItem* freqSubmenu = new tsl::elm::ListItem("RAM Frequency Editor"); - freqSubmenu->setClickListener([](u64 keys) { - if (keys & HidNpadButton_A) { - tsl::changeTo(); - return true; - } - return false; - }); - freqSubmenu->setValue(R_ARROW); - this->listElement->addItem(freqSubmenu); + emcMaxClock = { + NamedValue("Disabled", 1600000), + NamedValue("1633 MHz", 1633000), + NamedValue("1666 MHz", 1666000), + NamedValue("1700 MHz", 1700000), + NamedValue("1733 MHz", 1733000), + // NamedValue("1766 MHz", 1766000), + NamedValue("1800 MHz", 1800000), + NamedValue("1833 MHz", 1833000), + NamedValue("1862 MHz", 1862400, "JEDEC."), + NamedValue("1881 MHz", 1881600), + NamedValue("1900 MHz", 1900800), + NamedValue("1920 MHz", 1920000), + NamedValue("1939 MHz", 1939200), + NamedValue("1958 MHz", 1958400), + NamedValue("1977 MHz", 1977600), + NamedValue("1996 MHz", 1996800, "JEDEC."), + NamedValue("2016 MHz", 2016000), + NamedValue("2035 MHz", 2035200), + NamedValue("2054 MHz", 2054400), + NamedValue("2073 MHz", 2073600), + NamedValue("2092 MHz", 2092800), + NamedValue("2112 MHz", 2112000), + NamedValue("2131 MHz", 2131200, "JEDEC."), + NamedValue("2150 MHz", 2150400), + NamedValue("2169 MHz", 2169600), + NamedValue("2188 MHz", 2188800), + NamedValue("2208 MHz", 2208000), + NamedValue("2227 MHz", 2227200), + NamedValue("2246 MHz", 2246400), + NamedValue("2265 MHz", 2265600), + NamedValue("2284 MHz", 2284800), + NamedValue("2304 MHz", 2304000), + NamedValue("2323 MHz", 2323200), + NamedValue("2342 MHz", 2342400), + NamedValue("2361 MHz", 2361600), + NamedValue("2380 MHz", 2380800), + NamedValue("2400 MHz", 2400000, "JEDEC."), + }; } else { - RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; - std::vector marikoMaxEmcClock = { + emcMaxClock = { NamedValue("1600 MHz", 1600000), NamedValue("1633 MHz", 1633000), NamedValue("1666 MHz", 1666000), @@ -1173,21 +1036,24 @@ protected: NamedValue("3233 MHz", 3233000, "High speedo needed!"), NamedValue("3266 MHz", 3266000, "High speedo needed!"), NamedValue("3300 MHz", 3300000, "High speedo needed!"), - // NamedValue("3333MHz (Needs extreme Speedo/PLL)", 3333000), - // NamedValue("3366MHz (Needs extreme Speedo/PLL)", 3366000), - // NamedValue("3400MHz (Needs extreme Speedo/PLL)", 3400000), - // NamedValue("3433MHz (Needs ridiculous Speedo/PLL)", 3433000), - // NamedValue("3466MHz (Needs ridiculous Speedo/PLL)", 3466000), - // NamedValue("3500MHz (Needs ridiculous Speedo/PLL)", 3500000), }; - for (auto& nv : marikoMaxEmcClock) - nv.name = formatMemClockKhzLabel(nv.value, unit); - - addConfigButton(KipConfigValue_marikoEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, marikoMaxEmcClock, false, true); } + for (auto &nv : emcMaxClock) { + if (nv.name != "Disabled") { + nv.name = formatMemClockKhzLabel(nv.value, unit); + } + } - tsl::elm::ListItem* latenciesSubmenu = new tsl::elm::ListItem("RAM Latency Editor"); + if (IsMariko()) { + addConfigButton(KipConfigValue_marikoEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, + emcMaxClock, false, true); + } else { + addConfigButton(KipConfigValue_eristaEmcMaxClock, "Ram Max Clock", ValueRange(0, 1, 1, "", 1), "Ram Max Clock", &thresholdsDisabled, {}, + emcMaxClock, false, true); + } + + tsl::elm::ListItem *latenciesSubmenu = new tsl::elm::ListItem("RAM Latency Editor"); latenciesSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -1198,7 +1064,7 @@ protected: latenciesSubmenu->setValue(R_ARROW); this->listElement->addItem(latenciesSubmenu); - tsl::elm::ListItem* timingsSubmenu = new tsl::elm::ListItem("RAM Timing Reductions"); + tsl::elm::ListItem *timingsSubmenu = new tsl::elm::ListItem("RAM Timing Reductions"); timingsSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -1208,32 +1074,35 @@ protected: }); timingsSubmenu->setValue(R_ARROW); this->listElement->addItem(timingsSubmenu); - } }; class RamTimingsSubmenuGui : public MiscGui { -public: - RamTimingsSubmenuGui() { } + public: + RamTimingsSubmenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("Memory Timings")); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("Memory Timings")); - addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); - addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); - addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); - addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); - addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t8_tREFI, "t8 tREFI", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); + addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); + addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); + addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_t8_tREFI, "t8 tREFI", ValueRange(0, 6, 1)); /* Yes this is duplicated code, yes I don't care. */ std::vector timingTbreakFreqs = { - NamedValue("Disabled", 0), + NamedValue("Disabled", 0), NamedValue("1633 MHz", 1633000), NamedValue("1666 MHz", 1666000), NamedValue("1700 MHz", 1700000), @@ -1301,35 +1170,176 @@ protected: } ValueThresholds thresholdsDisabled(0, 0); - this->listElement->addItem(new tsl::elm::CategoryHeader("Advanced")); - if(IsMariko()) { - addConfigButton(KipConfigValue_timingEmcTbreak, "RAM-Timing tBreak", ValueRange(0, 1, 1, "", 1), "tBreak", &thresholdsDisabled, {}, timingTbreakFreqs, false, true); - addConfigTrackbar(KipConfigValue_low_t6_tRTW, "Low t6 tRTW", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_low_t7_tWTR, "Low t7 tWTR", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t2_tRP_cap, "1333WL t2 RP Cap", ValueRange(0, 8, 1)); + this->listElement->addItem(new CompactCategoryHeader("Advanced")); + if (IsMariko()) { + // tBreak / low-high timing graph (live, reads config each frame) + { + HocClkConfigValueList *cfgPtr = this->configList; + auto *tbreakGraph = new tsl::elm::CustomDrawer([cfgPtr](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + const s32 t6 = (s32)cfgPtr->values[KipConfigValue_t6_tRTW]; + const s32 t7 = (s32)cfgPtr->values[KipConfigValue_t7_tWTR]; + const s32 lt6 = (s32)cfgPtr->values[KipConfigValue_low_t6_tRTW]; + const s32 lt7 = (s32)cfgPtr->values[KipConfigValue_low_t7_tWTR]; + const s32 t2c = (s32)cfgPtr->values[KipConfigValue_t2_tRP_cap]; + const uint32_t tbk = (uint32_t)cfgPtr->values[KipConfigValue_timingEmcTbreak]; + + const tsl::Color cT6 = tsl::Color(4, 14, 15, 15); + const tsl::Color cT7 = tsl::Color(15, 9, 2, 15); + const tsl::Color cT2 = tsl::Color(12, 4, 15, 15); + const tsl::Color cAxis = tsl::Color(5, 5, 5, 15); + const tsl::Color cTbk = tsl::Color(7, 7, 7, 10); + + const s32 gx = x + 52; + const s32 gw = w - 64; + const s32 gy = y + 14; + const s32 gh = 72; + const s32 axisY = gy + gh; + + // Y: value 0 = bottom, value 9 = top + auto valY = [&](s32 v) -> s32 { return axisY - v * gh / 9; }; + + constexpr uint32_t kRMin = 1600000u, kRMax = 3300000u; + auto freqX = [&](uint32_t kHz) -> s32 { + if (kHz <= kRMin) + return gx; + if (kHz >= kRMax) + return gx + gw; + return gx + (s32)((uint64_t)(kHz - kRMin) * (uint32_t)gw / (kRMax - kRMin)); + }; + + // Y-axis guide lines at 0, 3, 6, 9 + for (int v : { 0, 3, 6, 9 }) { + char buf[4]; + snprintf(buf, sizeof(buf), "%d", v); + renderer->drawString(buf, false, x + 4, valY(v) + 5, 12, cAxis); + renderer->drawRect(gx, valY(v), gw, 1, tsl::Color(3, 3, 3, 15)); + } + renderer->drawRect(gx, gy, 1, gh + 1, cAxis); + renderer->drawRect(gx, axisY, gw, 1, cAxis); + + // tBreak vertical divider + if (tbk != 0) { + s32 tx = freqX(tbk); + renderer->drawRect(tx, gy, 1, gh, cTbk); + } + + // Step line: lowVal below tBreak, hiVal at/above tBreak + auto drawTimingLine = [&](s32 lowVal, s32 hiVal, const tsl::Color &c) { + if (tbk == 0 || tbk <= kRMin) { + s32 yy = valY(hiVal) + 1; + renderer->drawRect(gx, yy, gw, 2, c); + renderer->drawCircle(gx, yy + 1, 3, true, c); + renderer->drawCircle(gx + gw - 1, yy + 1, 3, true, c); + } else { + s32 tx = freqX(tbk); + s32 yLow = valY(lowVal) + 1; + s32 yHi = valY(hiVal) + 1; + renderer->drawRect(gx, yLow, tx - gx, 2, c); + renderer->drawRect(tx, yHi, gx + gw - tx, 2, c); + if (yLow != yHi) { + s32 topY = yLow < yHi ? yLow : yHi; + s32 botY = yLow > yHi ? yLow : yHi; + renderer->drawRect(tx, topY, 2, botY - topY + 2, c); + } + renderer->drawCircle(gx, yLow + 1, 3, true, c); + renderer->drawCircle(tx, yLow + 1, 3, true, c); + renderer->drawCircle(tx, yHi + 1, 3, true, c); + renderer->drawCircle(gx + gw - 1, yHi + 1, 3, true, c); + } + }; + + drawTimingLine(lt6, t6, cT6); + drawTimingLine(lt7, t7, cT7); + + // t2 tRP cap: constant line + s32 yT2 = valY(t2c) + 1; + renderer->drawRect(gx, yT2, gw, 2, cT2); + renderer->drawCircle(gx, yT2 + 1, 3, true, cT2); + renderer->drawCircle(gx + gw - 1, yT2 + 1, 3, true, cT2); + + // X-axis ruler with sideways bitmap-font labels + static const uint8_t kDigBmp[10][5] = { + { 7, 5, 5, 5, 7 }, { 6, 2, 2, 2, 7 }, { 7, 1, 7, 4, 7 }, { 7, 1, 3, 1, 7 }, { 5, 5, 7, 1, 1 }, + { 7, 4, 7, 1, 7 }, { 7, 4, 7, 5, 7 }, { 7, 1, 1, 2, 2 }, { 7, 5, 7, 5, 7 }, { 7, 5, 7, 1, 7 }, + }; + const s32 pix = 2, charH = 3 * pix, charW = 5 * pix, charGap = 1; + auto drawSidewaysMHz = [&](uint32_t mhz, s32 cx, s32 startY, const tsl::Color &c) { + char buf[8]; + snprintf(buf, sizeof(buf), "%u", mhz); + s32 ox = cx - charW / 2; + for (int ci = 0; buf[ci]; ci++) { + int d = buf[ci] - '0'; + if (d < 0 || d > 9) + continue; + s32 cy = startY + ci * (charH + charGap); + for (int r = 0; r < 5; r++) + for (int col = 0; col < 3; col++) + if ((kDigBmp[d][r] >> (2 - col)) & 1) + renderer->drawRect(ox + (4 - r) * pix, cy + col * pix, pix, pix, c); + } + }; + static const uint32_t kRulerMHz[] = { + 1600, 1733, 1866, 2000, 2133, 2266, 2400, 2533, 2666, 2800, 2933, 3066, 3200, 3300, + }; + for (uint32_t mhz : kRulerMHz) { + s32 fx = freqX(mhz * 1000u); + renderer->drawRect(fx, axisY, 1, 4, cAxis); + drawSidewaysMHz(mhz, fx, axisY + 6, cAxis); + } + + // Legend + s32 ly = y + h - 14; + renderer->drawRect(gx, ly, 14, 3, cT6); + renderer->drawString("t6 tRTW", false, gx + 17, ly + 5, 12, cT6); + renderer->drawRect(gx + 80, ly, 14, 3, cT7); + renderer->drawString("t7 tWTR", false, gx + 97, ly + 5, 12, cT7); + renderer->drawRect(gx + 165, ly, 14, 3, cT2); + renderer->drawString("t2 cap", false, gx + 182, ly + 5, 12, cT2); + }); + tbreakGraph->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 150); + this->listElement->addItem(tbreakGraph); + } + + addConfigButton(KipConfigValue_timingEmcTbreak, "RAM-Timing tBreak", ValueRange(0, 1, 1, "", 1), "tBreak", &thresholdsDisabled, {}, + timingTbreakFreqs, false, true); + addConfigTrackbar(KipConfigValue_low_t6_tRTW, "Low t6 tRTW", ValueRange(0, 9, 1)); + addConfigTrackbar(KipConfigValue_low_t7_tWTR, "Low t7 tWTR", ValueRange(0, 9, 1)); + { + auto *spacer = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {}); + spacer->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 8); + this->listElement->addItem(spacer); + } + addConfigTrackbar(KipConfigValue_t2_tRP_cap, "1333WL t2 RP Cap", ValueRange(0, 8, 1)); } - addMappedConfigTrackbar(KipConfigValue_t6_tRTW_fine_tune, "t6 tRTW Fine Tune", - {0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u}, - {"-2", "-1", " 0", "+1", "+2"}); - addMappedConfigTrackbar(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", - {0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u}, - {"-3", "-2", "-1", " 0", "+1", "+2", "+3"}); + addMappedConfigTrackbar(KipConfigValue_t6_tRTW_fine_tune, "t6 tRTW Fine Tune", { 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u }, + { "-2", "-1", " 0", "+1", "+2" }); + addMappedConfigTrackbar(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", { 0xFFFFFFFDu, 0xFFFFFFFEu, 0xFFFFFFFFu, 0u, 1u, 2u, 3u }, + { "-3", "-2", "-1", " 0", "+1", "+2", "+3" }); } }; class RamLatenciesSubmenuGui : public MiscGui { -public: - RamLatenciesSubmenuGui() { } + public: + RamLatenciesSubmenuGui() { + } -protected: + tsl::elm::Element *baseUI() override { + auto *list = new TopAnchoredList(); + this->listElement = list; + this->listUI(); + return list; + } + protected: void normalizeLatencies(const HocClkConfigValue keysArr[4]) { - uint32_t maxClock = (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock]; + uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] + : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; uint32_t vals[4]; for (int i = 0; i < 4; i++) { vals[i] = (uint32_t)this->configList->values[keysArr[i]]; - if (vals[i] == 0xFFFFFFFFu) vals[i] = maxClock; + if (vals[i] == 0xFFFFFFFFu) + vals[i] = maxClock; } uint32_t currentLimit = 0; @@ -1344,10 +1354,13 @@ protected: uint32_t last = 0; for (int i = 0; i < 4; i++) { - if (vals[i] == 0) continue; + if (vals[i] == 0) + continue; - if (vals[i] < last) vals[i] = last; - if (vals[i] > maxClock) vals[i] = maxClock; + if (vals[i] < last) + vals[i] = last; + if (vals[i] > maxClock) + vals[i] = maxClock; last = vals[i]; } @@ -1359,35 +1372,31 @@ protected: void listUI() override { ValueThresholds thresholdsDisabled(0, 0); - - if (IsErista()) { - std::vector rlLabels = { NamedValue("1333 RL", 28), NamedValue("1600 RL", 32), NamedValue("1866 RL", 36), NamedValue("2133 RL", 40) }; - std::vector wlLabels = { NamedValue("1333 WL", 12), NamedValue("1600 WL", 14), NamedValue("1866 WL", 16), NamedValue("2133 WL", 18) }; - - addConfigButton(KipConfigValue_mem_burst_read_latency, "Read Latency", ValueRange(0, 6, 1, "", 0), "Read Latency", &thresholdsDisabled, {}, rlLabels, false, true); - addConfigButton(KipConfigValue_mem_burst_write_latency, "Write Latency", ValueRange(0, 6, 1, "", 0), "Write Latency", &thresholdsDisabled, {}, wlLabels, false, true); - return; - } - Result rc = hocclkIpcGetConfigValues(this->configList); if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - uint32_t maxClock = (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock]; + uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] + : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; - static const std::vector kFreqOptions = { - 1633000, 1666000, 1700000, 1733000, 1766000, 1800000, - 1833000, 1866000, 1900000, 1933000, 1966000, 1996800, 2000000, - 2033000, 2066000, 2100000, 2133000, 2166000, 2200000, 2233000, - 2266000, 2300000, 2333000, 2366000, 2400000, 2433000, 2466000, - 2500000, 2533000, 2566000, 2600000, 2633000, 2666000, 2700000, - 2733000, 2766000, 2800000, 2833000, 2866000, 2900000, 2933000, - 2966000, 3000000, 3033000, 3066000, 3100000, 3133000, 3166000, - 3200000, 3233000, 3266000, 3300000, - }; + static std::vector kFreqOptions = {}; + if (IsMariko()) { + kFreqOptions = { + 1633000, 1666000, 1700000, 1733000, 1766000, 1800000, 1833000, 1866000, 1900000, 1933000, 1966000, 1996800, 2000000, + 2033000, 2066000, 2100000, 2133000, 2166000, 2200000, 2233000, 2266000, 2300000, 2333000, 2366000, 2400000, 2433000, + 2466000, 2500000, 2533000, 2566000, 2600000, 2633000, 2666000, 2700000, 2733000, 2766000, 2800000, 2833000, 2866000, + 2900000, 2933000, 2966000, 3000000, 3033000, 3066000, 3100000, 3133000, 3166000, 3200000, 3233000, 3266000, 3300000, + }; + } else { + kFreqOptions = { + 1633000, 1666000, 1700000, 1733000, 1800000, 1833000, 1862400, 1881600, 1900800, 1920000, 1939200, 1958400, + 1977600, 1996800, 2016000, 2035200, 2054400, 2073600, 2092800, 2112000, 2131200, 2150400, 2169600, 2188800, + 2208000, 2227200, 2246400, 2265600, 2284800, 2304000, 2323200, 2342400, 2361600, 2380800, 2400000, + }; + } static const HocClkConfigValue kLatencyRKeys[4] = { KipConfigValue_read_latency_1333, @@ -1402,7 +1411,7 @@ protected: KipConfigValue_write_latency_2133, }; - static const char* kTierLabels[4] = { "1333 Latency Max", "1600 Latency Max", "1866 Latency Max", "2133 Latency Max" }; + static const char *kTierLabels[4] = { "1333 Latency Max", "1600 Latency Max", "1866 Latency Max", "2133 Latency Max" }; auto buildNamedValues = [&](int tierIdx) -> std::vector { std::vector nv; @@ -1412,7 +1421,8 @@ protected: nv.push_back(NamedValue(formatMemClockKhzLabel(maxClock, unit), 0xFFFFFFFFu)); } else { for (uint32_t freq : kFreqOptions) { - if (freq > maxClock) continue; + if (freq > maxClock) + continue; nv.push_back(NamedValue(formatMemClockKhzLabel(freq, unit), freq)); } nv.push_back(NamedValue(formatMemClockKhzLabel(maxClock, unit), maxClock)); @@ -1422,16 +1432,18 @@ protected: }; auto makeValueText = [&](uint32_t rawVal) -> std::string { - if (rawVal == 0) return "-"; - if (rawVal == 0xFFFFFFFFu) return formatMemClockKhzLabel(maxClock, unit); + if (rawVal == 0) + return "-"; + if (rawVal == 0xFFFFFFFFu) + return formatMemClockKhzLabel(maxClock, unit); return formatMemClockKhzLabel(rawVal, unit); }; - auto addLatencyRow = [&](const char* label, int tierIdx, const HocClkConfigValue keysArr[4]) { + auto addLatencyRow = [&](const char *label, int tierIdx, const HocClkConfigValue keysArr[4]) { HocClkConfigValue thisKey = keysArr[tierIdx]; uint32_t currentVal = (uint32_t)this->configList->values[thisKey]; - tsl::elm::ListItem* item = new tsl::elm::ListItem(label); + tsl::elm::ListItem *item = new tsl::elm::ListItem(label); item->setValue(makeValueText(currentVal)); item->setClickListener([this, tierIdx, thisKey, keysArr, label](u64 keys) -> bool { @@ -1447,12 +1459,11 @@ protected: for (int i = 0; i < 4; i++) vals[i] = (uint32_t)this->configList->values[keysArr[i]]; - uint32_t maxClock = (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock]; + uint32_t maxClock = IsMariko() ? (uint32_t)this->configList->values[KipConfigValue_marikoEmcMaxClock] + : (uint32_t)this->configList->values[KipConfigValue_eristaEmcMaxClock]; RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; - auto resolveVal = [maxClock](uint32_t v) -> uint32_t { - return (v == 0xFFFFFFFFu) ? maxClock : v; - }; + auto resolveVal = [maxClock](uint32_t v) -> uint32_t { return (v == 0xFFFFFFFFu) ? maxClock : v; }; if (tierIdx == 3) { bool maxOccupied = false; @@ -1476,9 +1487,7 @@ protected: } tsl::changeTo( - displayCurrent, - ValueRange(0, 0, 1, "", 1), - std::string("2133 Latency Max"), + displayCurrent, ValueRange(0, 0, 1, "", 1), std::string("2133 Latency Max"), [this, thisKey, keysArr](uint32_t chosen) -> bool { this->configList->values[thisKey] = chosen; Result rc = hocclkIpcSetConfigValues(this->configList); @@ -1490,12 +1499,7 @@ protected: this->lastContextUpdate = armGetSystemTick(); return true; }, - ValueThresholds(), false, - std::map{}, - opts, - false, - false - ); + ValueThresholds(), false, std::map{}, opts, false, false); return true; } @@ -1522,22 +1526,27 @@ protected: std::vector opts; opts.push_back(NamedValue("-", 0u)); for (uint32_t freq : kFreqOptions) { - if (freq <= lowerBound) continue; - if (freq > maxClock) continue; - if (upperBound != 0 && freq >= upperBound) continue; + if (freq <= lowerBound) + continue; + if (freq > maxClock) + continue; + if (upperBound != 0 && freq >= upperBound) + continue; opts.push_back(NamedValue(formatMemClockKhzLabel(freq, unit), freq)); } uint32_t displayCurrent = resolveVal(vals[tierIdx]); bool currentInList = false; - for (auto& nv : opts) - if (nv.value == displayCurrent) { currentInList = true; break; } - if (!currentInList) displayCurrent = 0; + for (auto &nv : opts) + if (nv.value == displayCurrent) { + currentInList = true; + break; + } + if (!currentInList) + displayCurrent = 0; tsl::changeTo( - displayCurrent, - ValueRange(0, 0, 1, "", 1), - std::string("Latency Max"), + displayCurrent, ValueRange(0, 0, 1, "", 1), std::string("Latency Max"), [this, thisKey, keysArr](uint32_t chosen) -> bool { this->configList->values[thisKey] = chosen; normalizeLatencies(keysArr); @@ -1550,38 +1559,274 @@ protected: this->lastContextUpdate = armGetSystemTick(); return true; }, - ValueThresholds(), false, - std::map{}, - opts, - false, - false - ); + ValueThresholds(), false, std::map{}, opts, false, false); return true; }); this->listElement->addItem(item); this->configButtons[thisKey] = item; - this->configRanges[thisKey] = ValueRange(0, 0, 1, "", 1); + this->configRanges[thisKey] = ValueRange(0, 0, 1, "", 1); this->configNamedValues[thisKey] = buildNamedValues(tierIdx); }; - this->listElement->addItem(new tsl::elm::CategoryHeader("Read Latency")); + this->listElement->addItem(new CompactCategoryHeader("Latency Graph")); + + { + HocClkConfigValueList *cfgPtr = this->configList; + bool mariko = IsMariko(); + + auto *graph = new tsl::elm::CustomDrawer([cfgPtr, mariko](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + static const HocClkConfigValue kR[4] = { + KipConfigValue_read_latency_1333, + KipConfigValue_read_latency_1600, + KipConfigValue_read_latency_1866, + KipConfigValue_read_latency_2133, + }; + static const HocClkConfigValue kW[4] = { + KipConfigValue_write_latency_1333, + KipConfigValue_write_latency_1600, + KipConfigValue_write_latency_1866, + KipConfigValue_write_latency_2133, + }; + + uint32_t capMax = + mariko ? (uint32_t)cfgPtr->values[KipConfigValue_marikoEmcMaxClock] : (uint32_t)cfgPtr->values[KipConfigValue_eristaEmcMaxClock]; + + uint32_t rv[4], wv[4]; + for (int i = 0; i < 4; i++) { + rv[i] = (uint32_t)cfgPtr->values[kR[i]]; + wv[i] = (uint32_t)cfgPtr->values[kW[i]]; + if (rv[i] == 0xFFFFFFFFu) + rv[i] = capMax; + if (wv[i] == 0xFFFFFFFFu) + wv[i] = capMax; + } + + const tsl::Color cRead = tsl::Color(4, 14, 15, 15); + const tsl::Color cWrite = tsl::Color(15, 9, 2, 15); + const tsl::Color cMerge = tsl::Color(5, 15, 4, 15); + const tsl::Color cAxis = tsl::Color(5, 5, 5, 15); + + const s32 gx = x + (mariko ? 52 : 47); + const s32 gw = w - (mariko ? 64 : 59); + const s32 gy = y + 14; + const s32 gh = 54; + const s32 th = gh / 3; + const s32 axisY = gy + gh; + + auto tierY = [&](int i) -> s32 { return gy + gh - i * th; }; + const uint32_t kRMin = 1600000u; + const uint32_t kRMax = mariko ? 3300000u : 2400000u; + auto freqX = [&](uint32_t kHz) -> s32 { + if (kHz <= kRMin) + return gx; + if (kHz >= kRMax) + return gx + gw; + return gx + (s32)((uint64_t)(kHz - kRMin) * (uint32_t)gw / (kRMax - kRMin)); + }; + + const char *tierLabels[4] = { "1333", "1600", "1866", "2133" }; + for (int i = 0; i < 4; i++) { + renderer->drawString(tierLabels[i], false, x + 4, tierY(i) + 5, 12, cAxis); + renderer->drawRect(gx, tierY(i), gw, 1, cAxis); + } + renderer->drawRect(gx, gy, 1, gh + 1, cAxis); + renderer->drawRect(gx, axisY, gw, 1, cAxis); + + struct LatSeg { + int tier; + uint32_t start, end; + }; + auto buildSegs = [&](const uint32_t *vals) -> std::vector { + struct Pt { + int tier; + uint32_t freq; + }; + Pt pts[4]; + int n = 0; + for (int i = 0; i < 4; i++) + if (vals[i] != 0) + pts[n++] = { i, vals[i] }; + if (n == 0) + return {}; + std::vector segs; + uint32_t prev = kRMin; + for (int k = 0; k < n; k++) { + if (pts[k].freq > prev) + segs.push_back({ pts[k].tier, prev, pts[k].freq }); + prev = pts[k].freq; + } + if (prev < kRMax) + segs.push_back({ pts[n - 1].tier, prev, kRMax }); + return segs; + }; + + auto rSegs = buildSegs(rv); + auto wSegs = buildSegs(wv); + + auto drawSeriesSegs = [&](const std::vector &segs, const std::vector &other, const tsl::Color &c, s32 yOff) { + for (const auto &seg : segs) { + s32 ty = tierY(seg.tier) + yOff; + s32 tyMrg = tierY(seg.tier); + struct Iv { + uint32_t s, e; + }; + Iv ovlp[4]; + int no = 0; + for (const auto &os : other) { + if (os.tier != seg.tier) + continue; + uint32_t s = seg.start > os.start ? seg.start : os.start; + uint32_t e = seg.end < os.end ? seg.end : os.end; + if (s < e) + ovlp[no++] = { s, e }; + } + for (int a = 1; a < no; a++) + for (int b = a; b > 0 && ovlp[b - 1].s > ovlp[b].s; b--) { + auto t = ovlp[b]; + ovlp[b] = ovlp[b - 1]; + ovlp[b - 1] = t; + } + uint32_t cur = seg.start; + for (int oi = 0; oi < no; oi++) { + if (cur < ovlp[oi].s) { + s32 x0 = freqX(cur), x1 = freqX(ovlp[oi].s); + if (x1 > x0) + renderer->drawRect(x0, ty, x1 - x0, 2, c); + } + s32 x0 = freqX(ovlp[oi].s), x1 = freqX(ovlp[oi].e); + if (x1 > x0) + renderer->drawRect(x0, tyMrg, x1 - x0, 2, cMerge); + cur = ovlp[oi].e; + } + if (cur < seg.end) { + s32 x0 = freqX(cur), x1 = freqX(seg.end); + if (x1 > x0) + renderer->drawRect(x0, ty, x1 - x0, 2, c); + } + } + for (int k = 0; k + 1 < (int)segs.size(); k++) { + if (segs[k].end != segs[k + 1].start) + continue; + uint32_t transFreq = segs[k].end; + bool otherHere = false; + for (int j = 0; j + 1 < (int)other.size(); j++) + if (other[j].end == transFreq && other[j + 1].start == transFreq) { + otherHere = true; + break; + } + s32 fx = freqX(transFreq); + s32 y1 = tierY(segs[k].tier) + yOff; + s32 y2 = tierY(segs[k + 1].tier) + yOff; + s32 topY = y1 < y2 ? y1 : y2; + s32 botY = y1 > y2 ? y1 : y2; + if (botY > topY) + renderer->drawRect(fx, topY, 2, botY - topY + 2, otherHere ? cMerge : c); + } + }; + + drawSeriesSegs(rSegs, wSegs, cRead, 0); + drawSeriesSegs(wSegs, rSegs, cWrite, 0); + + static const uint8_t kDigBmp[10][5] = { + { 7, 5, 5, 5, 7 }, // 0 + { 6, 2, 2, 2, 7 }, // 1 + { 7, 1, 7, 4, 7 }, // 2 + { 7, 1, 3, 1, 7 }, // 3 + { 5, 5, 7, 1, 1 }, // 4 + { 7, 4, 7, 1, 7 }, // 5 + { 7, 4, 7, 5, 7 }, // 6 + { 7, 1, 1, 2, 2 }, // 7 + { 7, 5, 7, 5, 7 }, // 8 + { 7, 5, 7, 1, 7 }, // 9 + }; + const s32 charGap = 1; + + auto drawSidewaysMHz = [&](uint32_t mhz, s32 cx, s32 startY, const tsl::Color &c, s32 pixSize) { + char buf[8]; + snprintf(buf, sizeof(buf), "%u", mhz); + s32 cW = 5 * pixSize; + s32 cH = 3 * pixSize; + s32 originX = cx - cW / 2; + for (int ci = 0; buf[ci]; ci++) { + int d = buf[ci] - '0'; + if (d < 0 || d > 9) + continue; + s32 cy = startY + ci * (cH + charGap); + for (int r = 0; r < 5; r++) { + for (int col = 0; col < 3; col++) { + if (!((kDigBmp[d][r] >> (2 - col)) & 1)) + continue; + renderer->drawRect(originX + (4 - r) * pixSize, cy + col * pixSize, pixSize, pixSize, c); + } + } + } + }; + + if (mariko) { + static const uint32_t kRulerMHz[] = { + 1600, 1733, 1866, 2000, 2133, 2266, 2400, 2533, 2666, 2800, 2933, 3066, 3200, 3300, + }; + for (uint32_t mhz : kRulerMHz) { + s32 fx = freqX(mhz * 1000u); + renderer->drawRect(fx, axisY, 1, 4, cAxis); + drawSidewaysMHz(mhz, fx, axisY + 6, cAxis, 2); + } + } else { + static const uint32_t kEristaRulerMHz[] = { + 1600, 1666, 1733, 1800, 1866, 1933, 2000, 2066, 2133, 2200, 2266, 2333, 2400, + }; + for (uint32_t mhz : kEristaRulerMHz) { + s32 fx = freqX(mhz * 1000u); + renderer->drawRect(fx, axisY, 1, 4, cAxis); + drawSidewaysMHz(mhz, fx, axisY + 6, cAxis, 2); + } + } + + // Breakpoint dots + for (int i = 0; i < 4; i++) { + s32 ty = tierY(i) + 1; + bool merged = (rv[i] != 0 && rv[i] == wv[i]); + if (merged) { + renderer->drawCircle(freqX(rv[i]), ty, 4, true, cMerge); + } else { + if (rv[i]) + renderer->drawCircle(freqX(rv[i]), ty, 4, true, cRead); + if (wv[i]) + renderer->drawCircle(freqX(wv[i]), ty, 4, true, cWrite); + } + } + + const s32 ly = axisY + 46; + renderer->drawRect(gx, ly, 14, 3, cRead); + renderer->drawString("Read", false, gx + 17, ly + 5, 12, cRead); + renderer->drawRect(gx + 60, ly, 14, 3, cWrite); + renderer->drawString("Write", false, gx + 77, ly + 5, 12, cWrite); + renderer->drawRect(gx + 125, ly, 14, 3, cMerge); + renderer->drawString("Same", false, gx + 142, ly + 5, 12, cMerge); + }); + graph->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 150); + this->listElement->addItem(graph); + } + + this->listElement->addItem(new CompactCategoryHeader("Read Latency")); for (int i = 0; i < 4; i++) addLatencyRow(kTierLabels[i], i, kLatencyRKeys); - this->listElement->addItem(new tsl::elm::CategoryHeader("Write Latency")); + this->listElement->addItem(new CompactCategoryHeader("Write Latency")); for (int i = 0; i < 4; i++) addLatencyRow(kTierLabels[i], i, kLatencyWKeys); } }; class CpuSubmenuGui : public MiscGui { -public: - CpuSubmenuGui() { } + public: + CpuSubmenuGui() { + } -protected: + protected: void listUI() override { - Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work + Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; @@ -1593,341 +1838,199 @@ protected: ValueThresholds eCpuClockThresholds(1785000, 2091000); ValueThresholds eCpuClockThresholdsUV(2091000, 2193000); - this->listElement->addItem(new tsl::elm::CategoryHeader("CPU Settings")); - if(IsMariko()) { + this->listElement->addItem(new CompactCategoryHeader("CPU Settings")); + if (IsMariko()) { addConfigTrackbar(KipConfigValue_marikoCpuUVLow, "CPU Low UV", ValueRange(0, 8, 1)); addConfigTrackbar(KipConfigValue_marikoCpuUVHigh, "CPU High UV", ValueRange(0, 12, 1)); - std::vector marikoTableConf = { - // NamedValue("Auto", 0), - NamedValue("Default", 1), - NamedValue("1581MHz Tbreak", 2), - NamedValue("1683MHz Tbreak", 3), - NamedValue("Extreme UV Table", 4) + std::vector marikoTableConf = { // NamedValue("Auto", 0), + NamedValue("Default", 1), NamedValue("1581MHz Tbreak", 2), NamedValue("1683MHz Tbreak", 3), + NamedValue("Extreme UV Table", 4) }; - addConfigButton( - KipConfigValue_tableConf, - "CPU UV Table", - ValueRange(0, 12, 1, "", 0), - "CPU UV Table", - &thresholdsDisabled, - {}, - marikoTableConf, - false, - true - ); + addConfigButton(KipConfigValue_tableConf, "CPU UV Table", ValueRange(0, 12, 1, "", 0), "CPU UV Table", &thresholdsDisabled, {}, + marikoTableConf, false, true); - addConfigButton( - KipConfigValue_marikoCpuLowVmin, - "CPU Low VMIN", - ValueRange(550, 750, 5, "mV", 1), - "CPU VMIN", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuLowVmin, "CPU Low VMIN", ValueRange(550, 750, 5, "mV", 1), "CPU VMIN", &thresholdsDisabled, {}, + {}, false, true); - addConfigButton( - KipConfigValue_marikoCpuHighVmin, - "CPU High VMIN", - ValueRange(650, 900, 5, "mV", 1), - "CPU VMIN", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuHighVmin, "CPU High VMIN", ValueRange(650, 900, 5, "mV", 1), "CPU VMIN", &thresholdsDisabled, {}, + {}, false, true); ValueThresholds mCpuVoltThresholds(1160, 1180); - addConfigButton( - KipConfigValue_marikoCpuMaxVolt, - "CPU Max Voltage", - ValueRange(1000, 1200, 5, "mV", 1), - "CPU Max Voltage", - &mCpuVoltThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuMaxVolt, "CPU Max Voltage", ValueRange(1000, 1200, 5, "mV", 1), "CPU Max Voltage", + &mCpuVoltThresholds, {}, {}, false, true); - std::vector maxClkOptions = { - NamedValue("1963 MHz", 1963500), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), - NamedValue("2499 MHz", 2499000), - NamedValue("2601 MHz", 2601000), - NamedValue("2703 MHz", 2703000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), }; - addConfigButton( - KipConfigValue_marikoCpuMaxClock, - "CPU Max Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Max Clock", - this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, - {}, - maxClkOptions, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuMaxClock, "CPU Max Clock", ValueRange(0, 0, 1, "", 1), "CPU Max Clock", + this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, + maxClkOptions, false, true); std::vector ClkOptions = { - NamedValue("1963 MHz", 1963500), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), - NamedValue("2499 MHz", 2499000), - NamedValue("2601 MHz", 2601000), - NamedValue("2703 MHz", 2703000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), + }; + std::vector ClkOptionsRamOc = { + NamedValue("1122 MHz", 1122000), NamedValue("1224 MHz", 1224000), NamedValue("1326 MHz", 1326000), NamedValue("1428 MHz", 1428000), + NamedValue("1581 MHz", 1581000), NamedValue("1683 MHz", 1683000), NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), + NamedValue("1963 MHz", 1963500), NamedValue("2091 MHz", 2091000), NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), + NamedValue("2397 MHz", 2397000), NamedValue("2499 MHz", 2499000), NamedValue("2601 MHz", 2601000), NamedValue("2703 MHz", 2703000), }; - addConfigButton( - KipConfigValue_marikoCpuBoostClock, - "CPU Boost Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Boost Clock", - this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, - {}, - ClkOptions, - false, - true - ); + addConfigButton(KipConfigValue_marikoCpuBoostClock, "CPU Boost Clock", ValueRange(0, 0, 1, "", 1), "CPU Boost Clock", + this->configList->values[KipConfigValue_marikoCpuUVHigh] ? &mCpuClockThresholdsUV : &mCpuClockThresholds, {}, ClkOptions, + false, true); + + std::vector emcMaxClock = { + NamedValue("1600 MHz", 1600000), + NamedValue("1633 MHz", 1633000), + NamedValue("1666 MHz", 1666000), + NamedValue("1700 MHz", 1700000), + NamedValue("1733 MHz", 1733000), + NamedValue("1766 MHz", 1766000), + NamedValue("1800 MHz", 1800000), + NamedValue("1833 MHz", 1833000), + NamedValue("1866 MHz", 1866000, "JEDEC."), + NamedValue("1900 MHz", 1900000), + NamedValue("1933 MHz", 1933000), + NamedValue("1966 MHz", 1966000), + NamedValue("1996 MHz", 1996800, "JEDEC."), + NamedValue("2000 MHz", 2000000), + NamedValue("2033 MHz", 2033000), + NamedValue("2066 MHz", 2066000), + NamedValue("2100 MHz", 2100000), + NamedValue("2133 MHz", 2133000, "JEDEC."), + NamedValue("2166 MHz", 2166000), + NamedValue("2200 MHz", 2200000), + NamedValue("2233 MHz", 2233000), + NamedValue("2266 MHz", 2266000), + NamedValue("2300 MHz", 2300000), + NamedValue("2333 MHz", 2333000), + NamedValue("2366 MHz", 2366000), + NamedValue("2400 MHz", 2400000, "JEDEC."), + NamedValue("2433 MHz", 2433000), + NamedValue("2466 MHz", 2466000), + NamedValue("2500 MHz", 2500000), + NamedValue("2533 MHz", 2533000), + NamedValue("2566 MHz", 2566000), + NamedValue("2600 MHz", 2600000), + NamedValue("2633 MHz", 2633000), + NamedValue("2666 MHz", 2666000, "JEDEC."), + NamedValue("2700 MHz", 2700000), + NamedValue("2733 MHz", 2733000), + NamedValue("2766 MHz", 2766000), + NamedValue("2800 MHz", 2800000), + NamedValue("2833 MHz", 2833000), + NamedValue("2866 MHz", 2866000), + NamedValue("2900 MHz", 2900000), + NamedValue("2933 MHz", 2933000, "JEDEC."), + NamedValue("2966 MHz", 2966000), + NamedValue("3000 MHz", 3000000), + NamedValue("3033 MHz", 3033000), + NamedValue("3066 MHz", 3066000), + NamedValue("3100 MHz", 3100000), + NamedValue("3133 MHz", 3133000), + NamedValue("3166 MHz", 3166000), + NamedValue("3200 MHz", 3200000, "JEDEC."), + NamedValue("3233 MHz", 3233000, "High speedo needed!"), + NamedValue("3266 MHz", 3266000, "High speedo needed!"), + NamedValue("3300 MHz", 3300000, "High speedo needed!"), + }; + addConfigToggle(HocClkConfigValue_AutoRAMCPUOverclock, "Auto CPU RAM OC"); + addConfigButton(HocClkConfigValue_AutoRamCpuCpuOCFreq, "Auto CPU RAM OC CPU clock", ValueRange(0, 0, 1, "", 1), "CPU Clock", + &thresholdsDisabled, {}, ClkOptionsRamOc, false, false); + addConfigButton(HocClkConfigValue_AutoRamCpuRamOCThreshold, "Auto CPU RAM OC Threshold", ValueRange(0, 0, 1, "", 1), "RAM Clock", + &thresholdsDisabled, {}, emcMaxClock, false, false); } else { addConfigTrackbar(KipConfigValue_eristaCpuUV, "CPU UV", ValueRange(0, 5, 1)); addConfigToggle(KipConfigValue_eristaCpuUnlock, "CPU Unlock", true); - addConfigButton( - KipConfigValue_eristaCpuVmin, - "CPU VMIN", - ValueRange(700, 900, 25, "mV", 1), - "CPU VMIN", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_eristaCpuVmin, "CPU VMIN", ValueRange(750, 900, 25, "mV", 1), "CPU VMIN", &thresholdsDisabled, {}, {}, + false, true); ValueThresholds eCpuVoltThresholds(1235, 1260); - addConfigButton( - KipConfigValue_eristaCpuMaxVolt, - "CPU Max Voltage", - ValueRange(1120, 1260, 5, "mV", 1), - "CPU Max Voltage", - &eCpuVoltThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_eristaCpuMaxVolt, "CPU Max Voltage", ValueRange(1120, 1260, 5, "mV", 1), "CPU Max Voltage", + &eCpuVoltThresholds, {}, {}, false, true); std::vector maxClkOptions = { - NamedValue("1785 MHz", 1785), - NamedValue("1887 MHz", 1887), - NamedValue("1989 MHz", 1989), - NamedValue("2091 MHz", 2091), - NamedValue("2193 MHz", 2193), - NamedValue("2295 MHz", 2295), - NamedValue("2397 MHz", 2397), + NamedValue("1785 MHz", 1785), NamedValue("1887 MHz", 1887), NamedValue("1989 MHz", 1989), NamedValue("2091 MHz", 2091), + NamedValue("2193 MHz", 2193), NamedValue("2295 MHz", 2295), NamedValue("2397 MHz", 2397), }; ValueThresholds eCpuMaxClockThresholds(1785, 2091); - addConfigButton( - HocClkConfigValue_EristaMaxCpuClock, - "CPU Max Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Max Clock", - &eCpuMaxClockThresholds, - {}, - maxClkOptions, - false - ); + addConfigButton(HocClkConfigValue_EristaMaxCpuClock, "CPU Max Clock", ValueRange(0, 0, 1, "", 1), "CPU Max Clock", + &eCpuMaxClockThresholds, {}, maxClkOptions, false); std::vector ClkOptionsE = { - NamedValue("1785 MHz", 1785000), - NamedValue("1887 MHz", 1887000), - NamedValue("1989 MHz", 1989000), - NamedValue("2091 MHz", 2091000), - NamedValue("2193 MHz", 2193000), - NamedValue("2295 MHz", 2295000), - NamedValue("2397 MHz", 2397000), + NamedValue("1785 MHz", 1785000), NamedValue("1887 MHz", 1887000), NamedValue("1989 MHz", 1989000), NamedValue("2091 MHz", 2091000), + NamedValue("2193 MHz", 2193000), NamedValue("2295 MHz", 2295000), NamedValue("2397 MHz", 2397000), }; - addConfigButton( - KipConfigValue_eristaCpuBoostClock, - "CPU Boost Clock", - ValueRange(0, 0, 1, "", 1), - "CPU Boost Clock", - this->configList->values[KipConfigValue_eristaCpuUV] ? &eCpuClockThresholdsUV : &eCpuClockThresholds, - {}, - ClkOptionsE, - false, - true - ); + addConfigButton(KipConfigValue_eristaCpuBoostClock, "CPU Boost Clock", ValueRange(0, 0, 1, "", 1), "CPU Boost Clock", + this->configList->values[KipConfigValue_eristaCpuUV] ? &eCpuClockThresholdsUV : &eCpuClockThresholds, {}, ClkOptionsE, + false, true); + addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); } addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr); - } }; -class RamTableEditor : public MiscGui { -public: - RamTableEditor() { } - -protected: - void listUI() override { - Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("RAM Frequency Editor")); - - ValueThresholds thresholdsDisabled(0, 0); - // 1600000, 1331200, 1065600, 800000, 665600, 408000, 204000 - RamDisplayUnit unit = (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]; - - this->listElement->addItem(new tsl::elm::ListItem(formatMemClockKhzLabel(665600, unit))); - this->listElement->addItem(new tsl::elm::ListItem(formatMemClockKhzLabel(800000, unit))); - this->listElement->addItem(new tsl::elm::ListItem(formatMemClockKhzLabel(1065600, unit))); - this->listElement->addItem(new tsl::elm::ListItem(formatMemClockKhzLabel(1331200, unit))); - this->listElement->addItem(new tsl::elm::ListItem(formatMemClockKhzLabel(1600000, unit))); - - ValueThresholds eristaRamThresholds(2208000, 2304000); - - std::vector eristaMaxEmcClock = { - NamedValue("Disabled", 1600000), - NamedValue("1633 MHz", 1633000), - NamedValue("1666 MHz", 1666000), - NamedValue("1700 MHz", 1700000), - NamedValue("1733 MHz", 1733000), - NamedValue("1766 MHz", 1766000), - NamedValue("1800 MHz", 1800000), - NamedValue("1833 MHz", 1833000), - NamedValue("1862 MHz", 1862400, "JEDEC."), - NamedValue("1881 MHz", 1881600), - NamedValue("1900 MHz", 1900800), - NamedValue("1920 MHz", 1920000), - NamedValue("1939 MHz", 1939200), - NamedValue("1958 MHz", 1958400), - NamedValue("1977 MHz", 1977600), - NamedValue("1996 MHz", 1996800, "JEDEC."), - NamedValue("2016 MHz", 2016000), - NamedValue("2035 MHz", 2035200), - NamedValue("2054 MHz", 2054400), - NamedValue("2073 MHz", 2073600), - NamedValue("2092 MHz", 2092800), - NamedValue("2112 MHz", 2112000), - NamedValue("2131 MHz", 2131200, "JEDEC."), - NamedValue("2150 MHz", 2150400), - NamedValue("2169 MHz", 2169600), - NamedValue("2188 MHz", 2188800), - NamedValue("2208 MHz", 2208000), - NamedValue("2227 MHz", 2227200), - NamedValue("2246 MHz", 2246400), - NamedValue("2265 MHz", 2265600), - NamedValue("2284 MHz", 2284800), - NamedValue("2304 MHz", 2304000), - NamedValue("2323 MHz", 2323200), - NamedValue("2342 MHz", 2342400), - NamedValue("2361 MHz", 2361600), - NamedValue("2380 MHz", 2380800), - NamedValue("2400 MHz", 2400000, "JEDEC."), - }; - - for (auto& nv : eristaMaxEmcClock) - if (nv.name != "Disabled") - nv.name = formatMemClockKhzLabel(nv.value, unit); - - addConfigButtonS(KipConfigValue_eristaEmcMaxClock, "", ValueRange(0, 1, 1, "", 1), "", &eristaRamThresholds, {}, eristaMaxEmcClock, false, A_BTN, true); - addConfigButtonS(KipConfigValue_eristaEmcMaxClock1, "", ValueRange(0, 1, 1, "", 1), "", &eristaRamThresholds, {}, eristaMaxEmcClock, false, A_BTN, true); - addConfigButtonS(KipConfigValue_eristaEmcMaxClock2, "", ValueRange(0, 1, 1, "", 1), "", &eristaRamThresholds, {}, eristaMaxEmcClock, false, A_BTN, true); - }; -}; - class GpuSubmenuGui : public MiscGui { -public: - GpuSubmenuGui() { } + public: + GpuSubmenuGui() { + } -protected: + protected: void listUI() override { Result rc = hocclkIpcGetConfigValues(this->configList); - if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } ValueThresholds thresholdsDisabled(0, 0); std::vector noNamedValues = {}; - this->listElement->addItem(new tsl::elm::CategoryHeader("GPU Settings")); + this->listElement->addItem(new CompactCategoryHeader("GPU Settings")); - std::vector gpuUvConf = { - NamedValue("HiOPT", 0), - NamedValue("HiOPT - 15mV", 1), - NamedValue("High UV Table", 2), + std::vector gpuUvConfM = { + NamedValue("No Undervolt", 0, "HOS Default"), + NamedValue("SLT Table", 1), + NamedValue("HiOPT Table", 2, "HOC Default"), + NamedValue("HiOPT - 15mV", 3), + NamedValue("High UV Table", 4), }; + std::vector gpuUvConfE = { + NamedValue("No Undervolt", 0), + NamedValue("SLT Table", 1), + NamedValue("HiOPT Table", 2), + }; std::vector mGpuVoltsVmin = { - NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), - NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), - NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), - NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), - NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), - NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), - NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), - NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), - NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), - NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), - NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), - NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), - NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), - NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), - NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), - NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), - NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), - NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), - NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), - NamedValue("795mV", 795) + NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), NamedValue("495mV", 495), NamedValue("500mV", 500), + NamedValue("505mV", 505), NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), NamedValue("525mV", 525), + NamedValue("530mV", 530), NamedValue("535mV", 535), NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), + NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), NamedValue("570mV", 570), NamedValue("575mV", 575), + NamedValue("580mV", 580), NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), NamedValue("600mV", 600), + NamedValue("605mV", 605), NamedValue("610mV", 610), NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), + NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), NamedValue("645mV", 645), NamedValue("650mV", 650), + NamedValue("655mV", 655), NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), NamedValue("675mV", 675), + NamedValue("680mV", 680), NamedValue("685mV", 685), NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), + NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), + NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), NamedValue("750mV", 750), + NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), + NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), NamedValue("795mV", 795) }; - if(IsErista()) { - addConfigButton( - KipConfigValue_eristaGpuUV, - "GPU Undervolt Table", - ValueRange(0, 1, 1, "", 1), - "GPU Undervolt Table", - &thresholdsDisabled, - {}, - gpuUvConf, - false, - true - ); - addConfigButton( - KipConfigValue_eristaGpuVmin, - "GPU Minimum Voltage", - ValueRange(675, 875, 5, "mV", 1), - "GPU Minimum Voltage", - &thresholdsDisabled, - {}, - {}, - false, - true - ); + if (IsErista()) { + addConfigButton(KipConfigValue_eristaGpuUV, "GPU Undervolt Table", ValueRange(0, 1, 1, "", 1), "GPU Undervolt Table", &thresholdsDisabled, + {}, gpuUvConfE, false, true); + addConfigButton(KipConfigValue_eristaGpuVmin, "GPU Minimum Voltage", ValueRange(675, 875, 5, "mV", 1), "GPU Minimum Voltage", + &thresholdsDisabled, {}, {}, false, true); } else { - addConfigButton( - KipConfigValue_marikoGpuUV, - "GPU Undervolt Table", - ValueRange(0, 1, 1, "", 1), - "GPU Undervolt Table", - &thresholdsDisabled, - {}, - gpuUvConf, - false, - true - ); + addConfigButton(KipConfigValue_marikoGpuUV, "GPU Undervolt Table", ValueRange(0, 1, 1, "", 1), "GPU Undervolt Table", &thresholdsDisabled, + {}, gpuUvConfM, false, true); // tsl::elm::ListItem* vminCalcBtn = new tsl::elm::ListItem("Calculate GPU Vmin"); // vminCalcBtn->setClickListener([this](u64 keys) { @@ -1942,46 +2045,39 @@ protected: // return false; // }); - addConfigButton(KipConfigValue_marikoGpuBootVolt, "GPU Boot Volt", ValueRange(700, 800, 5, "mV", 1), "GPU Boot Voltage", &thresholdsDisabled, {}, {}, false, true); - addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, false, true); + addConfigButton(KipConfigValue_marikoGpuVmin, "GPU VMIN", ValueRange(0, 0, 0, "0", 1), "GPU VMIN", &thresholdsDisabled, {}, mGpuVoltsVmin, + false, true); ValueThresholds MgpuVmaxThresholds(805, 850); - addConfigButton( - KipConfigValue_marikoGpuVmax, - "GPU Maximum Voltage", - ValueRange(800, 960, 5, "mV", 1), - "GPU Maximum Voltage", - &MgpuVmaxThresholds, - {}, - {}, - false, - true - ); + addConfigButton(KipConfigValue_marikoGpuVmax, "GPU Maximum Voltage", ValueRange(800, 960, 5, "mV", 1), "GPU Maximum Voltage", + &MgpuVmaxThresholds, {}, {}, false, true); } std::vector gpuOffset = { - NamedValue("-50 mV", 50), - NamedValue("-45 mV", 45), - NamedValue("-40 mV", 40), - NamedValue("-30 mV", 30), - NamedValue("-25 mV", 25), - NamedValue("-20 mV", 20), - NamedValue("-15 mV", 15), - NamedValue("-10 mV", 10), - NamedValue(" -5 mV", 5), - NamedValue("Disabled", 0), + NamedValue("-50 mV", static_cast(-50)), + NamedValue("-45 mV", static_cast(-45)), + NamedValue("-40 mV", static_cast(-40)), + NamedValue("-35 mV", static_cast(-35)), + NamedValue("-30 mV", static_cast(-30)), + NamedValue("-25 mV", static_cast(-25)), + NamedValue("-20 mV", static_cast(-20)), + NamedValue("-15 mV", static_cast(-15)), + NamedValue("-10 mV", static_cast(-10)), + NamedValue("-5 mV", static_cast(-5)), + NamedValue("0 mV", 0), + NamedValue("5 mV", 5), + NamedValue("10 mV", 10), + NamedValue("15 mV", 15), + NamedValue("20 mV", 20), + NamedValue("25 mV", 25), + NamedValue("30 mV", 30), + NamedValue("35 mV", 35), + NamedValue("40 mV", 40), + NamedValue("45 mV", 45), + NamedValue("50 mV", 50), }; - addConfigButton( - KipConfigValue_commonGpuVoltOffset, - "GPU Voltage Offset", - ValueRange(0, 50, 5, "mV", 1), - "GPU Voltage Offset", - &thresholdsDisabled, - {}, - gpuOffset, - false, - true - ); + addConfigButton(KipConfigValue_commonGpuVoltOffset, "GPU Voltage Offset", ValueRange(0, 50, 5, "mV", 1), "GPU Voltage Offset", + &thresholdsDisabled, {}, gpuOffset, false, true); std::vector gpuSchedValues = { NamedValue("Do not override", GpuSchedulingMode_DoNotOverride), @@ -1989,63 +2085,31 @@ protected: NamedValue("Disabled", GpuSchedulingMode_Disabled, "99.7% limit"), }; - addConfigButton( - HocClkConfigValue_GPUScheduling, - "GPU Scheduling Override", - ValueRange(0, 0, 1, "", 0), - "GPU Scheduling Override", - &thresholdsDisabled, - {}, - gpuSchedValues, - false - ); + addConfigButton(HocClkConfigValue_GPUScheduling, "GPU Scheduling Override", ValueRange(0, 0, 1, "", 0), "GPU Scheduling Override", + &thresholdsDisabled, {}, gpuSchedValues, false); - if (IsMariko()) { - std::vector dvfsOffset = { - NamedValue("-80 mV", 0xFFFFFFB0), - NamedValue("-75 mV", 0xFFFFFFB5), - NamedValue("-70 mV", 0xFFFFFFBA), - NamedValue("-65 mV", 0xFFFFFFBF), - NamedValue("-60 mV", 0xFFFFFFC4), - NamedValue("-55 mV", 0xFFFFFFC9), - NamedValue("-50 mV", 0xFFFFFFCE), - NamedValue("-45 mV", 0xFFFFFFD3), - NamedValue("-40 mV", 0xFFFFFFD8), - NamedValue("-35 mV", 0xFFFFFFDD), - NamedValue("-30 mV", 0xFFFFFFE2), - NamedValue("-25 mV", 0xFFFFFFE7), - NamedValue("-20 mV", 0xFFFFFFEC), - NamedValue("-15 mV", 0xFFFFFFF1), - NamedValue("-10 mV", 0xFFFFFFF6), - NamedValue(" -5 mV", 0xFFFFFFFB), - NamedValue("Disabled", 0), - NamedValue(" +5 mV", 5), - NamedValue("+10 mV", 10), - NamedValue("+15 mV", 15), - NamedValue("+20 mV", 20), - }; + std::vector dvfsOffset = { + NamedValue("-80 mV", 0xFFFFFFB0), NamedValue("-75 mV", 0xFFFFFFB5), NamedValue("-70 mV", 0xFFFFFFBA), NamedValue("-65 mV", 0xFFFFFFBF), + NamedValue("-60 mV", 0xFFFFFFC4), NamedValue("-55 mV", 0xFFFFFFC9), NamedValue("-50 mV", 0xFFFFFFCE), NamedValue("-45 mV", 0xFFFFFFD3), + NamedValue("-40 mV", 0xFFFFFFD8), NamedValue("-35 mV", 0xFFFFFFDD), NamedValue("-30 mV", 0xFFFFFFE2), NamedValue("-25 mV", 0xFFFFFFE7), + NamedValue("-20 mV", 0xFFFFFFEC), NamedValue("-15 mV", 0xFFFFFFF1), NamedValue("-10 mV", 0xFFFFFFF6), NamedValue(" -5 mV", 0xFFFFFFFB), + NamedValue("Disabled", 0), NamedValue(" +5 mV", 5), NamedValue("+10 mV", 10), NamedValue("+15 mV", 15), + NamedValue("+20 mV", 20), + }; - std::vector dvfsValues = { - NamedValue("Disabled", DVFSMode_Disabled), - NamedValue("PCV Hijack", DVFSMode_Hijack), - // NamedValue("Official Service", DVFSMode_OfficialService), - }; + std::vector dvfsValues = { + NamedValue("Disabled", DVFSMode_Disabled), + NamedValue("PCV Hijack", DVFSMode_Hijack), + // NamedValue("Official Service", DVFSMode_OfficialService), + }; - addConfigButton( - HocClkConfigValue_DVFSMode, - "GPU DVFS Mode", - ValueRange(0, 0, 1, "", 0), - "GPU DVFS Mode", - &thresholdsDisabled, - {}, - dvfsValues, - false - ); + addConfigButton(HocClkConfigValue_DVFSMode, "GPU DVFS Mode", ValueRange(0, 0, 1, "", 0), "GPU DVFS Mode", &thresholdsDisabled, {}, dvfsValues, + false); - addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); - } + addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, + dvfsOffset, false); - tsl::elm::ListItem* customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); + tsl::elm::ListItem *customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); customTableSubmenu->setClickListener([](u64 keys) { if (keys & HidNpadButton_A) { tsl::changeTo(); @@ -2059,152 +2123,106 @@ protected: }; class GpuCustomTableSubmenuGui : public MiscGui { -public: - GpuCustomTableSubmenuGui() { } + public: + GpuCustomTableSubmenuGui() { + } -protected: + protected: void listUI() override { - Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work + Result rc = hocclkIpcGetConfigValues(this->configList); // populate config list early otherwise wont work if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } - this->listElement->addItem(new tsl::elm::CategoryHeader("GPU Custom Table (mV)")); + this->listElement->addItem(new CompactCategoryHeader("GPU Custom Table (mV)")); ValueThresholds MgpuVmaxThresholds(800, 850); ValueThresholds EgpuVmaxThresholds(950, 975); std::vector mGpuVolts = { - NamedValue("Disabled", 2000), - NamedValue("Auto", 0), - NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), - NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), - NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), - NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), - NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), - NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), - NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), - NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), - NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), - NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), - NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), - NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), - NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), - NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), - NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), - NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), - NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), - NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), - NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), - NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), - NamedValue("810mV", 810), NamedValue("815mV", 815), NamedValue("820mV", 820), - NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), - NamedValue("840mV", 840), NamedValue("845mV", 845), NamedValue("850mV", 850), - NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), - NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), - NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), - NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), - NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), - NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), - NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), - NamedValue("960mV", 960), + NamedValue("Disabled", 2000), NamedValue("Auto", 0), NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), + NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), NamedValue("510mV", 510), NamedValue("515mV", 515), + NamedValue("520mV", 520), NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), NamedValue("540mV", 540), + NamedValue("545mV", 545), NamedValue("550mV", 550), NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), + NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), NamedValue("585mV", 585), NamedValue("590mV", 590), + NamedValue("595mV", 595), NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), NamedValue("615mV", 615), + NamedValue("620mV", 620), NamedValue("625mV", 625), NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), + NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), NamedValue("660mV", 660), NamedValue("665mV", 665), + NamedValue("670mV", 670), NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), NamedValue("690mV", 690), + NamedValue("695mV", 695), NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), + NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), + NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), + NamedValue("770mV", 770), NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), + NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), + NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), NamedValue("840mV", 840), + NamedValue("845mV", 845), NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), + NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), + NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), + NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), + NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), }; std::vector eGpuVolts = { - NamedValue("Disabled", 2000), - NamedValue("Auto", 0), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), - NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), - NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), - NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), - NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), - NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), - NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), - NamedValue("790mV", 790), NamedValue("795mV", 795), NamedValue("800mV", 800), - NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), - NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), - NamedValue("835mV", 835), NamedValue("840mV", 840), NamedValue("845mV", 845), - NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), - NamedValue("865mV", 865), NamedValue("870mV", 870), NamedValue("875mV", 875), - NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), - NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), - NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), - NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), - NamedValue("940mV", 940), NamedValue("945mV", 945), NamedValue("950mV", 950), - NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), - NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), - NamedValue("985mV", 985), NamedValue("990mV", 990), NamedValue("995mV", 995), + NamedValue("Disabled", 2000), NamedValue("Auto", 0), NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), + NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), + NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), + NamedValue("740mV", 740), NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), + NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), + NamedValue("790mV", 790), NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), + NamedValue("815mV", 815), NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), + NamedValue("840mV", 840), NamedValue("845mV", 845), NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), + NamedValue("865mV", 865), NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), + NamedValue("890mV", 890), NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), + NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), + NamedValue("940mV", 940), NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), + NamedValue("965mV", 965), NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), + NamedValue("990mV", 990), NamedValue("995mV", 995), }; std::vector mGpuVolts_noAuto = { - NamedValue("Disabled", 2000), - NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), - NamedValue("495mV", 495), NamedValue("500mV", 500), NamedValue("505mV", 505), - NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), - NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), - NamedValue("540mV", 540), NamedValue("545mV", 545), NamedValue("550mV", 550), - NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), - NamedValue("570mV", 570), NamedValue("575mV", 575), NamedValue("580mV", 580), - NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), - NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), - NamedValue("615mV", 615), NamedValue("620mV", 620), NamedValue("625mV", 625), - NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), - NamedValue("645mV", 645), NamedValue("650mV", 650), NamedValue("655mV", 655), - NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), - NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), - NamedValue("690mV", 690), NamedValue("695mV", 695), NamedValue("700mV", 700), - NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), - NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), - NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), - NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), - NamedValue("765mV", 765), NamedValue("770mV", 770), NamedValue("775mV", 775), - NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), - NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), - NamedValue("810mV", 810), NamedValue("815mV", 815), NamedValue("820mV", 820), - NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), - NamedValue("840mV", 840), NamedValue("845mV", 845), NamedValue("850mV", 850), - NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), - NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), - NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), - NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), - NamedValue("915mV", 915), NamedValue("920mV", 920), NamedValue("925mV", 925), - NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), - NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), - NamedValue("960mV", 960), + NamedValue("Disabled", 2000), NamedValue("480mV", 480), NamedValue("485mV", 485), NamedValue("490mV", 490), NamedValue("495mV", 495), + NamedValue("500mV", 500), NamedValue("505mV", 505), NamedValue("510mV", 510), NamedValue("515mV", 515), NamedValue("520mV", 520), + NamedValue("525mV", 525), NamedValue("530mV", 530), NamedValue("535mV", 535), NamedValue("540mV", 540), NamedValue("545mV", 545), + NamedValue("550mV", 550), NamedValue("555mV", 555), NamedValue("560mV", 560), NamedValue("565mV", 565), NamedValue("570mV", 570), + NamedValue("575mV", 575), NamedValue("580mV", 580), NamedValue("585mV", 585), NamedValue("590mV", 590), NamedValue("595mV", 595), + NamedValue("600mV", 600), NamedValue("605mV", 605), NamedValue("610mV", 610), NamedValue("615mV", 615), NamedValue("620mV", 620), + NamedValue("625mV", 625), NamedValue("630mV", 630), NamedValue("635mV", 635), NamedValue("640mV", 640), NamedValue("645mV", 645), + NamedValue("650mV", 650), NamedValue("655mV", 655), NamedValue("660mV", 660), NamedValue("665mV", 665), NamedValue("670mV", 670), + NamedValue("675mV", 675), NamedValue("680mV", 680), NamedValue("685mV", 685), NamedValue("690mV", 690), NamedValue("695mV", 695), + NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), NamedValue("720mV", 720), + NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), NamedValue("745mV", 745), + NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), + NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), NamedValue("795mV", 795), + NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), NamedValue("820mV", 820), + NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), NamedValue("840mV", 840), NamedValue("845mV", 845), + NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), NamedValue("870mV", 870), + NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), NamedValue("895mV", 895), + NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), + NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), NamedValue("945mV", 945), + NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), }; std::vector eGpuVolts_noAuto = { - NamedValue("Disabled", 2000), - NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), - NamedValue("715mV", 715), NamedValue("720mV", 720), NamedValue("725mV", 725), - NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), - NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), - NamedValue("760mV", 760), NamedValue("765mV", 765), NamedValue("770mV", 770), - NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), - NamedValue("790mV", 790), NamedValue("795mV", 795), NamedValue("800mV", 800), - NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), - NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), - NamedValue("835mV", 835), NamedValue("840mV", 840), NamedValue("845mV", 845), - NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), - NamedValue("865mV", 865), NamedValue("870mV", 870), NamedValue("875mV", 875), - NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), - NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), - NamedValue("910mV", 910), NamedValue("915mV", 915), NamedValue("920mV", 920), - NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), - NamedValue("940mV", 940), NamedValue("945mV", 945), NamedValue("950mV", 950), - NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), - NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), - NamedValue("985mV", 985), NamedValue("990mV", 990), NamedValue("995mV", 995), + NamedValue("Disabled", 2000), NamedValue("700mV", 700), NamedValue("705mV", 705), NamedValue("710mV", 710), NamedValue("715mV", 715), + NamedValue("720mV", 720), NamedValue("725mV", 725), NamedValue("730mV", 730), NamedValue("735mV", 735), NamedValue("740mV", 740), + NamedValue("745mV", 745), NamedValue("750mV", 750), NamedValue("755mV", 755), NamedValue("760mV", 760), NamedValue("765mV", 765), + NamedValue("770mV", 770), NamedValue("775mV", 775), NamedValue("780mV", 780), NamedValue("785mV", 785), NamedValue("790mV", 790), + NamedValue("795mV", 795), NamedValue("800mV", 800), NamedValue("805mV", 805), NamedValue("810mV", 810), NamedValue("815mV", 815), + NamedValue("820mV", 820), NamedValue("825mV", 825), NamedValue("830mV", 830), NamedValue("835mV", 835), NamedValue("840mV", 840), + NamedValue("845mV", 845), NamedValue("850mV", 850), NamedValue("855mV", 855), NamedValue("860mV", 860), NamedValue("865mV", 865), + NamedValue("870mV", 870), NamedValue("875mV", 875), NamedValue("880mV", 880), NamedValue("885mV", 885), NamedValue("890mV", 890), + NamedValue("895mV", 895), NamedValue("900mV", 900), NamedValue("905mV", 905), NamedValue("910mV", 910), NamedValue("915mV", 915), + NamedValue("920mV", 920), NamedValue("925mV", 925), NamedValue("930mV", 930), NamedValue("935mV", 935), NamedValue("940mV", 940), + NamedValue("945mV", 945), NamedValue("950mV", 950), NamedValue("955mV", 955), NamedValue("960mV", 960), NamedValue("965mV", 965), + NamedValue("970mV", 970), NamedValue("975mV", 975), NamedValue("980mV", 980), NamedValue("985mV", 985), NamedValue("990mV", 990), + NamedValue("995mV", 995), }; if (IsMariko()) { - tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Setting GPU Clocks past", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("1228MHz without a proper undervolt", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("can cause degradation or damage", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -2214,37 +2232,62 @@ protected: warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 130); this->listElement->addItem(warningText); - addConfigButton(KipConfigValue_g_volt_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - if(this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HiOPT15) - addConfigButton(KipConfigValue_g_volt_1152000, "1152.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - if(this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HighUV) { - addConfigButton(KipConfigValue_g_volt_1228800, "1228.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1267200, "1267.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1305600, "1305.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_1344000, "1344.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1382400, "1382.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1420800, "1420.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1459200, "1459.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1497600, "1497.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_1536000, "1536.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, false, + true); + addConfigButton(KipConfigValue_g_volt_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, mGpuVolts, + false, true); + if (this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_SLT) { + addConfigButton(KipConfigValue_g_volt_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + if (this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HiOPT) + addConfigButton(KipConfigValue_g_volt_1152000, "1152.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + if (this->configList->values[KipConfigValue_marikoGpuUV] >= GPUUVLevel_HighUV) { + addConfigButton(KipConfigValue_g_volt_1228800, "1228.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_1267200, "1267.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_1305600, "1305.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_1344000, "1344.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1382400, "1382.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1420800, "1420.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1459200, "1459.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1497600, "1497.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_1536000, "1536.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &MgpuVmaxThresholds, {}, + mGpuVolts_noAuto, false, true); + } } - } else { - tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + tsl::elm::CustomDrawer *warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { renderer->drawString("\uE150 Setting GPU Clocks past", false, x + 20, y + 30, 18, tsl::style::color::ColorText); renderer->drawString("921MHz without a proper undervolt", false, x + 20, y + 50, 18, tsl::style::color::ColorText); renderer->drawString("can cause degradation or damage", false, x + 20, y + 70, 18, tsl::style::color::ColorText); @@ -2254,48 +2297,71 @@ protected: warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 130); this->listElement->addItem(warningText); - addConfigButton(KipConfigValue_g_volt_e_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_115200, "115.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_192000, "192.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_268800, "268.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_345600, "345.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_422400, "422.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_499200, "499.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_576000, "576.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_652800, "652.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_729600, "729.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_806400, "806.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_883200, "883.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - if(this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_HiOPT15) - addConfigButton(KipConfigValue_g_volt_e_960000, "960.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - if(this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_HighUV) { - addConfigButton(KipConfigValue_g_volt_e_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, false, true); - addConfigButton(KipConfigValue_g_volt_e_1036800, "1036.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts_noAuto, false, true); - addConfigButton(KipConfigValue_g_volt_e_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_e_76800, "76.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_115200, "115.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_153600, "153.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_192000, "192.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_230400, "230.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_268800, "268.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_307200, "307.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_345600, "345.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_384000, "384.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_422400, "422.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_460800, "460.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_499200, "499.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_537600, "537.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_576000, "576.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_614400, "614.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_652800, "652.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_691200, "691.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_729600, "729.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_768000, "768.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_806400, "806.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_844800, "844.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_883200, "883.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + addConfigButton(KipConfigValue_g_volt_e_921600, "921.6MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, eGpuVolts, + false, true); + if (this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_SLT) + addConfigButton(KipConfigValue_g_volt_e_960000, "960.0MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts, false, true); + if (this->configList->values[KipConfigValue_eristaGpuUV] >= GPUUVLevel_HiOPT) { + addConfigButton(KipConfigValue_g_volt_e_998400, "998.4MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts, false, true); + addConfigButton(KipConfigValue_g_volt_e_1036800, "1036.8MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts_noAuto, false, true); + addConfigButton(KipConfigValue_g_volt_e_1075200, "1075.2MHz", ValueRange(0, 0, 0, "0", 1), "Voltage", &EgpuVmaxThresholds, {}, + eGpuVolts_noAuto, false, true); } } } }; - -static std::string getValueDisplayText(uint64_t currentValue, - const ValueRange& range, - const std::vector& namedValues) -{ +static std::string getValueDisplayText(uint64_t currentValue, const ValueRange &range, const std::vector &namedValues) { char valueText[32]; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { return namedValue.name; } @@ -2332,31 +2398,28 @@ void MiscGui::refresh() { constexpr HocClkConfigValue emcKeys[] = { KipConfigValue_marikoEmcMaxClock, KipConfigValue_eristaEmcMaxClock, - KipConfigValue_eristaEmcMaxClock1, - KipConfigValue_eristaEmcMaxClock2, }; for (auto key : emcKeys) { auto it = this->configNamedValues.find(key); if (it != this->configNamedValues.end()) { - for (auto& nv : it->second) - if(nv.name != "Disabled") + for (auto &nv : it->second) + if (nv.name != "Disabled") nv.name = formatMemClockKhzLabel(nv.value, unit); } } - for (const auto& [configVal, button] : this->configButtons) { + for (const auto &[configVal, button] : this->configButtons) { uint64_t currentValue = this->configList->values[configVal]; - const ValueRange& range = this->configRanges[configVal]; + const ValueRange &range = this->configRanges[configVal]; auto namedValuesIt = this->configNamedValues.find(configVal); - const std::vector& namedValues = (namedValuesIt != this->configNamedValues.end()) - ? namedValuesIt->second - : std::vector(); + const std::vector &namedValues = + (namedValuesIt != this->configNamedValues.end()) ? namedValuesIt->second : std::vector(); char valueText[32]; bool foundNamedValue = false; - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { if (currentValue == namedValue.value) { snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str()); foundNamedValue = true; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h index 43c5e2db..b795b3c1 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.h @@ -16,67 +16,51 @@ * */ #pragma once -#include "../../ipc.h" -#include "base_menu_gui.h" -#include #include -#include #include #include + +#include "../../ipc.h" +#include "base_menu_gui.h" #include "freq_choice_gui.h" -#include "value_choice_gui.h" #include "info_gui.h" -class MiscGui : public BaseMenuGui -{ -public: +#include "value_choice_gui.h" +#include +#include +class MiscGui : public BaseMenuGui { + public: MiscGui(); ~MiscGui(); void listUI() override; void refresh() override; -protected: - HocClkConfigValueList* configList; - std::map configButtons; + protected: + HocClkConfigValueList *configList; + std::map configButtons; std::map configRanges; std::map> configNamedValues; - std::map configToggles; - std::map>> configTrackbars; + std::map configToggles; + std::map>> configTrackbars; std::set configButtonSKeys; std::map configButtonSSubtext; std::set emcClockConfigs; - void addConfigToggle(HocClkConfigValue configVal, const char* altName, bool kip = false); - void addConfigTrackbar(HocClkConfigValue configVal, const char* altName, const ValueRange& range, bool kip = true); - void addMappedConfigTrackbar(HocClkConfigValue configVal, const char* altName, - std::vector vals, - std::initializer_list names, bool kip = true); - void addConfigButton(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true, - bool kip = false); + void addConfigToggle(HocClkConfigValue configVal, const char *altName, bool kip = false); + void addConfigTrackbar(HocClkConfigValue configVal, const char *altName, const ValueRange &range, bool kip = true); + void addMappedConfigTrackbar(HocClkConfigValue configVal, const char *altName, std::vector vals, std::initializer_list names, + bool kip = true); + void addConfigButton(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels = {}, + const std::vector &namedValues = {}, bool showDefaultValue = true, bool kip = false); - void addConfigButtonS(HocClkConfigValue configVal, - const char* altName, - const ValueRange& range, - const std::string& categoryName, - const ValueThresholds* thresholds, - const std::map& labels = {}, - const std::vector& namedValues = {}, - bool showDefaultValue = true, - const char* subText = nullptr, - bool kip = false); - void addFreqButton(HocClkConfigValue configVal, - const char* altName, - HocClkModule module, - const std::map& labels = {}); + void addConfigButtonS(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName, + const ValueThresholds *thresholds, const std::map &labels = {}, + const std::vector &namedValues = {}, bool showDefaultValue = true, const char *subText = nullptr, + bool kip = false); + void addFreqButton(HocClkConfigValue configVal, const char *altName, HocClkModule module, const std::map &labels = {}); void updateConfigToggles(); - tsl::elm::ToggleListItem* enabledToggle; + tsl::elm::ToggleListItem *enabledToggle; u8 frameCounter = 60; bool shouldSaveKip = false; }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h b/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h index e0b1fd4a..0a26bd73 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h +++ b/Source/hoc-clk/overlay/src/ui/gui/ult_ext.h @@ -12,40 +12,62 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include +#include "../elements/base_frame.h" + + +class TopAnchoredList : public tsl::elm::List { + public: + TopAnchoredList() { + m_hasSetInitialFocusHack = true; + } +}; +class BoxClippedList : public tsl::elm::List { + public: + void draw(tsl::gfx::Renderer *renderer) override { + renderer->enableScissoring(0, HOC_BOX_BOTTOM, tsl::cfg::FramebufferWidth, tsl::cfg::FramebufferHeight - HOC_BOX_BOTTOM); + tsl::elm::List::draw(renderer); + renderer->disableScissoring(); + } +}; + +class CompactCategoryHeader : public tsl::elm::CategoryHeader { + public: + CompactCategoryHeader(const std::string &text) : tsl::elm::CategoryHeader(text) { + } + void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { + this->setBoundaries(this->getX(), this->getY(), this->getWidth(), 33); + } +}; + class ImageElement : public tsl::elm::ListItem { -private: - const uint8_t* imgData; + private: + const uint8_t *imgData; uint32_t imgWidth, imgHeight; bool visible; - -public: - ImageElement(const uint8_t* data, uint32_t w, uint32_t h) - : tsl::elm::ListItem(""), imgData(data), imgWidth(w), imgHeight(h), visible(true) {} - + + public: + ImageElement(const uint8_t *data, uint32_t w, uint32_t h) : tsl::elm::ListItem(""), imgData(data), imgWidth(w), imgHeight(h), visible(true) { + } + void setVisible(bool v) { visible = v; } - + virtual void draw(tsl::gfx::Renderer *renderer) override { - if (!visible) return; - + if (!visible) + return; + // Draw image centered horizontally u16 centerX = this->getX() + (this->getWidth() - imgWidth) / 2; - renderer->drawBitmap( - centerX, - this->getY() + 10, - imgWidth, - imgHeight, - imgData - ); + renderer->drawBitmap(centerX, this->getY() + 10, imgWidth, imgHeight, imgData); } - + virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { if (!visible) { // Take up no space when hidden @@ -55,37 +77,38 @@ public: tsl::elm::ListItem::layout(parentX, parentY, parentWidth, parentHeight); } } - + virtual void drawHighlight(tsl::gfx::Renderer *renderer) override { // Do nothing - no highlight } - + virtual bool onClick(u64 keys) override { - return false; // Non-clickable + return false; // Non-clickable } - - virtual Element* requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { - return nullptr; // Make it non-focusable + + virtual Element *requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { + return nullptr; // Make it non-focusable } }; class HideableCategoryHeader : public tsl::elm::CategoryHeader { -private: + private: bool visible; - -public: - HideableCategoryHeader(const std::string& title) - : tsl::elm::CategoryHeader(title), visible(true) {} - + + public: + HideableCategoryHeader(const std::string &title) : tsl::elm::CategoryHeader(title), visible(true) { + } + void setVisible(bool v) { visible = v; } - + virtual void draw(tsl::gfx::Renderer *renderer) override { - if (!visible) return; + if (!visible) + return; tsl::elm::CategoryHeader::draw(renderer); } - + virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { if (!visible) { this->setBoundaries(parentX, parentY, 0, 0); @@ -96,34 +119,34 @@ public: }; class FocusableDrawer : public tsl::elm::CustomDrawer { -public: - template - FocusableDrawer(Args&&... args) : tsl::elm::CustomDrawer(std::forward(args)...) { + public: + template FocusableDrawer(Args &&...args) : tsl::elm::CustomDrawer(std::forward(args)...) { m_isItem = true; } - Element* requestFocus(Element*, tsl::FocusDirection) override { + Element *requestFocus(Element *, tsl::FocusDirection) override { return this; } - void drawHighlight(tsl::gfx::Renderer*) override {} + void drawHighlight(tsl::gfx::Renderer *) override { + } }; class HideableCustomDrawer : public tsl::elm::Element { -private: + private: bool visible; u32 height; - -public: - HideableCustomDrawer(u32 h) - : Element(), visible(true), height(h) {} - + + public: + HideableCustomDrawer(u32 h) : Element(), visible(true), height(h) { + } + void setVisible(bool v) { visible = v; } - + virtual void draw(tsl::gfx::Renderer *renderer) override { // Empty drawer - just for spacing } - + virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override { if (!visible) { this->setBoundaries(parentX, parentY, 0, 0); @@ -131,8 +154,8 @@ public: this->setBoundaries(parentX, parentY, parentWidth, height); } } - - virtual Element* requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { + + virtual Element *requestFocus(Element *oldFocus, tsl::FocusDirection direction) override { return nullptr; } }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp index 9b8d6265..1131a410 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.cpp @@ -16,43 +16,27 @@ * along with this program. If not, see . * */ -#include "value_choice_gui.h" +#include +#include + #include "../format.h" #include "fatal_gui.h" -#include -#include +#include "ult_ext.h" +#include "value_choice_gui.h" -ValueChoiceGui::ValueChoiceGui(std::uint32_t selectedValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds, - bool enableThresholds, - std::map labels, - std::vector namedValues, - bool showDefaultValue, - bool showDNO) - : selectedValue(selectedValue), - range(range), - categoryName(categoryName), - listener(listener), - thresholds(thresholds), - enableThresholds(enableThresholds), - labels(labels), - namedValues(namedValues), - showDefaultValue(showDefaultValue), - showDNO(showDNO) -{ +ValueChoiceGui::ValueChoiceGui(std::uint32_t selectedValue, const ValueRange &range, const std::string &categoryName, ValueChoiceListener listener, + const ValueThresholds &thresholds, bool enableThresholds, std::map labels, + std::vector namedValues, bool showDefaultValue, bool showDNO) + : selectedValue(selectedValue), range(range), categoryName(categoryName), listener(listener), thresholds(thresholds), + enableThresholds(enableThresholds), labels(labels), namedValues(namedValues), showDefaultValue(showDefaultValue), showDNO(showDNO) { } -ValueChoiceGui::~ValueChoiceGui() -{ +ValueChoiceGui::~ValueChoiceGui() { } -std::string ValueChoiceGui::formatValue(std::uint32_t value) -{ +std::string ValueChoiceGui::formatValue(std::uint32_t value) { std::ostringstream oss; - if(showDefaultValue) { + if (showDefaultValue) { if (value == 0) { return this->showDNO ? FREQ_DEFAULT_TEXT : VALUE_DEFAULT_TEXT; } @@ -65,12 +49,11 @@ std::string ValueChoiceGui::formatValue(std::uint32_t value) return oss.str(); } -int ValueChoiceGui::getSafetyLevel(std::uint32_t value) -{ - if(thresholds.warning == 0 && thresholds.danger == 0) { +int ValueChoiceGui::getSafetyLevel(std::uint32_t value) { + if (thresholds.warning == 0 && thresholds.danger == 0) { return 0; } - + if (value > thresholds.danger) { return 2; } @@ -80,8 +63,7 @@ int ValueChoiceGui::getSafetyLevel(std::uint32_t value) return 0; } -tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, bool selected, int safety) -{ +tsl::elm::ListItem *ValueChoiceGui::createValueListItem(std::uint32_t value, bool selected, int safety) { std::string text = formatValue(value); std::string rightText = ""; @@ -91,34 +73,32 @@ tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, boo } if (selected) { - const_cast(rightText) = "\uE14B"; + const_cast(rightText) = "\uE14B"; } - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(text, rightText, false); - switch (safety) - { - case 0: - listItem->setTextColor(tsl::Color(255, 255, 255, 255)); - listItem->setValueColor(tsl::Color(255, 255, 255, 255)); - break; - case 1: - listItem->setTextColor(tsl::Color(255, 165, 0, 255)); - listItem->setValueColor(tsl::Color(255, 165, 0, 255)); - break; - case 2: - listItem->setTextColor(tsl::Color(255, 0, 0, 255)); - listItem->setValueColor(tsl::Color(255, 0, 0, 255)); - break; + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, rightText, false); + switch (safety) { + case 0: + listItem->setTextColor(tsl::Color(255, 255, 255, 255)); + listItem->setValueColor(tsl::Color(255, 255, 255, 255)); + break; + case 1: + listItem->setTextColor(tsl::Color(255, 165, 0, 255)); + listItem->setValueColor(tsl::Color(255, 165, 0, 255)); + break; + case 2: + listItem->setTextColor(tsl::Color(255, 0, 0, 255)); + listItem->setValueColor(tsl::Color(255, 0, 0, 255)); + break; } // Make annotation grey if (!rightText.empty() && !selected) listItem->setValueColor(tsl::Color(180, 180, 180, 255)); - else if(selected) - listItem->setValueColor(tsl::infoTextColor); - - listItem->setClickListener([this, value](u64 keys) - { + else if (selected) + listItem->setValueColor(tsl::infoTextColor); + + listItem->setClickListener([this, value](u64 keys) { if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) { if (this->listener(value)) { tsl::goBack(); @@ -130,37 +110,34 @@ tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, boo return listItem; } -tsl::elm::ListItem* ValueChoiceGui::createNamedValueListItem(const NamedValue& namedValue, bool selected, int safety) -{ +tsl::elm::ListItem *ValueChoiceGui::createNamedValueListItem(const NamedValue &namedValue, bool selected, int safety) { std::string text = namedValue.name; if (selected) { - const_cast(namedValue.rightText) = "\uE14B"; + const_cast(namedValue.rightText) = "\uE14B"; } - - tsl::elm::ListItem* listItem = new tsl::elm::ListItem(text, namedValue.rightText, false); - switch (safety) - { - case 0: - listItem->setTextColor(tsl::Color(255, 255, 255, 255)); - listItem->setValueColor(tsl::Color(255, 255, 255, 255)); - break; - case 1: - listItem->setTextColor(tsl::Color(255, 165, 0, 255)); - listItem->setValueColor(tsl::Color(255, 165, 0, 255)); - break; - case 2: - listItem->setTextColor(tsl::Color(255, 0, 0, 255)); - listItem->setValueColor(tsl::Color(255, 0, 0, 255)); - break; + + tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, namedValue.rightText, false); + switch (safety) { + case 0: + listItem->setTextColor(tsl::Color(255, 255, 255, 255)); + listItem->setValueColor(tsl::Color(255, 255, 255, 255)); + break; + case 1: + listItem->setTextColor(tsl::Color(255, 165, 0, 255)); + listItem->setValueColor(tsl::Color(255, 165, 0, 255)); + break; + case 2: + listItem->setTextColor(tsl::Color(255, 0, 0, 255)); + listItem->setValueColor(tsl::Color(255, 0, 0, 255)); + break; } if (!namedValue.rightText.empty() && !selected) listItem->setValueColor(tsl::Color(180, 180, 180, 255)); - else if(selected) - listItem->setValueColor(tsl::infoTextColor); + else if (selected) + listItem->setValueColor(tsl::infoTextColor); - listItem->setClickListener([this, value = namedValue.value](u64 keys) - { + listItem->setClickListener([this, value = namedValue.value](u64 keys) { if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) { if (this->listener(value)) { tsl::goBack(); @@ -172,8 +149,7 @@ tsl::elm::ListItem* ValueChoiceGui::createNamedValueListItem(const NamedValue& n return listItem; } -void ValueChoiceGui::listUI() -{ +void ValueChoiceGui::listUI() { if (!categoryName.empty()) { this->listElement->addItem(new tsl::elm::CategoryHeader(categoryName)); } @@ -181,20 +157,19 @@ void ValueChoiceGui::listUI() if (showDefaultValue) { this->listElement->addItem(this->createValueListItem(0, this->selectedValue == 0, 0)); } - for (const auto& namedValue : namedValues) { + for (const auto &namedValue : namedValues) { int safety = enableThresholds ? getSafetyLevel(namedValue.value) : 0; bool selected = (namedValue.value == this->selectedValue); this->listElement->addItem(this->createNamedValueListItem(namedValue, selected, safety)); } - + if (namedValues.empty()) { - for (std::uint32_t value = range.min; value <= range.max; value += range.step) - { + for (std::uint32_t value = range.min; value <= range.max; value += range.step) { int safety = getSafetyLevel(value); bool selected = (value == this->selectedValue); this->listElement->addItem(this->createValueListItem(value, selected, safety)); } } - + this->listElement->jumpToItem("", "\uE14B"); } \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h index 49c7883d..4aeaf05e 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h +++ b/Source/hoc-clk/overlay/src/ui/gui/value_choice_gui.h @@ -17,11 +17,12 @@ * */ #pragma once -#include #include -#include +#include #include +#include #include + #include "base_menu_gui.h" using ValueChoiceListener = std::function; @@ -34,33 +35,32 @@ struct ValueRange { std::string suffix; std::uint32_t divisor; int decimalPlaces; - ValueRange() - : min(0), max(0), step(1), suffix(""), divisor(1), decimalPlaces(0) {} - ValueRange(std::uint32_t min, std::uint32_t max, std::uint32_t step, - const std::string& suffix = "", std::uint32_t divisor = 1, int decimalPlaces = 0) - : min(min), max(max), step(step), suffix(suffix), - divisor(divisor), decimalPlaces(decimalPlaces) {} + ValueRange() : min(0), max(0), step(1), suffix(""), divisor(1), decimalPlaces(0) { + } + ValueRange(std::uint32_t min, std::uint32_t max, std::uint32_t step, const std::string &suffix = "", std::uint32_t divisor = 1, + int decimalPlaces = 0) + : min(min), max(max), step(step), suffix(suffix), divisor(divisor), decimalPlaces(decimalPlaces) { + } }; struct ValueThresholds { std::uint32_t warning; std::uint32_t danger; - ValueThresholds(std::uint32_t warning = 0, std::uint32_t danger = 0) - : warning(warning), danger(danger) {} + ValueThresholds(std::uint32_t warning = 0, std::uint32_t danger = 0) : warning(warning), danger(danger) { + } }; struct NamedValue { std::string name; std::uint32_t value; std::string rightText; - - NamedValue(const std::string& name, std::uint32_t value, const std::string& rightText = "") - : name(name), value(value), rightText(rightText) {} + + NamedValue(const std::string &name, std::uint32_t value, const std::string &rightText = "") : name(name), value(value), rightText(rightText) { + } }; -class ValueChoiceGui : public BaseMenuGui -{ -protected: +class ValueChoiceGui : public BaseMenuGui { + protected: std::uint32_t selectedValue; ValueRange range; std::string categoryName; @@ -68,47 +68,37 @@ protected: ValueThresholds thresholds; bool enableThresholds; std::map labels; - + std::vector namedValues; bool showDefaultValue = true; bool showDNO = false; - tsl::elm::ListItem* createValueListItem(std::uint32_t value, bool selected, int safety); - tsl::elm::ListItem* createNamedValueListItem(const NamedValue& namedValue, bool selected, int safety); + tsl::elm::ListItem *createValueListItem(std::uint32_t value, bool selected, int safety); + tsl::elm::ListItem *createNamedValueListItem(const NamedValue &namedValue, bool selected, int safety); std::string formatValue(std::uint32_t value); int getSafetyLevel(std::uint32_t value); - -public: - ValueChoiceGui(std::uint32_t selectedValue, - const ValueRange& range, - const std::string& categoryName, - ValueChoiceListener listener, - const ValueThresholds& thresholds = ValueThresholds(), - bool enableThresholds = false, - std::map labels = {}, - std::vector namedValues = {}, - bool showDefaultValue = true, + + public: + ValueChoiceGui(std::uint32_t selectedValue, const ValueRange &range, const std::string &categoryName, ValueChoiceListener listener, + const ValueThresholds &thresholds = ValueThresholds(), bool enableThresholds = false, + std::map labels = {}, std::vector namedValues = {}, bool showDefaultValue = true, bool showDNO = false); ~ValueChoiceGui(); - - void addNamedValue(const std::string& name, std::uint32_t value, const std::string& rightText = "") - { + + void addNamedValue(const std::string &name, std::uint32_t value, const std::string &rightText = "") { namedValues.emplace_back(name, value, rightText); } - - void addNamedValues(const std::vector& values) - { + + void addNamedValues(const std::vector &values) { namedValues.insert(namedValues.end(), values.begin(), values.end()); } - - void clearNamedValues() - { + + void clearNamedValues() { namedValues.clear(); } - - void setShowDefaultValue(bool show) - { + + void setShowDefaultValue(bool show) { showDefaultValue = show; } - + void listUI() override; }; \ No newline at end of file diff --git a/Source/hoc-clk/overlay/src/ui/style.h b/Source/hoc-clk/overlay/src/ui/style.h index 45692881..2c718ac9 100644 --- a/Source/hoc-clk/overlay/src/ui/style.h +++ b/Source/hoc-clk/overlay/src/ui/style.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,7 +24,6 @@ * -------------------------------------------------------------------------- */ - #pragma once #include diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 1c321b18..5de73e07 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -24,31 +24,32 @@ * -------------------------------------------------------------------------- */ -#include "../hos/apm_ext.h" -#include -#include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include #include #include -#include -#include "../display/display_refresh_rate.hpp" -#include +#include +#include +#include +#include "../display/display_refresh_rate.hpp" +#include "../file/file_utils.hpp" +#include "../hos/apm_ext.h" +#include "../hos/integrations.hpp" +#include "../hos/rgltr.h" +#include "../tsensor/aotag.hpp" +#include "../tsensor/soctherm.hpp" #include "board.hpp" #include "board_fuse.hpp" #include "board_load.hpp" -#include "board_volt.hpp" #include "board_misc.hpp" -#include "../tsensor/soctherm.hpp" -#include "../tsensor/aotag.hpp" -#include "../hos/integrations.hpp" -#include "../file/file_utils.hpp" -#include "../hos/rgltr.h" +#include "board_volt.hpp" +#include +#include + namespace board { u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -62,26 +63,25 @@ namespace board { u32 fd = 0, fd2 = 0; - #define PMC_BASE 0x7000E400 - #define APB_MISC_GP_HIDREV 0x804 - #define GP_HIDREV_MAJOR_T210 0x1 - #define GP_HIDREV_MAJOR_T210B01 0x2 - #define APB_BASE 0x70000000 - #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) - #define FUSE_OFFSET 0x800 +#define PMC_BASE 0x7000E400 +#define APB_MISC_GP_HIDREV 0x804 +#define GP_HIDREV_MAJOR_T210 0x1 +#define GP_HIDREV_MAJOR_T210B01 0x2 +#define APB_BASE 0x70000000 +#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) +#define FUSE_OFFSET 0x800 void FetchHardwareInfos() { ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); - u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV); + u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV); if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) { gSocType = HocClkSocType_Mariko; - CacheGpuVoltTable(); } else { gSocType = HocClkSocType_Erista; } - u32 odm4 = *(u32*)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4)); + u32 odm4 = *(u32 *)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4)); if (gSocType == HocClkSocType_Mariko) { switch ((odm4 & 0xF0000) >> 16) { @@ -124,7 +124,7 @@ namespace board { rc = psmInitialize(); ASSERT_RESULT_OK(rc, "psmInitialize"); - if(HOSSVC_HAS_TC) { + if (HOSSVC_HAS_TC) { rc = tcInitialize(); ASSERT_RESULT_OK(rc, "tcInitialize"); } @@ -171,7 +171,7 @@ namespace board { batteryInfoInitialize(); - tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG + tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG // PMC exosphere check SecmonArgs args = {}; @@ -179,21 +179,25 @@ namespace board { args.X[1] = PMC_BASE; svcCallSecureMonitor(&args); - if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed + if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed tsensor::InitializeAotag(GetSocType() == HocClkSocType_Mariko); } Result pwmCheck = 1; - if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { + if (hosversionAtLeast(6, 0, 0) && R_SUCCEEDED(pwmInitialize())) { pwmCheck = pwmOpenSession2(&iCon, 0x3D000001); } StartMiscThread(pwmCheck, &iCon); - display::DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr, .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), .isRetroSUPER = integrations::GetRETROSuperStatus()}; + display::DisplayRefreshConfig cfg = { .clkVirtAddr = clkVirtAddr, + .dsiVirtAddr = dsiVirtAddr, + .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), + .isRetroSUPER = integrations::GetRETROSuperStatus() }; display::Initialize(&cfg); CacheDfllData(); + CacheGpuVoltTable(); } void Exit() { @@ -243,7 +247,7 @@ namespace board { args.X[1] = MC_REGISTER_BASE + MC_EMEM_CFG_0; svcCallSecureMonitor(&args); - if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed + if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed notification::writeNotification("Horizon OC\nSecmon-Lesen fehlgeschlagen!\nDies könnte ein Hardwareproblem sein!"); return false; } @@ -270,4 +274,4 @@ namespace board { return false; /* stub for now. */ } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 266f87db..453d5fa0 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -26,18 +26,20 @@ #pragma once -#include #include +#include + +#include "../mapping/mem_map.hpp" +#include "board_freq.hpp" #include "board_fuse.hpp" #include "board_load.hpp" #include "board_name.hpp" -#include "board_freq.hpp" +#include "board_profile.hpp" #include "board_sensor.hpp" #include "board_volt.hpp" -#include "board_profile.hpp" -#include "../mapping/mem_map.hpp" -#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0)) -#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0)) + +#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8, 0, 0)) +#define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0)) namespace board { extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr; @@ -46,7 +48,7 @@ namespace board { extern HocClkConsoleType gConsoleType; extern FuseData fuseData; extern u8 speedoBracket; - + void Initialize(); void Exit(); HocClkSocType GetSocType(); @@ -58,4 +60,4 @@ namespace board { FuseData *GetFuseData(); bool IsUsingRetroSuperDisplay(); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 7e1c0d48..8386d8ef 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -24,27 +24,32 @@ * -------------------------------------------------------------------------- */ -#include #include -#include "../hos/apm_ext.h" #include -#include "../i2c/i2cDrv.h" -#include #include +#include +#include #include -#include -#include + #include "../display/display_refresh_rate.hpp" +#include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../hos/apm_ext.h" +#include "../i2c/i2cDrv.h" +#include "../soc/gm20b.hpp" +#include "../soc/pllmb.hpp" #include "board.hpp" #include "board_name.hpp" -#include "../file/errors.hpp" -#include "../soc/pllmb.hpp" -#include "../file/config.hpp" -#include "../soc/gm20b.hpp" -#include "../file/config.hpp" +#include +#include + namespace board { - #define MIDDLE_FREQ_TABLE_START_POINT 1228800000 static u32 currentInjectedHz = 0; + static u32 gMarikoGm20bCutoff = 1228800000; + + void SetMarikoGm20bCutoff(u32 hz) { + gMarikoGm20bCutoff = hz; + } PcvModule GetPcvModule(HocClkModule hocclkModule) { switch (hocclkModule) { case HocClkModule_CPU: @@ -76,12 +81,12 @@ namespace board { ASSERT_RESULT_OK(pcvSetClockRate(moduleID, hz), "pcvSetClockRate"); } - void HandleCpuUv() - { + void HandleCpuUv() { if (board::GetSocType() == HocClkSocType_Erista) - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); } void SetHz(HocClkModule module, u32 hz) { @@ -97,7 +102,8 @@ namespace board { return; } - bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) && hz < MIDDLE_FREQ_TABLE_START_POINT; + bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) && + hz < gMarikoGm20bCutoff; u32 pcvHz = useGm20b ? ((hz + 76800000 - 1) / 76800000) * 76800000 : hz; @@ -125,7 +131,7 @@ namespace board { PcvSetHz(GetPcvModule(module), pcvHz); } } - if(config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) { + if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) { HandleCpuUv(); } if (useGm20b) { @@ -177,7 +183,9 @@ namespace board { case HocClkModule_GPU: return t210ClkGpuFreq(); case HocClkModule_MEM: - return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB() : t210ClkMemFreq(); + return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL + ? pllmb::getRamClockRatePLLMB() + : t210ClkMemFreq(); case HocClkModule_Display: return GetDisplayRate(hz); default: @@ -193,7 +201,6 @@ namespace board { s32 tmpInMaxCount = maxCount; s32 tmpOutCount = 0; - if (HOSSVC_HAS_CLKRST) { ClkrstSession session = {}; @@ -226,20 +233,20 @@ namespace board { void ResetToStock() { Result rc; - if (hosversionAtLeast(9,0,0)) { + if (hosversionAtLeast(9, 0, 0)) { std::uint32_t confId = 0; rc = apmExtGetCurrentPerformanceConfiguration(&confId); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); - HocClkApmConfiguration* apmConfiguration = nullptr; + HocClkApmConfiguration *apmConfiguration = nullptr; for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) { - if(hocclk_g_apm_configurations[i].id == confId) { + if (hocclk_g_apm_configurations[i].id == confId) { apmConfiguration = &hocclk_g_apm_configurations[i]; break; } } - if(!apmConfiguration) { + if (!apmConfiguration) { ERROR_THROW("Unknown apm configuration: %x", confId); } @@ -259,4 +266,4 @@ namespace board { void ResetToStockDisplay() { display::SetRate(60); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp index dae4007a..fa774cbe 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.hpp @@ -25,32 +25,34 @@ */ #pragma once -#include #include -#include "../hos/apm_ext.h" #include -#include #include +#include +#include #include + +#include "../file/errors.hpp" +#include "../hos/apm_ext.h" #include #include -#include "../file/errors.hpp" + namespace board { void SetHz(HocClkModule module, u32 hz); + void SetMarikoGm20bCutoff(u32 hz); u32 GetHz(HocClkModule module); u32 GetRealHz(HocClkModule module); void GetFreqList(HocClkModule module, u32 *outList, u32 maxCount, u32 *outCount); u32 GetHighestDockedDisplayRate(); void HandleCpuUv(); - + void ResetToStock(); void ResetToStockDisplay(); - template - void ResetToStockModule(Getter getHzFunc, HocClkModule module) { + template void ResetToStockModule(Getter getHzFunc, HocClkModule module) { Result rc = 0; if (hosversionAtLeast(9, 0, 0)) { @@ -58,7 +60,7 @@ namespace board { rc = apmExtGetCurrentPerformanceConfiguration(&confId); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); - HocClkApmConfiguration* apmConfiguration = nullptr; + HocClkApmConfiguration *apmConfiguration = nullptr; for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) { if (hocclk_g_apm_configurations[i].id == confId) { @@ -83,15 +85,15 @@ namespace board { } inline void ResetToStockCpu() { - ResetToStockModule([](const HocClkApmConfiguration& cfg) {return cfg.cpu_hz; }, HocClkModule_CPU); + ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.cpu_hz; }, HocClkModule_CPU); } inline void ResetToStockGpu() { - ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.gpu_hz; }, HocClkModule_GPU); + ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.gpu_hz; }, HocClkModule_GPU); } inline void ResetToStockMem() { - ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.mem_hz; }, HocClkModule_MEM); + ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.mem_hz; }, HocClkModule_MEM); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index d1e9c2bb..9a92e186 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -15,31 +15,54 @@ * */ -#include -#include -#include "board_fuse.hpp" #include +#include +#include + +#include "board.hpp" +#include "board_fuse.hpp" + namespace board { void SetGpuBracket(u16 speedo, u8 &gpuBracket) { - if (speedo <= 1624) { - gpuBracket = 0; - return; - } + if (GetSocType() == HocClkSocType_Mariko) { + if (speedo <= 1624) { + gpuBracket = 0; + return; + } - if (speedo <= 1689) { - gpuBracket = 1; - return; - } + if (speedo <= 1689) { + gpuBracket = 1; + return; + } - if (speedo <= 1753) { - gpuBracket = 2; - return; - } + if (speedo <= 1753) { + gpuBracket = 2; + return; + } - /* >= 1754 */ - gpuBracket = 3; + /* >= 1754 */ + gpuBracket = 3; + } else { + switch (speedo) { + case 1850 ... 1925: + gpuBracket = 0; + break; + case 1926 ... 2025: + gpuBracket = 1; + break; + case 2026 ... 2100: + gpuBracket = 2; + break; + case 2101 ... 2200: + gpuBracket = 3; + break; + default: + gpuBracket = 0; + break; + } + } } void ReadFuses(FuseData &speedo, u64 fuseVa) { @@ -49,12 +72,12 @@ namespace board { speedo.cpuSpeedo = *reinterpret_cast(fusePtr + FUSE_CPU_SPEEDO_0_CALIB); speedo.gpuSpeedo = *reinterpret_cast(fusePtr + FUSE_CPU_SPEEDO_2_CALIB); speedo.socSpeedo = *reinterpret_cast(fusePtr + FUSE_SOC_SPEEDO_0_CALIB); - speedo.cpuIDDQ = *reinterpret_cast(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4; - speedo.gpuIDDQ = *reinterpret_cast(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5; - speedo.socIDDQ = *reinterpret_cast(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4; - speedo.waferX = *reinterpret_cast(fusePtr + FUSE_OPT_X_COORDINATE); - speedo.waferY = *reinterpret_cast(fusePtr + FUSE_OPT_Y_COORDINATE); - speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX; + speedo.cpuIDDQ = *reinterpret_cast(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4; + speedo.gpuIDDQ = *reinterpret_cast(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5; + speedo.socIDDQ = *reinterpret_cast(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4; + speedo.waferX = *reinterpret_cast(fusePtr + FUSE_OPT_X_COORDINATE); + speedo.waferY = *reinterpret_cast(fusePtr + FUSE_OPT_Y_COORDINATE); + speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp index 4acb11b2..5d81f835 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp @@ -37,4 +37,4 @@ namespace board { void ReadFuses(FuseData &speedo, u64 fuseVa); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.cpp b/Source/hoc-clk/sysmodule/src/board/board_load.cpp index 8428b62a..bf814453 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.cpp @@ -24,22 +24,24 @@ * -------------------------------------------------------------------------- */ -#include +#include +#include #include -#include "../hos/apm_ext.h" #include -#include +#include #include +#include +#include +#include +#include #include + +#include "../hos/apm_ext.h" +#include "board.hpp" +#include "board_misc.hpp" #include #include -#include -#include -#include -#include -#include -#include "board_misc.hpp" -#include "board.hpp" + namespace board { @@ -61,23 +63,24 @@ namespace board { constexpr double Systemtickfrequency = 19200000.0 * (static_cast(CpuTimeOutNs) / 1'000'000'000.0); void GpuLoadThread(void *ptr) { - #define gpu_samples_average 8 - #define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715 - uint32_t gpu_load_array[gpu_samples_average] = {0}; +#define gpu_samples_average 8 +#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715 + uint32_t gpu_load_array[gpu_samples_average] = { 0 }; size_t i = 0; - if (R_SUCCEEDED(nvCheck_load)) do { - u32 temp; - if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) { - gpu_load_array[i++ % gpu_samples_average] = temp; - gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; - } - svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) - } while(true); + if (R_SUCCEEDED(nvCheck_load)) + do { + u32 temp; + if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) { + gpu_load_array[i++ % gpu_samples_average] = temp; + gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average; + } + svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate) + } while (true); } void CheckCore(void *idletickPtr) { - u64* idletick = static_cast(idletickPtr); - while(true) { + u64 *idletick = static_cast(idletickPtr); + while (true) { u64 idletickA; u64 idletickB; svcGetInfo(&idletickB, InfoType_IdleTickCount, INVALID_HANDLE, -1); @@ -107,11 +110,11 @@ namespace board { float cpuUsage0 = std::clamp(((Systemtickfrequency - idletick0) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); float cpuUsage1 = std::clamp(((Systemtickfrequency - idletick1) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); float cpuUsage2 = std::clamp(((Systemtickfrequency - idletick2) / static_cast(Systemtickfrequency)) * 1000.0, 0.0, 1000.0); - return std::round(std::max({cpuUsage0, cpuUsage1, cpuUsage2})); + return std::round(std::max({ cpuUsage0, cpuUsage1, cpuUsage2 })); } u32 GetPartLoad(HocClkPartLoad loadSource) { - switch(loadSource) { + switch (loadSource) { case HocClkPartLoad_EMC: return t210EmcLoadAll(); case HocClkPartLoad_EMCCpu: @@ -148,9 +151,9 @@ namespace board { } namespace { - constexpr u32 NVschedCtrlEnable = 0x00000601; + constexpr u32 NVschedCtrlEnable = 0x00000601; constexpr u32 NVschedCtrlDisable = 0x00000602; - } + } // namespace void SetGpuSchedulingMode(GpuSchedulingMode mode, GpuSchedulingOverrideMethod method) { if (R_FAILED(nvCheckSched) && method == GpuSchedulingOverrideMethod_NvService) { @@ -160,7 +163,8 @@ namespace board { u32 temp; bool enabled = false; switch (mode) { - case GpuSchedulingMode_DoNotOverride: break; + case GpuSchedulingMode_DoNotOverride: + break; case GpuSchedulingMode_Disabled: if (method == GpuSchedulingOverrideMethod_NvService) { nvIoctl(_fd2, NVschedCtrlDisable, &temp); @@ -198,4 +202,4 @@ namespace board { nvCheckSched = nvSched; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_load.hpp b/Source/hoc-clk/sysmodule/src/board/board_load.hpp index 2b039787..d742d4cb 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_load.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_load.hpp @@ -25,8 +25,9 @@ */ #pragma once -#include #include +#include + namespace board { @@ -37,4 +38,4 @@ namespace board { void SchedSetFD2(u32 fd2); void NvSchedSucceed(Result nvSched); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp index d7402d9a..b2315cf1 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp @@ -24,9 +24,9 @@ * -------------------------------------------------------------------------- */ -#include -#include #include +#include +#include namespace board { @@ -68,4 +68,4 @@ namespace board { threadClose(&miscThread); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.hpp b/Source/hoc-clk/sysmodule/src/board/board_misc.hpp index 666535c9..05521dc9 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.hpp @@ -26,9 +26,9 @@ #pragma once -#include #include #include +#include namespace board { @@ -36,4 +36,4 @@ namespace board { void ExitMiscThread(); u8 GetFanLevel(); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_name.cpp b/Source/hoc-clk/sysmodule/src/board/board_name.cpp index 45c0497d..b390edc9 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_name.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_name.cpp @@ -24,8 +24,9 @@ * -------------------------------------------------------------------------- */ -#include #include +#include + #include "board.hpp" namespace board { @@ -50,4 +51,4 @@ namespace board { return hocclkFormatPowerSensor(sensor, pretty); } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_name.hpp b/Source/hoc-clk/sysmodule/src/board/board_name.hpp index 591bd763..26a88cd0 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_name.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_name.hpp @@ -25,8 +25,8 @@ */ #pragma once -#include #include +#include namespace board { @@ -35,4 +35,4 @@ namespace board { const char *GetThermalSensorName(HocClkThermalSensor sensor, bool pretty); const char *GetPowerSensorName(HocClkPowerSensor sensor, bool pretty); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp index 4a43b32a..6d7da57e 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.cpp @@ -24,16 +24,17 @@ * -------------------------------------------------------------------------- */ -#include #include -#include "../hos/apm_ext.h" #include -#include #include +#include +#include #include + +#include "../hos/apm_ext.h" +#include "board.hpp" #include #include -#include "board.hpp" namespace board { @@ -60,4 +61,4 @@ namespace board { return HocClkProfile_Handheld; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_profile.hpp b/Source/hoc-clk/sysmodule/src/board/board_profile.hpp index 32657b91..c99344fe 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_profile.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_profile.hpp @@ -28,7 +28,5 @@ #include namespace board { - HocClkProfile GetProfile(); - } diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp index f7fc3492..3e88eba3 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.cpp @@ -24,24 +24,26 @@ * -------------------------------------------------------------------------- */ -#include -#include -#include "../hos/apm_ext.h" -#include -#include "../i2c/i2cDrv.h" -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include #include -#include "board.hpp" -#include "../tsensor/soctherm.hpp" +#include +#include +#include + +#include "../file/config.hpp" +#include "../hos/apm_ext.h" +#include "../i2c/i2cDrv.h" #include "../tsensor/aotag.hpp" #include "../tsensor/bq24193.hpp" -#include "../file/config.hpp" +#include "../tsensor/soctherm.hpp" +#include "board.hpp" +#include +#include + namespace board { @@ -52,7 +54,7 @@ namespace board { tsensor::TSensorTemps temps = {}; tsensor::ReadTSensors(temps); - switch(sensor) { + switch (sensor) { case HocClkThermalSensor_SOC: { millis = tmp451TempSoc(); break; @@ -127,4 +129,4 @@ namespace board { return 0; } -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp b/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp index b322eda0..baa925c2 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_sensor.hpp @@ -33,4 +33,4 @@ namespace board { s32 GetTemperatureMilli(HocClkThermalSensor sensor); s32 GetPowerMw(HocClkPowerSensor sensor); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index e8e7d0ce..fb72354e 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -1,8 +1,8 @@ /* * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * + * * Copyright (c) B3711 - * + * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. @@ -17,22 +17,24 @@ * */ -#include +#include +#include #include #include #include -#include -#include +#include + +#include "../file/file_utils.hpp" +#include "../hos/rgltr.h" +#include "../i2c/i2cDrv.h" #include "board.hpp" #include "board_freq.hpp" #include "board_volt.hpp" -#include "../file/file_utils.hpp" -#include "../i2c/i2cDrv.h" -#include "../hos/rgltr.h" + namespace board { GpuVoltData voltData = {}; - u32 cpuVoltTable[32] = {}; // 32LUT + u32 cpuVoltTable[32] = {}; // 32LUT u64 cldvfs; CpuDfllData cachedTune; @@ -50,45 +52,30 @@ namespace board { u32 tune1_high; }; - EristaCpuUvEntry eristaCpuUvTable[6] = { - {0xFFEAD0FF, 0x0}, - {0xffff, 0x27007ff}, - {0xefff, 0x27407ff}, - {0xdfff, 0x27807ff}, - {0xdfdf, 0x27a07ff}, - {0xcfdf, 0x37007ff}, + EristaCpuUvEntry eristaCpuUvTableLowBracket[6] = { + // <2118 CPU speedo + { 0xFFEAD0FF, 0x25501d0 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff }, + { 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff }, + }; + + EristaCpuUvEntry eristaCpuUvTableHighBracket[6] = { + { 0xFFEAD0FF, 0x20091d9 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff }, + { 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff }, }; MarikoCpuUvEntry marikoCpuUvLow[12] = { - {0xffa0, 0xffff, 0x21107ff, 0}, - {0x0, 0xffdf, 0x21107ff, 0x27207ff}, - {0xffdf, 0xffdf, 0x21107ff, 0x27307ff}, - {0xffff, 0xffdf, 0x21107ff, 0x27407ff}, - {0x0, 0xffdf, 0x21607ff, 0x27707ff}, - {0x0, 0xffdf, 0x21607ff, 0x27807ff}, - {0x0, 0xdfff, 0x21607ff, 0x27b07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27b07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27c07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27d07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27e07ff}, - {0xdfff, 0xdfff, 0x21707ff, 0x27f07ff}, + { 0xffa0, 0xffff, 0x21107ff, 0 }, { 0x0, 0xffdf, 0x21107ff, 0x27207ff }, { 0xffdf, 0xffdf, 0x21107ff, 0x27307ff }, + { 0xffff, 0xffdf, 0x21107ff, 0x27407ff }, { 0x0, 0xffdf, 0x21607ff, 0x27707ff }, { 0x0, 0xffdf, 0x21607ff, 0x27807ff }, + { 0x0, 0xdfff, 0x21607ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27c07ff }, + { 0xdfff, 0xdfff, 0x21707ff, 0x27d07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27e07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27f07ff }, }; MarikoCpuUvEntry marikoCpuUvHigh[12] = { - {0x0, 0xffff, 0, 0}, - {0x0, 0xffdf, 0, 0x27207ff}, - {0x0, 0xffdf, 0, 0x27307ff}, - {0x0, 0xffdf, 0, 0x27407ff}, - {0x0, 0xffdf, 0, 0x27707ff}, - {0x0, 0xffdf, 0, 0x27807ff}, - {0x0, 0xdfff, 0, 0x27b07ff}, - {0x0, 0xdfff, 0, 0x27c07ff}, - {0x0, 0xdfff, 0, 0x27d07ff}, - {0x0, 0xdfff, 0, 0x27e07ff}, - {0x0, 0xdfff, 0, 0x27f07ff}, - {0x0, 0xdfff, 0, 0x27f07ff}, + { 0x0, 0xffff, 0, 0 }, { 0x0, 0xffdf, 0, 0x27207ff }, { 0x0, 0xffdf, 0, 0x27307ff }, { 0x0, 0xffdf, 0, 0x27407ff }, + { 0x0, 0xffdf, 0, 0x27707ff }, { 0x0, 0xffdf, 0, 0x27807ff }, { 0x0, 0xdfff, 0, 0x27b07ff }, { 0x0, 0xdfff, 0, 0x27c07ff }, + { 0x0, 0xdfff, 0, 0x27d07ff }, { 0x0, 0xdfff, 0, 0x27e07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, }; - } + } // namespace void CacheDfllData() { Result rc = QueryMemoryMapping(&cldvfs, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE); @@ -97,55 +84,44 @@ namespace board { if (GetSocType() == HocClkSocType_Erista) { cachedTune.tune0Low = *reinterpret_cast(cldvfs + CL_DVFS_TUNE0_0); cachedTune.tune1Low = *reinterpret_cast(cldvfs + CL_DVFS_TUNE1_0); - } else { - SetHz(HocClkModule_CPU, 1785000000); - cachedTune.tune0High = *reinterpret_cast(cldvfs + CL_DVFS_TUNE0_0); - ResetToStockCpu(); } } /* TODO: clean up this code. */ void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint) { - u32* tune0_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE0_0); - u32* tune1_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE1_0); + u32 *tune0_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE0_0); + u32 *tune1_ptr = reinterpret_cast(cldvfs + CL_DVFS_TUNE1_0); + if (GetSocType() == HocClkSocType_Mariko) { if (GetHz(HocClkModule_CPU) < tbreakPoint && (levelLow || levelHigh)) { if (levelLow) { - *tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low; - *tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low; + *tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low; + *tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low; } return; } else { if (levelLow) { - *tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low; - *tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low; + *tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low; + *tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low; } if (levelHigh) { - *tune0_ptr = marikoCpuUvHigh[levelHigh-1].tune0_high; - *tune1_ptr = marikoCpuUvHigh[levelHigh-1].tune1_high; + *tune0_ptr = marikoCpuUvHigh[levelHigh - 1].tune0_high; + *tune1_ptr = marikoCpuUvHigh[levelHigh - 1].tune1_high; } return; } - if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak + if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak *tune0_ptr = 0xCFFF; *tune1_ptr = 0xFF072201; return; } else if (GetHz(HocClkModule_CPU) >= tbreakPoint || (!levelHigh)) { - *tune0_ptr = cachedTune.tune0High; // per console? + *tune0_ptr = cachedTune.tune0High; // per console? *tune1_ptr = 0xFFF7FF3F; return; } } else { - // if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak - // *tune0_ptr = cachedTune.tune0Low; // I think each erista has a different tune0/tune1? - // *tune1_ptr = cachedTune.tune1Low; - // return; - // } else { - // if (levelLow) { - *tune0_ptr = eristaCpuUvTable[levelLow].tune0; - *tune1_ptr = eristaCpuUvTable[levelLow].tune1; - // } else { - // } + *tune0_ptr = fuseData.cpuSpeedo > 2118 ? eristaCpuUvTableHighBracket[levelLow].tune0 : eristaCpuUvTableLowBracket[levelLow].tune0; + *tune1_ptr = fuseData.cpuSpeedo > 2118 ? eristaCpuUvTableHighBracket[levelLow].tune1 : eristaCpuUvTableLowBracket[levelLow].tune1; } } @@ -212,9 +188,9 @@ namespace board { PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq } PowerDomainId; */ - /* - Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me) - */ + /* + Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me) + */ u32 GetVoltage(HocClkVoltage voltage) { u32 out = 0; BatteryChargeInfo info; @@ -227,7 +203,7 @@ namespace board { out = I2c_BuckConverter_GetUvOut(&I2c_VDD2); break; case HocClkVoltage_CPU: - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_CPU); } else { rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Cpu); @@ -236,16 +212,16 @@ namespace board { } break; case HocClkVoltage_GPU: - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_GPU); } else { rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Gpu); rgltrGetVoltage(&s, &out); rgltrCloseSession(&s); - } + } break; case HocClkVoltage_EMCVDDQ: - if(GetSocType() == HocClkSocType_Mariko) { + if (GetSocType() == HocClkSocType_Mariko) { out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_DRAM_VDDQ); } else { out = I2c_BuckConverter_GetUvOut(&I2c_VDD2); @@ -268,8 +244,8 @@ namespace board { Handle GetPcvHandle() { constexpr u64 PcvID = 0x10000000000001a; u64 processIDList[80]{}; - s32 processCount = 0; - Handle handle = INVALID_HANDLE; + s32 processCount = 0; + Handle handle = INVALID_HANDLE; DebugEventInfo debugEvent{}; @@ -308,9 +284,9 @@ namespace board { void CacheGpuVoltTable() { // Likely CPU regulator? UnkRegulator reg = { - .voltageMin = 600000, + .voltageMin = 600000, .voltageStep = 12500, - .voltageMax = 1400000, + .voltageMax = 1400000, }; Handle handle = GetPcvHandle(); @@ -358,8 +334,8 @@ namespace board { continue; } - /* Assuming mariko. */ - const u32 vmax = 800; + /* 800mV on Mariko, 950mV on Erista. */ + u32 vmax = GetSocType() == HocClkSocType_Mariko ? 800 : 950; constexpr u32 GpuVoltageTableOffset = 312; if (!std::memcmp(&buffer[index + GpuVoltageTableOffset], &vmax, sizeof(vmax))) { std::memcpy(voltData.voltTable, &buffer[index + GpuVoltageTableOffset], sizeof(voltData.voltTable)); @@ -367,18 +343,18 @@ namespace board { } constexpr u32 CpuVoltageTableOffset = 0xB8; - std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table + std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table svcCloseHandle(handle); handle = INVALID_HANDLE; // Print info AFTER we exit the handle to avoid hangs - for(int i = 0; i < (int)std::size(cpuVoltTable); ++i) { + for (int i = 0; i < (int)std::size(cpuVoltTable); ++i) { fileUtils::LogLine("[dvfs] cpu volt %d: %u mV", i, cpuVoltTable[i]); } - for(int i = 0; i < (int)std::size(voltData.voltTable); ++i) { - fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[i]); + for (int i = 0; i < (int)std::size(voltData.voltTable); ++i) { + fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[0][i]); } return; } @@ -421,42 +397,157 @@ namespace board { } u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) { - static const u32 ramTable[][22] = { - { 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, }, // Bracket 0 - { 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, }, // Bracket 1 - { 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, }, // Bracket 2 - { 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, }, // Bracket 3 - }; + u32 baseVolt = 800; + if (GetSocType() == HocClkSocType_Mariko) { + static const u32 ramTable[][22] = { + { + 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, + 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, + }, // Bracket 0 + { + 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, + 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, + }, // Bracket 1 + { + 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, + 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, + }, // Bracket 2 + { + 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, + 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, + }, // Bracket 3 + }; - static const u32 gpuVoltArray[] = { 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, }; + static const u32 gpuVoltArray[] = { + 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, + }; - if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin - if (bracket >= std::size(ramTable)) bracket = 0; + if (freqMhz <= 1600) + return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + if (bracket >= std::size(ramTable)) + bracket = 0; - u32 bracketStart = ramTable[bracket][0]; - - - u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch! - u32 rampSpan = 590 - rampStartVolt; + u32 bracketStart = ramTable[bracket][0]; + u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch! + u32 rampSpan = 590 - rampStartVolt; - if (freqMhz >= 1633 && freqMhz < bracketStart) { - u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633); - u32 volt = ((raw + 2) / 5) * 5; - if (volt < rampStartVolt) volt = rampStartVolt; - if (volt > 590) volt = 590; - return volt; - } + if (freqMhz >= 1633 && freqMhz < bracketStart) { + u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633); + u32 volt = ((raw + 2) / 5) * 5; + if (volt < rampStartVolt) + volt = rampStartVolt; + if (volt > 590) + volt = 590; + return volt; + } + baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1]; + for (u32 i = 0; i < std::size(gpuVoltArray); ++i) { + if (freqMhz <= ramTable[bracket][i]) { + baseVolt = gpuVoltArray[i]; + break; + } + } + } else { + struct DvfsEntry { + u32 freq; + u32 volt; + }; + static const DvfsEntry ramTable[][19] = { + { { 1733, 725 }, + { 1800, 730 }, + { 1866, 735 }, + { 1920, 740 }, + { 1958, 745 }, + { 1996, 750 }, + { 2035, 755 }, + { 2073, 760 }, + { 2112, 765 }, + { 2131, 770 }, + { 2150, 775 }, + { 2169, 780 }, + { 2188, 785 }, + { 2227, 790 }, + { 2265, 795 }, + { 2304, 800 }, + { 2342, 805 }, + { 2380, 810 }, + { 2400, 815 } }, // Bracket 0 + { { 1733, 715 }, + { 1800, 720 }, + { 1866, 725 }, + { 1920, 730 }, + { 1958, 735 }, + { 1996, 740 }, + { 2035, 745 }, + { 2073, 750 }, + { 2112, 755 }, + { 2131, 760 }, + { 2150, 765 }, + { 2169, 770 }, + { 2188, 775 }, + { 2227, 780 }, + { 2265, 785 }, + { 2304, 790 }, + { 2342, 795 }, + { 2380, 800 }, + { 2400, 805 } }, // Bracket 1 + { { 1733, 705 }, + { 1800, 710 }, + { 1866, 715 }, + { 1920, 720 }, + { 1958, 725 }, + { 1996, 730 }, + { 2035, 735 }, + { 2073, 740 }, + { 2112, 745 }, + { 2131, 750 }, + { 2150, 755 }, + { 2169, 760 }, + { 2188, 765 }, + { 2227, 770 }, + { 2265, 775 }, + { 2304, 780 }, + { 2342, 785 }, + { 2380, 790 }, + { 2400, 795 } }, // Bracket 2 + { { 1733, 695 }, + { 1800, 700 }, + { 1866, 705 }, + { 1920, 710 }, + { 1958, 715 }, + { 1996, 720 }, + { 2035, 725 }, + { 2073, 730 }, + { 2112, 735 }, + { 2131, 740 }, + { 2150, 745 }, + { 2169, 750 }, + { 2188, 755 }, + { 2227, 760 }, + { 2265, 765 }, + { 2304, 770 }, + { 2342, 775 }, + { 2380, 780 }, + { 2400, 785 } }, // Bracket 3 + }; - u32 baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1]; - for (u32 i = 0; i < std::size(gpuVoltArray); ++i) { - if (freqMhz <= ramTable[bracket][i]) { - baseVolt = gpuVoltArray[i]; - break; + if (freqMhz <= 1600) + return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + if (bracket >= std::size(ramTable)) + bracket = 0; + + const auto &entries = ramTable[bracket]; + baseVolt = entries[std::size(entries) - 1].volt; + for (const auto &entry : entries) { + if (freqMhz <= entry.freq) { + baseVolt = entry.volt; + break; + } } } return baseVolt; } -} \ No newline at end of file +} // namespace board \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp index b8906534..41de0023 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.hpp @@ -16,8 +16,9 @@ */ #pragma once -#include #include +#include + namespace board { @@ -37,9 +38,9 @@ namespace board { u32 tune0High; u32 tune1Low; u32 tune1High; - // u32 tune_high_min_millivolts; - // u32 tune_high_margin_millivolts; - // u64 dvco_calibration_max; + // u32 tune_high_min_millivolts; + // u32 tune_high_margin_millivolts; + // u64 dvco_calibration_max; }; void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint); @@ -50,4 +51,4 @@ namespace board { void PcvHijackGpuVolts(u32 vmin); u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket); -} +} // namespace board diff --git a/Source/hoc-clk/sysmodule/src/display/aula.cpp b/Source/hoc-clk/sysmodule/src/display/aula.cpp index 7ff02674..7a6297da 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.cpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.cpp @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include "aula.hpp" @@ -23,26 +23,24 @@ // I *think* HOS changes this in some ways, so look into it more namespace AulaDisplay { - #define MMIO_REG32(base, off) *(vu32 *)((base) + (off)) - #define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u) - #define DSI_WR_DATA 0xA - #define DSI_TRIGGER 0x13 +#define MMIO_REG32(base, off) *(vu32 *)((base) + (off)) +#define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u) +#define DSI_WR_DATA 0xA +#define DSI_TRIGGER 0x13 void _display_dsi_send_cmd(u8 cmd, u32 param, u32 wait) { DSI(DSI_WR_DATA) = (param << 8) | cmd; DSI(DSI_TRIGGER) = DSI_TRIGGER_HOST; if (wait) - svcSleepThread(wait * 1000); // usleep-equivalant + svcSleepThread(wait * 1000); // usleep-equivalant } void SetDisplayColorMode(AulaColorMode mode) { - if(mode == AulaDisplayColorMode_DoNotOverride) + if (mode == AulaDisplayColorMode_DoNotOverride) return; // send display command to change color mode. - _display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, - MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0); - + _display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0); } -} \ No newline at end of file +} // namespace AulaDisplay \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/display/aula.hpp b/Source/hoc-clk/sysmodule/src/display/aula.hpp index 7c70cc88..14537fd7 100644 --- a/Source/hoc-clk/sysmodule/src/display/aula.hpp +++ b/Source/hoc-clk/sysmodule/src/display/aula.hpp @@ -12,10 +12,10 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - +#pragma once #include "../board/board.hpp" namespace AulaDisplay { diff --git a/Source/hoc-clk/sysmodule/src/display/common.hpp b/Source/hoc-clk/sysmodule/src/display/common.hpp index b10cf258..b88ac496 100644 --- a/Source/hoc-clk/sysmodule/src/display/common.hpp +++ b/Source/hoc-clk/sysmodule/src/display/common.hpp @@ -19,14 +19,14 @@ #define _DI_H_ #define DSI_VIDEO_DISABLED 0 -#define DSI_VIDEO_ENABLED 1 +#define DSI_VIDEO_ENABLED 1 #define WINDOW_A 0 #define WINDOW_B 1 #define WINDOW_C 2 #define WINDOW_D 3 #ifndef BIT -#define BIT(n) (1U<<(n)) + #define BIT(n) (1U << (n)) #endif /*! Display registers. */ // All Display/DSI/MIPI register defines and macros are index based (not offset). @@ -37,8 +37,8 @@ #define DC_D_WINBUF_DD_SCRATCH_REGISTER_1 0xEE #define DC_T_WINBUF_TD_SCRATCH_REGISTER_0 0x16D #define DC_T_WINBUF_TD_SCRATCH_REGISTER_1 0x16E -#define DC_COM_SCRATCH_REGISTER_A 0x325 -#define DC_COM_SCRATCH_REGISTER_B 0x326 +#define DC_COM_SCRATCH_REGISTER_A 0x325 +#define DC_COM_SCRATCH_REGISTER_B 0x326 #define DC_A_WINBUF_AD_SCRATCH_REGISTER_0 0xBED #define DC_A_WINBUF_AD_SCRATCH_REGISTER_1 0xBEE #define DC_B_WINBUF_BD_SCRATCH_REGISTER_0 0xDED @@ -48,92 +48,92 @@ // DC_CMD non-shadowed command/sync registers. #define DC_CMD_GENERAL_INCR_SYNCPT 0x00 -#define SYNCPT_GENERAL_INDX(x) (((x) & 0xFF) << 0) -#define SYNCPT_GENERAL_COND(x) (((x) & 0xFF) << 8) -#define COND_REG_WR_SAFE 3 +#define SYNCPT_GENERAL_INDX(x) (((x) & 0xFF) << 0) +#define SYNCPT_GENERAL_COND(x) (((x) & 0xFF) << 8) +#define COND_REG_WR_SAFE 3 #define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL 0x01 -#define SYNCPT_CNTRL_SOFT_RESET BIT(0) -#define SYNCPT_CNTRL_NO_STALL BIT(8) +#define SYNCPT_CNTRL_SOFT_RESET BIT(0) +#define SYNCPT_CNTRL_NO_STALL BIT(8) #define DC_CMD_CONT_SYNCPT_VSYNC 0x28 -#define SYNCPT_VSYNC_INDX(x) (((x) & 0xFF) << 0) -#define SYNCPT_VSYNC_ENABLE BIT(8) +#define SYNCPT_VSYNC_INDX(x) (((x) & 0xFF) << 0) +#define SYNCPT_VSYNC_ENABLE BIT(8) #define DC_CMD_DISPLAY_COMMAND_OPTION0 0x031 #define DC_CMD_DISPLAY_COMMAND 0x32 -#define DISP_CTRL_MODE_STOP (0 << 5) -#define DISP_CTRL_MODE_C_DISPLAY (1 << 5) -#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5) -#define DISP_CTRL_MODE_MASK (3 << 5) +#define DISP_CTRL_MODE_STOP (0 << 5) +#define DISP_CTRL_MODE_C_DISPLAY (1 << 5) +#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5) +#define DISP_CTRL_MODE_MASK (3 << 5) #define DC_CMD_DISPLAY_POWER_CONTROL 0x36 -#define PW0_ENABLE BIT(0) -#define PW1_ENABLE BIT(2) -#define PW2_ENABLE BIT(4) -#define PW3_ENABLE BIT(6) -#define PW4_ENABLE BIT(8) -#define PM0_ENABLE BIT(16) -#define PM1_ENABLE BIT(18) +#define PW0_ENABLE BIT(0) +#define PW1_ENABLE BIT(2) +#define PW2_ENABLE BIT(4) +#define PW3_ENABLE BIT(6) +#define PW4_ENABLE BIT(8) +#define PM0_ENABLE BIT(16) +#define PM1_ENABLE BIT(18) #define DC_CMD_INT_STATUS 0x37 #define DC_CMD_INT_MASK 0x38 #define DC_CMD_INT_ENABLE 0x39 -#define DC_CMD_INT_FRAME_END_INT BIT(1) -#define DC_CMD_INT_V_BLANK_INT BIT(2) +#define DC_CMD_INT_FRAME_END_INT BIT(1) +#define DC_CMD_INT_V_BLANK_INT BIT(2) #define DC_CMD_INT_POLARITY 0x3B #define DC_CMD_STATE_ACCESS 0x40 -#define READ_MUX_ASSEMBLY 0x0 -#define WRITE_MUX_ASSEMBLY 0x0 -#define READ_MUX_ACTIVE BIT(0) -#define WRITE_MUX_ACTIVE BIT(2) +#define READ_MUX_ASSEMBLY 0x0 +#define WRITE_MUX_ASSEMBLY 0x0 +#define READ_MUX_ACTIVE BIT(0) +#define WRITE_MUX_ACTIVE BIT(2) #define DC_CMD_STATE_CONTROL 0x41 -#define GENERAL_ACT_REQ BIT(0) -#define WIN_ACT_REQ 1 -#define WIN_A_ACT_REQ BIT(1) -#define WIN_B_ACT_REQ BIT(2) -#define WIN_C_ACT_REQ BIT(3) -#define WIN_D_ACT_REQ BIT(4) -#define CURSOR_ACT_REQ BIT(7) -#define GENERAL_UPDATE BIT(8) -#define WIN_UPDATE 9 -#define WIN_A_UPDATE BIT(9) -#define WIN_B_UPDATE BIT(10) -#define WIN_C_UPDATE BIT(11) -#define WIN_D_UPDATE BIT(12) -#define CURSOR_UPDATE BIT(15) -#define NC_HOST_TRIG BIT(24) +#define GENERAL_ACT_REQ BIT(0) +#define WIN_ACT_REQ 1 +#define WIN_A_ACT_REQ BIT(1) +#define WIN_B_ACT_REQ BIT(2) +#define WIN_C_ACT_REQ BIT(3) +#define WIN_D_ACT_REQ BIT(4) +#define CURSOR_ACT_REQ BIT(7) +#define GENERAL_UPDATE BIT(8) +#define WIN_UPDATE 9 +#define WIN_A_UPDATE BIT(9) +#define WIN_B_UPDATE BIT(10) +#define WIN_C_UPDATE BIT(11) +#define WIN_D_UPDATE BIT(12) +#define CURSOR_UPDATE BIT(15) +#define NC_HOST_TRIG BIT(24) #define DC_CMD_DISPLAY_WINDOW_HEADER 0x42 -#define WINDOW_SELECT 4 -#define WINDOW_A_SELECT BIT(4) -#define WINDOW_B_SELECT BIT(5) -#define WINDOW_C_SELECT BIT(6) -#define WINDOW_D_SELECT BIT(7) +#define WINDOW_SELECT 4 +#define WINDOW_A_SELECT BIT(4) +#define WINDOW_B_SELECT BIT(5) +#define WINDOW_C_SELECT BIT(6) +#define WINDOW_D_SELECT BIT(7) #define DC_CMD_REG_ACT_CONTROL 0x43 -#define GENERAL_ACT_HCNTR_SEL BIT(0) -#define WIN_A_ACT_HCNTR_SEL BIT(2) -#define WIN_B_ACT_HCNTR_SEL BIT(4) -#define WIN_C_ACT_HCNTR_SEL BIT(6) -#define CURSOR_ACT_HCNTR_SEL BIT(7) -#define WIN_D_ACT_HCNTR_SEL BIT(10) +#define GENERAL_ACT_HCNTR_SEL BIT(0) +#define WIN_A_ACT_HCNTR_SEL BIT(2) +#define WIN_B_ACT_HCNTR_SEL BIT(4) +#define WIN_C_ACT_HCNTR_SEL BIT(6) +#define CURSOR_ACT_HCNTR_SEL BIT(7) +#define WIN_D_ACT_HCNTR_SEL BIT(10) // DC_D_WIN_DD window D instance of DC_WIN #define DC_D_WIN_DD_WIN_OPTIONS 0x80 #define DC_D_WIN_DD_COLOR_DEPTH 0x83 -#define DC_D_WIN_DD_POSITION 0x84 -#define DC_D_WIN_DD_SIZE 0x85 +#define DC_D_WIN_DD_POSITION 0x84 +#define DC_D_WIN_DD_SIZE 0x85 #define DC_D_WIN_DD_LINE_STRIDE 0x8A #define DC_D_WIN_DD_BLEND_LAYER_CONTROL 0x96 -#define DC_D_WIN_DD_BLEND_MATCH_SELECT 0x97 -#define DC_D_WIN_DD_BLEND_ALPHA_1BIT 0x99 +#define DC_D_WIN_DD_BLEND_MATCH_SELECT 0x97 +#define DC_D_WIN_DD_BLEND_ALPHA_1BIT 0x99 // DC_D_WINBUF_DD window D instance of DC_WINBUF -#define DC_D_WINBUF_DD_START_ADDR 0xC0 +#define DC_D_WINBUF_DD_START_ADDR 0xC0 #define DC_D_WINBUF_DD_ADDR_H_OFFSET 0xC6 #define DC_D_WINBUF_DD_ADDR_V_OFFSET 0xC8 #define DC_D_WINBUF_DD_START_ADDR_HI 0xCD @@ -146,174 +146,173 @@ #define DC_COM_CRC_CONTROL 0x300 #define DC_COM_PIN_OUTPUT_ENABLE(x) (0x302 + (x)) #define DC_COM_PIN_OUTPUT_POLARITY(x) (0x306 + (x)) -#define LSC0_OUTPUT_POLARITY_LOW BIT(24) +#define LSC0_OUTPUT_POLARITY_LOW BIT(24) // CMU registers. -#define DC_COM_CMU_CSC_KRR 0x32A -#define DC_COM_CMU_CSC_KGR 0x32B -#define DC_COM_CMU_CSC_KBR 0x32C -#define DC_COM_CMU_CSC_KRG 0x32D -#define DC_COM_CMU_CSC_KGG 0x32E -#define DC_COM_CMU_CSC_KBG 0x32F -#define DC_COM_CMU_CSC_KRB 0x330 -#define DC_COM_CMU_CSC_KGB 0x331 -#define DC_COM_CMU_CSC_KBB 0x332 -#define DC_COM_CMU_LUT1 0x336 -#define LUT1_ADDR(x) ((x) & 0xFF) -#define LUT1_DATA(x) (((x) & 0xFFF) << 16) -#define LUT1_READ_DATA(x) (((x) >> 16) & 0xFFF) -#define DC_COM_CMU_LUT2 0x337 -#define LUT2_ADDR(x) ((x) & 0x3FF) -#define LUT2_DATA(x) (((x) & 0xFF) << 16) -#define LUT2_READ_DATA(x) (((x) >> 16) & 0xFF) -#define DC_COM_CMU_LUT1_READ 0x338 -#define LUT1_READ_ADDR(x) (((x) & 0xFF) << 8) -#define LUT1_READ_EN BIT(0) -#define DC_COM_CMU_LUT2_READ 0x339 -#define LUT2_READ_ADDR(x) (((x) & 0x3FF) << 8) -#define LUT2_READ_EN BIT(0) +#define DC_COM_CMU_CSC_KRR 0x32A +#define DC_COM_CMU_CSC_KGR 0x32B +#define DC_COM_CMU_CSC_KBR 0x32C +#define DC_COM_CMU_CSC_KRG 0x32D +#define DC_COM_CMU_CSC_KGG 0x32E +#define DC_COM_CMU_CSC_KBG 0x32F +#define DC_COM_CMU_CSC_KRB 0x330 +#define DC_COM_CMU_CSC_KGB 0x331 +#define DC_COM_CMU_CSC_KBB 0x332 +#define DC_COM_CMU_LUT1 0x336 +#define LUT1_ADDR(x) ((x) & 0xFF) +#define LUT1_DATA(x) (((x) & 0xFFF) << 16) +#define LUT1_READ_DATA(x) (((x) >> 16) & 0xFFF) +#define DC_COM_CMU_LUT2 0x337 +#define LUT2_ADDR(x) ((x) & 0x3FF) +#define LUT2_DATA(x) (((x) & 0xFF) << 16) +#define LUT2_READ_DATA(x) (((x) >> 16) & 0xFF) +#define DC_COM_CMU_LUT1_READ 0x338 +#define LUT1_READ_ADDR(x) (((x) & 0xFF) << 8) +#define LUT1_READ_EN BIT(0) +#define DC_COM_CMU_LUT2_READ 0x339 +#define LUT2_READ_ADDR(x) (((x) & 0x3FF) << 8) +#define LUT2_READ_EN BIT(0) #define DC_COM_DSC_TOP_CTL 0x33E // DC_DISP shadowed registers. #define DC_DISP_DISP_WIN_OPTIONS 0x402 -#define CURSOR_ENABLE BIT(16) -#define SOR_ENABLE BIT(25) -#define SOR1_ENABLE BIT(26) -#define SOR1_TIMING_CYA BIT(27) -#define DSI_ENABLE BIT(29) -#define HDMI_ENABLE BIT(30) - +#define CURSOR_ENABLE BIT(16) +#define SOR_ENABLE BIT(25) +#define SOR1_ENABLE BIT(26) +#define SOR1_TIMING_CYA BIT(27) +#define DSI_ENABLE BIT(29) +#define HDMI_ENABLE BIT(30) #define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403 #define DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER 0x404 #define DC_DISP_DISP_TIMING_OPTIONS 0x405 -#define VSYNC_H_POSITION(x) (((x) & 0x1FFF) << 0) +#define VSYNC_H_POSITION(x) (((x) & 0x1FFF) << 0) #define DC_DISP_REF_TO_SYNC 0x406 -#define H_REF_TO_SYNC(x) (((x) & 0x1FFF) << 0) // Min 0 pixel clock. -#define V_REF_TO_SYNC(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. +#define H_REF_TO_SYNC(x) (((x) & 0x1FFF) << 0) // Min 0 pixel clock. +#define V_REF_TO_SYNC(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. #define DC_DISP_SYNC_WIDTH 0x407 -#define H_SYNC_WIDTH(x) (((x) & 0x1FFF) << 0) // Min 1 pixel clock. -#define V_SYNC_WIDTH(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. +#define H_SYNC_WIDTH(x) (((x) & 0x1FFF) << 0) // Min 1 pixel clock. +#define V_SYNC_WIDTH(x) (((x) & 0x1FFF) << 16) // Min 1 line clock. #define DC_DISP_BACK_PORCH 0x408 -#define H_BACK_PORCH(x) (((x) & 0x1FFF) << 0) -#define V_BACK_PORCH(x) (((x) & 0x1FFF) << 16) +#define H_BACK_PORCH(x) (((x) & 0x1FFF) << 0) +#define V_BACK_PORCH(x) (((x) & 0x1FFF) << 16) #define DC_DISP_ACTIVE 0x409 -#define H_DISP_ACTIVE(x) (((x) & 0x1FFF) << 0) // Min 16 pixel clock. -#define V_DISP_ACTIVE(x) (((x) & 0x1FFF) << 16) // Min 16 line clock. +#define H_DISP_ACTIVE(x) (((x) & 0x1FFF) << 0) // Min 16 pixel clock. +#define V_DISP_ACTIVE(x) (((x) & 0x1FFF) << 16) // Min 16 line clock. #define DC_DISP_FRONT_PORCH 0x40A -#define H_FRONT_PORCH(x) (((x) & 0x1FFF) << 0) // Min -=PS_=-H_REF_TO_SYNC + 1 -#define V_FRONT_PORCH(x) (((x) & 0x1FFF) << 16) // Min -=PS_=-V_REF_TO_SYNC + 1 +#define H_FRONT_PORCH(x) (((x) & 0x1FFF) << 0) // Min -=PS_=-H_REF_TO_SYNC + 1 +#define V_FRONT_PORCH(x) (((x) & 0x1FFF) << 16) // Min -=PS_=-V_REF_TO_SYNC + 1 #define DC_DISP_DISP_CLOCK_CONTROL 0x42E -#define SHIFT_CLK_DIVIDER(x) ((x) & 0xFF) -#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8) -#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8) -#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8) -#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8) -#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8) -#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8) -#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8) -#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8) -#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8) -#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8) -#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8) -#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8) -#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8) +#define SHIFT_CLK_DIVIDER(x) ((x) & 0xFF) +#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8) +#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8) +#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8) +#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8) +#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8) +#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8) +#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8) +#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8) +#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8) +#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8) +#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8) +#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8) +#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8) #define DC_DISP_DISP_INTERFACE_CONTROL 0x42F -#define DISP_DATA_FORMAT_DF1P1C (0 << 0) -#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0) -#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0) -#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0) -#define DISP_DATA_FORMAT_DF2S (4 << 0) -#define DISP_DATA_FORMAT_DF3S (5 << 0) -#define DISP_DATA_FORMAT_DFSPI (6 << 0) -#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0) -#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0) -#define DISP_ALIGNMENT_MSB (0 << 8) -#define DISP_ALIGNMENT_LSB (1 << 8) -#define DISP_ORDER_RED_BLUE (0 << 9) -#define DISP_ORDER_BLUE_RED (1 << 9) +#define DISP_DATA_FORMAT_DF1P1C (0 << 0) +#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0) +#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0) +#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0) +#define DISP_DATA_FORMAT_DF2S (4 << 0) +#define DISP_DATA_FORMAT_DF3S (5 << 0) +#define DISP_DATA_FORMAT_DFSPI (6 << 0) +#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0) +#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0) +#define DISP_ALIGNMENT_MSB (0 << 8) +#define DISP_ALIGNMENT_LSB (1 << 8) +#define DISP_ORDER_RED_BLUE (0 << 9) +#define DISP_ORDER_BLUE_RED (1 << 9) #define DC_DISP_DISP_COLOR_CONTROL 0x430 -#define BASE_COLOR_SIZE_MASK (0xF << 0) -#define BASE_COLOR_SIZE_666 (0 << 0) -#define BASE_COLOR_SIZE_111 (1 << 0) -#define BASE_COLOR_SIZE_222 (2 << 0) -#define BASE_COLOR_SIZE_333 (3 << 0) -#define BASE_COLOR_SIZE_444 (4 << 0) -#define BASE_COLOR_SIZE_555 (5 << 0) -#define BASE_COLOR_SIZE_565 (6 << 0) -#define BASE_COLOR_SIZE_332 (7 << 0) -#define BASE_COLOR_SIZE_888 (8 << 0) -#define DITHER_CONTROL_MASK (3 << 8) -#define DITHER_CONTROL_DISABLE (0 << 8) -#define DITHER_CONTROL_ORDERED (2 << 8) -#define DITHER_CONTROL_ERRDIFF (3 << 8) -#define DISP_COLOR_SWAP BIT(16) -#define BLANK_COLOR_WHITE BIT(17) -#define CMU_ENABLE BIT(20) +#define BASE_COLOR_SIZE_MASK (0xF << 0) +#define BASE_COLOR_SIZE_666 (0 << 0) +#define BASE_COLOR_SIZE_111 (1 << 0) +#define BASE_COLOR_SIZE_222 (2 << 0) +#define BASE_COLOR_SIZE_333 (3 << 0) +#define BASE_COLOR_SIZE_444 (4 << 0) +#define BASE_COLOR_SIZE_555 (5 << 0) +#define BASE_COLOR_SIZE_565 (6 << 0) +#define BASE_COLOR_SIZE_332 (7 << 0) +#define BASE_COLOR_SIZE_888 (8 << 0) +#define DITHER_CONTROL_MASK (3 << 8) +#define DITHER_CONTROL_DISABLE (0 << 8) +#define DITHER_CONTROL_ORDERED (2 << 8) +#define DITHER_CONTROL_ERRDIFF (3 << 8) +#define DISP_COLOR_SWAP BIT(16) +#define BLANK_COLOR_WHITE BIT(17) +#define CMU_ENABLE BIT(20) #define DC_DISP_SHIFT_CLOCK_OPTIONS 0x431 -#define SC0_H_QUALIFIER_NONE BIT(0) -#define SC1_H_QUALIFIER_NONE BIT(16) +#define SC0_H_QUALIFIER_NONE BIT(0) +#define SC1_H_QUALIFIER_NONE BIT(16) #define DC_DISP_DATA_ENABLE_OPTIONS 0x432 -#define DE_SELECT_ACTIVE_BLANK (0 << 0) -#define DE_SELECT_ACTIVE (1 << 0) -#define DE_SELECT_ACTIVE_IS (2 << 0) -#define DE_CONTROL_ONECLK (0 << 2) -#define DE_CONTROL_NORMAL (1 << 2) -#define DE_CONTROL_EARLY_EXT (2 << 2) -#define DE_CONTROL_EARLY (3 << 2) -#define DE_CONTROL_ACTIVE_BLANK (4 << 2) +#define DE_SELECT_ACTIVE_BLANK (0 << 0) +#define DE_SELECT_ACTIVE (1 << 0) +#define DE_SELECT_ACTIVE_IS (2 << 0) +#define DE_CONTROL_ONECLK (0 << 2) +#define DE_CONTROL_NORMAL (1 << 2) +#define DE_CONTROL_EARLY_EXT (2 << 2) +#define DE_CONTROL_EARLY (3 << 2) +#define DE_CONTROL_ACTIVE_BLANK (4 << 2) // Cursor configuration registers. -#define DC_DISP_CURSOR_FOREGROUND 0x43C -#define DC_DISP_CURSOR_BACKGROUND 0x43D -#define CURSOR_COLOR(r,g,b) (((r) & 0xFF) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16)) +#define DC_DISP_CURSOR_FOREGROUND 0x43C +#define DC_DISP_CURSOR_BACKGROUND 0x43D +#define CURSOR_COLOR(r, g, b) (((r) & 0xFF) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16)) -#define DC_DISP_CURSOR_START_ADDR 0x43E -#define DC_DISP_CURSOR_START_ADDR_NS 0x43F -#define CURSOR_CLIPPING(w) ((w) << 28) -#define CURSOR_CLIP_WIN_A 1 -#define CURSOR_CLIP_WIN_B 2 -#define CURSOR_CLIP_WIN_C 3 -#define CURSOR_SIZE_32 (0 << 24) -#define CURSOR_SIZE_64 (1 << 24) -#define CURSOR_SIZE_128 (2 << 24) -#define CURSOR_SIZE_256 (3 << 24) -#define DC_DISP_CURSOR_POSITION 0x440 -#define DC_DISP_CURSOR_START_ADDR_HI 0x4EC +#define DC_DISP_CURSOR_START_ADDR 0x43E +#define DC_DISP_CURSOR_START_ADDR_NS 0x43F +#define CURSOR_CLIPPING(w) ((w) << 28) +#define CURSOR_CLIP_WIN_A 1 +#define CURSOR_CLIP_WIN_B 2 +#define CURSOR_CLIP_WIN_C 3 +#define CURSOR_SIZE_32 (0 << 24) +#define CURSOR_SIZE_64 (1 << 24) +#define CURSOR_SIZE_128 (2 << 24) +#define CURSOR_SIZE_256 (3 << 24) +#define DC_DISP_CURSOR_POSITION 0x440 +#define DC_DISP_CURSOR_START_ADDR_HI 0x4EC #define DC_DISP_CURSOR_START_ADDR_HI_NS 0x4ED -#define DC_DISP_BLEND_CURSOR_CONTROL 0x4F1 -#define CURSOR_BLEND_2BIT (0 << 24) -#define CURSOR_BLEND_R8G8B8A8 (1 << 24) -#define CURSOR_BLEND_SRC_FACTOR(n) ((n) << 8) -#define CURSOR_BLEND_DST_FACTOR(n) ((n) << 16) -#define CURSOR_BLEND_ZRO 0 -#define CURSOR_BLEND_K1 1 -#define CURSOR_BLEND_NK1 2 +#define DC_DISP_BLEND_CURSOR_CONTROL 0x4F1 +#define CURSOR_BLEND_2BIT (0 << 24) +#define CURSOR_BLEND_R8G8B8A8 (1 << 24) +#define CURSOR_BLEND_SRC_FACTOR(n) ((n) << 8) +#define CURSOR_BLEND_DST_FACTOR(n) ((n) << 16) +#define CURSOR_BLEND_ZRO 0 +#define CURSOR_BLEND_K1 1 +#define CURSOR_BLEND_NK1 2 // End of cursor cfg regs. -#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480 -#define DC_DISP_SD_BL_PARAMETERS 0x4D7 -#define DC_DISP_SD_BL_CONTROL 0x4DC +#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480 +#define DC_DISP_SD_BL_PARAMETERS 0x4D7 +#define DC_DISP_SD_BL_CONTROL 0x4DC #define DC_DISP_BLEND_BACKGROUND_COLOR 0x4E4 -#define DC_DISP_DISPLAY_SPARE0 0x4F7 // Used by SW/HW. -#define DC_DISP_DISPLAY_SPARE1 0x4F8 +#define DC_DISP_DISPLAY_SPARE0 0x4F7 // Used by SW/HW. +#define DC_DISP_DISPLAY_SPARE1 0x4F8 #define DC_WINC_COLOR_PALETTE 0x500 -#define COLOR_PALETTE_IDX(off) (DC_WINC_COLOR_PALETTE + (off)) -#define COLOR_PALETTE_RGB(rgb) (byte_swap_32(rgb) >> 8) +#define COLOR_PALETTE_IDX(off) (DC_WINC_COLOR_PALETTE + (off)) +#define COLOR_PALETTE_RGB(rgb) (byte_swap_32(rgb) >> 8) #define DC_WINC_PALETTE_COLOR_EXT 0x600 #define DC_WINC_H_FILTER_P(p) (0x601 + (p)) @@ -334,85 +333,85 @@ // The following registers are A/B/C shadows of the 0xB80/0xD80/0xF80 registers (see DISPLAY_WINDOW_HEADER). #define DC_WIN_WIN_OPTIONS 0x700 -#define H_DIRECTION BIT(0) -#define V_DIRECTION BIT(2) -#define SCAN_COLUMN BIT(4) -#define COLOR_EXPAND BIT(6) -#define H_FILTER_ENABLE BIT(8) -#define V_FILTER_ENABLE BIT(10) -#define COLOR_PALETTE_ENABLE BIT(16) -#define CSC_ENABLE BIT(18) -#define DV_ENABLE BIT(20) -#define WIN_ENABLE BIT(30) -#define H_FILTER_EXPAND BIT(31) +#define H_DIRECTION BIT(0) +#define V_DIRECTION BIT(2) +#define SCAN_COLUMN BIT(4) +#define COLOR_EXPAND BIT(6) +#define H_FILTER_ENABLE BIT(8) +#define V_FILTER_ENABLE BIT(10) +#define COLOR_PALETTE_ENABLE BIT(16) +#define CSC_ENABLE BIT(18) +#define DV_ENABLE BIT(20) +#define WIN_ENABLE BIT(30) +#define H_FILTER_EXPAND BIT(31) #define DC_WIN_BUFFER_CONTROL 0x702 -#define BUFFER_CONTROL_HOST 0 -#define BUFFER_CONTROL_VI 1 -#define BUFFER_CONTROL_SB2D 4 +#define BUFFER_CONTROL_HOST 0 +#define BUFFER_CONTROL_VI 1 +#define BUFFER_CONTROL_SB2D 4 #define DC_WIN_COLOR_DEPTH 0x703 -#define WIN_COLOR_DEPTH_P1 0x0 -#define WIN_COLOR_DEPTH_P2 0x1 -#define WIN_COLOR_DEPTH_P4 0x2 -#define WIN_COLOR_DEPTH_P8 0x3 -#define WIN_COLOR_DEPTH_B4G4R4A4 0x4 -#define WIN_COLOR_DEPTH_B5G5R5A 0x5 -#define WIN_COLOR_DEPTH_B5G6R5 0x6 -#define WIN_COLOR_DEPTH_AB5G5R5 0x7 -#define WIN_COLOR_DEPTH_B8G8R8A8 0xC -#define WIN_COLOR_DEPTH_R8G8B8A8 0xD -#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 0xE -#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 0xF -#define WIN_COLOR_DEPTH_YCbCr422 0x10 -#define WIN_COLOR_DEPTH_YUV422 0x11 -#define WIN_COLOR_DEPTH_YCbCr420P 0x12 -#define WIN_COLOR_DEPTH_YUV420P 0x13 -#define WIN_COLOR_DEPTH_YCbCr422P 0x14 -#define WIN_COLOR_DEPTH_YUV422P 0x15 -#define WIN_COLOR_DEPTH_YCbCr422R 0x16 -#define WIN_COLOR_DEPTH_YUV422R 0x17 -#define WIN_COLOR_DEPTH_YCbCr422RA 0x18 -#define WIN_COLOR_DEPTH_YUV422RA 0x19 -#define WIN_COLOR_DEPTH_X1R5G5B5 0x1E -#define WIN_COLOR_DEPTH_R5G5B5X1 0x1F -#define WIN_COLOR_DEPTH_X1B5G5R5 0x20 -#define WIN_COLOR_DEPTH_B5G5R5X1 0x21 -#define WIN_COLOR_DEPTH_YCbCr444P 0x29 -#define WIN_COLOR_DEPTH_YCrCb420SP 0x2A -#define WIN_COLOR_DEPTH_YCbCr420SP 0x2B -#define WIN_COLOR_DEPTH_YCrCb422SP 0x2C -#define WIN_COLOR_DEPTH_YCbCr422SP 0x2D -#define WIN_COLOR_DEPTH_YUV444P 0x34 -#define WIN_COLOR_DEPTH_YVU420SP 0x35 -#define WIN_COLOR_DEPTH_YUV420SP 0x36 -#define WIN_COLOR_DEPTH_YVU422SP 0x37 -#define WIN_COLOR_DEPTH_YUV422SP 0x38 -#define WIN_COLOR_DEPTH_YVU444SP 0x3B -#define WIN_COLOR_DEPTH_YUV444SP 0x3C +#define WIN_COLOR_DEPTH_P1 0x0 +#define WIN_COLOR_DEPTH_P2 0x1 +#define WIN_COLOR_DEPTH_P4 0x2 +#define WIN_COLOR_DEPTH_P8 0x3 +#define WIN_COLOR_DEPTH_B4G4R4A4 0x4 +#define WIN_COLOR_DEPTH_B5G5R5A 0x5 +#define WIN_COLOR_DEPTH_B5G6R5 0x6 +#define WIN_COLOR_DEPTH_AB5G5R5 0x7 +#define WIN_COLOR_DEPTH_B8G8R8A8 0xC +#define WIN_COLOR_DEPTH_R8G8B8A8 0xD +#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 0xE +#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 0xF +#define WIN_COLOR_DEPTH_YCbCr422 0x10 +#define WIN_COLOR_DEPTH_YUV422 0x11 +#define WIN_COLOR_DEPTH_YCbCr420P 0x12 +#define WIN_COLOR_DEPTH_YUV420P 0x13 +#define WIN_COLOR_DEPTH_YCbCr422P 0x14 +#define WIN_COLOR_DEPTH_YUV422P 0x15 +#define WIN_COLOR_DEPTH_YCbCr422R 0x16 +#define WIN_COLOR_DEPTH_YUV422R 0x17 +#define WIN_COLOR_DEPTH_YCbCr422RA 0x18 +#define WIN_COLOR_DEPTH_YUV422RA 0x19 +#define WIN_COLOR_DEPTH_X1R5G5B5 0x1E +#define WIN_COLOR_DEPTH_R5G5B5X1 0x1F +#define WIN_COLOR_DEPTH_X1B5G5R5 0x20 +#define WIN_COLOR_DEPTH_B5G5R5X1 0x21 +#define WIN_COLOR_DEPTH_YCbCr444P 0x29 +#define WIN_COLOR_DEPTH_YCrCb420SP 0x2A +#define WIN_COLOR_DEPTH_YCbCr420SP 0x2B +#define WIN_COLOR_DEPTH_YCrCb422SP 0x2C +#define WIN_COLOR_DEPTH_YCbCr422SP 0x2D +#define WIN_COLOR_DEPTH_YUV444P 0x34 +#define WIN_COLOR_DEPTH_YVU420SP 0x35 +#define WIN_COLOR_DEPTH_YUV420SP 0x36 +#define WIN_COLOR_DEPTH_YVU422SP 0x37 +#define WIN_COLOR_DEPTH_YUV422SP 0x38 +#define WIN_COLOR_DEPTH_YVU444SP 0x3B +#define WIN_COLOR_DEPTH_YUV444SP 0x3C #define DC_WIN_POSITION 0x704 -#define H_POSITION(x) (((x) & 0xFFFF) << 0) // Support negative. -#define V_POSITION(x) (((x) & 0xFFFF) << 16) // Support negative. +#define H_POSITION(x) (((x) & 0xFFFF) << 0) // Support negative. +#define V_POSITION(x) (((x) & 0xFFFF) << 16) // Support negative. #define DC_WIN_SIZE 0x705 -#define H_SIZE(x) (((x) & 0x1FFF) << 0) -#define V_SIZE(x) (((x) & 0x1FFF) << 16) +#define H_SIZE(x) (((x) & 0x1FFF) << 0) +#define V_SIZE(x) (((x) & 0x1FFF) << 16) #define DC_WIN_PRESCALED_SIZE 0x706 -#define H_PRESCALED_SIZE(x) (((x) & 0x7FFF) << 0) -#define V_PRESCALED_SIZE(x) (((x) & 0x1FFF) << 16) +#define H_PRESCALED_SIZE(x) (((x) & 0x7FFF) << 0) +#define V_PRESCALED_SIZE(x) (((x) & 0x1FFF) << 16) #define DC_WIN_H_INITIAL_DDA 0x707 #define DC_WIN_V_INITIAL_DDA 0x708 #define DC_WIN_DDA_INC 0x709 -#define H_DDA_INC(x) (((x) & 0xFFFF) << 0) -#define V_DDA_INC(x) (((x) & 0xFFFF) << 16) +#define H_DDA_INC(x) (((x) & 0xFFFF) << 0) +#define V_DDA_INC(x) (((x) & 0xFFFF) << 16) #define DC_WIN_LINE_STRIDE 0x70A -#define LINE_STRIDE(x) (x) -#define UV_LINE_STRIDE(x) (((x) & 0xFFFF) << 16) +#define LINE_STRIDE(x) (x) +#define UV_LINE_STRIDE(x) (((x) & 0xFFFF) << 16) #define DC_WIN_DV_CONTROL 0x70E #define DV_CTRL_R(r) (((r) & 7) << 16) @@ -420,51 +419,51 @@ #define DV_CTRL_B(b) (((b) & 7) << 0) #define DC_WINBUF_BLEND_LAYER_CONTROL 0x716 -#define WIN_BLEND_DEPTH(x) (((x) & 0xFF) << 0) -#define WIN_K1(x) (((x) & 0xFF) << 8) -#define WIN_K2(x) (((x) & 0xFF) << 16) -#define WIN_BLEND_ENABLE (0 << 24) -#define WIN_BLEND_BYPASS (1 << 24) +#define WIN_BLEND_DEPTH(x) (((x) & 0xFF) << 0) +#define WIN_K1(x) (((x) & 0xFF) << 8) +#define WIN_K2(x) (((x) & 0xFF) << 16) +#define WIN_BLEND_ENABLE (0 << 24) +#define WIN_BLEND_BYPASS (1 << 24) #define DC_WINBUF_BLEND_MATCH_SELECT 0x717 -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ZERO (0 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ONE (1 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1 (2 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_DST (3 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (4 << 0) -#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_SRC (5 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ZERO (0 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_ONE (1 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1 (2 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_DST (3 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (4 << 0) +#define WIN_BLEND_FACT_SRC_COLOR_MATCH_SEL_K1_TIMES_SRC (5 << 0) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ZERO (0 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ONE (1 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1 (2 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K2 (3 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1_TIMES_DST (4 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (5 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_SRC (6 << 4) -#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1 (7 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ZERO (0 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_ONE (1 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1 (2 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K2 (3 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_K1_TIMES_DST (4 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_DST (5 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1_TIMES_SRC (6 << 4) +#define WIN_BLEND_FACT_DST_COLOR_MATCH_SEL_NEG_K1 (7 << 4) -#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_ZERO (0 << 8) -#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K1 (1 << 8) -#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K2 (2 << 8) +#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_ZERO (0 << 8) +#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K1 (1 << 8) +#define WIN_BLEND_FACT_SRC_ALPHA_MATCH_SEL_K2 (2 << 8) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ZERO (0 << 12) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ONE (1 << 12) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_NEG_K1_TIMES_SRC (2 << 12) -#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_K2 (3 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ZERO (0 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_ONE (1 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_NEG_K1_TIMES_SRC (2 << 12) +#define WIN_BLEND_FACT_DST_ALPHA_MATCH_SEL_K2 (3 << 12) #define DC_WINBUF_BLEND_ALPHA_1BIT 0x719 -#define WIN_ALPHA_1BIT_WEIGHT0(x) (((x) & 0xFF) << 0) -#define WIN_ALPHA_1BIT_WEIGHT1(x) (((x) & 0xFF) << 8) +#define WIN_ALPHA_1BIT_WEIGHT0(x) (((x) & 0xFF) << 0) +#define WIN_ALPHA_1BIT_WEIGHT1(x) (((x) & 0xFF) << 8) /*! The following registers are A/B/C shadows of the 0xBC0/0xDC0/0xFC0 registers (see DISPLAY_WINDOW_HEADER). */ #define DC_WINBUF_START_ADDR 0x800 #define DC_WINBUF_ADDR_H_OFFSET 0x806 #define DC_WINBUF_ADDR_V_OFFSET 0x808 #define DC_WINBUF_SURFACE_KIND 0x80B -#define PITCH (0 << 0) -#define TILED (1 << 0) -#define BLOCK (2 << 0) -#define BLOCK_HEIGHT(x) (((x) & 0x7) << 4) +#define PITCH (0 << 0) +#define TILED (1 << 0) +#define BLOCK (2 << 0) +#define BLOCK_HEIGHT(x) (((x) & 0x7) << 4) #define DC_WINBUF_MEMFETCH_CONTROL 0x82B @@ -473,57 +472,57 @@ /*! Display serial interface registers. */ #define DSI_INCR_SYNCPT_CNTRL 0x1 -#define DSI_INCR_SYNCPT_SOFT_RESET BIT(0) -#define DSI_INCR_SYNCPT_NO_STALL BIT(8) +#define DSI_INCR_SYNCPT_SOFT_RESET BIT(0) +#define DSI_INCR_SYNCPT_NO_STALL BIT(8) #define DSI_RD_DATA 0x9 #define DSI_WR_DATA 0xA #define DSI_POWER_CONTROL 0xB -#define DSI_POWER_CONTROL_ENABLE 1 +#define DSI_POWER_CONTROL_ENABLE 1 #define DSI_INT_ENABLE 0xC #define DSI_INT_STATUS 0xD #define DSI_INT_MASK 0xE #define DSI_HOST_CONTROL 0xF -#define DSI_HOST_CONTROL_ECC BIT(0) -#define DSI_HOST_CONTROL_CS BIT(1) -#define DSI_HOST_CONTROL_PKT_BTA BIT(2) -#define DSI_HOST_CONTROL_IMM_BTA BIT(3) -#define DSI_HOST_CONTROL_FIFO_SEL BIT(4) -#define DSI_HOST_CONTROL_HS BIT(5) -#define DSI_HOST_CONTROL_RAW BIT(6) -#define DSI_HOST_CONTROL_TX_TRIG_MASK (3 << 12) -#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12) -#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12) -#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12) -#define DSI_HOST_CONTROL_CRC_RESET BIT(20) -#define DSI_HOST_CONTROL_FIFO_RESET BIT(21) +#define DSI_HOST_CONTROL_ECC BIT(0) +#define DSI_HOST_CONTROL_CS BIT(1) +#define DSI_HOST_CONTROL_PKT_BTA BIT(2) +#define DSI_HOST_CONTROL_IMM_BTA BIT(3) +#define DSI_HOST_CONTROL_FIFO_SEL BIT(4) +#define DSI_HOST_CONTROL_HS BIT(5) +#define DSI_HOST_CONTROL_RAW BIT(6) +#define DSI_HOST_CONTROL_TX_TRIG_MASK (3 << 12) +#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12) +#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12) +#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12) +#define DSI_HOST_CONTROL_CRC_RESET BIT(20) +#define DSI_HOST_CONTROL_FIFO_RESET BIT(21) #define DSI_CONTROL 0x10 -#define DSI_CONTROL_HOST_ENABLE BIT(0) -#define DSI_CONTROL_VIDEO_ENABLE BIT(1) -#define DSI_CONTROL_SOURCE(s) (((s) & 0x1) << 2) -#define DSI_CONTROL_DCS_ENABLE BIT(3) -#define DSI_CONTROL_LANES(n) (((n) & 0x3) << 4) -#define DSI_CONTROL_TX_TRIG(x) (((x) & 0x3) << 8) -#define DSI_CONTROL_FORMAT(f) (((f) & 0x3) << 12) -#define DSI_CONTROL_CHANNEL(c) (((c) & 0x3) << 16) -#define DSI_CONTROL_HS_CLK_CTRL BIT(20) +#define DSI_CONTROL_HOST_ENABLE BIT(0) +#define DSI_CONTROL_VIDEO_ENABLE BIT(1) +#define DSI_CONTROL_SOURCE(s) (((s) & 0x1) << 2) +#define DSI_CONTROL_DCS_ENABLE BIT(3) +#define DSI_CONTROL_LANES(n) (((n) & 0x3) << 4) +#define DSI_CONTROL_TX_TRIG(x) (((x) & 0x3) << 8) +#define DSI_CONTROL_FORMAT(f) (((f) & 0x3) << 12) +#define DSI_CONTROL_CHANNEL(c) (((c) & 0x3) << 16) +#define DSI_CONTROL_HS_CLK_CTRL BIT(20) #define DSI_SOL_DELAY 0x11 #define DSI_MAX_THRESHOLD 0x12 #define DSI_TRIGGER 0x13 -#define DSI_TRIGGER_VIDEO BIT(0) -#define DSI_TRIGGER_HOST BIT(1) +#define DSI_TRIGGER_VIDEO BIT(0) +#define DSI_TRIGGER_HOST BIT(1) #define DSI_TX_CRC 0x14 #define DSI_STATUS 0x15 -#define DSI_STATUS_RX_FIFO_SIZE 0x1F -#define DSI_STATUS_TX_FIFO_SIZE 0x20 // Actual depth is 64. +#define DSI_STATUS_RX_FIFO_SIZE 0x1F +#define DSI_STATUS_TX_FIFO_SIZE 0x20 // Actual depth is 64. #define DSI_INIT_SEQ_CONTROL 0x1A #define DSI_INIT_SEQ_DATA_0 0x1B @@ -548,8 +547,8 @@ #define DSI_PKT_LEN_2_3 0x35 #define DSI_PKT_LEN_4_5 0x36 #define DSI_PKT_LEN_6_7 0x37 -#define PKT0_LEN(x) (((x) & 0xFFFF) << 0) -#define PKT1_LEN(x) (((x) & 0xFFFF) << 16) +#define PKT0_LEN(x) (((x) & 0xFFFF) << 0) +#define PKT1_LEN(x) (((x) & 0xFFFF) << 16) #define DSI_PHY_TIMING_0 0x3C #define DSI_PHY_TIMING_1 0x3D @@ -557,34 +556,34 @@ #define DSI_BTA_TIMING 0x3F #define DSI_TIMEOUT_0 0x44 -#define DSI_TIMEOUT_HTX(x) (((x) & 0xFFFF) << 0) -#define DSI_TIMEOUT_LRX(x) (((x) & 0xFFFF) << 16) +#define DSI_TIMEOUT_HTX(x) (((x) & 0xFFFF) << 0) +#define DSI_TIMEOUT_LRX(x) (((x) & 0xFFFF) << 16) #define DSI_TIMEOUT_1 0x45 -#define DSI_TIMEOUT_TA(x) (((x) & 0xFFFF) << 0) -#define DSI_TIMEOUT_PR(x) (((x) & 0xFFFF) << 16) +#define DSI_TIMEOUT_TA(x) (((x) & 0xFFFF) << 0) +#define DSI_TIMEOUT_PR(x) (((x) & 0xFFFF) << 16) #define DSI_TO_TALLY 0x46 #define DSI_PAD_CONTROL_0 0x4B -#define DSI_PAD_CONTROL_VS1_PDIO_CLK BIT(8) -#define DSI_PAD_CONTROL_VS1_PDIO(x) (((x) & 0xF) << 0) -#define DSI_PAD_CONTROL_VS1_PULLDN_CLK BIT(24) -#define DSI_PAD_CONTROL_VS1_PULLDN(x) (((x) & 0xF) << 16) +#define DSI_PAD_CONTROL_VS1_PDIO_CLK BIT(8) +#define DSI_PAD_CONTROL_VS1_PDIO(x) (((x) & 0xF) << 0) +#define DSI_PAD_CONTROL_VS1_PULLDN_CLK BIT(24) +#define DSI_PAD_CONTROL_VS1_PULLDN(x) (((x) & 0xF) << 16) #define DSI_PAD_CONTROL_CD 0x4C #define DSI_VIDEO_MODE_CONTROL 0x4E -#define DSI_CMD_PKT_VID_ENABLE 1 -#define DSI_DSI_LINE_TYPE(x) ((x) << 1) +#define DSI_CMD_PKT_VID_ENABLE 1 +#define DSI_DSI_LINE_TYPE(x) ((x) << 1) #define DSI_PAD_CONTROL_1 0x4F #define DSI_PAD_CONTROL_2 0x50 #define DSI_PAD_CONTROL_3 0x51 -#define DSI_PAD_PREEMP_PU(x) (((x) & 0x3) << 0) -#define DSI_PAD_PREEMP_PD(x) (((x) & 0x3) << 4) -#define DSI_PAD_PREEMP_PU_CLK(x) (((x) & 0x3) << 8) -#define DSI_PAD_PREEMP_PD_CLK(x) (((x) & 0x3) << 12) +#define DSI_PAD_PREEMP_PU(x) (((x) & 0x3) << 0) +#define DSI_PAD_PREEMP_PD(x) (((x) & 0x3) << 4) +#define DSI_PAD_PREEMP_PU_CLK(x) (((x) & 0x3) << 8) +#define DSI_PAD_PREEMP_PD_CLK(x) (((x) & 0x3) << 12) #define DSI_PAD_CONTROL_4 0x52 #define DSI_PAD_CONTROL_5_B01 0x53 @@ -594,10 +593,10 @@ #define DSI_INIT_SEQ_DATA_15_B01 0x62 /*! DSI packet defines */ -#define DSI_ESCAPE_CMD 0x87 -#define DSI_ACK_NO_ERR 0x84 +#define DSI_ESCAPE_CMD 0x87 +#define DSI_ACK_NO_ERR 0x84 -#define ACK_ERROR_RES 0x02 +#define ACK_ERROR_RES 0x02 #define GEN_LONG_RD_RES 0x1A #define DCS_LONG_RD_RES 0x1C #define GEN_1_BYTE_SHORT_RD_RES 0x11 @@ -606,187 +605,187 @@ #define DCS_2_BYTE_SHORT_RD_RES 0x22 /*! MIPI registers. */ -#define MIPI_CAL_MIPI_CAL_CTRL (0x00 / 0x4) -#define MIPI_CAL_CIL_MIPI_CAL_STATUS (0x08 / 0x4) -#define MIPI_CAL_CILA_MIPI_CAL_CONFIG (0x14 / 0x4) -#define MIPI_CAL_CILB_MIPI_CAL_CONFIG (0x18 / 0x4) -#define MIPI_CAL_CILC_MIPI_CAL_CONFIG (0x1C / 0x4) -#define MIPI_CAL_CILD_MIPI_CAL_CONFIG (0x20 / 0x4) -#define MIPI_CAL_CILE_MIPI_CAL_CONFIG (0x24 / 0x4) -#define MIPI_CAL_CILF_MIPI_CAL_CONFIG (0x28 / 0x4) -#define MIPI_CAL_DSIA_MIPI_CAL_CONFIG (0x38 / 0x4) -#define MIPI_CAL_DSIB_MIPI_CAL_CONFIG (0x3C / 0x4) -#define MIPI_CAL_DSIC_MIPI_CAL_CONFIG (0x40 / 0x4) -#define MIPI_CAL_DSID_MIPI_CAL_CONFIG (0x44 / 0x4) -#define MIPI_CAL_MIPI_BIAS_PAD_CFG0 (0x58 / 0x4) -#define MIPI_CAL_MIPI_BIAS_PAD_CFG1 (0x5C / 0x4) -#define MIPI_CAL_MIPI_BIAS_PAD_CFG2 (0x60 / 0x4) +#define MIPI_CAL_MIPI_CAL_CTRL (0x00 / 0x4) +#define MIPI_CAL_CIL_MIPI_CAL_STATUS (0x08 / 0x4) +#define MIPI_CAL_CILA_MIPI_CAL_CONFIG (0x14 / 0x4) +#define MIPI_CAL_CILB_MIPI_CAL_CONFIG (0x18 / 0x4) +#define MIPI_CAL_CILC_MIPI_CAL_CONFIG (0x1C / 0x4) +#define MIPI_CAL_CILD_MIPI_CAL_CONFIG (0x20 / 0x4) +#define MIPI_CAL_CILE_MIPI_CAL_CONFIG (0x24 / 0x4) +#define MIPI_CAL_CILF_MIPI_CAL_CONFIG (0x28 / 0x4) +#define MIPI_CAL_DSIA_MIPI_CAL_CONFIG (0x38 / 0x4) +#define MIPI_CAL_DSIB_MIPI_CAL_CONFIG (0x3C / 0x4) +#define MIPI_CAL_DSIC_MIPI_CAL_CONFIG (0x40 / 0x4) +#define MIPI_CAL_DSID_MIPI_CAL_CONFIG (0x44 / 0x4) +#define MIPI_CAL_MIPI_BIAS_PAD_CFG0 (0x58 / 0x4) +#define MIPI_CAL_MIPI_BIAS_PAD_CFG1 (0x5C / 0x4) +#define MIPI_CAL_MIPI_BIAS_PAD_CFG2 (0x60 / 0x4) #define MIPI_CAL_DSIA_MIPI_CAL_CONFIG_2 (0x64 / 0x4) #define MIPI_CAL_DSIB_MIPI_CAL_CONFIG_2 (0x68 / 0x4) #define MIPI_CAL_DSIC_MIPI_CAL_CONFIG_2 (0x70 / 0x4) #define MIPI_CAL_DSID_MIPI_CAL_CONFIG_2 (0x74 / 0x4) /*! MIPI CMDs. */ -#define MIPI_DSI_V_SYNC_START 0x01 -#define MIPI_DSI_COLOR_MODE_OFF 0x02 +#define MIPI_DSI_V_SYNC_START 0x01 +#define MIPI_DSI_COLOR_MODE_OFF 0x02 #define MIPI_DSI_END_OF_TRANSMISSION 0x08 -#define MIPI_DSI_NULL_PACKET 0x09 -#define MIPI_DSI_V_SYNC_END 0x11 -#define MIPI_DSI_COLOR_MODE_ON 0x12 -#define MIPI_DSI_BLANKING_PACKET 0x19 -#define MIPI_DSI_H_SYNC_START 0x21 +#define MIPI_DSI_NULL_PACKET 0x09 +#define MIPI_DSI_V_SYNC_END 0x11 +#define MIPI_DSI_COLOR_MODE_ON 0x12 +#define MIPI_DSI_BLANKING_PACKET 0x19 +#define MIPI_DSI_H_SYNC_START 0x21 #define MIPI_DSI_SHUTDOWN_PERIPHERAL 0x22 -#define MIPI_DSI_H_SYNC_END 0x31 -#define MIPI_DSI_TURN_ON_PERIPHERAL 0x32 +#define MIPI_DSI_H_SYNC_END 0x31 +#define MIPI_DSI_TURN_ON_PERIPHERAL 0x32 #define MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE 0x37 -#define MIPI_DSI_DCS_SHORT_WRITE 0x05 -#define MIPI_DSI_DCS_READ 0x06 +#define MIPI_DSI_DCS_SHORT_WRITE 0x05 +#define MIPI_DSI_DCS_READ 0x06 #define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15 -#define MIPI_DSI_DCS_LONG_WRITE 0x39 +#define MIPI_DSI_DCS_LONG_WRITE 0x39 -#define MIPI_DSI_GENERIC_LONG_WRITE 0x29 -#define MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM 0x03 -#define MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM 0x13 -#define MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM 0x23 +#define MIPI_DSI_GENERIC_LONG_WRITE 0x29 +#define MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM 0x03 +#define MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM 0x13 +#define MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM 0x23 #define MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM 0x04 #define MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM 0x14 #define MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM 0x24 /*! MIPI DCS CMDs. */ -#define MIPI_DCS_NOP 0x00 -#define MIPI_DCS_SOFT_RESET 0x01 -#define MIPI_DCS_GET_COMPRESSION_MODE 0x03 -#define MIPI_DCS_GET_DISPLAY_ID 0x04 -#define MIPI_DCS_GET_DISPLAY_ID1 0xDA // GET_DISPLAY_ID Byte0, Module Manufacturer ID. -#define MIPI_DCS_GET_DISPLAY_ID2 0xDB // GET_DISPLAY_ID Byte1, Module/Driver Version ID. -#define MIPI_DCS_GET_DISPLAY_ID3 0xDC // GET_DISPLAY_ID Byte2, Module/Driver ID. -#define MIPI_DCS_GET_NUM_ERRORS 0x05 // 1 byte. -#define MIPI_DCS_GET_RED_CHANNEL 0x06 -#define MIPI_DCS_GET_GREEN_CHANNEL 0x07 -#define MIPI_DCS_GET_BLUE_CHANNEL 0x08 -#define MIPI_DCS_GET_DISPLAY_STATUS 0x09 // 4 bytes. -#define MIPI_DCS_GET_POWER_MODE 0x0A // 1 byte. 2: DISON, 3: NORON, 4: SLPOUT, 7: BSTON. -#define MIPI_DCS_GET_ADDRESS_MODE 0x0B // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. -#define MIPI_DCS_GET_PIXEL_FORMAT 0x0C // 1 byte. 4-6: DPI. -#define MIPI_DCS_GET_DISPLAY_MODE 0x0D // 1 byte. 0-2: GCS, 3: ALLPOFF, 4: ALLPON, 5: INVON. -#define MIPI_DCS_GET_SIGNAL_MODE 0x0E // 1 byte. 0: EODSI, 2: DEON, 3: PCLKON, 4: VSON, 5: HSON, 7: TEON. -#define MIPI_DCS_GET_DIAGNOSTIC_RESULT 0x0F // 1 byte. 6: FUNDT, 7: REGLD. -#define MIPI_DCS_ENTER_SLEEP_MODE 0x10 -#define MIPI_DCS_EXIT_SLEEP_MODE 0x11 -#define MIPI_DCS_ENTER_PARTIAL_MODE 0x12 -#define MIPI_DCS_ENTER_NORMAL_MODE 0x13 -#define MIPI_DCS_EXIT_INVERT_MODE 0x20 -#define MIPI_DCS_ENTER_INVERT_MODE 0x21 -#define MIPI_DCS_ALL_PIXELS_OFF 0x22 -#define MIPI_DCS_ALL_PIXELS_ON 0x23 -#define MIPI_DCS_SET_CONTRAST 0x25 // VCON in 40mV steps. 7-bit integer. -#define MIPI_DCS_SET_GAMMA_CURVE 0x26 // 1 byte. 0-7: GC. -#define MIPI_DCS_SET_DISPLAY_OFF 0x28 -#define MIPI_DCS_SET_DISPLAY_ON 0x29 -#define MIPI_DCS_SET_COLUMN_ADDRESS 0x2A -#define MIPI_DCS_SET_PAGE_ADDRESS 0x2B -#define MIPI_DCS_WRITE_MEMORY_START 0x2C -#define MIPI_DCS_WRITE_LUT 0x2D // 24-bit: 192 bytes. -#define MIPI_DCS_READ_MEMORY_START 0x2E -#define MIPI_DCS_SET_PARTIAL_ROWS 0x30 -#define MIPI_DCS_SET_PARTIAL_COLUMNS 0x31 -#define MIPI_DCS_SET_SCROLL_AREA 0x33 -#define MIPI_DCS_SET_TEAR_OFF 0x34 -#define MIPI_DCS_SET_TEAR_ON 0x35 -#define MIPI_DCS_SET_ADDRESS_MODE 0x36 // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. -#define MIPI_DCS_SET_SCROLL_START 0x37 -#define MIPI_DCS_EXIT_IDLE_MODE 0x38 -#define MIPI_DCS_ENTER_IDLE_MODE 0x39 -#define MIPI_DCS_SET_PIXEL_FORMAT 0x3A // 1 byte. 4-6: DPI. +#define MIPI_DCS_NOP 0x00 +#define MIPI_DCS_SOFT_RESET 0x01 +#define MIPI_DCS_GET_COMPRESSION_MODE 0x03 +#define MIPI_DCS_GET_DISPLAY_ID 0x04 +#define MIPI_DCS_GET_DISPLAY_ID1 0xDA // GET_DISPLAY_ID Byte0, Module Manufacturer ID. +#define MIPI_DCS_GET_DISPLAY_ID2 0xDB // GET_DISPLAY_ID Byte1, Module/Driver Version ID. +#define MIPI_DCS_GET_DISPLAY_ID3 0xDC // GET_DISPLAY_ID Byte2, Module/Driver ID. +#define MIPI_DCS_GET_NUM_ERRORS 0x05 // 1 byte. +#define MIPI_DCS_GET_RED_CHANNEL 0x06 +#define MIPI_DCS_GET_GREEN_CHANNEL 0x07 +#define MIPI_DCS_GET_BLUE_CHANNEL 0x08 +#define MIPI_DCS_GET_DISPLAY_STATUS 0x09 // 4 bytes. +#define MIPI_DCS_GET_POWER_MODE 0x0A // 1 byte. 2: DISON, 3: NORON, 4: SLPOUT, 7: BSTON. +#define MIPI_DCS_GET_ADDRESS_MODE 0x0B // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. +#define MIPI_DCS_GET_PIXEL_FORMAT 0x0C // 1 byte. 4-6: DPI. +#define MIPI_DCS_GET_DISPLAY_MODE 0x0D // 1 byte. 0-2: GCS, 3: ALLPOFF, 4: ALLPON, 5: INVON. +#define MIPI_DCS_GET_SIGNAL_MODE 0x0E // 1 byte. 0: EODSI, 2: DEON, 3: PCLKON, 4: VSON, 5: HSON, 7: TEON. +#define MIPI_DCS_GET_DIAGNOSTIC_RESULT 0x0F // 1 byte. 6: FUNDT, 7: REGLD. +#define MIPI_DCS_ENTER_SLEEP_MODE 0x10 +#define MIPI_DCS_EXIT_SLEEP_MODE 0x11 +#define MIPI_DCS_ENTER_PARTIAL_MODE 0x12 +#define MIPI_DCS_ENTER_NORMAL_MODE 0x13 +#define MIPI_DCS_EXIT_INVERT_MODE 0x20 +#define MIPI_DCS_ENTER_INVERT_MODE 0x21 +#define MIPI_DCS_ALL_PIXELS_OFF 0x22 +#define MIPI_DCS_ALL_PIXELS_ON 0x23 +#define MIPI_DCS_SET_CONTRAST 0x25 // VCON in 40mV steps. 7-bit integer. +#define MIPI_DCS_SET_GAMMA_CURVE 0x26 // 1 byte. 0-7: GC. +#define MIPI_DCS_SET_DISPLAY_OFF 0x28 +#define MIPI_DCS_SET_DISPLAY_ON 0x29 +#define MIPI_DCS_SET_COLUMN_ADDRESS 0x2A +#define MIPI_DCS_SET_PAGE_ADDRESS 0x2B +#define MIPI_DCS_WRITE_MEMORY_START 0x2C +#define MIPI_DCS_WRITE_LUT 0x2D // 24-bit: 192 bytes. +#define MIPI_DCS_READ_MEMORY_START 0x2E +#define MIPI_DCS_SET_PARTIAL_ROWS 0x30 +#define MIPI_DCS_SET_PARTIAL_COLUMNS 0x31 +#define MIPI_DCS_SET_SCROLL_AREA 0x33 +#define MIPI_DCS_SET_TEAR_OFF 0x34 +#define MIPI_DCS_SET_TEAR_ON 0x35 +#define MIPI_DCS_SET_ADDRESS_MODE 0x36 // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR. +#define MIPI_DCS_SET_SCROLL_START 0x37 +#define MIPI_DCS_EXIT_IDLE_MODE 0x38 +#define MIPI_DCS_ENTER_IDLE_MODE 0x39 +#define MIPI_DCS_SET_PIXEL_FORMAT 0x3A // 1 byte. 4-6: DPI. #define MIPI_DCS_WRITE_MEMORY_CONTINUE 0x3C -#define MIPI_DCS_READ_MEMORY_CONTINUE 0x3E -#define MIPI_DCS_GET_3D_CONTROL 0x3F -#define MIPI_DCS_SET_VSYNC_TIMING 0x40 -#define MIPI_DCS_SET_TEAR_SCANLINE 0x44 -#define MIPI_DCS_GET_SCANLINE 0x45 +#define MIPI_DCS_READ_MEMORY_CONTINUE 0x3E +#define MIPI_DCS_GET_3D_CONTROL 0x3F +#define MIPI_DCS_SET_VSYNC_TIMING 0x40 +#define MIPI_DCS_SET_TEAR_SCANLINE 0x44 +#define MIPI_DCS_GET_SCANLINE 0x45 #define MIPI_DCS_SET_TEAR_SCANLINE_WIDTH 0x46 -#define MIPI_DCS_GET_SCANLINE_WIDTH 0x47 -#define MIPI_DSI_AREA_COLOR_MODE 0x4C -#define MIPI_DCS_SET_BRIGHTNESS 0x51 // DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL. 1 byte. 0-7: DBV. -#define MIPI_DCS_GET_BRIGHTNESS 0x52 // 1 byte. 0-7: DBV. -#define MIPI_DCS_SET_CONTROL_DISPLAY 0x53 // 1 byte. 2: BL, 3: DD, 5: BCTRL. -#define MIPI_DCS_GET_CONTROL_DISPLAY 0x54 // 1 byte. 2: BL, 3: DD, 5: BCTRL. -#define MIPI_DCS_SET_CABC_VALUE 0x55 // 1 byte. 0-32: C, 4-7: C. -#define MIPI_DCS_GET_CABC_VALUE 0x56 // 1 byte. 0-32: C, 4-7: C. -#define MIPI_DCS_SET_CABC_MIN_BRI 0x5E // 1 byte. 0-7: CMB. -#define MIPI_DCS_GET_CABC_MIN_BRI 0x5F // 1 byte. 0-7: CMB. -#define MIPI_DCS_GET_AUTO_BRI_DIAG_RES 0x68 // 1 byte. 6-7: D. -#define MIPI_DCS_READ_DDB_START 0xA1 -#define MIPI_DCS_READ_DDB_CONTINUE 0xA8 // 0x100 size. +#define MIPI_DCS_GET_SCANLINE_WIDTH 0x47 +#define MIPI_DSI_AREA_COLOR_MODE 0x4C +#define MIPI_DCS_SET_BRIGHTNESS 0x51 // DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL. 1 byte. 0-7: DBV. +#define MIPI_DCS_GET_BRIGHTNESS 0x52 // 1 byte. 0-7: DBV. +#define MIPI_DCS_SET_CONTROL_DISPLAY 0x53 // 1 byte. 2: BL, 3: DD, 5: BCTRL. +#define MIPI_DCS_GET_CONTROL_DISPLAY 0x54 // 1 byte. 2: BL, 3: DD, 5: BCTRL. +#define MIPI_DCS_SET_CABC_VALUE 0x55 // 1 byte. 0-32: C, 4-7: C. +#define MIPI_DCS_GET_CABC_VALUE 0x56 // 1 byte. 0-32: C, 4-7: C. +#define MIPI_DCS_SET_CABC_MIN_BRI 0x5E // 1 byte. 0-7: CMB. +#define MIPI_DCS_GET_CABC_MIN_BRI 0x5F // 1 byte. 0-7: CMB. +#define MIPI_DCS_GET_AUTO_BRI_DIAG_RES 0x68 // 1 byte. 6-7: D. +#define MIPI_DCS_READ_DDB_START 0xA1 +#define MIPI_DCS_READ_DDB_CONTINUE 0xA8 // 0x100 size. /*! MIPI DCS Panel Private CMDs. */ -#define MIPI_DCS_PRIV_SM_SET_COLOR_MODE 0xA0 // 43 bytes. +#define MIPI_DCS_PRIV_SM_SET_COLOR_MODE 0xA0 // 43 bytes. #define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0 -#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 // OLED backlight tuning. Byte7: PWM transition time in frames. +#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 // OLED backlight tuning. Byte7: PWM transition time in frames. #define MIPI_DCS_PRIV_SET_POWER_CONTROL 0xB1 -#define MIPI_DCS_PRIV_SET_EXTC 0xB9 // Enable extended commands. -#define MIPI_DCS_PRIV_UNK_BD 0xBD -#define MIPI_DCS_PRIV_UNK_D5 0xD5 -#define MIPI_DCS_PRIV_UNK_D6 0xD6 -#define MIPI_DCS_PRIV_UNK_D8 0xD8 -#define MIPI_DCS_PRIV_UNK_D9 0xD9 -#define MIPI_DCS_PRIV_SM_DISPLAY_ID 0xDD - // LVL1 LVL2 LVL3 UNK0 UNK1 -#define MIPI_DCS_PRIV_SM_SET_REGS_LOCK 0xE2 // Samsung: Lock (default): 5A5A A5A5 A5A5 A500 A500. Lock/Unlock: A5/5A. LVL1 group is normal registers. -#define MIPI_DCS_PRIV_READ_EXTC_CMD_SPI 0xFE // Read EXTC Command In SPI. 1 byte. 0-6: EXT_SPI_CNT, 7:EXT_SP. -#define MIPI_DCS_PRIV_SET_EXTC_CMD_REG 0xFF // EXTC Command Set enable register. 5 bytes. Pass: FF 98 06 04, PAGE. +#define MIPI_DCS_PRIV_SET_EXTC 0xB9 // Enable extended commands. +#define MIPI_DCS_PRIV_UNK_BD 0xBD +#define MIPI_DCS_PRIV_UNK_D5 0xD5 +#define MIPI_DCS_PRIV_UNK_D6 0xD6 +#define MIPI_DCS_PRIV_UNK_D8 0xD8 +#define MIPI_DCS_PRIV_UNK_D9 0xD9 +#define MIPI_DCS_PRIV_SM_DISPLAY_ID 0xDD +// LVL1 LVL2 LVL3 UNK0 UNK1 +#define MIPI_DCS_PRIV_SM_SET_REGS_LOCK 0xE2 // Samsung: Lock (default): 5A5A A5A5 A5A5 A500 A500. Lock/Unlock: A5/5A. LVL1 group is normal registers. +#define MIPI_DCS_PRIV_READ_EXTC_CMD_SPI 0xFE // Read EXTC Command In SPI. 1 byte. 0-6: EXT_SPI_CNT, 7:EXT_SP. +#define MIPI_DCS_PRIV_SET_EXTC_CMD_REG 0xFF // EXTC Command Set enable register. 5 bytes. Pass: FF 98 06 04, PAGE. /*! MIPI DCS Panel Private CMDs PAGE 1. */ -#define MIPI_DCS_PRIV_GET_DISPLAY_ID4 0x00 -#define MIPI_DCS_PRIV_GET_DISPLAY_ID5 0x01 -#define MIPI_DCS_PRIV_GET_DISPLAY_ID6 0x02 +#define MIPI_DCS_PRIV_GET_DISPLAY_ID4 0x00 +#define MIPI_DCS_PRIV_GET_DISPLAY_ID5 0x01 +#define MIPI_DCS_PRIV_GET_DISPLAY_ID6 0x02 /*! MIPI DCS CMD Defines. */ -#define DCS_POWER_MODE_DISPLAY_ON BIT(2) -#define DCS_POWER_MODE_NORMAL_MODE BIT(3) -#define DCS_POWER_MODE_SLEEP_MODE BIT(4) -#define DCS_POWER_MODE_PARTIAL_MODE BIT(5) -#define DCS_POWER_MODE_IDLE_MODE BIT(6) +#define DCS_POWER_MODE_DISPLAY_ON BIT(2) +#define DCS_POWER_MODE_NORMAL_MODE BIT(3) +#define DCS_POWER_MODE_SLEEP_MODE BIT(4) +#define DCS_POWER_MODE_PARTIAL_MODE BIT(5) +#define DCS_POWER_MODE_IDLE_MODE BIT(6) -#define DCS_ADDRESS_MODE_V_FLIP BIT(0) -#define DCS_ADDRESS_MODE_H_FLIP BIT(1) -#define DCS_ADDRESS_MODE_LATCH_RL BIT(2) // Latch Data Order. -#define DCS_ADDRESS_MODE_BGR_COLOR BIT(3) -#define DCS_ADDRESS_MODE_LINE_ORDER BIT(4) // Line Refresh Order. -#define DCS_ADDRESS_MODE_SWAP_XY BIT(5) // Page/Column Addressing Reverse Order. -#define DCS_ADDRESS_MODE_MIRROR_X BIT(6) // Column Address Order. -#define DCS_ADDRESS_MODE_MIRROR_Y BIT(7) // Page Address Order. -#define DCS_ADDRESS_MODE_ROTATION_MASK (0xF << 4) -#define DCS_ADDRESS_MODE_ROTATION_90 (DCS_ADDRESS_MODE_SWAP_XY | DCS_ADDRESS_MODE_LINE_ORDER) -#define DCS_ADDRESS_MODE_ROTATION_180 (DCS_ADDRESS_MODE_MIRROR_X | DCS_ADDRESS_MODE_LINE_ORDER) -#define DCS_ADDRESS_MODE_ROTATION_270 (DCS_ADDRESS_MODE_SWAP_XY) +#define DCS_ADDRESS_MODE_V_FLIP BIT(0) +#define DCS_ADDRESS_MODE_H_FLIP BIT(1) +#define DCS_ADDRESS_MODE_LATCH_RL BIT(2) // Latch Data Order. +#define DCS_ADDRESS_MODE_BGR_COLOR BIT(3) +#define DCS_ADDRESS_MODE_LINE_ORDER BIT(4) // Line Refresh Order. +#define DCS_ADDRESS_MODE_SWAP_XY BIT(5) // Page/Column Addressing Reverse Order. +#define DCS_ADDRESS_MODE_MIRROR_X BIT(6) // Column Address Order. +#define DCS_ADDRESS_MODE_MIRROR_Y BIT(7) // Page Address Order. +#define DCS_ADDRESS_MODE_ROTATION_MASK (0xF << 4) +#define DCS_ADDRESS_MODE_ROTATION_90 (DCS_ADDRESS_MODE_SWAP_XY | DCS_ADDRESS_MODE_LINE_ORDER) +#define DCS_ADDRESS_MODE_ROTATION_180 (DCS_ADDRESS_MODE_MIRROR_X | DCS_ADDRESS_MODE_LINE_ORDER) +#define DCS_ADDRESS_MODE_ROTATION_270 (DCS_ADDRESS_MODE_SWAP_XY) -#define DCS_GAMMA_CURVE_NONE 0 -#define DCS_GAMMA_CURVE_GC0_1_8 BIT(0) -#define DCS_GAMMA_CURVE_GC1_2_5 BIT(1) -#define DCS_GAMMA_CURVE_GC2_1_0 BIT(2) -#define DCS_GAMMA_CURVE_GC3_1_0 BIT(3) // Are there more? +#define DCS_GAMMA_CURVE_NONE 0 +#define DCS_GAMMA_CURVE_GC0_1_8 BIT(0) +#define DCS_GAMMA_CURVE_GC1_2_5 BIT(1) +#define DCS_GAMMA_CURVE_GC2_1_0 BIT(2) +#define DCS_GAMMA_CURVE_GC3_1_0 BIT(3) // Are there more? -#define DCS_CONTROL_DISPLAY_SM_FLASHLIGHT BIT(2) -#define DCS_CONTROL_DISPLAY_BACKLIGHT_CTRL BIT(2) -#define DCS_CONTROL_DISPLAY_DIMMING_CTRL BIT(3) // Transition fading. +#define DCS_CONTROL_DISPLAY_SM_FLASHLIGHT BIT(2) +#define DCS_CONTROL_DISPLAY_BACKLIGHT_CTRL BIT(2) +#define DCS_CONTROL_DISPLAY_DIMMING_CTRL BIT(3) // Transition fading. #define DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL BIT(5) -#define DCS_CONTROL_DISPLAY_HBM_CTRL0 BIT(6) -#define DCS_CONTROL_DISPLAY_HBM_CTRL1 BIT(7) +#define DCS_CONTROL_DISPLAY_HBM_CTRL0 BIT(6) +#define DCS_CONTROL_DISPLAY_HBM_CTRL1 BIT(7) -#define DCS_SM_COLOR_MODE_SATURATED 0x00 // Disabled. Based on Vivid but over-saturated. -#define DCS_SM_COLOR_MODE_WASHED 0x45 -#define DCS_SM_COLOR_MODE_BASIC 0x03 // Real natural profile. -#define DCS_SM_COLOR_MODE_POR_RESET 0x20 // Reset value on power on. -#define DCS_SM_COLOR_MODE_NATURAL 0x23 // Not actually natural.. Extra saturation. -#define DCS_SM_COLOR_MODE_VIVID 0x65 // Saturated. -#define DCS_SM_COLOR_MODE_NIGHT0 0x43 // Based on Washed Out. -#define DCS_SM_COLOR_MODE_NIGHT1 0x15 // Based on Basic. -#define DCS_SM_COLOR_MODE_NIGHT2 0x35 // Based on Natural. -#define DCS_SM_COLOR_MODE_NIGHT3 0x75 // Based on Vivid. +#define DCS_SM_COLOR_MODE_SATURATED 0x00 // Disabled. Based on Vivid but over-saturated. +#define DCS_SM_COLOR_MODE_WASHED 0x45 +#define DCS_SM_COLOR_MODE_BASIC 0x03 // Real natural profile. +#define DCS_SM_COLOR_MODE_POR_RESET 0x20 // Reset value on power on. +#define DCS_SM_COLOR_MODE_NATURAL 0x23 // Not actually natural.. Extra saturation. +#define DCS_SM_COLOR_MODE_VIVID 0x65 // Saturated. +#define DCS_SM_COLOR_MODE_NIGHT0 0x43 // Based on Washed Out. +#define DCS_SM_COLOR_MODE_NIGHT1 0x15 // Based on Basic. +#define DCS_SM_COLOR_MODE_NIGHT2 0x35 // Based on Natural. +#define DCS_SM_COLOR_MODE_NIGHT3 0x75 // Based on Vivid. -#define DCS_SM_COLOR_MODE_ENABLE BIT(0) +#define DCS_SM_COLOR_MODE_ENABLE BIT(0) #define PANEL_SM_BL_CANDELA_MAX 2047 diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp index 6aa4a9c6..50ea9caa 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.cpp @@ -12,26 +12,27 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "display_refresh_rate.hpp" -#include #include #include +#include #include +#include "display_refresh_rate.hpp" + namespace display { - #define DSI_CLOCK_HZ 234000000llu - #define NVDISP_GET_MODE2 0x803C021B - #define NVDISP_SET_MODE2 0x403C021C - #define NVDISP_VALIDATE_MODE2 0xC03C021D - #define NVDISP_GET_MODE_DB2 0xEF20021E - #define NVDISP_GET_PANEL_DATA 0xC01C0226 +#define DSI_CLOCK_HZ 234000000llu +#define NVDISP_GET_MODE2 0x803C021B +#define NVDISP_SET_MODE2 0x403C021C +#define NVDISP_VALIDATE_MODE2 0xC03C021D +#define NVDISP_GET_MODE_DB2 0xEF20021E +#define NVDISP_GET_PANEL_DATA 0xC01C0226 - #define MAX_REFRESH_RATE 72 +#define MAX_REFRESH_RATE 72 - static DisplayRefreshConfig g_config = {0}; + static DisplayRefreshConfig g_config = { 0 }; static bool g_initialized = false; static uint8_t g_dockedHighestRefreshRate = 60; @@ -41,7 +42,8 @@ namespace display { static bool g_canChangeRefreshRateDocked = false; static uint8_t g_lastVActiveSet = 0; - static const uint8_t g_dockedRefreshRates[] = {40, 45, 50, 55, 60, 70, 72, 75, 80, 90, 95, 100, 110, 120, 130, 140, 144, 150, 160, 165, 170, 180, 190, 200, 210, 220, 230, 240}; + static const uint8_t g_dockedRefreshRates[] = { 40, 45, 50, 55, 60, 70, 72, 75, 80, 90, 95, 100, 110, 120, + 130, 140, 144, 150, 160, 165, 170, 180, 190, 200, 210, 220, 230, 240 }; // Calculate with this tool: // https://tomverbeure.github.io/video_timings_calculator?horiz_pixels=1920&vert_pixels=1080&refresh_rate=240&margins=false&interlaced=false&bpc=8&color_fmt=rgb444&video_opt=false&custom_hblank=80&custom_vblank=6 @@ -59,83 +61,85 @@ namespace display { } DockedTimings; */ static const DockedTimings g_dockedTimings1080p[] = { - {8, 32, 40, 7, 8, 6, 0, 88080}, // 40Hz - {8, 32, 40, 9, 8, 6, 0, 99270}, // 45Hz - {528, 44, 148, 4, 5, 36, 31, 148500}, // 50Hz - {8, 32, 40, 15, 8, 6, 0, 121990}, // 55Hz - {88, 44, 148, 4, 5, 36, 16, 148500}, // 60Hz - {8, 32, 40, 22, 8, 6, 0, 156240}, // 70Hz - {8, 32, 40, 23, 8, 6, 0, 160848}, // 72Hz - {8, 32, 40, 25, 8, 6, 0, 167850}, // 75Hz - {8, 32, 40, 28, 8, 6, 0, 179520}, // 80Hz - {8, 32, 40, 33, 8, 6, 0, 202860}, // 90Hz - {8, 32, 40, 36, 8, 6, 0, 214700}, // 95Hz - {528, 44, 148, 4, 5, 36, 64, 297000}, // 100Hz - {8, 32, 40, 44, 8, 6, 0, 250360}, // 110Hz - {88, 44, 148, 4, 5, 36, 63, 297000}, // 120Hz - {8, 32, 40, 55, 8, 6, 0, 298750}, //130Hz CVT-RBv2 - {8, 32, 40, 61, 8, 6, 0, 323400}, //140Hz CVT-RBv2 - {8, 32, 40, 63, 8, 6, 0, 333216}, //144Hz CVT-RBv2 - {8, 32, 40, 67, 8, 6, 0, 348300}, //150Hz CVT-RBv2 - {8, 32, 40, 72, 8, 6, 0, 373120}, //160Hz CVT-RBv2 - {8, 32, 40, 75, 8, 6, 0, 385770}, //165Hz CVT-RBv2 - {8, 32, 40, 78, 8, 6, 0, 398480}, //170Hz CVT-RBv2 - {8, 32, 40, 84, 8, 6, 0, 424080}, //180Hz CVT-RBv2 - {8, 32, 40, 90, 8, 6, 0, 449920}, //190Hz CVT-RBv2 - {8, 32, 40, 96, 8, 6, 0, 476000}, //200Hz CVT-RBv2 - {8, 32, 40, 102, 8, 6, 0, 502320}, //210Hz CVT-RBv2 - {8, 32, 40, 108, 8, 6, 0, 528880}, //220Hz CVT-RBv2 - {8, 32, 40, 114, 8, 6, 0, 555680}, //230Hz CVT-RBv2 - {8, 32, 40, 121, 8, 6, 0, 583200}, //240Hz CVT-RBv2 + { 8, 32, 40, 7, 8, 6, 0, 88080 }, // 40Hz + { 8, 32, 40, 9, 8, 6, 0, 99270 }, // 45Hz + { 528, 44, 148, 4, 5, 36, 31, 148500 }, // 50Hz + { 8, 32, 40, 15, 8, 6, 0, 121990 }, // 55Hz + { 88, 44, 148, 4, 5, 36, 16, 148500 }, // 60Hz + { 8, 32, 40, 22, 8, 6, 0, 156240 }, // 70Hz + { 8, 32, 40, 23, 8, 6, 0, 160848 }, // 72Hz + { 8, 32, 40, 25, 8, 6, 0, 167850 }, // 75Hz + { 8, 32, 40, 28, 8, 6, 0, 179520 }, // 80Hz + { 8, 32, 40, 33, 8, 6, 0, 202860 }, // 90Hz + { 8, 32, 40, 36, 8, 6, 0, 214700 }, // 95Hz + { 528, 44, 148, 4, 5, 36, 64, 297000 }, // 100Hz + { 8, 32, 40, 44, 8, 6, 0, 250360 }, // 110Hz + { 88, 44, 148, 4, 5, 36, 63, 297000 }, // 120Hz + { 8, 32, 40, 55, 8, 6, 0, 298750 }, // 130Hz CVT-RBv2 + { 8, 32, 40, 61, 8, 6, 0, 323400 }, // 140Hz CVT-RBv2 + { 8, 32, 40, 63, 8, 6, 0, 333216 }, // 144Hz CVT-RBv2 + { 8, 32, 40, 67, 8, 6, 0, 348300 }, // 150Hz CVT-RBv2 + { 8, 32, 40, 72, 8, 6, 0, 373120 }, // 160Hz CVT-RBv2 + { 8, 32, 40, 75, 8, 6, 0, 385770 }, // 165Hz CVT-RBv2 + { 8, 32, 40, 78, 8, 6, 0, 398480 }, // 170Hz CVT-RBv2 + { 8, 32, 40, 84, 8, 6, 0, 424080 }, // 180Hz CVT-RBv2 + { 8, 32, 40, 90, 8, 6, 0, 449920 }, // 190Hz CVT-RBv2 + { 8, 32, 40, 96, 8, 6, 0, 476000 }, // 200Hz CVT-RBv2 + { 8, 32, 40, 102, 8, 6, 0, 502320 }, // 210Hz CVT-RBv2 + { 8, 32, 40, 108, 8, 6, 0, 528880 }, // 220Hz CVT-RBv2 + { 8, 32, 40, 114, 8, 6, 0, 555680 }, // 230Hz CVT-RBv2 + { 8, 32, 40, 121, 8, 6, 0, 583200 }, // 240Hz CVT-RBv2 // technically you can go to 476hz, but in practice, why would you? }; // These timings *should* work but are untested static const HandheldTimings g_handheldTimingsRETRO[] = { - {72, 136, 72, 1, 660, 9, 78000}, // 40Hz - {72, 136, 72, 1, 612, 9, 77982}, // 41Hz - {72, 136, 72, 1, 567, 9, 77994}, // 42Hz - {72, 136, 72, 1, 524, 9, 78002}, // 43Hz - {72, 136, 72, 1, 483, 9, 78012}, // 44Hz - {72, 136, 72, 1, 443, 9, 77985}, // 45Hz - {72, 136, 72, 1, 406, 9, 78016}, // 46Hz - {72, 136, 72, 1, 370, 9, 78020}, // 47Hz - {72, 136, 72, 1, 335, 9, 78000}, // 48Hz - {72, 136, 72, 1, 302, 9, 78008}, // 49Hz - {72, 136, 72, 1, 270, 9, 78000}, // 50Hz - {72, 136, 72, 1, 239, 9, 77979}, // 51Hz - {72, 136, 72, 1, 210, 9, 78000}, // 52Hz - {72, 136, 72, 1, 182, 9, 78016}, // 53Hz - {72, 136, 72, 1, 154, 9, 77976}, // 54Hz - {72, 136, 72, 1, 128, 9, 77990}, // 55Hz - {72, 136, 72, 1, 103, 9, 78008}, // 56Hz - {72, 136, 72, 1, 78, 9, 77976}, // 57Hz - {72, 136, 72, 1, 55, 9, 78010}, // 58Hz - {72, 136, 72, 1, 32, 9, 77998}, // 59Hz - {72, 136, 72, 1, 10, 9, 78000}, // 60Hz + { 72, 136, 72, 1, 660, 9, 78000 }, // 40Hz + { 72, 136, 72, 1, 612, 9, 77982 }, // 41Hz + { 72, 136, 72, 1, 567, 9, 77994 }, // 42Hz + { 72, 136, 72, 1, 524, 9, 78002 }, // 43Hz + { 72, 136, 72, 1, 483, 9, 78012 }, // 44Hz + { 72, 136, 72, 1, 443, 9, 77985 }, // 45Hz + { 72, 136, 72, 1, 406, 9, 78016 }, // 46Hz + { 72, 136, 72, 1, 370, 9, 78020 }, // 47Hz + { 72, 136, 72, 1, 335, 9, 78000 }, // 48Hz + { 72, 136, 72, 1, 302, 9, 78008 }, // 49Hz + { 72, 136, 72, 1, 270, 9, 78000 }, // 50Hz + { 72, 136, 72, 1, 239, 9, 77979 }, // 51Hz + { 72, 136, 72, 1, 210, 9, 78000 }, // 52Hz + { 72, 136, 72, 1, 182, 9, 78016 }, // 53Hz + { 72, 136, 72, 1, 154, 9, 77976 }, // 54Hz + { 72, 136, 72, 1, 128, 9, 77990 }, // 55Hz + { 72, 136, 72, 1, 103, 9, 78008 }, // 56Hz + { 72, 136, 72, 1, 78, 9, 77976 }, // 57Hz + { 72, 136, 72, 1, 55, 9, 78010 }, // 58Hz + { 72, 136, 72, 1, 32, 9, 77998 }, // 59Hz + { 72, 136, 72, 1, 10, 9, 78000 }, // 60Hz }; - static const MinMaxRefreshRate g_handheldModeRefreshRate = {40, 80}; + static const MinMaxRefreshRate g_handheldModeRefreshRate = { 40, 80 }; static uint8_t _getDockedRefreshRateIterator(uint32_t refreshRate) { for (size_t i = 0; i < sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); i++) { - if (g_dockedRefreshRates[i] == refreshRate) return i; + if (g_dockedRefreshRates[i] == refreshRate) + return i; } return 0xFF; } - static void _changeOledElvssSettings(const uint32_t* offsets, const uint32_t* value, uint32_t size, uint32_t start) { - if (!g_config.dsiVirtAddr || !value || !size) return; + static void _changeOledElvssSettings(const uint32_t *offsets, const uint32_t *value, uint32_t size, uint32_t start) { + if (!g_config.dsiVirtAddr || !value || !size) + return; - volatile uint32_t* dsi = (uint32_t*)g_config.dsiVirtAddr; - - #define DSI_VIDEO_MODE_CONTROL 0x4E - #define DSI_WR_DATA 0xA - #define DSI_TRIGGER 0x13 - #define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15 - #define MIPI_DSI_DCS_LONG_WRITE 0x39 - #define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0 - #define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 + volatile uint32_t *dsi = (uint32_t *)g_config.dsiVirtAddr; + +#define DSI_VIDEO_MODE_CONTROL 0x4E +#define DSI_WR_DATA 0xA +#define DSI_TRIGGER 0x13 +#define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15 +#define MIPI_DSI_DCS_LONG_WRITE 0x39 +#define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0 +#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1 dsi[DSI_VIDEO_MODE_CONTROL] = true; svcSleepThread(20000000); @@ -164,9 +168,10 @@ namespace display { g_config.isDocked = isDocked; } - bool Initialize(const DisplayRefreshConfig* config) { - if (!config) return false; - + bool Initialize(const DisplayRefreshConfig *config) { + if (!config) + return false; + g_config = *config; g_initialized = true; return true; @@ -175,34 +180,38 @@ namespace display { void CorrectOledGamma(uint32_t refresh_rate) { static uint32_t last_refresh_rate = 60; static int counter = 0; - + if (g_config.isDocked || refresh_rate < 45 || refresh_rate > 60) { last_refresh_rate = 60; return; } - + if (counter != 9) { counter++; return; } counter = 0; - uint32_t offsets[] = {0x1A, 0x24, 0x25}; - uint32_t values[] = {2, 0, 0x83}; - + uint32_t offsets[] = { 0x1A, 0x24, 0x25 }; + uint32_t values[] = { 2, 0, 0x83 }; + if (refresh_rate == 60) { - if (last_refresh_rate == 60) return; + if (last_refresh_rate == 60) + return; } else if (refresh_rate == 45) { - if (last_refresh_rate == 45) return; - uint32_t vals[] = {4, 1, 0}; + if (last_refresh_rate == 45) + return; + uint32_t vals[] = { 4, 1, 0 }; memcpy(values, vals, sizeof(vals)); } else if (refresh_rate == 50) { - if (last_refresh_rate == 50) return; - uint32_t vals[] = {3, 1, 0}; + if (last_refresh_rate == 50) + return; + uint32_t vals[] = { 3, 1, 0 }; memcpy(values, vals, sizeof(vals)); } else if (refresh_rate == 55) { - if (last_refresh_rate == 55) return; - uint32_t vals[] = {3, 1, 0}; + if (last_refresh_rate == 55) + return; + uint32_t vals[] = { 3, 1, 0 }; memcpy(values, vals, sizeof(vals)); } else { return; @@ -227,69 +236,72 @@ namespace display { static void _getDockedHighestRefreshRate(uint32_t fd_in) { uint8_t highestRefreshRate = 60; uint32_t fd = fd_in; - - if(!fd) nvOpen(&fd, "/dev/nvdisp-disp1"); - NvdcModeDB2 db2 = {0}; + + if (!fd) + nvOpen(&fd, "/dev/nvdisp-disp1"); + NvdcModeDB2 db2 = { 0 }; int rc = nvIoctl(fd, NVDISP_GET_MODE_DB2, &db2); - + if (rc == 0) { for (size_t i = 0; i < db2.num_modes; i++) { - if (db2.modes[i].hActive < 1920 || db2.modes[i].vActive < 1080) + if (db2.modes[i].hActive < 1920 || db2.modes[i].vActive < 1080) continue; - + uint32_t v_total = db2.modes[i].vActive + db2.modes[i].vSyncWidth + db2.modes[i].vFrontPorch + db2.modes[i].vBackPorch; uint32_t h_total = db2.modes[i].hActive + db2.modes[i].hSyncWidth + db2.modes[i].hFrontPorch + db2.modes[i].hBackPorch; double refreshRate = round((double)(db2.modes[i].pclkKHz * 1000) / (double)(v_total * h_total)); - - if (highestRefreshRate < (uint8_t)refreshRate) + + if (highestRefreshRate < (uint8_t)refreshRate) highestRefreshRate = (uint8_t)refreshRate; } } else { g_dockedHighestRefreshRate = 60; } - + const size_t numRates = sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); - if (highestRefreshRate > g_dockedRefreshRates[numRates - 1]) + if (highestRefreshRate > g_dockedRefreshRates[numRates - 1]) highestRefreshRate = g_dockedRefreshRates[numRates - 1]; - - NvdcMode2 display_b = {0}; + + NvdcMode2 display_b = { 0 }; rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); - + struct dpaux_read_0x100 { uint32_t cmd; uint32_t addr; uint32_t size; struct { unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char downspread; unsigned char training_pattern; unsigned char lane_pattern[4]; unsigned char unk2[8]; } set; - } dpaux = {6, 0x100, 0x10}; - + } dpaux = { 6, 0x100, 0x10 }; + rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); if (rc == 0) { g_dockedLinkRate = dpaux.set.link_rate; - // if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && ) + // if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && ) // highestRefreshRate = 75; } - - if (!fd_in) nvClose(fd); + + if (!fd_in) + nvClose(fd); g_dockedHighestRefreshRate = highestRefreshRate; } static bool _setPLLDHandheldRefreshRate(uint32_t new_refreshRate) { - if (!g_config.clkVirtAddr) return false; + if (!g_config.clkVirtAddr) + return false; uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp0")) { return false; } - + struct dpaux_read { uint32_t cmd; uint32_t addr; @@ -298,24 +310,26 @@ namespace display { unsigned int rev_minor : 4; unsigned int rev_major : 4; unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char unk2[13]; } DPCD; - } dpaux = {6, 0, 0x10}; - + } dpaux = { 6, 0, 0x10 }; + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); nvClose(fd); - if (rc != 0x75c) return false; + if (rc != 0x75c) + return false; + + PLLD_BASE base = { 0 }; + PLLD_MISC misc = { 0 }; + memcpy(&base, (void *)(g_config.clkVirtAddr + 0xD0), 4); + memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4); - PLLD_BASE base = {0}; - PLLD_MISC misc = {0}; - memcpy(&base, (void*)(g_config.clkVirtAddr + 0xD0), 4); - memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4); - uint32_t value = ((base.PLLD_DIVN / base.PLLD_DIVM) * 10) / 4; - if (value == 0 || value == 80) return false; + if (value == 0 || value == 80) + return false; if (new_refreshRate > g_handheldModeRefreshRate.max) { new_refreshRate = g_handheldModeRefreshRate.max; @@ -337,7 +351,8 @@ namespace display { } } } - if (!skip) new_refreshRate = 60; + if (!skip) + new_refreshRate = 60; } uint32_t pixelClock = (9375 * ((4096 * ((2 * base.PLLD_DIVN) + 1)) + misc.PLLD_SDM_DIN)) / (8 * base.PLLD_DIVM); @@ -354,35 +369,34 @@ namespace display { uint64_t expected_pixel_clock = (DSI_CLOCK_HZ * new_refreshRate) / 60; misc.PLLD_SDM_DIN = ((8 * base.PLLD_DIVM * expected_pixel_clock) / 9375) - (4096 * ((2 * base.PLLD_DIVN) + 1)); - memcpy((void*)(g_config.clkVirtAddr + 0xD0), &base, 4); - memcpy((void*)(g_config.clkVirtAddr + 0xDC), &misc, 4); + memcpy((void *)(g_config.clkVirtAddr + 0xD0), &base, 4); + memcpy((void *)(g_config.clkVirtAddr + 0xDC), &misc, 4); return true; } static bool _setNvDispDockedRefreshRate(uint32_t new_refreshRate) { if (g_config.isLite || !g_canChangeRefreshRateDocked) return false; - + uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp1")) { return false; } - - NvdcMode2 display_b = {0}; + + NvdcMode2 display_b = { 0 }; int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { nvClose(fd); return false; } - + if (!display_b.pclkKHz) { nvClose(fd); return false; } - - if (!((display_b.vActive == 480 && display_b.hActive == 720) || - (display_b.vActive == 720 && display_b.hActive == 1280) || - (display_b.vActive == 1080 && display_b.hActive == 1920))) { + + if (!((display_b.vActive == 480 && display_b.hActive == 720) || (display_b.vActive == 720 && display_b.hActive == 1280) || + (display_b.vActive == 1080 && display_b.hActive == 1920))) { nvClose(fd); return false; } @@ -394,15 +408,15 @@ namespace display { uint32_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint32_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; uint32_t refreshRateNow = ((display_b.pclkKHz) * 1000 + 999) / (h_total * v_total); - + int8_t itr = -1; const size_t numRates = sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); - + // Find closest matching refresh rate if ((new_refreshRate <= 60) && ((60 % new_refreshRate) == 0)) { itr = _getDockedRefreshRateIterator(60); } - + if (itr == -1) { for (size_t i = 0; i < numRates; i++) { uint8_t val = g_dockedRefreshRates[i]; @@ -412,7 +426,7 @@ namespace display { } } } - + if (itr == -1) { if (!g_config.matchLowestDocked) { itr = _getDockedRefreshRateIterator(60); @@ -425,9 +439,10 @@ namespace display { } } } - - if (itr == -1) itr = _getDockedRefreshRateIterator(60); - + + if (itr == -1) + itr = _getDockedRefreshRateIterator(60); + // Clamp to highest allowed refresh rate if (g_dockedRefreshRates[itr] > g_dockedHighestRefreshRate) { for (int8_t i = itr; i >= 0; i--) { @@ -437,7 +452,7 @@ namespace display { } } } - + if (refreshRateNow == g_dockedRefreshRates[itr]) { nvClose(fd); return true; @@ -460,46 +475,47 @@ namespace display { display_b.sync = 3; display_b.bitsPerPixel = 24; } - + rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b); if (rc == 0) { rc = nvIoctl(fd, NVDISP_SET_MODE2, &display_b); } } - + nvClose(fd); return true; } static bool _setNvDispHandheldRefreshRate(uint32_t new_refreshRate) { - if (!g_config.isRetroSUPER) return false; - + if (!g_config.isRetroSUPER) + return false; + if (!g_config.displaySync) { g_wasRetroSuperTurnedOff = false; } else if (g_wasRetroSuperTurnedOff) { svcSleepThread(2000000000); g_wasRetroSuperTurnedOff = false; } - + svcSleepThread(1000000000); - + uint32_t fd = 0; if (nvOpen(&fd, "/dev/nvdisp-disp0")) { return false; } - - NvdcMode2 display_b = {0}; + + NvdcMode2 display_b = { 0 }; int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b); if (rc != 0) { nvClose(fd); return false; } - + if (!display_b.pclkKHz) { nvClose(fd); return false; } - + if ((display_b.vActive == 1280 && display_b.hActive == 720) == false) { nvClose(fd); return false; @@ -529,7 +545,8 @@ namespace display { } } } - if (!skip) new_refreshRate = 60; + if (!skip) + new_refreshRate = 60; } if (new_refreshRate == refreshRateNow) { @@ -552,25 +569,25 @@ namespace display { nvIoctl(fd, NVDISP_SET_MODE2, &display_b); } } - + nvClose(fd); return true; } bool SetRate(uint32_t new_refreshRate) { - if (!new_refreshRate || !g_initialized) return false; + if (!new_refreshRate || !g_initialized) + return false; uint32_t fd = 0; - + if (g_config.isRetroSUPER && !g_config.isDocked) { return _setNvDispHandheldRefreshRate(new_refreshRate); } else if ((!g_config.isRetroSUPER && g_config.isLite) || R_FAILED(nvOpen(&fd, "/dev/nvdisp-disp1"))) { - if (_setPLLDHandheldRefreshRate(new_refreshRate) == false) + if (_setPLLDHandheldRefreshRate(new_refreshRate) == false) return false; - } - else { + } else { struct dpaux_read { uint32_t cmd; uint32_t addr; @@ -579,48 +596,49 @@ namespace display { unsigned int rev_minor : 4; unsigned int rev_major : 4; unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char unk2[13]; } DPCD; - } dpaux = {6, 0, 0x10}; - + } dpaux = { 6, 0, 0x10 }; + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); nvClose(fd); - + if (rc != 0) { - if (!g_config.isRetroSUPER) { - return _setPLLDHandheldRefreshRate(new_refreshRate); - } else { - return _setNvDispHandheldRefreshRate(new_refreshRate); - } + if (!g_config.isRetroSUPER) { + return _setPLLDHandheldRefreshRate(new_refreshRate); + } else { + return _setNvDispHandheldRefreshRate(new_refreshRate); + } } else { - if(g_config.isDocked) + if (g_config.isDocked) return _setNvDispDockedRefreshRate(new_refreshRate); - else + else return true; } } return false; } - bool GetRate(uint32_t* out_refreshRate, bool internal) { - if (!out_refreshRate || !g_initialized || !g_config.clkVirtAddr) return false; + bool GetRate(uint32_t *out_refreshRate, bool internal) { + if (!out_refreshRate || !g_initialized || !g_config.clkVirtAddr) + return false; static uint32_t value = 60; if (g_config.isRetroSUPER && !g_config.isDocked) { uint32_t fd = 0; - PLLD_BASE temp = {0}; - PLLD_MISC misc = {0}; - memcpy(&temp, (void*)(g_config.clkVirtAddr + 0xD0), 4); - memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4); - + PLLD_BASE temp = { 0 }; + PLLD_MISC misc = { 0 }; + memcpy(&temp, (void *)(g_config.clkVirtAddr + 0xD0), 4); + memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4); + value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4; - + if (value != 0 && value != 80) { if (!nvOpen(&fd, "/dev/nvdisp-disp0")) { - NvdcMode2 display_b = {0}; + NvdcMode2 display_b = { 0 }; if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; @@ -634,21 +652,21 @@ namespace display { } else { g_wasRetroSuperTurnedOff = true; } - } - else if ((!g_config.isPossiblySpoofedRetro) || (g_config.isPossiblySpoofedRetro && !g_config.isRetroSUPER)) { - PLLD_BASE temp = {0}; - PLLD_MISC misc = {0}; - memcpy(&temp, (void*)(g_config.clkVirtAddr + 0xD0), 4); - memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4); - + } else if ((!g_config.isPossiblySpoofedRetro) || (g_config.isPossiblySpoofedRetro && !g_config.isRetroSUPER)) { + PLLD_BASE temp = { 0 }; + PLLD_MISC misc = { 0 }; + memcpy(&temp, (void *)(g_config.clkVirtAddr + 0xD0), 4); + memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4); + value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4; - + if (value == 0 || value == 80) { // Docked mode - if (g_config.isLite) return false; - + if (g_config.isLite) + return false; + g_config.isDocked = true; - + if (!g_canChangeRefreshRateDocked) { uint32_t fd = 0; if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { @@ -658,19 +676,19 @@ namespace display { uint32_t size; struct { unsigned char link_rate; - unsigned int lane_count: 5; - unsigned int unk1: 2; - unsigned int isFramingEnhanced: 1; + unsigned int lane_count : 5; + unsigned int unk1 : 2; + unsigned int isFramingEnhanced : 1; unsigned char downspread; unsigned char training_pattern; unsigned char lane_pattern[4]; unsigned char unk2[8]; } set; - } dpaux = {6, 0x100, 0x10}; - + } dpaux = { 6, 0x100, 0x10 }; + int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux); nvClose(fd); - + if (rc == 0) { _getDockedHighestRefreshRate(0); g_canChangeRefreshRateDocked = true; @@ -682,24 +700,24 @@ namespace display { return false; } } - if(internal) { + if (internal) { *out_refreshRate = value; return true; } uint32_t fd = 0; if (!nvOpen(&fd, "/dev/nvdisp-disp1")) { - NvdcMode2 display_b = {0}; + NvdcMode2 display_b = { 0 }; if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) { if (!display_b.pclkKHz) { nvClose(fd); return false; } - + if (g_lastVActive != display_b.vActive) { g_lastVActive = display_b.vActive; _getDockedHighestRefreshRate(fd); } - + uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch; uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch; uint64_t pixelClock = display_b.pclkKHz * 1000 + 999; @@ -711,16 +729,14 @@ namespace display { } else { value = 60; } - } - else if (!g_config.isRetroSUPER) { + } else if (!g_config.isRetroSUPER) { // Handheld mode g_config.isDocked = false; g_canChangeRefreshRateDocked = false; - + uint32_t pixelClock = (9375ULL * ((4096 * ((2 * temp.PLLD_DIVN) + 1)) + misc.PLLD_SDM_DIN)) / (8 * temp.PLLD_DIVM); value = pixelClock / (DSI_CLOCK_HZ / 60); - } - else { + } else { return false; } } @@ -733,4 +749,4 @@ namespace display { g_initialized = false; memset(&g_config, 0, sizeof(g_config)); } -} \ No newline at end of file +} // namespace display \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp index 32e91272..b145abf1 100644 --- a/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp +++ b/Source/hoc-clk/sysmodule/src/display/display_refresh_rate.hpp @@ -12,14 +12,14 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once -#include #include #include +#include namespace display { typedef struct { uint16_t hFrontPorch; @@ -71,35 +71,35 @@ namespace display { } NvdcModeDB2; typedef struct { - unsigned int PLLD_DIVM: 8; - unsigned int reserved_1: 3; - unsigned int PLLD_DIVN: 8; - unsigned int reserved_2: 1; - unsigned int PLLD_DIVP: 3; - unsigned int CSI_CLK_SRC: 1; - unsigned int reserved_3: 1; - unsigned int PLL_D: 1; - unsigned int reserved_4: 1; - unsigned int PLLD_LOCK: 1; - unsigned int reserved_5: 1; - unsigned int PLLD_REF_DIS: 1; - unsigned int PLLD_ENABLE: 1; - unsigned int PLLD_BYPASS: 1; + unsigned int PLLD_DIVM : 8; + unsigned int reserved_1 : 3; + unsigned int PLLD_DIVN : 8; + unsigned int reserved_2 : 1; + unsigned int PLLD_DIVP : 3; + unsigned int CSI_CLK_SRC : 1; + unsigned int reserved_3 : 1; + unsigned int PLL_D : 1; + unsigned int reserved_4 : 1; + unsigned int PLLD_LOCK : 1; + unsigned int reserved_5 : 1; + unsigned int PLLD_REF_DIS : 1; + unsigned int PLLD_ENABLE : 1; + unsigned int PLLD_BYPASS : 1; } PLLD_BASE; typedef struct { - signed int PLLD_SDM_DIN: 16; - unsigned int PLLD_EN_SDM: 1; - unsigned int PLLD_LOCK_OVERRIDE: 1; - unsigned int PLLD_EN_LCKDET: 1; - unsigned int PLLD_FREQLOCK: 1; - unsigned int PLLD_IDDQ: 1; - unsigned int PLLD_ENABLE_CLK: 1; - unsigned int PLLD_KVCO: 1; - unsigned int PLLD_KCP: 2; - unsigned int PLLD_PTS: 2; - unsigned int PLLD_LDPULSE_ADJ: 3; - unsigned int reserved: 2; + signed int PLLD_SDM_DIN : 16; + unsigned int PLLD_EN_SDM : 1; + unsigned int PLLD_LOCK_OVERRIDE : 1; + unsigned int PLLD_EN_LCKDET : 1; + unsigned int PLLD_FREQLOCK : 1; + unsigned int PLLD_IDDQ : 1; + unsigned int PLLD_ENABLE_CLK : 1; + unsigned int PLLD_KVCO : 1; + unsigned int PLLD_KCP : 2; + unsigned int PLLD_PTS : 2; + unsigned int PLLD_LDPULSE_ADJ : 3; + unsigned int reserved : 2; } PLLD_MISC; typedef struct { @@ -116,12 +116,12 @@ namespace display { bool displaySyncDocked; bool displaySyncDockedOutOfFocus60; } DisplayRefreshConfig; - bool Initialize(const DisplayRefreshConfig* config); + bool Initialize(const DisplayRefreshConfig *config); void SetDockedState(bool isDocked); bool SetRate(uint32_t new_refreshRate); - bool GetRate(uint32_t* out_refreshRate, bool internal); + bool GetRate(uint32_t *out_refreshRate, bool internal); uint8_t GetDockedHighestAllowed(void); void CorrectOledGamma(uint32_t refresh_rate); void SetAllowedDockedRatesIPC(uint32_t refreshRates, bool is720p); void Shutdown(void); -} \ No newline at end of file +} // namespace display \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/file/config.cpp b/Source/hoc-clk/sysmodule/src/file/config.cpp index 7b0d2569..d911cebb 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.cpp +++ b/Source/hoc-clk/sysmodule/src/file/config.cpp @@ -24,29 +24,30 @@ * -------------------------------------------------------------------------- */ -#include "config.hpp" -#include -#include -#include -#include #include +#include #include #include -#include -#include -#include -#include -#include -#include "../hos/apm_ext.h" #include -#include +#include #include +#include +#include +#include +#include #include -#include -#include +#include + #include "../board/board.hpp" +#include "../hos/apm_ext.h" +#include "config.hpp" #include "errors.hpp" #include "file_utils.hpp" +#include +#include +#include +#include +#include namespace config { @@ -57,7 +58,7 @@ namespace config { bool gLoaded = false; std::string gPath; time_t gMtime = 0; - std::atomic_bool gEnabled{false}; + std::atomic_bool gEnabled{ false }; std::uint32_t gOverrideFreqs[HocClkModule_EnumMax]; std::map, std::uint32_t> gProfileMHzMap; std::map gProfileCountMap; @@ -83,11 +84,12 @@ namespace config { return 0; } - std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, HocClkModule module, std::initializer_list profiles, u32 mhzMultiplier = 1000000) { + std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, HocClkModule module, std::initializer_list profiles, + u32 mhzMultiplier = 1000000) { std::uint32_t mhz = 0; if (gLoaded) { - for (auto profile: profiles) { + for (auto profile : profiles) { mhz = FindClockMHz(tid, module, profile); if (mhz) { break; @@ -98,7 +100,7 @@ namespace config { return std::max((std::uint32_t)0, mhz * mhzMultiplier); } - int BrowseIniFunc(const char* section, const char* key, const char* value, void* userdata) { + int BrowseIniFunc(const char *section, const char *key, const char *value, void *userdata) { (void)userdata; std::uint64_t input; if (!strcmp(section, CONFIG_VAL_SECTION)) { @@ -129,14 +131,14 @@ namespace config { HocClkModule parsedModule = HocClkModule_EnumMax; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { - const char* profileCode = board::GetProfileName((HocClkProfile)profile, false); + const char *profileCode = board::GetProfileName((HocClkProfile)profile, false); size_t profileCodeLen = strlen(profileCode); if (!strncmp(key, profileCode, profileCodeLen) && key[profileCodeLen] == '_') { - const char* subkey = key + profileCodeLen + 1; + const char *subkey = key + profileCodeLen + 1; for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { - const char* moduleCode = board::GetModuleName((HocClkModule)module, false); + const char *moduleCode = board::GetModuleName((HocClkModule)module, false); size_t moduleCodeLen = strlen(moduleCode); if (!strncmp(subkey, moduleCode, moduleCodeLen) && subkey[moduleCodeLen] == '\0') { parsedProfile = (HocClkProfile)profile; @@ -191,7 +193,7 @@ namespace config { gLoaded = true; } - } + } // namespace void Initialize() { gPath = FILE_CONFIG_DIR "/config.ini"; @@ -209,12 +211,12 @@ namespace config { } void Exit() { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; Close(); } bool Refresh() { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; if (!gLoaded || gMtime != CheckModificationTime()) { Load(); return true; @@ -223,30 +225,34 @@ namespace config { } bool HasProfilesLoaded() { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; return gLoaded; } std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw) { - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; switch (profile) { case HocClkProfile_Handheld: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_Handheld}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, { HocClkProfile_Handheld }, returnRaw ? 1 : 1000000); case HocClkProfile_HandheldCharging: case HocClkProfile_HandheldChargingUSB: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_HandheldChargingUSB, HocClkProfile_HandheldCharging, HocClkProfile_Handheld}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, + { HocClkProfile_HandheldChargingUSB, HocClkProfile_HandheldCharging, HocClkProfile_Handheld }, + returnRaw ? 1 : 1000000); case HocClkProfile_HandheldChargingOfficial: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_HandheldChargingOfficial, HocClkProfile_HandheldCharging, HocClkProfile_Handheld}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, + { HocClkProfile_HandheldChargingOfficial, HocClkProfile_HandheldCharging, HocClkProfile_Handheld }, + returnRaw ? 1 : 1000000); case HocClkProfile_Docked: - return FindClockHzFromProfiles(tid, module, {HocClkProfile_Docked}, returnRaw ? 1 : 1000000); + return FindClockHzFromProfiles(tid, module, { HocClkProfile_Docked }, returnRaw ? 1 : 1000000); default: ERROR_THROW("Unhandled HocClkProfile: %u", profile); } return 0; } - void GetProfiles(std::uint64_t tid, HocClkTitleProfileList* out_profiles) { - std::scoped_lock lock{gConfigMutex}; + void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles) { + std::scoped_lock lock{ gConfigMutex }; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { out_profiles->mhzMap[profile][module] = FindClockMHz(tid, (HocClkModule)module, (HocClkProfile)profile); @@ -254,11 +260,11 @@ namespace config { } } - bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList* profiles, bool immediate) { - std::scoped_lock lock{gConfigMutex}; + bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate) { + std::scoped_lock lock{ gConfigMutex }; uint8_t numProfiles = 0; - char section[17] = {0}; + char section[17] = { 0 }; snprintf(section, sizeof(section), "%016lX", tid); std::vector keys; @@ -266,16 +272,15 @@ namespace config { keys.reserve(+HocClkProfile_EnumMax * +HocClkModule_EnumMax); values.reserve(+HocClkProfile_EnumMax * +HocClkModule_EnumMax); - std::uint32_t* mhz = &profiles->mhz[0]; + std::uint32_t *mhz = &profiles->mhz[0]; for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { if (*mhz) { numProfiles++; - std::string key = std::string(board::GetProfileName((HocClkProfile)profile, false)) + - "_" + - board::GetModuleName((HocClkModule)module, false); + std::string key = + std::string(board::GetProfileName((HocClkProfile)profile, false)) + "_" + board::GetModuleName((HocClkModule)module, false); std::string value = std::to_string(*mhz); keys.push_back(key); @@ -285,8 +290,8 @@ namespace config { } } - std::vector keyPointers; - std::vector valuePointers; + std::vector keyPointers; + std::vector valuePointers; keyPointers.reserve(keys.size() + 1); valuePointers.reserve(values.size() + 1); @@ -337,45 +342,45 @@ namespace config { void SetOverrideHz(HocClkModule module, std::uint32_t hz) { ASSERT_ENUM_VALID(HocClkModule, module); - std::scoped_lock lock{gOverrideMutex}; + std::scoped_lock lock{ gOverrideMutex }; gOverrideFreqs[module] = hz; } std::uint32_t GetOverrideHz(HocClkModule module) { ASSERT_ENUM_VALID(HocClkModule, module); - std::scoped_lock lock{gOverrideMutex}; + std::scoped_lock lock{ gOverrideMutex }; return gOverrideFreqs[module]; } std::uint64_t GetConfigValue(HocClkConfigValue kval) { ASSERT_ENUM_VALID(HocClkConfigValue, kval); - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; return configValues[kval]; } - const char* GetConfigValueName(HocClkConfigValue kval, bool pretty) { + const char *GetConfigValueName(HocClkConfigValue kval, bool pretty) { ASSERT_ENUM_VALID(HocClkConfigValue, kval); return hocclkFormatConfigValue(kval, pretty); } - void GetConfigValues(HocClkConfigValueList* out_configValues) { - std::scoped_lock lock{gConfigMutex}; + void GetConfigValues(HocClkConfigValueList *out_configValues) { + std::scoped_lock lock{ gConfigMutex }; for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { out_configValues->values[kval] = configValues[kval]; } } - bool SetConfigValues(HocClkConfigValueList* configValues, bool immediate) { - std::scoped_lock lock{gConfigMutex}; + bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate) { + std::scoped_lock lock{ gConfigMutex }; - std::vector iniKeys; + std::vector iniKeys; std::vector iniValues; iniKeys.reserve(HocClkConfigValue_EnumMax + 1); iniValues.reserve(HocClkConfigValue_EnumMax); for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) { if (!hocclkValidConfigValue((HocClkConfigValue)kval, configValues->values[kval]) || - configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) { + configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) { continue; } iniValues.push_back(std::to_string(configValues->values[kval])); @@ -384,9 +389,9 @@ namespace config { iniKeys.push_back(NULL); - std::vector valuePointers; + std::vector valuePointers; valuePointers.reserve(iniValues.size() + 1); - for (const auto& val : iniValues) { + for (const auto &val : iniValues) { valuePointers.push_back(val.c_str()); } valuePointers.push_back(NULL); @@ -414,11 +419,11 @@ namespace config { return false; } - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; std::uint64_t defaultValue = hocclkDefaultConfigValue(kval); - std::vector iniKeys; + std::vector iniKeys; std::vector iniValues; iniKeys.reserve(2); iniValues.reserve(1); @@ -427,9 +432,9 @@ namespace config { iniValues.push_back(""); iniKeys.push_back(NULL); - std::vector valuePointers; + std::vector valuePointers; valuePointers.reserve(iniValues.size() + 1); - for (const auto& val : iniValues) { + for (const auto &val : iniValues) { valuePointers.push_back(val.c_str()); } valuePointers.push_back(NULL); @@ -453,9 +458,9 @@ namespace config { return false; } - std::scoped_lock lock{gConfigMutex}; + std::scoped_lock lock{ gConfigMutex }; - std::vector iniKeys; + std::vector iniKeys; std::vector iniValues; iniKeys.reserve(2); iniValues.reserve(1); @@ -464,7 +469,7 @@ namespace config { iniValues.push_back(std::to_string(value)); iniKeys.push_back(NULL); - std::vector valuePointers; + std::vector valuePointers; valuePointers.reserve(2); valuePointers.push_back(iniValues[0].c_str()); valuePointers.push_back(NULL); @@ -480,4 +485,8 @@ namespace config { return true; } -} + void DeleteKey(const char *section, const char *key) { + std::scoped_lock lock{ gConfigMutex }; + ini_puts(section, key, NULL, gPath.c_str()); + } +} // namespace config diff --git a/Source/hoc-clk/sysmodule/src/file/config.hpp b/Source/hoc-clk/sysmodule/src/file/config.hpp index 1b260fb9..969fa24b 100644 --- a/Source/hoc-clk/sysmodule/src/file/config.hpp +++ b/Source/hoc-clk/sysmodule/src/file/config.hpp @@ -40,8 +40,8 @@ namespace config { bool HasProfilesLoaded(); std::uint8_t GetProfileCount(std::uint64_t tid); - void GetProfiles(std::uint64_t tid, HocClkTitleProfileList* out_profiles); - bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList* profiles, bool immediate); + void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles); + bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate); std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw); void SetEnabled(bool enabled); @@ -50,12 +50,13 @@ namespace config { std::uint32_t GetOverrideHz(HocClkModule module); std::uint64_t GetConfigValue(HocClkConfigValue val); - const char* GetConfigValueName(HocClkConfigValue val, bool pretty); - void GetConfigValues(HocClkConfigValueList* out_configValues); - bool SetConfigValues(HocClkConfigValueList* configValues, bool immediate); + const char *GetConfigValueName(HocClkConfigValue val, bool pretty); + void GetConfigValues(HocClkConfigValueList *out_configValues); + bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate); bool ResetConfigValue(HocClkConfigValue kval); bool SetConfigValue(HocClkConfigValue kval, std::uint64_t value, bool immediate = true); + void DeleteKey(const char *section, const char *key); extern uint64_t configValues[HocClkConfigValue_EnumMax]; -} +} // namespace config diff --git a/Source/hoc-clk/sysmodule/src/file/errors.cpp b/Source/hoc-clk/sysmodule/src/file/errors.cpp index 7e19444f..14625cdd 100644 --- a/Source/hoc-clk/sysmodule/src/file/errors.cpp +++ b/Source/hoc-clk/sysmodule/src/file/errors.cpp @@ -24,13 +24,14 @@ * -------------------------------------------------------------------------- */ -#include "errors.hpp" -#include "file_utils.hpp" #include #include +#include "errors.hpp" +#include "file_utils.hpp" + namespace errors { - void ThrowException(const char* format, ...) { + void ThrowException(const char *format, ...) { va_list args; va_start(args, format); fileUtils::LogLine(format, args); @@ -38,4 +39,4 @@ namespace errors { diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); // throw std::runtime_error(msg); } -} +} // namespace errors diff --git a/Source/hoc-clk/sysmodule/src/file/errors.hpp b/Source/hoc-clk/sysmodule/src/file/errors.hpp index 8dc5dc27..ff9d5c7b 100644 --- a/Source/hoc-clk/sysmodule/src/file/errors.hpp +++ b/Source/hoc-clk/sysmodule/src/file/errors.hpp @@ -26,14 +26,13 @@ #pragma once -#include #include +#include #define ERROR_THROW(format, ...) errors::ThrowException(format "\n in %s:%u", ##__VA_ARGS__, __FILE__, __LINE__) #define ERROR_RESULT_THROW(rc, format, ...) ERROR_THROW(format "\n RC: [0x%x] %04d-%04d", ##__VA_ARGS__, rc, R_MODULE(rc), R_DESCRIPTION(rc)) -#define ASSERT_RESULT_OK(rc, format, ...) \ - if (R_FAILED(rc)) \ - { \ +#define ASSERT_RESULT_OK(rc, format, ...) \ + if (R_FAILED(rc)) { \ ERROR_RESULT_THROW(rc, "ASSERT_RESULT_OK: " format, ##__VA_ARGS__); \ } #define ASSERT_ENUM_VALID(n, v) \ @@ -43,6 +42,6 @@ namespace errors { - void ThrowException(const char* format, ...); + void ThrowException(const char *format, ...); } diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp index d7693016..efa651a4 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.cpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.cpp @@ -24,12 +24,13 @@ * -------------------------------------------------------------------------- */ -#include "file_utils.hpp" -#include "../hos/apm_ext.h" #include -#include #include +#include #include + +#include "../hos/apm_ext.h" +#include "file_utils.hpp" #include #include @@ -52,7 +53,7 @@ namespace fileUtils { return; } - FILE* file = fopen(FILE_LOG_FLAG_PATH, "r"); + FILE *file = fopen(FILE_LOG_FLAG_PATH, "r"); if (file) { g_log_enabled = true; fclose(file); @@ -63,11 +64,11 @@ namespace fileUtils { g_last_flag_check = now; } - void InitializeThreadFunc(void* args) { + void InitializeThreadFunc(void *args) { Initialize(); } - } + } // namespace bool IsInitialized() { return g_has_initialized; @@ -77,8 +78,8 @@ namespace fileUtils { return g_log_enabled; } - void LogLine(const char* format, ...) { - std::scoped_lock lock{g_log_mutex}; + void LogLine(const char *format, ...) { + std::scoped_lock lock{ g_log_mutex }; va_list args; va_start(args, format); @@ -86,7 +87,7 @@ namespace fileUtils { RefreshFlags(false); if (g_log_enabled) { - FILE* file = fopen(FILE_LOG_FILE_PATH, "a"); + FILE *file = fopen(FILE_LOG_FILE_PATH, "a"); if (file) { timespec now = {}; @@ -102,10 +103,10 @@ namespace fileUtils { va_end(args); } - void WriteContextToCsv(const HocClkContext* context) { - std::scoped_lock lock{g_csv_mutex}; + void WriteContextToCsv(const HocClkContext *context) { + std::scoped_lock lock{ g_csv_mutex }; - FILE* file = fopen(FILE_CONTEXT_CSV_PATH, "a"); + FILE *file = fopen(FILE_CONTEXT_CSV_PATH, "a"); if (file) { // Print header @@ -134,7 +135,8 @@ namespace fileUtils { struct timespec now; clock_gettime(CLOCK_REALTIME, &now); - fprintf(file, "%ld%03ld,%s,%016lx", now.tv_sec, now.tv_nsec / 1000000UL, hocclkFormatProfile(context->profile, false), context->applicationId); + fprintf(file, "%ld%03ld,%s,%016lx", now.tv_sec, now.tv_nsec / 1000000UL, hocclkFormatProfile(context->profile, false), + context->applicationId); for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { fprintf(file, ",%d", context->freqs[module]); @@ -164,7 +166,7 @@ namespace fileUtils { } void InitializeAsync() { - Thread initThread = {0}; + Thread initThread = { 0 }; threadCreate(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0); threadStart(&initThread); } @@ -210,4 +212,4 @@ namespace fileUtils { fsExit(); } -} +} // namespace fileUtils diff --git a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp index d00bd8f5..80460f46 100644 --- a/Source/hoc-clk/sysmodule/src/file/file_utils.hpp +++ b/Source/hoc-clk/sysmodule/src/file/file_utils.hpp @@ -26,13 +26,13 @@ #pragma once -#include -#include -#include -#include #include #include #include +#include +#include +#include +#include #define FILE_CONFIG_DIR "/config/" CONFIG_DIR #define FILE_FLAG_CHECK_INTERVAL_NS (10000ULL * 1000000000ULL) @@ -47,7 +47,7 @@ namespace fileUtils { bool IsInitialized(); bool IsLogEnabled(); void InitializeAsync(); - void LogLine(const char* format, ...); - void WriteContextToCsv(const HocClkContext* context); + void LogLine(const char *format, ...); + void WriteContextToCsv(const HocClkContext *context); -} +} // namespace fileUtils diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 226444df..45ec7855 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -15,17 +15,17 @@ * */ -#include "kip.hpp" -#include "../i2c/i2cDrv.h" #include "../board/board.hpp" -#include "file_utils.hpp" +#include "../i2c/i2cDrv.h" #include "../mgr/clock_manager.hpp" +#include "file_utils.hpp" +#include "kip.hpp" + namespace kip { bool kipAvailable = false; - void SetKipData() - { + void SetKipData() { // TODO: figure out if this REALLY causes issues (i doubt it) // if(board::GetSocType() == HocClkSocType_Mariko) { // if(R_FAILED(I2c_BuckConverter_SetMvOut(&I2c_Mariko_DRAM_VDDQ, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt) / 1000))) { @@ -34,32 +34,32 @@ namespace kip { // } // } CustomizeTable table; - FILE* fp; - fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r"); + FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r+b"); if (fp == NULL) { notification::writeNotification("Horizon OC\nKIP konnte nicht geöffnet werden!"); kipAvailable = false; return; - } else { - kipAvailable = true; - fclose(fp); } + kipAvailable = true; - if (!cust_read_and_cache("sdmc:/atmosphere/kips/hoc.kip", &table)) { + if (!cust_read_table_f(fp, &table)) { + fclose(fp); fileUtils::LogLine("[kip] Failed to read KIP file"); notification::writeNotification("Horizon OC\nKIP konnte nicht gelesen werden!"); return; } - u32 custRev = cust_get_cust_rev(&table); + u32 custRev = cust_get_cust_rev(&table); u32 kipVersion = cust_get_kip_version(&table); if (custRev < CUST_REV || kipVersion < KIP_VERSION) { + fclose(fp); notification::writeNotification("Horizon OC\nVeraltetes KIP erkannt!\nBitte Horizon OC aktualisieren"); fileUtils::LogLine("Cust revision: %u", custRev); fileUtils::LogLine("Kip version: %u", kipVersion); return; } else if (custRev > CUST_REV || kipVersion > KIP_VERSION) { + fclose(fp); notification::writeNotification("Horizon OC\nVeraltetes Sysmodule erkannt!\nBitte Horizon OC aktualisieren"); fileUtils::LogLine("Cust revision: %u", custRev); fileUtils::LogLine("Kip version: %u", kipVersion); @@ -71,8 +71,6 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, commonEmcMemVolt, config::GetConfigValue(KipConfigValue_commonEmcMemVolt)); CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock)); - CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock1, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock1)); - CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock2, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock2)); CUST_WRITE_FIELD_BATCH(&table, marikoEmcMaxClock, config::GetConfigValue(KipConfigValue_marikoEmcMaxClock)); CUST_WRITE_FIELD_BATCH(&table, marikoEmcVddqVolt, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt)); CUST_WRITE_FIELD_BATCH(&table, emcDvbShift, config::GetConfigValue(KipConfigValue_emcDvbShift)); @@ -103,8 +101,6 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, writeLatency1866, config::GetConfigValue(KipConfigValue_write_latency_1866)); CUST_WRITE_FIELD_BATCH(&table, writeLatency2133, config::GetConfigValue(KipConfigValue_write_latency_2133)); - CUST_WRITE_FIELD_BATCH(&table, mem_burst_read_latency, config::GetConfigValue(KipConfigValue_mem_burst_read_latency)); - CUST_WRITE_FIELD_BATCH(&table, mem_burst_write_latency, config::GetConfigValue(KipConfigValue_mem_burst_write_latency)); CUST_WRITE_FIELD_BATCH(&table, eristaCpuUV, config::GetConfigValue(KipConfigValue_eristaCpuUV)); CUST_WRITE_FIELD_BATCH(&table, eristaCpuVmin, config::GetConfigValue(KipConfigValue_eristaCpuVmin)); CUST_WRITE_FIELD_BATCH(&table, eristaCpuMaxVolt, config::GetConfigValue(KipConfigValue_eristaCpuMaxVolt)); @@ -130,7 +126,6 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmax, config::GetConfigValue(KipConfigValue_marikoGpuVmax)); CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, config::GetConfigValue(KipConfigValue_commonGpuVoltOffset)); - CUST_WRITE_FIELD_BATCH(&table, gpuSpeedo, config::GetConfigValue(KipConfigValue_gpuSpeedo)); for (int i = 0; i < 24; i++) { table.marikoGpuVoltArray[i] = config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_76800 + i)); @@ -143,18 +138,22 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune)); CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune)); - if (!cust_write_table("sdmc:/atmosphere/kips/hoc.kip", &table)) { + if (!cust_write_table_f(fp, &table)) { + fclose(fp); fileUtils::LogLine("[kip] Failed to write KIP file"); notification::writeNotification("Horizon OC\nKIP konnte nicht geschrieben werden!"); + return; } + fclose(fp); HocClkConfigValueList configValues; config::GetConfigValues(&configValues); - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum - if (config::SetConfigValues(&configValues, false)) { - fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); + if (config::SetConfigValues(&configValues, true)) { + fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], + configValues.values[KipConfigValue_custRev]); for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } @@ -166,51 +165,50 @@ namespace kip { // I know this is very hacky, but the config system in the sysmodule doesn't really support writing - void GetKipData() - { - FILE* fp; - fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r"); + void GetKipData() { + FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "rb"); if (fp == NULL) { notification::writeNotification("Horizon OC\nKIP konnte nicht geöffnet werden!"); kipAvailable = false; return; - } else { - kipAvailable = true; - fclose(fp); } + kipAvailable = true; HocClkConfigValueList configValues; config::GetConfigValues(&configValues); CustomizeTable table; - if (!cust_read_and_cache("sdmc:/atmosphere/kips/hoc.kip", &table)) { + if (!cust_read_table_f(fp, &table)) { + fclose(fp); fileUtils::LogLine("[kip] Failed to read KIP file for GetKipData"); notification::writeNotification("Horizon OC\nKIP konnte nicht gelesen werden!"); return; } + fclose(fp); // if(cust_get_cust_rev(&table) != CUST_REV) { // notification::writeNotification("Horizon OC\nKIP-Versionskonflikt!\nBitte Horizon OC neu installieren"); // return; // } - if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { + if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && + !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { MigrateKipData(cust_get_cust_rev(&table), cust_get_kip_version(&table)); SetKipData(); notification::writeNotification("Horizon OC\nKIP wurde aktualisiert\nBitte Konsole neu starten"); return; } if (config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) { - configValues.values[HocClkConfigValue_IsFirstLoad] = (u64)false; + configValues.values[HocClkConfigValue_IsFirstLoad] = (u64) false; notification::writeNotification("Horizon OC wurde installiert"); } - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum // configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); - clockManager::gContext.custRev = cust_get_cust_rev(&table); + clockManager::gContext.custRev = cust_get_cust_rev(&table); - u32 custRev = cust_get_cust_rev(&table); + u32 custRev = cust_get_cust_rev(&table); u32 kipVersion = cust_get_kip_version(&table); if (custRev < CUST_REV || kipVersion < KIP_VERSION) { notification::writeNotification("Horizon OC\nVeraltetes KIP erkannt!\nBitte Horizon OC aktualisieren"); @@ -226,13 +224,11 @@ namespace kip { clockManager::gContext.kipVersion = kipVersion; configValues.values[KipConfigValue_custRev] = cust_get_cust_rev(&table); - configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process + configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table); configValues.values[KipConfigValue_commonEmcMemVolt] = cust_get_common_emc_volt(&table); configValues.values[KipConfigValue_eristaEmcMaxClock] = cust_get_erista_emc_max(&table); - configValues.values[KipConfigValue_eristaEmcMaxClock1] = cust_get_erista_emc_max1(&table); - configValues.values[KipConfigValue_eristaEmcMaxClock2] = cust_get_erista_emc_max2(&table); configValues.values[KipConfigValue_marikoEmcMaxClock] = cust_get_mariko_emc_max(&table); configValues.values[KipConfigValue_marikoEmcVddqVolt] = cust_get_mariko_emc_vddq(&table); configValues.values[KipConfigValue_emcDvbShift] = cust_get_emc_dvb_shift(&table); @@ -263,9 +259,6 @@ namespace kip { configValues.values[KipConfigValue_write_latency_1866] = cust_get_write_latency_1866(&table); configValues.values[KipConfigValue_write_latency_2133] = cust_get_write_latency_2133(&table); - configValues.values[KipConfigValue_mem_burst_read_latency] = cust_get_burst_read_lat(&table); - configValues.values[KipConfigValue_mem_burst_write_latency] = cust_get_burst_write_lat(&table); - configValues.values[KipConfigValue_eristaCpuUV] = cust_get_erista_cpu_uv(&table); configValues.values[KipConfigValue_eristaCpuVmin] = cust_get_eristaCpuVmin(&table); configValues.values[KipConfigValue_eristaCpuMaxVolt] = cust_get_erista_cpu_max_volt(&table); @@ -288,7 +281,6 @@ namespace kip { configValues.values[KipConfigValue_marikoGpuBootVolt] = cust_get_mariko_gpu_boot_volt(&table); configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table); configValues.values[KipConfigValue_commonGpuVoltOffset] = cust_get_common_gpu_offset(&table); - configValues.values[KipConfigValue_gpuSpeedo] = board::GetFuseData()->gpuSpeedo; // cust_get_gpu_speedo(&table); for (int i = 0; i < 24; i++) { configValues.values[KipConfigValue_g_volt_76800 + i] = cust_get_mariko_gpu_volt(&table, i); @@ -302,8 +294,9 @@ namespace kip { configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table); if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { - if (config::SetConfigValues(&configValues, false)) { - fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); + if (config::SetConfigValues(&configValues, true)) { + fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], + configValues.values[KipConfigValue_custRev]); for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } @@ -321,12 +314,25 @@ namespace kip { HocClkConfigValueList configValues; config::GetConfigValues(&configValues); u32 previousVersion = configValues.values[KipConfigValue_KipVersion]; - if(previousVersion < 240 && version >= 240) { - // <2.4.0 -> 2.4.0 migration: add marikoGpuBootVolt with default value of 800mV + if (previousVersion < 240 && version >= 240) { + // <2.4.0 -> 2.4.0 migration + + // add marikoGpuBootVolt with default value of 800mV configValues.values[KipConfigValue_marikoGpuBootVolt] = 800; + + configValues.values[KipConfigValue_marikoGpuUV] += 2; // Raise UV levels + configValues.values[KipConfigValue_commonGpuVoltOffset] = + (u32)(-(s64)(configValues.values[KipConfigValue_commonGpuVoltOffset])); // Migrate GPU Volt Offset + // Raise min cpu vmin + if (configValues.values[KipConfigValue_eristaCpuVmin] < 750) { + configValues.values[KipConfigValue_eristaCpuVmin] = 750; + } + + // delete handheld TDP config entries + config::DeleteKey(CONFIG_VAL_SECTION, "handheld_tdp"); + config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit"); + config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l"); } config::SetConfigValues(&configValues, true); - // This function cannot do anything at the moment. The capabilities will be expanded in the next release } -} - +} // namespace kip diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 47fcfe8d..2152dac3 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -16,28 +16,28 @@ */ #pragma once -#include -#include -#include +#include +#include #include #include +#include +#include +#include + #include "config.hpp" #include "file_utils.hpp" -#include -#include + namespace kip { extern bool kipAvailable; typedef struct { - u8 cust[4]; + u8 cust[4]; u32 custRev; u32 kipVersion; u32 hpMode; u32 commonEmcMemVolt; u32 eristaEmcMaxClock; - u32 eristaEmcMaxClock1; - u32 eristaEmcMaxClock2; u32 stepMode; u32 marikoEmcMaxClock; u32 marikoEmcVddqVolt; @@ -64,9 +64,6 @@ namespace kip { u32 readLatency1333, readLatency1600, readLatency1866, readLatency2133; u32 writeLatency1333, writeLatency1600, writeLatency1866, writeLatency2133; - u32 mem_burst_read_latency; - u32 mem_burst_write_latency; - u32 eristaCpuUV; u32 eristaCpuVmin; u32 eristaCpuMaxVolt; @@ -93,8 +90,6 @@ namespace kip { u32 commonGpuVoltOffset; - u32 gpuSpeedo; - u32 eristaGpuVoltArray[27]; u32 marikoGpuVoltArray[24]; @@ -104,24 +99,25 @@ namespace kip { u32 reserved[60]; } CustomizeTable; - #define CUST_MAGIC "CUST" - #define CUST_MAGIC_LEN 4 +#define CUST_MAGIC "CUST" +#define CUST_MAGIC_LEN 4 typedef struct { - FILE* file; + FILE *file; long offset; CustomizeTable cached_table; bool has_cache; } CustHandle; - static inline bool cust_find_offset(FILE* f, long* out_offset) { + static inline bool cust_find_offset(FILE *f, long *out_offset) { u8 buf[512]; long pos = 0; fseek(f, 0, SEEK_SET); while (1) { size_t r = fread(buf, 1, sizeof(buf), f); - if (r < CUST_MAGIC_LEN) break; + if (r < CUST_MAGIC_LEN) + break; for (size_t i = 0; i <= r - CUST_MAGIC_LEN; i++) { if (memcmp(&buf[i], CUST_MAGIC, CUST_MAGIC_LEN) == 0) { @@ -135,293 +131,503 @@ namespace kip { return false; } - static inline bool cust_read_table(const char* path, CustomizeTable* out) { - FILE* f = fopen(path, "rb"); - if (!f) return false; + static long cachedCustOffset = -1; + static inline long cust_get_offset(FILE *f) { + if (cachedCustOffset >= 0) + return cachedCustOffset; long off; - if (!cust_find_offset(f, &off)) { - fclose(f); - return false; - } - - fseek(f, 0, SEEK_END); - long size = ftell(f); - - if (off + (long)sizeof(CustomizeTable) > size) { - fclose(f); - return false; - } - - fseek(f, off, SEEK_SET); - bool ok = fread(out, 1, sizeof(CustomizeTable), f) == sizeof(CustomizeTable); - fclose(f); - - return ok && memcmp(out->cust, CUST_MAGIC, CUST_MAGIC_LEN) == 0; + if (!cust_find_offset(f, &off)) + return -1; + cachedCustOffset = off; + return off; } - static inline bool cust_write_table(const char* path, const CustomizeTable* in) { - FILE* f = fopen(path, "r+b"); - if (!f) return false; - - long off; - if (!cust_find_offset(f, &off)) { - fclose(f); + static inline bool cust_read_table_f(FILE *f, CustomizeTable *out) { + long off = cust_get_offset(f); + if (off < 0) return false; - } fseek(f, 0, SEEK_END); - long size = ftell(f); + if (off + (long)sizeof(CustomizeTable) > ftell(f)) + return false; - if (off + (long)sizeof(CustomizeTable) > size) { - fclose(f); + fseek(f, off, SEEK_SET); + if (fread(out, 1, sizeof(CustomizeTable), f) != sizeof(CustomizeTable)) + return false; + + if (memcmp(out->cust, CUST_MAGIC, CUST_MAGIC_LEN) != 0) { + cachedCustOffset = -1; return false; } + return true; + } + + static inline bool cust_write_table_f(FILE *f, const CustomizeTable *in) { + long off = cust_get_offset(f); + if (off < 0) + return false; + + fseek(f, 0, SEEK_END); + if (off + (long)sizeof(CustomizeTable) > ftell(f)) + return false; fseek(f, off, SEEK_SET); bool ok = fwrite(in, 1, sizeof(CustomizeTable), f) == sizeof(CustomizeTable); fflush(f); - fclose(f); - return ok; } - static inline bool cust_read_and_cache(const char* path, CustomizeTable* out) { + static inline bool cust_read_table(const char *path, CustomizeTable *out) { + FILE *f = fopen(path, "rb"); + if (!f) + return false; + bool ok = cust_read_table_f(f, out); + fclose(f); + return ok; + } + + static inline bool cust_write_table(const char *path, const CustomizeTable *in) { + FILE *f = fopen(path, "r+b"); + if (!f) + return false; + bool ok = cust_write_table_f(f, in); + fclose(f); + return ok; + } + + static inline bool cust_read_and_cache(const char *path, CustomizeTable *out) { return cust_read_table(path, out); } - #define CUST_WRITE_FIELD_BATCH(table, field, val) \ - do { \ - (table)->field = (val); \ - } while (0) +#define CUST_WRITE_FIELD_BATCH(table, field, val) \ + do { \ + (table)->field = (val); \ + } while (0) - #define CUST_WRITE_FIELD(path, field, val) \ - do { \ - CustomizeTable t; \ - if (!cust_read_table(path, &t)) return false; \ - t.field = (val); \ - return cust_write_table(path, &t); \ - } while (0) +#define CUST_WRITE_FIELD(path, field, val) \ + do { \ + CustomizeTable t; \ + if (!cust_read_table(path, &t)) \ + return false; \ + t.field = (val); \ + return cust_write_table(path, &t); \ + } while (0) // static inline bool cust_set_cust_rev(const char* p, u32 v) { CUST_WRITE_FIELD(p, custRev, v); } // static inline bool cust_set_mtc_conf(const char* p, u32 v) { CUST_WRITE_FIELD(p, mtcConf, v); } - static inline bool cust_set_hp_mode(const char* p, u32 v) { CUST_WRITE_FIELD(p, hpMode, v); } + static inline bool cust_set_hp_mode(const char *p, u32 v) { + CUST_WRITE_FIELD(p, hpMode, v); + } - static inline bool cust_set_common_emc_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, commonEmcMemVolt, v); } - static inline bool cust_set_erista_emc_max(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock, v); } - static inline bool cust_set_erista_emc_max1(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock1, v); } - static inline bool cust_set_erista_emc_max2(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock2, v); } - static inline bool cust_set_step_mode(const char* p, u32 v) { CUST_WRITE_FIELD(p, stepMode, v); } - static inline bool cust_set_mariko_emc_max(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoEmcMaxClock, v); } - static inline bool cust_set_mariko_emc_vddq(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoEmcVddqVolt, v); } - static inline bool cust_set_emc_dvb_shift(const char* p, u32 v) { CUST_WRITE_FIELD(p, emcDvbShift, v); } + static inline bool cust_set_common_emc_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, commonEmcMemVolt, v); + } + static inline bool cust_set_erista_emc_max(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaEmcMaxClock, v); + } + static inline bool cust_set_step_mode(const char *p, u32 v) { + CUST_WRITE_FIELD(p, stepMode, v); + } + static inline bool cust_set_mariko_emc_max(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoEmcMaxClock, v); + } + static inline bool cust_set_mariko_emc_vddq(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoEmcVddqVolt, v); + } + static inline bool cust_set_emc_dvb_shift(const char *p, u32 v) { + CUST_WRITE_FIELD(p, emcDvbShift, v); + } - static inline bool cust_set_tRCD(const char* p, u32 v) { CUST_WRITE_FIELD(p, t1_tRCD, v); } - static inline bool cust_set_tRP(const char* p, u32 v) { CUST_WRITE_FIELD(p, t2_tRP, v); } - static inline bool cust_set_tRAS(const char* p, u32 v) { CUST_WRITE_FIELD(p, t3_tRAS, v); } - static inline bool cust_set_tRRD(const char* p, u32 v) { CUST_WRITE_FIELD(p, t4_tRRD, v); } - static inline bool cust_set_tRFC(const char* p, u32 v) { CUST_WRITE_FIELD(p, t5_tRFC, v); } - static inline bool cust_set_tRTW(const char* p, u32 v) { CUST_WRITE_FIELD(p, t6_tRTW, v); } - static inline bool cust_set_tWTR(const char* p, u32 v) { CUST_WRITE_FIELD(p, t7_tWTR, v); } - static inline bool cust_set_tREFI(const char* p, u32 v) { CUST_WRITE_FIELD(p, t8_tREFI, v); } - static inline bool cust_set_tRP_cap(const char* p, u32 v) { CUST_WRITE_FIELD(p, t2_tRP_cap, v); } - static inline bool cust_set_timing_emc_tbreak(const char* p, u32 v) { CUST_WRITE_FIELD(p, timingEmcTbreak, v); } - static inline bool cust_set_low_tRTW(const char* p, u32 v) { CUST_WRITE_FIELD(p, low_t6_tRTW, v); } - static inline bool cust_set_low_tWTR(const char* p, u32 v) { CUST_WRITE_FIELD(p, low_t7_tWTR, v); } - static inline bool cust_set_tRTW_fine_tune(const char* p, u32 v) { CUST_WRITE_FIELD(p, t6_tRTW_fine_tune, v); } - static inline bool cust_set_tWTR_fine_tune(const char* p, u32 v) { CUST_WRITE_FIELD(p, t7_tWTR_fine_tune, v); } + static inline bool cust_set_tRCD(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t1_tRCD, v); + } + static inline bool cust_set_tRP(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t2_tRP, v); + } + static inline bool cust_set_tRAS(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t3_tRAS, v); + } + static inline bool cust_set_tRRD(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t4_tRRD, v); + } + static inline bool cust_set_tRFC(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t5_tRFC, v); + } + static inline bool cust_set_tRTW(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t6_tRTW, v); + } + static inline bool cust_set_tWTR(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t7_tWTR, v); + } + static inline bool cust_set_tREFI(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t8_tREFI, v); + } + static inline bool cust_set_tRP_cap(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t2_tRP_cap, v); + } + static inline bool cust_set_timing_emc_tbreak(const char *p, u32 v) { + CUST_WRITE_FIELD(p, timingEmcTbreak, v); + } + static inline bool cust_set_low_tRTW(const char *p, u32 v) { + CUST_WRITE_FIELD(p, low_t6_tRTW, v); + } + static inline bool cust_set_low_tWTR(const char *p, u32 v) { + CUST_WRITE_FIELD(p, low_t7_tWTR, v); + } + static inline bool cust_set_tRTW_fine_tune(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t6_tRTW_fine_tune, v); + } + static inline bool cust_set_tWTR_fine_tune(const char *p, u32 v) { + CUST_WRITE_FIELD(p, t7_tWTR_fine_tune, v); + } - static inline bool cust_set_read_latency_1333(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1333, v); } - static inline bool cust_set_read_latency_1600(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1600, v); } - static inline bool cust_set_read_latency_1866(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1866, v); } - static inline bool cust_set_read_latency_2133(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency2133, v); } + static inline bool cust_set_read_latency_1333(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency1333, v); + } + static inline bool cust_set_read_latency_1600(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency1600, v); + } + static inline bool cust_set_read_latency_1866(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency1866, v); + } + static inline bool cust_set_read_latency_2133(const char *p, u32 v) { + CUST_WRITE_FIELD(p, readLatency2133, v); + } - static inline bool cust_set_write_latency_1333(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1333, v); } - static inline bool cust_set_write_latency_1600(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1600, v); } - static inline bool cust_set_write_latency_1866(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1866, v); } - static inline bool cust_set_write_latency_2133(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency2133, v); } + static inline bool cust_set_write_latency_1333(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency1333, v); + } + static inline bool cust_set_write_latency_1600(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency1600, v); + } + static inline bool cust_set_write_latency_1866(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency1866, v); + } + static inline bool cust_set_write_latency_2133(const char *p, u32 v) { + CUST_WRITE_FIELD(p, writeLatency2133, v); + } - static inline bool cust_set_burst_read_lat(const char* p, u32 v) { CUST_WRITE_FIELD(p, mem_burst_read_latency, v); } - static inline bool cust_set_burst_write_lat(const char* p, u32 v) { CUST_WRITE_FIELD(p, mem_burst_write_latency, v); } + static inline bool cust_set_erista_cpu_uv(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuUV, v); + } + static inline bool cust_set_eristaCpuVmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuVmin, v); + } + static inline bool cust_set_erista_cpu_max_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuMaxVolt, v); + } + static inline bool cust_set_eristaCpuUnlock(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuUnlock, v); + } - static inline bool cust_set_erista_cpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuUV, v); } - static inline bool cust_set_eristaCpuVmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuVmin, v); } - static inline bool cust_set_erista_cpu_max_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuMaxVolt, v); } - static inline bool cust_set_eristaCpuUnlock(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuUnlock, v); } + static inline bool cust_set_mariko_cpu_uv_low(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuUVLow, v); + } + static inline bool cust_set_mariko_cpu_uv_high(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuUVHigh, v); + } + static inline bool cust_set_mariko_cpu_low_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuLowVmin, v); + } + static inline bool cust_set_mariko_cpu_high_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuHighVmin, v); + } + static inline bool cust_set_mariko_cpu_max_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuMaxVolt, v); + } + static inline bool cust_set_erista_cpu_boost(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaCpuBoostClock, v); + } + static inline bool cust_set_mariko_cpu_boost(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuBoostClock, v); + } - static inline bool cust_set_mariko_cpu_uv_low(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuUVLow, v); } - static inline bool cust_set_mariko_cpu_uv_high(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuUVHigh, v); } - static inline bool cust_set_mariko_cpu_low_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuLowVmin, v); } - static inline bool cust_set_mariko_cpu_high_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuHighVmin, v); } - static inline bool cust_set_mariko_cpu_max_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuMaxVolt, v); } - static inline bool cust_set_erista_cpu_boost(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuBoostClock, v); } - static inline bool cust_set_mariko_cpu_boost(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuBoostClock, v); } - - static inline bool cust_set_erista_gpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuUV, v); } - static inline bool cust_set_erista_gpu_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuVmin, v); } - static inline bool cust_set_mariko_gpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuUV, v); } - static inline bool cust_set_mariko_gpu_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuVmin, v); } - static inline bool cust_set_mariko_gpu_boot_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuBootVolt, v); } - static inline bool cust_set_mariko_gpu_vmax(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuVmax, v); } - static inline bool cust_set_common_gpu_offset(const char* p, u32 v) { CUST_WRITE_FIELD(p, commonGpuVoltOffset, v); } - static inline bool cust_set_gpu_speedo(const char* p, u32 v) { CUST_WRITE_FIELD(p, gpuSpeedo, v); } - static inline bool cust_set_marikoCpuMaxClock(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuMaxClock, v); } - static inline bool cust_set_marikoSocVmax(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoSocVmax, v); } + static inline bool cust_set_erista_gpu_uv(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaGpuUV, v); + } + static inline bool cust_set_erista_gpu_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, eristaGpuVmin, v); + } + static inline bool cust_set_mariko_gpu_uv(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuUV, v); + } + static inline bool cust_set_mariko_gpu_vmin(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuVmin, v); + } + static inline bool cust_set_mariko_gpu_boot_volt(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuBootVolt, v); + } + static inline bool cust_set_mariko_gpu_vmax(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoGpuVmax, v); + } + static inline bool cust_set_common_gpu_offset(const char *p, u32 v) { + CUST_WRITE_FIELD(p, commonGpuVoltOffset, v); + } + static inline bool cust_set_marikoCpuMaxClock(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoCpuMaxClock, v); + } + static inline bool cust_set_marikoSocVmax(const char *p, u32 v) { + CUST_WRITE_FIELD(p, marikoSocVmax, v); + } /* GPU VOLT ARRAY HELPERS */ - static inline bool cust_set_erista_gpu_volt(const char* p, int idx, u32 v) { - if (idx < 0 || idx >= 27) return false; + static inline bool cust_set_erista_gpu_volt(const char *p, int idx, u32 v) { + if (idx < 0 || idx >= 27) + return false; CustomizeTable t; - if (!cust_read_table(p, &t)) return false; + if (!cust_read_table(p, &t)) + return false; t.eristaGpuVoltArray[idx] = v; return cust_write_table(p, &t); } - static inline bool cust_set_mariko_gpu_volt(const char* p, int idx, u32 v) { - if (idx < 0 || idx >= 24) return false; + static inline bool cust_set_mariko_gpu_volt(const char *p, int idx, u32 v) { + if (idx < 0 || idx >= 24) + return false; CustomizeTable t; - if (!cust_read_table(p, &t)) return false; + if (!cust_read_table(p, &t)) + return false; t.marikoGpuVoltArray[idx] = v; return cust_write_table(p, &t); } - static inline u32 cust_get_field(const CustomizeTable* t, u32 offset) { - if (!t) return 0; - return *(u32*)((u8*)t + offset); + static inline u32 cust_get_field(const CustomizeTable *t, u32 offset) { + if (!t) + return 0; + return *(u32 *)((u8 *)t + offset); } - #define CUST_GET_FIELD(table, field) ((table) ? (table)->field : 0) +#define CUST_GET_FIELD(table, field) ((table) ? (table)->field : 0) - static inline u32 cust_get_cust_rev(const CustomizeTable* t) { return CUST_GET_FIELD(t, custRev); } - static inline u32 cust_get_kip_version(const CustomizeTable* t) { return CUST_GET_FIELD(t, kipVersion); } + static inline u32 cust_get_cust_rev(const CustomizeTable *t) { + return CUST_GET_FIELD(t, custRev); + } + static inline u32 cust_get_kip_version(const CustomizeTable *t) { + return CUST_GET_FIELD(t, kipVersion); + } // static inline u32 cust_get_mtc_conf(const CustomizeTable* t) { return CUST_GET_FIELD(t, mtcConf); } - static inline u32 cust_get_hp_mode(const CustomizeTable* t) { return CUST_GET_FIELD(t, hpMode); } + static inline u32 cust_get_hp_mode(const CustomizeTable *t) { + return CUST_GET_FIELD(t, hpMode); + } - static inline u32 cust_get_common_emc_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, commonEmcMemVolt); } - static inline u32 cust_get_erista_emc_max(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock); } - static inline u32 cust_get_erista_emc_max1(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock1); } - static inline u32 cust_get_erista_emc_max2(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock2); } - static inline u32 cust_get_step_mode(const CustomizeTable* t) { return CUST_GET_FIELD(t, stepMode); } - static inline u32 cust_get_mariko_emc_max(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoEmcMaxClock); } - static inline u32 cust_get_mariko_emc_vddq(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoEmcVddqVolt); } - static inline u32 cust_get_emc_dvb_shift(const CustomizeTable* t) { return CUST_GET_FIELD(t, emcDvbShift); } + static inline u32 cust_get_common_emc_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, commonEmcMemVolt); + } + static inline u32 cust_get_erista_emc_max(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaEmcMaxClock); + } + static inline u32 cust_get_step_mode(const CustomizeTable *t) { + return CUST_GET_FIELD(t, stepMode); + } + static inline u32 cust_get_mariko_emc_max(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoEmcMaxClock); + } + static inline u32 cust_get_mariko_emc_vddq(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoEmcVddqVolt); + } + static inline u32 cust_get_emc_dvb_shift(const CustomizeTable *t) { + return CUST_GET_FIELD(t, emcDvbShift); + } - static inline u32 cust_get_tRCD(const CustomizeTable* t) { return CUST_GET_FIELD(t, t1_tRCD); } - static inline u32 cust_get_tRP(const CustomizeTable* t) { return CUST_GET_FIELD(t, t2_tRP); } - static inline u32 cust_get_tRAS(const CustomizeTable* t) { return CUST_GET_FIELD(t, t3_tRAS); } - static inline u32 cust_get_tRRD(const CustomizeTable* t) { return CUST_GET_FIELD(t, t4_tRRD); } - static inline u32 cust_get_tRFC(const CustomizeTable* t) { return CUST_GET_FIELD(t, t5_tRFC); } - static inline u32 cust_get_tRTW(const CustomizeTable* t) { return CUST_GET_FIELD(t, t6_tRTW); } - static inline u32 cust_get_tWTR(const CustomizeTable* t) { return CUST_GET_FIELD(t, t7_tWTR); } - static inline u32 cust_get_tREFI(const CustomizeTable* t) { return CUST_GET_FIELD(t, t8_tREFI); } - static inline u32 cust_get_tRP_cap(const CustomizeTable* t) { return CUST_GET_FIELD(t, t2_tRP_cap); } - static inline u32 cust_get_timing_emc_tbreak(const CustomizeTable* t) { return CUST_GET_FIELD(t, timingEmcTbreak); } - static inline u32 cust_get_low_t6_tRTW(const CustomizeTable* t) { return CUST_GET_FIELD(t, low_t6_tRTW); } - static inline u32 cust_get_low_t7_tWTR(const CustomizeTable* t) { return CUST_GET_FIELD(t, low_t7_tWTR); } - static inline u32 cust_get_tRTW_fine_tune(const CustomizeTable* t) { return CUST_GET_FIELD(t, t6_tRTW_fine_tune); } - static inline u32 cust_get_tWTR_fine_tune(const CustomizeTable* t) { return CUST_GET_FIELD(t, t7_tWTR_fine_tune); } + static inline u32 cust_get_tRCD(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t1_tRCD); + } + static inline u32 cust_get_tRP(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t2_tRP); + } + static inline u32 cust_get_tRAS(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t3_tRAS); + } + static inline u32 cust_get_tRRD(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t4_tRRD); + } + static inline u32 cust_get_tRFC(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t5_tRFC); + } + static inline u32 cust_get_tRTW(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t6_tRTW); + } + static inline u32 cust_get_tWTR(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t7_tWTR); + } + static inline u32 cust_get_tREFI(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t8_tREFI); + } + static inline u32 cust_get_tRP_cap(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t2_tRP_cap); + } + static inline u32 cust_get_timing_emc_tbreak(const CustomizeTable *t) { + return CUST_GET_FIELD(t, timingEmcTbreak); + } + static inline u32 cust_get_low_t6_tRTW(const CustomizeTable *t) { + return CUST_GET_FIELD(t, low_t6_tRTW); + } + static inline u32 cust_get_low_t7_tWTR(const CustomizeTable *t) { + return CUST_GET_FIELD(t, low_t7_tWTR); + } + static inline u32 cust_get_tRTW_fine_tune(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t6_tRTW_fine_tune); + } + static inline u32 cust_get_tWTR_fine_tune(const CustomizeTable *t) { + return CUST_GET_FIELD(t, t7_tWTR_fine_tune); + } - static inline u32 cust_get_read_latency_1333(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1333); } - static inline u32 cust_get_read_latency_1600(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1600); } - static inline u32 cust_get_read_latency_1866(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1866); } - static inline u32 cust_get_read_latency_2133(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency2133); } + static inline u32 cust_get_read_latency_1333(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency1333); + } + static inline u32 cust_get_read_latency_1600(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency1600); + } + static inline u32 cust_get_read_latency_1866(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency1866); + } + static inline u32 cust_get_read_latency_2133(const CustomizeTable *t) { + return CUST_GET_FIELD(t, readLatency2133); + } - static inline u32 cust_get_write_latency_1333(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1333); } - static inline u32 cust_get_write_latency_1600(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1600); } - static inline u32 cust_get_write_latency_1866(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1866); } - static inline u32 cust_get_write_latency_2133(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency2133); } + static inline u32 cust_get_write_latency_1333(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency1333); + } + static inline u32 cust_get_write_latency_1600(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency1600); + } + static inline u32 cust_get_write_latency_1866(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency1866); + } + static inline u32 cust_get_write_latency_2133(const CustomizeTable *t) { + return CUST_GET_FIELD(t, writeLatency2133); + } - static inline u32 cust_get_burst_read_lat(const CustomizeTable* t) { return CUST_GET_FIELD(t, mem_burst_read_latency); } - static inline u32 cust_get_burst_write_lat(const CustomizeTable* t) { return CUST_GET_FIELD(t, mem_burst_write_latency); } + static inline u32 cust_get_erista_cpu_uv(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuUV); + } + static inline u32 cust_get_eristaCpuVmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuVmin); + } + static inline u32 cust_get_erista_cpu_max_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuMaxVolt); + } + static inline u32 cust_get_eristaCpuUnlock(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuUnlock); + } - static inline u32 cust_get_erista_cpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuUV); } - static inline u32 cust_get_eristaCpuVmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuVmin); } - static inline u32 cust_get_erista_cpu_max_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuMaxVolt); } - static inline u32 cust_get_eristaCpuUnlock(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuUnlock); } + static inline u32 cust_get_mariko_cpu_uv_low(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuUVLow); + } + static inline u32 cust_get_mariko_cpu_uv_high(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuUVHigh); + } + static inline u32 cust_get_mariko_cpu_low_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuLowVmin); + } + static inline u32 cust_get_mariko_cpu_high_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuHighVmin); + } + static inline u32 cust_get_mariko_cpu_max_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuMaxVolt); + } + static inline u32 cust_get_erista_cpu_boost(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaCpuBoostClock); + } + static inline u32 cust_get_mariko_cpu_boost(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuBoostClock); + } + static inline u32 cust_get_table_conf(const CustomizeTable *t) { + return CUST_GET_FIELD(t, tableConf); + } - static inline u32 cust_get_mariko_cpu_uv_low(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuUVLow); } - static inline u32 cust_get_mariko_cpu_uv_high(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuUVHigh); } - static inline u32 cust_get_mariko_cpu_low_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuLowVmin); } - static inline u32 cust_get_mariko_cpu_high_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuHighVmin); } - static inline u32 cust_get_mariko_cpu_max_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuMaxVolt); } - static inline u32 cust_get_erista_cpu_boost(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuBoostClock); } - static inline u32 cust_get_mariko_cpu_boost(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuBoostClock); } - static inline u32 cust_get_table_conf(const CustomizeTable* t) { return CUST_GET_FIELD(t, tableConf); } + static inline u32 cust_get_erista_gpu_uv(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaGpuUV); + } + static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, eristaGpuVmin); + } + static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuUV); + } + static inline u32 cust_get_mariko_gpu_vmin(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuVmin); + } + static inline u32 cust_get_mariko_gpu_boot_volt(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuBootVolt); + } + static inline u32 cust_get_mariko_gpu_vmax(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoGpuVmax); + } + static inline u32 cust_get_common_gpu_offset(const CustomizeTable *t) { + return CUST_GET_FIELD(t, commonGpuVoltOffset); + } + static inline u32 cust_get_marikoCpuMaxClock(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoCpuMaxClock); + } + static inline u32 cust_get_marikoSocVmax(const CustomizeTable *t) { + return CUST_GET_FIELD(t, marikoSocVmax); + } - static inline u32 cust_get_erista_gpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaGpuUV); } - static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaGpuVmin); } - static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuUV); } - static inline u32 cust_get_mariko_gpu_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuVmin); } - static inline u32 cust_get_mariko_gpu_boot_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuBootVolt); } - static inline u32 cust_get_mariko_gpu_vmax(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuVmax); } - static inline u32 cust_get_common_gpu_offset(const CustomizeTable* t) { return CUST_GET_FIELD(t, commonGpuVoltOffset); } - static inline u32 cust_get_gpu_speedo(const CustomizeTable* t) { return CUST_GET_FIELD(t, gpuSpeedo); } - static inline u32 cust_get_marikoCpuMaxClock(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuMaxClock); } - static inline u32 cust_get_marikoSocVmax(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoSocVmax); } - - static inline u32 cust_get_erista_gpu_volt(const CustomizeTable* t, int idx) { - if (!t || idx < 0 || idx >= 27) return 0; + static inline u32 cust_get_erista_gpu_volt(const CustomizeTable *t, int idx) { + if (!t || idx < 0 || idx >= 27) + return 0; return t->eristaGpuVoltArray[idx]; } - static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable* t, int idx) { - if (!t || idx < 0 || idx >= 24) return 0; + static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable *t, int idx) { + if (!t || idx < 0 || idx >= 24) + return 0; return t->marikoGpuVoltArray[idx]; } - #define DECL_ERISTA_GPU_VOLT_HELPER(freq, idx) \ - static inline bool cust_set_erista_gpu_volt_##freq( \ - const char* p, u32 v) { \ - return cust_set_erista_gpu_volt(p, idx, v); \ +#define DECL_ERISTA_GPU_VOLT_HELPER(freq, idx) \ + static inline bool cust_set_erista_gpu_volt_##freq(const char *p, u32 v) { \ + return cust_set_erista_gpu_volt(p, idx, v); \ } - #define DECL_MARIKO_GPU_VOLT_HELPER(freq, idx) \ - static inline bool cust_set_mariko_gpu_volt_##freq( \ - const char* p, u32 v) { \ - return cust_set_mariko_gpu_volt(p, idx, v); \ +#define DECL_MARIKO_GPU_VOLT_HELPER(freq, idx) \ + static inline bool cust_set_mariko_gpu_volt_##freq(const char *p, u32 v) { \ + return cust_set_mariko_gpu_volt(p, idx, v); \ } - DECL_ERISTA_GPU_VOLT_HELPER(76800, 0) - DECL_ERISTA_GPU_VOLT_HELPER(115200, 1) - DECL_ERISTA_GPU_VOLT_HELPER(153600, 2) - DECL_ERISTA_GPU_VOLT_HELPER(192000, 3) - DECL_ERISTA_GPU_VOLT_HELPER(230400, 4) - DECL_ERISTA_GPU_VOLT_HELPER(268800, 5) - DECL_ERISTA_GPU_VOLT_HELPER(307200, 6) - DECL_ERISTA_GPU_VOLT_HELPER(345600, 7) - DECL_ERISTA_GPU_VOLT_HELPER(384000, 8) - DECL_ERISTA_GPU_VOLT_HELPER(422400, 9) - DECL_ERISTA_GPU_VOLT_HELPER(460800, 10) - DECL_ERISTA_GPU_VOLT_HELPER(499200, 11) - DECL_ERISTA_GPU_VOLT_HELPER(537600, 12) - DECL_ERISTA_GPU_VOLT_HELPER(576000, 13) - DECL_ERISTA_GPU_VOLT_HELPER(614400, 14) - DECL_ERISTA_GPU_VOLT_HELPER(652800, 15) - DECL_ERISTA_GPU_VOLT_HELPER(691200, 16) - DECL_ERISTA_GPU_VOLT_HELPER(729600, 17) - DECL_ERISTA_GPU_VOLT_HELPER(768000, 18) - DECL_ERISTA_GPU_VOLT_HELPER(806400, 19) - DECL_ERISTA_GPU_VOLT_HELPER(844800, 20) - DECL_ERISTA_GPU_VOLT_HELPER(883200, 21) - DECL_ERISTA_GPU_VOLT_HELPER(921600, 22) - DECL_ERISTA_GPU_VOLT_HELPER(960000, 23) - DECL_ERISTA_GPU_VOLT_HELPER(998400, 24) + DECL_ERISTA_GPU_VOLT_HELPER(76800, 0) + DECL_ERISTA_GPU_VOLT_HELPER(115200, 1) + DECL_ERISTA_GPU_VOLT_HELPER(153600, 2) + DECL_ERISTA_GPU_VOLT_HELPER(192000, 3) + DECL_ERISTA_GPU_VOLT_HELPER(230400, 4) + DECL_ERISTA_GPU_VOLT_HELPER(268800, 5) + DECL_ERISTA_GPU_VOLT_HELPER(307200, 6) + DECL_ERISTA_GPU_VOLT_HELPER(345600, 7) + DECL_ERISTA_GPU_VOLT_HELPER(384000, 8) + DECL_ERISTA_GPU_VOLT_HELPER(422400, 9) + DECL_ERISTA_GPU_VOLT_HELPER(460800, 10) + DECL_ERISTA_GPU_VOLT_HELPER(499200, 11) + DECL_ERISTA_GPU_VOLT_HELPER(537600, 12) + DECL_ERISTA_GPU_VOLT_HELPER(576000, 13) + DECL_ERISTA_GPU_VOLT_HELPER(614400, 14) + DECL_ERISTA_GPU_VOLT_HELPER(652800, 15) + DECL_ERISTA_GPU_VOLT_HELPER(691200, 16) + DECL_ERISTA_GPU_VOLT_HELPER(729600, 17) + DECL_ERISTA_GPU_VOLT_HELPER(768000, 18) + DECL_ERISTA_GPU_VOLT_HELPER(806400, 19) + DECL_ERISTA_GPU_VOLT_HELPER(844800, 20) + DECL_ERISTA_GPU_VOLT_HELPER(883200, 21) + DECL_ERISTA_GPU_VOLT_HELPER(921600, 22) + DECL_ERISTA_GPU_VOLT_HELPER(960000, 23) + DECL_ERISTA_GPU_VOLT_HELPER(998400, 24) DECL_ERISTA_GPU_VOLT_HELPER(1036800, 25) DECL_ERISTA_GPU_VOLT_HELPER(1075200, 26) - DECL_MARIKO_GPU_VOLT_HELPER(76800, 0) - DECL_MARIKO_GPU_VOLT_HELPER(153600, 1) - DECL_MARIKO_GPU_VOLT_HELPER(230400, 2) - DECL_MARIKO_GPU_VOLT_HELPER(307200, 3) - DECL_MARIKO_GPU_VOLT_HELPER(384000, 4) - DECL_MARIKO_GPU_VOLT_HELPER(460800, 5) - DECL_MARIKO_GPU_VOLT_HELPER(537600, 6) - DECL_MARIKO_GPU_VOLT_HELPER(614400, 7) - DECL_MARIKO_GPU_VOLT_HELPER(691200, 8) - DECL_MARIKO_GPU_VOLT_HELPER(768000, 9) - DECL_MARIKO_GPU_VOLT_HELPER(844800, 10) - DECL_MARIKO_GPU_VOLT_HELPER(921600, 11) - DECL_MARIKO_GPU_VOLT_HELPER(998400, 12) + DECL_MARIKO_GPU_VOLT_HELPER(76800, 0) + DECL_MARIKO_GPU_VOLT_HELPER(153600, 1) + DECL_MARIKO_GPU_VOLT_HELPER(230400, 2) + DECL_MARIKO_GPU_VOLT_HELPER(307200, 3) + DECL_MARIKO_GPU_VOLT_HELPER(384000, 4) + DECL_MARIKO_GPU_VOLT_HELPER(460800, 5) + DECL_MARIKO_GPU_VOLT_HELPER(537600, 6) + DECL_MARIKO_GPU_VOLT_HELPER(614400, 7) + DECL_MARIKO_GPU_VOLT_HELPER(691200, 8) + DECL_MARIKO_GPU_VOLT_HELPER(768000, 9) + DECL_MARIKO_GPU_VOLT_HELPER(844800, 10) + DECL_MARIKO_GPU_VOLT_HELPER(921600, 11) + DECL_MARIKO_GPU_VOLT_HELPER(998400, 12) DECL_MARIKO_GPU_VOLT_HELPER(1075200, 13) DECL_MARIKO_GPU_VOLT_HELPER(1152000, 14) DECL_MARIKO_GPU_VOLT_HELPER(1228800, 15) @@ -434,60 +640,62 @@ namespace kip { DECL_MARIKO_GPU_VOLT_HELPER(1497600, 22) DECL_MARIKO_GPU_VOLT_HELPER(1536000, 23) - #define DECL_ERISTA_GPU_VOLT_GET(freq, idx) \ - static inline u32 cust_get_erista_gpu_volt_##freq##_val(const char* p) { \ - CustomizeTable t; \ - if (!cust_read_table(p, &t)) return 0; \ - return cust_get_erista_gpu_volt(&t, idx); \ +#define DECL_ERISTA_GPU_VOLT_GET(freq, idx) \ + static inline u32 cust_get_erista_gpu_volt_##freq##_val(const char *p) { \ + CustomizeTable t; \ + if (!cust_read_table(p, &t)) \ + return 0; \ + return cust_get_erista_gpu_volt(&t, idx); \ } - #define DECL_MARIKO_GPU_VOLT_GET(freq, idx) \ - static inline u32 cust_get_mariko_gpu_volt_##freq##_val(const char* p) { \ - CustomizeTable t; \ - if (!cust_read_table(p, &t)) return 0; \ - return cust_get_mariko_gpu_volt(&t, idx); \ +#define DECL_MARIKO_GPU_VOLT_GET(freq, idx) \ + static inline u32 cust_get_mariko_gpu_volt_##freq##_val(const char *p) { \ + CustomizeTable t; \ + if (!cust_read_table(p, &t)) \ + return 0; \ + return cust_get_mariko_gpu_volt(&t, idx); \ } - DECL_ERISTA_GPU_VOLT_GET(76800, 0) - DECL_ERISTA_GPU_VOLT_GET(115200, 1) - DECL_ERISTA_GPU_VOLT_GET(153600, 2) - DECL_ERISTA_GPU_VOLT_GET(192000, 3) - DECL_ERISTA_GPU_VOLT_GET(230400, 4) - DECL_ERISTA_GPU_VOLT_GET(268800, 5) - DECL_ERISTA_GPU_VOLT_GET(307200, 6) - DECL_ERISTA_GPU_VOLT_GET(345600, 7) - DECL_ERISTA_GPU_VOLT_GET(384000, 8) - DECL_ERISTA_GPU_VOLT_GET(422400, 9) - DECL_ERISTA_GPU_VOLT_GET(460800, 10) - DECL_ERISTA_GPU_VOLT_GET(499200, 11) - DECL_ERISTA_GPU_VOLT_GET(537600, 12) - DECL_ERISTA_GPU_VOLT_GET(576000, 13) - DECL_ERISTA_GPU_VOLT_GET(614400, 14) - DECL_ERISTA_GPU_VOLT_GET(652800, 15) - DECL_ERISTA_GPU_VOLT_GET(691200, 16) - DECL_ERISTA_GPU_VOLT_GET(729600, 17) - DECL_ERISTA_GPU_VOLT_GET(768000, 18) - DECL_ERISTA_GPU_VOLT_GET(806400, 19) - DECL_ERISTA_GPU_VOLT_GET(844800, 20) - DECL_ERISTA_GPU_VOLT_GET(883200, 21) - DECL_ERISTA_GPU_VOLT_GET(921600, 22) - DECL_ERISTA_GPU_VOLT_GET(960000, 23) - DECL_ERISTA_GPU_VOLT_GET(998400, 24) + DECL_ERISTA_GPU_VOLT_GET(76800, 0) + DECL_ERISTA_GPU_VOLT_GET(115200, 1) + DECL_ERISTA_GPU_VOLT_GET(153600, 2) + DECL_ERISTA_GPU_VOLT_GET(192000, 3) + DECL_ERISTA_GPU_VOLT_GET(230400, 4) + DECL_ERISTA_GPU_VOLT_GET(268800, 5) + DECL_ERISTA_GPU_VOLT_GET(307200, 6) + DECL_ERISTA_GPU_VOLT_GET(345600, 7) + DECL_ERISTA_GPU_VOLT_GET(384000, 8) + DECL_ERISTA_GPU_VOLT_GET(422400, 9) + DECL_ERISTA_GPU_VOLT_GET(460800, 10) + DECL_ERISTA_GPU_VOLT_GET(499200, 11) + DECL_ERISTA_GPU_VOLT_GET(537600, 12) + DECL_ERISTA_GPU_VOLT_GET(576000, 13) + DECL_ERISTA_GPU_VOLT_GET(614400, 14) + DECL_ERISTA_GPU_VOLT_GET(652800, 15) + DECL_ERISTA_GPU_VOLT_GET(691200, 16) + DECL_ERISTA_GPU_VOLT_GET(729600, 17) + DECL_ERISTA_GPU_VOLT_GET(768000, 18) + DECL_ERISTA_GPU_VOLT_GET(806400, 19) + DECL_ERISTA_GPU_VOLT_GET(844800, 20) + DECL_ERISTA_GPU_VOLT_GET(883200, 21) + DECL_ERISTA_GPU_VOLT_GET(921600, 22) + DECL_ERISTA_GPU_VOLT_GET(960000, 23) + DECL_ERISTA_GPU_VOLT_GET(998400, 24) DECL_ERISTA_GPU_VOLT_GET(1036800, 25) DECL_ERISTA_GPU_VOLT_GET(1075200, 26) - DECL_MARIKO_GPU_VOLT_GET(76800, 0) - DECL_MARIKO_GPU_VOLT_GET(153600, 1) - DECL_MARIKO_GPU_VOLT_GET(230400, 2) - DECL_MARIKO_GPU_VOLT_GET(307200, 3) - DECL_MARIKO_GPU_VOLT_GET(384000, 4) - DECL_MARIKO_GPU_VOLT_GET(460800, 5) - DECL_MARIKO_GPU_VOLT_GET(537600, 6) - DECL_MARIKO_GPU_VOLT_GET(614400, 7) - DECL_MARIKO_GPU_VOLT_GET(691200, 8) - DECL_MARIKO_GPU_VOLT_GET(768000, 9) - DECL_MARIKO_GPU_VOLT_GET(844800, 10) - DECL_MARIKO_GPU_VOLT_GET(921600, 11) - DECL_MARIKO_GPU_VOLT_GET(998400, 12) + DECL_MARIKO_GPU_VOLT_GET(76800, 0) + DECL_MARIKO_GPU_VOLT_GET(153600, 1) + DECL_MARIKO_GPU_VOLT_GET(230400, 2) + DECL_MARIKO_GPU_VOLT_GET(307200, 3) + DECL_MARIKO_GPU_VOLT_GET(384000, 4) + DECL_MARIKO_GPU_VOLT_GET(460800, 5) + DECL_MARIKO_GPU_VOLT_GET(537600, 6) + DECL_MARIKO_GPU_VOLT_GET(614400, 7) + DECL_MARIKO_GPU_VOLT_GET(691200, 8) + DECL_MARIKO_GPU_VOLT_GET(768000, 9) + DECL_MARIKO_GPU_VOLT_GET(844800, 10) + DECL_MARIKO_GPU_VOLT_GET(921600, 11) + DECL_MARIKO_GPU_VOLT_GET(998400, 12) DECL_MARIKO_GPU_VOLT_GET(1075200, 13) DECL_MARIKO_GPU_VOLT_GET(1152000, 14) DECL_MARIKO_GPU_VOLT_GET(1228800, 15) @@ -502,4 +710,4 @@ namespace kip { void MigrateKipData(u32 custRev, u32 version); void SetKipData(); void GetKipData(); -} \ No newline at end of file +} // namespace kip \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/apm_ext.c b/Source/hoc-clk/sysmodule/src/hos/apm_ext.c index 1448cfde..98dde745 100644 --- a/Source/hoc-clk/sysmodule/src/hos/apm_ext.c +++ b/Source/hoc-clk/sysmodule/src/hos/apm_ext.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,60 +24,50 @@ * -------------------------------------------------------------------------- */ +#include #include "apm_ext.h" -#include - static Service g_apmSrv; static Service g_apmSysSrv; static atomic_size_t g_refCnt; -Result apmExtInitialize(void) -{ +Result apmExtInitialize(void) { g_refCnt++; - if (serviceIsActive(&g_apmSrv)) - { + if (serviceIsActive(&g_apmSrv)) { return 0; } Result rc = 0; rc = smGetService(&g_apmSrv, "apm"); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = smGetService(&g_apmSysSrv, "apm:sys"); } - if (R_FAILED(rc)) - { + if (R_FAILED(rc)) { apmExtExit(); } return rc; } -void apmExtExit(void) -{ - if (--g_refCnt == 0) - { +void apmExtExit(void) { + if (--g_refCnt == 0) { serviceClose(&g_apmSrv); serviceClose(&g_apmSysSrv); } } -Result apmExtGetPerformanceMode(u32* out_mode) -{ +Result apmExtGetPerformanceMode(u32 *out_mode) { return serviceDispatchOut(&g_apmSrv, 1, *out_mode); } -Result apmExtSysRequestPerformanceMode(u32 mode) -{ +Result apmExtSysRequestPerformanceMode(u32 mode) { return serviceDispatchIn(&g_apmSysSrv, 0, mode); } -Result apmExtGetCurrentPerformanceConfiguration(u32* out_conf) -{ +Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf) { return serviceDispatchOut(&g_apmSysSrv, 7, *out_conf); } diff --git a/Source/hoc-clk/sysmodule/src/hos/apm_ext.h b/Source/hoc-clk/sysmodule/src/hos/apm_ext.h index e032fb35..292fd072 100644 --- a/Source/hoc-clk/sysmodule/src/hos/apm_ext.h +++ b/Source/hoc-clk/sysmodule/src/hos/apm_ext.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include @@ -37,19 +35,19 @@ extern "C" Result apmExtInitialize(void); void apmExtExit(void); -Result apmExtGetPerformanceMode(u32* out_mode); +Result apmExtGetPerformanceMode(u32 *out_mode); Result apmExtSysRequestPerformanceMode(u32 mode); -Result apmExtGetCurrentPerformanceConfiguration(u32* out_conf); +Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf); Result apmExtSysRequestPerformanceMode(u32 mode); Result apmExtSysSetCpuBoostMode(u32 mode); Result apmExtGetPerformanceMode(u32 *out_mode); Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf); -inline bool apmExtIsCPUBoosted(u32 conf_id) { // CPU boosted to 1785 MHz +inline bool apmExtIsCPUBoosted(u32 conf_id) { // CPU boosted to 1785 MHz return (conf_id == 0x92220009 || conf_id == 0x9222000A); }; -inline bool apmExtIsBoostMode(u32 conf_id) { // GPU throttled to 76.8 MHz +inline bool apmExtIsBoostMode(u32 conf_id) { // GPU throttled to 76.8 MHz return (conf_id >= 0x92220009 && conf_id <= 0x9222000C); }; diff --git a/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c b/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c index 69d961f5..a5112dd8 100644 --- a/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c +++ b/Source/hoc-clk/sysmodule/src/hos/apm_profile_table.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,26 +24,24 @@ * -------------------------------------------------------------------------- */ - #include HocClkApmConfiguration hocclk_g_apm_configurations[] = { - {0x00010000, 1020000000, 384000000, 1600000000}, - {0x00010001, 1020000000, 768000000, 1600000000}, - {0x00010002, 1224000000, 691200000, 1600000000}, - {0x00020000, 1020000000, 230400000, 1600000000}, - {0x00020001, 1020000000, 307200000, 1600000000}, - {0x00020002, 1224000000, 230400000, 1600000000}, - {0x00020003, 1020000000, 307200000, 1331200000}, - {0x00020004, 1020000000, 384000000, 1331200000}, - {0x00020005, 1020000000, 307200000, 1065600000}, - {0x00020006, 1020000000, 384000000, 1065600000}, - {0x92220007, 1020000000, 460800000, 1600000000}, - {0x92220008, 1020000000, 460800000, 1331200000}, - {0x92220009, 1785000000, 76800000, 1600000000}, - {0x9222000A, 1785000000, 76800000, 1331200000}, - {0x9222000B, 1020000000, 76800000, 1600000000}, - {0x9222000C, 1020000000, 76800000, 1331200000}, - {0, 0, 0, 0}, + { 0x00010000, 1020000000, 384000000, 1600000000 }, + { 0x00010001, 1020000000, 768000000, 1600000000 }, + { 0x00010002, 1224000000, 691200000, 1600000000 }, + { 0x00020000, 1020000000, 230400000, 1600000000 }, + { 0x00020001, 1020000000, 307200000, 1600000000 }, + { 0x00020002, 1224000000, 230400000, 1600000000 }, + { 0x00020003, 1020000000, 307200000, 1331200000 }, + { 0x00020004, 1020000000, 384000000, 1331200000 }, + { 0x00020005, 1020000000, 307200000, 1065600000 }, + { 0x00020006, 1020000000, 384000000, 1065600000 }, + { 0x92220007, 1020000000, 460800000, 1600000000 }, + { 0x92220008, 1020000000, 460800000, 1331200000 }, + { 0x92220009, 1785000000, 76800000, 1600000000 }, + { 0x9222000A, 1785000000, 76800000, 1331200000 }, + { 0x9222000B, 1020000000, 76800000, 1600000000 }, + { 0x9222000C, 1020000000, 76800000, 1331200000 }, + { 0, 0, 0, 0 }, }; - diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp index 6707d9ee..88dade23 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.cpp @@ -15,16 +15,17 @@ * */ -#include "integrations.hpp" -#include #include + +#include "integrations.hpp" #include "process_management.hpp" +#include namespace integrations { namespace { - NxFpsSharedBlock* gNxFps = nullptr; + NxFpsSharedBlock *gNxFps = nullptr; SharedMemory gSharedMemory = {}; bool gSharedMemoryUsed = false; Handle gRemoteSharedMemory = 1; @@ -38,7 +39,8 @@ namespace integrations { svcCloseHandle(saltysd); break; } - if (i == 66) return false; + if (i == 66) + return false; svcSleepThread(1'000'000); } @@ -56,7 +58,7 @@ namespace integrations { void SearchSharedMemoryBlock(uintptr_t base) { ptrdiff_t search_offset = 0; while (search_offset < 0x1000) { - gNxFps = (NxFpsSharedBlock*)(base + search_offset); + gNxFps = (NxFpsSharedBlock *)(base + search_offset); if (gNxFps->MAGIC == 0x465053) return; search_offset += 4; @@ -74,21 +76,21 @@ namespace integrations { gSharedMemoryUsed = true; } - } + } // namespace bool GetSysDockState() { - struct stat st = {0}; + struct stat st = { 0 }; return stat("sdmc:/atmosphere/contents/42000000000000A0/flags/boot2.flag", &st) == 0; } bool GetSaltyNXState() { - struct stat st = {0}; + struct stat st = { 0 }; return stat("sdmc:/atmosphere/contents/0000000000534C56/flags/boot2.flag", &st) == 0; } bool GetRETROSuperStatus() { - struct stat st = {0}; - return stat("sdmc:/config/horizon-oc/retro.flag", &st) == 0; // TODO: unhardcode this + struct stat st = { 0 }; + return stat("sdmc:/config/horizon-oc/retro.flag", &st) == 0; // TODO: unhardcode this } void LoadSaltyNX() { @@ -143,13 +145,15 @@ namespace integrations { resolutionLookup = 1; return 0; } else if (resolutionLookup == 1) { - if (gNxFps->renderCalls[0].calls != 0xFFFF) resolutionLookup = 2; - else return 0; + if (gNxFps->renderCalls[0].calls != 0xFFFF) + resolutionLookup = 2; + else + return 0; } - + return gNxFps->renderCalls[0].height == 0 ? gNxFps->viewportCalls[0].height : gNxFps->renderCalls[0].height; } return 0; } -} +} // namespace integrations diff --git a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp index 143a5b4c..fe5a8c0f 100644 --- a/Source/hoc-clk/sysmodule/src/hos/integrations.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/integrations.hpp @@ -17,8 +17,8 @@ #pragma once -#include #include +#include namespace integrations { @@ -39,9 +39,9 @@ namespace integrations { uint8_t SetActiveBuffers; union { struct { - bool handheld: 1; - bool docked: 1; - unsigned int reserved: 6; + bool handheld : 1; + bool docked : 1; + unsigned int reserved : 6; } NX_PACKED ds; uint8_t general; } displaySync; @@ -66,4 +66,4 @@ namespace integrations { u8 GetSaltyNXFPS(); u16 GetSaltyNXResolutionHeight(); -} +} // namespace integrations diff --git a/Source/hoc-clk/sysmodule/src/hos/notification.cpp b/Source/hoc-clk/sysmodule/src/hos/notification.cpp index f6ff1c38..c5a4f5f0 100644 --- a/Source/hoc-clk/sysmodule/src/hos/notification.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/notification.cpp @@ -15,14 +15,13 @@ * */ - #include "notification.h" namespace notification { - void writeNotification(const std::string& message) { - static const char* flagPath = "sdmc:/config/ultrahand/flags/NOTIFICATIONS.flag"; + void writeNotification(const std::string &message) { + static const char *flagPath = "sdmc:/config/ultrahand/flags/NOTIFICATIONS.flag"; - FILE* flagFile = fopen(flagPath, "r"); + FILE *flagFile = fopen(flagPath, "r"); if (!flagFile) { return; } @@ -31,7 +30,7 @@ namespace notification { std::string filename = "hoc-" + std::to_string(std::time(nullptr)) + ".notify"; std::string fullPath = "sdmc:/config/ultrahand/notifications/" + filename; - FILE* file = fopen(fullPath.c_str(), "w"); + FILE *file = fopen(fullPath.c_str(), "w"); if (file) { fprintf(file, "{\n"); fprintf(file, " \"text\": \"%s\",\n", message.c_str()); @@ -40,4 +39,4 @@ namespace notification { fclose(file); } } -} +} // namespace notification diff --git a/Source/hoc-clk/sysmodule/src/hos/notification.h b/Source/hoc-clk/sysmodule/src/hos/notification.h index 3f1b1558..105d1512 100644 --- a/Source/hoc-clk/sysmodule/src/hos/notification.h +++ b/Source/hoc-clk/sysmodule/src/hos/notification.h @@ -12,14 +12,14 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once -#include -#include #include +#include +#include namespace notification { - void writeNotification(const std::string& message); + void writeNotification(const std::string &message); } diff --git a/Source/hoc-clk/sysmodule/src/hos/pcv_types.h b/Source/hoc-clk/sysmodule/src/hos/pcv_types.h index 03899f35..057240df 100644 --- a/Source/hoc-clk/sysmodule/src/hos/pcv_types.h +++ b/Source/hoc-clk/sysmodule/src/hos/pcv_types.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -26,24 +26,23 @@ */ /* -* Switch Power domains (max77620): -* Name | Usage | uV step | uV min | uV default | uV max | Init -*-------+---------------+---------+--------+------------+---------+------------------ -* sd0 | SoC | 12500 | 600000 | 625000 | 1400000 | 1.125V (pkg1.1) -* sd1 | SDRAM | 12500 | 600000 | 1125000 | 1125000 | 1.1V (pkg1.1) -* sd2 | ldo{0-1, 7-8} | 12500 | 600000 | 1325000 | 1350000 | 1.325V (pcv) -* sd3 | 1.8V general | 12500 | 600000 | 1800000 | 1800000 | -* ldo0 | Display Panel | 25000 | 800000 | 1200000 | 1200000 | 1.2V (pkg1.1) -* ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) -* ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 | -* ldo3 | GC ASIC | 50000 | 800000 | 3100000 | 3100000 | 3.1V (pcv) -* ldo4 | RTC | 12500 | 800000 | 850000 | 850000 | 0.85V (AO, pcv) -* ldo5 | GC Card | 50000 | 800000 | 1800000 | 1800000 | 1.8V (pcv) -* ldo6 | Touch, ALS | 50000 | 800000 | 2900000 | 2900000 | 2.9V (pcv) -* ldo7 | XUSB | 50000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) -* ldo8 | XUSB, DP, MCU | 50000 | 800000 | 1050000 | 2800000 | 1.05V/2.8V (pcv) -*/ - + * Switch Power domains (max77620): + * Name | Usage | uV step | uV min | uV default | uV max | Init + *-------+---------------+---------+--------+------------+---------+------------------ + * sd0 | SoC | 12500 | 600000 | 625000 | 1400000 | 1.125V (pkg1.1) + * sd1 | SDRAM | 12500 | 600000 | 1125000 | 1125000 | 1.1V (pkg1.1) + * sd2 | ldo{0-1, 7-8} | 12500 | 600000 | 1325000 | 1350000 | 1.325V (pcv) + * sd3 | 1.8V general | 12500 | 600000 | 1800000 | 1800000 | + * ldo0 | Display Panel | 25000 | 800000 | 1200000 | 1200000 | 1.2V (pkg1.1) + * ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) + * ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 | + * ldo3 | GC ASIC | 50000 | 800000 | 3100000 | 3100000 | 3.1V (pcv) + * ldo4 | RTC | 12500 | 800000 | 850000 | 850000 | 0.85V (AO, pcv) + * ldo5 | GC Card | 50000 | 800000 | 1800000 | 1800000 | 1.8V (pcv) + * ldo6 | Touch, ALS | 50000 | 800000 | 2900000 | 2900000 | 2.9V (pcv) + * ldo7 | XUSB | 50000 | 800000 | 1050000 | 1050000 | 1.05V (pcv) + * ldo8 | XUSB, DP, MCU | 50000 | 800000 | 1050000 | 2800000 | 1.05V/2.8V (pcv) + */ // GPIOs T210: 3: 3.3V, 5: CPU PMIC, 6: GPU PMIC, 7: DSI/VI 1.2V powered by ldo0. @@ -66,15 +65,15 @@ */ /* -* MAX77620_AME_GPIO: control GPIO modes (bits 0 - 7 correspond to GPIO0 - GPIO7); 0 -> GPIO, 1 -> alt-mode -* MAX77620_REG_GPIOx: 0x9 sets output and enable -*/ + * MAX77620_AME_GPIO: control GPIO modes (bits 0 - 7 correspond to GPIO0 - GPIO7); 0 -> GPIO, 1 -> alt-mode + * MAX77620_REG_GPIOx: 0x9 sets output and enable + */ typedef enum { - PcvPowerDomain_Max77620_Sd0 = 0, - PcvPowerDomain_Max77620_Sd1 = 1, - PcvPowerDomain_Max77620_Sd2 = 2, - PcvPowerDomain_Max77620_Sd3 = 3, + PcvPowerDomain_Max77620_Sd0 = 0, + PcvPowerDomain_Max77620_Sd1 = 1, + PcvPowerDomain_Max77620_Sd2 = 2, + PcvPowerDomain_Max77620_Sd3 = 3, PcvPowerDomain_Max77620_Ldo0 = 4, PcvPowerDomain_Max77620_Ldo1 = 5, PcvPowerDomain_Max77620_Ldo2 = 6, @@ -84,18 +83,18 @@ typedef enum { PcvPowerDomain_Max77620_Ldo6 = 10, PcvPowerDomain_Max77620_Ldo7 = 11, PcvPowerDomain_Max77620_Ldo8 = 12, - PcvPowerDomain_Max77621_Cpu = 13, - PcvPowerDomain_Max77621_Gpu = 14, - PcvPowerDomain_Max77812_Cpu = 15, - PcvPowerDomain_Max77812_Gpu = 16, + PcvPowerDomain_Max77621_Cpu = 13, + PcvPowerDomain_Max77621_Gpu = 14, + PcvPowerDomain_Max77812_Cpu = 15, + PcvPowerDomain_Max77812_Gpu = 16, PcvPowerDomain_Max77812_Dram = 17, } PowerDomain; typedef enum { - PcvPowerDomainId_Max77620_Sd0 = 0x3A000080, - PcvPowerDomainId_Max77620_Sd1 = 0x3A000081, // vdd2 - PcvPowerDomainId_Max77620_Sd2 = 0x3A000082, - PcvPowerDomainId_Max77620_Sd3 = 0x3A000083, + PcvPowerDomainId_Max77620_Sd0 = 0x3A000080, + PcvPowerDomainId_Max77620_Sd1 = 0x3A000081, // vdd2 + PcvPowerDomainId_Max77620_Sd2 = 0x3A000082, + PcvPowerDomainId_Max77620_Sd3 = 0x3A000083, PcvPowerDomainId_Max77620_Ldo0 = 0x3A0000A0, PcvPowerDomainId_Max77620_Ldo1 = 0x3A0000A1, PcvPowerDomainId_Max77620_Ldo2 = 0x3A0000A2, @@ -105,9 +104,9 @@ typedef enum { PcvPowerDomainId_Max77620_Ldo6 = 0x3A0000A6, PcvPowerDomainId_Max77620_Ldo7 = 0x3A0000A7, PcvPowerDomainId_Max77620_Ldo8 = 0x3A0000A8, - PcvPowerDomainId_Max77621_Cpu = 0x3A000003, - PcvPowerDomainId_Max77621_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Cpu = 0x3A000003, - PcvPowerDomainId_Max77812_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq + PcvPowerDomainId_Max77621_Cpu = 0x3A000003, + PcvPowerDomainId_Max77621_Gpu = 0x3A000004, + PcvPowerDomainId_Max77812_Cpu = 0x3A000003, + PcvPowerDomainId_Max77812_Gpu = 0x3A000004, + PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq } PowerDomainId; \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp index d3bbb8ab..1c2869fd 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.cpp @@ -24,19 +24,20 @@ * -------------------------------------------------------------------------- */ - -#include "process_management.hpp" -#include "../file/file_utils.hpp" -#include "../file/errors.hpp" #include +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" +#include "process_management.hpp" + + namespace processManagement { namespace { - constexpr u64 Qlaunch = 0x0100000000001000ULL; + constexpr u64 Qlaunch = 0x0100000000001000ULL; constexpr u32 IsQlaunch = 0x20f; Service pdmqryClone; - } + } // namespace void Initialize() { Result rc = 0; @@ -50,11 +51,10 @@ namespace processManagement { rc = pdmqryInitialize(); ASSERT_RESULT_OK(rc, "pdmqryInitialize"); - Service* pdmqrySrv = pdmqryGetServiceSession(); + Service *pdmqrySrv = pdmqryGetServiceSession(); serviceClone(pdmqrySrv, &pdmqryClone); serviceClose(pdmqrySrv); memcpy(pdmqrySrv, &pdmqryClone, sizeof(Service)); - } void WaitForQLaunch() { @@ -62,12 +62,12 @@ namespace processManagement { u64 pid = 0; do { rc = pmdmntGetProcessId(&pid, Qlaunch); - svcSleepThread(50 * 1000000ULL); // 50ms + svcSleepThread(50 * 1000000ULL); // 50ms } while (R_FAILED(rc)); } // Ty to Masa for this function! - Result isApplicationOutOfFocus(bool* outOfFocus) { + Result isApplicationOutOfFocus(bool *outOfFocus) { static s32 last_total_entries = 0; static bool isOutOfFocus = false; s32 total_entries = 0; @@ -77,12 +77,15 @@ namespace processManagement { u64 PIDnow; Result rc = pmdmntGetApplicationProcessId(&PIDnow); - if(R_FAILED(rc)) return rc; + if (R_FAILED(rc)) + return rc; rc = pmdmntGetProgramId(&TIDnow, PIDnow); - if(R_FAILED(rc)) return rc; + if (R_FAILED(rc)) + return rc; rc = pdmqryGetAvailablePlayEventRange(&total_entries, &start_entry_index, &end_entry_index); - if (R_FAILED(rc)) return rc; + if (R_FAILED(rc)) + return rc; if (total_entries == last_total_entries) { *outOfFocus = isOutOfFocus; return 0; @@ -92,13 +95,16 @@ namespace processManagement { PdmPlayEvent events[16]; s32 out = 0; s32 start_entry = end_entry_index - 15; - if (start_entry < 0) start_entry = 0; + if (start_entry < 0) + start_entry = 0; rc = pdmqryQueryPlayEvent(start_entry, events, sizeof(events) / sizeof(events[0]), &out); - if (R_FAILED(rc)) return rc; - if (out == 0) return 1; + if (R_FAILED(rc)) + return rc; + if (out == 0) + return 1; int itr = -1; - for (int i = out-1; i >= 0; i--) { + for (int i = out - 1; i >= 0; i--) { if (events[i].play_event_type != PdmPlayEventType_Applet) continue; if (events[i].event_data.applet.applet_id != AppletId_application) @@ -112,8 +118,6 @@ namespace processManagement { TID.parts.part[0] = events[i].event_data.applet.program_id[1]; TID.parts.part[1] = events[i].event_data.applet.program_id[0]; - - if (TID.full != (TIDnow & ~0xFFF)) continue; else { @@ -121,9 +125,11 @@ namespace processManagement { break; } } - if (itr == -1) return 1; + if (itr == -1) + return 1; - bool isOut = events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus || events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus4; + bool isOut = events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus || + events[itr].event_data.applet.event_type == PdmAppletEventType_OutOfFocus4; *outOfFocus = isOut; isOutOfFocus = isOut; return 0; @@ -158,4 +164,4 @@ namespace processManagement { pdmqryExit(); } -} +} // namespace processManagement diff --git a/Source/hoc-clk/sysmodule/src/hos/process_management.hpp b/Source/hoc-clk/sysmodule/src/hos/process_management.hpp index f7660076..6714e067 100644 --- a/Source/hoc-clk/sysmodule/src/hos/process_management.hpp +++ b/Source/hoc-clk/sysmodule/src/hos/process_management.hpp @@ -24,7 +24,6 @@ * -------------------------------------------------------------------------- */ - #pragma once #include @@ -33,7 +32,7 @@ namespace processManagement { void Initialize(); void WaitForQLaunch(); u64 GetCurrentApplicationId(); - Result isApplicationOutOfFocus(bool* outOfFocus); + Result isApplicationOutOfFocus(bool *outOfFocus); void Exit(); -} +} // namespace processManagement diff --git a/Source/hoc-clk/sysmodule/src/hos/psm_ext.c b/Source/hoc-clk/sysmodule/src/hos/psm_ext.c index e21faf05..7e389ab3 100644 --- a/Source/hoc-clk/sysmodule/src/hos/psm_ext.c +++ b/Source/hoc-clk/sysmodule/src/hos/psm_ext.c @@ -12,44 +12,55 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + #include "psm_ext.h" -const char* PsmPowerRoleToStr(PsmPowerRole role) { +const char *PsmPowerRoleToStr(PsmPowerRole role) { switch (role) { - case PsmPowerRole_Sink: return "Sink"; - case PsmPowerRole_Source: return "Source"; - default: return "Unknown"; + case PsmPowerRole_Sink: + return "Sink"; + case PsmPowerRole_Source: + return "Source"; + default: + return "Unknown"; } } -const char* PsmInfoChargerTypeToStr(PsmInfoChargerType type) { +const char *PsmInfoChargerTypeToStr(PsmInfoChargerType type) { switch (type) { - case PsmInfoChargerType_None: return "None"; - case PsmInfoChargerType_PD: return "USB-C PD"; + case PsmInfoChargerType_None: + return "None"; + case PsmInfoChargerType_PD: + return "USB-C PD"; case PsmInfoChargerType_TypeC_1500mA: - case PsmInfoChargerType_TypeC_3000mA: return "USB-C"; - case PsmInfoChargerType_DCP: return "USB DCP"; - case PsmInfoChargerType_CDP: return "USB CDP"; - case PsmInfoChargerType_SDP: return "USB SDP"; + case PsmInfoChargerType_TypeC_3000mA: + return "USB-C"; + case PsmInfoChargerType_DCP: + return "USB DCP"; + case PsmInfoChargerType_CDP: + return "USB CDP"; + case PsmInfoChargerType_SDP: + return "USB SDP"; case PsmInfoChargerType_Apple_500mA: case PsmInfoChargerType_Apple_1000mA: - case PsmInfoChargerType_Apple_2000mA: return "Apple"; - default: return "Unknown"; + case PsmInfoChargerType_Apple_2000mA: + return "Apple"; + default: + return "Unknown"; } } -bool PsmIsChargerConnected(const PsmChargeInfo* info) { +bool PsmIsChargerConnected(const PsmChargeInfo *info) { return info->ChargerType != PsmInfoChargerType_None; } -bool PsmIsCharging(const PsmChargeInfo* info) { +bool PsmIsCharging(const PsmChargeInfo *info) { return PsmIsChargerConnected(info) && ((info->unk_x14 >> 8) & 1); } -PsmBatteryState PsmGetBatteryState(const PsmChargeInfo* info) { +PsmBatteryState PsmGetBatteryState(const PsmChargeInfo *info) { if (!PsmIsChargerConnected(info)) return PsmBatteryState_Discharging; if (!PsmIsCharging(info)) @@ -57,11 +68,15 @@ PsmBatteryState PsmGetBatteryState(const PsmChargeInfo* info) { return PsmBatteryState_FastCharging; } -const char* PsmGetBatteryStateIcon(const PsmChargeInfo* info) { +const char *PsmGetBatteryStateIcon(const PsmChargeInfo *info) { switch (PsmGetBatteryState(info)) { - case PsmBatteryState_Discharging: return "\u25c0"; // ◀ - case PsmBatteryState_ChargingPaused:return "| |"; - case PsmBatteryState_FastCharging: return "\u25b6"; // ▶ - default: return "?"; + case PsmBatteryState_Discharging: + return "\u25c0"; // ◀ + case PsmBatteryState_ChargingPaused: + return "| |"; + case PsmBatteryState_FastCharging: + return "\u25b6"; // ▶ + default: + return "?"; } } diff --git a/Source/hoc-clk/sysmodule/src/hos/psm_ext.h b/Source/hoc-clk/sysmodule/src/hos/psm_ext.h index 8ba88c8a..7f9f914a 100644 --- a/Source/hoc-clk/sysmodule/src/hos/psm_ext.h +++ b/Source/hoc-clk/sysmodule/src/hos/psm_ext.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -20,75 +20,68 @@ #include typedef enum { - PsmPDC_NewPDO = 1, //Received new Power Data Object - PsmPDC_NoPD = 2, //No Power Delivery source is detected - PsmPDC_AcceptedRDO = 3 //Received and accepted Request Data Object -} PsmChargeInfoPDC; //BM92T series + PsmPDC_NewPDO = 1, // Received new Power Data Object + PsmPDC_NoPD = 2, // No Power Delivery source is detected + PsmPDC_AcceptedRDO = 3 // Received and accepted Request Data Object +} PsmChargeInfoPDC; // BM92T series + +typedef enum { PsmPowerRole_Sink = 1, PsmPowerRole_Source = 2 } PsmPowerRole; + +const char *PsmPowerRoleToStr(PsmPowerRole role); typedef enum { - PsmPowerRole_Sink = 1, - PsmPowerRole_Source = 2 -} PsmPowerRole; - -const char* PsmPowerRoleToStr(PsmPowerRole role); - -typedef enum { - PsmInfoChargerType_None = 0, - PsmInfoChargerType_PD = 1, + PsmInfoChargerType_None = 0, + PsmInfoChargerType_PD = 1, PsmInfoChargerType_TypeC_1500mA = 2, PsmInfoChargerType_TypeC_3000mA = 3, - PsmInfoChargerType_DCP = 4, - PsmInfoChargerType_CDP = 5, - PsmInfoChargerType_SDP = 6, - PsmInfoChargerType_Apple_500mA = 7, + PsmInfoChargerType_DCP = 4, + PsmInfoChargerType_CDP = 5, + PsmInfoChargerType_SDP = 6, + PsmInfoChargerType_Apple_500mA = 7, PsmInfoChargerType_Apple_1000mA = 8, PsmInfoChargerType_Apple_2000mA = 9 } PsmInfoChargerType; -const char* PsmInfoChargerTypeToStr(PsmInfoChargerType type); +const char *PsmInfoChargerTypeToStr(PsmInfoChargerType type); typedef enum { - PsmFlags_NoHub = BIT(0), //If hub is disconnected - PsmFlags_Rail = BIT(8), //At least one Joy-con is charging from rail - PsmFlags_SPDSRC = BIT(12), //OTG - PsmFlags_ACC = BIT(16) //Accessory + PsmFlags_NoHub = BIT(0), // If hub is disconnected + PsmFlags_Rail = BIT(8), // At least one Joy-con is charging from rail + PsmFlags_SPDSRC = BIT(12), // OTG + PsmFlags_ACC = BIT(16) // Accessory } PsmChargeInfoFlags; typedef struct { - int32_t InputCurrentLimit; //Input (Sink) current limit in mA - int32_t VBUSCurrentLimit; //Output (Source/VBUS/OTG) current limit in mA - int32_t ChargeCurrentLimit; //Battery charging current limit in mA (512mA when Docked, 768mA when BatteryTemperature < 17.0 C) - int32_t ChargeVoltageLimit; //Battery charging voltage limit in mV (3952mV when BatteryTemperature >= 51.0 C) - int32_t unk_x10; //Possibly an emum, getting the same value as PowerRole in all tested cases - int32_t unk_x14; //Possibly flags - PsmChargeInfoPDC PDCState; //Power Delivery Controller State - int32_t BatteryTemperature; //Battery temperature in milli C - int32_t RawBatteryCharge; //Raw battery charged capacity per cent-mille (i.e. 100% = 100000 pcm) - int32_t VoltageAvg; //Voltage avg in mV (more in Notes) - int32_t BatteryAge; //Battery age (capacity full / capacity design) per cent-mille (i.e. 100% = 100000 pcm) + int32_t InputCurrentLimit; // Input (Sink) current limit in mA + int32_t VBUSCurrentLimit; // Output (Source/VBUS/OTG) current limit in mA + int32_t ChargeCurrentLimit; // Battery charging current limit in mA (512mA when Docked, 768mA when BatteryTemperature < 17.0 C) + int32_t ChargeVoltageLimit; // Battery charging voltage limit in mV (3952mV when BatteryTemperature >= 51.0 C) + int32_t unk_x10; // Possibly an emum, getting the same value as PowerRole in all tested cases + int32_t unk_x14; // Possibly flags + PsmChargeInfoPDC PDCState; // Power Delivery Controller State + int32_t BatteryTemperature; // Battery temperature in milli C + int32_t RawBatteryCharge; // Raw battery charged capacity per cent-mille (i.e. 100% = 100000 pcm) + int32_t VoltageAvg; // Voltage avg in mV (more in Notes) + int32_t BatteryAge; // Battery age (capacity full / capacity design) per cent-mille (i.e. 100% = 100000 pcm) PsmPowerRole PowerRole; PsmInfoChargerType ChargerType; - int32_t ChargerVoltageLimit; //Charger and external device voltage limit in mV - int32_t ChargerCurrentLimit; //Charger and external device current limit in mA - PsmChargeInfoFlags Flags; //Unknown flags + int32_t ChargerVoltageLimit; // Charger and external device voltage limit in mV + int32_t ChargerCurrentLimit; // Charger and external device current limit in mA + PsmChargeInfoFlags Flags; // Unknown flags } PsmChargeInfo; typedef enum { - Psm_EnableBatteryCharging = 2, - Psm_DisableBatteryCharging = 3, - Psm_EnableFastBatteryCharging = 10, - Psm_DisableFastBatteryCharging = 11, - Psm_GetBatteryChargeInfoFields = 17, + Psm_EnableBatteryCharging = 2, + Psm_DisableBatteryCharging = 3, + Psm_EnableFastBatteryCharging = 10, + Psm_DisableFastBatteryCharging = 11, + Psm_GetBatteryChargeInfoFields = 17, } IPsmServerCmd; -bool PsmIsChargerConnected(const PsmChargeInfo* info); -bool PsmIsCharging(const PsmChargeInfo* info); +bool PsmIsChargerConnected(const PsmChargeInfo *info); +bool PsmIsCharging(const PsmChargeInfo *info); -typedef enum { - PsmBatteryState_Discharging, - PsmBatteryState_ChargingPaused, - PsmBatteryState_FastCharging -} PsmBatteryState; +typedef enum { PsmBatteryState_Discharging, PsmBatteryState_ChargingPaused, PsmBatteryState_FastCharging } PsmBatteryState; -PsmBatteryState PsmGetBatteryState(const PsmChargeInfo* info); -const char* PsmGetBatteryStateIcon(const PsmChargeInfo* info); \ No newline at end of file +PsmBatteryState PsmGetBatteryState(const PsmChargeInfo *info); +const char *PsmGetBatteryStateIcon(const PsmChargeInfo *info); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/pwm.c b/Source/hoc-clk/sysmodule/src/hos/pwm.c index 09c14268..fcc533fe 100644 --- a/Source/hoc-clk/sysmodule/src/hos/pwm.c +++ b/Source/hoc-clk/sysmodule/src/hos/pwm.c @@ -12,11 +12,12 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #define NX_SERVICE_ASSUME_NON_DOMAIN #include + #include "../util/service_guard.h" #include "pwm.h" @@ -32,18 +33,15 @@ void _pwmCleanup(void) { serviceClose(&g_pwmSrv); } -Service* pwmGetServiceSession(void) { +Service *pwmGetServiceSession(void) { return &g_pwmSrv; } Result pwmOpenSession2(PwmChannelSession *out, u32 device_code) { - return serviceDispatchIn(&g_pwmSrv, 2, device_code, - .out_num_objects = 1, - .out_objects = &out->s, - ); + return serviceDispatchIn(&g_pwmSrv, 2, device_code, .out_num_objects = 1, .out_objects = &out->s, ); } -Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out) { +Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double *out) { return serviceDispatchOut(&c->s, 7, *out); } diff --git a/Source/hoc-clk/sysmodule/src/hos/pwm.h b/Source/hoc-clk/sysmodule/src/hos/pwm.h index ccc24e02..f58c5755 100644 --- a/Source/hoc-clk/sysmodule/src/hos/pwm.h +++ b/Source/hoc-clk/sysmodule/src/hos/pwm.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -29,11 +29,11 @@ typedef struct { Result pwmInitialize(void); void pwmExit(void); -Service* pwmGetServiceSession(void); +Service *pwmGetServiceSession(void); Result pwmOpenSession2(PwmChannelSession *out, u32 device_code); -Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out); +Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double *out); void pwmChannelSessionClose(PwmChannelSession *c); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr.h b/Source/hoc-clk/sysmodule/src/hos/rgltr.h index 33268b8a..26150fdf 100644 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr.h +++ b/Source/hoc-clk/sysmodule/src/hos/rgltr.h @@ -12,13 +12,15 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include + #include "pcv_types.h" + typedef struct { Service s; } RgltrSession; @@ -27,12 +29,12 @@ Result rgltrInitialize(void); void rgltrExit(void); -Service* rgltrGetServiceSession(void); +Service *rgltrGetServiceSession(void); -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); -void rgltrCloseSession(RgltrSession* session); -Result rgltrGetVoltage(RgltrSession* session, u32 *out_volt); +Result rgltrOpenSession(RgltrSession *session_out, PowerDomainId module_id); +void rgltrCloseSession(RgltrSession *session); +Result rgltrGetVoltage(RgltrSession *session, u32 *out_volt); Result rgltrGetPowerModuleNumLimit(u32 *out); -Result rgltrGetVoltageEnabled(RgltrSession* session, u32 *out); -Result rgltrRequestVoltage(RgltrSession* session, u32 microvolt); -Result rgltrCancelVoltageRequest(RgltrSession* session); \ No newline at end of file +Result rgltrGetVoltageEnabled(RgltrSession *session, u32 *out); +Result rgltrRequestVoltage(RgltrSession *session, u32 microvolt); +Result rgltrCancelVoltageRequest(RgltrSession *session); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp index 4904df88..d583f739 100644 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp +++ b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp @@ -12,13 +12,15 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include + #include "rgltr.h" #include "rgltr_services.h" // for extern Service g_rgltrSrv, etc. + // Global service handle Service g_rgltrSrv; @@ -33,18 +35,12 @@ void rgltrExit(void) { serviceClose(&g_rgltrSrv); } -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id) { +Result rgltrOpenSession(RgltrSession *session_out, PowerDomainId module_id) { const u32 in = (u32)module_id; - return serviceDispatchIn( - &g_rgltrSrv, - 0, - in, - .out_num_objects = 1, - .out_objects = &session_out->s - ); + return serviceDispatchIn(&g_rgltrSrv, 0, in, .out_num_objects = 1, .out_objects = &session_out->s); } -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt) { +Result rgltrGetVoltage(RgltrSession *session, u32 *out_volt) { u32 temp = 0; Result rc = serviceDispatchOut(&session->s, 4, temp); if (R_SUCCEEDED(rc)) { @@ -53,14 +49,14 @@ Result rgltrGetVoltage(RgltrSession* session, u32* out_volt) { return rc; } -Result rgltrRequestVoltage(RgltrSession* session, u32 microvolt) { +Result rgltrRequestVoltage(RgltrSession *session, u32 microvolt) { return serviceDispatchIn(&session->s, 5, microvolt); } -Result rgltrCancelVoltageRequest(RgltrSession* session) { +Result rgltrCancelVoltageRequest(RgltrSession *session) { return serviceDispatch(&session->s, 6); } -void rgltrCloseSession(RgltrSession* session) { +void rgltrCloseSession(RgltrSession *session) { serviceClose(&session->s); } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h index d8a886bf..c1a5cd29 100644 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h +++ b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h @@ -12,21 +12,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include // for Service, Result, hosversionBefore(), smGetService(), serviceClose(), etc. -#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. + +#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. + extern Service g_rgltrSrv; Result rgltrInitialize(void); -void rgltrExit(void); +void rgltrExit(void); -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); +Result rgltrOpenSession(RgltrSession *session_out, PowerDomainId module_id); -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt); +Result rgltrGetVoltage(RgltrSession *session, u32 *out_volt); -void rgltrCloseSession(RgltrSession* session); \ No newline at end of file +void rgltrCloseSession(RgltrSession *session); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.c b/Source/hoc-clk/sysmodule/src/i2c/i2c.c index 61d090b7..cfdeb177 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.c +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,22 +24,15 @@ * -------------------------------------------------------------------------- */ - #include "i2c.h" #define I2C_CMD_SND 0 #define I2C_CMD_RCV 1 -Result i2csessionExtRegReceive(I2cSession* s, u8 in, void* out, u8 out_size) -{ - u8 cmdlist[5] = { - I2C_CMD_SND | (I2cTransactionOption_Start << 6), - sizeof(in), - in, +Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size) { + u8 cmdlist[5] = { I2C_CMD_SND | (I2cTransactionOption_Start << 6), sizeof(in), in, - I2C_CMD_RCV | (I2cTransactionOption_All << 6), - out_size - }; + I2C_CMD_RCV | (I2cTransactionOption_All << 6), out_size }; return i2csessionExecuteCommandList(s, out, out_size, cmdlist, sizeof(cmdlist)); } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2c.h b/Source/hoc-clk/sysmodule/src/i2c/i2c.h index c3dbe340..91a099de 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2c.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2c.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,17 +24,15 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include -Result i2csessionExtRegReceive(I2cSession* s, u8 in, void* out, u8 out_size); +Result i2csessionExtRegReceive(I2cSession *s, u8 in, void *out, u8 out_size); #ifdef __cplusplus } diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index 1b72ad99..93222148 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include "i2cDrv.h" @@ -37,8 +37,12 @@ Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { } Result I2cRead_OutU8(I2cDevice dev, u8 reg, u8 *out) { - struct { u8 reg; } __attribute__((packed)) cmd; - struct { u8 val; } __attribute__((packed)) rec; + struct { + u8 reg; + } __attribute__((packed)) cmd; + struct { + u8 val; + } __attribute__((packed)) rec; I2cSession _session; Result res = i2cOpenSession(&_session, dev); @@ -63,8 +67,12 @@ Result I2cRead_OutU8(I2cDevice dev, u8 reg, u8 *out) { } Result I2cRead_OutU16(I2cDevice dev, u8 reg, u16 *out) { - struct { u8 reg; } __attribute__((packed)) cmd; - struct { u16 val; } __attribute__((packed)) rec; + struct { + u8 reg; + } __attribute__((packed)) cmd; + struct { + u16 val; + } __attribute__((packed)) rec; I2cSession _session; Result res = i2cOpenSession(&_session, dev); @@ -94,20 +102,20 @@ float I2c_Max17050_GetBatteryCurrent() { if (res) return 0.f; - const float SenseResistor = 5.; // in uOhm - const float CGain = 1.99993; + const float SenseResistor = 5.; // in uOhm + const float CGain = 1.99993; return (s16)val * (1.5625 / (SenseResistor * CGain)); } -u32 I2c_BuckConverter_MultiplierToMvOut(const I2c_BuckConverter_Domain* domain, u8 multiplier) { +u32 I2c_BuckConverter_MultiplierToMvOut(const I2c_BuckConverter_Domain *domain, u8 multiplier) { return (domain->uv_min + domain->uv_step * multiplier) / 1000; } -u32 I2c_BuckConverter_MultiplierToUvOut(const I2c_BuckConverter_Domain* domain, u8 multiplier) { +u32 I2c_BuckConverter_MultiplierToUvOut(const I2c_BuckConverter_Domain *domain, u8 multiplier) { return domain->uv_min + domain->uv_step * multiplier; } -u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain* domain, u32 mvolt) { +u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain *domain, u32 mvolt) { u32 uvolt = mvolt * 1000; if (uvolt < domain->uv_min) uvolt = domain->uv_min; @@ -117,7 +125,7 @@ u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain* domain, u return (uvolt - domain->uv_min) / domain->uv_step; } -u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain) { +u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain) { u8 val; // Retry 5 times if received POR value for (int i = 0; i < 5; i++) { @@ -133,7 +141,7 @@ u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain) { return I2c_BuckConverter_MultiplierToMvOut(domain, val & domain->volt_mask); } -u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain) { +u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain) { u8 val; // Retry 5 times if received POR value for (int i = 0; i < 5; i++) { @@ -149,7 +157,7 @@ u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain) { return I2c_BuckConverter_MultiplierToUvOut(domain, val & domain->volt_mask); } -Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain* domain, u32 mvolt) { +Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mvolt) { u8 val; Result res = I2cRead_OutU8(domain->device, domain->reg, &val); if (R_FAILED(res)) @@ -179,7 +187,7 @@ u8 I2c_Bq24193_Convert_mA_Raw(u32 ma) { // Adjustment is required u8 raw = 0; - if (ma > MA_RANGE_MAX) // capping + if (ma > MA_RANGE_MAX) // capping ma = MA_RANGE_MAX; bool pct20 = ma <= (MA_RANGE_MIN - 64); @@ -188,8 +196,8 @@ u8 I2c_Bq24193_Convert_mA_Raw(u32 ma) { raw |= 0x1; } - ma -= ma % 100; // round to 100 - ma -= (MA_RANGE_MIN - 64); // ceiling + ma -= ma % 100; // round to 100 + ma -= (MA_RANGE_MIN - 64); // ceiling raw |= (ma >> 6) << 2; return raw; @@ -219,4 +227,78 @@ Result I2c_Bq24193_GetFastChargeCurrentLimit(u32 *ma) { Result I2c_Bq24193_SetFastChargeCurrentLimit(u32 ma) { u8 raw = I2c_Bq24193_Convert_mA_Raw(ma); return I2cSet_U8(I2cDevice_Bq24193, BQ24193_CHARGE_CURRENT_CONTROL_REG, raw); -} \ No newline at end of file +} + +// Converts mA to the raw value for bits [2:0] of REG00 +static u8 I2c_Bq24193_Convert_InputmA_Raw(u32 ma) { + if (ma <= 100) + return 0b000; + if (ma <= 150) + return 0b001; + if (ma <= 500) + return 0b010; + if (ma <= 900) + return 0b011; + if (ma <= 1200) + return 0b100; + if (ma <= 1500) + return 0b101; + if (ma <= 2000) + return 0b110; + return 0b111; // 3000mA max +} + +Result I2c_Bq24193_SetInputCurrentLimit(u32 ma) { + // don't do anything if it's disabled + if (ma == 0) + return 0; + + u8 raw; + Result res = I2cRead_OutU8(I2cDevice_Bq24193, BQ24193_INPUT_SOURCE_CONTROL_REG, &raw); + if (R_FAILED(res)) + return res; + + raw &= ~0x07; + raw |= I2c_Bq24193_Convert_InputmA_Raw(ma); + + return I2cSet_U8(I2cDevice_Bq24193, BQ24193_INPUT_SOURCE_CONTROL_REG, raw); +} + +// not used +Result I2c_Bq24193_GetInputCurrentLimit(u32 *ma) { + u8 raw; + Result res = I2cRead_OutU8(I2cDevice_Bq24193, BQ24193_INPUT_SOURCE_CONTROL_REG, &raw); + if (R_FAILED(res)) + return res; + + switch (raw & 0x07) { + case 0b000: + *ma = 100; + break; + case 0b001: + *ma = 150; + break; + case 0b010: + *ma = 500; + break; + case 0b011: + *ma = 900; + break; + case 0b100: + *ma = 1200; + break; + case 0b101: + *ma = 1500; + break; + case 0b110: + *ma = 2000; + break; + case 0b111: + *ma = 3000; + break; + default: + *ma = 0; + break; + } + return 0; +} diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h index 161306fe..3f561045 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h @@ -22,12 +22,12 @@ const u8 MAX17050_CURRENT_REG = 0x0A; // Buck Converter typedef enum I2c_BuckConverter_Reg { I2c_Max77620_SD0VOLT_REG = 0x16, - I2c_Max77620_SD1VOLT_REG = 0x17, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 - I2c_Max77620_LDO0VOLT_REG = 0x23, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 - I2c_Max77621_VOLT_REG = 0x00, + I2c_Max77620_SD1VOLT_REG = 0x17, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 + I2c_Max77620_LDO0VOLT_REG = 0x23, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 + I2c_Max77621_VOLT_REG = 0x00, I2c_Max77812_CPUVOLT_REG = 0x26, I2c_Max77812_GPUVOLT_REG = 0x23, - I2c_Max77812_MEMVOLT_REG = 0x25, // Master 3 (GPU 1 + 2, DRAM 3, CPU 4), used for Mariko VDDQ + I2c_Max77812_MEMVOLT_REG = 0x25, // Master 3 (GPU 1 + 2, DRAM 3, CPU 4), used for Mariko VDDQ } I2c_BuckConverter_Reg; typedef struct I2c_BuckConverter_Domain { @@ -40,22 +40,32 @@ typedef struct I2c_BuckConverter_Domain { u8 por_val; } I2c_BuckConverter_Domain; -const I2c_BuckConverter_Domain I2c_SOC = { I2cDevice_Max77620Pmic, I2c_Max77620_SD0VOLT_REG, 0x7F, 12500, 600000, 1400000, }; -const I2c_BuckConverter_Domain I2c_VDD2 = { I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1350000, }; -const I2c_BuckConverter_Domain I2c_Display = { I2cDevice_Max77620Pmic, I2c_Max77620_LDO0VOLT_REG, 0x3F, 25000, 800000, 1325000, }; -const I2c_BuckConverter_Domain I2c_Erista_CPU = { I2cDevice_Max77621Cpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; -const I2c_BuckConverter_Domain I2c_Erista_GPU = { I2cDevice_Max77621Gpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; -const I2c_BuckConverter_Domain I2c_Mariko_CPU = { I2cDevice_Max77812_2, I2c_Max77812_CPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; -const I2c_BuckConverter_Domain I2c_Mariko_GPU = { I2cDevice_Max77812_2, I2c_Max77812_GPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; -const I2c_BuckConverter_Domain I2c_Mariko_DRAM_VDDQ = { I2cDevice_Max77812_2, I2c_Max77812_MEMVOLT_REG, 0xFF, 5000, 250000, 700000, 0x78 }; +const I2c_BuckConverter_Domain I2c_SOC = { + I2cDevice_Max77620Pmic, I2c_Max77620_SD0VOLT_REG, 0x7F, 12500, 600000, 1400000, +}; +const I2c_BuckConverter_Domain I2c_VDD2 = { + I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1350000, +}; +const I2c_BuckConverter_Domain I2c_Display = { + I2cDevice_Max77620Pmic, I2c_Max77620_LDO0VOLT_REG, 0x3F, 25000, 800000, 1325000, +}; +const I2c_BuckConverter_Domain I2c_Erista_CPU = { + I2cDevice_Max77621Cpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, +}; +const I2c_BuckConverter_Domain I2c_Erista_GPU = { + I2cDevice_Max77621Gpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, +}; +const I2c_BuckConverter_Domain I2c_Mariko_CPU = { I2cDevice_Max77812_2, I2c_Max77812_CPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; +const I2c_BuckConverter_Domain I2c_Mariko_GPU = { I2cDevice_Max77812_2, I2c_Max77812_GPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; +const I2c_BuckConverter_Domain I2c_Mariko_DRAM_VDDQ = { I2cDevice_Max77812_2, I2c_Max77812_MEMVOLT_REG, 0xFF, 5000, 250000, 700000, 0x78 }; -u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain); -u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain); -Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain* domain, u32 mvolt); +u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain *domain); +u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain *domain); +Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain *domain, u32 mvolt); // Bq24193 Battery management u32 I2c_Bq24193_Convert_Raw_mA(u8 raw); -u8 I2c_Bq24193_Convert_mA_Raw(u32 ma); +u8 I2c_Bq24193_Convert_mA_Raw(u32 ma); Result I2c_Bq24193_GetFastChargeCurrentLimit(u32 *ma); Result I2c_Bq24193_SetFastChargeCurrentLimit(u32 ma); @@ -63,4 +73,9 @@ Result I2c_Bq24193_SetFastChargeCurrentLimit(u32 ma); const u32 MA_RANGE_MIN = 512; const u32 MA_RANGE_MAX = 4544; -const u8 BQ24193_CHARGE_CURRENT_CONTROL_REG = 0x2; \ No newline at end of file +const u8 BQ24193_CHARGE_CURRENT_CONTROL_REG = 0x2; + +Result I2c_Bq24193_SetInputCurrentLimit(u32 ma); +Result I2c_Bq24193_GetInputCurrentLimit(u32 *ma); + +const u8 BQ24193_INPUT_SOURCE_CONTROL_REG = 0x00; \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.c b/Source/hoc-clk/sysmodule/src/i2c/max17050.c index cecca39c..8f82c14c 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max17050.c +++ b/Source/hoc-clk/sysmodule/src/i2c/max17050.c @@ -22,15 +22,15 @@ * */ -#include "max17050.h" #include "i2c.h" +#include "max17050.h" #define MAX17050_WAIT_NS 1000000000UL -#define MAX17050_VCELL 0x09 -#define MAX17050_Current 0x0A +#define MAX17050_VCELL 0x09 +#define MAX17050_Current 0x0A #define MAX17050_AvgCurrent 0x0B -#define MAX17050_AvgVCELL 0x19 +#define MAX17050_AvgVCELL 0x19 #define MAX17050_BOARD_CGAIN 2 #define MAX17050_BOARD_SNS_RESISTOR_UOHM 5000 @@ -40,15 +40,13 @@ static u64 g_update_ticks = 0; static s32 g_power_now = 0; static s32 g_power_avg = 0; -static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) -{ +static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) { s64 ma, mv; - u16 values[3] = {0}; + u16 values[3] = { 0 }; Result rc = i2csessionExtRegReceive(&g_i2c_session, MAX17050_VCELL, values, sizeof(values)); - if (R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { ma = (s16)values[1]; ma = ma * 1562500 / (MAX17050_BOARD_SNS_RESISTOR_UOHM * MAX17050_BOARD_CGAIN); @@ -57,13 +55,11 @@ static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) *out_mw_now = ma * mv / 1000000; } - if (R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = i2csessionExtRegReceive(&g_i2c_session, MAX17050_AvgVCELL, values, sizeof(u16)); } - if (R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { ma = (s16)values[2]; ma = ma * 1562500 / (MAX17050_BOARD_SNS_RESISTOR_UOHM * MAX17050_BOARD_CGAIN); @@ -75,50 +71,42 @@ static Result _max17050_get_power(s32 *out_mw_now, s32 *out_mw_avg) return rc; } -static void _max17050_update() -{ +static void _max17050_update() { u64 ticks = armGetSystemTick(); - if(armTicksToNs(ticks - g_update_ticks) <= MAX17050_WAIT_NS) - { + if (armTicksToNs(ticks - g_update_ticks) <= MAX17050_WAIT_NS) { return; } g_update_ticks = ticks; - if(!serviceIsActive(&g_i2c_session.s)) - { + if (!serviceIsActive(&g_i2c_session.s)) { return; } _max17050_get_power(&g_power_now, &g_power_avg); } -Result max17050Initialize(void) -{ +Result max17050Initialize(void) { Result rc = i2cInitialize(); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = i2cOpenSession(&g_i2c_session, I2cDevice_Max17050); } return rc; } -void max17050Exit(void) -{ +void max17050Exit(void) { i2csessionClose(&g_i2c_session); i2cExit(); } -s32 max17050PowerNow(void) -{ +s32 max17050PowerNow(void) { _max17050_update(); return g_power_now; } -s32 max17050PowerAvg(void) -{ +s32 max17050PowerAvg(void) { _max17050_update(); return g_power_avg; } diff --git a/Source/hoc-clk/sysmodule/src/i2c/max17050.h b/Source/hoc-clk/sysmodule/src/i2c/max17050.h index a22046db..ffdd177e 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/max17050.h +++ b/Source/hoc-clk/sysmodule/src/i2c/max17050.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.c b/Source/hoc-clk/sysmodule/src/i2c/tmp451.c index e465a2c5..e82383b4 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.c +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.c @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -#include "tmp451.h" #include "i2c.h" +#include "tmp451.h" #define TMP451_WAIT_NS 1000000000UL -#define TMP451_PCB_TEMP_REG 0x00 -#define TMP451_SOC_TEMP_REG 0x01 +#define TMP451_PCB_TEMP_REG 0x00 +#define TMP451_SOC_TEMP_REG 0x01 #define TMP451_SOC_TMP_DEC_REG 0x10 #define TMP451_PCB_TMP_DEC_REG 0x15 @@ -33,37 +33,31 @@ static u64 g_update_ticks = 0; static s32 g_temp_pcb = 0; static s32 g_temp_soc = 0; -static Result _tmp451_get_temp(u8 reg, u8 dec_reg, s32* out) -{ +static Result _tmp451_get_temp(u8 reg, u8 dec_reg, s32 *out) { u8 val = 0; Result rc = i2csessionExtRegReceive(&g_i2c_session, reg, &val, sizeof(val)); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { *out = (s32)val * 1000; rc = i2csessionExtRegReceive(&g_i2c_session, dec_reg, &val, sizeof(val)); } - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { *out += ((s32)(val >> 4) * 625) / 10; } return rc; } -static void _tmp451_update() -{ +static void _tmp451_update() { u64 ticks = armGetSystemTick(); - if(armTicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) - { + if (armTicksToNs(ticks - g_update_ticks) <= TMP451_WAIT_NS) { return; } g_update_ticks = ticks; - if(!serviceIsActive(&g_i2c_session.s)) - { + if (!serviceIsActive(&g_i2c_session.s)) { return; } @@ -71,32 +65,27 @@ static void _tmp451_update() _tmp451_get_temp(TMP451_SOC_TEMP_REG, TMP451_SOC_TMP_DEC_REG, &g_temp_soc); } -Result tmp451Initialize(void) -{ +Result tmp451Initialize(void) { Result rc = i2cInitialize(); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = i2cOpenSession(&g_i2c_session, I2cDevice_Tmp451); } return rc; } -void tmp451Exit(void) -{ +void tmp451Exit(void) { i2csessionClose(&g_i2c_session); i2cExit(); } -s32 tmp451TempPcb(void) -{ +s32 tmp451TempPcb(void) { _tmp451_update(); return g_temp_pcb; } -s32 tmp451TempSoc(void) -{ +s32 tmp451TempSoc(void) { _tmp451_update(); return g_temp_soc; } diff --git a/Source/hoc-clk/sysmodule/src/i2c/tmp451.h b/Source/hoc-clk/sysmodule/src/i2c/tmp451.h index 9faf2480..7872b59e 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/tmp451.h +++ b/Source/hoc-clk/sysmodule/src/i2c/tmp451.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c index 986612c6..340d9b18 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.c @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,14 +24,12 @@ * -------------------------------------------------------------------------- */ - -#include "ipc_server.h" #include -Result ipcServerInit(IpcServer* server, const char* name, u32 max_sessions) -{ - if(max_sessions < 1 || max_sessions > (MAX_WAIT_OBJECTS - 1)) - { +#include "ipc_server.h" + +Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions) { + if (max_sessions < 1 || max_sessions > (MAX_WAIT_OBJECTS - 1)) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } @@ -40,27 +38,22 @@ Result ipcServerInit(IpcServer* server, const char* name, u32 max_sessions) server->count = 0; Result rc = smRegisterService(&server->handles[0], server->srvName, false, max_sessions); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { server->count = 1; } return rc; } -Result ipcServerExit(IpcServer* server) -{ - for(u32 i = 0; i < server->count; i++) - { +Result ipcServerExit(IpcServer *server) { + for (u32 i = 0; i < server->count; i++) { svcCloseHandle(server->handles[i]); } server->count = 0; return smUnregisterService(server->srvName); } -static Result _ipcServerAddSession(IpcServer* server, Handle session) -{ - if(server->count >= server->max) - { +static Result _ipcServerAddSession(IpcServer *server, Handle session) { + if (server->count >= server->max) { return MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); } @@ -69,84 +62,70 @@ static Result _ipcServerAddSession(IpcServer* server, Handle session) return 0; } -static Result _ipcServerDeleteSession(IpcServer* server, u32 index) -{ - if(!index || index >= server->count) - { +static Result _ipcServerDeleteSession(IpcServer *server, u32 index) { + if (!index || index >= server->count) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } svcCloseHandle(server->handles[index]); - for(u32 j = index; j < (server->count - 1); j++) - { + for (u32 j = index; j < (server->count - 1); j++) { server->handles[j] = server->handles[j + 1]; } server->count--; return 0; } -static Result _ipcServerParseRequest(IpcServerRequest* r) -{ - u8* base = armGetTls(); +static Result _ipcServerParseRequest(IpcServerRequest *r) { + u8 *base = armGetTls(); r->hipc = hipcParseRequest(base); r->data.cmdId = 0; r->data.size = 0; - r->data.ptr = NULL; + r->data.ptr = NULL; - if(r->hipc.meta.type == CmifCommandType_Request) - { - IpcServerRawHeader* header = cmifGetAlignedDataStart(r->hipc.data.data_words, base); + if (r->hipc.meta.type == CmifCommandType_Request) { + IpcServerRawHeader *header = cmifGetAlignedDataStart(r->hipc.data.data_words, base); size_t dataSize = r->hipc.meta.num_data_words * 4; - if(!header || dataSize < sizeof(IpcServerRawHeader) || header->magic != CMIF_IN_HEADER_MAGIC) - { + if (!header || dataSize < sizeof(IpcServerRawHeader) || header->magic != CMIF_IN_HEADER_MAGIC) { return MAKERESULT(Module_Libnx, LibnxError_BadInput); } r->data.cmdId = header->cmdId; - if(dataSize > sizeof(IpcServerRawHeader)) - { + if (dataSize > sizeof(IpcServerRawHeader)) { r->data.size = dataSize - sizeof(IpcServerRawHeader); - r->data.ptr = ((u8*)header) + sizeof(IpcServerRawHeader); + r->data.ptr = ((u8 *)header) + sizeof(IpcServerRawHeader); } } return 0; } -static void _ipcServerPrepareResponse(Result rc, void* data, size_t dataSize) -{ - u8* base = armGetTls(); - HipcRequest hipc = hipcMakeRequestInline(base, - .type = CmifCommandType_Request, - .num_data_words = (sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, - ); +static void _ipcServerPrepareResponse(Result rc, void *data, size_t dataSize) { + u8 *base = armGetTls(); + HipcRequest hipc = + hipcMakeRequestInline(base, .type = CmifCommandType_Request, .num_data_words = (sizeof(IpcServerRawHeader) + dataSize + 0x10) / 4, ); - IpcServerRawHeader* rawHeader = cmifGetAlignedDataStart(hipc.data_words, base); + IpcServerRawHeader *rawHeader = cmifGetAlignedDataStart(hipc.data_words, base); rawHeader->magic = CMIF_OUT_HEADER_MAGIC; rawHeader->result = rc; - if(R_SUCCEEDED(rc)) - { - memcpy(((u8*)rawHeader) + sizeof(IpcServerRawHeader), data, dataSize); + if (R_SUCCEEDED(rc)) { + memcpy(((u8 *)rawHeader) + sizeof(IpcServerRawHeader), data, dataSize); } } -static Result _ipcServerProcessNewSession(IpcServer* server) -{ +static Result _ipcServerProcessNewSession(IpcServer *server) { Handle session; Result rc = svcAcceptSession(&session, server->handles[0]); - if(R_SUCCEEDED(rc) && R_FAILED(rc = _ipcServerAddSession(server, session))) - { + if (R_SUCCEEDED(rc) && R_FAILED(rc = _ipcServerAddSession(server, session))) { svcCloseHandle(session); } return rc; } -static Result _ipcServerProcessSession(IpcServer* server, IpcServerRequestHandler handler, void* userdata, u32 handleIndex) -{ +static Result _ipcServerProcessSession(IpcServer *server, IpcServerRequestHandler handler, void *userdata, u32 handleIndex) { s32 unusedIndex; IpcServerRequest r; size_t dataSize = 0; @@ -154,21 +133,14 @@ static Result _ipcServerProcessSession(IpcServer* server, IpcServerRequestHandle bool close = false; Result rc = svcReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 1, 0, UINT64_MAX); - if(R_SUCCEEDED(rc)) - { + if (R_SUCCEEDED(rc)) { rc = _ipcServerParseRequest(&r); } - if(R_SUCCEEDED(rc)) - { - switch(r.hipc.meta.type) - { + if (R_SUCCEEDED(rc)) { + switch (r.hipc.meta.type) { case CmifCommandType_Request: - _ipcServerPrepareResponse( - handler(userdata, &r, data, &dataSize), - data, - dataSize - ); + _ipcServerPrepareResponse(handler(userdata, &r, data, &dataSize), data, dataSize); break; case CmifCommandType_Close: _ipcServerPrepareResponse(0, NULL, 0); @@ -180,42 +152,33 @@ static Result _ipcServerProcessSession(IpcServer* server, IpcServerRequestHandle } rc = svcReplyAndReceive(&unusedIndex, &server->handles[handleIndex], 0, server->handles[handleIndex], 0); - if(rc == KERNELRESULT(TimedOut)) - { + if (rc == KERNELRESULT(TimedOut)) { rc = 0; } } - if(R_FAILED(rc) || close) - { + if (R_FAILED(rc) || close) { _ipcServerDeleteSession(server, handleIndex); } return rc; } -Result ipcServerProcess(IpcServer* server, IpcServerRequestHandler handler, void* userdata) -{ +Result ipcServerProcess(IpcServer *server, IpcServerRequestHandler handler, void *userdata) { s32 handleIndex = -1; Result rc = svcWaitSynchronization(&handleIndex, server->handles, server->count, UINT64_MAX); - if(R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= server->count)) - { + if (R_SUCCEEDED(rc) && (handleIndex < 0 || handleIndex >= server->count)) { rc = MAKERESULT(Module_Libnx, LibnxError_NotFound); } - if(R_SUCCEEDED(rc)) - { - if(handleIndex) - { + if (R_SUCCEEDED(rc)) { + if (handleIndex) { rc = _ipcServerProcessSession(server, handler, userdata, handleIndex); - } - else - { + } else { rc = _ipcServerProcessNewSession(server); } } return rc; } - diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h index 0c8f294b..7b5a24c8 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_server.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,55 +24,48 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include #define IPC_SERVER_EXT_RESPONSE_MAX_DATA_SIZE (0x100 - 0x10 - sizeof(IpcServerRawHeader)) -typedef struct -{ +typedef struct { u64 magic; - union - { + union { u64 cmdId; u64 result; }; } IpcServerRawHeader; -typedef struct -{ +typedef struct { SmServiceName srvName; Handle handles[MAX_WAIT_OBJECTS]; u32 max; u32 count; } IpcServer; -typedef struct -{ +typedef struct { u64 cmdId; - void* ptr; + void *ptr; size_t size; } IpcServerRequestData; -typedef struct -{ +typedef struct { HipcParsedRequest hipc; IpcServerRequestData data; } IpcServerRequest; -typedef Result (*IpcServerRequestHandler)(void* userdata, const IpcServerRequest* r, u8* out_data, size_t* out_dataSize); +typedef Result (*IpcServerRequestHandler)(void *userdata, const IpcServerRequest *r, u8 *out_data, size_t *out_dataSize); -Result ipcServerInit(IpcServer* server, const char* name, u32 max_sessions); -Result ipcServerExit(IpcServer* server); -Result ipcServerProcess(IpcServer* server, IpcServerRequestHandler handler, void* userdata); -Result ipcServerParseCommand(const IpcServerRequest* r, size_t* out_datasize, void** out_data, u64* out_cmd); +Result ipcServerInit(IpcServer *server, const char *name, u32 max_sessions); +Result ipcServerExit(IpcServer *server); +Result ipcServerProcess(IpcServer *server, IpcServerRequestHandler handler, void *userdata); +Result ipcServerParseCommand(const IpcServerRequest *r, size_t *out_datasize, void **out_data, u64 *out_cmd); #ifdef __cplusplus } diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp index 34890245..11a40897 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.cpp @@ -24,21 +24,22 @@ * -------------------------------------------------------------------------- */ -#include "ipc_service.hpp" #include -#include -#include "../hos/apm_ext.h" #include -#include #include +#include +#include #include + +#include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" +#include "../file/kip.hpp" +#include "../hos/apm_ext.h" +#include "../mgr/clock_manager.hpp" +#include "ipc_service.hpp" #include #include -#include "../file/file_utils.hpp" -#include "../file/errors.hpp" -#include "../mgr/clock_manager.hpp" -#include "../file/config.hpp" -#include "../file/kip.hpp" namespace ipcService { namespace { @@ -48,19 +49,19 @@ namespace ipcService { LockableMutex gThreadMutex; IpcServer gServer; - Result GetApiVersion(u32* out_version) { + Result GetApiVersion(u32 *out_version) { *out_version = HOCCLK_IPC_API_VERSION; return 0; } - Result GetVersionString(char* out_buf, size_t bufSize) { + Result GetVersionString(char *out_buf, size_t bufSize) { if (bufSize) { - strncpy(out_buf, TARGET_VERSION, bufSize-1); + strncpy(out_buf, TARGET_VERSION, bufSize - 1); } return 0; } - Result GetCurrentContext(HocClkContext* out_ctx) { + Result GetCurrentContext(HocClkContext *out_ctx) { *out_ctx = clockManager::GetCurrentContext(); return 0; } @@ -70,7 +71,7 @@ namespace ipcService { return 0; } - Result GetProfileCount(std::uint64_t* tid, std::uint8_t* out_count) { + Result GetProfileCount(std::uint64_t *tid, std::uint8_t *out_count) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -78,7 +79,7 @@ namespace ipcService { return 0; } - Result GetProfiles(std::uint64_t* tid, HocClkTitleProfileList* out_profiles) { + Result GetProfiles(std::uint64_t *tid, HocClkTitleProfileList *out_profiles) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -86,7 +87,7 @@ namespace ipcService { return 0; } - Result SetProfiles(HocClkIpc_SetProfiles_Args* args) { + Result SetProfiles(HocClkIpc_SetProfiles_Args *args) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -97,12 +98,12 @@ namespace ipcService { return 0; } - Result SetEnabled(std::uint8_t* enabled) { + Result SetEnabled(std::uint8_t *enabled) { config::SetEnabled(*enabled); return 0; } - Result SetOverride(HocClkIpc_SetOverride_Args* args) { + Result SetOverride(HocClkIpc_SetOverride_Args *args) { if (!HOCCLK_ENUM_VALID(HocClkModule, args->module)) { return HOCCLK_ERROR(Generic); } @@ -110,7 +111,7 @@ namespace ipcService { return 0; } - Result GetConfigValuesHandler(HocClkConfigValueList* out_configValues) { + Result GetConfigValuesHandler(HocClkConfigValueList *out_configValues) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -118,7 +119,7 @@ namespace ipcService { return 0; } - Result SetConfigValuesHandler(HocClkConfigValueList* configValues) { + Result SetConfigValuesHandler(HocClkConfigValueList *configValues) { if (!config::HasProfilesLoaded()) { return HOCCLK_ERROR(ConfigNotLoaded); } @@ -129,30 +130,28 @@ namespace ipcService { return 0; } - Result GetFreqList(HocClkIpc_GetFreqList_Args* args, std::uint32_t* out_list, std::size_t size, std::uint32_t* out_count) { + Result GetFreqList(HocClkIpc_GetFreqList_Args *args, std::uint32_t *out_list, std::size_t size, std::uint32_t *out_count) { if (!HOCCLK_ENUM_VALID(HocClkModule, args->module)) { return HOCCLK_ERROR(Generic); } - if (args->maxCount != size/sizeof(*out_list)) { + if (args->maxCount != size / sizeof(*out_list)) { return HOCCLK_ERROR(Generic); } clockManager::GetFreqList(args->module, out_list, args->maxCount, out_count); return 0; } - Result ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8* out_data, size_t* out_dataSize) { + Result ServiceHandlerFunc(void *arg, const IpcServerRequest *r, u8 *out_data, size_t *out_dataSize) { (void)arg; switch (r->data.cmdId) { case HocClkIpcCmd_GetApiVersion: *out_dataSize = sizeof(u32); - return GetApiVersion((u32*)out_data); + return GetApiVersion((u32 *)out_data); case HocClkIpcCmd_GetVersionString: if (r->hipc.meta.num_recv_buffers >= 1) { - return GetVersionString( - (char*)hipcGetBufferAddress(r->hipc.data.recv_buffers), - hipcGetBufferSize(r->hipc.data.recv_buffers) - ); + return GetVersionString((char *)hipcGetBufferAddress(r->hipc.data.recv_buffers), + hipcGetBufferSize(r->hipc.data.recv_buffers)); } break; @@ -160,7 +159,7 @@ namespace ipcService { if (r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); if (bufSize >= sizeof(HocClkContext)) { - return GetCurrentContext((HocClkContext*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + return GetCurrentContext((HocClkContext *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; @@ -171,7 +170,7 @@ namespace ipcService { case HocClkIpcCmd_GetProfileCount: if (r->data.size >= sizeof(std::uint64_t)) { *out_dataSize = sizeof(std::uint8_t); - return GetProfileCount((std::uint64_t*)r->data.ptr, (std::uint8_t*)out_data); + return GetProfileCount((std::uint64_t *)r->data.ptr, (std::uint8_t *)out_data); } break; @@ -179,26 +178,27 @@ namespace ipcService { if (r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); if (bufSize >= sizeof(HocClkTitleProfileList)) { - return GetProfiles((std::uint64_t*)r->data.ptr, (HocClkTitleProfileList*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + return GetProfiles((std::uint64_t *)r->data.ptr, + (HocClkTitleProfileList *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; case HocClkIpcCmd_SetProfiles: if (r->data.size >= sizeof(HocClkIpc_SetProfiles_Args)) { - return SetProfiles((HocClkIpc_SetProfiles_Args*)r->data.ptr); + return SetProfiles((HocClkIpc_SetProfiles_Args *)r->data.ptr); } break; case HocClkIpcCmd_SetEnabled: if (r->data.size >= sizeof(std::uint8_t)) { - return SetEnabled((std::uint8_t*)r->data.ptr); + return SetEnabled((std::uint8_t *)r->data.ptr); } break; case HocClkIpcCmd_SetOverride: if (r->data.size >= sizeof(HocClkIpc_SetOverride_Args)) { - return SetOverride((HocClkIpc_SetOverride_Args*)r->data.ptr); + return SetOverride((HocClkIpc_SetOverride_Args *)r->data.ptr); } break; @@ -206,7 +206,7 @@ namespace ipcService { if (r->hipc.meta.num_recv_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); if (bufSize >= sizeof(HocClkConfigValueList)) { - return GetConfigValuesHandler((HocClkConfigValueList*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + return GetConfigValuesHandler((HocClkConfigValueList *)hipcGetBufferAddress(r->hipc.data.recv_buffers)); } } break; @@ -215,7 +215,7 @@ namespace ipcService { if (r->hipc.meta.num_send_buffers >= 1) { size_t bufSize = hipcGetBufferSize(r->hipc.data.send_buffers); if (bufSize >= sizeof(HocClkConfigValueList)) { - return SetConfigValuesHandler((HocClkConfigValueList*)hipcGetBufferAddress(r->hipc.data.send_buffers)); + return SetConfigValuesHandler((HocClkConfigValueList *)hipcGetBufferAddress(r->hipc.data.send_buffers)); } } break; @@ -223,12 +223,9 @@ namespace ipcService { case HocClkIpcCmd_GetFreqList: if (r->data.size >= sizeof(HocClkIpc_GetFreqList_Args) && r->hipc.meta.num_recv_buffers >= 1) { *out_dataSize = sizeof(std::uint32_t); - return GetFreqList( - (HocClkIpc_GetFreqList_Args*)r->data.ptr, - (std::uint32_t*)hipcGetBufferAddress(r->hipc.data.recv_buffers), - hipcGetBufferSize(r->hipc.data.recv_buffers), - (std::uint32_t*)out_data - ); + return GetFreqList((HocClkIpc_GetFreqList_Args *)r->data.ptr, + (std::uint32_t *)hipcGetBufferAddress(r->hipc.data.recv_buffers), + hipcGetBufferSize(r->hipc.data.recv_buffers), (std::uint32_t *)out_data); } break; @@ -243,7 +240,7 @@ namespace ipcService { return HOCCLK_ERROR(Generic); } - void ProcessThreadFunc(void* arg) { + void ProcessThreadFunc(void *arg) { (void)arg; Result rc; while (true) { @@ -259,7 +256,7 @@ namespace ipcService { } } - } + } // namespace void Initialize() { std::int32_t priority; @@ -281,7 +278,7 @@ namespace ipcService { } void SetRunning(bool running) { - std::scoped_lock lock{gThreadMutex}; + std::scoped_lock lock{ gThreadMutex }; if (gRunning == running) { return; } @@ -297,4 +294,4 @@ namespace ipcService { } } -} +} // namespace ipcService diff --git a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp index d1fcfac3..a8a9928b 100644 --- a/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp +++ b/Source/hoc-clk/sysmodule/src/ipc/ipc_service.hpp @@ -35,4 +35,4 @@ namespace ipcService { void Exit(); void SetRunning(bool running); -} +} // namespace ipcService diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 52e5e0d1..f7c5b0c1 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -27,115 +27,106 @@ #include #include #include - #include +#include "board/board.hpp" +#include "file/config.hpp" #include "file/errors.hpp" #include "file/file_utils.hpp" -#include "board/board.hpp" #include "hos/process_management.hpp" -#include "mgr/clock_manager.hpp" #include "ipc/ipc_service.hpp" -#include "file/config.hpp" +#include "mgr/clock_manager.hpp" + #define INNER_HEAP_SIZE 0x40000 -extern "C" -{ - void virtmemSetup(void); +extern "C" { +void virtmemSetup(void); - extern std::uint32_t __start__; +extern std::uint32_t __start__; - std::uint32_t __nx_applet_type = AppletType_None; - TimeServiceType __nx_time_service_type = TimeServiceType_System; - std::uint32_t __nx_fs_num_sessions = 1; - u32 __nx_nv_transfermem_size = 0x8000; - size_t nx_inner_heap_size = INNER_HEAP_SIZE; - char nx_inner_heap[INNER_HEAP_SIZE]; - NvServiceType __nx_nv_service_type = NvServiceType_Factory; +std::uint32_t __nx_applet_type = AppletType_None; +TimeServiceType __nx_time_service_type = TimeServiceType_System; +std::uint32_t __nx_fs_num_sessions = 1; +u32 __nx_nv_transfermem_size = 0x8000; +size_t nx_inner_heap_size = INNER_HEAP_SIZE; +char nx_inner_heap[INNER_HEAP_SIZE]; +NvServiceType __nx_nv_service_type = NvServiceType_Factory; - // Ty to MasaGratoR for this! - // This is done to save some space as they have no practical use in our case - void* __real___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)); - void* __real__Unwind_Resume(); - void* __real___gxx_personality_v0(); +// Ty to MasaGratoR for this! +// This is done to save some space as they have no practical use in our case +void *__real___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)); +void *__real__Unwind_Resume(); +void *__real___gxx_personality_v0(); - void __wrap___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)) { - abort(); - } - - void __wrap__Unwind_Resume() { - return; - } - - void __wrap___gxx_personality_v0() { - return; - } - - void __libnx_initheap(void) - { - void* addr = nx_inner_heap; - size_t size = nx_inner_heap_size; - - /* Newlib Heap Management */ - extern char* fake_heap_start; - extern char* fake_heap_end; - - fake_heap_start = (char*)addr; - fake_heap_end = (char*)addr + size; - - virtmemSetup(); - } - - void __appInit(void) - { - if (R_FAILED(smInitialize())) - { - fatalThrow(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); - } - - Result rc = setsysInitialize(); - if (R_SUCCEEDED(rc)) - { - SetSysFirmwareVersion fw; - rc = setsysGetFirmwareVersion(&fw); - if (R_SUCCEEDED(rc)) - hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); - setsysExit(); - } - - // rc = fanInitialize(); - // if (R_FAILED(rc)) - // diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); - - rc = i2cInitialize(); - if (R_FAILED(rc)) - diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); - - } - - void __appExit(void) - { - // CloseFanControllerThread(); - // fanExit(); - i2cExit(); - setsysExit(); - fsdevUnmountAll(); - fsExit(); - smExit(); - } +void __wrap___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)) { + abort(); } -int main(int argc, char** argv) -{ - Result rc = fileUtils::Initialize(); +void __wrap__Unwind_Resume() { + return; +} + +void __wrap___gxx_personality_v0() { + return; +} + +void __libnx_initheap(void) { + void *addr = nx_inner_heap; + size_t size = nx_inner_heap_size; + + /* Newlib Heap Management */ + extern char *fake_heap_start; + extern char *fake_heap_end; + + fake_heap_start = (char *)addr; + fake_heap_end = (char *)addr + size; + + virtmemSetup(); +} + +void __appInit(void) { + if (R_FAILED(smInitialize())) { + fatalThrow(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); + } + + Result rc = setsysInitialize(); + if (R_SUCCEEDED(rc)) { + SetSysFirmwareVersion fw; + rc = setsysGetFirmwareVersion(&fw); + if (R_SUCCEEDED(rc)) + hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); + setsysExit(); + } + + // rc = fanInitialize(); + // if (R_FAILED(rc)) + // diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); + + rc = i2cInitialize(); if (R_FAILED(rc)) - { + diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); +} + +void __appExit(void) { + // CloseFanControllerThread(); + // fanExit(); + i2cExit(); + setsysExit(); + fsdevUnmountAll(); + fsExit(); + smExit(); +} +} + +int main(int argc, char **argv) { + Result rc = fileUtils::Initialize(); + if (R_FAILED(rc)) { fatalThrow(rc); return 1; } config::Initialize(); - config::Refresh(); // Get config from file + config::Refresh(); // Get config from file board::Initialize(); processManagement::Initialize(); @@ -145,7 +136,6 @@ int main(int argc, char** argv) clockManager::Initialize(); ipcService::Initialize(); - clockManager::SetRunning(true); config::SetEnabled(true); ipcService::SetRunning(true); @@ -154,8 +144,7 @@ int main(int argc, char** argv) // InitFanController(table); // StartFanControllerThread(); - while (clockManager::Running()) - { + while (clockManager::Running()) { clockManager::Tick(); clockManager::WaitForNextTick(); } diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp index 24081b43..26ae4c33 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.cpp @@ -16,10 +16,12 @@ */ #include + #include "../file/file_utils.hpp" -Result QueryMemoryMapping(u64* virtaddr, u64 physaddr, u64 size) { - if(hosversionAtLeast(10,0,0)) { + +Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size) { + if (hosversionAtLeast(10, 0, 0)) { u64 out_size; return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); } else { diff --git a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp index b2913979..e00c10ca 100644 --- a/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp +++ b/Source/hoc-clk/sysmodule/src/mapping/mem_map.hpp @@ -18,5 +18,5 @@ #pragma once #include -Result QueryMemoryMapping(u64* virtaddr, u64 physaddr, u64 size); +Result QueryMemoryMapping(u64 *virtaddr, u64 physaddr, u64 size); Result MapAddress(u64 &va, const u64 &physAddr, const char *name); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 66f46b36..096936ca 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -24,32 +24,31 @@ * -------------------------------------------------------------------------- */ -#include "clock_manager.hpp" -#include -#include "../file/file_utils.hpp" -#include "../board/board.hpp" -#include "../hos/process_management.hpp" -#include "../file/errors.hpp" -#include "../ipc/ipc_service.hpp" -#include "../file/kip.hpp" -#include -#include "../i2c/i2cDrv.h" -#include "../display/display_refresh_rate.hpp" -#include #include -#include "../file/config.hpp" -#include "../hos/integrations.hpp" -#include "../util/lockable_mutex.h" -#include "../file/kip.hpp" -#include "governor.hpp" -#include "../display/aula.hpp" -#include "../soc/gm20b.hpp" +#include +#include +#include -#define HOSPPC_HAS_BOOST (hosversionAtLeast(7,0,0)) +#include "../board/board.hpp" +#include "../display/aula.hpp" +#include "../display/display_refresh_rate.hpp" +#include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" +#include "../file/kip.hpp" +#include "../hos/integrations.hpp" +#include "../hos/process_management.hpp" +#include "../i2c/i2cDrv.h" +#include "../ipc/ipc_service.hpp" +#include "../soc/gm20b.hpp" +#include "../util/lockable_mutex.h" +#include "clock_manager.hpp" +#include "governor.hpp" + +#define HOSPPC_HAS_BOOST (hosversionAtLeast(7, 0, 0)) namespace clockManager { - bool gRunning = false; LockableMutex gContextMutex; HocClkContext gContext = {}; @@ -59,59 +58,76 @@ namespace clockManager { std::uint64_t gLastPowerLogNs = 0; std::uint64_t gLastCsvWriteNs = 0; - bool IsAssignableHz(HocClkModule module, std::uint32_t hz) - { + bool IsAssignableHz(HocClkModule module, std::uint32_t hz) { switch (module) { - case HocClkModule_CPU: - return hz >= 500000000; - case HocClkModule_MEM: - return hz >= 665600000; - default: - return true; + case HocClkModule_CPU: + return hz >= 500000000; + case HocClkModule_MEM: + return hz >= 665600000; + default: + return true; } } - std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile) - { + std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile) { if (config::GetConfigValue(HocClkConfigValue_UncappedClocks)) { - return ~0; // Integer limit, uncapped clocks ON + return ~0; // Integer limit, uncapped clocks ON } else { if (module == HocClkModule_GPU) { if (profile < HocClkProfile_HandheldCharging) { switch (board::GetSocType()) { - case HocClkSocType_Erista: - return 460800000; - case HocClkSocType_Mariko: - switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { - case 0: - return 614400000; - case 1: - return 691200000; - case 2: - return 768000000; + case HocClkSocType_Erista: + return 460800000; + case HocClkSocType_Mariko: + if (board::GetConsoleType() == HocClkConsoleType_Hoag) { + switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { + case 0 ... 2: + return 614400000; + case 3 ... 4: + return 768000000; + default: + return 614400000; + } + } else { + switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { + case 0: + return 614400000; + case 1: + return 691200000; + case 2: + return 768000000; + case 3: + return 844800000; + case 4: + return 921600000; + default: + return 614400000; + } + } default: - return 614400000; - } - default: - return 460800000; + return 460800000; } } else if (profile <= HocClkProfile_HandheldChargingUSB) { switch (board::GetSocType()) { - case HocClkSocType_Erista: - return 768000000; - case HocClkSocType_Mariko: - switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { - case 0: - return 844800000; - case 1: - return 921600000; - case 2: - return 998400000; + case HocClkSocType_Erista: + return 768000000; + case HocClkSocType_Mariko: + switch (config::GetConfigValue(KipConfigValue_marikoGpuUV)) { + case 0: + return 844800000; + case 1: + return 921600000; + case 2: + return 998400000; + case 3: + return 1075200000; + case 4: + return 1152000000; + default: + return 844800000; + } default: - return 844800000; - } - default: - return 768000000; + return 768000000; } } } else if (module == HocClkModule_CPU) { @@ -125,8 +141,7 @@ namespace clockManager { return 0; } - std::uint32_t GetNearestHz(HocClkModule module, std::uint32_t inHz, std::uint32_t maxHz) - { + std::uint32_t GetNearestHz(HocClkModule module, std::uint32_t inHz, std::uint32_t maxHz) { std::uint32_t *freqs = &gFreqTable[module].list[0]; size_t count = gFreqTable[module].count - 1; @@ -144,21 +159,20 @@ namespace clockManager { return freqs[i]; } - void ResetToStockClocks() - { + void ResetToStockClocks() { board::ResetToStockCpu(); if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { if (board::GetSocType() == HocClkSocType_Erista) board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); } board::ResetToStockGpu(); } - bool ConfigIntervalTimeout(HocClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t *lastLogNs) - { + bool ConfigIntervalTimeout(HocClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t *lastLogNs) { std::uint64_t logInterval = config::GetConfigValue(intervalMsConfigValue) * 1000000ULL; bool shouldLog = logInterval && ((ns - *lastLogNs) > logInterval); @@ -169,9 +183,8 @@ namespace clockManager { return shouldLog; } - void RefreshFreqTableRow(HocClkModule module) - { - std::scoped_lock lock{gContextMutex}; + void RefreshFreqTableRow(HocClkModule module) { + std::scoped_lock lock{ gContextMutex }; std::uint32_t freqs[HOCCLK_FREQ_LIST_MAX]; std::uint32_t count; @@ -182,31 +195,32 @@ namespace clockManager { std::uint32_t *hz = &gFreqTable[module].list[0]; gFreqTable[module].count = 0; - if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko) { + if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko && + config::GetConfigValue(HocClkConfigValue_MarikoMiddleFreqs)) { constexpr u32 kStep = 38400000; constexpr u32 kPcvStep = 76800000; - - u32 kMax = 0; + u32 kMax = ~0; for (u32 i = 0; i < count; i++) { for (u32 j = 0; j < count; j++) { - if (freqs[j] == freqs[i] + kStep) { - kMax = freqs[j]; + if (freqs[j] + kStep == freqs[i]) { + if (freqs[j] < kMax) + kMax = freqs[j]; break; } } } - - if (kMax == 0) { + if (kMax == ~0u) { + kMax = 0; for (u32 i = 0; i < count; i++) { if (freqs[i] > kMax) kMax = freqs[i]; } } + board::SetMarikoGm20bCutoff(kMax); + for (u32 f = kPcvStep; f <= kMax && gFreqTable[module].count < HOCCLK_FREQ_LIST_MAX; f += kStep) { if (f % kPcvStep != 0) { - if (!config::GetConfigValue(HocClkConfigValue_MarikoMiddleFreqs)) - continue; *hz = f; gFreqTable[module].count++; hz++; @@ -232,6 +246,9 @@ namespace clockManager { return; } + if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko) + board::SetMarikoGm20bCutoff(0); + for (std::uint32_t i = 0; i < count; i++) { if (!IsAssignableHz(module, freqs[i])) { continue; @@ -239,40 +256,27 @@ namespace clockManager { // Workaround for PCV bug involving 38.4mhz step rate on erista if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Erista) { - static const struct { - u32 hz; - HocClkConfigValue kval; + static const struct { + u32 hz; + HocClkConfigValue kval; } eristaGpuVoltMap[] = { - { 76800000, KipConfigValue_g_volt_e_76800 }, - { 115200000, KipConfigValue_g_volt_e_115200 }, - { 153600000, KipConfigValue_g_volt_e_153600 }, - { 192000000, KipConfigValue_g_volt_e_192000 }, - { 230400000, KipConfigValue_g_volt_e_230400 }, - { 268800000, KipConfigValue_g_volt_e_268800 }, - { 307200000, KipConfigValue_g_volt_e_307200 }, - { 345600000, KipConfigValue_g_volt_e_345600 }, - { 384000000, KipConfigValue_g_volt_e_384000 }, - { 422400000, KipConfigValue_g_volt_e_422400 }, - { 460800000, KipConfigValue_g_volt_e_460800 }, - { 499200000, KipConfigValue_g_volt_e_499200 }, - { 537600000, KipConfigValue_g_volt_e_537600 }, - { 576000000, KipConfigValue_g_volt_e_576000 }, - { 614400000, KipConfigValue_g_volt_e_614400 }, - { 652800000, KipConfigValue_g_volt_e_652800 }, - { 691200000, KipConfigValue_g_volt_e_691200 }, - { 729600000, KipConfigValue_g_volt_e_729600 }, - { 768000000, KipConfigValue_g_volt_e_768000 }, - { 806400000, KipConfigValue_g_volt_e_806400 }, - { 844800000, KipConfigValue_g_volt_e_844800 }, - { 883200000, KipConfigValue_g_volt_e_883200 }, - { 921600000, KipConfigValue_g_volt_e_921600 }, - { 960000000, KipConfigValue_g_volt_e_960000 }, - { 998400000, KipConfigValue_g_volt_e_998400 }, - {1036800000, KipConfigValue_g_volt_e_1036800 }, - {1075200000, KipConfigValue_g_volt_e_1075200 }, + { 76800000, KipConfigValue_g_volt_e_76800 }, { 115200000, KipConfigValue_g_volt_e_115200 }, + { 153600000, KipConfigValue_g_volt_e_153600 }, { 192000000, KipConfigValue_g_volt_e_192000 }, + { 230400000, KipConfigValue_g_volt_e_230400 }, { 268800000, KipConfigValue_g_volt_e_268800 }, + { 307200000, KipConfigValue_g_volt_e_307200 }, { 345600000, KipConfigValue_g_volt_e_345600 }, + { 384000000, KipConfigValue_g_volt_e_384000 }, { 422400000, KipConfigValue_g_volt_e_422400 }, + { 460800000, KipConfigValue_g_volt_e_460800 }, { 499200000, KipConfigValue_g_volt_e_499200 }, + { 537600000, KipConfigValue_g_volt_e_537600 }, { 576000000, KipConfigValue_g_volt_e_576000 }, + { 614400000, KipConfigValue_g_volt_e_614400 }, { 652800000, KipConfigValue_g_volt_e_652800 }, + { 691200000, KipConfigValue_g_volt_e_691200 }, { 729600000, KipConfigValue_g_volt_e_729600 }, + { 768000000, KipConfigValue_g_volt_e_768000 }, { 806400000, KipConfigValue_g_volt_e_806400 }, + { 844800000, KipConfigValue_g_volt_e_844800 }, { 883200000, KipConfigValue_g_volt_e_883200 }, + { 921600000, KipConfigValue_g_volt_e_921600 }, { 960000000, KipConfigValue_g_volt_e_960000 }, + { 998400000, KipConfigValue_g_volt_e_998400 }, { 1036800000, KipConfigValue_g_volt_e_1036800 }, + { 1075200000, KipConfigValue_g_volt_e_1075200 }, }; bool skip = false; - for (auto& entry : eristaGpuVoltMap) { + for (auto &entry : eristaGpuVoltMap) { if (entry.hz == freqs[i]) { if (config::GetConfigValue(entry.kval) == 2000) { skip = true; @@ -280,7 +284,8 @@ namespace clockManager { break; } } - if (skip) continue; + if (skip) + continue; } *hz = freqs[i]; @@ -293,44 +298,52 @@ namespace clockManager { fileUtils::LogLine("[mgr] count = %u", gFreqTable[module].count); } - bool HandleSafetyFeatures() - { - if (config::GetConfigValue(HocClkConfigValue_HandheldTDP) && (gContext.profile != HocClkProfile_Docked)) { - if (board::GetConsoleType() == HocClkConsoleType_Hoag) { - if (board::GetPowerMw(HocClkPowerSensor_Avg) < -(int)config::GetConfigValue(HocClkConfigValue_LiteTDPLimit)) { - ResetToStockClocks(); - return true; - } - } else { - if (board::GetPowerMw(HocClkPowerSensor_Avg) < -(int)config::GetConfigValue(HocClkConfigValue_HandheldTDPLimit)) { - ResetToStockClocks(); - return true; - } - } - } - - if (((tmp451TempSoc() / 1000) > (int)config::GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && config::GetConfigValue(HocClkConfigValue_ThermalThrottle)) { + bool HandleSafetyFeatures(bool isBoost) { + if (((tmp451TempSoc() / 1000) > (int)config::GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && + config::GetConfigValue(HocClkConfigValue_ThermalThrottle)) { ResetToStockClocks(); return true; } + + if (config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock) && !isBoost && !governor::isCpuGovernorEnabled && + (board::GetSocType() == HocClkSocType_Mariko)) { + u32 ramHz = gContext.freqs[HocClkModule_MEM]; + u32 threshold = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; + if (ramHz >= threshold) { + u32 cpuOverrideHz = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; + if (cpuOverrideHz <= gContext.freqs[HocClkModule_CPU]) + return false; + u32 maxHz = GetMaxAllowedHz(HocClkModule_CPU, gContext.profile); + u32 nearestHz = GetNearestHz(HocClkModule_CPU, cpuOverrideHz, maxHz); + board::SetHz(HocClkModule_CPU, nearestHz); + gContext.freqs[HocClkModule_CPU] = nearestHz; + if (HocClkModule_CPU < HocClkModuleStable_EnumMax) + gContext.stable.freqs[HocClkModule_CPU] = nearestHz; + return true; + } + } return false; } - void HandleMiscFeatures() - { + void HandleMiscFeatures() { + // these dont need to run that often, so dont bother static u32 tick = 0; - if(++tick > 10) { + if (++tick > 10) { tick = 0; if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); } + if (config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)) { + I2c_Bq24193_SetInputCurrentLimit(config::GetConfigValue(HocClkConfigValue_InputCurrentLimit)); + } + I2c_BuckConverter_SetMvOut(&I2c_Display, config::GetConfigValue(HocClkConfigValue_DisplayVoltage)); - if(board::GetConsoleType() == HocClkConsoleType_Aula) + if (board::GetConsoleType() == HocClkConsoleType_Aula) AulaDisplay::SetDisplayColorMode((AulaColorMode)config::GetConfigValue(HocClkConfigValue_AulaDisplayColorPreset)); - if(config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { + if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv)) { board::HandleCpuUv(); } } @@ -365,11 +378,9 @@ namespace clockManager { } } - - void DVFSReset() - { - if (board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { - board::PcvHijackGpuVolts(0); // Reset to vMin + void DVFSReset() { + if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = gContext.overrideFreqs[HocClkModule_GPU]; if (!targetHz) { @@ -387,8 +398,7 @@ namespace clockManager { } } - void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) - { + void HandleFreqReset(HocClkModule module, bool isBoost, bool didHijackPcv) { switch (module) { case HocClkModule_CPU: if (!(isBoost || (config::GetConfigValue(HocClkConfigValue_OverwriteBoostMode) && isBoost))) @@ -397,7 +407,9 @@ namespace clockManager { if (board::GetSocType() == HocClkSocType_Erista) board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); else - board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); + board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), + config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), + board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf))); } break; case HocClkModule_GPU: @@ -405,7 +417,7 @@ namespace clockManager { break; case HocClkModule_MEM: board::ResetToStockMem(); - if(!didHijackPcv) { + if (!didHijackPcv) { DVFSReset(); didHijackPcv = true; } @@ -420,8 +432,7 @@ namespace clockManager { } } - void SetClocks(bool isBoost) - { + void SetClocks(bool isBoost) { std::uint32_t targetHz = 0; std::uint32_t maxHz = 0; std::uint32_t nearestHz = 0; @@ -432,16 +443,16 @@ namespace clockManager { if (skipCpuDueToBoost) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); prepareBoostExit = true; - return; // Return if we aren't overwriting boost mode + return; // Return if we aren't overwriting boost mode } if (prepareBoostExit) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); prepareBoostExit = false; } - bool returnRaw = false; // Return a value scaled to MHz instead of raw value + bool returnRaw = false; // Return a value scaled to MHz instead of raw value for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { - u32 oldHz = board::GetHz((HocClkModule)module); // Get Old hz (used primarily for DVFS Logic) + u32 oldHz = board::GetHz((HocClkModule)module); // Get Old hz (used primarily for DVFS Logic) if (module > HocClkModule_MEM) returnRaw = true; @@ -492,15 +503,12 @@ namespace clockManager { nearestHz = GetNearestHz((HocClkModule)module, targetHz, maxHz); if (nearestHz != gContext.freqs[module]) { - fileUtils::LogLine( - "[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", - board::GetModuleName((HocClkModule)module, true), - nearestHz / 1000000, nearestHz / 100000 - nearestHz / 1000000 * 10, - targetHz / 1000000, targetHz / 100000 - targetHz / 1000000 * 10 - ); + fileUtils::LogLine("[mgr] %s clock set : %u.%u MHz (target = %u.%u MHz)", board::GetModuleName((HocClkModule)module, true), + nearestHz / 1000000, nearestHz / 100000 - nearestHz / 1000000 * 10, targetHz / 1000000, + targetHz / 100000 - targetHz / 1000000 * 10); // The logic MUST be done in this order otherwise you WILL get crashes - if (module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && targetHz > oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz > oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } @@ -511,11 +519,11 @@ namespace clockManager { gContext.stable.freqs[module] = nearestHz; } - if (module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && targetHz < oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz < oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } - if(module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) + if (module == HocClkModule_MEM && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) didHijackPcv = false; } } else { @@ -524,8 +532,7 @@ namespace clockManager { } } - bool RefreshContext() - { + bool RefreshContext() { bool hasChanged = false; std::uint32_t mode = 0; @@ -549,7 +556,7 @@ namespace clockManager { // restore clocks to stock values on app or profile change if (hasChanged) { board::ResetToStock(); - if (board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); board::ResetToStockGpu(); } @@ -560,7 +567,8 @@ namespace clockManager { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { hz = board::GetHz((HocClkModule)module); if (hz != 0 && hz != gContext.freqs[module]) { - fileUtils::LogLine("[mgr] %s clock change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, hz / 100000 - hz / 1000000 * 10); + fileUtils::LogLine("[mgr] %s clock change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, + hz / 100000 - hz / 1000000 * 10); gContext.freqs[module] = hz; if (module < HocClkModuleStable_EnumMax) { @@ -572,7 +580,8 @@ namespace clockManager { hz = config::GetOverrideHz((HocClkModule)module); if (hz != gContext.overrideFreqs[module]) { if (hz) { - fileUtils::LogLine("[mgr] %s override change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, hz / 100000 - hz / 1000000 * 10); + fileUtils::LogLine("[mgr] %s override change: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), hz / 1000000, + hz / 100000 - hz / 1000000 * 10); } gContext.overrideFreqs[module] = hz; @@ -591,7 +600,8 @@ namespace clockManager { for (unsigned int sensor = 0; sensor < HocClkThermalSensor_EnumMax; sensor++) { millis = board::GetTemperatureMilli((HocClkThermalSensor)sensor); if (shouldLogTemp) { - fileUtils::LogLine("[mgr] %s temp: %u.%u °C", board::GetThermalSensorName((HocClkThermalSensor)sensor, true), millis / 1000, (millis - millis / 1000 * 1000) / 100); + fileUtils::LogLine("[mgr] %s temp: %u.%u °C", board::GetThermalSensorName((HocClkThermalSensor)sensor, true), millis / 1000, + (millis - millis / 1000 * 1000) / 100); } gContext.temps[sensor] = millis; @@ -621,7 +631,8 @@ namespace clockManager { for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) { realHz = board::GetRealHz((HocClkModule)module); if (shouldLogFreq) { - fileUtils::LogLine("[mgr] %s real freq: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), realHz / 1000000, realHz / 100000 - realHz / 1000000 * 10); + fileUtils::LogLine("[mgr] %s real freq: %u.%u MHz", board::GetModuleName((HocClkModule)module, true), realHz / 1000000, + realHz / 100000 - realHz / 1000000 * 10); } gContext.realFreqs[module] = realHz; @@ -665,18 +676,17 @@ namespace clockManager { if (gContext.isSaltyNXInstalled) gContext.fps = integrations::GetSaltyNXFPS(); else - gContext.fps = 254; // N/A + gContext.fps = 254; // N/A if (gContext.isSaltyNXInstalled) gContext.resolutionHeight = integrations::GetSaltyNXResolutionHeight(); else - gContext.resolutionHeight = 0; // N/A + gContext.resolutionHeight = 0; // N/A return hasChanged; } - void Initialize() - { + void Initialize() { gContext = {}; gContext.applicationId = 0; gContext.profile = HocClkProfile_Handheld; @@ -714,8 +724,9 @@ namespace clockManager { gContext.dramID = board::GetDramID(); gContext.isDram8GB = board::IsDram8GB(); gContext.consoleType = board::GetConsoleType(); - - board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); + + board::SetGpuSchedulingMode((GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling), + (GpuSchedulingOverrideMethod)config::GetConfigValue(HocClkConfigValue_GPUSchedulingMethod)); gContext.gpuSchedulingMode = (GpuSchedulingMode)config::GetConfigValue(HocClkConfigValue_GPUScheduling); gContext.isSysDockInstalled = integrations::GetSysDockState(); @@ -728,58 +739,52 @@ namespace clockManager { governor::startThreads(); } - void Exit() - { + void Exit() { governor::exitThreads(); } - HocClkContext GetCurrentContext() - { - std::scoped_lock lock{gContextMutex}; + HocClkContext GetCurrentContext() { + std::scoped_lock lock{ gContextMutex }; return gContext; } - void SetRunning(bool running) - { + void SetRunning(bool running) { gRunning = running; } - bool Running() - { + bool Running() { return gRunning; } - void GetFreqList(HocClkModule module, std::uint32_t *list, std::uint32_t maxCount, std::uint32_t *outCount) - { + void GetFreqList(HocClkModule module, std::uint32_t *list, std::uint32_t maxCount, std::uint32_t *outCount) { ASSERT_ENUM_VALID(HocClkModule, module); *outCount = std::min(maxCount, gFreqTable[module].count); memcpy(list, &gFreqTable[module].list[0], *outCount * sizeof(gFreqTable[0].list[0])); } - void Tick() - { - std::scoped_lock lock{gContextMutex}; + void Tick() { + std::scoped_lock lock{ gContextMutex }; std::uint32_t mode = 0; Result rc = apmExtGetCurrentPerformanceConfiguration(&mode); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); bool isBoost = apmExtIsBoostMode(mode); - bool shouldSkipClockSet = HandleSafetyFeatures(); + bool shouldSkipClockSet = HandleSafetyFeatures(isBoost); HandleMiscFeatures(); - + // GPU clock should always be the same unless PCV has overwriten our change, so reset it - if ((RefreshContext() || config::Refresh() || (board::GetRealHz(HocClkModule_GPU) != gContext.freqs[HocClkModule_GPU])) && !shouldSkipClockSet) { + if ((RefreshContext() || config::Refresh() || (board::GetRealHz(HocClkModule_GPU) != gContext.freqs[HocClkModule_GPU])) && + !shouldSkipClockSet) { SetClocks(isBoost); } } - void WaitForNextTick() - { + void WaitForNextTick() { if (board::GetHz(HocClkModule_MEM) > 665000000) svcSleepThread(config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); else - svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode + svcSleepThread(5000 * 1000000ULL); // 5 seconds in sleep mode } -} // namespace clockManager +} // namespace clockManager diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp index 34d238d0..8235fbbc 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.hpp @@ -28,6 +28,7 @@ #include #include + #include "../util/lockable_mutex.h" namespace clockManager { @@ -37,7 +38,6 @@ namespace clockManager { std::uint32_t list[HOCCLK_FREQ_LIST_MAX]; }; - extern bool hasChanged; // instance variables @@ -50,7 +50,6 @@ namespace clockManager { extern std::uint64_t gLastPowerLogNs; extern std::uint64_t gLastCsvWriteNs; - void Initialize(); void Exit(); @@ -62,8 +61,8 @@ namespace clockManager { std::uint32_t GetMaxAllowedHz(HocClkModule module, HocClkProfile profile); bool IsAssignableHz(HocClkModule module, std::uint32_t hz); - void GetFreqList(HocClkModule module, std::uint32_t* list, std::uint32_t maxCount, std::uint32_t* outCount); + void GetFreqList(HocClkModule module, std::uint32_t *list, std::uint32_t maxCount, std::uint32_t *outCount); void Tick(); void WaitForNextTick(); -} +} // namespace clockManager diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp index bc554d75..3bd87f44 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.cpp @@ -15,14 +15,15 @@ * */ -#include "governor.hpp" #include "../hos/process_management.hpp" +#include "governor.hpp" #include + namespace governor { - #define POLL_NS 5'000'000 // 5 ms – governor poll rate - #define DOWN_HOLD_TICKS 10 // 50 ms – how long to in POLL_NS to hold while ramping down - #define STEP_UTIL 900 // multiplier for step calculations +#define POLL_NS 5'000'000 // 5 ms – governor poll rate +#define DOWN_HOLD_TICKS 10 // 50 ms – how long to in POLL_NS to hold while ramping down +#define STEP_UTIL 900 // multiplier for step calculations bool isGpuGovernorEnabled = false; bool isCpuGovernorEnabled = false; @@ -44,8 +45,10 @@ namespace governor { } auto resolve = [](u8 app, u8 temp) -> u8 { - if (temp == ComponentGovernor_Disabled) return ComponentGovernor_Disabled; - if (temp != ComponentGovernor_DoNotOverride) return temp; + if (temp == ComponentGovernor_Disabled) + return ComponentGovernor_Disabled; + if (temp != ComponentGovernor_DoNotOverride) + return temp; return app; }; @@ -68,8 +71,10 @@ namespace governor { if (newVrrGovernorState == false && lastVrrGovernorState == true) board::ResetToStockDisplay(); - if (newCpuGovernorState != lastCpuGovernorState || newGpuGovernorState != lastGpuGovernorState || newVrrGovernorState != lastVrrGovernorState) { - fileUtils::LogLine("[mgr] Governor state changed: CPU %s, GPU %s, VRR %s", newCpuGovernorState ? "enabled" : "disabled", newGpuGovernorState ? "enabled" : "disabled", newVrrGovernorState ? "enabled" : "disabled"); + if (newCpuGovernorState != lastCpuGovernorState || newGpuGovernorState != lastGpuGovernorState || + newVrrGovernorState != lastVrrGovernorState) { + fileUtils::LogLine("[mgr] Governor state changed: CPU %s, GPU %s, VRR %s", newCpuGovernorState ? "enabled" : "disabled", + newGpuGovernorState ? "enabled" : "disabled", newVrrGovernorState ? "enabled" : "disabled"); lastCpuGovernorState = newCpuGovernorState; lastGpuGovernorState = newGpuGovernorState; lastVrrGovernorState = newVrrGovernorState; @@ -81,7 +86,7 @@ namespace governor { return (u32)(std::min(hz, static_cast(tableMaxHz))); } - u32 TableIndexForHz(const clockManager::FreqTable& table, u32 targetHz) { + u32 TableIndexForHz(const clockManager::FreqTable &table, u32 targetHz) { for (u32 i = 0; i < table.count; i++) if (table.list[i] >= targetHz) return i; @@ -91,17 +96,13 @@ namespace governor { u32 ResolveTargetHz(HocClkModule module) { u32 hz = clockManager::gContext.overrideFreqs[module]; if (!hz) - hz = config::GetAutoClockHz( - clockManager::gContext.applicationId, module, - clockManager::gContext.profile, false); + hz = config::GetAutoClockHz(clockManager::gContext.applicationId, module, clockManager::gContext.profile, false); if (!hz) - hz = config::GetAutoClockHz( - HOCCLK_GLOBAL_PROFILE_TID, module, - clockManager::gContext.profile, false); + hz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, clockManager::gContext.profile, false); return hz; } - void GovernorThread(void* arg) { + void GovernorThread(void *arg) { (void)arg; u32 cpuDownHoldRemaining = 0; @@ -135,8 +136,8 @@ namespace governor { } else { isCpuGovernorInBoostMode = false; - auto& table = clockManager::gFreqTable[HocClkModule_CPU]; - std::scoped_lock lock{clockManager::gContextMutex}; + auto &table = clockManager::gFreqTable[HocClkModule_CPU]; + std::scoped_lock lock{ clockManager::gContextMutex }; u32 cpuLoad = board::GetPartLoad(HocClkPartLoad_CPUMax); u32 tableMaxHz = table.list[table.count - 1]; @@ -146,7 +147,7 @@ namespace governor { if (targetHz && desiredHz > targetHz) desiredHz = targetHz; - if (maxHz && desiredHz > maxHz) + if (maxHz && desiredHz > maxHz) desiredHz = maxHz; u32 newHz = table.list[TableIndexForHz(table, desiredHz)]; @@ -162,6 +163,15 @@ namespace governor { if (++cpuTick > 50) { minHz = config::GetConfigValue(HocClkConfigValue_CpuGovernorMinimumFreq); + if (config::GetConfigValue(HocClkConfigValue_AutoRAMCPUOverclock)) { + u32 ramHz = clockManager::gContext.freqs[HocClkModule_MEM]; + u32 threshold = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuRamOCThreshold) * 1000; + if (ramHz >= threshold) { + u32 overrideHz = (u32)config::GetConfigValue(HocClkConfigValue_AutoRamCpuCpuOCFreq) * 1000; + if (overrideHz > minHz) + minHz = overrideHz; + } + } cpuTick = 0; } @@ -182,8 +192,8 @@ namespace governor { } if (isGpuGovernorEnabled) { - auto& table = clockManager::gFreqTable[HocClkModule_GPU]; - std::scoped_lock lock{clockManager::gContextMutex}; + auto &table = clockManager::gFreqTable[HocClkModule_GPU]; + std::scoped_lock lock{ clockManager::gContextMutex }; u32 gpuLoad = board::GetPartLoad(HocClkPartLoad_GPU); u32 tableMaxHz = table.list[table.count - 1]; @@ -193,7 +203,7 @@ namespace governor { if (targetHz && desiredHz > targetHz) desiredHz = targetHz; - if (maxHz && desiredHz > maxHz) + if (maxHz && desiredHz > maxHz) desiredHz = maxHz; u32 newHz = table.list[TableIndexForHz(table, desiredHz)]; @@ -235,13 +245,15 @@ namespace governor { u8 fps = integrations::GetSaltyNXFPS(); if (fps != 254) { - std::scoped_lock lock{clockManager::gContextMutex}; + std::scoped_lock lock{ clockManager::gContextMutex }; u32 targetHz = clockManager::gContext.overrideFreqs[HocClkModule_Display]; if (!targetHz) { - targetHz = config::GetAutoClockHz(clockManager::gContext.applicationId, HocClkModule_Display, clockManager::gContext.profile, false); + targetHz = config::GetAutoClockHz(clockManager::gContext.applicationId, HocClkModule_Display, + clockManager::gContext.profile, false); if (!targetHz) - targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, clockManager::gContext.profile, false); + targetHz = + config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_Display, clockManager::gContext.profile, false); } u8 maxDisplay = targetHz ? (u8)targetHz : 60; @@ -283,19 +295,11 @@ namespace governor { } void startThreads() { - threadCreate( - &governorTHREAD, - GovernorThread, - nullptr, - NULL, - 0x2000, - 0x3F, - -2 - ); + threadCreate(&governorTHREAD, GovernorThread, nullptr, NULL, 0x2000, 0x3F, -2); threadStart(&governorTHREAD); } void exitThreads() { threadClose(&governorTHREAD); } -} +} // namespace governor diff --git a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp index cb560731..0622eee1 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/governor.hpp +++ b/Source/hoc-clk/sysmodule/src/mgr/governor.hpp @@ -15,17 +15,18 @@ * */ -#include -#include -#include "../board/board.hpp" -#include "clock_manager.hpp" #include -#include "../file/file_utils.hpp" +#include +#include + #include "../board/board.hpp" -#include "../file/errors.hpp" #include "../file/config.hpp" +#include "../file/errors.hpp" +#include "../file/file_utils.hpp" #include "../hos/integrations.hpp" #include "../util/lockable_mutex.h" +#include "clock_manager.hpp" + namespace governor { extern bool isCpuGovernorInBoostMode; @@ -38,4 +39,4 @@ namespace governor { void startThreads(); void exitThreads(); void HandleGovernor(uint32_t targetHz); -} \ No newline at end of file +} // namespace governor \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/pwr/battery.cpp b/Source/hoc-clk/sysmodule/src/pwr/battery.cpp index 9a405575..621c4217 100644 --- a/Source/hoc-clk/sysmodule/src/pwr/battery.cpp +++ b/Source/hoc-clk/sysmodule/src/pwr/battery.cpp @@ -15,39 +15,26 @@ * */ -#include #include +#include + #include "battery.h" // Internal PSM service handle -static Service g_psmService = {0}; +static Service g_psmService = { 0 }; static bool g_batteryInfoInitialized = false; -static const char* s_chargerTypeStrings[] = { - "None", - "Power Delivery", - "USB-C @ 1.5A", - "USB-C @ 3.0A", - "USB-DCP", - "USB-CDP", - "USB-SDP", - "Apple @ 0.5A", - "Apple @ 1.0A", - "Apple @ 2.0A", +static const char *s_chargerTypeStrings[] = { + "None", "Power Delivery", "USB-C @ 1.5A", "USB-C @ 3.0A", "USB-DCP", "USB-CDP", "USB-SDP", "Apple @ 0.5A", "Apple @ 1.0A", "Apple @ 2.0A", }; -static const char* s_powerRoleStrings[] = { +static const char *s_powerRoleStrings[] = { "Unknown", "Sink", "Source", }; -static const char* s_pdStateStrings[] = { - "Unknown", - "New PDO Received", - "No PD Source", - "RDO Accepted" -}; +static const char *s_pdStateStrings[] = { "Unknown", "New PDO Received", "No PD Source", "RDO Accepted" }; // Internal PSM command implementations static Result psmGetBatteryChargeInfoFields(BatteryChargeInfo *out) { @@ -143,21 +130,21 @@ Result batteryInfoDisableFastCharging(void) { return psmDisableFastBatteryCharging_internal(); } -const char* batteryInfoGetChargerTypeString(BatteryChargerType type) { +const char *batteryInfoGetChargerTypeString(BatteryChargerType type) { if (type < 0 || type > ChargerType_Apple_2000mA) return "Unknown"; return s_chargerTypeStrings[type]; } -const char* batteryInfoGetPowerRoleString(BatteryPowerRole role) { +const char *batteryInfoGetPowerRoleString(BatteryPowerRole role) { if (role < PowerRole_Sink || role > PowerRole_Source) return s_powerRoleStrings[0]; return s_powerRoleStrings[role]; } -const char* batteryInfoGetPDStateString(BatteryPDControllerState state) { +const char *batteryInfoGetPDStateString(BatteryPDControllerState state) { if (state < PDState_NewPDO || state > PDState_AcceptedRDO) return s_pdStateStrings[0]; diff --git a/Source/hoc-clk/sysmodule/src/pwr/battery.h b/Source/hoc-clk/sysmodule/src/pwr/battery.h index 82754bc2..3eb0b452 100644 --- a/Source/hoc-clk/sysmodule/src/pwr/battery.h +++ b/Source/hoc-clk/sysmodule/src/pwr/battery.h @@ -16,57 +16,57 @@ */ #pragma once -#include #include #include +#include typedef enum { - BatteryFlag_NoHub = BIT(0), // Hub is disconnected - BatteryFlag_Rail = BIT(8), // At least one Joy-con is charging from rail - BatteryFlag_SPDSRC = BIT(12), // OTG - BatteryFlag_ACC = BIT(16) // Accessory + BatteryFlag_NoHub = BIT(0), // Hub is disconnected + BatteryFlag_Rail = BIT(8), // At least one Joy-con is charging from rail + BatteryFlag_SPDSRC = BIT(12), // OTG + BatteryFlag_ACC = BIT(16) // Accessory } BatteryChargeFlags; typedef enum { - PDState_NewPDO = 1, // Received new Power Data Object - PDState_NoPD = 2, // No Power Delivery source is detected + PDState_NewPDO = 1, // Received new Power Data Object + PDState_NoPD = 2, // No Power Delivery source is detected PDState_AcceptedRDO = 3 // Received and accepted Request Data Object } BatteryPDControllerState; // Charger type detection typedef enum { - ChargerType_None = 0, - ChargerType_PD = 1, + ChargerType_None = 0, + ChargerType_PD = 1, ChargerType_TypeC_1500mA = 2, ChargerType_TypeC_3000mA = 3, - ChargerType_DCP = 4, // Dedicated Charging Port - ChargerType_CDP = 5, // Charging Downstream Port - ChargerType_SDP = 6, // Standard Downstream Port - ChargerType_Apple_500mA = 7, + ChargerType_DCP = 4, // Dedicated Charging Port + ChargerType_CDP = 5, // Charging Downstream Port + ChargerType_SDP = 6, // Standard Downstream Port + ChargerType_Apple_500mA = 7, ChargerType_Apple_1000mA = 8, ChargerType_Apple_2000mA = 9 } BatteryChargerType; typedef enum { - PowerRole_Sink = 1, // Device is receiving power + PowerRole_Sink = 1, // Device is receiving power PowerRole_Source = 2 // Device is providing power } BatteryPowerRole; typedef struct { - int32_t InputCurrentLimit; // Input (Sink) current limit in mA - int32_t VBUSCurrentLimit; // Output (Source/VBUS/OTG) current limit in mA - int32_t ChargeCurrentLimit; // Battery charging current limit in mA - int32_t ChargeVoltageLimit; // Battery charging voltage limit in mV - int32_t unk_x10; // Unknown field (possibly enum) - int32_t unk_x14; // Unknown field (possibly flags) - BatteryPDControllerState PDControllerState; // PD Controller State - int32_t BatteryTemperature; // Battery temperature in milli-Celsius - int32_t RawBatteryCharge; // Battery charge in percentmille - int32_t VoltageAvg; // Average voltage in mV - int32_t BatteryAge; // Battery health (capacity full/design) in pcm - BatteryPowerRole PowerRole; // Current power role - BatteryChargerType ChargerType; // Type of charger connected - int32_t ChargerVoltageLimit; // Charger voltage limit in mV - int32_t ChargerCurrentLimit; // Charger current limit in mA - BatteryChargeFlags Flags; // Various status flags + int32_t InputCurrentLimit; // Input (Sink) current limit in mA + int32_t VBUSCurrentLimit; // Output (Source/VBUS/OTG) current limit in mA + int32_t ChargeCurrentLimit; // Battery charging current limit in mA + int32_t ChargeVoltageLimit; // Battery charging voltage limit in mV + int32_t unk_x10; // Unknown field (possibly enum) + int32_t unk_x14; // Unknown field (possibly flags) + BatteryPDControllerState PDControllerState; // PD Controller State + int32_t BatteryTemperature; // Battery temperature in milli-Celsius + int32_t RawBatteryCharge; // Battery charge in percentmille + int32_t VoltageAvg; // Average voltage in mV + int32_t BatteryAge; // Battery health (capacity full/design) in pcm + BatteryPowerRole PowerRole; // Current power role + BatteryChargerType ChargerType; // Type of charger connected + int32_t ChargerVoltageLimit; // Charger voltage limit in mV + int32_t ChargerCurrentLimit; // Charger current limit in mA + BatteryChargeFlags Flags; // Various status flags } BatteryChargeInfo; #define IS_BATTERY_CHARGING_ENABLED(info) (((info)->unk_x14 >> 8) & 1) @@ -96,6 +96,6 @@ Result batteryInfoEnableCharging(void); Result batteryInfoDisableCharging(void); Result batteryInfoEnableFastCharging(void); Result batteryInfoDisableFastCharging(void); -const char* batteryInfoGetChargerTypeString(BatteryChargerType type); -const char* batteryInfoGetPowerRoleString(BatteryPowerRole role); -const char* batteryInfoGetPDStateString(BatteryPDControllerState state); +const char *batteryInfoGetChargerTypeString(BatteryChargerType type); +const char *batteryInfoGetPowerRoleString(BatteryPowerRole role); +const char *batteryInfoGetPDStateString(BatteryPDControllerState state); diff --git a/Source/hoc-clk/sysmodule/src/soc/fuse.h b/Source/hoc-clk/sysmodule/src/soc/fuse.h index 107cebd2..68dbfecc 100644 --- a/Source/hoc-clk/sysmodule/src/soc/fuse.h +++ b/Source/hoc-clk/sysmodule/src/soc/fuse.h @@ -4,7 +4,7 @@ * Copyright (c) 2018 balika011 * Copyright (c) 2019-2025 CTCaer * Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors - * + * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. @@ -22,293 +22,283 @@ #define _FUSE_H_ #ifndef BIT -#define BIT(n) (1U<<(n)) +#define BIT(n) (1U << (n)) #endif /*! Fuse registers. */ -#define FUSE_CTRL 0x0 -#define FUSE_ADDR 0x4 -#define FUSE_RDATA 0x8 -#define FUSE_WDATA 0xC -#define FUSE_TIME_RD1 0x10 -#define FUSE_TIME_RD2 0x14 -#define FUSE_TIME_PGM1 0x18 -#define FUSE_TIME_PGM2 0x1C -#define FUSE_PRIV2INTFC 0x20 -#define FUSE_PRIV2INTFC_START_DATA BIT(0) -#define FUSE_PRIV2INTFC_SKIP_RECORDS BIT(1) -#define FUSE_FUSEBYPASS 0x24 -#define FUSE_PRIVATEKEYDISABLE 0x28 -#define FUSE_PRIVKEY_DISABLE BIT(0) -#define FUSE_PRIVKEY_TZ_STICKY_BIT BIT(4) -#define FUSE_DISABLEREGPROGRAM 0x2C -#define FUSE_WRITE_ACCESS_SW 0x30 -#define FUSE_PWR_GOOD_SW 0x34 -#define FUSE_PRIV2RESHIFT 0x3C -#define FUSE_FUSETIME_RD0 0x40 -#define FUSE_FUSETIME_RD1 0x44 -#define FUSE_FUSETIME_RD2 0x48 -#define FUSE_FUSETIME_RD3 0x4C -#define FUSE_PRIVATE_KEY0_NONZERO 0x80 -#define FUSE_PRIVATE_KEY1_NONZERO 0x84 -#define FUSE_PRIVATE_KEY2_NONZERO 0x88 -#define FUSE_PRIVATE_KEY3_NONZERO 0x8C -#define FUSE_PRIVATE_KEY4_NONZERO 0x90 +#define FUSE_CTRL 0x0 +#define FUSE_ADDR 0x4 +#define FUSE_RDATA 0x8 +#define FUSE_WDATA 0xC +#define FUSE_TIME_RD1 0x10 +#define FUSE_TIME_RD2 0x14 +#define FUSE_TIME_PGM1 0x18 +#define FUSE_TIME_PGM2 0x1C +#define FUSE_PRIV2INTFC 0x20 +#define FUSE_PRIV2INTFC_START_DATA BIT(0) +#define FUSE_PRIV2INTFC_SKIP_RECORDS BIT(1) +#define FUSE_FUSEBYPASS 0x24 +#define FUSE_PRIVATEKEYDISABLE 0x28 +#define FUSE_PRIVKEY_DISABLE BIT(0) +#define FUSE_PRIVKEY_TZ_STICKY_BIT BIT(4) +#define FUSE_DISABLEREGPROGRAM 0x2C +#define FUSE_WRITE_ACCESS_SW 0x30 +#define FUSE_PWR_GOOD_SW 0x34 +#define FUSE_PRIV2RESHIFT 0x3C +#define FUSE_FUSETIME_RD0 0x40 +#define FUSE_FUSETIME_RD1 0x44 +#define FUSE_FUSETIME_RD2 0x48 +#define FUSE_FUSETIME_RD3 0x4C +#define FUSE_PRIVATE_KEY0_NONZERO 0x80 +#define FUSE_PRIVATE_KEY1_NONZERO 0x84 +#define FUSE_PRIVATE_KEY2_NONZERO 0x88 +#define FUSE_PRIVATE_KEY3_NONZERO 0x8C +#define FUSE_PRIVATE_KEY4_NONZERO 0x90 /*! Fuse Cached registers */ -#define FUSE_RESERVED_ODM8_B01 0x98 // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM9_B01 0x9C // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM10_B01 0xA0 // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM11_B01 0xA4 // FUSE_READ_TZ Group 0. -#define FUSE_RESERVED_ODM12_B01 0xA8 // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM13_B01 0xAC // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM14_B01 0xB0 // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM15_B01 0xB4 // FUSE_READ_TZ Group 1? Is value -1? -#define FUSE_RESERVED_ODM16_B01 0xB8 // FUSE_READ_TZ Group 2? Is value -1? -#define FUSE_RESERVED_ODM17_B01 0xBC // FUSE_READ_TZ Group 2? Is value -1? -#define FUSE_RESERVED_ODM18_B01 0xC0 // FUSE_READ_TZ Group 2. -#define FUSE_RESERVED_ODM19_B01 0xC4 // FUSE_READ_TZ Group 2. -#define FUSE_RESERVED_ODM20_B01 0xC8 // FUSE_READ_TZ Group 3. -#define FUSE_RESERVED_ODM21_B01 0xCC // FUSE_READ_TZ Group 3. -#define FUSE_KEK00_B01 0xD0 -#define FUSE_KEK01_B01 0xD4 -#define FUSE_KEK02_B01 0xD8 -#define FUSE_KEK03_B01 0xDC -#define FUSE_BEK00_B01 0xE0 -#define FUSE_BEK01_B01 0xE4 -#define FUSE_BEK02_B01 0xE8 -#define FUSE_BEK03_B01 0xEC -#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4SVT_B01 0xF0 -#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4SVT_B01 0xF4 +#define FUSE_RESERVED_ODM8_B01 0x98 // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM9_B01 0x9C // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM10_B01 0xA0 // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM11_B01 0xA4 // FUSE_READ_TZ Group 0. +#define FUSE_RESERVED_ODM12_B01 0xA8 // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM13_B01 0xAC // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM14_B01 0xB0 // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM15_B01 0xB4 // FUSE_READ_TZ Group 1? Is value -1? +#define FUSE_RESERVED_ODM16_B01 0xB8 // FUSE_READ_TZ Group 2? Is value -1? +#define FUSE_RESERVED_ODM17_B01 0xBC // FUSE_READ_TZ Group 2? Is value -1? +#define FUSE_RESERVED_ODM18_B01 0xC0 // FUSE_READ_TZ Group 2. +#define FUSE_RESERVED_ODM19_B01 0xC4 // FUSE_READ_TZ Group 2. +#define FUSE_RESERVED_ODM20_B01 0xC8 // FUSE_READ_TZ Group 3. +#define FUSE_RESERVED_ODM21_B01 0xCC // FUSE_READ_TZ Group 3. +#define FUSE_KEK00_B01 0xD0 +#define FUSE_KEK01_B01 0xD4 +#define FUSE_KEK02_B01 0xD8 +#define FUSE_KEK03_B01 0xDC +#define FUSE_BEK00_B01 0xE0 +#define FUSE_BEK01_B01 0xE4 +#define FUSE_BEK02_B01 0xE8 +#define FUSE_BEK03_B01 0xEC +#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4SVT_B01 0xF0 +#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4SVT_B01 0xF4 #define FUSE_OPT_RAM_RTSEL_TSMCPDP_PO4SVT_B01 0xF8 #define FUSE_OPT_RAM_MTSEL_TSMCPDP_PO4SVT_B01 0xFC -#define FUSE_PRODUCTION_MODE 0x100 -#define FUSE_JTAG_SECUREID_VALID 0x104 -#define FUSE_ODM_LOCK 0x108 -#define FUSE_OPT_OPENGL_EN 0x10C -#define FUSE_SKU_INFO 0x110 -#define FUSE_CPU_SPEEDO_0_CALIB 0x114 -#define FUSE_CPU_IDDQ_CALIB 0x118 +#define FUSE_PRODUCTION_MODE 0x100 +#define FUSE_JTAG_SECUREID_VALID 0x104 +#define FUSE_ODM_LOCK 0x108 +#define FUSE_OPT_OPENGL_EN 0x10C +#define FUSE_SKU_INFO 0x110 +#define FUSE_CPU_SPEEDO_0_CALIB 0x114 +#define FUSE_CPU_IDDQ_CALIB 0x118 -#define FUSE_RESERVED_ODM22_B01 0x11C // FUSE_READ_TZ Group 3. -#define FUSE_RESERVED_ODM23_B01 0x120 // FUSE_READ_TZ Group 3. -#define FUSE_RESERVED_ODM24_B01 0x124 // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM22_B01 0x11C // FUSE_READ_TZ Group 3. +#define FUSE_RESERVED_ODM23_B01 0x120 // FUSE_READ_TZ Group 3. +#define FUSE_RESERVED_ODM24_B01 0x124 // FUSE_READ_TZ Group 4. -#define FUSE_OPT_FT_REV 0x128 -#define FUSE_CPU_SPEEDO_1_CALIB 0x12C -#define FUSE_CPU_SPEEDO_2_CALIB 0x130 -#define FUSE_SOC_SPEEDO_0_CALIB 0x134 -#define FUSE_SOC_SPEEDO_1_CALIB 0x138 -#define FUSE_SOC_SPEEDO_2_CALIB 0x13C -#define FUSE_SOC_IDDQ_CALIB 0x140 +#define FUSE_OPT_FT_REV 0x128 +#define FUSE_CPU_SPEEDO_1_CALIB 0x12C +#define FUSE_CPU_SPEEDO_2_CALIB 0x130 +#define FUSE_SOC_SPEEDO_0_CALIB 0x134 +#define FUSE_SOC_SPEEDO_1_CALIB 0x138 +#define FUSE_SOC_SPEEDO_2_CALIB 0x13C +#define FUSE_SOC_IDDQ_CALIB 0x140 -#define FUSE_RESERVED_ODM25_B01 0x144 // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM25_B01 0x144 // FUSE_READ_TZ Group 4. -#define FUSE_FA 0x148 -#define FUSE_RESERVED_PRODUCTION 0x14C -#define FUSE_HDMI_LANE0_CALIB 0x150 -#define FUSE_HDMI_LANE1_CALIB 0x154 -#define FUSE_HDMI_LANE2_CALIB 0x158 -#define FUSE_HDMI_LANE3_CALIB 0x15C -#define FUSE_ENCRYPTION_RATE 0x160 -#define FUSE_PUBLIC_KEY0 0x164 -#define FUSE_PUBLIC_KEY1 0x168 -#define FUSE_PUBLIC_KEY2 0x16C -#define FUSE_PUBLIC_KEY3 0x170 -#define FUSE_PUBLIC_KEY4 0x174 -#define FUSE_PUBLIC_KEY5 0x178 -#define FUSE_PUBLIC_KEY6 0x17C -#define FUSE_PUBLIC_KEY7 0x180 -#define FUSE_TSENSOR1_CALIB 0x184 // CPU1. -#define FUSE_TSENSOR2_CALIB 0x188 // CPU2. +#define FUSE_FA 0x148 +#define FUSE_RESERVED_PRODUCTION 0x14C +#define FUSE_HDMI_LANE0_CALIB 0x150 +#define FUSE_HDMI_LANE1_CALIB 0x154 +#define FUSE_HDMI_LANE2_CALIB 0x158 +#define FUSE_HDMI_LANE3_CALIB 0x15C +#define FUSE_ENCRYPTION_RATE 0x160 +#define FUSE_PUBLIC_KEY0 0x164 +#define FUSE_PUBLIC_KEY1 0x168 +#define FUSE_PUBLIC_KEY2 0x16C +#define FUSE_PUBLIC_KEY3 0x170 +#define FUSE_PUBLIC_KEY4 0x174 +#define FUSE_PUBLIC_KEY5 0x178 +#define FUSE_PUBLIC_KEY6 0x17C +#define FUSE_PUBLIC_KEY7 0x180 +#define FUSE_TSENSOR1_CALIB 0x184 // CPU1. +#define FUSE_TSENSOR2_CALIB 0x188 // CPU2. -#define FUSE_OPT_SECURE_SCC_DIS_B01 0x18C +#define FUSE_OPT_SECURE_SCC_DIS_B01 0x18C -#define FUSE_OPT_CP_REV 0x190 // FUSE style revision - ATE. 0x101 0x100 -#define FUSE_OPT_PFG 0x194 -#define FUSE_TSENSOR0_CALIB 0x198 // CPU0. -#define FUSE_FIRST_BOOTROM_PATCH_SIZE 0x19C -#define FUSE_SECURITY_MODE 0x1A0 -#define FUSE_PRIVATE_KEY0 0x1A4 -#define FUSE_PRIVATE_KEY1 0x1A8 -#define FUSE_PRIVATE_KEY2 0x1AC -#define FUSE_PRIVATE_KEY3 0x1B0 -#define FUSE_PRIVATE_KEY4 0x1B4 -#define FUSE_ARM_JTAG_DIS 0x1B8 -#define FUSE_BOOT_DEVICE_INFO 0x1BC -#define FUSE_RESERVED_SW 0x1C0 -#define FUSE_OPT_VP9_DISABLE 0x1C4 +#define FUSE_OPT_CP_REV 0x190 // FUSE style revision - ATE. 0x101 0x100 +#define FUSE_OPT_PFG 0x194 +#define FUSE_TSENSOR0_CALIB 0x198 // CPU0. +#define FUSE_FIRST_BOOTROM_PATCH_SIZE 0x19C +#define FUSE_SECURITY_MODE 0x1A0 +#define FUSE_PRIVATE_KEY0 0x1A4 +#define FUSE_PRIVATE_KEY1 0x1A8 +#define FUSE_PRIVATE_KEY2 0x1AC +#define FUSE_PRIVATE_KEY3 0x1B0 +#define FUSE_PRIVATE_KEY4 0x1B4 +#define FUSE_ARM_JTAG_DIS 0x1B8 +#define FUSE_BOOT_DEVICE_INFO 0x1BC +#define FUSE_RESERVED_SW 0x1C0 +#define FUSE_OPT_VP9_DISABLE 0x1C4 -#define FUSE_RESERVED_ODM0 0x1C8 -#define FUSE_RESERVED_ODM1 0x1CC -#define FUSE_RESERVED_ODM2 0x1D0 -#define FUSE_RESERVED_ODM3 0x1D4 -#define FUSE_RESERVED_ODM4 0x1D8 -#define FUSE_RESERVED_ODM5 0x1DC -#define FUSE_RESERVED_ODM6 0x1E0 -#define FUSE_RESERVED_ODM7 0x1E4 +#define FUSE_RESERVED_ODM0 0x1C8 +#define FUSE_RESERVED_ODM1 0x1CC +#define FUSE_RESERVED_ODM2 0x1D0 +#define FUSE_RESERVED_ODM3 0x1D4 +#define FUSE_RESERVED_ODM4 0x1D8 +#define FUSE_RESERVED_ODM5 0x1DC +#define FUSE_RESERVED_ODM6 0x1E0 +#define FUSE_RESERVED_ODM7 0x1E4 -#define FUSE_OBS_DIS 0x1E8 +#define FUSE_OBS_DIS 0x1E8 #define FUSE_OPT_NVJTAG_PROTECTION_ENABLE_B01 0x1EC -#define FUSE_USB_CALIB 0x1F0 -#define FUSE_SKU_DIRECT_CONFIG 0x1F4 -#define FUSE_KFUSE_PRIVKEY_CTRL 0x1F8 -#define FUSE_PACKAGE_INFO 0x1FC // 1: MID, 2: DSC. -#define FUSE_OPT_VENDOR_CODE 0x200 -#define FUSE_OPT_FAB_CODE 0x204 -#define FUSE_OPT_LOT_CODE_0 0x208 -#define FUSE_OPT_LOT_CODE_1 0x20C -#define FUSE_OPT_WAFER_ID 0x210 -#define FUSE_OPT_X_COORDINATE 0x214 -#define FUSE_OPT_Y_COORDINATE 0x218 -#define FUSE_OPT_SEC_DEBUG_EN 0x21C -#define FUSE_OPT_OPS_RESERVED 0x220 -#define FUSE_SATA_CALIB 0x224 +#define FUSE_USB_CALIB 0x1F0 +#define FUSE_SKU_DIRECT_CONFIG 0x1F4 +#define FUSE_KFUSE_PRIVKEY_CTRL 0x1F8 +#define FUSE_PACKAGE_INFO 0x1FC // 1: MID, 2: DSC. +#define FUSE_OPT_VENDOR_CODE 0x200 +#define FUSE_OPT_FAB_CODE 0x204 +#define FUSE_OPT_LOT_CODE_0 0x208 +#define FUSE_OPT_LOT_CODE_1 0x20C +#define FUSE_OPT_WAFER_ID 0x210 +#define FUSE_OPT_X_COORDINATE 0x214 +#define FUSE_OPT_Y_COORDINATE 0x218 +#define FUSE_OPT_SEC_DEBUG_EN 0x21C +#define FUSE_OPT_OPS_RESERVED 0x220 +#define FUSE_SATA_CALIB 0x224 -#define FUSE_SPARE_REGISTER_ODM_B01 0x224 +#define FUSE_SPARE_REGISTER_ODM_B01 0x224 -#define FUSE_GPU_IDDQ_CALIB 0x228 -#define FUSE_TSENSOR3_CALIB 0x22C // CPU3. -#define FUSE_CLOCK_BONDOUT0 0x230 -#define FUSE_CLOCK_BONDOUT1 0x234 +#define FUSE_GPU_IDDQ_CALIB 0x228 +#define FUSE_TSENSOR3_CALIB 0x22C // CPU3. +#define FUSE_CLOCK_BONDOUT0 0x230 +#define FUSE_CLOCK_BONDOUT1 0x234 -#define FUSE_RESERVED_ODM26_B01 0x238 // FUSE_READ_TZ Group 4. -#define FUSE_RESERVED_ODM27_B01 0x23C // FUSE_READ_TZ Group 4. -#define FUSE_RESERVED_ODM28_B01 0x240 // MAX77812 phase configuration. FUSE_READ_TZ Group 5. +#define FUSE_RESERVED_ODM26_B01 0x238 // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM27_B01 0x23C // FUSE_READ_TZ Group 4. +#define FUSE_RESERVED_ODM28_B01 0x240 // MAX77812 phase configuration. FUSE_READ_TZ Group 5. -#define FUSE_OPT_SAMPLE_TYPE 0x244 -#define FUSE_OPT_SUBREVISION 0x248 // "", "p", "q", "r". e.g: A01p. -#define FUSE_OPT_SW_RESERVED_0 0x24C -#define FUSE_OPT_SW_RESERVED_1 0x250 -#define FUSE_TSENSOR4_CALIB 0x254 // GPU. -#define FUSE_TSENSOR5_CALIB 0x258 // MEM0. -#define FUSE_TSENSOR6_CALIB 0x25C // MEM1. -#define FUSE_TSENSOR7_CALIB 0x260 // PLLX. -#define FUSE_OPT_PRIV_SEC_DIS 0x264 -#define FUSE_PKC_DISABLE 0x268 +#define FUSE_OPT_SAMPLE_TYPE 0x244 +#define FUSE_OPT_SUBREVISION 0x248 // "", "p", "q", "r". e.g: A01p. +#define FUSE_OPT_SW_RESERVED_0 0x24C +#define FUSE_OPT_SW_RESERVED_1 0x250 +#define FUSE_TSENSOR4_CALIB 0x254 // GPU. +#define FUSE_TSENSOR5_CALIB 0x258 // MEM0. +#define FUSE_TSENSOR6_CALIB 0x25C // MEM1. +#define FUSE_TSENSOR7_CALIB 0x260 // PLLX. +#define FUSE_OPT_PRIV_SEC_DIS 0x264 +#define FUSE_PKC_DISABLE 0x268 -#define FUSE_BOOT_SECURITY_INFO_B01 0x268 -#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4HVT_B01 0x26C -#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4HVT_B01 0x270 +#define FUSE_BOOT_SECURITY_INFO_B01 0x268 +#define FUSE_OPT_RAM_RTSEL_TSMCSP_PO4HVT_B01 0x26C +#define FUSE_OPT_RAM_WTSEL_TSMCSP_PO4HVT_B01 0x270 #define FUSE_OPT_RAM_RTSEL_TSMCPDP_PO4HVT_B01 0x274 #define FUSE_OPT_RAM_MTSEL_TSMCPDP_PO4HVT_B01 0x278 -#define FUSE_FUSE2TSEC_DEBUG_DISABLE 0x27C -#define FUSE_TSENSOR_COMMON 0x280 -#define FUSE_OPT_CP_BIN 0x284 -#define FUSE_OPT_GPU_DISABLE 0x288 -#define FUSE_OPT_FT_BIN 0x28C -#define FUSE_OPT_DONE_MAP 0x290 +#define FUSE_FUSE2TSEC_DEBUG_DISABLE 0x27C +#define FUSE_TSENSOR_COMMON 0x280 +#define FUSE_OPT_CP_BIN 0x284 +#define FUSE_OPT_GPU_DISABLE 0x288 +#define FUSE_OPT_FT_BIN 0x28C +#define FUSE_OPT_DONE_MAP 0x290 -#define FUSE_RESERVED_ODM29_B01 0x294 // FUSE_READ_TZ Group 5? Is value -1? +#define FUSE_RESERVED_ODM29_B01 0x294 // FUSE_READ_TZ Group 5? Is value -1? -#define FUSE_APB2JTAG_DISABLE 0x298 -#define FUSE_ODM_INFO 0x29C // Debug features disable. -#define FUSE_ARM_CRYPT_DE_FEATURE 0x2A8 +#define FUSE_APB2JTAG_DISABLE 0x298 +#define FUSE_ODM_INFO 0x29C // Debug features disable. +#define FUSE_ARM_CRYPT_DE_FEATURE 0x2A8 #define FUSE_OPT_RAM_WTSEL_TSMCPDP_PO4SVT_B01 0x2B0 -#define FUSE_OPT_RAM_RCT_TSMCDP_PO4SVT_B01 0x2B4 -#define FUSE_OPT_RAM_WCT_TSMCDP_PO4SVT_B01 0x2B8 -#define FUSE_OPT_RAM_KP_TSMCDP_PO4SVT_B01 0x2BC +#define FUSE_OPT_RAM_RCT_TSMCDP_PO4SVT_B01 0x2B4 +#define FUSE_OPT_RAM_WCT_TSMCDP_PO4SVT_B01 0x2B8 +#define FUSE_OPT_RAM_KP_TSMCDP_PO4SVT_B01 0x2BC -#define FUSE_WOA_SKU_FLAG 0x2C0 -#define FUSE_ECO_RESERVE_1 0x2C4 -#define FUSE_GCPLEX_CONFIG_FUSE 0x2C8 -#define FUSE_GPU_VPR_AUTO_FETCH_DIS BIT(0) -#define FUSE_GPU_VPR_ENABLED BIT(1) -#define FUSE_GPU_WPR_ENABLED BIT(2) -#define FUSE_PRODUCTION_MONTH 0x2CC -#define FUSE_RAM_REPAIR_INDICATOR 0x2D0 -#define FUSE_TSENSOR9_CALIB 0x2D4 // AOTAG. -#define FUSE_VMIN_CALIBRATION 0x2DC -#define FUSE_AGING_SENSOR_CALIBRATION 0x2E0 -#define FUSE_DEBUG_AUTHENTICATION 0x2E4 -#define FUSE_SECURE_PROVISION_INDEX 0x2E8 -#define FUSE_SECURE_PROVISION_INFO 0x2EC -#define FUSE_OPT_GPU_DISABLE_CP1 0x2F0 -#define FUSE_SPARE_ENDIS 0x2F4 -#define FUSE_ECO_RESERVE_0 0x2F8 // AID. -#define FUSE_RESERVED_CALIB0 0x304 // GPCPLL ADC Calibration. -#define FUSE_RESERVED_CALIB1 0x308 -#define FUSE_OPT_GPU_TPC0_DISABLE 0x30C -#define FUSE_OPT_GPU_TPC0_DISABLE_CP1 0x310 -#define FUSE_OPT_CPU_DISABLE 0x314 -#define FUSE_OPT_CPU_DISABLE_CP1 0x318 -#define FUSE_TSENSOR10_CALIB 0x31C -#define FUSE_TSENSOR10_CALIB_AUX 0x320 -#define FUSE_OPT_RAM_SVOP_DP 0x324 -#define FUSE_OPT_RAM_SVOP_PDP 0x328 -#define FUSE_OPT_RAM_SVOP_REG 0x32C -#define FUSE_OPT_RAM_SVOP_SP 0x330 -#define FUSE_OPT_RAM_SVOP_SMPDP 0x334 +#define FUSE_WOA_SKU_FLAG 0x2C0 +#define FUSE_ECO_RESERVE_1 0x2C4 +#define FUSE_GCPLEX_CONFIG_FUSE 0x2C8 +#define FUSE_GPU_VPR_AUTO_FETCH_DIS BIT(0) +#define FUSE_GPU_VPR_ENABLED BIT(1) +#define FUSE_GPU_WPR_ENABLED BIT(2) +#define FUSE_PRODUCTION_MONTH 0x2CC +#define FUSE_RAM_REPAIR_INDICATOR 0x2D0 +#define FUSE_TSENSOR9_CALIB 0x2D4 // AOTAG. +#define FUSE_VMIN_CALIBRATION 0x2DC +#define FUSE_AGING_SENSOR_CALIBRATION 0x2E0 +#define FUSE_DEBUG_AUTHENTICATION 0x2E4 +#define FUSE_SECURE_PROVISION_INDEX 0x2E8 +#define FUSE_SECURE_PROVISION_INFO 0x2EC +#define FUSE_OPT_GPU_DISABLE_CP1 0x2F0 +#define FUSE_SPARE_ENDIS 0x2F4 +#define FUSE_ECO_RESERVE_0 0x2F8 // AID. +#define FUSE_RESERVED_CALIB0 0x304 // GPCPLL ADC Calibration. +#define FUSE_RESERVED_CALIB1 0x308 +#define FUSE_OPT_GPU_TPC0_DISABLE 0x30C +#define FUSE_OPT_GPU_TPC0_DISABLE_CP1 0x310 +#define FUSE_OPT_CPU_DISABLE 0x314 +#define FUSE_OPT_CPU_DISABLE_CP1 0x318 +#define FUSE_TSENSOR10_CALIB 0x31C +#define FUSE_TSENSOR10_CALIB_AUX 0x320 +#define FUSE_OPT_RAM_SVOP_DP 0x324 +#define FUSE_OPT_RAM_SVOP_PDP 0x328 +#define FUSE_OPT_RAM_SVOP_REG 0x32C +#define FUSE_OPT_RAM_SVOP_SP 0x330 +#define FUSE_OPT_RAM_SVOP_SMPDP 0x334 #define FUSE_OPT_RAM_WTSEL_TSMCPDP_PO4HVT_B01 0x324 -#define FUSE_OPT_RAM_RCT_TSMCDP_PO4HVT_B01 0x328 -#define FUSE_OPT_RAM_WCT_TSMCDP_PO4HVT_B01 0x32c -#define FUSE_OPT_RAM_KP_TSMCDP_PO4HVT_B01 0x330 -#define FUSE_OPT_RAM_SVOP_SP_B01 0x334 +#define FUSE_OPT_RAM_RCT_TSMCDP_PO4HVT_B01 0x328 +#define FUSE_OPT_RAM_WCT_TSMCDP_PO4HVT_B01 0x32c +#define FUSE_OPT_RAM_KP_TSMCDP_PO4HVT_B01 0x330 +#define FUSE_OPT_RAM_SVOP_SP_B01 0x334 -#define FUSE_OPT_GPU_TPC0_DISABLE_CP2 0x338 -#define FUSE_OPT_GPU_TPC1_DISABLE 0x33C -#define FUSE_OPT_GPU_TPC1_DISABLE_CP1 0x340 -#define FUSE_OPT_GPU_TPC1_DISABLE_CP2 0x344 -#define FUSE_OPT_CPU_DISABLE_CP2 0x348 -#define FUSE_OPT_GPU_DISABLE_CP2 0x34C -#define FUSE_USB_CALIB_EXT 0x350 -#define FUSE_RESERVED_FIELD 0x354 // RMA. -#define FUSE_SPARE_REALIGNMENT_REG 0x37C -#define FUSE_SPARE_BIT_0 0x380 +#define FUSE_OPT_GPU_TPC0_DISABLE_CP2 0x338 +#define FUSE_OPT_GPU_TPC1_DISABLE 0x33C +#define FUSE_OPT_GPU_TPC1_DISABLE_CP1 0x340 +#define FUSE_OPT_GPU_TPC1_DISABLE_CP2 0x344 +#define FUSE_OPT_CPU_DISABLE_CP2 0x348 +#define FUSE_OPT_GPU_DISABLE_CP2 0x34C +#define FUSE_USB_CALIB_EXT 0x350 +#define FUSE_RESERVED_FIELD 0x354 // RMA. +#define FUSE_SPARE_REALIGNMENT_REG 0x37C +#define FUSE_SPARE_BIT_0 0x380 //... -#define FUSE_SPARE_BIT_31 0x3FC +#define FUSE_SPARE_BIT_31 0x3FC /*! Fuse commands. */ -#define FUSE_IDLE 0x0 -#define FUSE_READ 0x1 -#define FUSE_WRITE 0x2 -#define FUSE_SENSE 0x3 +#define FUSE_IDLE 0x0 +#define FUSE_READ 0x1 +#define FUSE_WRITE 0x2 +#define FUSE_SENSE 0x3 #define FUSE_CMD_MASK 0x3 /*! Fuse status. */ -#define FUSE_STATUS_RESET 0 -#define FUSE_STATUS_POST_RESET 1 -#define FUSE_STATUS_LOAD_ROW0 2 -#define FUSE_STATUS_LOAD_ROW1 3 -#define FUSE_STATUS_IDLE 4 -#define FUSE_STATUS_READ_SETUP 5 -#define FUSE_STATUS_READ_STROBE 6 -#define FUSE_STATUS_SAMPLE_FUSES 7 -#define FUSE_STATUS_READ_HOLD 8 -#define FUSE_STATUS_FUSE_SRC_SETUP 9 -#define FUSE_STATUS_WRITE_SETUP 10 -#define FUSE_STATUS_WRITE_ADDR_SETUP 11 -#define FUSE_STATUS_WRITE_PROGRAM 12 -#define FUSE_STATUS_WRITE_ADDR_HOLD 13 -#define FUSE_STATUS_FUSE_SRC_HOLD 14 -#define FUSE_STATUS_LOAD_RIR 15 +#define FUSE_STATUS_RESET 0 +#define FUSE_STATUS_POST_RESET 1 +#define FUSE_STATUS_LOAD_ROW0 2 +#define FUSE_STATUS_LOAD_ROW1 3 +#define FUSE_STATUS_IDLE 4 +#define FUSE_STATUS_READ_SETUP 5 +#define FUSE_STATUS_READ_STROBE 6 +#define FUSE_STATUS_SAMPLE_FUSES 7 +#define FUSE_STATUS_READ_HOLD 8 +#define FUSE_STATUS_FUSE_SRC_SETUP 9 +#define FUSE_STATUS_WRITE_SETUP 10 +#define FUSE_STATUS_WRITE_ADDR_SETUP 11 +#define FUSE_STATUS_WRITE_PROGRAM 12 +#define FUSE_STATUS_WRITE_ADDR_HOLD 13 +#define FUSE_STATUS_FUSE_SRC_HOLD 14 +#define FUSE_STATUS_LOAD_RIR 15 #define FUSE_STATUS_READ_BEFORE_WRITE_SETUP 16 -#define FUSE_STATUS_READ_DEASSERT_PD 17 +#define FUSE_STATUS_READ_DEASSERT_PD 17 /*! Fuse cache registers. */ #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) -#define FUSE_ARRAY_WORDS_NUM 192 +#define FUSE_ARRAY_WORDS_NUM 192 #define FUSE_ARRAY_WORDS_NUM_B01 256 -enum -{ - FUSE_NX_HW_TYPE_ICOSA, - FUSE_NX_HW_TYPE_IOWA, - FUSE_NX_HW_TYPE_HOAG, - FUSE_NX_HW_TYPE_AULA -}; +enum { FUSE_NX_HW_TYPE_ICOSA, FUSE_NX_HW_TYPE_IOWA, FUSE_NX_HW_TYPE_HOAG, FUSE_NX_HW_TYPE_AULA }; -enum -{ - FUSE_NX_HW_STATE_PROD, - FUSE_NX_HW_STATE_DEV -}; +enum { FUSE_NX_HW_STATE_PROD, FUSE_NX_HW_STATE_DEV }; #endif diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp index 0210f735..e2a4e158 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.cpp @@ -14,56 +14,56 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - -#include "gm20b.hpp" #include "../mapping/mem_map.hpp" +#include "gm20b.hpp" + namespace gm20b { u64 gpu_base = 0; - #define GPU_PA 0x57000000 - #define GPU_SIZE 0x1000000 - #define GPU_TRIM_SYS_GPCPLL_CFG 0x00 - #define GPU_TRIM_SYS_GPCPLL_COEFF 0x04 - #define GPU_TRIM_SYS_GPCPLL_CFG2 0x08 - #define GPU_TRIM_SYS_GPCPLL_CFG3 0x0C - #define GPU_TRIM_SYS_GPCPLL_DVFS0 0x10 - #define GPU_TRIM_SYS_GPCPLL_DVFS1 0x14 - #define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x1C - #define GPU_TRIM_SYS_SEL_VCO 0x2C - #define GPU_TRIM_SYS_GPC2CLK_OUT 0x250 +#define GPU_PA 0x57000000 +#define GPU_SIZE 0x1000000 +#define GPU_TRIM_SYS_GPCPLL_CFG 0x00 +#define GPU_TRIM_SYS_GPCPLL_COEFF 0x04 +#define GPU_TRIM_SYS_GPCPLL_CFG2 0x08 +#define GPU_TRIM_SYS_GPCPLL_CFG3 0x0C +#define GPU_TRIM_SYS_GPCPLL_DVFS0 0x10 +#define GPU_TRIM_SYS_GPCPLL_DVFS1 0x14 +#define GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN 0x1C +#define GPU_TRIM_SYS_SEL_VCO 0x2C +#define GPU_TRIM_SYS_GPC2CLK_OUT 0x250 - #define GPC_BCAST(x) (*(volatile u32 *)(gpu_base + 0x132800ul + (x))) - #define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(gpu_base + 0x137000ul + (x))) +#define GPC_BCAST(x) (*(volatile u32 *)(gpu_base + 0x132800ul + (x))) +#define GPU_TRIM_SYS_GPCPLL(x) (*(volatile u32 *)(gpu_base + 0x137000ul + (x))) - #define GPC_BCAST_GPCPLL_DVFS2 0x20 - #define GPC_BCAST_NDIV_SLOWDOWN_DBG 0xa0 +#define GPC_BCAST_GPCPLL_DVFS2 0x20 +#define GPC_BCAST_NDIV_SLOWDOWN_DBG 0xa0 - #define GPCPLL_CFG_ENABLE BIT(0) - #define GPCPLL_CFG_IDDQ BIT(1) - #define GPCPLL_CFG_SYNC_MODE BIT(2) - #define GPCPLL_CFG_LOCK BIT(17) +#define GPCPLL_CFG_ENABLE BIT(0) +#define GPCPLL_CFG_IDDQ BIT(1) +#define GPCPLL_CFG_SYNC_MODE BIT(2) +#define GPCPLL_CFG_LOCK BIT(17) - #define GPCPLL_CFG2_SDM_DIN_MASK 0x000000FFu - #define GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x007FFF00u - #define GPCPLL_CFG2_STEPA_SHIFT 24 - #define GPCPLL_CFG2_STEPA_MASK 0xFF000000u +#define GPCPLL_CFG2_SDM_DIN_MASK 0x000000FFu +#define GPCPLL_CFG2_SDM_DIN_NEW_MASK 0x007FFF00u +#define GPCPLL_CFG2_STEPA_SHIFT 24 +#define GPCPLL_CFG2_STEPA_MASK 0xFF000000u - #define GPCPLL_CFG3_STEPB_SHIFT 16 - #define GPCPLL_CFG3_STEPB_MASK 0x00FF0000u +#define GPCPLL_CFG3_STEPB_SHIFT 16 +#define GPCPLL_CFG3_STEPB_MASK 0x00FF0000u - #define GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007Fu +#define GPCPLL_DVFS0_DFS_COEFF_MASK 0x0000007Fu - #define NDIV_SLOWDOWN_SLOWDOWN_USING_PLL BIT(22) - #define NDIV_SLOWDOWN_EN_DYNRAMP BIT(23) +#define NDIV_SLOWDOWN_SLOWDOWN_USING_PLL BIT(22) +#define NDIV_SLOWDOWN_EN_DYNRAMP BIT(23) - #define DYNRAMP_DONE_SYNCED BIT(24) +#define DYNRAMP_DONE_SYNCED BIT(24) - #define GPCPLL_DVFS2_DFS_EXT_STROBE BIT(16) +#define GPCPLL_DVFS2_DFS_EXT_STROBE BIT(16) - #define RAMP_TIMEOUT_US 500 +#define RAMP_TIMEOUT_US 500 static inline void _gpu_mask(u32 reg, u32 mask, u32 val) { u32 tmp = GPU_TRIM_SYS_GPCPLL(reg); @@ -78,12 +78,8 @@ namespace gm20b { } static void _clk_setup_slide() { - _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, - GPCPLL_CFG2_STEPA_MASK, - 0x04u << GPCPLL_CFG2_STEPA_SHIFT); - _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG3, - GPCPLL_CFG3_STEPB_MASK, - 0x05u << GPCPLL_CFG3_STEPB_SHIFT); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, GPCPLL_CFG2_STEPA_MASK, 0x04u << GPCPLL_CFG2_STEPA_SHIFT); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG3, GPCPLL_CFG3_STEPB_MASK, 0x05u << GPCPLL_CFG3_STEPB_SHIFT); } static bool _gpu_pllg_slide(u32 new_divn) { @@ -95,9 +91,7 @@ namespace gm20b { _clk_setup_slide(); - _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, - NDIV_SLOWDOWN_SLOWDOWN_USING_PLL, - NDIV_SLOWDOWN_SLOWDOWN_USING_PLL); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, NDIV_SLOWDOWN_SLOWDOWN_USING_PLL, NDIV_SLOWDOWN_SLOWDOWN_USING_PLL); _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_NEW_MASK, 0); @@ -106,9 +100,7 @@ namespace gm20b { GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF) = coeff; usleep(1); - _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, - NDIV_SLOWDOWN_EN_DYNRAMP, - NDIV_SLOWDOWN_EN_DYNRAMP); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, NDIV_SLOWDOWN_EN_DYNRAMP, NDIV_SLOWDOWN_EN_DYNRAMP); int ramp_timeout = RAMP_TIMEOUT_US; bool success = false; @@ -125,9 +117,7 @@ namespace gm20b { _gpu_mask(GPU_TRIM_SYS_GPCPLL_CFG2, GPCPLL_CFG2_SDM_DIN_MASK, 0); } - _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, - NDIV_SLOWDOWN_SLOWDOWN_USING_PLL | NDIV_SLOWDOWN_EN_DYNRAMP, - 0); + _gpu_mask(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN, NDIV_SLOWDOWN_SLOWDOWN_USING_PLL | NDIV_SLOWDOWN_EN_DYNRAMP, 0); (void)GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_NDIV_SLOWDOWN); return success; @@ -137,11 +127,11 @@ namespace gm20b { if (!gpu_base) QueryMemoryMapping(&gpu_base, GPU_PA, GPU_SIZE); - const u32 osc_khz = 38400; // PLL Hz + const u32 osc_khz = 38400; // PLL Hz u32 coeff = GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF); - u32 divm = coeff & 0xFF; - u32 divp = (coeff >> 16) & 0x3F; + u32 divm = coeff & 0xFF; + u32 divp = (coeff >> 16) & 0x3F; if (divm == 0 || divp == 0) return false; @@ -149,9 +139,11 @@ namespace gm20b { u32 new_divn = (u64)khz * divm * divp * 2 / osc_khz; // L4T clamps the registers here for some reason, do that - if (new_divn < 8) new_divn = 8; - if (new_divn > 255) new_divn = 255; + if (new_divn < 8) + new_divn = 8; + if (new_divn > 255) + new_divn = 255; return _gpu_pllg_slide(new_divn); } -} \ No newline at end of file +} // namespace gm20b \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp b/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp index 4651db16..ec7726cc 100644 --- a/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/gm20b.hpp @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include <../board/board.hpp> diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp index 2b64c0ea..c9ad36bb 100644 --- a/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp +++ b/Source/hoc-clk/sysmodule/src/soc/pllmb.cpp @@ -14,35 +14,35 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include "pllmb.hpp" namespace pllmb { - #define GET_BITS(VAL, HIGH, LOW) ((VAL & ((1UL << (HIGH + 1UL)) - 1UL)) >> LOW) - #define GET_BIT(VAL, BIT) GET_BITS(VAL, BIT, BIT) +#define GET_BITS(VAL, HIGH, LOW) ((VAL & ((1UL << (HIGH + 1UL)) - 1UL)) >> LOW) +#define GET_BIT(VAL, BIT) GET_BITS(VAL, BIT, BIT) - static inline volatile u32& REG(uintptr_t addr) { - return *reinterpret_cast(addr); + static inline volatile u32 ®(uintptr_t addr) { + return *reinterpret_cast(addr); } // From jetson nano kernel typedef enum { /* divider = 2 */ - CLK_PLLX = 5, - CLK_PLLM = 2, + CLK_PLLX = 5, + CLK_PLLM = 2, CLK_PLLMB = 37, /* PLLX & PLLG are backup PLLs for CPU & GPU */ /* divider = 1 */ - CLK_CCLK_G = 18, // A57 CPU cluster - CLK_EMC = 36, - } PTO_ID; // PLL Test Output Register ID + CLK_CCLK_G = 18, // A57 CPU cluster + CLK_EMC = 36, + } PTO_ID; // PLL Test Output Register ID /* See if GM20B clock GPC PLL regs are accessible. */ - #define PLLX_MISC0 0xE4 - #define PLLM_MISC2 0x9C +#define PLLX_MISC0 0xE4 +#define PLLM_MISC2 0x9C double ptoGetMHz(PTO_ID pto_id, u32 divider = 1, u32 presel_reg = 0, u32 presel_mask = 0) { u32 pre_val, val, presel_val; @@ -71,7 +71,7 @@ namespace pllmb { REG(board::clkVirtAddr + 0x60) = val | BIT(9); usleep(500); - while(REG(board::clkVirtAddr + 0x64) & BIT(31)) + while (REG(board::clkVirtAddr + 0x64) & BIT(31)) ; val = REG(board::clkVirtAddr + 0x64); @@ -111,6 +111,6 @@ namespace pllmb { u32 pllmb = ptoGetMHz(CLK_PLLMB, 2, PLLM_MISC2, BIT(9)); u32 pllm = ptoGetMHz(CLK_PLLM, 2, PLLM_MISC2, BIT(8)); - return pllmb == 0 ? pllm : pllmb; // pllmb is zeroed out at times, fallback to pllm + return pllmb == 0 ? pllm : pllmb; // pllmb is zeroed out at times, fallback to pllm } -} \ No newline at end of file +} // namespace pllmb \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp index a6aa78f7..e65472fd 100644 --- a/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp +++ b/Source/hoc-clk/sysmodule/src/soc/pllmb.hpp @@ -14,15 +14,17 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once #include -#include #include -#include "../board/board.hpp" #include +#include + +#include "../board/board.hpp" + namespace pllmb { u64 getRamClockRatePLLMB(); diff --git a/Source/hoc-clk/sysmodule/src/soc/registers.h b/Source/hoc-clk/sysmodule/src/soc/registers.h index da944663..f6f11b06 100644 --- a/Source/hoc-clk/sysmodule/src/soc/registers.h +++ b/Source/hoc-clk/sysmodule/src/soc/registers.h @@ -526,23 +526,23 @@ #define CL_DVFS_INTR_STS_0 0x5C #define CL_DVFS_I2C_CLK_DIVISOR_REGISTER_0 0x16C -#define CLK_SOURCE_EMC 0x19c +#define CLK_SOURCE_EMC 0x19c -#define PLLC_BASE 0x080 -#define PLLM_BASE 0x090 -#define PLLP_BASE 0x0a0 -#define PLLA_BASE 0x0b0 -#define PLLU_BASE 0x0c0 -#define _PLLD_BASE 0x0d0 -#define PLLX_BASE 0x0e0 -#define PLLE_BASE 0x0e8 -#define PLLC2_BASE 0x4e8 -#define PLLC3_BASE 0x4fc -#define PLLD2_BASE 0x4b8 -#define PLLRE_BASE 0x4c4 -#define PLLC4_BASE 0x5a4 -#define PLLMB_BASE 0x5e8 -#define PLLA1_BASE 0x6a4 -#define PLLDP_BASE 0x590 +#define PLLC_BASE 0x080 +#define PLLM_BASE 0x090 +#define PLLP_BASE 0x0a0 +#define PLLA_BASE 0x0b0 +#define PLLU_BASE 0x0c0 +#define _PLLD_BASE 0x0d0 +#define PLLX_BASE 0x0e0 +#define PLLE_BASE 0x0e8 +#define PLLC2_BASE 0x4e8 +#define PLLC3_BASE 0x4fc +#define PLLD2_BASE 0x4b8 +#define PLLRE_BASE 0x4c4 +#define PLLC4_BASE 0x5a4 +#define PLLMB_BASE 0x5e8 +#define PLLA1_BASE 0x6a4 +#define PLLDP_BASE 0x590 #define OSC_HZ 38400000ULL \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.c b/Source/hoc-clk/sysmodule/src/soc/t210.c index dd92fb19..d787976f 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.c +++ b/Source/hoc-clk/sysmodule/src/soc/t210.c @@ -33,55 +33,54 @@ /*! PTO_CLK_CNT */ #define PTO_REF_CLK_WIN_CFG_MASK 0xF -#define PTO_REF_CLK_WIN_CFG_16P 0xF -#define PTO_CNT_EN BIT(9) -#define PTO_CNT_RST BIT(10) -#define PTO_CLK_ENABLE BIT(13) -#define PTO_SRC_SEL_SHIFT 14 -#define PTO_SRC_SEL_MASK 0x1FF -#define PTO_DIV_SEL_MASK (3 << 23) -#define PTO_DIV_SEL_GATED (0 << 23) -#define PTO_DIV_SEL_DIV1 (1 << 23) -#define PTO_DIV_SEL_DIV2_RISING (2 << 23) +#define PTO_REF_CLK_WIN_CFG_16P 0xF +#define PTO_CNT_EN BIT(9) +#define PTO_CNT_RST BIT(10) +#define PTO_CLK_ENABLE BIT(13) +#define PTO_SRC_SEL_SHIFT 14 +#define PTO_SRC_SEL_MASK 0x1FF +#define PTO_DIV_SEL_MASK (3 << 23) +#define PTO_DIV_SEL_GATED (0 << 23) +#define PTO_DIV_SEL_DIV1 (1 << 23) +#define PTO_DIV_SEL_DIV2_RISING (2 << 23) #define PTO_DIV_SEL_DIV2_FALLING (3 << 23) -#define PTO_DIV_SEL_CPU_EARLY (0 << 23) -#define PTO_DIV_SEL_CPU_LATE (1 << 23) +#define PTO_DIV_SEL_CPU_EARLY (0 << 23) +#define PTO_DIV_SEL_CPU_LATE (1 << 23) -#define PTO_CLK_CNT_BUSY BIT(31) -#define PTO_CLK_CNT 0xFFFFFF -#define CLK_PTO_CCLK_G_DIV2 0x13 -#define CLK_PTO_EMC 0x24 +#define PTO_CLK_CNT_BUSY BIT(31) +#define PTO_CLK_CNT 0xFFFFFF +#define CLK_PTO_CCLK_G_DIV2 0x13 +#define CLK_PTO_EMC 0x24 #define CLOCK(x) (*(volatile u32 *)(g_clk_base + (x))) /* Actmon Global registers */ -#define ACTMON_GLB_STATUS 0x0 -#define ACTMON_MCCPU_MON_ACT BIT(8) -#define ACTMON_MCALL_MON_ACT BIT(9) -#define ACTMON_CPU_FREQ_MON_ACT BIT(10) -#define ACTMON_BPMP_MON_ACT BIT(14) -#define ACTMON_CPU_MON_ACT BIT(15) +#define ACTMON_GLB_STATUS 0x0 +#define ACTMON_MCCPU_MON_ACT BIT(8) +#define ACTMON_MCALL_MON_ACT BIT(9) +#define ACTMON_CPU_FREQ_MON_ACT BIT(10) +#define ACTMON_BPMP_MON_ACT BIT(14) +#define ACTMON_CPU_MON_ACT BIT(15) -#define ACTMON_GLB_PERIOD_CTRL 0x4 -#define ACTMON_GLB_PERIOD_USEC BIT(8) +#define ACTMON_GLB_PERIOD_CTRL 0x4 +#define ACTMON_GLB_PERIOD_USEC BIT(8) #define ACTMON_GLB_PERIOD_SAMPLE(n) (((n) - 1) & 0xFF) /* Actmon Device Registers */ -#define ACTMON_DEV_SIZE 0x40 +#define ACTMON_DEV_SIZE 0x40 /* Actmon CTRL */ -#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10) -#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18) -#define ACTMON_DEV_CTRL_ENB BIT(31) +#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10) +#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18) +#define ACTMON_DEV_CTRL_ENB BIT(31) #define ACTMON_PERIOD_MS 20 #define DEV_COUNT_WEIGHT 1024 -#define ACTMON_BASE (g_act_base + 0x800) +#define ACTMON_BASE (g_act_base + 0x800) #define ACTMON_DEV_BASE (ACTMON_BASE + 0x80) #define ACTMON(x) (*(volatile u32 *)(ACTMON_BASE + (x))) -typedef enum _actmon_dev_t -{ +typedef enum _actmon_dev_t { ACTMON_DEV_CPU, ACTMON_DEV_BPMP, ACTMON_DEV_AHB, @@ -93,8 +92,7 @@ typedef enum _actmon_dev_t ACTMON_DEV_NUM, } actmon_dev_t; -typedef struct _actmon_dev_reg_t -{ +typedef struct _actmon_dev_reg_t { vu32 ctrl; vu32 upper_wnark; vu32 lower_wmark; @@ -122,8 +120,7 @@ static u32 g_emc_bw_all = 0; static u32 g_emc_bw_cpu = 0; static u32 g_emc_bw_gpu = 0; -static u32 _clock_get_dev_freq(u32 id, u32 multiplier) -{ +static u32 _clock_get_dev_freq(u32 id, u32 multiplier) { const u32 pto_win = 16; const u32 pto_osc = 32768; @@ -142,7 +139,7 @@ static u32 _clock_get_dev_freq(u32 id, u32 multiplier) CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_EN; (void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL); - usleep((1000000ULL * pto_win / pto_osc) + 12 + 2); // 502 us. + usleep((1000000ULL * pto_win / pto_osc) + 12 + 2); // 502 us. while (CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT_BUSY) ; @@ -158,97 +155,81 @@ static u32 _clock_get_dev_freq(u32 id, u32 multiplier) return freq_khz; } -static void _actmon_dev_enable(actmon_dev_t dev, u32 freq, u32 weight) -{ +static void _actmon_dev_enable(actmon_dev_t dev, u32 freq, u32 weight) { actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); regs->init_avg = (u32)freq * ACTMON_PERIOD_MS / 2; regs->count_weight = weight; - regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC | ACTMON_DEV_CTRL_K_VAL(3); // 8 samples average. + regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC | ACTMON_DEV_CTRL_K_VAL(3); // 8 samples average. } -static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) -{ +static u32 _actmon_dev_get_count_avg(actmon_dev_t dev) { actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE)); return regs->avg_count; } -static inline Result _svcQueryMemoryMappingFallback(u64* virtaddr, u64 physaddr, u64 size) -{ - if(hosversionAtLeast(10,0,0)) - { +static inline Result _svcQueryMemoryMappingFallback(u64 *virtaddr, u64 physaddr, u64 size) { + if (hosversionAtLeast(10, 0, 0)) { u64 out_size; return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size); - } - else - { + } else { return svcLegacyQueryIoMapping(virtaddr, physaddr, size); } } -static void _clock_update_freqs(void) -{ +static void _clock_update_freqs(void) { u64 ticks = armGetSystemTick(); - if(armTicksToNs(ticks - g_update_ticks) <= WAIT_NS) - { + if (armTicksToNs(ticks - g_update_ticks) <= WAIT_NS) { return; } g_update_ticks = ticks; - if (!g_clk_base) - { + if (!g_clk_base) { _svcQueryMemoryMappingFallback(&g_clk_base, 0x60006000ul, 0x1000); } - if(!g_clk_base) - { + if (!g_clk_base) { return; } g_mem_freq = _clock_get_dev_freq(CLK_PTO_EMC, 1); g_cpu_freq = _clock_get_dev_freq(CLK_PTO_CCLK_G_DIV2, 2); - if (!g_gpu_base) - { + if (!g_gpu_base) { _svcQueryMemoryMappingFallback(&g_gpu_base, 0x57000000ul, 0x1000000); } - if (!g_gpu_base) - { + if (!g_gpu_base) { return; } bool gpu_enabled = (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_X) & BIT(24)) && !(CLOCK(CLK_RST_CONTROLLER_RST_DEVICES_X) & BIT(24)); - if(!gpu_enabled) - { + if (!gpu_enabled) { return; } - if (!g_act_base) - { + if (!g_act_base) { _svcQueryMemoryMappingFallback(&g_act_base, 0x6000C000ul, 0x1000); } - if(!g_act_base) - { + if (!g_act_base) { return; } - + const u32 osc = 38400000; u32 coeff = GPU_TRIM_SYS_GPCPLL(GPU_TRIM_SYS_GPCPLL_COEFF); u32 divm = coeff & 0xFF; - u32 divn = (coeff >> 8) & 0xFF; + u32 divn = (coeff >> 8) & 0xFF; u32 divp = (coeff >> 16) & 0x3F; g_gpu_freq = osc * divn / (divm * divp) / 2; u32 emc_freq = g_mem_freq / 1000; // Check if actmon is disabled - if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCALL_MON_ACT)) - { + if (!(ACTMON(ACTMON_GLB_STATUS) & ACTMON_MCALL_MON_ACT)) { ACTMON(ACTMON_GLB_PERIOD_CTRL) = ACTMON_GLB_PERIOD_SAMPLE(ACTMON_PERIOD_MS); _actmon_dev_enable(ACTMON_DEV_MC_ALL, emc_freq, 256 * 4); } @@ -270,57 +251,47 @@ static void _clock_update_freqs(void) g_emc_bw_gpu = g_emc_bw_all - g_emc_bw_cpu; } - -u32 t210ClkCpuFreq(void) -{ +u32 t210ClkCpuFreq(void) { _clock_update_freqs(); return g_cpu_freq; } -u32 t210ClkMemFreq(void) -{ +u32 t210ClkMemFreq(void) { _clock_update_freqs(); return g_mem_freq; } -u32 t210ClkGpuFreq(void) -{ +u32 t210ClkGpuFreq(void) { _clock_update_freqs(); return g_gpu_freq; } -u32 t210EmcLoadAll() -{ +u32 t210EmcLoadAll() { _clock_update_freqs(); return g_emc_lall; } -u32 t210EmcLoadCpu() -{ +u32 t210EmcLoadCpu() { _clock_update_freqs(); return g_emc_lcpu; } -u32 t210EmcBwAll() -{ +u32 t210EmcBwAll() { _clock_update_freqs(); return g_emc_bw_all; } -u32 t210EmcBwCpu() -{ +u32 t210EmcBwCpu() { _clock_update_freqs(); return g_emc_bw_cpu; } -u32 t210EmcBwGpu() -{ +u32 t210EmcBwGpu() { _clock_update_freqs(); return g_emc_bw_gpu; } -u32 t210EmcBwPeak() -{ +u32 t210EmcBwPeak() { _clock_update_freqs(); return ((u64)g_mem_freq * 16) / 1000000; } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/soc/t210.h b/Source/hoc-clk/sysmodule/src/soc/t210.h index 895ac01e..2ad618f6 100644 --- a/Source/hoc-clk/sysmodule/src/soc/t210.h +++ b/Source/hoc-clk/sysmodule/src/soc/t210.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,12 +24,10 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp index 460ac88f..fbf03091 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.cpp @@ -21,67 +21,67 @@ */ #include -#include "../mapping/mem_map.hpp" + #include "../file/file_utils.hpp" -#include "tsensor_common.hpp" +#include "../mapping/mem_map.hpp" #include "aotag.hpp" +#include "tsensor_common.hpp" + namespace tsensor { - #define PMC_BASE 0x7000E400 - #define TEGRA_FUSE_CP_REV_0_3 (3) - #define FUSE_CP_REV 0x190 +#define PMC_BASE 0x7000E400 +#define TEGRA_FUSE_CP_REV_0_3 (3) +#define FUSE_CP_REV 0x190 namespace { - u64 fuseVa = 0; + u64 fuseVa = 0; bool wasInit = false; - } + } // namespace - #define REG_SET(r, mask, value) \ - ((r & ~(mask##_MASK)) | ((value<<(mask##_POS_START)) & mask##_MASK)) +#define REG_SET(r, mask, value) ((r & ~(mask##_MASK)) | ((value << (mask##_POS_START)) & mask##_MASK)) - #define REG_GET(r, mask) \ - ((r & mask##_MASK) >> mask##_POS_START) +#define REG_GET(r, mask) ((r & mask##_MASK) >> mask##_POS_START) - #define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff +#define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff static const TSensorFuse tegra_aotag_fuse = { - .fuse_base_cp_mask = 0x3ff << 11, - .fuse_base_cp_shift = 11, - .fuse_base_ft_mask = (u32)0x7ff << 21, - .fuse_base_ft_shift = 21, - .fuse_shift_ft_mask = 0x1f << 6, - .fuse_shift_ft_shift = 6, + .fuse_base_cp_mask = 0x3ff << 11, + .fuse_base_cp_shift = 11, + .fuse_base_ft_mask = (u32)0x7ff << 21, + .fuse_base_ft_shift = 21, + .fuse_shift_ft_mask = 0x1f << 6, + .fuse_shift_ft_shift = 6, .fuse_spare_realignment = 0, }; static TSensorConfig tegra_aotag_config = { - .tall = 76, - .tiddq_en = 1, - .ten_count = 16, - .pdiv = 8, - .pdiv_ate = 8, - .tsample = 9, + .tall = 76, + .tiddq_en = 1, + .ten_count = 16, + .pdiv = 8, + .pdiv_ate = 8, + .tsample = 9, .tsample_ate = 39, }; static TSensorConfig tegra210b01_aotag_config = { - .tall = 76, - .tiddq_en = 1, - .ten_count = 16, - .pdiv = 12, - .pdiv_ate = 6, - .tsample = 19, + .tall = 76, + .tiddq_en = 1, + .ten_count = 16, + .pdiv = 12, + .pdiv_ate = 6, + .tsample = 19, .tsample_ate = 39, }; static const FuseCorrCoeff tegra_aotag_coeff = { .alpha = 1063200, - .beta = -6749000, + .beta = -6749000, }; static const FuseCorrCoeff tegra210b01_aotag_coeff = { .alpha = 991100, - .beta = 1096200, + .beta = 1096200, }; struct aotag_sensor_info_t { @@ -99,32 +99,32 @@ namespace tsensor { static aotag_platform_data tegra210_plat_data = { .config = &tegra_aotag_config, - .coeff = &tegra_aotag_coeff, + .coeff = &tegra_aotag_coeff, }; static aotag_platform_data tegra210b01_plat_data = { .config = &tegra210b01_aotag_config, - .coeff = &tegra210b01_aotag_coeff, + .coeff = &tegra210b01_aotag_coeff, }; aotag_sensor_info_t aotag_sensor_info = { - .config = NULL, - .fuse = NULL, - .coeff = NULL, + .config = NULL, + .fuse = NULL, + .coeff = NULL, .therm_a = 0, .therm_b = 0, }; - aotag_sensor_info_t *info = &aotag_sensor_info; + aotag_sensor_info_t *info = &aotag_sensor_info; aotag_platform_data *pdata = NULL; u32 ReadPmcReg(unsigned long offset) { SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = PMC_BASE + offset; + args.X[0] = 0xF0000002; + args.X[1] = PMC_BASE + offset; svcCallSecureMonitor(&args); - if (args.X[1] == (PMC_BASE + offset)) { // if param 1 is identical read failed + if (args.X[1] == (PMC_BASE + offset)) { // if param 1 is identical read failed return 0; } @@ -133,21 +133,21 @@ namespace tsensor { void WritePmcReg(u32 value, unsigned long offset) { SecmonArgs args = {}; - args.X[0] = 0xF0000002; - args.X[1] = PMC_BASE + offset; - args.X[2] = 0xFFFFFFFF; - args.X[3] = (value); + args.X[0] = 0xF0000002; + args.X[1] = PMC_BASE + offset; + args.X[2] = 0xFFFFFFFF; + args.X[3] = (value); svcCallSecureMonitor(&args); } static inline void SetBit(unsigned long nr, volatile void *addr) { - int *m = ((int *) addr) + (nr >> 5); - *m |= 1 << (nr & 31); + int *m = ((int *)addr) + (nr >> 5); + *m |= 1 << (nr & 31); } static inline void ClearBit(unsigned long nr, volatile void *addr) { - int *m = ((int *) addr) + (nr >> 5); - *m &= ~(1 << (nr & 31)); + int *m = ((int *)addr) + (nr >> 5); + *m &= ~(1 << (nr & 31)); } void InitializeAotag(bool isMariko) { @@ -156,7 +156,7 @@ namespace tsensor { if (isMariko) { // u32 major, minor, rev; - pdata = &tegra210b01_plat_data; + pdata = &tegra210b01_plat_data; info->config = &tegra210b01_aotag_config; // tegra_fuse_readl(FUSE_CP_REV, &rev); // minor = rev & 0x1f; @@ -166,10 +166,10 @@ namespace tsensor { // } } else { info->config = &tegra_aotag_config; - pdata = &tegra210_plat_data; + pdata = &tegra210_plat_data; } - info->fuse = &tegra_aotag_fuse; + info->fuse = &tegra_aotag_fuse; info->coeff = pdata->coeff; aotag_sensor_info_t *ps_info = &aotag_sensor_info; @@ -215,18 +215,18 @@ namespace tsensor { } u32 regval = 0, abs = 0, fraction = 0, valid = 0, sign = 0; - s32 temp = 0; - regval = ReadPmcReg(PMC_TSENSOR_STATUS1); - valid = REG_GET(regval, STATUS1_TEMP_VALID); + s32 temp = 0; + regval = ReadPmcReg(PMC_TSENSOR_STATUS1); + valid = REG_GET(regval, STATUS1_TEMP_VALID); if (!valid) { return -125; } - abs = REG_GET(regval, STATUS1_TEMP_ABS); + abs = REG_GET(regval, STATUS1_TEMP_ABS); fraction = REG_GET(regval, STATUS1_TEMP_FRAC); - sign = REG_GET(regval, STATUS1_TEMP_SIGN); - temp = (abs * 1000) + (fraction * 500); + sign = REG_GET(regval, STATUS1_TEMP_SIGN); + temp = (abs * 1000) + (fraction * 500); if (sign) { temp = (-1) * (temp); } @@ -238,4 +238,4 @@ namespace tsensor { return wasInit; } -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp b/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp index 6c9eff38..f2a2c0eb 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/aotag.hpp @@ -21,136 +21,118 @@ namespace tsensor { - #define MASK(start, end) \ - (((0xFFFFFFFF)< + +#include "../board/board.hpp" #include "../i2c/i2cDrv.h" + namespace bq24193 { - #define BQ24193_I2C_ADDR 0x6B +#define BQ24193_I2C_ADDR 0x6B - // REG 0 masks. - #define BQ24193_INCONFIG_INLIMIT_MASK (7<<0) - #define BQ24193_INCONFIG_VINDPM_MASK 0x78 - #define BQ24193_INCONFIG_HIZ_EN_MASK (1<<7) +// REG 0 masks. +#define BQ24193_INCONFIG_INLIMIT_MASK (7 << 0) +#define BQ24193_INCONFIG_VINDPM_MASK 0x78 +#define BQ24193_INCONFIG_HIZ_EN_MASK (1 << 7) - // REG 1 masks. - #define BQ24193_PORCONFIG_BOOST_MASK (1<<0) - #define BQ24193_PORCONFIG_SYSMIN_MASK (7<<1) // 3000uV HOS default. - #define BQ24193_PORCONFIG_CHGCONFIG_MASK (3<<4) - #define BQ24193_PORCONFIG_CHGCONFIG_CHARGER_EN (1<<4) - #define BQ24193_PORCONFIG_I2CWATCHDOG_MASK (1<<6) - #define BQ24193_PORCONFIG_RESET_MASK (1<<7) +// REG 1 masks. +#define BQ24193_PORCONFIG_BOOST_MASK (1 << 0) +#define BQ24193_PORCONFIG_SYSMIN_MASK (7 << 1) // 3000uV HOS default. +#define BQ24193_PORCONFIG_CHGCONFIG_MASK (3 << 4) +#define BQ24193_PORCONFIG_CHGCONFIG_CHARGER_EN (1 << 4) +#define BQ24193_PORCONFIG_I2CWATCHDOG_MASK (1 << 6) +#define BQ24193_PORCONFIG_RESET_MASK (1 << 7) - // REG 2 masks. - #define BQ24193_CHRGCURR_20PCT_MASK (1<<0) - #define BQ24193_CHRGCURR_ICHG_MASK 0xFC +// REG 2 masks. +#define BQ24193_CHRGCURR_20PCT_MASK (1 << 0) +#define BQ24193_CHRGCURR_ICHG_MASK 0xFC - // REG 3 masks. - #define BQ24193_PRECHRG_ITERM 0x0F - #define BQ24193_PRECHRG_IPRECHG 0xF0 +// REG 3 masks. +#define BQ24193_PRECHRG_ITERM 0x0F +#define BQ24193_PRECHRG_IPRECHG 0xF0 - // REG 4 masks. - #define BQ24193_CHRGVOLT_VTHRES (1<<0) - #define BQ24193_CHRGVOLT_BATTLOW (1<<1) - #define BQ24193_CHRGVOLT_VREG 0xFC +// REG 4 masks. +#define BQ24193_CHRGVOLT_VTHRES (1 << 0) +#define BQ24193_CHRGVOLT_BATTLOW (1 << 1) +#define BQ24193_CHRGVOLT_VREG 0xFC - // REG 5 masks. - #define BQ24193_CHRGTERM_ISET_MASK (1<<0) - #define BQ24193_CHRGTERM_CHGTIMER_MASK (3<<1) - #define BQ24193_CHRGTERM_ENTIMER_MASK (1<<3) - #define BQ24193_CHRGTERM_WATCHDOG_MASK (3<<4) - #define BQ24193_CHRGTERM_TERM_ST_MASK (1<<6) - #define BQ24193_CHRGTERM_TERM_EN_MASK (1<<7) +// REG 5 masks. +#define BQ24193_CHRGTERM_ISET_MASK (1 << 0) +#define BQ24193_CHRGTERM_CHGTIMER_MASK (3 << 1) +#define BQ24193_CHRGTERM_ENTIMER_MASK (1 << 3) +#define BQ24193_CHRGTERM_WATCHDOG_MASK (3 << 4) +#define BQ24193_CHRGTERM_TERM_ST_MASK (1 << 6) +#define BQ24193_CHRGTERM_TERM_EN_MASK (1 << 7) - // REG 6 masks. - #define BQ24193_IRTHERMAL_THERM_MASK (3<<0) - #define BQ24193_IRTHERMAL_VCLAMP_MASK (7<<2) - #define BQ24193_IRTHERMAL_BATTCOMP_MASK (7<<5) +// REG 6 masks. +#define BQ24193_IRTHERMAL_THERM_MASK (3 << 0) +#define BQ24193_IRTHERMAL_VCLAMP_MASK (7 << 2) +#define BQ24193_IRTHERMAL_BATTCOMP_MASK (7 << 5) - // REG 7 masks. - #define BQ24193_MISC_INT_MASK (3<<0) - #define BQ24193_MISC_VSET_MASK (1<<4) - #define BQ24193_MISC_BATFET_DI_MASK (1<<5) - #define BQ24193_MISC_TMR2X_EN_MASK (1<<6) - #define BQ24193_MISC_DPDM_EN_MASK (1<<7) +// REG 7 masks. +#define BQ24193_MISC_INT_MASK (3 << 0) +#define BQ24193_MISC_VSET_MASK (1 << 4) +#define BQ24193_MISC_BATFET_DI_MASK (1 << 5) +#define BQ24193_MISC_TMR2X_EN_MASK (1 << 6) +#define BQ24193_MISC_DPDM_EN_MASK (1 << 7) - // REG 8 masks. - #define BQ24193_STATUS_VSYS_MASK (1<<0) - #define BQ24193_STATUS_THERM_MASK (1<<1) - #define BQ24193_STATUS_PG_MASK (1<<2) - #define BQ24193_STATUS_DPM_MASK (1<<3) - #define BQ24193_STATUS_CHRG_MASK (3<<4) - #define BQ24193_STATUS_VBUS_MASK (3<<6) +// REG 8 masks. +#define BQ24193_STATUS_VSYS_MASK (1 << 0) +#define BQ24193_STATUS_THERM_MASK (1 << 1) +#define BQ24193_STATUS_PG_MASK (1 << 2) +#define BQ24193_STATUS_DPM_MASK (1 << 3) +#define BQ24193_STATUS_CHRG_MASK (3 << 4) +#define BQ24193_STATUS_VBUS_MASK (3 << 6) - // REG 9 masks. - #define BQ24193_FAULT_THERM_MASK (7<<0) - #define BQ24193_FAULT_BATT_OVP_MASK (1<<3) - #define BQ24193_FAULT_CHARGE_MASK (3<<4) - #define BQ24193_FAULT_BOOST_MASK (1<<6) - #define BQ24193_FAULT_WATCHDOG_MASK (1<<7) +// REG 9 masks. +#define BQ24193_FAULT_THERM_MASK (7 << 0) +#define BQ24193_FAULT_BATT_OVP_MASK (1 << 3) +#define BQ24193_FAULT_CHARGE_MASK (3 << 4) +#define BQ24193_FAULT_BOOST_MASK (1 << 6) +#define BQ24193_FAULT_WATCHDOG_MASK (1 << 7) - // REG A masks. - #define BQ24193_VENDORPART_DEV_MASK (3<<0) - #define BQ24193_VENDORPART_PN_MASK (7<<3) +// REG A masks. +#define BQ24193_VENDORPART_DEV_MASK (3 << 0) +#define BQ24193_VENDORPART_PN_MASK (7 << 3) enum BQ24193_reg { - BQ24193_InputSource = 0x00, - BQ24193_PORConfig = 0x01, - BQ24193_ChrgCurr = 0x02, - BQ24193_PreChrgTerm = 0x03, - BQ24193_ChrgVolt = 0x04, - BQ24193_ChrgTermTimer = 0x05, - BQ24193_IRCompThermal = 0x06, - BQ24193_Misc = 0x07, - BQ24193_Status = 0x08, - BQ24193_FaultReg = 0x09, - BQ24193_VendorPart = 0x0A, + BQ24193_InputSource = 0x00, + BQ24193_PORConfig = 0x01, + BQ24193_ChrgCurr = 0x02, + BQ24193_PreChrgTerm = 0x03, + BQ24193_ChrgVolt = 0x04, + BQ24193_ChrgTermTimer = 0x05, + BQ24193_IRCompThermal = 0x06, + BQ24193_Misc = 0x07, + BQ24193_Status = 0x08, + BQ24193_FaultReg = 0x09, + BQ24193_VendorPart = 0x0A, }; enum BQ24193_reg_prop { - BQ24193_InputVoltageLimit, // REG 0. - BQ24193_InputCurrentLimit, // REG 0. - BQ24193_SystemMinimumVoltage, // REG 1. - BQ24193_FastChargeCurrentLimit, // REG 2. - BQ24193_ChargeVoltageLimit, // REG 4. - BQ24193_RechargeThreshold, // REG 4. - BQ24193_ThermalRegulation, // REG 6. - BQ24193_ChargeStatus, // REG 8. - BQ24193_TempStatus, // REG 9. - BQ24193_DevID, // REG A. - BQ24193_ProductNumber, // REG A. + BQ24193_InputVoltageLimit, // REG 0. + BQ24193_InputCurrentLimit, // REG 0. + BQ24193_SystemMinimumVoltage, // REG 1. + BQ24193_FastChargeCurrentLimit, // REG 2. + BQ24193_ChargeVoltageLimit, // REG 4. + BQ24193_RechargeThreshold, // REG 4. + BQ24193_ThermalRegulation, // REG 6. + BQ24193_ChargeStatus, // REG 8. + BQ24193_TempStatus, // REG 9. + BQ24193_DevID, // REG A. + BQ24193_ProductNumber, // REG A. }; - // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot. + // 0: Normal, 2: Warm, 3: Cool, 5: Cold, 6: Hot. enum BQ24193_Temp { BQ24193_Temp_Normal = 0, BQ24193_Temp_Warm = 2, @@ -125,5 +127,4 @@ namespace bq24193 { BQ24193_Temp_Hot = 6, }; u8 getBQTemp(); -} - +} // namespace bq24193 diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp index 29353733..6a053f46 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.cpp @@ -20,169 +20,171 @@ * */ -#include #include +#include + #include "../board/board.hpp" #include "../file/file_utils.hpp" #include "../mapping/mem_map.hpp" #include "soctherm.hpp" #include "tsensor_common.hpp" + namespace tsensor { namespace { - #define CAR_CLK_SOURCE_TSENSOR 0x3B8 - #define CAR_CLK_OUT_ENB_V 0x360 +#define CAR_CLK_SOURCE_TSENSOR 0x3B8 +#define CAR_CLK_OUT_ENB_V 0x360 - #define CLK_RST_CONTROLLER_RST_DEVICES 0xC - #define SWR_SOC_THERM_RST 1 << 14 +#define CLK_RST_CONTROLLER_RST_DEVICES 0xC +#define SWR_SOC_THERM_RST 1 << 14 - #define CLK_RST_CONTROLLER_CLK_OUT_ENB 0x18 - #define CLK_ENB_SOC_THERM 1 << 14 +#define CLK_RST_CONTROLLER_CLK_OUT_ENB 0x18 +#define CLK_ENB_SOC_THERM 1 << 14 - #define CAR_CLK_SOURCE_TSENSOR_VAL 0x8000005E +#define CAR_CLK_SOURCE_TSENSOR_VAL 0x8000005E - #define THERMCTL_LEVEL0_GROUP_CPU 0x0 - #define THERMCTL_LEVEL0_GROUP_GPU 0x4 - #define THERMCTL_LEVEL0_GROUP_MEM 0x8 - #define THERMCTL_LEVEL0_GROUP_TSENSE 0xc +#define THERMCTL_LEVEL0_GROUP_CPU 0x0 +#define THERMCTL_LEVEL0_GROUP_GPU 0x4 +#define THERMCTL_LEVEL0_GROUP_MEM 0x8 +#define THERMCTL_LEVEL0_GROUP_TSENSE 0xc - #define TEGRA124_SOCTHERM_SENSOR_CPU 0 - #define TEGRA124_SOCTHERM_SENSOR_MEM 1 - #define TEGRA124_SOCTHERM_SENSOR_GPU 2 - #define TEGRA124_SOCTHERM_SENSOR_PLLX 3 - #define TEGRA124_SOCTHERM_SENSOR_NUM 4 +#define TEGRA124_SOCTHERM_SENSOR_CPU 0 +#define TEGRA124_SOCTHERM_SENSOR_MEM 1 +#define TEGRA124_SOCTHERM_SENSOR_GPU 2 +#define TEGRA124_SOCTHERM_SENSOR_PLLX 3 +#define TEGRA124_SOCTHERM_SENSOR_NUM 4 - #define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0 - #define TEGRA_SOCTHERM_THROT_LEVEL_LOW 1 - #define TEGRA_SOCTHERM_THROT_LEVEL_MED 2 - #define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3 +#define TEGRA_SOCTHERM_THROT_LEVEL_NONE 0 +#define TEGRA_SOCTHERM_THROT_LEVEL_LOW 1 +#define TEGRA_SOCTHERM_THROT_LEVEL_MED 2 +#define TEGRA_SOCTHERM_THROT_LEVEL_HIGH 3 - #define SENSOR_CONFIG2 8 - #define SENSOR_CONFIG2_THERMA_MASK (0xffffu << 16) - #define SENSOR_CONFIG2_THERMB_MASK 0xffff +#define SENSOR_CONFIG2 8 +#define SENSOR_CONFIG2_THERMA_MASK (0xffffu << 16) +#define SENSOR_CONFIG2_THERMB_MASK 0xffff - #define THERMCTL_THERMTRIP_CTL 0x80 +#define THERMCTL_THERMTRIP_CTL 0x80 - #define SENSOR_PDIV 0x1c0 - #define SENSOR_PDIV_CPU_MASK (0xf << 12) - #define SENSOR_PDIV_GPU_MASK (0xf << 8) - #define SENSOR_PDIV_MEM_MASK (0xf << 4) - #define SENSOR_PDIV_PLLX_MASK (0xf << 0) +#define SENSOR_PDIV 0x1c0 +#define SENSOR_PDIV_CPU_MASK (0xf << 12) +#define SENSOR_PDIV_GPU_MASK (0xf << 8) +#define SENSOR_PDIV_MEM_MASK (0xf << 4) +#define SENSOR_PDIV_PLLX_MASK (0xf << 0) - #define SENSOR_HOTSPOT_OFF 0x1c4 - #define SENSOR_HOTSPOT_CPU_MASK (0xff << 16) - #define SENSOR_HOTSPOT_GPU_MASK (0xff << 8) - #define SENSOR_HOTSPOT_MEM_MASK (0xff << 0) +#define SENSOR_HOTSPOT_OFF 0x1c4 +#define SENSOR_HOTSPOT_CPU_MASK (0xff << 16) +#define SENSOR_HOTSPOT_GPU_MASK (0xff << 8) +#define SENSOR_HOTSPOT_MEM_MASK (0xff << 0) - #define SENSOR_HW_PLLX_OFFSET_EN 0x1e4 - #define SENSOR_HW_PLLX_OFFSET_MEM_EN_MASK BIT(2) - #define SENSOR_HW_PLLX_OFFSET_CPU_EN_MASK BIT(1) - #define SENSOR_HW_PLLX_OFFSET_GPU_EN_MASK BIT(0) +#define SENSOR_HW_PLLX_OFFSET_EN 0x1e4 +#define SENSOR_HW_PLLX_OFFSET_MEM_EN_MASK BIT(2) +#define SENSOR_HW_PLLX_OFFSET_CPU_EN_MASK BIT(1) +#define SENSOR_HW_PLLX_OFFSET_GPU_EN_MASK BIT(0) - #define SENSOR_HW_PLLX_OFFSET_MIN 0x1e8 - #define SENSOR_HW_PLLX_OFFSET_MAX 0x1ec - #define SENSOR_HW_PLLX_OFFSET_MEM_MASK (0xff << 16) - #define SENSOR_HW_PLLX_OFFSET_GPU_MASK (0xff << 8) - #define SENSOR_HW_PLLX_OFFSET_CPU_MASK (0xff << 0) +#define SENSOR_HW_PLLX_OFFSET_MIN 0x1e8 +#define SENSOR_HW_PLLX_OFFSET_MAX 0x1ec +#define SENSOR_HW_PLLX_OFFSET_MEM_MASK (0xff << 16) +#define SENSOR_HW_PLLX_OFFSET_GPU_MASK (0xff << 8) +#define SENSOR_HW_PLLX_OFFSET_CPU_MASK (0xff << 0) - #define SENSOR_TEMP1 0x1c8 - #define SENSOR_TEMP1_CPU_TEMP_MASK (0xffffu << 16) - #define SENSOR_TEMP1_GPU_TEMP_MASK 0xffff - #define SENSOR_TEMP2 0x1cc - #define SENSOR_TEMP2_MEM_TEMP_MASK (0xffffu << 16) - #define SENSOR_TEMP2_PLLX_TEMP_MASK 0xffff +#define SENSOR_TEMP1 0x1c8 +#define SENSOR_TEMP1_CPU_TEMP_MASK (0xffffu << 16) +#define SENSOR_TEMP1_GPU_TEMP_MASK 0xffff +#define SENSOR_TEMP2 0x1cc +#define SENSOR_TEMP2_MEM_TEMP_MASK (0xffffu << 16) +#define SENSOR_TEMP2_PLLX_TEMP_MASK 0xffff - #define SENSOR_VALID 0x1e0 - #define SENSOR_GPU_VALID_MASK BIT(9) - #define SENSOR_CPU_VALID_MASK 0xf - #define SENSOR_MEM_VALID_MASK (0x3 << 10) +#define SENSOR_VALID 0x1e0 +#define SENSOR_GPU_VALID_MASK BIT(9) +#define SENSOR_CPU_VALID_MASK 0xf +#define SENSOR_MEM_VALID_MASK (0x3 << 10) - #define TEGRA210_THERMTRIP_ANY_EN_MASK (0x1u << 31) - #define TEGRA210_THERMTRIP_MEM_EN_MASK (0x1 << 30) - #define TEGRA210_THERMTRIP_GPU_EN_MASK (0x1 << 29) - #define TEGRA210_THERMTRIP_CPU_EN_MASK (0x1 << 28) - #define TEGRA210_THERMTRIP_TSENSE_EN_MASK (0x1 << 27) - #define TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK (0x1ff << 18) - #define TEGRA210_THERMTRIP_CPU_THRESH_MASK (0x1ff << 9) - #define TEGRA210_THERMTRIP_TSENSE_THRESH_MASK 0x1ff +#define TEGRA210_THERMTRIP_ANY_EN_MASK (0x1u << 31) +#define TEGRA210_THERMTRIP_MEM_EN_MASK (0x1 << 30) +#define TEGRA210_THERMTRIP_GPU_EN_MASK (0x1 << 29) +#define TEGRA210_THERMTRIP_CPU_EN_MASK (0x1 << 28) +#define TEGRA210_THERMTRIP_TSENSE_EN_MASK (0x1 << 27) +#define TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK (0x1ff << 18) +#define TEGRA210_THERMTRIP_CPU_THRESH_MASK (0x1ff << 9) +#define TEGRA210_THERMTRIP_TSENSE_THRESH_MASK 0x1ff - #define TEGRA210_THERM_IRQ_MEM_MASK (0x3 << 24) - #define TEGRA210_THERM_IRQ_GPU_MASK (0x3 << 16) - #define TEGRA210_THERM_IRQ_CPU_MASK (0x3 << 8) - #define TEGRA210_THERM_IRQ_TSENSE_MASK (0x3 << 0) +#define TEGRA210_THERM_IRQ_MEM_MASK (0x3 << 24) +#define TEGRA210_THERM_IRQ_GPU_MASK (0x3 << 16) +#define TEGRA210_THERM_IRQ_CPU_MASK (0x3 << 8) +#define TEGRA210_THERM_IRQ_TSENSE_MASK (0x3 << 0) - #define TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK (0x1ff << 18) - #define TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK (0x1ff << 9) +#define TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK (0x1ff << 18) +#define TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK (0x1ff << 9) - #define TEGRA210_THRESH_GRAIN 500 - #define TEGRA210_BPTT 9 +#define TEGRA210_THRESH_GRAIN 500 +#define TEGRA210_BPTT 9 - #define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff +#define FUSE_TSENSOR_CALIB_CP_TS_BASE_MASK 0x1fff - #define SENSOR_CONFIG0 0 - #define SENSOR_CONFIG0_STOP BIT(0) - #define SENSOR_CONFIG0_CPTR_OVER BIT(2) - #define SENSOR_CONFIG0_OVER BIT(3) - #define SENSOR_CONFIG0_TCALC_OVER BIT(4) - #define SENSOR_CONFIG0_TALL_MASK (0xfffff << 8) - #define SENSOR_CONFIG0_TALL_SHIFT 8 +#define SENSOR_CONFIG0 0 +#define SENSOR_CONFIG0_STOP BIT(0) +#define SENSOR_CONFIG0_CPTR_OVER BIT(2) +#define SENSOR_CONFIG0_OVER BIT(3) +#define SENSOR_CONFIG0_TCALC_OVER BIT(4) +#define SENSOR_CONFIG0_TALL_MASK (0xfffff << 8) +#define SENSOR_CONFIG0_TALL_SHIFT 8 - #define PDIV_RATE_T210B0 0xCC0C - #define PDIV_RATE_T210 0x8888 - #define HOTSPOT_VAL 0xA0500 +#define PDIV_RATE_T210B0 0xCC0C +#define PDIV_RATE_T210 0x8888 +#define HOTSPOT_VAL 0xA0500 - #define SENSOR_CONFIG1 4 - #define SENSOR_CONFIG1_TSAMPLE_MASK 0x3ff - #define SENSOR_CONFIG1_TSAMPLE_SHIFT 0 - #define SENSOR_CONFIG1_TIDDQ_EN_MASK (0x3f << 15) - #define SENSOR_CONFIG1_TIDDQ_EN_SHIFT 15 - #define SENSOR_CONFIG1_TEN_COUNT_MASK (0x3f << 24) - #define SENSOR_CONFIG1_TEN_COUNT_SHIFT 24 - #define SENSOR_CONFIG1_TEMP_ENABLE BIT(31) +#define SENSOR_CONFIG1 4 +#define SENSOR_CONFIG1_TSAMPLE_MASK 0x3ff +#define SENSOR_CONFIG1_TSAMPLE_SHIFT 0 +#define SENSOR_CONFIG1_TIDDQ_EN_MASK (0x3f << 15) +#define SENSOR_CONFIG1_TIDDQ_EN_SHIFT 15 +#define SENSOR_CONFIG1_TEN_COUNT_MASK (0x3f << 24) +#define SENSOR_CONFIG1_TEN_COUNT_SHIFT 24 +#define SENSOR_CONFIG1_TEMP_ENABLE BIT(31) - #define READBACK_VALUE_MASK 0xff00 - #define READBACK_VALUE_SHIFT 8 - #define READBACK_ADD_HALF BIT(7) - #define READBACK_NEGATE BIT(0) +#define READBACK_VALUE_MASK 0xff00 +#define READBACK_VALUE_SHIFT 8 +#define READBACK_ADD_HALF BIT(7) +#define READBACK_NEGATE BIT(0) - #define PDIV_MASK_T210B0 0xFFFF00F0 - #define HOTSPOT_MASK_T210B0 0xFF0000FF +#define PDIV_MASK_T210B0 0xFFFF00F0 +#define HOTSPOT_MASK_T210B0 0xFF0000FF - #define PDIV_MASK_T210 0xFFFF0000 - #define HOTSPOT_MASK_T210 0xFF000000 +#define PDIV_MASK_T210 0xFFFF0000 +#define HOTSPOT_MASK_T210 0xFF000000 - #define TSENSOR_TSENSOR_CLKEN 0x1DC - #define TSENSOR_TSENSOR_ENABLE 225 +#define TSENSOR_TSENSOR_CLKEN 0x1DC +#define TSENSOR_TSENSOR_ENABLE 225 const TSensorFuse tfuse = { - .fuse_base_cp_mask = 0x3ff << 11, - .fuse_base_cp_shift = 11, - .fuse_base_ft_mask = 0x7ffu << 21, - .fuse_base_ft_shift = 21, - .fuse_shift_ft_mask = 0x1f << 6, - .fuse_shift_ft_shift = 6, + .fuse_base_cp_mask = 0x3ff << 11, + .fuse_base_cp_shift = 11, + .fuse_base_ft_mask = 0x7ffu << 21, + .fuse_base_ft_shift = 21, + .fuse_shift_ft_mask = 0x1f << 6, + .fuse_shift_ft_shift = 6, .fuse_spare_realignment = 0, }; const TSensorConfig eristaConf = { - .tall = 16300, - .tiddq_en = 1, - .ten_count = 1, - .pdiv = 8, - .pdiv_ate = 8, - .tsample = 120, + .tall = 16300, + .tiddq_en = 1, + .ten_count = 1, + .pdiv = 8, + .pdiv_ate = 8, + .tsample = 120, .tsample_ate = 480, }; const TSensorConfig marikoConf = { - .tall = 16300, - .tiddq_en = 1, - .ten_count = 1, - .pdiv = 12, - .pdiv_ate = 6, - .tsample = 240, + .tall = 16300, + .tiddq_en = 1, + .ten_count = 1, + .pdiv = 12, + .pdiv_ate = 6, + .tsample = 240, .tsample_ate = 480, }; @@ -409,10 +411,11 @@ namespace tsensor { u32 calib[SocthermTSensor_EnumMax] = {}; u64 socthermVa, carVa, fuseVa; bool isMariko; - } + } // namespace bool IsDisabledThroughSleep() { - return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM); + return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || + !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM); } bool IsSensorEnabled() { @@ -454,14 +457,14 @@ namespace tsensor { EnableSensor(&marikoTSensors[i], i); } - pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210B0) | PDIV_RATE_T210B0; + pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210B0) | PDIV_RATE_T210B0; hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210B0) | HOTSPOT_VAL; } else { for (u32 i = 0; i < std::size(eristaTSensors); ++i) { EnableSensor(&eristaTSensors[i], i); } - pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210) | PDIV_RATE_T210; + pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210) | PDIV_RATE_T210; hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210) | HOTSPOT_VAL; } @@ -479,8 +482,8 @@ namespace tsensor { StartSensors(); } - temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); - temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); + temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16); + temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK); temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK); if (board::GetSocType() == HocClkSocType_Erista) { @@ -495,8 +498,8 @@ namespace tsensor { constexpr u64 SocthermPa = 0x700E2000, FusePa = 0x7000F000, CarPa = 0x60006000; R_UNLESS(MapAddress(socthermVa, SocthermPa, "soctherm")); - R_UNLESS(MapAddress( fuseVa, FusePa, "fuse")); - R_UNLESS(MapAddress( carVa, CarPa, "car")); + R_UNLESS(MapAddress(fuseVa, FusePa, "fuse")); + R_UNLESS(MapAddress(carVa, CarPa, "car")); WriteReg(carVa, CAR_CLK_SOURCE_TSENSOR, CAR_CLK_SOURCE_TSENSOR_VAL); SetBits(carVa, CAR_CLK_OUT_ENB_V, 0x10); @@ -507,11 +510,13 @@ namespace tsensor { if (isMariko) { for (u32 i = 0; i < std::size(marikoTSensors); ++i) { - CalcTSensorCalib(marikoTSensors[i].config, &sharedCal, &marikoTSensors[i].fuse_corr, &calib[i], marikoTSensors[i].calib_fuse_offset, fuseVa); + CalcTSensorCalib(marikoTSensors[i].config, &sharedCal, &marikoTSensors[i].fuse_corr, &calib[i], marikoTSensors[i].calib_fuse_offset, + fuseVa); } } else { for (u32 i = 0; i < std::size(eristaTSensors); ++i) { - CalcTSensorCalib(eristaTSensors[i].config, &sharedCal, &eristaTSensors[i].fuse_corr, &calib[i], eristaTSensors[i].calib_fuse_offset, fuseVa); + CalcTSensorCalib(eristaTSensors[i].config, &sharedCal, &eristaTSensors[i].fuse_corr, &calib[i], eristaTSensors[i].calib_fuse_offset, + fuseVa); } } @@ -520,4 +525,4 @@ namespace tsensor { fileUtils::LogLine("[Soctherm] Finished init."); } -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp index 02a292c9..df7a6f66 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/soctherm.hpp @@ -22,20 +22,21 @@ #pragma once -#include #include +#include + namespace tsensor { enum SocthermTSensor : u32 { - SocthermTSensor_CPU0 = 0, - SocthermTSensor_CPU1 = 1, - SocthermTSensor_CPU2 = 2, - SocthermTSensor_CPU3 = 3, - SocthermTSensor_GPU = 4, - SocthermTSensor_PLLX = 5, - SocthermTSensor_MEM0 = 6, - SocthermTSensor_MEM1 = 7, + SocthermTSensor_CPU0 = 0, + SocthermTSensor_CPU1 = 1, + SocthermTSensor_CPU2 = 2, + SocthermTSensor_CPU3 = 3, + SocthermTSensor_GPU = 4, + SocthermTSensor_PLLX = 5, + SocthermTSensor_MEM0 = 6, + SocthermTSensor_MEM1 = 7, SocthermTSensor_EnumMax = 8, }; @@ -49,4 +50,4 @@ namespace tsensor { void InitializeSoctherm(); void ReadTSensors(TSensorTemps &temps); -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp index 38bcb33b..85c43bdd 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp @@ -23,8 +23,10 @@ */ #include + #include "tsensor_common.hpp" + namespace tsensor { static s64 div64_s64(s64 dividend, s64 divisor) { @@ -42,7 +44,7 @@ namespace tsensor { static s32 sign_extend32(u32 value, int index) { u8 shift = 31 - index; - return (s32) (value << shift) >> shift; + return (s32)(value << shift) >> shift; } void CalcSharedCal(const TSensorFuse *tfuse, TSensorSharedCalib *shared, u64 fuseVa) { @@ -70,11 +72,11 @@ namespace tsensor { } void CalcTSensorCalib(const TSensorConfig *cfg, TSensorSharedCalib *shared, const FuseCorrCoeff *corr, u32 *calibration, u32 offset, u64 fuseVa) { - #define FUSE_TSENSOR_CALIB_FT_TS_BASE_SHIFT 13 - #define FUSE_TSENSOR_CALIB_FT_TS_BASE_MASK (0x1fff << 13) - #define CALIB_COEFFICIENT 1000000LL - #define SENSOR_CONFIG2_THERMA_SHIFT 16 - #define SENSOR_CONFIG2_THERMB_SHIFT 0 +#define FUSE_TSENSOR_CALIB_FT_TS_BASE_SHIFT 13 +#define FUSE_TSENSOR_CALIB_FT_TS_BASE_MASK (0x1fff << 13) +#define CALIB_COEFFICIENT 1000000LL +#define SENSOR_CONFIG2_THERMA_SHIFT 16 +#define SENSOR_CONFIG2_THERMB_SHIFT 0 u32 val, calib; s32 actual_tsensor_ft, actual_tsensor_cp; @@ -112,4 +114,4 @@ namespace tsensor { *calibration = calib; } -} \ No newline at end of file +} // namespace tsensor \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp index f219d761..a9bc8b99 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp @@ -26,8 +26,8 @@ namespace tsensor { - #define FUSE_TSENSOR_COMMON 0xA80 - #define FUSE_OFFSET 0x800 +#define FUSE_TSENSOR_COMMON 0xA80 +#define FUSE_OFFSET 0x800 struct TSensorConfig { u32 tall; @@ -96,27 +96,23 @@ namespace tsensor { u32 actual_temp_ft; }; - template - static inline T ReadReg(u64 base, u32 offset) { - return *reinterpret_cast(base + offset); + template static inline T ReadReg(u64 base, u32 offset) { + return *reinterpret_cast(base + offset); } - template - static inline void WriteReg(u64 base, u32 offset, T value) { - *reinterpret_cast(base + offset) = value; + template static inline void WriteReg(u64 base, u32 offset, T value) { + *reinterpret_cast(base + offset) = value; } - template - static inline void SetBits(u64 base, u32 offset, T mask) { + template static inline void SetBits(u64 base, u32 offset, T mask) { WriteReg(base, offset, ReadReg(base, offset) | mask); } - template - static inline void ClearBits(u64 base, u32 offset, T mask) { + template static inline void ClearBits(u64 base, u32 offset, T mask) { WriteReg(base, offset, ReadReg(base, offset) & ~mask); } void CalcSharedCal(const TSensorFuse *tfuse, TSensorSharedCalib *shared, u64 fuseVa); void CalcTSensorCalib(const TSensorConfig *cfg, TSensorSharedCalib *shared, const FuseCorrCoeff *corr, u32 *calibration, u32 offset, u64 fuseVa); -} +} // namespace tsensor diff --git a/Source/hoc-clk/sysmodule/src/util/crc32.cpp b/Source/hoc-clk/sysmodule/src/util/crc32.cpp index 608817d8..7588192f 100644 --- a/Source/hoc-clk/sysmodule/src/util/crc32.cpp +++ b/Source/hoc-clk/sysmodule/src/util/crc32.cpp @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #include @@ -20,7 +20,7 @@ namespace crc32 { uint32_t crc32(const uint8_t *data, size_t length) { uint32_t crc = 0xFFFFFFFF; - + for (size_t i = 0; i < length; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { @@ -36,11 +36,11 @@ namespace crc32 { perror("[crc32] Error opening file"); return 0; } - + uint8_t buffer[1024]; uint32_t crc = 0xFFFFFFFF; size_t bytes_read; - + while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) > 0) { for (size_t i = 0; i < bytes_read; i++) { crc ^= buffer[i]; @@ -49,8 +49,8 @@ namespace crc32 { } } } - + fclose(file); return ~crc; } -} +} // namespace crc32 diff --git a/Source/hoc-clk/sysmodule/src/util/crc32.h b/Source/hoc-clk/sysmodule/src/util/crc32.h index f4c5e2f5..05e1bc70 100644 --- a/Source/hoc-clk/sysmodule/src/util/crc32.h +++ b/Source/hoc-clk/sysmodule/src/util/crc32.h @@ -12,13 +12,13 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once -#include #include +#include namespace crc32 { uint32_t crc32(const uint8_t *data, size_t length); uint32_t checksum_file(const char *filename); -} +} // namespace crc32 diff --git a/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h b/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h index f2c9f60a..70045d0c 100644 --- a/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h +++ b/Source/hoc-clk/sysmodule/src/util/lockable_mutex.h @@ -12,9 +12,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ - + /* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , @@ -24,57 +24,49 @@ * -------------------------------------------------------------------------- */ - #pragma once #ifdef __cplusplus -#include -#include + #include + #include -class LockableMutex -{ -public: - LockableMutex() - { +class LockableMutex { + public: + LockableMutex() { mutexInit(&this->m); } - virtual ~LockableMutex() {} + virtual ~LockableMutex() { + } - void Lock() - { + void Lock() { mutexLock(&this->m); } - bool TryLock() - { + bool TryLock() { return mutexTryLock(&this->m); } - - void Unlock() - { + + void Unlock() { mutexUnlock(&this->m); } // snake_case aliases in order to implement Lockable - void lock() - { + void lock() { this->Lock(); } - bool try_lock() - { + bool try_lock() { return this->TryLock(); } - void unlock() - { + void unlock() { this->Unlock(); } -private: + private: Mutex m; }; diff --git a/Source/hoc-clk/sysmodule/src/util/memmem.c b/Source/hoc-clk/sysmodule/src/util/memmem.c index 33ff7e06..d62cf56b 100644 --- a/Source/hoc-clk/sysmodule/src/util/memmem.c +++ b/Source/hoc-clk/sysmodule/src/util/memmem.c @@ -24,60 +24,48 @@ #include "memmem.h" -void *memmem_impl(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) -{ - const unsigned char *cmpp; - const unsigned char *p; - const unsigned char *endp; - const unsigned char *q; - const unsigned char *endq; - unsigned char found; +void *memmem_impl(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { + const unsigned char *cmpp; + const unsigned char *p; + const unsigned char *endp; + const unsigned char *q; + const unsigned char *endq; + unsigned char found; - if(haystack == NULL) - { - return NULL; - } - if(needle == NULL) - { - return (void*)haystack; - } - if(haystacklen == 0) - { - return NULL; - } - if(needlelen == 0) - { - return (void*)haystack; - } + if (haystack == NULL) { + return NULL; + } + if (needle == NULL) { + return (void *)haystack; + } + if (haystacklen == 0) { + return NULL; + } + if (needlelen == 0) { + return (void *)haystack; + } - if(needlelen > haystacklen) - { - return NULL; - } + if (needlelen > haystacklen) { + return NULL; + } - endp = haystack + haystacklen - needlelen; - endq = needle + needlelen; - for(p = haystack; p <= endp; p++) - { - found = 1; - cmpp = p; - for(q = needle; q < endq; q++) - { - if(*cmpp != *q) - { - found = 0; - break; - } - else - { - cmpp++; - } - } - if(found) - { - return (void*)p; - } - } + endp = haystack + haystacklen - needlelen; + endq = needle + needlelen; + for (p = haystack; p <= endp; p++) { + found = 1; + cmpp = p; + for (q = needle; q < endq; q++) { + if (*cmpp != *q) { + found = 0; + break; + } else { + cmpp++; + } + } + if (found) { + return (void *)p; + } + } - return NULL; + return NULL; } diff --git a/Source/hoc-clk/sysmodule/src/util/memmem.h b/Source/hoc-clk/sysmodule/src/util/memmem.h index 0f791c1b..9beb9cdc 100644 --- a/Source/hoc-clk/sysmodule/src/util/memmem.h +++ b/Source/hoc-clk/sysmodule/src/util/memmem.h @@ -31,8 +31,7 @@ extern "C" { #endif -void *memmem_impl(const void *haystack, size_t haystacklen, - const void *needle, size_t needlelen); +void *memmem_impl(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #ifdef __cplusplus } diff --git a/Source/hoc-clk/sysmodule/src/util/service_guard.h b/Source/hoc-clk/sysmodule/src/util/service_guard.h index 96a348a5..d80a6638 100644 --- a/Source/hoc-clk/sysmodule/src/util/service_guard.h +++ b/Source/hoc-clk/sysmodule/src/util/service_guard.h @@ -12,7 +12,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #pragma once @@ -21,25 +21,23 @@ extern "C" { #endif -#include -#include #include -#include +#include #include +#include +#include typedef struct ServiceGuard { Mutex mutex; u32 refCount; } ServiceGuard; -NX_INLINE bool serviceGuardBeginInit(ServiceGuard* g) -{ +NX_INLINE bool serviceGuardBeginInit(ServiceGuard *g) { mutexLock(&g->mutex); return (g->refCount++) == 0; } -NX_INLINE Result serviceGuardEndInit(ServiceGuard* g, Result rc, void (*cleanupFunc)(void)) -{ +NX_INLINE Result serviceGuardEndInit(ServiceGuard *g, Result rc, void (*cleanupFunc)(void)) { if (R_FAILED(rc)) { cleanupFunc(); --g->refCount; @@ -48,32 +46,29 @@ NX_INLINE Result serviceGuardEndInit(ServiceGuard* g, Result rc, void (*cleanupF return rc; } -NX_INLINE void serviceGuardExit(ServiceGuard* g, void (*cleanupFunc)(void)) -{ +NX_INLINE void serviceGuardExit(ServiceGuard *g, void (*cleanupFunc)(void)) { mutexLock(&g->mutex); if (g->refCount && (--g->refCount) == 0) cleanupFunc(); mutexUnlock(&g->mutex); } -#define NX_GENERATE_SERVICE_GUARD_PARAMS(name, _paramdecl, _parampass) \ -\ -static ServiceGuard g_##name##Guard; \ -NX_INLINE Result _##name##Initialize _paramdecl; \ -static void _##name##Cleanup(void); \ -\ -Result name##Initialize _paramdecl \ -{ \ - Result rc = 0; \ - if (serviceGuardBeginInit(&g_##name##Guard)) \ - rc = _##name##Initialize _parampass; \ - return serviceGuardEndInit(&g_##name##Guard, rc, _##name##Cleanup); \ -} \ -\ -void name##Exit(void) \ -{ \ - serviceGuardExit(&g_##name##Guard, _##name##Cleanup); \ -} +#define NX_GENERATE_SERVICE_GUARD_PARAMS(name, _paramdecl, _parampass) \ + \ + static ServiceGuard g_##name##Guard; \ + NX_INLINE Result _##name##Initialize _paramdecl; \ + static void _##name##Cleanup(void); \ + \ + Result name##Initialize _paramdecl { \ + Result rc = 0; \ + if (serviceGuardBeginInit(&g_##name##Guard)) \ + rc = _##name##Initialize _parampass; \ + return serviceGuardEndInit(&g_##name##Guard, rc, _##name##Cleanup); \ + } \ + \ + void name##Exit(void) { \ + serviceGuardExit(&g_##name##Guard, _##name##Cleanup); \ + } #define NX_GENERATE_SERVICE_GUARD(name) NX_GENERATE_SERVICE_GUARD_PARAMS(name, (void), ()) diff --git a/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp b/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp index c57011fd..80687652 100644 Binary files a/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp and b/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp differ diff --git a/dist/atmosphere/exosphere.bin b/dist/atmosphere/exosphere.bin index 9315328e..147372e1 100755 Binary files a/dist/atmosphere/exosphere.bin and b/dist/atmosphere/exosphere.bin differ diff --git a/dist/atmosphere/kips/hoc.kip b/dist/atmosphere/kips/hoc.kip index 701024e6..7909e8db 100644 Binary files a/dist/atmosphere/kips/hoc.kip and b/dist/atmosphere/kips/hoc.kip differ diff --git a/dist/config/ultrahand/assets/notifications/hoc.rgba b/dist/config/ultrahand/assets/notifications/hoc.rgba index c39dbae2..dcb3812d 100644 Binary files a/dist/config/ultrahand/assets/notifications/hoc.rgba and b/dist/config/ultrahand/assets/notifications/hoc.rgba differ diff --git a/dist/switch/.overlays/Horizon-OC-Monitor.ovl b/dist/switch/.overlays/Horizon-OC-Monitor.ovl index a091cb59..2c572f78 100644 Binary files a/dist/switch/.overlays/Horizon-OC-Monitor.ovl and b/dist/switch/.overlays/Horizon-OC-Monitor.ovl differ diff --git a/dist/switch/.overlays/horizon-oc-overlay.ovl b/dist/switch/.overlays/horizon-oc-overlay.ovl index 7ae042c2..69e3caa3 100644 Binary files a/dist/switch/.overlays/horizon-oc-overlay.ovl and b/dist/switch/.overlays/horizon-oc-overlay.ovl differ