Merge branch 'integration' into merge-audio

This commit is contained in:
Blaz Kristan 2022-08-05 23:03:38 +02:00
commit 9270f80af2
10 changed files with 645 additions and 764 deletions

View File

@ -1958,7 +1958,7 @@ static const char _data_FX_MODE_PALETTE[] PROGMEM = "Palette@Cycle speed,;1,2,3;
// //
// Temperature is in arbitrary units from 0 (cold black) to 255 (white hot). // Temperature is in arbitrary units from 0 (cold black) to 255 (white hot).
// //
// This simulation scales it self a bit depending on NUM_LEDS; it should look // This simulation scales it self a bit depending on SEGLEN; it should look
// "OK" on anywhere from 20 to 100 LEDs without too much tweaking. // "OK" on anywhere from 20 to 100 LEDs without too much tweaking.
// //
// I recommend running this simulation at anywhere from 30-100 frames per second, // I recommend running this simulation at anywhere from 30-100 frames per second,
@ -3840,7 +3840,7 @@ uint16_t phased_base(uint8_t moder) { // We're making sine wave
for (int i = 0; i < SEGLEN; i++) { for (int i = 0; i < SEGLEN; i++) {
if (moder == 1) modVal = (inoise8(i*10 + i*10) /16); // Let's randomize our mod length with some Perlin noise. if (moder == 1) modVal = (inoise8(i*10 + i*10) /16); // Let's randomize our mod length with some Perlin noise.
uint16_t val = (i+1) * allfreq; // This sets the frequency of the waves. The +1 makes sure that leds[0] is used. uint16_t val = (i+1) * allfreq; // This sets the frequency of the waves. The +1 makes sure that led 0 is used.
if (modVal == 0) modVal = 1; if (modVal == 0) modVal = 1;
val += *phase * (i % modVal +1) /2; // This sets the varying phase change of the waves. By Andrew Tuline. val += *phase * (i % modVal +1) /2; // This sets the varying phase change of the waves. By Andrew Tuline.
uint8_t b = cubicwave8(val); // Now we make an 8 bit sinewave. uint8_t b = cubicwave8(val); // Now we make an 8 bit sinewave.
@ -4831,10 +4831,9 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t rows = SEGMENT.virtualHeight();
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize*2 + sizeof(unsigned long))) return mode_static(); //allocation failed if (!SEGENV.allocateData(dataSize + sizeof(unsigned long))) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data); CRGB *prevLeds = reinterpret_cast<CRGB*>(SEGENV.data);
CRGB *prevLeds = reinterpret_cast<CRGB*>(SEGENV.data + dataSize); unsigned long *resetMillis = reinterpret_cast<unsigned long*>(SEGENV.data + dataSize); // triggers reset
unsigned long *resetMillis = reinterpret_cast<unsigned long*>(SEGENV.data + 2*dataSize); // triggers reset
CRGB backgroundColor = SEGCOLOR(1); CRGB backgroundColor = SEGCOLOR(1);
@ -4847,19 +4846,20 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) { for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) {
uint8_t state = random8()%2; uint8_t state = random8()%2;
if (state == 0) if (state == 0)
leds[XY(x,y)] = backgroundColor; SEGMENT.setPixelColorXY(x,y, backgroundColor);
else else
leds[XY(x,y)] = (CRGB)SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0); SEGMENT.setPixelColorXY(x,y, SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0));
} }
SEGMENT.fill_solid(prevLeds, CRGB::Black); for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) prevLeds[XY(x,y)] = CRGB::Black;
SEGENV.aux1 = 0; SEGENV.aux1 = 0;
SEGENV.aux0 = 0xFFFF; SEGENV.aux0 = 0xFFFF;
} }
//copy previous leds (save previous generation) //copy previous leds (save previous generation)
for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) prevLeds[XY(x,y)] = leds[XY(x,y)]; for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) prevLeds[XY(x,y)] = SEGMENT.getPixelColorXY(x,y);
//calculate new leds //calculate new leds
for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) { for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) {
@ -4891,29 +4891,30 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
} // i,j } // i,j
// Rules of Life // Rules of Life
if ((leds[XY(x,y)] != backgroundColor) && (neighbors < 2)) leds[XY(x,y)] = backgroundColor; // Loneliness uint32_t col = SEGMENT.getPixelColorXY(x,y);
else if ((leds[XY(x,y)] != backgroundColor) && (neighbors > 3)) leds[XY(x,y)] = backgroundColor; // Overpopulation uint32_t bgc = RGBW32(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0);
else if ((leds[XY(x,y)] == backgroundColor) && (neighbors == 3)) { // Reproduction if ((col != bgc) && (neighbors < 2)) SEGMENT.setPixelColorXY(x,y, bgc); // Loneliness
else if ((col != bgc) && (neighbors > 3)) SEGMENT.setPixelColorXY(x,y, bgc); // Overpopulation
else if ((col == bgc) && (neighbors == 3)) { // Reproduction
//find dominantcolor and assign to cell //find dominantcolor and assign to cell
colorCount dominantColorCount = {backgroundColor, 0}; colorCount dominantColorCount = {backgroundColor, 0};
for (int i=0; i<9 && colorsCount[i].count != 0; i++) for (int i=0; i<9 && colorsCount[i].count != 0; i++)
if (colorsCount[i].count > dominantColorCount.count) dominantColorCount = colorsCount[i]; if (colorsCount[i].count > dominantColorCount.count) dominantColorCount = colorsCount[i];
if (dominantColorCount.count > 0) leds[XY(x,y)] = dominantColorCount.color; //assign the dominant color if (dominantColorCount.count > 0) SEGMENT.setPixelColorXY(x,y, dominantColorCount.color); //assign the dominant color
} }
// else do nothing! // else do nothing!
} //x,y } //x,y
// calculate CRC16 of leds[] // calculate CRC16 of leds
uint16_t crc = crc16((const unsigned char*)leds, dataSize-1); uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize-1); //ewowi: prevLeds instead of leds work as well, tbd: compare more patterns, see SR!
// check if we had same CRC and reset if needed // check if we had same CRC and reset if needed
// same CRC would mean image did not change or was repeating itself // same CRC would mean image did not change or was repeating itself
if (!(crc == SEGENV.aux0 || crc == SEGENV.aux1)) *resetMillis = strip.now; //if no repetition avoid reset if (!(crc == SEGENV.aux0 || crc == SEGENV.aux1)) *resetMillis = strip.now; //if no repetition avoid reset
// remeber last two // remember last two
SEGENV.aux1 = SEGENV.aux0; SEGENV.aux1 = SEGENV.aux0;
SEGENV.aux0 = crc; SEGENV.aux0 = crc;
SEGMENT.setPixels(leds);
return (SEGMENT.getOption(SEG_OPTION_TRANSITIONAL)) ? FRAMETIME : FRAMETIME_FIXED * (128-(SEGMENT.speed>>1)); // update only when appropriate time passes (in 42 FPS slots) return (SEGMENT.getOption(SEG_OPTION_TRANSITIONAL)) ? FRAMETIME : FRAMETIME_FIXED * (128-(SEGMENT.speed>>1)); // update only when appropriate time passes (in 42 FPS slots)
} // mode_2Dgameoflife() } // mode_2Dgameoflife()
static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!,;!,!;!;2d"; static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!,;!,!;!;2d";
@ -5050,7 +5051,7 @@ uint16_t mode_2DJulia(void) { // An animated Julia set
} }
y += dy; y += dy;
} }
// blur2d( leds, 64); // SEGMENT.blur(64);
return FRAMETIME; return FRAMETIME;
} // mode_2DJulia() } // mode_2DJulia()
@ -5201,7 +5202,6 @@ uint16_t mode_2Dmetaballs(void) { // Metaballs by Stefan Petrick. Cannot have
} }
} }
//setPixels(leds);
return FRAMETIME; return FRAMETIME;
} // mode_2Dmetaballs() } // mode_2Dmetaballs()
static const char _data_FX_MODE_2DMETABALLS[] PROGMEM = "Metaballs@Speed;!,!,!;!;2d"; static const char _data_FX_MODE_2DMETABALLS[] PROGMEM = "Metaballs@Speed;!,!,!;!;2d";
@ -5605,10 +5605,10 @@ uint16_t mode_2Dcrazybees(void) {
SEGMENT.fadeToBlackBy(32); SEGMENT.fadeToBlackBy(32);
for (size_t i = 0; i < n; i++) { for (size_t i = 0; i < n; i++) {
SEGMENT.addPixelColorXY(bee[i].aimX + 1, bee[i].aimY, CRGB(CHSV(bee[i].hue, 255, 255))); SEGMENT.addPixelColorXY(bee[i].aimX + 1, bee[i].aimY, CHSV(bee[i].hue, 255, 255));
SEGMENT.addPixelColorXY(bee[i].aimX, bee[i].aimY + 1, CRGB(CHSV(bee[i].hue, 255, 255))); SEGMENT.addPixelColorXY(bee[i].aimX, bee[i].aimY + 1, CHSV(bee[i].hue, 255, 255));
SEGMENT.addPixelColorXY(bee[i].aimX - 1, bee[i].aimY, CRGB(CHSV(bee[i].hue, 255, 255))); SEGMENT.addPixelColorXY(bee[i].aimX - 1, bee[i].aimY, CHSV(bee[i].hue, 255, 255));
SEGMENT.addPixelColorXY(bee[i].aimX, bee[i].aimY - 1, CRGB(CHSV(bee[i].hue, 255, 255))); SEGMENT.addPixelColorXY(bee[i].aimX, bee[i].aimY - 1, CHSV(bee[i].hue, 255, 255));
if (bee[i].posX != bee[i].aimX || bee[i].posY != bee[i].aimY) { if (bee[i].posX != bee[i].aimX || bee[i].posY != bee[i].aimY) {
SEGMENT.setPixelColorXY(bee[i].posX, bee[i].posY, CRGB(CHSV(bee[i].hue, 60, 255))); SEGMENT.setPixelColorXY(bee[i].posX, bee[i].posY, CRGB(CHSV(bee[i].hue, 60, 255)));
int8_t error2 = bee[i].error * 2; int8_t error2 = bee[i].error * 2;
@ -5953,11 +5953,13 @@ uint16_t mode_ripplepeak(void) { // * Ripple peak. By Andrew Tuli
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t samplePeak = *(uint8_t*)um_data->u_data[3]; uint8_t samplePeak = *(uint8_t*)um_data->u_data[3];
#ifdef ESP32
float FFT_MajorPeak = *(float*) um_data->u_data[4]; float FFT_MajorPeak = *(float*) um_data->u_data[4];
#endif
uint8_t *maxVol = (uint8_t*)um_data->u_data[6]; uint8_t *maxVol = (uint8_t*)um_data->u_data[6];
uint8_t *binNum = (uint8_t*)um_data->u_data[7]; uint8_t *binNum = (uint8_t*)um_data->u_data[7];
@ -6024,16 +6026,15 @@ uint16_t mode_2DSwirl(void) {
const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t cols = SEGMENT.virtualWidth();
const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t rows = SEGMENT.virtualHeight();
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed if (SEGENV.call == 0) {
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data); SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); }
const uint8_t borderWidth = 2; const uint8_t borderWidth = 2;
SEGMENT.blur2d(leds, SEGMENT.custom1); SEGMENT.blur(SEGMENT.custom1);
uint8_t i = beatsin8( 27*SEGMENT.speed/255, borderWidth, cols - borderWidth); uint8_t i = beatsin8( 27*SEGMENT.speed/255, borderWidth, cols - borderWidth);
uint8_t j = beatsin8( 41*SEGMENT.speed/255, borderWidth, rows - borderWidth); uint8_t j = beatsin8( 41*SEGMENT.speed/255, borderWidth, rows - borderWidth);
@ -6043,7 +6044,7 @@ uint16_t mode_2DSwirl(void) {
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; //ewowi: use instead of sampleAvg??? float volumeSmth = *(float*) um_data->u_data[0]; //ewowi: use instead of sampleAvg???
@ -6051,14 +6052,13 @@ uint16_t mode_2DSwirl(void) {
// printUmData(); // printUmData();
leds[XY( i, j)] += ColorFromPalette(SEGPALETTE, (ms / 11 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 11, 200, 255); SEGMENT.addPixelColorXY( i, j, ColorFromPalette(SEGPALETTE, (ms / 11 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND)); //CHSV( ms / 11, 200, 255);
leds[XY( j, i)] += ColorFromPalette(SEGPALETTE, (ms / 13 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 13, 200, 255); SEGMENT.addPixelColorXY( j, i, ColorFromPalette(SEGPALETTE, (ms / 13 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND)); //CHSV( ms / 13, 200, 255);
leds[XY(ni, nj)] += ColorFromPalette(SEGPALETTE, (ms / 17 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 17, 200, 255); SEGMENT.addPixelColorXY(ni,nj, ColorFromPalette(SEGPALETTE, (ms / 17 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND)); //CHSV( ms / 17, 200, 255);
leds[XY(nj, ni)] += ColorFromPalette(SEGPALETTE, (ms / 29 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 29, 200, 255); SEGMENT.addPixelColorXY(nj,ni, ColorFromPalette(SEGPALETTE, (ms / 29 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND)); //CHSV( ms / 29, 200, 255);
leds[XY( i, nj)] += ColorFromPalette(SEGPALETTE, (ms / 37 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 37, 200, 255); SEGMENT.addPixelColorXY( i,nj, ColorFromPalette(SEGPALETTE, (ms / 37 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND)); //CHSV( ms / 37, 200, 255);
leds[XY(ni, j)] += ColorFromPalette(SEGPALETTE, (ms / 41 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 41, 200, 255); SEGMENT.addPixelColorXY(ni, j, ColorFromPalette(SEGPALETTE, (ms / 41 + volumeSmth*4), volumeRaw * SEGMENT.intensity / 64, LINEARBLEND)); //CHSV( ms / 41, 200, 255);
SEGMENT.setPixels(leds);
return FRAMETIME; return FRAMETIME;
} // mode_2DSwirl() } // mode_2DSwirl()
static const char _data_FX_MODE_2DSWIRL[] PROGMEM = "Swirl@!,Sensitivity,Blur;,Bg Swirl;!;ix=64ssim=0,2d,vo"; // Beatsin static const char _data_FX_MODE_2DSWIRL[] PROGMEM = "Swirl@!,Sensitivity,Blur;,Bg Swirl;!;ix=64ssim=0,2d,vo"; // Beatsin
@ -6073,23 +6073,20 @@ uint16_t mode_2DWaverly(void) {
const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t cols = SEGMENT.virtualWidth();
const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t rows = SEGMENT.virtualHeight();
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
if (SEGENV.call == 0) { if (SEGENV.call == 0) {
SEGMENT.fill_solid(leds, CRGB::Black); SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
} }
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
SEGMENT.fadeToBlackBy(leds, SEGMENT.speed); SEGMENT.fadeToBlackBy(SEGMENT.speed);
long t = millis() / 2; long t = millis() / 2;
for (int i = 0; i < cols; i++) { for (int i = 0; i < cols; i++) {
@ -6101,14 +6098,13 @@ uint16_t mode_2DWaverly(void) {
} }
uint16_t thisMax = map(thisVal, 0, 512, 0, rows); uint16_t thisMax = map(thisVal, 0, 512, 0, rows);
for (int j = 0; j < thisMax; j++) { for (uint16_t j = 0; j < thisMax; j++) {
leds[XY(i, j)] += ColorFromPalette(SEGPALETTE, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND); SEGMENT.addPixelColorXY(i, j, ColorFromPalette(SEGPALETTE, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND));
leds[XY((cols - 1) - i, (rows - 1) - j)] += ColorFromPalette(SEGPALETTE, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND); SEGMENT.addPixelColorXY((cols - 1) - i, (rows - 1) - j, ColorFromPalette(SEGPALETTE, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND));
} }
} }
SEGMENT.blur2d(leds, 16); SEGMENT.blur(16);
SEGMENT.setPixels(leds);
return FRAMETIME; return FRAMETIME;
} // mode_2DWaverly() } // mode_2DWaverly()
static const char _data_FX_MODE_2DWAVERLY[] PROGMEM = "Waverly@Amplification,Sensitivity;;!;ix=64,ssim=0,2d,vo"; // Beatsin static const char _data_FX_MODE_2DWAVERLY[] PROGMEM = "Waverly@Amplification,Sensitivity;;!;ix=64,ssim=0,2d,vo"; // Beatsin
@ -6137,7 +6133,7 @@ uint16_t mode_gravcenter(void) { // Gravcenter. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6184,7 +6180,7 @@ uint16_t mode_gravcentric(void) { // Gravcentric. By Andrew
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6234,7 +6230,7 @@ uint16_t mode_gravimeter(void) { // Gravmeter. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6274,7 +6270,7 @@ static const char _data_FX_MODE_GRAVIMETER[] PROGMEM = "Gravimeter@Rate of fall,
uint16_t mode_juggles(void) { // Juggles. By Andrew Tuline. uint16_t mode_juggles(void) { // Juggles. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6296,18 +6292,18 @@ static const char _data_FX_MODE_JUGGLES[] PROGMEM = "Juggles@!,# of balls;,!;!;m
////////////////////// //////////////////////
uint16_t mode_matripix(void) { // Matripix. By Andrew Tuline. uint16_t mode_matripix(void) { // Matripix. By Andrew Tuline.
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment // even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
int16_t volumeRaw = *(int16_t*)um_data->u_data[1]; int16_t volumeRaw = *(int16_t*)um_data->u_data[1];
if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); if (SEGENV.call == 0) {
SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
}
uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16;
if(SEGENV.aux0 != secondHand) { if(SEGENV.aux0 != secondHand) {
@ -6317,7 +6313,6 @@ uint16_t mode_matripix(void) { // Matripix. By Andrew Tuline.
for (uint16_t i=0; i<SEGLEN-1; i++) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); // shift left for (uint16_t i=0; i<SEGLEN-1; i++) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); // shift left
SEGMENT.setPixelColor(SEGLEN-1, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0), pixBri)); SEGMENT.setPixelColor(SEGLEN-1, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0), pixBri));
} }
for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i, leds[i]);
return FRAMETIME; return FRAMETIME;
} // mode_matripix() } // mode_matripix()
@ -6332,7 +6327,7 @@ uint16_t mode_midnoise(void) { // Midnoise. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6371,7 +6366,7 @@ uint16_t mode_noisefire(void) { // Noisefire. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6399,7 +6394,7 @@ uint16_t mode_noisemeter(void) { // Noisemeter. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
@ -6430,18 +6425,15 @@ static const char _data_FX_MODE_NOISEMETER[] PROGMEM = "Noisemeter@Fade rate,Wid
////////////////////// //////////////////////
uint16_t mode_pixelwave(void) { // Pixelwave. By Andrew Tuline. uint16_t mode_pixelwave(void) { // Pixelwave. By Andrew Tuline.
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment // even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
if (SEGENV.call == 0) { if (SEGENV.call == 0) {
SEGMENT.fill_solid(leds, CRGB::Black); // clear buffer SEGMENT.setUpLeds();
SEGMENT.fill(BLACK); // clear output SEGMENT.fill(BLACK);
} }
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
int16_t volumeRaw = *(int16_t*)um_data->u_data[1]; int16_t volumeRaw = *(int16_t*)um_data->u_data[1];
@ -6452,11 +6444,10 @@ uint16_t mode_pixelwave(void) { // Pixelwave. By Andrew Tuline.
int pixBri = volumeRaw * SEGMENT.intensity / 64; int pixBri = volumeRaw * SEGMENT.intensity / 64;
leds[SEGLEN/2] = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0), pixBri); SEGMENT.setPixelColor(SEGLEN/2, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0), pixBri));
for (int i=SEGLEN-1; i>SEGLEN/2; i--) leds[i] = leds[i-1]; // Move to the right. for (int i = SEGLEN - 1; i > SEGLEN/2; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); //move to the left
for (int i=0; i<SEGLEN/2; i++) leds[i] = leds[i+1]; // Move to the left. for (int i = 0; i < SEGLEN/2; i++) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); // move to the right
} }
for (int x = 0; x < SEGLEN; x++) SEGMENT.setPixelColor(x, leds[x]);
return FRAMETIME; return FRAMETIME;
} // mode_pixelwave() } // mode_pixelwave()
@ -6473,19 +6464,17 @@ typedef struct Plasphase {
uint16_t mode_plasmoid(void) { // Plasmoid. By Andrew Tuline. uint16_t mode_plasmoid(void) { // Plasmoid. By Andrew Tuline.
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment // even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled if (!SEGENV.allocateData(sizeof(plasphase))) return mode_static(); //allocation failed
if (!SEGENV.allocateData(dataSize + sizeof(plasphase))) return mode_static(); //allocation failed Plasphase* plasmoip = reinterpret_cast<Plasphase*>(SEGENV.data);
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
Plasphase* plasmoip = reinterpret_cast<Plasphase*>(SEGENV.data + dataSize);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
SEGMENT.fadeToBlackBy(leds, 64); SEGMENT.fadeToBlackBy(64);
plasmoip->thisphase += beatsin8(6,-4,4); // You can change direction and speed individually. plasmoip->thisphase += beatsin8(6,-4,4); // You can change direction and speed individually.
plasmoip->thatphase += beatsin8(7,-4,4); // Two phase values to make a complex pattern. By Andrew Tuline. plasmoip->thatphase += beatsin8(7,-4,4); // Two phase values to make a complex pattern. By Andrew Tuline.
@ -6498,9 +6487,8 @@ uint16_t mode_plasmoid(void) { // Plasmoid. By Andrew Tuline.
uint8_t colorIndex=thisbright; uint8_t colorIndex=thisbright;
if (volumeSmth * SEGMENT.intensity / 64 < thisbright) {thisbright = 0;} if (volumeSmth * SEGMENT.intensity / 64 < thisbright) {thisbright = 0;}
leds[i] += color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(colorIndex, false, PALETTE_SOLID_WRAP, 0), thisbright); SEGMENT.addPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(colorIndex, false, PALETTE_SOLID_WRAP, 0), thisbright));
} }
for (int x = 0; x < SEGLEN; x++) SEGMENT.setPixelColor(x, leds[x]);
return FRAMETIME; return FRAMETIME;
} // mode_plasmoid() } // mode_plasmoid()
@ -6519,7 +6507,7 @@ uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t samplePeak = *(uint8_t*)um_data->u_data[3]; uint8_t samplePeak = *(uint8_t*)um_data->u_data[3];
@ -6563,7 +6551,7 @@ uint16_t mode_puddles(void) { // Puddles. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
int16_t volumeRaw = *(int16_t*)um_data->u_data[1]; int16_t volumeRaw = *(int16_t*)um_data->u_data[1];
@ -6625,36 +6613,29 @@ static const char _data_FX_MODE_PIXELS[] PROGMEM = "Pixels@Fade rate,# of pixels
////////////////////// //////////////////////
uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline. uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment // even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
if (!fftResult) return mode_static();
if (SEGENV.call == 0) { if (SEGENV.call == 0) {
SEGMENT.fill_solid(leds, CRGB::Black); SEGMENT.fill(BLACK);
SEGMENT.fill(BLACK); // clear canvas
SEGENV.aux0 = 0; SEGENV.aux0 = 0;
} }
SEGMENT.fade_out(SEGMENT.speed); // do not fade leds[] but only canvas SEGMENT.fade_out(SEGMENT.speed);
SEGENV.step += FRAMETIME; SEGENV.step += FRAMETIME;
if (SEGENV.step > SPEED_FORMULA_L) { if (SEGENV.step > SPEED_FORMULA_L) {
uint16_t segLoc = random16(SEGLEN); uint16_t segLoc = random16(SEGLEN);
leds[segLoc] = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(2*fftResult[SEGENV.aux0%16]*240/(SEGLEN-1), false, PALETTE_SOLID_WRAP, 0), 2*fftResult[SEGENV.aux0%16]); SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(2*fftResult[SEGENV.aux0%16]*240/(SEGLEN-1), false, PALETTE_SOLID_WRAP, 0), 2*fftResult[SEGENV.aux0%16]));
++(SEGENV.aux0) %= 16; // make sure it doesn't cross 16 ++(SEGENV.aux0) %= 16; // make sure it doesn't cross 16
SEGENV.step = 1; SEGENV.step = 1;
if (SEGMENT.is2D()) SEGMENT.blur2d(leds, SEGMENT.intensity); SEGMENT.blur(SEGMENT.intensity);
else SEGMENT.blur1d(leds, SEGMENT.intensity);
for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i, leds[i]);
} }
return FRAMETIME; return FRAMETIME;
@ -6666,33 +6647,31 @@ static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz@Fade rate,Blur amount;!
// ** DJLight // // ** DJLight //
///////////////////////// /////////////////////////
uint16_t mode_DJLight(void) { // Written by ??? Adapted by Will Tatam. uint16_t mode_DJLight(void) { // Written by ??? Adapted by Will Tatam.
const int NUM_LEDS = SEGLEN; // aka SEGLEN const int mid = SEGLEN / 2;
const int mid = NUM_LEDS / 2;
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
if (!fftResult) return mode_static();
if (SEGENV.call == 0) {
SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
}
uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 64; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 64;
if (SEGENV.aux0 != secondHand) { // Triggered millis timing. if (SEGENV.aux0 != secondHand) { // Triggered millis timing.
SEGENV.aux0 = secondHand; SEGENV.aux0 = secondHand;
leds[mid] = CRGB(fftResult[15]/2, fftResult[5]/2, fftResult[0]/2); // 16-> 15 as 16 is out of bounds SEGMENT.setPixelColor(mid, CRGB(fftResult[15]/2, fftResult[5]/2, fftResult[0]/2)); // 16-> 15 as 16 is out of bounds
leds[mid].fadeToBlackBy(map(fftResult[1*4], 0, 255, 255, 10)); // TODO - Update CRGB color = SEGMENT.getPixelColor(mid);
SEGMENT.setPixelColor(mid, color.fadeToBlackBy(map(fftResult[1*4], 0, 255, 255, 10))); // TODO - Update
for (int i = NUM_LEDS - 1; i > mid; i--) leds[i] = leds[i - 1]; //move to the left for (int i = SEGLEN - 1; i > mid; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); //move to the left
for (int i = 0; i < mid; i++) leds[i] = leds[i + 1]; // move to the right for (int i = 0; i < mid; i++) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); // move to the right
} }
for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i, leds[i]);
return FRAMETIME; return FRAMETIME;
} // mode_DJLight() } // mode_DJLight()
@ -6708,7 +6687,7 @@ uint16_t mode_freqmap(void) { // Map FFT_MajorPeak to SEGLEN.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float FFT_MajorPeak = *(float*) um_data->u_data[4]; float FFT_MajorPeak = *(float*) um_data->u_data[4];
@ -6733,19 +6712,19 @@ static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting
// ** Freqmatrix // // ** Freqmatrix //
/////////////////////// ///////////////////////
uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Pleschung. uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Pleschung.
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float FFT_MajorPeak = *(float*)um_data->u_data[4]; float FFT_MajorPeak = *(float*)um_data->u_data[4];
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
if (SEGENV.call == 0) {
SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
}
uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16;
if(SEGENV.aux0 != secondHand) { if(SEGENV.aux0 != secondHand) {
SEGENV.aux0 = secondHand; SEGENV.aux0 = secondHand;
@ -6775,10 +6754,9 @@ uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Plesch
} }
// shift the pixels one pixel up // shift the pixels one pixel up
leds[0] = color; SEGMENT.setPixelColor(0, color);
for (int i = SEGLEN-1; i > 0; i--) leds[i] = leds[i-1]; for (int i = SEGLEN - 1; i > 0; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); //move to the left
} }
for (int x = 0; x < SEGLEN; x++) SEGMENT.setPixelColor(x, leds[x]);
return FRAMETIME; return FRAMETIME;
} // mode_freqmatrix() } // mode_freqmatrix()
@ -6795,7 +6773,7 @@ static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,So
uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline. uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float FFT_MajorPeak = *(float*) um_data->u_data[4]; float FFT_MajorPeak = *(float*) um_data->u_data[4];
@ -6831,19 +6809,19 @@ static const char _data_FX_MODE_FREQPIXELS[] PROGMEM = "Freqpixels@Fade rate,Sta
// As a compromise between speed and accuracy we are currently sampling with 10240Hz, from which we can then determine with a 512bin FFT our max frequency is 5120Hz. // As a compromise between speed and accuracy we are currently sampling with 10240Hz, from which we can then determine with a 512bin FFT our max frequency is 5120Hz.
// Depending on the music stream you have you might find it useful to change the frequency mapping. // Depending on the music stream you have you might find it useful to change the frequency mapping.
uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschung. uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschung.
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float FFT_MajorPeak = *(float*) um_data->u_data[4]; float FFT_MajorPeak = *(float*) um_data->u_data[4];
float volumeSmth = *(float*) um_data->u_data[0]; float volumeSmth = *(float*) um_data->u_data[0];
if (SEGENV.call == 0) {
SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
}
uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16;
if(SEGENV.aux0 != secondHand) { if(SEGENV.aux0 != secondHand) {
SEGENV.aux0 = secondHand; SEGENV.aux0 = secondHand;
@ -6875,13 +6853,12 @@ uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschun
color = CHSV(i, 240, (uint8_t)b); // implicit conversion to RGB supplied by FastLED color = CHSV(i, 240, (uint8_t)b); // implicit conversion to RGB supplied by FastLED
} }
leds[SEGLEN/2] = color; SEGMENT.setPixelColor(SEGLEN/2, color);
// shift the pixels one pixel outwards // shift the pixels one pixel outwards
for (int i=SEGLEN-1; i>SEGLEN/2; i--) leds[i] = leds[i-1]; // Move to the right. for (int i = SEGLEN - 1; i > SEGLEN/2; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); //move to the left
for (int i=0; i<SEGLEN/2; i++) leds[i] = leds[i+1]; // Move to the left. for (int i = 0; i < SEGLEN/2; i++) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); // move to the right
} }
for (int x = 0; x < SEGLEN; x++) SEGMENT.setPixelColor(x, leds[x]);
return FRAMETIME; return FRAMETIME;
} // mode_freqwave() } // mode_freqwave()
@ -6899,7 +6876,7 @@ uint16_t mode_gravfreq(void) { // Gravfreq. By Andrew Tuline.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float FFT_MajorPeak = *(float*) um_data->u_data[4]; float FFT_MajorPeak = *(float*) um_data->u_data[4];
@ -6944,11 +6921,10 @@ static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sens
uint16_t mode_noisemove(void) { // Noisemove. By: Andrew Tuline uint16_t mode_noisemove(void) { // Noisemove. By: Andrew Tuline
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
if (!fftResult) return mode_static();
SEGMENT.fade_out(224); // Just in case something doesn't get faded. SEGMENT.fade_out(224); // Just in case something doesn't get faded.
@ -6968,20 +6944,15 @@ static const char _data_FX_MODE_NOISEMOVE[] PROGMEM = "Noisemove@Speed of perlin
// ** Rocktaves // // ** Rocktaves //
////////////////////// //////////////////////
uint16_t mode_rocktaves(void) { // Rocktaves. Same note from each octave is same colour. By: Andrew Tuline uint16_t mode_rocktaves(void) { // Rocktaves. Same note from each octave is same colour. By: Andrew Tuline
// even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
float FFT_MajorPeak = *(float*) um_data->u_data[4]; float FFT_MajorPeak = *(float*) um_data->u_data[4];
float my_magnitude = *(float*) um_data->u_data[5] / 16.0f; float my_magnitude = *(float*) um_data->u_data[5] / 16.0f;
SEGMENT.fadeToBlackBy(leds, 64); // Just in case something doesn't get faded. SEGMENT.fadeToBlackBy(64); // Just in case something doesn't get faded.
float frTemp = FFT_MajorPeak; float frTemp = FFT_MajorPeak;
uint8_t octCount = 0; // Octave counter. uint8_t octCount = 0; // Octave counter.
@ -6997,10 +6968,8 @@ uint16_t mode_rocktaves(void) { // Rocktaves. Same note from eac
frTemp -=132; // This should give us a base musical note of C3 frTemp -=132; // This should give us a base musical note of C3
frTemp = fabs(frTemp * 2.1); // Fudge factors to compress octave range starting at 0 and going to 255; frTemp = fabs(frTemp * 2.1); // Fudge factors to compress octave range starting at 0 and going to 255;
// leds[beatsin8(8+octCount*4,0,SEGLEN-1,0,octCount*8)] += CHSV((uint8_t)frTemp,255,volTemp); // Back and forth with different frequencies and phase shift depending on current octave.
uint16_t i = map(beatsin8(8+octCount*4, 0, 255, 0, octCount*8), 0, 255, 0, SEGLEN-1); uint16_t i = map(beatsin8(8+octCount*4, 0, 255, 0, octCount*8), 0, 255, 0, SEGLEN-1);
leds[i] += color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint8_t)frTemp, false, PALETTE_SOLID_WRAP, 0), volTemp); SEGMENT.addPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint8_t)frTemp, false, PALETTE_SOLID_WRAP, 0), volTemp));
for (int x = 0; x < SEGLEN; x++) SEGMENT.setPixelColor(x, leds[x]);
return FRAMETIME; return FRAMETIME;
} // mode_rocktaves() } // mode_rocktaves()
@ -7016,7 +6985,7 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t samplePeak = *(uint8_t*)um_data->u_data[3]; uint8_t samplePeak = *(uint8_t*)um_data->u_data[3];
@ -7026,6 +6995,8 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin
float my_magnitude = *(float*) um_data->u_data[5] / 8.0f; float my_magnitude = *(float*) um_data->u_data[5] / 8.0f;
if (SEGENV.call == 0) { if (SEGENV.call == 0) {
SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
SEGENV.aux0 = 255; SEGENV.aux0 = 255;
SEGMENT.custom2 = *binNum; SEGMENT.custom2 = *binNum;
SEGMENT.custom3 = *maxVol * 2; SEGMENT.custom3 = *maxVol * 2;
@ -7069,11 +7040,10 @@ uint16_t mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma.
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
if (!fftResult) return mode_static();
if (SEGENV.call == 0) for (int i=0; i<cols; i++) previousBarHeight[i] = 0; if (SEGENV.call == 0) for (int i=0; i<cols; i++) previousBarHeight[i] = 0;
@ -7118,9 +7088,6 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t cols = SEGMENT.virtualWidth();
const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t rows = SEGMENT.virtualHeight();
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
CRGB *leds = reinterpret_cast<CRGB*>(SEGENV.data);
int NUMB_BANDS = map(SEGMENT.custom1, 0, 255, 1, 16); int NUMB_BANDS = map(SEGMENT.custom1, 0, 255, 1, 16);
int barWidth = (cols / NUMB_BANDS); int barWidth = (cols / NUMB_BANDS);
@ -7133,11 +7100,15 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
um_data_t *um_data; um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
// add support for no audio data // add support for no audio
um_data = simulateSound(SEGMENT.soundSim); um_data = simulateSound(SEGMENT.soundSim);
} }
uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
if (!fftResult) return mode_static();
if (SEGENV.call == 0) {
SEGMENT.setUpLeds();
SEGMENT.fill(BLACK);
}
uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 64; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 64;
if (SEGENV.aux0 != secondHand) { // Triggered millis timing. if (SEGENV.aux0 != secondHand) { // Triggered millis timing.
@ -7150,21 +7121,18 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
int v = map(fftResult[band], 0, 255, 10, 255); int v = map(fftResult[band], 0, 255, 10, 255);
for (int w = 0; w < barWidth; w++) { for (int w = 0; w < barWidth; w++) {
int xpos = (barWidth * b) + w; int xpos = (barWidth * b) + w;
leds[XY(xpos, 0)] = CHSV(hue, 255, v); SEGMENT.setPixelColorXY(xpos, 0, CHSV(hue, 255, v));
} }
} }
// Update the display: // Update the display:
for (int i = (rows - 1); i > 0; i--) { for (int i = (rows - 1); i > 0; i--) {
for (int j = (cols - 1); j >= 0; j--) { for (int j = (cols - 1); j >= 0; j--) {
int src = XY(j, (i - 1)); SEGMENT.setPixelColorXY(j, i, SEGMENT.getPixelColorXY(j, i-1));
int dst = XY(j, i);
leds[dst] = leds[src];
} }
} }
} }
SEGMENT.setPixels(leds);
return FRAMETIME; return FRAMETIME;
} // mode_2DFunkyPlank } // mode_2DFunkyPlank
static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;ssim=0,2d,fr"; // Beatsin static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;ssim=0,2d,fr"; // Beatsin

View File

@ -433,6 +433,7 @@ typedef struct Segment {
uint16_t aux1; // custom var uint16_t aux1; // custom var
byte* data; byte* data;
CRGB* leds; CRGB* leds;
static CRGB *_globalLeds;
private: private:
union { union {
@ -515,7 +516,7 @@ typedef struct Segment {
if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB)); if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB));
Serial.println(); Serial.println();
#endif #endif
if (leds) free(leds); if (!Segment::_globalLeds && leds) free(leds);
if (name) delete[] name; if (name) delete[] name;
if (_t) delete _t; if (_t) delete _t;
deallocateData(); deallocateData();
@ -560,7 +561,8 @@ typedef struct Segment {
* Safe to call from interrupts and network requests. * Safe to call from interrupts and network requests.
*/ */
inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true) inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true)
inline void setUpLeds() { if (!leds) leds = (CRGB*)malloc(sizeof(CRGB)*length()); } //inline void setUpLeds() { if (!leds) leds = (CRGB*)malloc(sizeof(CRGB)*length()); }
void setUpLeds(void);
// transition functions // transition functions
void startTransition(uint16_t dur); // transition has to start before actual segment values change void startTransition(uint16_t dur); // transition has to start before actual segment values change
@ -616,8 +618,8 @@ typedef struct Segment {
void addPixelColorXY(int x, int y, CRGB c) { addPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0)); } void addPixelColorXY(int x, int y, CRGB c) { addPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0)); }
void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade); void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade);
void box_blur(uint16_t i, bool vertical, fract8 blur_amount); // 1D box blur (with weight) void box_blur(uint16_t i, bool vertical, fract8 blur_amount); // 1D box blur (with weight)
void blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr); void blurRow(uint16_t row, fract8 blur_amount);
void blurCol(uint16_t col, fract8 blur_amount, CRGB* leds=nullptr); void blurCol(uint16_t col, fract8 blur_amount);
void moveX(int8_t delta); void moveX(int8_t delta);
void moveY(int8_t delta); void moveY(int8_t delta);
void move(uint8_t dir, uint8_t delta); void move(uint8_t dir, uint8_t delta);
@ -627,13 +629,10 @@ typedef struct Segment {
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color); void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color);
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c) { drawCharacter(chr, x, y, w, h, RGBW32(c.r,c.g,c.b,0)); } // automatic inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c) { drawCharacter(chr, x, y, w, h, RGBW32(c.r,c.g,c.b,0)); } // automatic inline
void wu_pixel(uint32_t x, uint32_t y, CRGB c); void wu_pixel(uint32_t x, uint32_t y, CRGB c);
// obsolete void blur1d(fract8 blur_amount); // blur all rows in 1 dimension
void blur1d(CRGB* leds, fract8 blur_amount); void blur2d(fract8 blur_amount) { blur(blur_amount); }
void blur2d(CRGB* leds, fract8 blur_amount); void fill_solid(CRGB c) { fill(RGBW32(c.r,c.g,c.b,0)); }
void fill_solid(CRGB* leds, CRGB c); void nscale8(uint8_t scale);
void fadeToBlackBy(CRGB* leds, uint8_t fadeBy);
void nscale8(CRGB* leds, uint8_t scale);
void setPixels(CRGB* leds);
#else #else
uint16_t XY(uint16_t x, uint16_t y) { return x; } uint16_t XY(uint16_t x, uint16_t y) { return x; }
void setPixelColorXY(int x, int y, uint32_t c) { setPixelColor(x, c); } void setPixelColorXY(int x, int y, uint32_t c) { setPixelColor(x, c); }
@ -650,8 +649,8 @@ typedef struct Segment {
void addPixelColorXY(int x, int y, CRGB c) { addPixelColor(x, RGBW32(c.r,c.g,c.b,0)); } void addPixelColorXY(int x, int y, CRGB c) { addPixelColor(x, RGBW32(c.r,c.g,c.b,0)); }
void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { fadePixelColor(x, fade); } void fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { fadePixelColor(x, fade); }
void box_blur(uint16_t i, bool vertical, fract8 blur_amount) {} void box_blur(uint16_t i, bool vertical, fract8 blur_amount) {}
void blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr) {} void blurRow(uint16_t row, fract8 blur_amount) {}
void blurCol(uint16_t col, fract8 blur_amount, CRGB* leds=nullptr) {} void blurCol(uint16_t col, fract8 blur_amount) {}
void moveX(int8_t delta) {} void moveX(int8_t delta) {}
void moveY(int8_t delta) {} void moveY(int8_t delta) {}
void move(uint8_t dir, uint8_t delta) {} void move(uint8_t dir, uint8_t delta) {}
@ -786,7 +785,8 @@ class WS2812FX { // 96 bytes
hasRGBWBus(void), hasRGBWBus(void),
hasCCTBus(void), hasCCTBus(void),
// return true if the strip is being sent pixel updates // return true if the strip is being sent pixel updates
isUpdating(void); isUpdating(void),
useLedsArray = false;
inline bool isServicing(void) { return _isServicing; } inline bool isServicing(void) { return _isServicing; }
inline bool hasWhiteChannel(void) {return _hasWhiteChannel;} inline bool hasWhiteChannel(void) {return _hasWhiteChannel;}

View File

@ -238,7 +238,8 @@ void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa)
// returns RGBW values of pixel // returns RGBW values of pixel
uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) { uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) {
if (leds) return RGBW32(leds[XY(x,y)].r, leds[XY(x,y)].g, leds[XY(x,y)].b, 0); int i = XY(x,y);
if (leds) return RGBW32(leds[i].r, leds[i].g, leds[i].b, 0);
if (getOption(SEG_OPTION_REVERSED) ) x = virtualWidth() - x - 1; if (getOption(SEG_OPTION_REVERSED) ) x = virtualWidth() - x - 1;
if (getOption(SEG_OPTION_REVERSED_Y)) y = virtualHeight() - y - 1; if (getOption(SEG_OPTION_REVERSED_Y)) y = virtualHeight() - y - 1;
if (getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed if (getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed
@ -264,7 +265,7 @@ void Segment::fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) {
} }
// blurRow: perform a blur on a row of a rectangular matrix // blurRow: perform a blur on a row of a rectangular matrix
void Segment::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { void Segment::blurRow(uint16_t row, fract8 blur_amount) {
const uint16_t cols = virtualWidth(); const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight(); const uint16_t rows = virtualHeight();
@ -274,24 +275,22 @@ void Segment::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) {
uint8_t seep = blur_amount >> 1; uint8_t seep = blur_amount >> 1;
CRGB carryover = CRGB::Black; CRGB carryover = CRGB::Black;
for (uint16_t x = 0; x < cols; x++) { for (uint16_t x = 0; x < cols; x++) {
CRGB cur = leds ? leds[XY(x,row)] : CRGB(getPixelColorXY(x, row)); CRGB cur = getPixelColorXY(x, row);
CRGB part = cur; CRGB part = cur;
part.nscale8(seep); part.nscale8(seep);
cur.nscale8(keep); cur.nscale8(keep);
cur += carryover; cur += carryover;
if (x) { if (x) {
CRGB prev = (leds ? leds[XY(x-1,row)] : CRGB(getPixelColorXY(x-1, row))) + part; CRGB prev = CRGB(getPixelColorXY(x-1, row)) + part;
if (leds) leds[XY(x-1,row)] = prev; setPixelColorXY(x-1, row, prev);
else setPixelColorXY(x-1, row, prev);
} }
if (leds) leds[XY(x,row)] = cur; setPixelColorXY(x, row, cur);
else setPixelColorXY(x, row, cur);
carryover = part; carryover = part;
} }
} }
// blurCol: perform a blur on a column of a rectangular matrix // blurCol: perform a blur on a column of a rectangular matrix
void Segment::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { void Segment::blurCol(uint16_t col, fract8 blur_amount) {
const uint16_t cols = virtualWidth(); const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight(); const uint16_t rows = virtualHeight();
@ -301,18 +300,16 @@ void Segment::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) {
uint8_t seep = blur_amount >> 1; uint8_t seep = blur_amount >> 1;
CRGB carryover = CRGB::Black; CRGB carryover = CRGB::Black;
for (uint16_t i = 0; i < rows; i++) { for (uint16_t i = 0; i < rows; i++) {
CRGB cur = leds ? leds[XY(col,i)] : CRGB(getPixelColorXY(col, i)); CRGB cur = getPixelColorXY(col, i);
CRGB part = cur; CRGB part = cur;
part.nscale8(seep); part.nscale8(seep);
cur.nscale8(keep); cur.nscale8(keep);
cur += carryover; cur += carryover;
if (i) { if (i) {
CRGB prev = (leds ? leds[XY(col,i-1)] : CRGB(getPixelColorXY(col, i-1))) + part; CRGB prev = CRGB(getPixelColorXY(col, i-1)) + part;
if (leds) leds[XY(col,i-1)] = prev; setPixelColorXY(col, i-1, prev);
else setPixelColorXY(col, i-1, prev);
} }
if (leds) leds[XY(col,i)] = cur; setPixelColorXY(col, i, cur);
else setPixelColorXY(col, i, cur);
carryover = part; carryover = part;
} }
} }
@ -365,16 +362,9 @@ void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) {
// eventually all the way to black; this is by design so that // eventually all the way to black; this is by design so that
// it can be used to (slowly) clear the LEDs to black. // it can be used to (slowly) clear the LEDs to black.
void Segment::blur1d(CRGB* leds, fract8 blur_amount) { void Segment::blur1d(fract8 blur_amount) {
const uint16_t rows = virtualHeight(); const uint16_t rows = virtualHeight();
for (uint16_t y = 0; y < rows; y++) blurRow(y, blur_amount, leds); for (uint16_t y = 0; y < rows; y++) blurRow(y, blur_amount);
}
void Segment::blur2d(CRGB* leds, fract8 blur_amount) {
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for (uint16_t i = 0; i < rows; i++) blurRow(i, blur_amount, leds); // blur all rows
for (uint16_t k = 0; k < cols; k++) blurCol(k, blur_amount, leds); // blur all columns
} }
void Segment::moveX(int8_t delta) { void Segment::moveX(int8_t delta) {
@ -437,25 +427,12 @@ void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) {
if (x * x + y * y <= radius * radius && if (x * x + y * y <= radius * radius &&
int16_t(cx)+x>=0 && int16_t(cy)+y>=0 && int16_t(cx)+x>=0 && int16_t(cy)+y>=0 &&
int16_t(cx)+x<cols && int16_t(cy)+y<rows) int16_t(cx)+x<cols && int16_t(cy)+y<rows)
setPixelColorXY(cx + x, cy + y, col); addPixelColorXY(cx + x, cy + y, col);
} }
} }
} }
void Segment::fill_solid(CRGB* leds, CRGB color) { void Segment::nscale8(uint8_t scale) {
const uint16_t cols = is2D() ? virtualWidth() : virtualLength();
const uint16_t rows = virtualHeight();
for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) {
if (leds) leds[XY(x,y)] = color;
else setPixelColorXY(x, y, color);
}
}
void Segment::fadeToBlackBy(CRGB* leds, uint8_t fadeBy) {
nscale8(leds, 255 - fadeBy);
}
void Segment::nscale8(CRGB* leds, uint8_t scale) {
const uint16_t cols = virtualWidth(); const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight(); const uint16_t rows = virtualHeight();
for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) {
@ -464,12 +441,6 @@ void Segment::nscale8(CRGB* leds, uint8_t scale) {
} }
} }
void Segment::setPixels(CRGB* leds) {
const uint16_t cols = virtualWidth();
const uint16_t rows = virtualHeight();
for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) setPixelColorXY(x, y, leds[XY(x,y)]);
}
//line function //line function
void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) { void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) {
const uint16_t cols = virtualWidth(); const uint16_t cols = virtualWidth();

View File

@ -74,6 +74,7 @@
// Segment class implementation // Segment class implementation
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
uint16_t Segment::_usedSegmentData = 0U; // amount of RAM all segments use for their data[] uint16_t Segment::_usedSegmentData = 0U; // amount of RAM all segments use for their data[]
CRGB *Segment::_globalLeds = nullptr;
// copy constructor // copy constructor
Segment::Segment(const Segment &orig) { Segment::Segment(const Segment &orig) {
@ -196,6 +197,17 @@ void Segment::resetIfRequired() {
} }
} }
void Segment::setUpLeds() {
if (Segment::_globalLeds)
#ifndef WLED_DISABLE_2D
leds = &Segment::_globalLeds[start + startY*strip.matrixWidth]; // TODO: remove this hack
#else
leds = &Segment::_globalLeds[start];
#endif
else if (!leds)
leds = (CRGB*)malloc(sizeof(CRGB)*length());
}
void Segment::startTransition(uint16_t dur) { void Segment::startTransition(uint16_t dur) {
if (transitional || _t) return; // already in transition if (transitional || _t) return; // already in transition
@ -231,7 +243,6 @@ uint16_t Segment::progress() { //transition progression between 0-65535
uint8_t Segment::currentBri(uint8_t briNew, bool useCct) { uint8_t Segment::currentBri(uint8_t briNew, bool useCct) {
if (transitional && _t) { if (transitional && _t) {
//if (getOption(SEG_OPTION_TRANSITIONAL)) {
uint32_t prog = progress() + 1; uint32_t prog = progress() + 1;
if (useCct) return ((briNew * prog) + _t->_cctT * (0x10000 - prog)) >> 16; if (useCct) return ((briNew * prog) + _t->_cctT * (0x10000 - prog)) >> 16;
else return ((briNew * prog) + _t->_briT * (0x10000 - prog)) >> 16; else return ((briNew * prog) + _t->_briT * (0x10000 - prog)) >> 16;
@ -333,7 +344,6 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) { CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal) {
loadPalette(targetPalette, pal); loadPalette(targetPalette, pal);
if (transitional && _t && progress() < 0xFFFFU) { if (transitional && _t && progress() < 0xFFFFU) {
//if (strip.paletteFade && getOption(SEG_OPTION_TRANSITIONAL) && progress() < 0xFFFFU) {
// blend palettes // blend palettes
uint8_t blends = map(_t->_dur, 0, 0xFFFF, 48, 6); // do not blend palettes too quickly (0-65.5s) uint8_t blends = map(_t->_dur, 0, 0xFFFF, 48, 6); // do not blend palettes too quickly (0-65.5s)
nblendPaletteTowardPalette(_t->_palT, targetPalette, blends); nblendPaletteTowardPalette(_t->_palT, targetPalette, blends);
@ -810,10 +820,6 @@ void WS2812FX::finalizeInit(void)
seg.markForReset(); seg.markForReset();
seg.resetIfRequired(); seg.resetIfRequired();
} }
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// _segments[i].markForReset();
// _segments[i].resetIfRequired();
// }
_hasWhiteChannel = _isOffRefreshRequired = false; _hasWhiteChannel = _isOffRefreshRequired = false;
@ -855,8 +861,23 @@ void WS2812FX::finalizeInit(void)
#endif #endif
} }
//segments are created in makeAutoSegments(); //initialize leds array. TBD: realloc if nr of leds change
if (useLedsArray) {
if (Segment::_globalLeds) {
for (Segment seg : _segments) if (seg.leds) { free(seg.leds); seg.leds = nullptr; }
free(Segment::_globalLeds);
Segment::_globalLeds = nullptr;
}
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM)
if (psramFound())
Segment::_globalLeds = (CRGB*) ps_malloc(sizeof(CRGB) * _length);
else
#endif
Segment::_globalLeds = (CRGB*) malloc(sizeof(CRGB) * _length);
memset(Segment::_globalLeds, 0, sizeof(CRGB) * _length);
}
//segments are created in makeAutoSegments();
setBrightness(_brightness); setBrightness(_brightness);
} }
@ -869,8 +890,6 @@ void WS2812FX::service() {
_isServicing = true; _isServicing = true;
_segment_index = 0; _segment_index = 0;
for (segment &seg : _segments) { for (segment &seg : _segments) {
// for (int i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
// reset the segment runtime data if needed // reset the segment runtime data if needed
seg.resetIfRequired(); seg.resetIfRequired();
@ -1059,13 +1078,12 @@ void WS2812FX::setTargetFps(uint8_t fps) {
void WS2812FX::setMode(uint8_t segid, uint8_t m) { void WS2812FX::setMode(uint8_t segid, uint8_t m) {
if (segid >= _segments.size()) return; if (segid >= _segments.size()) return;
// if (segid >= getMaxSegments()) return;
if (m >= getModeCount()) m = getModeCount() - 1; if (m >= getModeCount()) m = getModeCount() - 1;
if (_segments[segid].mode != m) { if (_segments[segid].mode != m) {
//_segments[segid].startTransition(_transitionDur); // set effect transitions _segments[segid].startTransition(_transitionDur); // set effect transitions
_segments[segid].markForReset(); //_segments[segid].markForReset();
_segments[segid].mode = m; _segments[segid].mode = m;
} }
} }
@ -1075,8 +1093,6 @@ void WS2812FX::setColor(uint8_t slot, uint32_t c) {
if (slot >= NUM_COLORS) return; if (slot >= NUM_COLORS) return;
for (segment &seg : _segments) { for (segment &seg : _segments) {
// for (int i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
if (seg.isSelected()) { if (seg.isSelected()) {
seg.setColor(slot, c); seg.setColor(slot, c);
} }
@ -1085,8 +1101,6 @@ void WS2812FX::setColor(uint8_t slot, uint32_t c) {
void WS2812FX::setCCT(uint16_t k) { void WS2812FX::setCCT(uint16_t k) {
for (segment &seg : _segments) { for (segment &seg : _segments) {
// for (int i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
if (seg.isActive() && seg.isSelected()) { if (seg.isActive() && seg.isSelected()) {
seg.setCCT(k); seg.setCCT(k);
} }
@ -1099,8 +1113,6 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) {
_brightness = b; _brightness = b;
if (_brightness == 0) { //unfreeze all segments on power off if (_brightness == 0) { //unfreeze all segments on power off
for (segment &seg : _segments) { for (segment &seg : _segments) {
// for (int i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
seg.setOption(SEG_OPTION_FREEZE, false); seg.setOption(SEG_OPTION_FREEZE, false);
} }
} }
@ -1117,8 +1129,6 @@ uint8_t WS2812FX::getFirstSelectedSegId(void)
{ {
size_t i = 0; size_t i = 0;
for (segment &seg : _segments) { for (segment &seg : _segments) {
// for (int i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
if (seg.isSelected()) return i; if (seg.isSelected()) return i;
i++; i++;
} }
@ -1127,16 +1137,6 @@ uint8_t WS2812FX::getFirstSelectedSegId(void)
} }
void WS2812FX::setMainSegmentId(uint8_t n) { void WS2812FX::setMainSegmentId(uint8_t n) {
// if (n >= getMaxSegments()) return;
// //use supplied n if active, or first active
// if (_segments[n].isActive()) {
// _mainSegment = n; return;
// }
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// if (_segments[i].isActive()) {
// _mainSegment = i; return;
// }
// }
_mainSegment = 0; _mainSegment = 0;
if (n < _segments.size()) { if (n < _segments.size()) {
_mainSegment = n; _mainSegment = n;
@ -1145,16 +1145,14 @@ void WS2812FX::setMainSegmentId(uint8_t n) {
} }
uint8_t WS2812FX::getLastActiveSegmentId(void) { uint8_t WS2812FX::getLastActiveSegmentId(void) {
// for (uint8_t i = getMaxSegments() -1; i > 0; i--) { for (size_t i = _segments.size() -1; i > 0; i--) {
// if (_segments[i].isActive()) return i; if (_segments[i].isActive()) return i;
// } }
// return 0; return 0;
return _segments.size()-1;
} }
uint8_t WS2812FX::getActiveSegmentsNum(void) { uint8_t WS2812FX::getActiveSegmentsNum(void) {
uint8_t c = 0; uint8_t c = 0;
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
for (size_t i = 0; i < _segments.size(); i++) { for (size_t i = 0; i < _segments.size(); i++) {
if (_segments[i].isActive()) c++; if (_segments[i].isActive()) c++;
} }
@ -1163,7 +1161,7 @@ uint8_t WS2812FX::getActiveSegmentsNum(void) {
uint16_t WS2812FX::getLengthPhysical(void) { uint16_t WS2812FX::getLengthPhysical(void) {
uint16_t len = 0; uint16_t len = 0;
for (uint8_t b = 0; b < busses.getNumBusses(); b++) { for (size_t b = 0; b < busses.getNumBusses(); b++) {
Bus *bus = busses.getBus(b); Bus *bus = busses.getBus(b);
if (bus->getType() >= TYPE_NET_DDP_RGB) continue; //exclude non-physical network busses if (bus->getType() >= TYPE_NET_DDP_RGB) continue; //exclude non-physical network busses
len += bus->getLength(); len += bus->getLength();
@ -1175,7 +1173,7 @@ uint16_t WS2812FX::getLengthPhysical(void) {
//returns if there is an RGBW bus (supports RGB and White, not only white) //returns if there is an RGBW bus (supports RGB and White, not only white)
//not influenced by auto-white mode, also true if white slider does not affect output white channel //not influenced by auto-white mode, also true if white slider does not affect output white channel
bool WS2812FX::hasRGBWBus(void) { bool WS2812FX::hasRGBWBus(void) {
for (uint8_t b = 0; b < busses.getNumBusses(); b++) { for (size_t b = 0; b < busses.getNumBusses(); b++) {
Bus *bus = busses.getBus(b); Bus *bus = busses.getBus(b);
if (bus == nullptr || bus->getLength()==0) break; if (bus == nullptr || bus->getLength()==0) break;
switch (bus->getType()) { switch (bus->getType()) {
@ -1190,7 +1188,7 @@ bool WS2812FX::hasRGBWBus(void) {
bool WS2812FX::hasCCTBus(void) { bool WS2812FX::hasCCTBus(void) {
if (cctFromRgb && !correctWB) return false; if (cctFromRgb && !correctWB) return false;
for (uint8_t b = 0; b < busses.getNumBusses(); b++) { for (size_t b = 0; b < busses.getNumBusses(); b++) {
Bus *bus = busses.getBus(b); Bus *bus = busses.getBus(b);
if (bus == nullptr || bus->getLength()==0) break; if (bus == nullptr || bus->getLength()==0) break;
switch (bus->getType()) { switch (bus->getType()) {
@ -1206,7 +1204,7 @@ void WS2812FX::purgeSegments(bool force) {
// remove all inactive segments (from the back) // remove all inactive segments (from the back)
int deleted = 0; int deleted = 0;
if (_segments.size() <= 1) return; if (_segments.size() <= 1) return;
for (int i = _segments.size()-1; i > 0; i--) for (size_t i = _segments.size()-1; i > 0; i--)
if (_segments[i].stop == 0 || force) { if (_segments[i].stop == 0 || force) {
DEBUG_PRINT(F("Purging segment segment: ")); DEBUG_PRINTLN(i); DEBUG_PRINT(F("Purging segment segment: ")); DEBUG_PRINTLN(i);
deleted++; deleted++;
@ -1219,13 +1217,11 @@ void WS2812FX::purgeSegments(bool force) {
} }
Segment& WS2812FX::getSegment(uint8_t id) { Segment& WS2812FX::getSegment(uint8_t id) {
// return _segments[id >= getMaxSegments() ? getMainSegmentId() : id];
return _segments[id >= _segments.size() ? getMainSegmentId() : id]; // vectors return _segments[id >= _segments.size() ? getMainSegmentId() : id]; // vectors
} }
void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing, uint16_t offset, uint16_t startY, uint16_t stopY) { void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing, uint16_t offset, uint16_t startY, uint16_t stopY) {
if (n >= _segments.size()) return; if (n >= _segments.size()) return;
// if (n >= getMaxSegments()) return;
Segment& seg = _segments[n]; Segment& seg = _segments[n];
//return if neither bounds nor grouping have changed //return if neither bounds nor grouping have changed
@ -1277,10 +1273,6 @@ void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping,
void WS2812FX::restartRuntime() { void WS2812FX::restartRuntime() {
for (segment &seg : _segments) seg.markForReset(); for (segment &seg : _segments) seg.markForReset();
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
// seg.markForReset();
// }
} }
void WS2812FX::resetSegments() { void WS2812FX::resetSegments() {
@ -1292,45 +1284,6 @@ void WS2812FX::resetSegments() {
#endif #endif
_segments.push_back(seg); _segments.push_back(seg);
_mainSegment = 0; _mainSegment = 0;
/*
for (uint8_t i = 0; i < getMaxSegments(); i++) if (_segments[i].name) delete[] _segments[i].name;
_mainSegment = 0;
memset(_segments, 0, sizeof(_segments));
//memset(_segmentruntimes, 0, sizeof(_segmentruntimes));
_segment_index = 0;
_segments[0].mode = DEFAULT_MODE;
_segments[0].colors[0] = DEFAULT_COLOR;
_segments[0].start = 0;
_segments[0].startY = 0;
_segments[0].speed = DEFAULT_SPEED;
_segments[0].intensity = DEFAULT_INTENSITY;
_segments[0].stop = isMatrix ? matrixWidth : _length;
_segments[0].stopY = isMatrix ? matrixHeight : 1;
_segments[0].grouping = 1;
_segments[0].setOption(SEG_OPTION_SELECTED, 1);
_segments[0].setOption(SEG_OPTION_ON, 1);
_segments[0].opacity = 255;
_segments[0].cct = 127;
_segments[0].custom1 = DEFAULT_C1;
_segments[0].custom2 = DEFAULT_C2;
_segments[0].custom3 = DEFAULT_C3;
for (uint16_t i = 1; i < getMaxSegments(); i++)
{
_segments[i].colors[0] = _segments[i].color_wheel(i*51);
_segments[i].grouping = 1;
_segments[i].setOption(SEG_OPTION_ON, 1);
_segments[i].opacity = 255;
_segments[i].cct = 127;
_segments[i].speed = DEFAULT_SPEED;
_segments[i].intensity = DEFAULT_INTENSITY;
_segments[i].custom1 = DEFAULT_C1;
_segments[i].custom2 = DEFAULT_C2;
_segments[i].custom3 = DEFAULT_C3;
_segments[i].markForReset();
}
_segments[0].markForReset();
*/
} }
void WS2812FX::makeAutoSegments(bool forceReset) { void WS2812FX::makeAutoSegments(bool forceReset) {
@ -1360,7 +1313,7 @@ void WS2812FX::makeAutoSegments(bool forceReset) {
segStops[s] = segStarts[s] + b->getLength(); segStops[s] = segStarts[s] + b->getLength();
//check for overlap with previous segments //check for overlap with previous segments
for (uint8_t j = 0; j < s; j++) { for (size_t j = 0; j < s; j++) {
if (segStops[j] > segStarts[s] && segStarts[j] < segStops[s]) { if (segStops[j] > segStarts[s] && segStarts[j] < segStops[s]) {
//segments overlap, merge //segments overlap, merge
segStarts[j] = min(segStarts[s],segStarts[j]); segStarts[j] = min(segStarts[s],segStarts[j]);
@ -1371,15 +1324,11 @@ void WS2812FX::makeAutoSegments(bool forceReset) {
s++; s++;
} }
_segments.clear(); _segments.clear();
for (uint8_t i = 0; i < s; i++) { for (size_t i = 0; i < s; i++) {
Segment seg = Segment(segStarts[i], segStops[i]); Segment seg = Segment(segStarts[i], segStops[i]);
seg.setOption(SEG_OPTION_SELECTED, true); seg.setOption(SEG_OPTION_SELECTED, true);
_segments.push_back(seg); _segments.push_back(seg);
} }
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// _segments[i].setOption(SEG_OPTION_SELECTED, true);
// setSegment(i, segStarts[i], segStops[i]);
// }
_mainSegment = 0; _mainSegment = 0;
} else { } else {
if (forceReset || getSegmentsNum() == 0) resetSegments(); if (forceReset || getSegmentsNum() == 0) resetSegments();
@ -1397,26 +1346,18 @@ void WS2812FX::makeAutoSegments(bool forceReset) {
void WS2812FX::fixInvalidSegments() { void WS2812FX::fixInvalidSegments() {
//make sure no segment is longer than total (sanity check) //make sure no segment is longer than total (sanity check)
for (int i = getSegmentsNum()-1; i > 0; i--) { for (size_t i = getSegmentsNum()-1; i > 0; i--) {
if (_segments[i].start >= _length) { _segments.erase(_segments.begin()+i); continue; } if (_segments[i].start >= _length) { _segments.erase(_segments.begin()+i); continue; }
if (_segments[i].stop > _length) _segments[i].stop = _length; if (_segments[i].stop > _length) _segments[i].stop = _length;
// this is always called as the last step after finalizeInit(), update covered bus types // this is always called as the last step after finalizeInit(), update covered bus types
_segments[i].refreshLightCapabilities(); _segments[i].refreshLightCapabilities();
} }
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// if (_segments[i].start >= _length) { _segments[i].start = _segments[i].stop = 0; _segments[i].markForReset(); }
// if (_segments[i].stop > _length) { _segments[i].stop = _length; _segments[i].markForReset(); }
// // this is always called as the last step after finalizeInit(), update covered bus types
// if (_segments[i].isActive()) _segments[i].refreshLightCapabilities();
// }
} }
//true if all segments align with a bus, or if a segment covers the total length //true if all segments align with a bus, or if a segment covers the total length
bool WS2812FX::checkSegmentAlignment() { bool WS2812FX::checkSegmentAlignment() {
bool aligned = false; bool aligned = false;
for (segment &seg : _segments) { for (segment &seg : _segments) {
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
for (uint8_t b = 0; b<busses.getNumBusses(); b++) { for (uint8_t b = 0; b<busses.getNumBusses(); b++) {
Bus *bus = busses.getBus(b); Bus *bus = busses.getBus(b);
if (seg.start == bus->getStart() && seg.stop == bus->getStart() + bus->getLength()) aligned = true; if (seg.start == bus->getStart() && seg.stop == bus->getStart() + bus->getLength()) aligned = true;
@ -1434,7 +1375,6 @@ uint8_t WS2812FX::setPixelSegment(uint8_t n)
{ {
uint8_t prevSegId = _segment_index; uint8_t prevSegId = _segment_index;
if (n < _segments.size()) { if (n < _segments.size()) {
// if (n < getMaxSegments()) {
_segment_index = n; _segment_index = n;
_virtualSegmentLength = _segments[_segment_index].virtualLength(); _virtualSegmentLength = _segments[_segment_index].virtualLength();
} }
@ -1455,10 +1395,6 @@ void WS2812FX::setRange(uint16_t i, uint16_t i2, uint32_t col)
void WS2812FX::setTransitionMode(bool t) void WS2812FX::setTransitionMode(bool t)
{ {
for (segment &seg : _segments) if (!seg.transitional) seg.startTransition(t ? _transitionDur : 0); for (segment &seg : _segments) if (!seg.transitional) seg.startTransition(t ? _transitionDur : 0);
// for (uint8_t i = 0; i < getMaxSegments(); i++) {
// Segment &seg = getSegment(i);
// if (!seg.transitional)seg.startTransition(t ? _transitionDur : 0);
// }
} }
#ifdef WLED_DEBUG #ifdef WLED_DEBUG

View File

@ -90,6 +90,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(strip.cctBlending, hw_led[F("cb")]); CJSON(strip.cctBlending, hw_led[F("cb")]);
Bus::setCCTBlend(strip.cctBlending); Bus::setCCTBlend(strip.cctBlending);
strip.setTargetFps(hw_led["fps"]); //NOP if 0, default 42 FPS strip.setTargetFps(hw_led["fps"]); //NOP if 0, default 42 FPS
CJSON(strip.useLedsArray, hw_led[F("ld")]);
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
// 2D Matrix Settings // 2D Matrix Settings
@ -625,6 +626,7 @@ void serializeConfig() {
hw_led[F("cb")] = strip.cctBlending; hw_led[F("cb")] = strip.cctBlending;
hw_led["fps"] = strip.getTargetFps(); hw_led["fps"] = strip.getTargetFps();
hw_led[F("rgbwm")] = Bus::getAutoWhiteMode(); // global override hw_led[F("rgbwm")] = Bus::getAutoWhiteMode(); // global override
hw_led[F("ld")] = strip.useLedsArray;
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
// 2D Matrix Settings // 2D Matrix Settings

View File

@ -588,8 +588,9 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
Use less than <span id="wreason">800 LEDs per output</span> for the best experience!<br> Use less than <span id="wreason">800 LEDs per output</span> for the best experience!<br>
</div> </div>
<hr style="width:260px"> <hr style="width:260px">
Make a segment for each output: <input type="checkbox" name="MS"> <br> Make a segment for each output: <input type="checkbox" name="MS"><br>
Custom bus start indices: <input type="checkbox" onchange="tglSi(this.checked)" id="si"> <br> Custom bus start indices: <input type="checkbox" onchange="tglSi(this.checked)" id="si"><br>
Use global LED buffer: <input type="checkbox" name="LD"><br>
<hr style="width:260px"> <hr style="width:260px">
<div id="color_order_mapping"> <div id="color_order_mapping">
Color Order Override: Color Order Override:

View File

@ -236,267 +236,267 @@ const uint8_t PAGE_settings_wifi[] PROGMEM = {
// Autogenerated from wled00/data/settings_leds.htm, do not edit!! // Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 7326; const uint16_t PAGE_settings_leds_length = 7343;
const uint8_t PAGE_settings_leds[] PROGMEM = { const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xed, 0x76, 0xe2, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xed, 0x76, 0xe2, 0xc6,
0x92, 0xff, 0x79, 0x8a, 0x76, 0x27, 0x71, 0xa4, 0x8b, 0x0c, 0x12, 0x1f, 0x8e, 0x07, 0x10, 0xac, 0x92, 0xff, 0x79, 0x8a, 0x76, 0x27, 0x71, 0xa4, 0x8b, 0x0c, 0x12, 0x1f, 0x8e, 0x07, 0x10, 0xac,
0xf1, 0x78, 0x26, 0xbe, 0xd7, 0x8e, 0x7d, 0x8c, 0x93, 0xb9, 0x7b, 0x26, 0x73, 0x32, 0x42, 0x34, 0xb1, 0x3d, 0x13, 0xdf, 0x6b, 0xc7, 0x3e, 0xc6, 0xc9, 0xdc, 0x3d, 0x93, 0x39, 0x19, 0x21, 0x1a,
0xa0, 0xb1, 0x90, 0x74, 0x25, 0x61, 0x9b, 0xb5, 0xd9, 0x67, 0xda, 0x67, 0xd8, 0x27, 0xdb, 0xaa, 0xd0, 0x58, 0x48, 0xba, 0x92, 0xb0, 0x87, 0xb5, 0xd9, 0x67, 0xda, 0x67, 0xd8, 0x27, 0xdb, 0xaa,
0xee, 0xd6, 0x17, 0x08, 0xec, 0xdc, 0xbb, 0xfb, 0x67, 0x73, 0xce, 0xc4, 0x20, 0x55, 0x57, 0x55, 0xee, 0xd6, 0x17, 0x08, 0xec, 0xdc, 0xbb, 0xfb, 0x67, 0x73, 0xce, 0xc4, 0x20, 0x55, 0x57, 0x55,
0x57, 0xd7, 0x77, 0x77, 0xd3, 0x3b, 0x78, 0x7f, 0x7d, 0x76, 0xf7, 0xef, 0x37, 0xe7, 0x64, 0x1e, 0x57, 0xd7, 0x77, 0x77, 0xd3, 0x3b, 0x38, 0xbf, 0x39, 0xbb, 0xff, 0xf7, 0xdb, 0x0b, 0x32, 0x8f,
0x2f, 0xdc, 0x7e, 0x0f, 0xff, 0x4f, 0x5c, 0xcb, 0x9b, 0x99, 0x94, 0x79, 0x14, 0xbe, 0x33, 0x6b, 0x17, 0x6e, 0xbf, 0x87, 0xff, 0x27, 0xae, 0xe5, 0xcd, 0x4c, 0xca, 0x3c, 0x0a, 0xdf, 0x99, 0x35,
0xd2, 0xef, 0x2d, 0x58, 0x6c, 0x11, 0x7b, 0x6e, 0x85, 0x11, 0x8b, 0x4d, 0xba, 0x8c, 0xa7, 0x47, 0xe9, 0xf7, 0x16, 0x2c, 0xb6, 0x88, 0x3d, 0xb7, 0xc2, 0x88, 0xc5, 0x26, 0x5d, 0xc6, 0xd3, 0xa3,
0x27, 0x54, 0x3e, 0xad, 0x78, 0xd6, 0x82, 0x99, 0xf4, 0xc1, 0x61, 0x8f, 0x81, 0x1f, 0xc6, 0x94, 0x13, 0x2a, 0x9f, 0x56, 0x3c, 0x6b, 0xc1, 0x4c, 0xfa, 0xe8, 0xb0, 0xa7, 0xc0, 0x0f, 0x63, 0x4a,
0xd8, 0xbe, 0x17, 0x33, 0x0f, 0xc0, 0x1e, 0x9d, 0x49, 0x3c, 0x37, 0xdb, 0xba, 0x9e, 0x82, 0x6e, 0x6c, 0xdf, 0x8b, 0x99, 0x07, 0x60, 0x4f, 0xce, 0x24, 0x9e, 0x9b, 0x6d, 0x5d, 0x4f, 0x41, 0x37,
0xbc, 0x9a, 0xb0, 0x07, 0xc7, 0x66, 0x47, 0xfc, 0x8b, 0xe6, 0x78, 0x4e, 0xec, 0x58, 0xee, 0x51, 0x5e, 0x4d, 0xd8, 0xa3, 0x63, 0xb3, 0x23, 0xfe, 0x45, 0x73, 0x3c, 0x27, 0x76, 0x2c, 0xf7, 0x28,
0x64, 0x5b, 0x2e, 0x33, 0x0d, 0x6d, 0x61, 0x3d, 0x39, 0x8b, 0xe5, 0x22, 0xfd, 0xbe, 0x8c, 0x58, 0xb2, 0x2d, 0x97, 0x99, 0x86, 0xb6, 0xb0, 0xbe, 0x39, 0x8b, 0xe5, 0x22, 0xfd, 0xbe, 0x8c, 0x58,
0xc8, 0xbf, 0x58, 0x63, 0xf8, 0xee, 0xf9, 0x74, 0x8b, 0x72, 0xbf, 0x17, 0x3b, 0xb1, 0xcb, 0xfa, 0xc8, 0xbf, 0x58, 0x63, 0xf8, 0xee, 0xf9, 0x74, 0x8b, 0x72, 0xbf, 0x17, 0x3b, 0xb1, 0xcb, 0xfa,
0x97, 0xe7, 0xef, 0xc9, 0x88, 0xc5, 0xb1, 0xe3, 0xcd, 0xa2, 0x5e, 0x5d, 0x3c, 0xeb, 0x45, 0x76, 0x57, 0x17, 0xe7, 0x64, 0xc4, 0xe2, 0xd8, 0xf1, 0x66, 0x51, 0xaf, 0x2e, 0x9e, 0xf5, 0x22, 0x3b,
0xe8, 0x04, 0x71, 0xbf, 0xf2, 0x60, 0x85, 0xc4, 0xf5, 0x6d, 0x27, 0xd0, 0x62, 0x67, 0xc1, 0xfc, 0x74, 0x82, 0xb8, 0x5f, 0x79, 0xb4, 0x42, 0xe2, 0xfa, 0xb6, 0x13, 0x68, 0xb1, 0xb3, 0x60, 0xfe,
0x65, 0xac, 0x4d, 0xcc, 0x89, 0x6f, 0x2f, 0x17, 0xc0, 0x97, 0xe6, 0x5a, 0x41, 0xc8, 0x1e, 0xcc, 0x32, 0xd6, 0x26, 0xe6, 0xc4, 0xb7, 0x97, 0x0b, 0xe0, 0x4b, 0x73, 0xad, 0x20, 0x64, 0x8f, 0x66,
0x76, 0x1b, 0xa9, 0x0f, 0x05, 0x13, 0x57, 0x66, 0x8b, 0x35, 0xf1, 0xc3, 0xcd, 0xd0, 0x6c, 0xe9, 0xbb, 0x8d, 0xd4, 0x87, 0x82, 0x89, 0x6b, 0xb3, 0xc5, 0x9a, 0xf8, 0xe1, 0x76, 0x68, 0xb6, 0xf4,
0xef, 0x8e, 0xf1, 0xe3, 0xa5, 0x69, 0x34, 0x9b, 0xfc, 0xe1, 0xe5, 0xf8, 0x1f, 0x4b, 0x3f, 0x36, 0x77, 0xc7, 0xf8, 0xf1, 0xca, 0x34, 0x9a, 0x4d, 0xfe, 0xf0, 0x6a, 0xfc, 0x8f, 0xa5, 0x1f, 0x9b,
0x75, 0xcd, 0x5e, 0x46, 0xb1, 0xbf, 0x18, 0xc5, 0x56, 0x18, 0x47, 0xe6, 0x81, 0xa1, 0x45, 0xfc, 0xba, 0x66, 0x2f, 0xa3, 0xd8, 0x5f, 0x8c, 0x62, 0x2b, 0x8c, 0x23, 0xf3, 0xc0, 0xd0, 0x22, 0xfe,
0xd3, 0x7b, 0x27, 0x8c, 0x57, 0xe6, 0xe7, 0x2f, 0x08, 0x7a, 0x76, 0x7d, 0xfd, 0xc0, 0xc2, 0xd0, 0xe9, 0xdc, 0x09, 0xe3, 0x95, 0xf9, 0xe9, 0x33, 0x82, 0x9e, 0xdd, 0xdc, 0x3c, 0xb2, 0x30, 0x74,
0x99, 0xb0, 0xc8, 0x6c, 0x6b, 0xc0, 0x03, 0x80, 0x75, 0xa7, 0x4b, 0xcf, 0x8e, 0x1d, 0xdf, 0x23, 0x26, 0x2c, 0x32, 0xdb, 0x1a, 0xf0, 0x00, 0x60, 0xdd, 0xe9, 0xd2, 0xb3, 0x63, 0xc7, 0xf7, 0xc8,
0x3f, 0x2b, 0xea, 0xf3, 0xa3, 0xe3, 0x4d, 0xfc, 0xc7, 0x9a, 0x1f, 0x30, 0x4f, 0xa1, 0xf3, 0x38, 0xcf, 0x8a, 0xfa, 0xfc, 0xe4, 0x78, 0x13, 0xff, 0xa9, 0xe6, 0x07, 0xcc, 0x53, 0xe8, 0x3c, 0x8e,
0x0e, 0xa2, 0x4e, 0xbd, 0x7e, 0xef, 0xf9, 0xb5, 0x47, 0x97, 0x4d, 0x6a, 0x33, 0x56, 0x9f, 0x32, 0x83, 0xa8, 0x53, 0xaf, 0x3f, 0x78, 0x7e, 0xed, 0xc9, 0x65, 0x93, 0xda, 0x8c, 0xd5, 0xa7, 0xcc,
0x2b, 0x5e, 0x86, 0x2c, 0xaa, 0x47, 0x72, 0x7a, 0xf5, 0xef, 0xe0, 0xcd, 0x51, 0xf2, 0x8d, 0xaa, 0x8a, 0x97, 0x21, 0x8b, 0xea, 0x91, 0x9c, 0x5e, 0xfd, 0x3b, 0x78, 0x73, 0x94, 0x7c, 0xa3, 0xea,
0xeb, 0x14, 0xdf, 0x70, 0x13, 0x5f, 0x3a, 0x86, 0x6a, 0xf4, 0x8f, 0x88, 0xb9, 0xd3, 0x3c, 0xf4, 0x3a, 0xc5, 0x37, 0xdc, 0xc4, 0x97, 0x8e, 0xa1, 0x1a, 0xfd, 0x23, 0x62, 0xee, 0x34, 0x0f, 0x3d,
0xec, 0x62, 0xa2, 0x30, 0xf5, 0x39, 0x64, 0x80, 0xde, 0x23, 0x48, 0x2b, 0x3e, 0x77, 0x19, 0xca, 0xbb, 0x9c, 0x28, 0x4c, 0x7d, 0x0e, 0x19, 0xa0, 0xf7, 0x08, 0xd2, 0x8a, 0x2f, 0x5c, 0x86, 0x32,
0x64, 0xb8, 0xe2, 0xaf, 0x32, 0x50, 0x7f, 0x3a, 0x45, 0xd0, 0x3c, 0x4c, 0x34, 0x5c, 0xfd, 0x02, 0x19, 0xae, 0xf8, 0xab, 0x0c, 0xd4, 0x9f, 0x4e, 0x11, 0x34, 0x0f, 0x13, 0x0d, 0x57, 0xbf, 0xc0,
0x4b, 0x01, 0x8f, 0x3f, 0xeb, 0x5f, 0x6a, 0x0f, 0x96, 0xbb, 0x64, 0xe6, 0x91, 0x91, 0x0d, 0x71, 0x52, 0xc0, 0xe3, 0x4f, 0xfa, 0xe7, 0xda, 0xa3, 0xe5, 0x2e, 0x99, 0x79, 0x64, 0x64, 0x43, 0x5c,
0x7d, 0x6b, 0xf2, 0xd7, 0x91, 0xc2, 0x34, 0xcf, 0x3c, 0xd0, 0xd5, 0x67, 0x97, 0xc5, 0x24, 0x36, 0xdf, 0x9a, 0xfc, 0x75, 0xa4, 0x30, 0xcd, 0x33, 0x0f, 0x74, 0xf5, 0xd9, 0x65, 0x31, 0x89, 0xcd,
0x27, 0x35, 0x3b, 0x84, 0xe9, 0x30, 0x89, 0x43, 0xa1, 0x62, 0x85, 0xa8, 0xda, 0x8d, 0x6b, 0xc0, 0x49, 0xcd, 0x0e, 0x61, 0x3a, 0x4c, 0xe2, 0x50, 0xa8, 0x58, 0x21, 0xaa, 0x76, 0xe3, 0x1a, 0xb0,
0xea, 0x69, 0x1c, 0x87, 0xce, 0x78, 0x19, 0x33, 0x78, 0x11, 0xda, 0x54, 0x63, 0xaa, 0xb6, 0xf9, 0x7a, 0x1a, 0xc7, 0xa1, 0x33, 0x5e, 0xc6, 0x0c, 0x5e, 0x84, 0x36, 0xd5, 0x98, 0xaa, 0x6d, 0x3e,
0x3c, 0x5e, 0x05, 0x0c, 0x26, 0x13, 0xb3, 0xa7, 0xb8, 0xfe, 0xcd, 0x7a, 0xb0, 0x12, 0x04, 0x5b, 0x8f, 0x57, 0x01, 0x83, 0xc9, 0xc4, 0xec, 0x5b, 0x5c, 0xff, 0x6a, 0x3d, 0x5a, 0x09, 0x82, 0x2d,
0x80, 0x56, 0xb4, 0xf2, 0x00, 0x85, 0xa7, 0x6a, 0x93, 0xda, 0xd8, 0x9f, 0xac, 0x6a, 0x56, 0x00, 0x40, 0x2b, 0x5a, 0x79, 0x80, 0xc2, 0x53, 0xb5, 0x49, 0x6d, 0xec, 0x4f, 0x56, 0x35, 0x2b, 0x00,
0x22, 0x99, 0x9c, 0xcd, 0x1d, 0x77, 0xa2, 0xc4, 0x08, 0x6f, 0x4d, 0x26, 0xe7, 0x0f, 0xc0, 0xc5, 0x91, 0x4c, 0xce, 0xe6, 0x8e, 0x3b, 0x51, 0x62, 0x84, 0xb7, 0x26, 0x93, 0x8b, 0x47, 0xe0, 0xe2,
0xa5, 0x13, 0x81, 0x82, 0xb2, 0x50, 0xa1, 0xc8, 0x33, 0xd5, 0x14, 0xd5, 0xec, 0x3f, 0x7f, 0x64, 0xca, 0x89, 0x40, 0x41, 0x59, 0xa8, 0x50, 0xe4, 0x99, 0x6a, 0x8a, 0x6a, 0xf6, 0x9f, 0x3f, 0xb0,
0xf1, 0x6f, 0x8a, 0xaa, 0xd9, 0x73, 0x66, 0xdf, 0x8f, 0x1c, 0xf8, 0x84, 0xd8, 0x87, 0x97, 0x8a, 0xf8, 0x37, 0x45, 0xd5, 0xec, 0x39, 0xb3, 0x1f, 0x46, 0x0e, 0x7c, 0x42, 0xec, 0xc3, 0x2b, 0x45,
0xba, 0x2e, 0x1f, 0x0a, 0x8b, 0xec, 0x87, 0xc0, 0x31, 0x0c, 0x05, 0x85, 0x8f, 0x7c, 0x97, 0xd5, 0x5d, 0x97, 0x0f, 0x85, 0x45, 0xf6, 0x43, 0xe0, 0x18, 0x86, 0x82, 0xc2, 0x47, 0xbe, 0xcb, 0x6a,
0x5c, 0x7f, 0xa6, 0xd0, 0x73, 0x7c, 0x4e, 0xa4, 0x3c, 0x60, 0x25, 0xc8, 0xd4, 0x71, 0x19, 0x9f, 0xae, 0x3f, 0x53, 0xe8, 0x05, 0x3e, 0x27, 0x52, 0x1e, 0xb0, 0x12, 0x64, 0xea, 0xb8, 0x8c, 0xcf,
0x19, 0x68, 0x78, 0x08, 0x12, 0xb8, 0x94, 0xcf, 0xfd, 0x29, 0x1a, 0xd1, 0xd4, 0x99, 0x2d, 0x43, 0x0c, 0x34, 0x3c, 0x04, 0x09, 0x5c, 0xc9, 0xe7, 0xfe, 0x14, 0x8d, 0x68, 0xea, 0xcc, 0x96, 0xa1,
0x8b, 0x0b, 0x50, 0xcc, 0x8c, 0x4c, 0x2d, 0x07, 0x15, 0xe1, 0x77, 0xef, 0xc2, 0xb3, 0xfd, 0x45, 0xc5, 0x05, 0x28, 0x66, 0x46, 0xa6, 0x96, 0x83, 0x8a, 0xf0, 0xbb, 0x77, 0xe9, 0xd9, 0xfe, 0x22,
0x00, 0x72, 0x64, 0x24, 0xb0, 0x66, 0x8c, 0x4c, 0xac, 0xd8, 0x3a, 0x80, 0xf5, 0xcc, 0x2d, 0x53, 0x00, 0x39, 0x32, 0x12, 0x58, 0x33, 0x46, 0x26, 0x56, 0x6c, 0x1d, 0xc0, 0x7a, 0xe6, 0x96, 0x29,
0x34, 0xf7, 0x1f, 0xef, 0x7c, 0x2b, 0x8a, 0x85, 0xd8, 0x0d, 0xf5, 0x19, 0x35, 0x3f, 0x36, 0x71, 0x9a, 0xfb, 0x4f, 0xf7, 0xbe, 0x15, 0xc5, 0x42, 0xec, 0x86, 0xfa, 0x8c, 0x9a, 0x1f, 0x9b, 0xb8,
0xa5, 0x69, 0x8c, 0x2f, 0xb8, 0xa4, 0x1d, 0x0f, 0x58, 0xfe, 0xf9, 0xee, 0xea, 0xd2, 0x64, 0x30, 0xd2, 0x34, 0xc6, 0x17, 0x5c, 0xd2, 0x8e, 0x07, 0x2c, 0xff, 0x7c, 0x7f, 0x7d, 0x65, 0x32, 0x98,
0x17, 0xdb, 0xb5, 0xa2, 0x08, 0x97, 0xd2, 0xf4, 0x06, 0x72, 0x1a, 0x1d, 0x8a, 0x98, 0xa8, 0x66, 0x8b, 0xed, 0x5a, 0x51, 0x84, 0x4b, 0x69, 0x7a, 0x03, 0x39, 0x8d, 0x0e, 0x45, 0x4c, 0x54, 0xb3,
0xbb, 0xcc, 0x0a, 0xef, 0x84, 0xc9, 0x28, 0xd2, 0x74, 0xb8, 0xa4, 0xe3, 0x15, 0xcc, 0xcf, 0xf2, 0x5d, 0x66, 0x85, 0xf7, 0xc2, 0x64, 0x14, 0x69, 0x3a, 0x5c, 0xd2, 0xf1, 0x0a, 0xe6, 0x67, 0x79,
0x9c, 0x05, 0x67, 0xd5, 0xa4, 0x9e, 0xef, 0xc1, 0xa4, 0x24, 0x84, 0x09, 0xa2, 0x4a, 0x06, 0x29, 0xce, 0x82, 0xb3, 0x6a, 0x52, 0xcf, 0xf7, 0x60, 0x52, 0x12, 0xc2, 0x04, 0x51, 0x25, 0x83, 0x94,
0x09, 0x6f, 0xa0, 0x99, 0x79, 0x52, 0xb9, 0xcf, 0xb5, 0x90, 0x05, 0xae, 0x65, 0xe3, 0x9a, 0x73, 0x84, 0x37, 0xd0, 0xcc, 0x3c, 0xa9, 0xdc, 0xe7, 0x5a, 0xc8, 0x02, 0xd7, 0xb2, 0x71, 0xcd, 0x39,
0xa2, 0x14, 0xe7, 0xa4, 0x35, 0xde, 0xe9, 0x7a, 0x6e, 0x66, 0xe3, 0x4b, 0x67, 0xe1, 0xc4, 0x11, 0x51, 0x8a, 0x73, 0xd2, 0x1a, 0xef, 0x74, 0x3d, 0x37, 0xb3, 0xf1, 0x95, 0xb3, 0x70, 0xe2, 0x08,
0xce, 0x4b, 0x8b, 0x35, 0x47, 0x7d, 0xe6, 0xb6, 0xca, 0x84, 0xad, 0xc6, 0xd2, 0x52, 0x3d, 0x61, 0xe7, 0xa5, 0xc5, 0x9a, 0xa3, 0x3e, 0x73, 0x5b, 0x65, 0xc2, 0x56, 0x63, 0x69, 0xa9, 0x9e, 0x30,
0xa6, 0x4e, 0x36, 0x2c, 0x70, 0xbc, 0xe8, 0xfa, 0x6f, 0x8a, 0x90, 0x03, 0x33, 0x37, 0xf4, 0xf7, 0x53, 0x27, 0x1b, 0x16, 0x38, 0x5e, 0x74, 0xf3, 0x37, 0x45, 0xc8, 0x81, 0x99, 0x1b, 0xfa, 0x7b,
0xce, 0x9a, 0x71, 0x15, 0xa6, 0x8e, 0x17, 0x2c, 0x51, 0x34, 0x53, 0x3f, 0x54, 0x1c, 0x53, 0xef, 0x6f, 0xcd, 0xb8, 0x0a, 0x53, 0xc7, 0x0b, 0x96, 0x28, 0x9a, 0xa9, 0x1f, 0x2a, 0x8e, 0xa9, 0x77,
0x3a, 0x3d, 0x58, 0x3d, 0xe6, 0xcd, 0xe2, 0x79, 0xd7, 0xa9, 0x56, 0xc5, 0x68, 0xcf, 0x64, 0x9f, 0x9d, 0x1e, 0xac, 0x1e, 0xf3, 0x66, 0xf1, 0xbc, 0xeb, 0x54, 0xab, 0x62, 0xb4, 0x67, 0xb2, 0x4f,
0x9d, 0x2f, 0x35, 0x74, 0x3f, 0xb5, 0x68, 0x39, 0x8e, 0x40, 0xd1, 0xbc, 0x99, 0xa2, 0x6b, 0x0d, 0xce, 0xe7, 0x1a, 0xba, 0x9f, 0x5a, 0xb4, 0x1c, 0x47, 0xa0, 0x68, 0xde, 0x4c, 0xd1, 0xb5, 0x86,
0xb5, 0xeb, 0x4c, 0x61, 0x19, 0x75, 0x6a, 0x9a, 0xde, 0xcb, 0x0b, 0xbd, 0x34, 0x92, 0x0f, 0x8d, 0xda, 0x75, 0xa6, 0xb0, 0x8c, 0x3a, 0x35, 0x4d, 0xef, 0xe5, 0x85, 0x5e, 0x19, 0xc9, 0x87, 0x46,
0xe4, 0x43, 0x13, 0x3f, 0x24, 0x6b, 0x51, 0x86, 0x45, 0xe0, 0x08, 0xd0, 0xd3, 0x5e, 0x80, 0x55, 0xf2, 0xa1, 0x89, 0x1f, 0x92, 0xb5, 0x28, 0xc3, 0x22, 0x70, 0x04, 0xe8, 0x69, 0x2f, 0xc1, 0x2a,
0x94, 0x99, 0x19, 0xbd, 0xbc, 0xa3, 0xd5, 0x38, 0xb3, 0x35, 0xcd, 0xd0, 0xd5, 0xbe, 0x79, 0xa2, 0xca, 0xcc, 0x8c, 0x5e, 0xdd, 0xd3, 0x6a, 0x9c, 0xd9, 0x9a, 0x66, 0xe8, 0x6a, 0xdf, 0x3c, 0xd1,
0xab, 0xe8, 0x5e, 0x1d, 0x6f, 0xc9, 0xd6, 0x80, 0xe1, 0x0d, 0x6c, 0xe0, 0x87, 0x96, 0xfc, 0x70, 0x55, 0x74, 0xaf, 0x8e, 0xb7, 0x64, 0x6b, 0xc0, 0xf0, 0x06, 0x36, 0xf0, 0x43, 0x4b, 0x7e, 0xb8,
0x7b, 0x29, 0x3f, 0x0c, 0xef, 0xe4, 0x87, 0x8b, 0x5b, 0xce, 0xea, 0xe1, 0x21, 0xa5, 0x07, 0x82, 0xbb, 0x92, 0x1f, 0x86, 0xf7, 0xf2, 0xc3, 0xe5, 0x1d, 0x67, 0xf5, 0xf0, 0x90, 0xd2, 0x03, 0xc1,
0x53, 0x4e, 0x0c, 0xbe, 0x1f, 0x19, 0x85, 0x27, 0xea, 0x33, 0x90, 0x9b, 0xd4, 0x96, 0x8b, 0x3f, 0x29, 0x27, 0x06, 0xdf, 0x8f, 0x8c, 0xc2, 0x13, 0xf5, 0x19, 0xc8, 0x4d, 0x6a, 0xcb, 0xc5, 0x1f,
0x82, 0xc3, 0x43, 0xf1, 0xb7, 0x16, 0xf9, 0xc0, 0xa7, 0x67, 0xf6, 0x3d, 0xd3, 0x4c, 0xa7, 0x92, 0xc1, 0xe1, 0xa1, 0xf8, 0x5b, 0x8b, 0x7c, 0xe0, 0xd3, 0x33, 0xfb, 0x9e, 0x69, 0xa6, 0x53, 0xc9,
0x8d, 0x40, 0x86, 0x55, 0x55, 0x3a, 0x1b, 0xa1, 0xfb, 0x5f, 0x47, 0x7e, 0x18, 0xae, 0x34, 0xbe, 0x46, 0x20, 0xc3, 0xaa, 0x2a, 0x9d, 0x8d, 0xd0, 0xfd, 0x2f, 0x23, 0x3f, 0x0c, 0x57, 0x1a, 0x5f,
0x4a, 0xe4, 0xfb, 0xe7, 0xbf, 0x8e, 0xae, 0x7f, 0xa9, 0x09, 0x89, 0x38, 0xd3, 0x95, 0xc4, 0xae, 0x25, 0xf2, 0xfd, 0xf3, 0x5f, 0x47, 0x37, 0xbf, 0xd4, 0x84, 0x44, 0x9c, 0xe9, 0x4a, 0x62, 0x57,
0xae, 0x89, 0x6d, 0x79, 0x3f, 0xc6, 0x64, 0xcc, 0x08, 0x44, 0x83, 0x49, 0xed, 0xab, 0xaa, 0x65, 0xd7, 0xc4, 0xb6, 0xbc, 0x1f, 0x63, 0x32, 0x66, 0x04, 0xa2, 0xc1, 0xa4, 0xf6, 0x45, 0xd5, 0x32,
0x48, 0x4d, 0x4a, 0xc5, 0xb7, 0x29, 0x78, 0xf3, 0x08, 0xac, 0x14, 0xbc, 0x2b, 0x30, 0x96, 0x01, 0xa4, 0x26, 0xa5, 0xe2, 0xdb, 0x14, 0xbc, 0x79, 0x04, 0x56, 0x0a, 0xde, 0x15, 0x18, 0xcb, 0x00,
0xf4, 0xdb, 0x87, 0x87, 0xd9, 0xb7, 0x9e, 0xd1, 0x28, 0x72, 0x40, 0xf3, 0x1c, 0x1c, 0x1f, 0x19, 0xfa, 0xed, 0xc3, 0xc3, 0xec, 0x5b, 0xcf, 0x68, 0x14, 0x39, 0xa0, 0x79, 0x0e, 0x8e, 0x8f, 0x0c,
0x06, 0x12, 0x23, 0x9e, 0x9f, 0x91, 0xa3, 0x6f, 0x20, 0x87, 0x62, 0x3b, 0x30, 0x3d, 0x90, 0x12, 0x03, 0x89, 0x11, 0xcf, 0xcf, 0xc8, 0xd1, 0x37, 0x90, 0x43, 0xb1, 0x1d, 0x98, 0x1e, 0x48, 0x09,
0x08, 0x92, 0x7f, 0xc8, 0x31, 0xd0, 0x6c, 0xee, 0x21, 0x09, 0x6f, 0x89, 0x15, 0x32, 0xc2, 0x15, 0x04, 0xc9, 0x3f, 0xe4, 0x18, 0x68, 0x36, 0xf7, 0x90, 0x84, 0xb7, 0xc4, 0x0a, 0x19, 0xe1, 0x0a,
0x10, 0xbc, 0x84, 0xbb, 0x7a, 0x9d, 0x20, 0x2a, 0xe9, 0x37, 0xd3, 0xa9, 0x1a, 0xdd, 0x6f, 0x99, 0x08, 0x5e, 0xc2, 0x5d, 0xbd, 0x4e, 0x10, 0x95, 0xf4, 0xab, 0xe9, 0x54, 0x8d, 0xee, 0xd7, 0x4c,
0x9a, 0x7e, 0x4b, 0xd4, 0xd4, 0x82, 0x45, 0xfa, 0xf6, 0x8a, 0x9a, 0x5a, 0x89, 0x7e, 0x58, 0x89, 0x4d, 0xbf, 0x26, 0x6a, 0x6a, 0xc1, 0x22, 0x7d, 0x7d, 0x45, 0x4d, 0xad, 0x44, 0x3f, 0xac, 0x44,
0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x3f, 0xac, 0x44, 0x3f, 0xac, 0x44, 0x3f, 0xac, 0x44, 0x3f, 0xac, 0x44, 0x3f, 0xac, 0x44, 0x3f,
0x58, 0x7c, 0xf1, 0x29, 0xbe, 0x34, 0xad, 0x02, 0x11, 0x43, 0x15, 0x4c, 0xf8, 0xa5, 0x4c, 0xbc, 0x2c, 0xbe, 0xf8, 0x14, 0x5f, 0x9a, 0x56, 0x81, 0x88, 0xa1, 0x0a, 0x26, 0xfc, 0x52, 0x26, 0xde,
0x55, 0xcb, 0xfd, 0x57, 0xb4, 0x5c, 0xe8, 0xe6, 0xb7, 0x54, 0x37, 0x73, 0xe2, 0xca, 0x3d, 0xdf, 0xaa, 0xe5, 0xfe, 0x2b, 0x5a, 0x2e, 0x74, 0xf3, 0x6b, 0xaa, 0x9b, 0x39, 0x71, 0xe5, 0x9e, 0x6f,
0x50, 0xb5, 0x1b, 0xc7, 0xe3, 0xfe, 0xd5, 0x75, 0x6c, 0x5c, 0xdc, 0xf8, 0x91, 0x31, 0x0f, 0x74, 0xa8, 0xda, 0xad, 0xe3, 0x71, 0xff, 0xea, 0x3a, 0x36, 0x2e, 0x6e, 0xfc, 0xc4, 0x98, 0x07, 0x3a,
0x2e, 0xb5, 0xc6, 0x75, 0x1d, 0xbf, 0x48, 0xa6, 0xd7, 0x07, 0x5c, 0xcb, 0xbe, 0x15, 0x56, 0xe1, 0x97, 0x5a, 0xe3, 0xba, 0x8e, 0x5f, 0x24, 0xd3, 0xeb, 0x03, 0xae, 0x65, 0x5f, 0x0b, 0xab, 0xf0,
0x5b, 0x7e, 0x15, 0xd6, 0xf0, 0x9f, 0x20, 0x70, 0xa0, 0x67, 0xee, 0x26, 0x0e, 0x57, 0xa3, 0xe5, 0x35, 0xbf, 0x0a, 0x6b, 0xf8, 0x4f, 0x10, 0x38, 0xd0, 0x33, 0x77, 0x13, 0x87, 0xab, 0xd1, 0x72,
0x18, 0x1c, 0x95, 0x92, 0x18, 0xc8, 0x68, 0x5a, 0x43, 0x3f, 0x9d, 0xc3, 0x53, 0xc3, 0x6c, 0x03, 0x0c, 0x8e, 0x4a, 0x49, 0x0c, 0x64, 0x34, 0xad, 0xa1, 0x9f, 0xce, 0xe1, 0xa9, 0x61, 0xb6, 0x01,
0xa6, 0xfc, 0x9e, 0x4d, 0xad, 0xa5, 0x1b, 0x23, 0xb6, 0xc4, 0x4b, 0x25, 0x2c, 0x83, 0xd0, 0x62, 0x53, 0x3e, 0x67, 0x53, 0x6b, 0xe9, 0xc6, 0x88, 0x2d, 0xf1, 0x52, 0x09, 0xcb, 0x20, 0xb4, 0xd8,
0x3f, 0xb8, 0x09, 0x7d, 0xf0, 0xf3, 0x96, 0x70, 0x9e, 0x52, 0xd3, 0x78, 0xe2, 0xd1, 0x37, 0xc0, 0x0f, 0x6e, 0x43, 0x1f, 0xfc, 0xbc, 0x25, 0x9c, 0xa7, 0xd4, 0x34, 0x9e, 0x78, 0xf4, 0x0d, 0x70,
0x35, 0x4a, 0x9f, 0x44, 0xef, 0x7c, 0x9f, 0x2c, 0x2c, 0x6f, 0x45, 0x20, 0x01, 0x8a, 0x08, 0xe8, 0x8d, 0xd2, 0x27, 0xd1, 0x7b, 0xdf, 0x27, 0x0b, 0xcb, 0x5b, 0x11, 0x48, 0x80, 0x22, 0x02, 0xba,
0x06, 0x59, 0x30, 0x12, 0xfb, 0x64, 0x6e, 0x79, 0x13, 0x97, 0x1d, 0xd0, 0x2e, 0x7a, 0xc8, 0x9e, 0x41, 0x16, 0x8c, 0xc4, 0x3e, 0x99, 0x5b, 0xde, 0xc4, 0x65, 0x07, 0xb4, 0x8b, 0x1e, 0xb2, 0x67,
0xc1, 0x5a, 0x87, 0x87, 0x8a, 0x57, 0x35, 0xe9, 0xef, 0xde, 0xef, 0xe1, 0x19, 0x04, 0x28, 0xc8, 0xb0, 0xd6, 0xe1, 0xa1, 0xe2, 0x55, 0x4d, 0xfa, 0xbb, 0xf7, 0x7b, 0x78, 0x06, 0x01, 0x0a, 0x32,
0x48, 0x42, 0xd0, 0x70, 0x8c, 0x3c, 0xa0, 0xf1, 0xe7, 0xa3, 0x9b, 0x66, 0x03, 0x55, 0x4f, 0x48, 0x92, 0x10, 0x34, 0x1c, 0x23, 0x0f, 0x68, 0xfc, 0xc5, 0xe8, 0xb6, 0xd9, 0x40, 0xd5, 0x13, 0xd2,
0xcb, 0x53, 0xd7, 0x9c, 0x75, 0x1e, 0xfd, 0x7e, 0xb3, 0x5c, 0x67, 0xe2, 0xc4, 0x2b, 0x45, 0x45, 0xf2, 0xd4, 0x35, 0x67, 0x9d, 0x47, 0xbf, 0xdf, 0x2c, 0xd7, 0x99, 0x38, 0xf1, 0x4a, 0x51, 0xd1,
0x4b, 0x87, 0xa7, 0x91, 0x98, 0x62, 0xce, 0x3b, 0x33, 0x8f, 0x87, 0x46, 0xe9, 0x65, 0x79, 0xb4, 0xd2, 0xe1, 0x69, 0x24, 0xa6, 0x98, 0xf3, 0xce, 0xcc, 0xe3, 0xa1, 0x51, 0x7a, 0x59, 0x1e, 0x6d,
0xc1, 0x84, 0x8d, 0xaa, 0x02, 0x03, 0x9b, 0x74, 0xf9, 0xc0, 0xcb, 0x53, 0x29, 0x07, 0x36, 0x10, 0x30, 0x61, 0xa3, 0xaa, 0xc0, 0xc0, 0x26, 0x5d, 0x3e, 0xf0, 0xea, 0x54, 0xca, 0x81, 0x0d, 0x44,
0x49, 0x57, 0x47, 0xd7, 0x12, 0x60, 0x80, 0x15, 0x51, 0x65, 0xe2, 0x44, 0x10, 0x0e, 0x56, 0x00, 0xd2, 0xd5, 0xd1, 0xb5, 0x04, 0x18, 0x60, 0x45, 0x54, 0x99, 0x38, 0x11, 0x84, 0x83, 0x15, 0xc0,
0x03, 0x6e, 0xd9, 0x75, 0x20, 0xae, 0x74, 0x64, 0x78, 0xe1, 0xa0, 0x41, 0xb4, 0x6c, 0xbc, 0x01, 0x80, 0x5b, 0x76, 0x1d, 0x88, 0x2b, 0x1d, 0x19, 0x5e, 0x38, 0x68, 0x10, 0x2d, 0x1b, 0x6f, 0x80,
0xb6, 0x40, 0xaf, 0xaf, 0x1f, 0x1e, 0xa6, 0xe1, 0x3b, 0xc7, 0xf4, 0xe5, 0x69, 0x2e, 0x32, 0x70, 0x2d, 0xd0, 0xeb, 0xeb, 0x87, 0x87, 0x69, 0xf8, 0xce, 0x31, 0x7d, 0x75, 0x9a, 0x8b, 0x0c, 0x1c,
0x78, 0x48, 0x91, 0xc4, 0x90, 0x4d, 0x86, 0x05, 0xf1, 0xcb, 0x53, 0xa0, 0xb8, 0x45, 0xbd, 0xad, 0x1e, 0x52, 0x24, 0x31, 0x64, 0x93, 0x61, 0x41, 0xfc, 0xea, 0x14, 0x28, 0x6e, 0x51, 0x6f, 0xeb,
0x9b, 0x25, 0x1c, 0xfc, 0x7a, 0x91, 0x27, 0x96, 0x90, 0x7f, 0x8e, 0x1e, 0x9d, 0xd8, 0x9e, 0x2b, 0x66, 0x09, 0x07, 0xbf, 0x5e, 0xe6, 0x89, 0x25, 0xe4, 0x9f, 0xa3, 0x27, 0x27, 0xb6, 0xe7, 0x4a,
0x25, 0x32, 0x82, 0x34, 0x49, 0xdb, 0x64, 0x03, 0x70, 0x6b, 0x39, 0x83, 0xc9, 0xb1, 0x04, 0x96, 0x89, 0x8c, 0x20, 0x4d, 0xd2, 0x36, 0xd9, 0x00, 0xdc, 0x5a, 0xce, 0x60, 0x72, 0x2c, 0x81, 0xa5,
0x66, 0x5b, 0x11, 0x23, 0x7a, 0xa7, 0x14, 0x95, 0xa1, 0xc9, 0x35, 0xe9, 0x8e, 0x21, 0xe1, 0xba, 0xd9, 0x56, 0xc4, 0x88, 0xde, 0x29, 0x45, 0x65, 0x68, 0x72, 0x4d, 0xba, 0x63, 0x48, 0xb8, 0x1e,
0xef, 0x72, 0xd8, 0xa6, 0xde, 0xd9, 0x22, 0xd0, 0xd4, 0x0b, 0x10, 0xed, 0x12, 0x88, 0x76, 0x1e, 0xba, 0x1c, 0xb6, 0xa9, 0x77, 0xb6, 0x08, 0x34, 0xf5, 0x02, 0x44, 0xbb, 0x04, 0xa2, 0x9d, 0x87,
0xa2, 0x5d, 0x02, 0xd1, 0x2e, 0x40, 0x34, 0xca, 0x40, 0x1a, 0x29, 0xcc, 0x44, 0xe8, 0x7d, 0x67, 0x68, 0x97, 0x40, 0xb4, 0x0b, 0x10, 0x8d, 0x32, 0x90, 0x46, 0x0a, 0x33, 0x11, 0x7a, 0xdf, 0xd9,
0x8f, 0x40, 0x13, 0x51, 0xae, 0x39, 0xcc, 0xc2, 0x00, 0x80, 0x2c, 0x65, 0x41, 0x7d, 0xd6, 0x4a, 0x23, 0xd0, 0x44, 0x94, 0x6b, 0x0e, 0xb3, 0x30, 0x00, 0x20, 0x4b, 0x59, 0x50, 0x9f, 0xb5, 0x52,
0x7d, 0xc7, 0x08, 0xb2, 0x5b, 0xf4, 0x1c, 0xdb, 0xc9, 0x99, 0xd0, 0x58, 0x48, 0x50, 0x12, 0xfb, 0xdf, 0x31, 0x82, 0xec, 0x16, 0x3d, 0xc7, 0x76, 0x72, 0x26, 0x34, 0x16, 0x12, 0x94, 0xc4, 0x3e,
0x54, 0x37, 0x96, 0x07, 0xb0, 0x5d, 0xb1, 0x05, 0x66, 0x17, 0x49, 0xa6, 0xfa, 0x8a, 0x9b, 0x3a, 0xd5, 0x8d, 0xe5, 0x01, 0x6c, 0xd7, 0x6c, 0x81, 0xd9, 0x45, 0x92, 0xa9, 0xbe, 0xe2, 0xa6, 0xce,
0xa3, 0x55, 0x2f, 0x73, 0x53, 0x6a, 0x57, 0x5a, 0x6e, 0x5c, 0x7d, 0x65, 0xe0, 0xe8, 0xb2, 0x38, 0x68, 0xd5, 0xcb, 0xdc, 0x94, 0xda, 0x95, 0x96, 0x1b, 0x57, 0x5f, 0x19, 0x38, 0xba, 0x2a, 0x0e,
0x50, 0x63, 0xbd, 0x66, 0x63, 0x90, 0xd9, 0x68, 0xd3, 0x34, 0xcb, 0x09, 0xea, 0x85, 0x71, 0x03, 0xd4, 0x58, 0xaf, 0xd9, 0x18, 0x64, 0x36, 0xda, 0x34, 0xcd, 0x72, 0x82, 0x7a, 0x61, 0xdc, 0x80,
0xd6, 0x6f, 0xbc, 0x1b, 0x34, 0xf4, 0xbf, 0xc4, 0x1d, 0xa3, 0x0d, 0xff, 0x43, 0x04, 0x7d, 0x13, 0xf5, 0x1b, 0xef, 0x06, 0x0d, 0xfd, 0x2f, 0x71, 0xc7, 0x68, 0xc3, 0xff, 0x10, 0x41, 0xdf, 0x04,
0x30, 0x88, 0x17, 0x27, 0xf0, 0xe8, 0x18, 0xfe, 0xf1, 0x2f, 0x2d, 0xf8, 0xd0, 0xe4, 0x5f, 0x9a, 0x0c, 0xe2, 0xc5, 0x09, 0x3c, 0x3a, 0x86, 0x7f, 0xfc, 0x4b, 0x0b, 0x3e, 0x34, 0xf9, 0x97, 0xa6,
0x06, 0x38, 0xcb, 0x5e, 0xeb, 0x64, 0xd0, 0xee, 0xb4, 0x5a, 0xa0, 0xb3, 0x2f, 0x2f, 0xad, 0x36, 0x01, 0xce, 0xb2, 0xd7, 0x3a, 0x19, 0xb4, 0x3b, 0xad, 0x16, 0xe8, 0xec, 0xcb, 0x4b, 0xab, 0x8d,
0xaa, 0xae, 0x84, 0xc8, 0xc4, 0x01, 0xc2, 0x61, 0x69, 0xfa, 0x88, 0x89, 0xa4, 0x06, 0xd5, 0x4e, 0xaa, 0x2b, 0x21, 0x32, 0x71, 0x80, 0x70, 0x58, 0x9a, 0x3e, 0x62, 0x22, 0xa9, 0x41, 0xb5, 0xd3,
0x57, 0x28, 0xda, 0x22, 0x78, 0xb4, 0x42, 0x0f, 0xfc, 0xc6, 0xd6, 0xb2, 0xf1, 0x45, 0xbf, 0x4a, 0x15, 0x8a, 0xb6, 0x08, 0x9e, 0xac, 0xd0, 0x03, 0xbf, 0xb1, 0xb5, 0x6c, 0x7c, 0xd1, 0xaf, 0x13,
0x6c, 0xee, 0xa7, 0x86, 0xae, 0x6f, 0x19, 0x05, 0xa8, 0x81, 0x69, 0x16, 0xf4, 0x58, 0x7a, 0x02, 0x9b, 0xfb, 0xa9, 0xa1, 0xeb, 0x5b, 0x46, 0x01, 0x6a, 0x60, 0x9a, 0x05, 0x3d, 0x96, 0x9e, 0xc0,
0xd3, 0x68, 0x74, 0xb6, 0x6c, 0x56, 0x91, 0xef, 0x8a, 0x8a, 0xdf, 0x15, 0x61, 0x6e, 0x57, 0x2e, 0x34, 0x1a, 0x9d, 0x2d, 0x9b, 0x55, 0xe4, 0xbb, 0xa2, 0xe2, 0x77, 0x45, 0x98, 0xdb, 0x95, 0xcb,
0x07, 0x3a, 0xc7, 0xec, 0x62, 0x32, 0x67, 0xe5, 0x93, 0x39, 0x1e, 0xba, 0x78, 0x3c, 0xdb, 0x91, 0x81, 0xce, 0x31, 0xbb, 0x98, 0xcc, 0x59, 0xf9, 0x64, 0x8e, 0x87, 0x2e, 0x1e, 0xcf, 0x76, 0xa4,
0xce, 0x25, 0x21, 0xcc, 0x2a, 0x4d, 0xd4, 0x34, 0x37, 0x5b, 0x61, 0xab, 0x90, 0xdc, 0x08, 0xf9, 0x73, 0x49, 0x08, 0xb3, 0x4a, 0x13, 0x35, 0xcd, 0xcd, 0x56, 0xd8, 0x2a, 0x24, 0x37, 0x42, 0x3e,
0x04, 0xfa, 0x04, 0x23, 0x58, 0x4e, 0x61, 0x5d, 0x0c, 0x60, 0x87, 0x87, 0x6e, 0xef, 0xdd, 0xf1, 0x81, 0x3e, 0xc1, 0x08, 0x96, 0x53, 0x58, 0x17, 0x03, 0xd8, 0xe1, 0xa1, 0xdb, 0x7b, 0x77, 0x3c,
0x80, 0x5e, 0xdc, 0x10, 0x50, 0x4f, 0xa8, 0xe6, 0xa2, 0x0e, 0xed, 0xb8, 0xfd, 0xd6, 0xbb, 0x01, 0xa0, 0x97, 0xb7, 0x04, 0xd4, 0x13, 0xaa, 0xb9, 0xa8, 0x43, 0x3b, 0x6e, 0xbf, 0xf5, 0x6e, 0x40,
0x7d, 0x0f, 0xf1, 0x81, 0x7c, 0xbc, 0xb9, 0xb8, 0x16, 0x4f, 0x8c, 0x01, 0xc5, 0x2f, 0xf8, 0x9e, 0xcf, 0x21, 0x3e, 0x90, 0x0f, 0xb7, 0x97, 0x37, 0xe2, 0x89, 0x31, 0xa0, 0xf8, 0x05, 0xdf, 0x53,
0x8a, 0xa7, 0xd2, 0xf1, 0x19, 0xdb, 0x88, 0x5b, 0xef, 0x10, 0xef, 0x71, 0x6b, 0x40, 0xcf, 0xdc, 0xf1, 0x54, 0x3a, 0x3e, 0x63, 0x1b, 0x71, 0xeb, 0x1d, 0xe2, 0x3d, 0x6e, 0x0d, 0xe8, 0x99, 0xfb,
0xfb, 0x04, 0x07, 0xa5, 0x5c, 0x42, 0xd1, 0x0e, 0x45, 0x32, 0x64, 0x80, 0xe5, 0xf2, 0x01, 0x7d, 0x90, 0xe0, 0xa0, 0x94, 0x4b, 0x28, 0xda, 0xa1, 0x48, 0x86, 0x0c, 0xb0, 0x5c, 0x3e, 0xa0, 0xaf,
0x95, 0xaa, 0xef, 0x6a, 0xbe, 0xaa, 0x4d, 0x4d, 0x48, 0x2f, 0x7a, 0xed, 0xee, 0x14, 0xb3, 0x09, 0x52, 0xf5, 0x5d, 0xcd, 0x57, 0xb5, 0xa9, 0x09, 0xe9, 0x45, 0xaf, 0xdd, 0x9d, 0x62, 0x36, 0xa1,
0x65, 0x17, 0x06, 0x5a, 0x9d, 0x0a, 0x14, 0x2a, 0x2e, 0x51, 0x36, 0xbb, 0xc3, 0xc3, 0x69, 0xaf, 0xec, 0xc2, 0x40, 0xab, 0x53, 0x81, 0x42, 0xc5, 0x25, 0xca, 0x66, 0x77, 0x78, 0x38, 0xed, 0xb5,
0xf5, 0xf2, 0x22, 0xd8, 0x32, 0x4c, 0x73, 0xca, 0x3f, 0x1b, 0xf8, 0xb2, 0x0d, 0x20, 0xd3, 0x6a, 0x5e, 0x5e, 0x04, 0x5b, 0x86, 0x69, 0x4e, 0xf9, 0x67, 0x03, 0x5f, 0xb6, 0x01, 0x64, 0x5a, 0x6d,
0x4b, 0xef, 0xb9, 0x03, 0x25, 0xda, 0x61, 0xed, 0x5a, 0x04, 0x95, 0xc0, 0x3f, 0x96, 0x4e, 0xc8, 0xe9, 0x3d, 0x77, 0xa0, 0x44, 0x3b, 0xac, 0x5d, 0x8b, 0xa0, 0x12, 0xf8, 0xc7, 0xd2, 0x09, 0xb9,
0x5d, 0xa1, 0xda, 0xd9, 0x06, 0x14, 0x3a, 0x94, 0x07, 0x83, 0x92, 0x3b, 0x0d, 0xad, 0xaa, 0xba, 0x2b, 0x54, 0x3b, 0xdb, 0x80, 0x42, 0x87, 0xf2, 0x60, 0x50, 0x72, 0xa7, 0xa1, 0x55, 0x55, 0xd7,
0x86, 0x64, 0x40, 0x78, 0xd6, 0x70, 0xca, 0x65, 0x95, 0xb8, 0xc3, 0x92, 0x67, 0x2f, 0x2f, 0x4d, 0x90, 0x0c, 0x08, 0xcf, 0x1a, 0x4e, 0xb9, 0xac, 0x12, 0x77, 0x58, 0xf2, 0xec, 0xe5, 0xa5, 0x09,
0x60, 0xd1, 0xd5, 0x5c, 0x6e, 0x15, 0x2e, 0x58, 0x05, 0x8c, 0xdd, 0x69, 0xeb, 0xb9, 0x94, 0xc4, 0x2c, 0xba, 0x9a, 0xcb, 0xad, 0xc2, 0x05, 0xab, 0x80, 0xb1, 0x3b, 0x6d, 0x3d, 0x97, 0x92, 0x98,
0x84, 0x24, 0x47, 0xcb, 0x23, 0xf4, 0x3d, 0x1b, 0x92, 0x8a, 0x7b, 0x93, 0xe3, 0x1b, 0xe4, 0xea, 0x90, 0xe4, 0x68, 0x79, 0x84, 0xbe, 0x67, 0x43, 0x52, 0xf1, 0x60, 0x72, 0x7c, 0x83, 0x5c, 0xbd,
0x1d, 0x99, 0x1f, 0x18, 0xeb, 0x4e, 0xee, 0xe1, 0x5a, 0xf3, 0x5e, 0xc0, 0xe9, 0x02, 0xa8, 0xe4, 0x23, 0xf3, 0x03, 0x63, 0xdd, 0xc9, 0x3d, 0x5c, 0x6b, 0xde, 0x0b, 0x38, 0x5d, 0x00, 0x95, 0x1c,
0x80, 0x0b, 0x89, 0x4b, 0xb0, 0x05, 0x12, 0x6c, 0x35, 0x0f, 0x80, 0x29, 0x8e, 0xde, 0xf6, 0x39, 0x70, 0x21, 0x71, 0x09, 0xb6, 0x40, 0x82, 0xad, 0xe6, 0x01, 0x30, 0xc5, 0xd1, 0xdb, 0x3e, 0x47,
0xfa, 0xa2, 0x0c, 0x72, 0xe2, 0xc6, 0x81, 0xa6, 0x1c, 0x79, 0x32, 0x10, 0xc2, 0xe9, 0xa4, 0xc2, 0x5f, 0x94, 0x41, 0x4e, 0xdc, 0x38, 0xd0, 0x94, 0x23, 0x4f, 0x06, 0x42, 0x38, 0x9d, 0x54, 0x98,
0xe4, 0x28, 0x26, 0xce, 0x0c, 0x70, 0x54, 0xe9, 0xe3, 0x96, 0xad, 0xe6, 0x39, 0xd8, 0xb2, 0xd2, 0x1c, 0xc5, 0xc4, 0x99, 0x01, 0x8e, 0x2a, 0x7d, 0xda, 0xb2, 0xd5, 0x3c, 0x07, 0x5b, 0x56, 0xda,
0xa6, 0x0e, 0x4c, 0x80, 0x2f, 0x32, 0xf8, 0x9f, 0x72, 0xa9, 0x7c, 0xba, 0x2e, 0x4a, 0x45, 0x57, 0xd4, 0x81, 0x09, 0xf0, 0x45, 0x06, 0xff, 0x53, 0x2e, 0x95, 0x8f, 0x37, 0x45, 0xa9, 0xe8, 0x6a,
0x8b, 0x24, 0x6d, 0x5a, 0xc2, 0xfa, 0xdb, 0xb8, 0x0d, 0xe9, 0x9e, 0x59, 0xef, 0x1f, 0x1a, 0xd1, 0x91, 0xa4, 0x4d, 0x4b, 0x58, 0x7f, 0x1b, 0xb7, 0x21, 0xdd, 0x33, 0xeb, 0xfd, 0x43, 0x23, 0xfa,
0xff, 0x1d, 0x81, 0x4d, 0xcb, 0xf0, 0x18, 0xc7, 0x38, 0xb4, 0xd9, 0xe0, 0x78, 0xda, 0x7a, 0x62, 0xbf, 0x23, 0xb0, 0x69, 0x19, 0x1e, 0xe3, 0x18, 0x87, 0x36, 0x1b, 0x1c, 0x4f, 0x5b, 0x4f, 0x4c,
0x7a, 0x65, 0x59, 0x4a, 0x82, 0xc7, 0xda, 0xc2, 0x03, 0xc5, 0x41, 0x0b, 0xc5, 0x5b, 0x3e, 0x0e, 0xaf, 0x2c, 0x4b, 0x49, 0xf0, 0x58, 0x5b, 0x78, 0xa0, 0x38, 0x68, 0xa1, 0x78, 0xcb, 0xc7, 0x81,
0xbc, 0xdd, 0xb6, 0xf7, 0xc8, 0x58, 0xbe, 0xf0, 0x1e, 0x20, 0x3d, 0x63, 0x13, 0x02, 0xa5, 0x35, 0xb7, 0xdb, 0xf6, 0x1e, 0x19, 0xcb, 0x97, 0xde, 0x23, 0xa4, 0x67, 0x6c, 0x42, 0xa0, 0xb4, 0xc6,
0x56, 0xac, 0x1d, 0x7a, 0x0b, 0xb9, 0x24, 0x78, 0xa3, 0x09, 0x51, 0x42, 0x3f, 0xb6, 0xf0, 0x95, 0x8a, 0xb5, 0x43, 0xef, 0x20, 0x97, 0x04, 0x6f, 0x34, 0x21, 0x4a, 0xe8, 0xc7, 0x16, 0xbe, 0x32,
0x71, 0xa2, 0xff, 0xf7, 0x7f, 0xa9, 0x69, 0xb6, 0x34, 0xd9, 0x8f, 0x6f, 0xc2, 0x9e, 0xd0, 0x65, 0x4e, 0xf4, 0xff, 0xfe, 0x2f, 0x35, 0xcd, 0x96, 0x26, 0xfb, 0xf1, 0x4d, 0xd8, 0x37, 0x74, 0x19,
0xf0, 0x16, 0x56, 0x87, 0xae, 0xd1, 0x71, 0x84, 0x60, 0xf6, 0xff, 0x58, 0x32, 0x08, 0x95, 0xdc, 0xbc, 0x85, 0xd5, 0xa1, 0x6b, 0x74, 0x1c, 0x21, 0x98, 0xfd, 0x3f, 0x96, 0x0c, 0x42, 0x25, 0xf7,
0x93, 0xfa, 0xe1, 0xa9, 0xeb, 0x2a, 0xb4, 0xf6, 0x08, 0x2b, 0xaa, 0x2d, 0xcd, 0x30, 0xf1, 0xa5, 0xa4, 0x7e, 0x78, 0xea, 0xba, 0x0a, 0xad, 0x3d, 0xc1, 0x8a, 0x6a, 0x4b, 0x33, 0x4c, 0x7c, 0x69,
0x99, 0x7b, 0x5d, 0x72, 0xbf, 0x1a, 0xa2, 0x33, 0xdc, 0x98, 0xeb, 0xe6, 0x24, 0xb9, 0x63, 0x0a, 0xe6, 0x5e, 0x97, 0xdc, 0xaf, 0x86, 0xe8, 0x0c, 0x37, 0xe6, 0xba, 0x39, 0x49, 0xee, 0x98, 0x82,
0x5e, 0x2b, 0xc3, 0xb5, 0x85, 0xa9, 0x6b, 0x0f, 0xd8, 0x5e, 0x03, 0xf4, 0x19, 0x99, 0x60, 0xab, 0xd7, 0xca, 0x70, 0x6d, 0x61, 0xea, 0xda, 0x23, 0xb6, 0xd7, 0x00, 0x7d, 0x46, 0x26, 0xd8, 0x2a,
0x24, 0x9f, 0x99, 0xc1, 0xae, 0x92, 0xdc, 0x2f, 0x7d, 0x95, 0x14, 0x41, 0x67, 0x50, 0x41, 0xcc, 0xc9, 0x67, 0x66, 0xb0, 0xab, 0x24, 0xf7, 0x4b, 0x5f, 0x25, 0x45, 0xd0, 0x19, 0x54, 0x10, 0x33,
0x64, 0x15, 0x83, 0x05, 0xd1, 0x2c, 0x29, 0x88, 0x66, 0xea, 0x2b, 0x2e, 0x00, 0x02, 0xad, 0xc9, 0x59, 0xc5, 0x60, 0x41, 0x34, 0x4b, 0x0a, 0xa2, 0x99, 0xfa, 0x8a, 0x0b, 0x80, 0x40, 0x6b, 0xf2,
0x9b, 0x0d, 0xdd, 0x92, 0xc1, 0x49, 0x35, 0x35, 0x4b, 0xaa, 0x29, 0x41, 0x43, 0x71, 0xcd, 0x3f, 0x66, 0x43, 0xb7, 0x64, 0x70, 0x52, 0x4d, 0xcd, 0x92, 0x6a, 0x4a, 0xd0, 0x50, 0x5c, 0xf3, 0x4f,
0x55, 0xf4, 0xa8, 0xa2, 0xe4, 0x79, 0xe6, 0x33, 0x40, 0x82, 0x10, 0x35, 0x35, 0xf1, 0xc5, 0xf1, 0x15, 0x3d, 0xaa, 0x28, 0x79, 0x9e, 0xf9, 0x0c, 0x90, 0x20, 0x44, 0x4d, 0x4d, 0x7c, 0x71, 0x3c,
0x40, 0x2c, 0x41, 0x26, 0x69, 0xdb, 0x77, 0xfd, 0xd0, 0xa4, 0xdf, 0x4d, 0xa7, 0x53, 0xda, 0x4d, 0x10, 0x4b, 0x90, 0x49, 0xda, 0xf6, 0x5d, 0x3f, 0x34, 0xe9, 0x77, 0xd3, 0xe9, 0x94, 0x76, 0xd3,
0x6b, 0xa4, 0x74, 0x60, 0xb3, 0x99, 0x8d, 0x3b, 0x32, 0x72, 0x1d, 0x82, 0x7d, 0x3c, 0x27, 0x15, 0x1a, 0x29, 0x1d, 0xd8, 0x6c, 0x66, 0xe3, 0x8e, 0x8c, 0x5c, 0x87, 0x60, 0x1f, 0xcf, 0x49, 0x05,
0xe0, 0x2c, 0xa9, 0x00, 0x67, 0x49, 0x05, 0x38, 0x4b, 0x2a, 0xc0, 0x99, 0xec, 0x10, 0x04, 0x5b, 0x38, 0x4b, 0x2a, 0xc0, 0x59, 0x52, 0x01, 0xce, 0x92, 0x0a, 0x70, 0x26, 0x3b, 0x04, 0xc1, 0x56,
0x1d, 0x82, 0x20, 0xd7, 0x21, 0xc0, 0x25, 0x9a, 0x9a, 0x9f, 0xbf, 0x74, 0x73, 0xad, 0x82, 0xd3, 0x87, 0x20, 0xc8, 0x75, 0x08, 0x70, 0x89, 0xa6, 0xe6, 0xa7, 0xcf, 0xdd, 0x5c, 0xab, 0xe0, 0x34,
0x30, 0xb4, 0x56, 0x35, 0x27, 0xe2, 0x7f, 0x93, 0x12, 0x5f, 0xc5, 0x45, 0xbe, 0x87, 0x45, 0xbe, 0x0c, 0xad, 0x55, 0xcd, 0x89, 0xf8, 0xdf, 0xa4, 0xc4, 0x57, 0x71, 0x91, 0x1f, 0x60, 0x91, 0x1f,
0xef, 0xc9, 0x56, 0x82, 0x5c, 0xe9, 0x7b, 0x58, 0xe9, 0x69, 0x2d, 0x58, 0x46, 0x73, 0x09, 0xfa, 0x7a, 0xb2, 0x95, 0x20, 0x57, 0xfa, 0x01, 0x56, 0x7a, 0x5a, 0x0b, 0x96, 0xd1, 0x5c, 0x82, 0x7e,
0xf9, 0xfe, 0x8b, 0x2a, 0x0b, 0x60, 0x1d, 0xca, 0xdf, 0x20, 0x5f, 0xfe, 0x02, 0x15, 0xe7, 0xc0, 0x7a, 0xf8, 0xac, 0xca, 0x02, 0x58, 0x87, 0xf2, 0x37, 0xc8, 0x97, 0xbf, 0x40, 0xc5, 0x39, 0x30,
0xfc, 0x26, 0xe8, 0xae, 0x80, 0x93, 0xd7, 0xca, 0xe0, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0xbf, 0x0a, 0xba, 0x2b, 0xe0, 0xe4, 0xb5, 0x32, 0x78, 0x95, 0x08, 0x61, 0x95, 0x08, 0x61, 0x95,
0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0xae, 0x08, 0x61, 0x95, 0x08, 0x61, 0x95, 0x08, 0x61, 0x95, 0x08, 0x61, 0x95, 0x08, 0x61, 0x95, 0x2b,
0x0c, 0x5e, 0x95, 0x96, 0xc1, 0x97, 0xa5, 0x4c, 0xbc, 0xb5, 0x0c, 0xbe, 0xdc, 0x57, 0x06, 0x0b, 0x83, 0x57, 0xa5, 0x65, 0xf0, 0x55, 0x29, 0x13, 0x6f, 0x2d, 0x83, 0xaf, 0xf6, 0x95, 0xc1, 0x42,
0xe9, 0x7f, 0xdb, 0x92, 0x7e, 0xf6, 0x44, 0xca, 0x2d, 0xa5, 0x93, 0xbd, 0xe3, 0x9d, 0x98, 0xf5, 0xfa, 0x5f, 0xb7, 0xa4, 0x9f, 0x3d, 0x91, 0x72, 0x4b, 0xe9, 0x64, 0xef, 0x78, 0x27, 0x66, 0xbd,
0x7a, 0x2a, 0x1a, 0x36, 0xcc, 0xec, 0xb3, 0x5c, 0xc3, 0x26, 0x28, 0x36, 0x6c, 0x06, 0xdb, 0xca, 0x9e, 0x8a, 0x86, 0x0d, 0x33, 0xfb, 0x2c, 0xd7, 0xb0, 0x09, 0x8a, 0x0d, 0x9b, 0xc1, 0xb6, 0xb2,
0x06, 0x81, 0x97, 0x76, 0xb6, 0x1e, 0xef, 0x40, 0xd0, 0x6f, 0x36, 0x07, 0xd4, 0x0f, 0x2d, 0x6f, 0x41, 0xe0, 0xa5, 0x9d, 0xad, 0xc7, 0x3b, 0x10, 0xf4, 0x9b, 0xcd, 0x01, 0xf5, 0x43, 0xcb, 0x9b,
0x86, 0x4e, 0x80, 0xeb, 0xe9, 0x7a, 0xcd, 0xdc, 0x88, 0x71, 0x01, 0x5d, 0xec, 0x1a, 0xd6, 0xcd, 0xa1, 0x13, 0xe0, 0x7a, 0xba, 0x5e, 0x33, 0x37, 0x62, 0x5c, 0x40, 0x97, 0xbb, 0x86, 0x75, 0xf3,
0x77, 0xd6, 0xa1, 0x78, 0xcb, 0xfa, 0xea, 0x9f, 0xfd, 0x2f, 0x2f, 0x2f, 0x22, 0xc8, 0xbb, 0x11, 0x9d, 0x75, 0x28, 0xde, 0xb2, 0xbe, 0xfa, 0x27, 0xff, 0xf3, 0xcb, 0x8b, 0x08, 0xf2, 0x6e, 0xc4,
0xf7, 0x6d, 0x22, 0xfe, 0x2c, 0x64, 0xfc, 0x91, 0x0f, 0xc1, 0x05, 0x61, 0x49, 0x04, 0x29, 0x42, 0x7d, 0x9b, 0x88, 0x3f, 0x0b, 0x19, 0x7f, 0xe4, 0x43, 0x70, 0x41, 0x58, 0x12, 0x41, 0x8a, 0x90,
0x1e, 0x93, 0x76, 0x01, 0xe1, 0x4c, 0xb1, 0x32, 0xaa, 0x5b, 0x78, 0x54, 0xb5, 0x7a, 0xd1, 0x5f, 0xc7, 0xa4, 0x5d, 0x42, 0x38, 0x53, 0xac, 0x8c, 0xea, 0x16, 0x1e, 0x55, 0xad, 0x5e, 0xf6, 0x17,
0x00, 0xd4, 0xc2, 0xb4, 0xaa, 0x17, 0xaa, 0x76, 0xd1, 0xb7, 0xe1, 0x8b, 0x6d, 0xc2, 0xc7, 0x3f, 0x00, 0xb5, 0x30, 0xad, 0xea, 0xa5, 0xaa, 0x5d, 0xf6, 0x6d, 0xf8, 0x62, 0x9b, 0xf0, 0xf1, 0xcf,
0x6f, 0xc6, 0x3d, 0x8c, 0x3c, 0xca, 0x43, 0x15, 0x46, 0x83, 0xbc, 0x05, 0x2d, 0x8c, 0x8b, 0xd8, 0x9b, 0x71, 0x0f, 0x23, 0x8f, 0xf2, 0x58, 0x85, 0xd1, 0x20, 0x6f, 0x41, 0x0b, 0xe3, 0x22, 0x36,
0xbc, 0x3e, 0x93, 0xbb, 0x22, 0x0b, 0xe9, 0xa8, 0xb7, 0x9e, 0x9b, 0xe6, 0xc3, 0x80, 0x82, 0xcc, 0xaf, 0xcf, 0xe4, 0xae, 0xc8, 0x42, 0x3a, 0xea, 0xad, 0xe7, 0xa6, 0xf9, 0x38, 0xa0, 0x20, 0x33,
0x14, 0x5a, 0x7d, 0xa8, 0x52, 0x12, 0xcc, 0x57, 0x91, 0x63, 0x5b, 0x6e, 0xe2, 0xd9, 0x17, 0x7a, 0x85, 0x56, 0x1f, 0xab, 0x94, 0x04, 0xf3, 0x55, 0xe4, 0xd8, 0x96, 0x9b, 0x78, 0xf6, 0x85, 0x5e,
0xa1, 0x2a, 0x8a, 0x35, 0xb1, 0x27, 0x11, 0xd7, 0xb1, 0x14, 0xf8, 0x8b, 0xa1, 0xcb, 0xca, 0x7a, 0xa8, 0x8a, 0x62, 0x4d, 0xec, 0x49, 0xc4, 0x75, 0x2c, 0x05, 0xfe, 0x62, 0xe8, 0xb2, 0xb2, 0x9e,
0x32, 0xb6, 0xb2, 0x70, 0x3a, 0xb6, 0xec, 0xfb, 0x59, 0xe8, 0x2f, 0xbd, 0x89, 0xf9, 0x15, 0xdd, 0x8c, 0xad, 0x2c, 0x9c, 0x8e, 0x2d, 0xfb, 0x61, 0x16, 0xfa, 0x4b, 0x6f, 0x62, 0x7e, 0x41, 0xb7,
0xb2, 0x15, 0x1e, 0xcd, 0x42, 0x6b, 0xe2, 0x60, 0x27, 0xfe, 0x9d, 0x3e, 0x61, 0x33, 0x8d, 0x7c, 0x6c, 0x85, 0x47, 0xb3, 0xd0, 0x9a, 0x38, 0xd8, 0x89, 0x7f, 0xa7, 0x4f, 0xd8, 0x4c, 0x23, 0xdf,
0xff, 0x2c, 0x5a, 0x0c, 0xc7, 0xfa, 0x40, 0x7c, 0x78, 0x07, 0x49, 0x3c, 0x5f, 0xf1, 0xdc, 0x2a, 0x3f, 0x8b, 0x16, 0xc3, 0xb1, 0x3e, 0x10, 0x1f, 0xde, 0x41, 0x12, 0xcf, 0x57, 0x3c, 0xb7, 0x8a,
0xda, 0xb6, 0x4d, 0xd7, 0x44, 0x4f, 0x80, 0xd7, 0x3f, 0x68, 0xe4, 0xbb, 0x56, 0xab, 0x95, 0x7d, 0xb6, 0x6d, 0xd3, 0x35, 0xd1, 0x13, 0xe0, 0xf5, 0x0f, 0x1a, 0xf9, 0xae, 0xd5, 0x6a, 0x65, 0xdf,
0x27, 0x40, 0xff, 0x07, 0xf5, 0xab, 0x5c, 0x11, 0x36, 0xd9, 0x55, 0x31, 0xd8, 0xfd, 0x2b, 0x2b, 0x09, 0xd0, 0xff, 0x41, 0xfd, 0x22, 0x57, 0x84, 0x4d, 0x76, 0x55, 0x0c, 0x76, 0xff, 0xda, 0x8a,
0x9e, 0xa3, 0x7b, 0x52, 0xb8, 0x53, 0xd5, 0x4e, 0x74, 0x5d, 0x7d, 0x79, 0x11, 0x94, 0x4f, 0xf4, 0xe7, 0xe8, 0x9e, 0x14, 0xee, 0x54, 0xb5, 0x13, 0x5d, 0x57, 0x5f, 0x5e, 0x04, 0xe5, 0x13, 0xbd,
0xf2, 0x18, 0x59, 0x82, 0x4f, 0xa8, 0x60, 0x82, 0xcd, 0x7a, 0x2a, 0xc1, 0x66, 0xe8, 0x9b, 0x13, 0x3c, 0x46, 0x96, 0xe0, 0x13, 0x2a, 0x98, 0x60, 0xb3, 0xbe, 0x95, 0x60, 0x33, 0xf4, 0xcd, 0x89,
0x11, 0xd8, 0x1e, 0xa1, 0x28, 0x8d, 0x7c, 0xaf, 0x20, 0xcc, 0x8c, 0xfe, 0x89, 0xfe, 0x03, 0x36, 0x08, 0x6c, 0x4f, 0x50, 0x94, 0x46, 0xbe, 0x57, 0x10, 0x66, 0x46, 0xff, 0x44, 0xff, 0x01, 0x1b,
0xe6, 0x01, 0x5d, 0x0d, 0x1b, 0x2c, 0x64, 0xc1, 0x16, 0x7e, 0xb8, 0xa2, 0xd5, 0xac, 0x11, 0x33, 0xf3, 0x80, 0xae, 0x86, 0x0d, 0x16, 0xb2, 0x60, 0x0b, 0x3f, 0x5c, 0xd1, 0x6a, 0xd6, 0x88, 0x19,
0xf8, 0x4a, 0x94, 0xde, 0xb8, 0x7f, 0x7e, 0x7b, 0x7b, 0x7d, 0xdb, 0x21, 0xbf, 0xf2, 0x86, 0x8a, 0x7c, 0x21, 0x4a, 0x6f, 0xdc, 0xbf, 0xb8, 0xbb, 0xbb, 0xb9, 0xeb, 0x90, 0x5f, 0x79, 0x43, 0xc5,
0x0f, 0x31, 0x19, 0x84, 0x81, 0x2b, 0xb1, 0x1e, 0x1e, 0xf4, 0xea, 0xe3, 0xbe, 0xfa, 0x15, 0xd2, 0x87, 0x98, 0x0c, 0xc2, 0xc0, 0x95, 0x58, 0x0f, 0x0f, 0x7a, 0xf5, 0x71, 0x5f, 0xfd, 0x02, 0x69,
0x72, 0xb5, 0x03, 0xf8, 0x74, 0xd1, 0xa8, 0x09, 0x00, 0x42, 0x06, 0x71, 0x1e, 0x14, 0xe7, 0x26, 0xb9, 0xda, 0x01, 0x7c, 0xba, 0x68, 0xd4, 0x04, 0x00, 0x21, 0x83, 0x38, 0x0f, 0x8a, 0x73, 0x93,
0xe7, 0xdd, 0x66, 0x8e, 0xab, 0x28, 0x80, 0xb6, 0xfa, 0xf0, 0x17, 0x51, 0xfc, 0xa8, 0xf5, 0x36, 0xf3, 0x6e, 0x33, 0xc7, 0x55, 0x14, 0x40, 0x5b, 0x7d, 0xfc, 0x8b, 0x28, 0x7e, 0xd4, 0x7a, 0x1b,
0xcc, 0xa2, 0xde, 0xe8, 0xce, 0xcd, 0x79, 0xbf, 0x3d, 0xc8, 0xa0, 0xe6, 0x6a, 0x67, 0xde, 0xb5, 0x66, 0x51, 0x6f, 0x74, 0xe7, 0xe6, 0xbc, 0xdf, 0x1e, 0x64, 0x50, 0x73, 0xb5, 0x33, 0xef, 0x5a,
0x4c, 0x99, 0xed, 0x8f, 0x79, 0x46, 0xb7, 0x59, 0x76, 0x6b, 0x43, 0x33, 0x5f, 0x71, 0x65, 0xdd, 0xa6, 0xcc, 0xf6, 0xc7, 0x3c, 0xa3, 0xdb, 0x2c, 0xbb, 0xb5, 0xa1, 0x99, 0xaf, 0xb8, 0xb2, 0xee,
0x8d, 0x79, 0xcf, 0xa8, 0xe9, 0x8d, 0xc3, 0xc3, 0x83, 0x31, 0xfc, 0x1b, 0x0e, 0x00, 0xcd, 0xf9, 0xc6, 0xbc, 0x67, 0xd4, 0xf4, 0xc6, 0xe1, 0xe1, 0xc1, 0x18, 0xfe, 0x0d, 0x07, 0x80, 0xe6, 0x62,
0xe8, 0x86, 0xb4, 0x7f, 0xc3, 0xae, 0x24, 0x79, 0x74, 0xe2, 0x39, 0x31, 0x4e, 0xc9, 0xaf, 0xa3, 0x74, 0x4b, 0xda, 0xbf, 0x61, 0x57, 0x92, 0x3c, 0x39, 0xf1, 0x9c, 0x18, 0xa7, 0xe4, 0xd7, 0xd1,
0x21, 0x89, 0x96, 0x41, 0xe0, 0xae, 0x68, 0x47, 0xb1, 0xaa, 0xe6, 0x78, 0x40, 0x8d, 0xc6, 0x6f, 0x90, 0x44, 0xcb, 0x20, 0x70, 0x57, 0xb4, 0xa3, 0x58, 0x55, 0x73, 0x3c, 0xa0, 0x46, 0xe3, 0x37,
0x84, 0x76, 0x86, 0x03, 0xfa, 0x69, 0xd4, 0x38, 0x31, 0xda, 0x44, 0x7c, 0xa7, 0x30, 0x90, 0x6a, 0x42, 0x3b, 0xc3, 0x01, 0xfd, 0x38, 0x6a, 0x9c, 0x18, 0x6d, 0x22, 0xbe, 0x53, 0x18, 0x48, 0x35,
0x00, 0x31, 0xc7, 0xff, 0xd1, 0x53, 0x39, 0x0a, 0xfb, 0x6d, 0x1e, 0x64, 0x10, 0x90, 0x94, 0xc4, 0x80, 0x98, 0xe3, 0xff, 0xe8, 0xa9, 0x1c, 0x85, 0xfd, 0x36, 0x0f, 0x32, 0x08, 0x48, 0x4a, 0x62,
0x3e, 0x9f, 0x36, 0x15, 0xc5, 0xdb, 0x68, 0xf7, 0x64, 0x0d, 0x31, 0x5b, 0xed, 0xdc, 0xa4, 0x0a, 0x9f, 0x4f, 0x9b, 0x8a, 0xe2, 0x6d, 0xb4, 0x7b, 0xb2, 0x86, 0x98, 0xad, 0x76, 0x61, 0x52, 0x85,
0x6f, 0x66, 0xf9, 0x51, 0x4c, 0xd8, 0x74, 0x0a, 0x68, 0x22, 0x8d, 0xfc, 0x27, 0xed, 0x9e, 0x57, 0x37, 0xb3, 0xfc, 0x28, 0x26, 0x6c, 0x3a, 0x05, 0x34, 0x91, 0x46, 0xfe, 0x93, 0x76, 0x2f, 0xaa,
0xcd, 0x91, 0x39, 0x2a, 0x48, 0x62, 0xa4, 0x76, 0x46, 0xda, 0x39, 0x27, 0xec, 0x44, 0x84, 0x79, 0xe6, 0xc8, 0x1c, 0x15, 0x24, 0x31, 0x52, 0x3b, 0x23, 0xed, 0x82, 0x13, 0x76, 0x22, 0xc2, 0x3c,
0xfe, 0x72, 0x36, 0x57, 0x7b, 0xe3, 0xb0, 0x9f, 0xb5, 0x8c, 0x0a, 0xcb, 0x6b, 0x15, 0x3a, 0x49, 0x7f, 0x39, 0x9b, 0xab, 0xbd, 0x71, 0xd8, 0xcf, 0x5a, 0x46, 0x85, 0xe5, 0xb5, 0x0a, 0x9d, 0xa4,
0xd9, 0xf3, 0x21, 0xda, 0xdb, 0xb9, 0x78, 0xf9, 0x4d, 0xe8, 0x44, 0x51, 0x5d, 0x4f, 0xa4, 0x24, 0xec, 0xf9, 0x10, 0xed, 0xed, 0x42, 0xbc, 0xfc, 0x2a, 0x74, 0xa2, 0xa8, 0xae, 0x27, 0x52, 0x92,
0x2f, 0xee, 0x64, 0xed, 0x4a, 0x13, 0xcd, 0xcc, 0x6d, 0x7b, 0x59, 0x51, 0x7c, 0xee, 0x4d, 0x64, 0x97, 0xf7, 0xb2, 0x76, 0xa5, 0x89, 0x66, 0xe6, 0xb6, 0xbd, 0xac, 0x28, 0xbe, 0xf0, 0x26, 0xb2,
0x03, 0x90, 0xf5, 0x8c, 0xa4, 0xa9, 0xa7, 0x77, 0x1f, 0x5e, 0xf3, 0x1f, 0x23, 0x50, 0x2c, 0x76, 0x01, 0xc8, 0x7a, 0x46, 0xd2, 0xd4, 0xd3, 0xbb, 0x8f, 0xaf, 0xf9, 0x8f, 0x11, 0x28, 0x16, 0x3b,
0x04, 0xd1, 0x23, 0xf3, 0x21, 0xd5, 0xd7, 0xfb, 0x10, 0x9b, 0x43, 0xba, 0xa2, 0x68, 0x7f, 0xdd, 0x82, 0xe8, 0x91, 0xf9, 0x90, 0xea, 0xeb, 0x7d, 0x88, 0xcd, 0x21, 0x5d, 0x51, 0xb4, 0xbf, 0xee,
0x57, 0x6d, 0x0d, 0x94, 0x9c, 0x7a, 0xbc, 0x24, 0xf2, 0x44, 0x49, 0x04, 0x95, 0xb9, 0xaa, 0x39, 0xab, 0xb6, 0x06, 0x4a, 0x4e, 0x3d, 0x5e, 0x12, 0x79, 0xa2, 0x24, 0x82, 0xca, 0x5c, 0xd5, 0x9c,
0xd1, 0x2f, 0xd6, 0x2f, 0xca, 0x83, 0x3a, 0xd0, 0x3b, 0x0f, 0xd9, 0x54, 0xa1, 0x90, 0xc5, 0x45, 0xe8, 0x17, 0xeb, 0x17, 0xe5, 0x51, 0x1d, 0xe8, 0x9d, 0xc7, 0x6c, 0xaa, 0x50, 0xc8, 0xe2, 0xa2,
0x4d, 0xb7, 0xf8, 0xc4, 0xfe, 0xc6, 0x06, 0xb9, 0xb3, 0x64, 0x9b, 0x07, 0xd2, 0xbb, 0xd1, 0x1d, 0xa6, 0x5b, 0x7c, 0x62, 0x7f, 0x63, 0x83, 0xdc, 0x59, 0xb2, 0xcd, 0x03, 0xe9, 0xdd, 0xe8, 0x1e,
0x24, 0x77, 0x8e, 0x19, 0xa7, 0x89, 0xdc, 0x54, 0x39, 0x50, 0xa0, 0x02, 0x81, 0x68, 0xe5, 0xf4, 0x92, 0x3b, 0xc7, 0x8c, 0xd3, 0x44, 0x6e, 0xaa, 0x1c, 0x28, 0x50, 0x81, 0x40, 0xb4, 0x72, 0xfa,
0x31, 0xad, 0x1a, 0xbe, 0xbc, 0x1c, 0x89, 0xef, 0xa0, 0xcc, 0x8e, 0x9a, 0x74, 0xb4, 0x85, 0xc3, 0x98, 0x56, 0x0d, 0x5f, 0x5e, 0x8e, 0xc4, 0x77, 0x50, 0x66, 0x47, 0x4d, 0x3a, 0xda, 0xc2, 0xe1,
0x83, 0xb9, 0xf2, 0xc8, 0x89, 0x00, 0x49, 0x8d, 0xfe, 0xb5, 0x37, 0x71, 0x1e, 0x08, 0xdf, 0x4a, 0xc1, 0x5c, 0x79, 0xe4, 0x44, 0x80, 0xa4, 0x46, 0xff, 0xd2, 0x9b, 0x38, 0x8f, 0x84, 0x6f, 0x25,
0x32, 0x39, 0xfe, 0xfe, 0xef, 0x5e, 0x6f, 0x0e, 0xc5, 0x2f, 0xae, 0x9b, 0xdc, 0x71, 0xee, 0x34, 0x99, 0x1c, 0x7f, 0xff, 0x77, 0xaf, 0x37, 0x87, 0xe2, 0x17, 0xd7, 0x4d, 0xee, 0x38, 0x77, 0x1a,
0x8e, 0xf5, 0xe0, 0x09, 0xdf, 0x7c, 0xff, 0xec, 0x54, 0xa1, 0x1a, 0x03, 0x10, 0xd1, 0x24, 0x20, 0xc7, 0x7a, 0xf0, 0x0d, 0xdf, 0x7c, 0xff, 0xec, 0x54, 0xa1, 0x1a, 0x03, 0x10, 0xd1, 0x24, 0x20,
0x62, 0x2f, 0xf9, 0xf2, 0x0e, 0x5e, 0xac, 0x29, 0x81, 0x42, 0x6e, 0x8e, 0x9e, 0xc1, 0xa4, 0xbf, 0x62, 0x2f, 0xf9, 0xea, 0x1e, 0x5e, 0xac, 0x29, 0x81, 0x42, 0x6e, 0x8e, 0x9e, 0xc1, 0xa4, 0xbf,
0x5e, 0x28, 0x71, 0x08, 0x12, 0xe1, 0xe8, 0xfc, 0x80, 0xcf, 0x56, 0x96, 0x99, 0x8d, 0x06, 0x25, 0x5e, 0x2a, 0x71, 0x08, 0x12, 0xe1, 0xe8, 0xfc, 0x80, 0xcf, 0x56, 0x96, 0x99, 0x8d, 0x06, 0x25,
0x62, 0x34, 0x9b, 0xf4, 0xb9, 0x15, 0x3c, 0xf5, 0xea, 0x02, 0x64, 0x1b, 0xb8, 0xa9, 0xd3, 0xfe, 0x62, 0x34, 0x9b, 0xf4, 0xb9, 0x15, 0x7c, 0xeb, 0xd5, 0x05, 0xc8, 0x36, 0x70, 0x53, 0xa7, 0xfd,
0xe8, 0x6f, 0xc7, 0x27, 0x46, 0x83, 0xdc, 0x7e, 0x1c, 0x7e, 0xda, 0x03, 0x68, 0xd0, 0xfe, 0xdd, 0xd1, 0xdf, 0x8e, 0x4f, 0x8c, 0x06, 0xb9, 0xfb, 0x30, 0xfc, 0xb8, 0x07, 0xd0, 0xa0, 0xfd, 0xfb,
0x95, 0x71, 0x62, 0xb4, 0x76, 0xc3, 0x34, 0x5a, 0x14, 0x0a, 0x45, 0xfd, 0xfe, 0xe7, 0xff, 0xd8, 0x6b, 0xe3, 0xc4, 0x68, 0xed, 0x86, 0x69, 0xb4, 0x28, 0x14, 0x8a, 0xfa, 0xc3, 0xcf, 0xff, 0xb1,
0x0d, 0xd3, 0x06, 0x82, 0xc8, 0x94, 0x6e, 0xec, 0x81, 0x01, 0x5a, 0xa7, 0x37, 0xa7, 0x86, 0xde, 0x1b, 0xa6, 0x0d, 0x04, 0x91, 0x29, 0xdd, 0xd8, 0x03, 0x03, 0xb4, 0x4e, 0x6f, 0x4f, 0x0d, 0xbd,
0xd8, 0x03, 0xd3, 0xa0, 0xfd, 0xcb, 0x9b, 0xf7, 0x27, 0x27, 0xfa, 0xf1, 0x1e, 0xa0, 0x26, 0xed, 0xb1, 0x07, 0xa6, 0x41, 0xfb, 0x57, 0xb7, 0xe7, 0x27, 0x27, 0xfa, 0xf1, 0x1e, 0xa0, 0x26, 0xed,
0xdf, 0xbc, 0x3b, 0x31, 0x9a, 0xbb, 0x41, 0x5a, 0xc0, 0xcf, 0xb5, 0x57, 0xbf, 0x9e, 0x4e, 0xf7, 0xdf, 0xbe, 0x3b, 0x31, 0x9a, 0xbb, 0x41, 0x5a, 0xc0, 0xcf, 0x8d, 0x57, 0xbf, 0x99, 0x4e, 0xf7,
0xc0, 0x00, 0x3f, 0x37, 0x9f, 0xae, 0xc8, 0xa7, 0xb9, 0x13, 0xb3, 0x3d, 0x60, 0x0d, 0x01, 0x76, 0xc0, 0x00, 0x3f, 0xb7, 0x1f, 0xaf, 0xc9, 0xc7, 0xb9, 0x13, 0xb3, 0x3d, 0x60, 0x0d, 0x01, 0x76,
0x76, 0x76, 0xb7, 0x07, 0xa8, 0x29, 0x80, 0x40, 0xda, 0x7b, 0x80, 0x5a, 0x29, 0xd0, 0x9e, 0x25, 0x76, 0x76, 0xbf, 0x07, 0xa8, 0x29, 0x80, 0x40, 0xda, 0x7b, 0x80, 0x5a, 0x29, 0xd0, 0x9e, 0x25,
0x69, 0xb5, 0x53, 0xa8, 0x6a, 0x91, 0xe6, 0xef, 0x4f, 0x4d, 0xfb, 0xe0, 0xe8, 0x68, 0x03, 0xfc, 0x69, 0xb5, 0x53, 0xa8, 0x6a, 0x91, 0xe6, 0xef, 0xdf, 0x9a, 0xf6, 0xc1, 0xd1, 0xd1, 0x06, 0xf8,
0x38, 0x03, 0x7f, 0x9f, 0x83, 0x3f, 0x3a, 0x02, 0x70, 0xb6, 0x85, 0xfd, 0x04, 0x04, 0xf3, 0xfe, 0x71, 0x06, 0x7e, 0x9e, 0x83, 0x3f, 0x3a, 0x02, 0x70, 0xb6, 0x85, 0xfd, 0x04, 0x04, 0x73, 0x7e,
0xfd, 0x0d, 0x82, 0x13, 0xc5, 0x63, 0xf1, 0xa3, 0x1f, 0xde, 0xab, 0xaf, 0xd1, 0x38, 0x01, 0x49, 0x7e, 0x8b, 0xe0, 0x44, 0xf1, 0x58, 0xfc, 0xe4, 0x87, 0x0f, 0xea, 0x6b, 0x34, 0x4e, 0x40, 0x52,
0x9d, 0x1b, 0xb5, 0xa6, 0x51, 0x3e, 0x2c, 0x21, 0x55, 0x3e, 0x16, 0xc4, 0x77, 0x1a, 0xc6, 0xbf, 0x17, 0x46, 0xad, 0x69, 0x94, 0x0f, 0x4b, 0x48, 0x95, 0x8f, 0x05, 0xf1, 0x9d, 0x86, 0xf1, 0x2f,
0xb0, 0x78, 0xff, 0xe0, 0x5e, 0x5d, 0x68, 0x77, 0x1f, 0x1d, 0x28, 0x7c, 0x45, 0xfb, 0x72, 0x26, 0x2c, 0xde, 0x3f, 0xb8, 0x57, 0x17, 0xda, 0xdd, 0x47, 0x07, 0x0a, 0x5f, 0xd1, 0xbe, 0x9c, 0x89,
0x26, 0xb5, 0x7d, 0x61, 0x24, 0xd2, 0xb2, 0xa4, 0x4b, 0xec, 0xc8, 0x00, 0xdd, 0x3f, 0xc3, 0x08, 0x49, 0x6d, 0x5f, 0x18, 0x89, 0xb4, 0x2c, 0xe9, 0x12, 0x3b, 0x32, 0x40, 0xf7, 0xcf, 0x30, 0x02,
0x4c, 0xae, 0xc3, 0x09, 0x0b, 0xb7, 0xec, 0xeb, 0xec, 0x9a, 0x0f, 0xdd, 0x16, 0x31, 0xc8, 0xe0, 0x93, 0x9b, 0x70, 0xc2, 0xc2, 0x2d, 0xfb, 0x3a, 0xbb, 0xe1, 0x43, 0xb7, 0x45, 0x0c, 0x32, 0xf8,
0xe3, 0xed, 0x9e, 0x85, 0x82, 0xe9, 0xee, 0x5d, 0x48, 0x98, 0xd2, 0xf0, 0xf6, 0xe3, 0x1e, 0xab, 0x70, 0xb7, 0x67, 0xa1, 0x60, 0xba, 0x7b, 0x17, 0x12, 0xa6, 0x34, 0xbc, 0xfb, 0xb0, 0xc7, 0xaa,
0x82, 0xf1, 0xc3, 0x3d, 0xef, 0x41, 0x0f, 0x86, 0x1f, 0x6f, 0xf7, 0x28, 0x38, 0xf0, 0x37, 0x2c, 0x60, 0xfc, 0x70, 0xcf, 0x7b, 0xd0, 0x83, 0xe1, 0x87, 0xbb, 0x3d, 0x0a, 0x0e, 0xfc, 0x0d, 0x0b,
0xbc, 0x4f, 0x85, 0x53, 0x07, 0xb9, 0xe4, 0xc5, 0x03, 0x05, 0x3f, 0x4e, 0xf2, 0x71, 0x4b, 0x40, 0xef, 0x53, 0xe1, 0xd4, 0x41, 0x2e, 0x79, 0xf1, 0x40, 0xc1, 0x8f, 0x93, 0x7c, 0xda, 0x12, 0x10,
0x3c, 0x3c, 0xf4, 0x47, 0x8f, 0x56, 0xd0, 0x21, 0x45, 0xb1, 0x7c, 0x92, 0x62, 0xd9, 0x16, 0xca, 0x0f, 0x0f, 0xfd, 0xd1, 0x93, 0x15, 0x74, 0x48, 0x51, 0x2c, 0x1f, 0xa5, 0x58, 0xb6, 0x85, 0xf2,
0x2f, 0x30, 0x26, 0xa5, 0xba, 0x2d, 0x93, 0x4f, 0xe4, 0x90, 0x0c, 0x77, 0xbd, 0x6f, 0x88, 0xf7, 0x0b, 0x8c, 0x49, 0xa9, 0x6e, 0xcb, 0xe4, 0x23, 0x39, 0x24, 0xc3, 0x5d, 0xef, 0x1b, 0xe2, 0xfd,
0x1f, 0x77, 0xbd, 0x6f, 0x8a, 0xf7, 0xd9, 0xac, 0x4a, 0xe7, 0x84, 0x7f, 0xa2, 0xc0, 0xf2, 0xf8, 0x87, 0x5d, 0xef, 0x9b, 0xe2, 0x7d, 0x36, 0xab, 0xd2, 0x39, 0xe1, 0x9f, 0x28, 0xb0, 0x3c, 0x3e,
0xdc, 0x82, 0x68, 0x22, 0x38, 0x15, 0x5d, 0x02, 0x18, 0x00, 0x6f, 0xfa, 0xa4, 0x27, 0x36, 0x2d, 0xb7, 0x20, 0x9a, 0x08, 0x4e, 0x45, 0x97, 0x00, 0x06, 0xc0, 0x9b, 0x3e, 0xe9, 0x89, 0x4d, 0x4b,
0xf1, 0x40, 0x86, 0x49, 0xbd, 0xe5, 0x62, 0xcc, 0x42, 0x9a, 0x78, 0xd4, 0x91, 0x50, 0x16, 0x1c, 0x3c, 0x90, 0x61, 0x52, 0x6f, 0xb9, 0x18, 0xb3, 0x90, 0x26, 0x1e, 0x75, 0x24, 0x94, 0x05, 0x47,
0xed, 0x46, 0xe2, 0xb3, 0x74, 0xd2, 0x2e, 0x11, 0xc9, 0x3c, 0x25, 0x58, 0x94, 0xc2, 0x6c, 0x31, 0xbb, 0x91, 0xf8, 0x2c, 0x9d, 0xb4, 0x4b, 0x44, 0x32, 0x4f, 0x09, 0x16, 0xa5, 0x30, 0x5b, 0x4c,
0xb9, 0x42, 0xd5, 0x7e, 0x67, 0xd0, 0x84, 0xc7, 0xef, 0x9f, 0x93, 0x28, 0xea, 0xa8, 0xdc, 0x2f, 0xae, 0x50, 0xb5, 0xdf, 0x19, 0x34, 0xe1, 0xf1, 0xfb, 0xe7, 0x24, 0x8a, 0x3a, 0x2a, 0xf7, 0xcb,
0x73, 0x4a, 0x26, 0xcd, 0x97, 0x01, 0x88, 0xf4, 0x8b, 0x89, 0x5e, 0xba, 0x8b, 0xad, 0xfc, 0x2e, 0x9c, 0x92, 0x49, 0xf3, 0x65, 0x00, 0x22, 0xfd, 0x6c, 0xa2, 0x97, 0xee, 0x62, 0x2b, 0xbf, 0x4b,
0x25, 0x49, 0x57, 0x90, 0xd4, 0xfb, 0x87, 0xde, 0x38, 0x0a, 0xba, 0xdb, 0xcb, 0x63, 0xef, 0xd4, 0x49, 0xd2, 0x15, 0x24, 0xf5, 0xfe, 0xa1, 0x37, 0x8e, 0x82, 0xee, 0xf6, 0xf2, 0xd8, 0x3b, 0xf5,
0xdf, 0x4b, 0x1e, 0x91, 0x3a, 0x7b, 0x27, 0x75, 0x56, 0x9c, 0x88, 0x9c, 0x81, 0x21, 0x67, 0xc0, 0xf7, 0x8a, 0x47, 0xa4, 0xce, 0xde, 0x49, 0x9d, 0x15, 0x27, 0x22, 0x67, 0x60, 0xc8, 0x19, 0xf0,
0xf3, 0xbd, 0x9b, 0xe1, 0x9a, 0x66, 0x2b, 0x95, 0xb1, 0x94, 0x4e, 0x01, 0x79, 0xa5, 0xc0, 0xa1, 0x7c, 0xef, 0x76, 0xb8, 0xa6, 0xd9, 0x4a, 0x65, 0x2c, 0xa5, 0x53, 0x40, 0x5e, 0x29, 0x70, 0x28,
0x10, 0xb6, 0xb4, 0xb1, 0xfa, 0x96, 0xc4, 0x75, 0x29, 0x71, 0xde, 0xd2, 0x7d, 0x8b, 0xc0, 0x75, 0x84, 0x2d, 0x6d, 0xac, 0xbe, 0x25, 0x71, 0x5d, 0x4a, 0x9c, 0xb7, 0x74, 0xdf, 0x22, 0x70, 0x5d,
0xc1, 0x5b, 0x41, 0xa6, 0xcd, 0x66, 0x8e, 0x03, 0xc9, 0x75, 0xb4, 0x11, 0xe6, 0x54, 0x5a, 0x2f, 0xf0, 0x56, 0x90, 0x69, 0xb3, 0x99, 0xe3, 0x40, 0x72, 0x1d, 0x6d, 0x84, 0x39, 0x95, 0xd6, 0x8b,
0x52, 0x36, 0x24, 0x65, 0x49, 0x74, 0x1f, 0x4d, 0x63, 0x07, 0xcd, 0xb7, 0x92, 0x6a, 0xbc, 0x9d, 0x94, 0x0d, 0x49, 0x59, 0x12, 0xdd, 0x47, 0xd3, 0xd8, 0x41, 0xf3, 0xad, 0xa4, 0x1a, 0x6f, 0x27,
0x54, 0xe3, 0x5f, 0x24, 0xd5, 0x7c, 0x3b, 0xa9, 0xe6, 0xbf, 0x48, 0xaa, 0xf5, 0x76, 0x52, 0xad, 0xd5, 0xf8, 0x17, 0x49, 0x35, 0xdf, 0x4e, 0xaa, 0xf9, 0x2f, 0x92, 0x6a, 0xbd, 0x9d, 0x54, 0xeb,
0x7f, 0x8a, 0xd4, 0x86, 0x4e, 0x87, 0x3b, 0x75, 0x1a, 0xb5, 0x2b, 0x63, 0x0c, 0xd2, 0x6b, 0xc1, 0x9f, 0x22, 0xb5, 0xa1, 0xd3, 0xe1, 0x4e, 0x9d, 0x46, 0xed, 0xca, 0x18, 0x83, 0xf4, 0x5a, 0x30,
0x58, 0xd2, 0x32, 0x94, 0x0c, 0x6e, 0xe8, 0x3c, 0x6f, 0x8f, 0x8f, 0xfd, 0xa7, 0x84, 0xc9, 0xb3, 0x96, 0xb4, 0x0c, 0x25, 0x83, 0x1b, 0x3a, 0xcf, 0xdb, 0xe3, 0x63, 0xff, 0x5b, 0xc2, 0xe4, 0xd9,
0xdf, 0x92, 0xe9, 0x94, 0x7b, 0xbc, 0x68, 0x2f, 0xf9, 0xd1, 0xbd, 0x13, 0x90, 0xa9, 0x13, 0x42, 0x6f, 0xc9, 0x74, 0xca, 0x3d, 0x5e, 0xb4, 0x97, 0xfc, 0xe8, 0xc1, 0x09, 0xc8, 0xd4, 0x09, 0x21,
0x12, 0x8f, 0xa9, 0xe2, 0x5e, 0xfb, 0x1a, 0x5d, 0x96, 0x88, 0x03, 0xca, 0x17, 0xba, 0x61, 0x3d, 0x89, 0xc7, 0x54, 0x71, 0xaf, 0x7d, 0x8d, 0xae, 0x4a, 0xc4, 0x01, 0xe5, 0x0b, 0xdd, 0xb0, 0x9e,
0x3b, 0x59, 0x99, 0xee, 0x65, 0x05, 0x72, 0x10, 0x72, 0xcb, 0xa6, 0x21, 0x8b, 0x32, 0x33, 0xe7, 0x9d, 0xac, 0x4c, 0xf7, 0xb2, 0x02, 0x39, 0x08, 0xb9, 0x63, 0xd3, 0x90, 0x45, 0x99, 0x99, 0x73,
0x72, 0x99, 0x0a, 0xb2, 0xe5, 0xd3, 0xbf, 0xfd, 0xb0, 0x7f, 0xfa, 0xd6, 0x5e, 0x9a, 0xa7, 0xcb, 0xb9, 0x4c, 0x05, 0xd9, 0xf2, 0xe9, 0xdf, 0xbd, 0xdf, 0x3f, 0x7d, 0x6b, 0x2f, 0xcd, 0xd3, 0x65,
0xd8, 0x3f, 0x82, 0xa2, 0xdd, 0x5e, 0xba, 0x56, 0xcc, 0xc8, 0x23, 0x66, 0x38, 0x78, 0xa2, 0x12, 0xec, 0x1f, 0x41, 0xd1, 0x6e, 0x2f, 0x5d, 0x2b, 0x66, 0xe4, 0x09, 0x33, 0x1c, 0x3c, 0x51, 0x09,
0x4a, 0x0e, 0x97, 0x4c, 0x43, 0x7f, 0x81, 0xb1, 0xb8, 0x23, 0xd6, 0x29, 0x1f, 0x1a, 0x4e, 0x3f, 0x25, 0x87, 0x4b, 0xa6, 0xa1, 0xbf, 0xc0, 0x58, 0xdc, 0x11, 0xeb, 0x94, 0x0f, 0x0d, 0xa7, 0x1f,
0x95, 0x85, 0x06, 0x7d, 0x5f, 0x60, 0x30, 0xfa, 0xc3, 0xd0, 0x99, 0xcd, 0x63, 0x16, 0xee, 0x00, 0xcb, 0x42, 0x83, 0xbe, 0x2f, 0x30, 0x18, 0xfd, 0x61, 0xe8, 0xcc, 0xe6, 0x31, 0x0b, 0x77, 0x00,
0x68, 0xf4, 0x4f, 0x6d, 0x1b, 0xcf, 0x96, 0xed, 0xc2, 0xd0, 0xec, 0xbf, 0x5f, 0x5a, 0xee, 0x76, 0x34, 0xfa, 0xa7, 0xb6, 0x8d, 0x67, 0xcb, 0x76, 0x61, 0x68, 0xf6, 0xcf, 0x97, 0x96, 0xbb, 0x1d,
0x5c, 0x10, 0xce, 0x34, 0x15, 0x00, 0xff, 0xfb, 0xb5, 0x6b, 0x41, 0xe1, 0x14, 0xb1, 0x30, 0x3e, 0x17, 0x84, 0x33, 0x4d, 0x05, 0xc0, 0xff, 0x7e, 0xe9, 0x5a, 0x50, 0x38, 0x45, 0x2c, 0x8c, 0x4f,
0x9d, 0x7c, 0xb3, 0x6c, 0x48, 0xf5, 0xb1, 0x82, 0x52, 0xe8, 0x98, 0x41, 0xd1, 0xc6, 0x98, 0x37, 0x27, 0x5f, 0x2d, 0x1b, 0x52, 0x7d, 0xac, 0xa0, 0x14, 0x3a, 0x66, 0x50, 0xb4, 0x31, 0xe6, 0x4d,
0xa1, 0x9a, 0xaf, 0xae, 0x65, 0x2e, 0xaf, 0xc4, 0x9f, 0x8f, 0x8e, 0x9c, 0x2f, 0xb5, 0x10, 0x8a, 0xa8, 0xe6, 0xab, 0x6b, 0x99, 0xcb, 0x2b, 0xf1, 0xa7, 0xa3, 0x23, 0xe7, 0x73, 0x2d, 0x84, 0xe2,
0xe7, 0x07, 0xa6, 0xa8, 0x1a, 0x7c, 0x93, 0xdd, 0x9a, 0xea, 0x56, 0x8d, 0xe5, 0xf4, 0xb0, 0x0e, 0xf9, 0x91, 0x29, 0xaa, 0x06, 0xdf, 0x64, 0xb7, 0xa6, 0xba, 0x55, 0x63, 0x39, 0x3d, 0xac, 0x03,
0x38, 0x32, 0xca, 0x6b, 0xff, 0xa3, 0x6d, 0xf8, 0xfe, 0x76, 0x9b, 0xc0, 0x7b, 0x79, 0xe1, 0xdb, 0x8e, 0x8c, 0xf2, 0xda, 0xff, 0x68, 0x1b, 0xbe, 0xbf, 0xdd, 0x26, 0xf0, 0x5e, 0x5e, 0xf8, 0xf6,
0xbb, 0x85, 0x52, 0xe5, 0xec, 0xfa, 0x4a, 0x01, 0x19, 0x42, 0xad, 0xc2, 0x77, 0x33, 0x45, 0x05, 0x6e, 0xa1, 0x54, 0x39, 0xbb, 0xb9, 0x56, 0x40, 0x86, 0x50, 0xab, 0xf0, 0xdd, 0x4c, 0x51, 0x41,
0xe1, 0xec, 0x29, 0x57, 0x6c, 0x7f, 0xf1, 0x07, 0x3c, 0x84, 0x72, 0x5f, 0x2d, 0x14, 0x2c, 0x50, 0x38, 0x7b, 0xca, 0x15, 0xdb, 0x5f, 0xfc, 0x01, 0x0f, 0xa1, 0xdc, 0x57, 0x0b, 0x05, 0x0b, 0x94,
0xaa, 0x60, 0x67, 0x4c, 0xd6, 0x26, 0x85, 0x0a, 0x24, 0x1b, 0xf2, 0x96, 0x3a, 0x84, 0x88, 0x78, 0x2a, 0xd8, 0x19, 0x93, 0xb5, 0x49, 0xa1, 0x02, 0xc9, 0x86, 0xbc, 0xa5, 0x0e, 0x21, 0x22, 0x9e,
0xba, 0xcf, 0x26, 0xfe, 0x9e, 0x0b, 0xa4, 0x4f, 0x6f, 0x0a, 0xa4, 0xc7, 0xed, 0x76, 0xb3, 0x9d, 0xee, 0xb3, 0x89, 0xbf, 0xe7, 0x02, 0xe9, 0xb7, 0x37, 0x05, 0xd2, 0xe3, 0x76, 0xbb, 0xd9, 0xce,
0x8b, 0xa4, 0x6c, 0xbd, 0x61, 0x3f, 0xb9, 0x48, 0x69, 0x52, 0x9a, 0x86, 0xca, 0x37, 0x04, 0xc0, 0x45, 0x52, 0xb6, 0xde, 0xb0, 0x9f, 0x5c, 0xa4, 0x34, 0x29, 0x4d, 0x43, 0xe5, 0x1b, 0x02, 0xe0,
0xbf, 0x9f, 0xe5, 0x98, 0xb1, 0xf7, 0x06, 0xc3, 0x4d, 0x2e, 0xbc, 0x75, 0x81, 0xea, 0xa6, 0x45, 0xdf, 0xcf, 0x72, 0xcc, 0xd8, 0x7b, 0x83, 0xe1, 0x26, 0x17, 0xde, 0xba, 0x40, 0x75, 0xd3, 0xa2,
0x4b, 0xbb, 0xfa, 0x53, 0xb9, 0x25, 0xe7, 0x42, 0x26, 0xa5, 0x92, 0xbf, 0xff, 0x7f, 0x79, 0x66, 0xa5, 0x5d, 0xfd, 0xa9, 0xdc, 0x92, 0x73, 0x21, 0x93, 0x52, 0xc9, 0xdf, 0xff, 0xbf, 0x3c, 0x33,
0x62, 0x6f, 0xdc, 0x45, 0x48, 0xcb, 0x93, 0x9b, 0x83, 0x42, 0xd3, 0x1c, 0x16, 0xf1, 0x1e, 0xc6, 0xb1, 0x37, 0xee, 0x22, 0xa4, 0xe5, 0xc9, 0xcd, 0x41, 0xa1, 0x69, 0x0e, 0x8b, 0x78, 0x0f, 0x63,
0x5e, 0x53, 0xb4, 0xa4, 0xb5, 0x3d, 0xf9, 0xb4, 0xea, 0x24, 0x0d, 0xd3, 0x58, 0x1b, 0xc7, 0x1e, 0xaf, 0x29, 0x5a, 0xd2, 0xda, 0xbe, 0xf9, 0xb4, 0xea, 0x24, 0x0d, 0xd3, 0x58, 0x1b, 0xc7, 0x1e,
0x1a, 0x05, 0xe8, 0xa2, 0x3c, 0x0e, 0x91, 0xd9, 0x0b, 0x98, 0x2a, 0xbe, 0xda, 0x71, 0x6e, 0xb2, 0x1a, 0x05, 0xe8, 0xa2, 0x3c, 0x0e, 0x91, 0xd9, 0x0b, 0x98, 0x2a, 0xbe, 0xda, 0x71, 0x6e, 0xb2,
0xdc, 0x48, 0xc0, 0xb2, 0xd2, 0xe3, 0x68, 0xfa, 0x81, 0x89, 0x3b, 0x5d, 0x0a, 0xfb, 0xec, 0x1d, 0xdc, 0x48, 0xc0, 0xb2, 0xd2, 0xe3, 0x68, 0xfa, 0x81, 0x89, 0x3b, 0x5d, 0x0a, 0xfb, 0xe4, 0x1d,
0x19, 0x39, 0xcb, 0x97, 0x24, 0xe1, 0xa1, 0x20, 0xa9, 0xe6, 0x49, 0x46, 0x2c, 0xe6, 0x46, 0xaa, 0x19, 0x39, 0xcb, 0x97, 0x24, 0xe1, 0xa1, 0x20, 0xa9, 0xe6, 0x49, 0x46, 0x2c, 0xe6, 0x46, 0xaa,
0x3e, 0xa3, 0xd3, 0xd8, 0x38, 0x3c, 0xcd, 0x44, 0xdf, 0x1f, 0x0f, 0x67, 0x30, 0x6c, 0xc9, 0xbd, 0x3e, 0xa3, 0xd3, 0xd8, 0x38, 0x3c, 0xcd, 0x44, 0xdf, 0x1f, 0x0f, 0x67, 0x30, 0x6c, 0xc9, 0xbd,
0x89, 0x25, 0x95, 0xa5, 0xa4, 0xbb, 0x92, 0x74, 0xe1, 0x50, 0xa9, 0x78, 0x04, 0x04, 0x53, 0x99, 0x89, 0x25, 0x95, 0xa5, 0xa4, 0xbb, 0x92, 0x74, 0xe1, 0x50, 0xa9, 0x78, 0x04, 0x04, 0x53, 0x99,
@ -504,198 +504,199 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
0xbd, 0xed, 0xa0, 0x0a, 0x7e, 0x69, 0x18, 0x7b, 0xe2, 0x54, 0x6b, 0xe2, 0x91, 0x38, 0x36, 0x60, 0xbd, 0xed, 0xa0, 0x0a, 0x7e, 0x69, 0x18, 0x7b, 0xe2, 0x54, 0x6b, 0xe2, 0x91, 0x38, 0x36, 0x60,
0x2d, 0xca, 0x37, 0xa7, 0x34, 0xcb, 0xc4, 0xed, 0x87, 0xea, 0x88, 0xef, 0x21, 0xd4, 0x30, 0x76, 0x2d, 0xca, 0x37, 0xa7, 0x34, 0xcb, 0xc4, 0xed, 0x87, 0xea, 0x88, 0xef, 0x21, 0xd4, 0x30, 0x76,
0x9c, 0xcd, 0xad, 0xf0, 0xcc, 0x9f, 0x30, 0x05, 0xbb, 0x4c, 0xfa, 0xa0, 0x75, 0xd2, 0x69, 0xb7, 0x9c, 0xcd, 0xad, 0xf0, 0xcc, 0x9f, 0x30, 0x05, 0xbb, 0x4c, 0xfa, 0xa0, 0x75, 0xd2, 0x69, 0xb7,
0xd5, 0x2a, 0xc8, 0xc9, 0xa9, 0x9a, 0x5f, 0x87, 0xcb, 0x38, 0xf6, 0xf9, 0x01, 0xb7, 0xb5, 0x38, 0xd5, 0x2a, 0xc8, 0xc9, 0xa9, 0x9a, 0x5f, 0x86, 0xcb, 0x38, 0xf6, 0xf9, 0x01, 0xb7, 0xb5, 0x38,
0x17, 0x50, 0x6e, 0xd8, 0xdc, 0x68, 0x8f, 0x12, 0xab, 0x85, 0x6a, 0x5d, 0x9a, 0xd2, 0xf7, 0xcf, 0x17, 0x50, 0x6e, 0xd8, 0xdc, 0x68, 0x8f, 0x12, 0xab, 0x85, 0x6a, 0x5d, 0x9a, 0xd2, 0xf7, 0xcf,
0xd6, 0x7a, 0x2b, 0xfb, 0x48, 0x8c, 0xfd, 0x29, 0x2a, 0x5a, 0x76, 0xff, 0xab, 0x86, 0x24, 0x65, 0xd6, 0x7a, 0x2b, 0xfb, 0x48, 0x8c, 0xfd, 0x5b, 0x54, 0xb4, 0xec, 0xfe, 0x17, 0x0d, 0x49, 0xca,
0x9c, 0x28, 0x04, 0xb2, 0xef, 0x9f, 0xe9, 0xf0, 0xfc, 0x4d, 0x5c, 0xa7, 0x68, 0xb6, 0x6c, 0x17, 0x38, 0x51, 0x08, 0x64, 0xdf, 0x3f, 0xd3, 0xe1, 0xc5, 0x9b, 0xb8, 0x4e, 0xd1, 0x6c, 0xd9, 0x2e,
0x26, 0xa1, 0x9b, 0x66, 0x3c, 0xa0, 0x49, 0xdb, 0x05, 0x8f, 0x38, 0xac, 0xfb, 0xef, 0x65, 0x87, 0x4c, 0x42, 0x37, 0xcd, 0x78, 0x40, 0x93, 0xb6, 0x0b, 0x1e, 0x71, 0x58, 0xf7, 0xcf, 0x65, 0x87,
0x3f, 0x35, 0x9b, 0xd2, 0xe1, 0x0d, 0x1c, 0xde, 0x28, 0x19, 0x7e, 0xb3, 0x8c, 0xe6, 0x63, 0x2e, 0x3f, 0x35, 0x9b, 0xd2, 0xe1, 0x0d, 0x1c, 0xde, 0x28, 0x19, 0x7e, 0xbb, 0x8c, 0xe6, 0x63, 0x2e,
0xa4, 0xfd, 0x08, 0x9a, 0x88, 0xa0, 0xb9, 0x03, 0x01, 0x71, 0xe4, 0x86, 0xec, 0x7e, 0x1c, 0x2d, 0xa4, 0xfd, 0x08, 0x9a, 0x88, 0xa0, 0xb9, 0x03, 0x01, 0x71, 0xe4, 0x86, 0xec, 0x7e, 0x1c, 0x2d,
0xc4, 0xd1, 0x2a, 0xc1, 0x31, 0xe2, 0x87, 0xc1, 0xf6, 0x0f, 0x6e, 0xe3, 0xe0, 0x76, 0x19, 0x03, 0xc4, 0xd1, 0x2a, 0xc1, 0x31, 0xe2, 0x87, 0xc1, 0xf6, 0x0f, 0x6e, 0xe3, 0xe0, 0x76, 0x19, 0x03,
0x17, 0xb7, 0x24, 0x62, 0x5e, 0xe4, 0x87, 0xfb, 0x11, 0x1c, 0x23, 0x82, 0xe3, 0x12, 0x04, 0x77, 0x97, 0x77, 0x24, 0x62, 0x5e, 0xe4, 0x87, 0xfb, 0x11, 0x1c, 0x23, 0x82, 0xe3, 0x12, 0x04, 0xf7,
0xfe, 0xf2, 0x35, 0xe2, 0x3f, 0xe1, 0xd8, 0x9f, 0x4a, 0xc6, 0x9e, 0x7a, 0x96, 0xeb, 0xcf, 0xf6, 0xfe, 0xf2, 0x35, 0xe2, 0x3f, 0xe1, 0xd8, 0x9f, 0x4a, 0xc6, 0x9e, 0x7a, 0x96, 0xeb, 0xcf, 0xf6,
0x0f, 0x3e, 0xc1, 0xc1, 0x27, 0x3b, 0x07, 0xef, 0x10, 0x1e, 0x4d, 0x9d, 0x1f, 0x15, 0x48, 0x79, 0x0f, 0x3e, 0xc1, 0xc1, 0x27, 0x3b, 0x07, 0xef, 0x10, 0x1e, 0x4d, 0x9d, 0x1f, 0x15, 0x48, 0x79,
0x06, 0x2b, 0x43, 0x03, 0x24, 0x30, 0x30, 0xdf, 0x0e, 0x09, 0x7c, 0xc7, 0x83, 0x54, 0xa7, 0xcb, 0x06, 0x2b, 0x43, 0x03, 0x24, 0x30, 0x30, 0xdf, 0x0e, 0x09, 0x7c, 0xc7, 0x83, 0x54, 0xa7, 0xcb,
0x75, 0x94, 0x9f, 0xbe, 0xa0, 0x78, 0x45, 0xe1, 0x47, 0xd4, 0xdb, 0x1f, 0xd5, 0x24, 0xaa, 0x1d, 0x75, 0x94, 0x9f, 0xbe, 0xa0, 0x78, 0x45, 0xe1, 0x47, 0xd4, 0xdb, 0x1f, 0xd5, 0x24, 0xaa, 0x1d,
0x7e, 0xf7, 0xd4, 0xf8, 0xc9, 0x68, 0x77, 0x93, 0x54, 0x1c, 0x9c, 0xa8, 0xdc, 0x93, 0xd8, 0x34, 0x7e, 0xf7, 0xad, 0xf1, 0x93, 0xd1, 0xee, 0x26, 0xa9, 0x38, 0x38, 0x51, 0xb9, 0x27, 0xb1, 0x69,
0xaf, 0xfc, 0x99, 0xf1, 0x78, 0xe6, 0x8e, 0x1c, 0x74, 0x0a, 0x4a, 0xe1, 0x7a, 0x07, 0x53, 0x5f, 0x5e, 0xf9, 0x33, 0xe3, 0xf1, 0xcc, 0x1d, 0x39, 0xe8, 0x14, 0x94, 0xc2, 0xf5, 0x0e, 0xa6, 0xbe,
0x5e, 0x94, 0xe2, 0x05, 0x8f, 0xcd, 0x53, 0x64, 0xe9, 0x65, 0x81, 0x67, 0x74, 0x55, 0xc2, 0x75, 0xbc, 0x28, 0xc5, 0x0b, 0x1e, 0x9b, 0xa7, 0xc8, 0xd2, 0xcb, 0x02, 0xcf, 0xe8, 0xaa, 0x84, 0xeb,
0x1e, 0x18, 0x98, 0x71, 0x74, 0x21, 0xc0, 0xed, 0xef, 0x8b, 0x26, 0x9e, 0xd3, 0xc3, 0xcd, 0xed, 0x3c, 0x30, 0x30, 0xe3, 0xe8, 0x42, 0x80, 0xdb, 0xdf, 0x17, 0x4d, 0x3c, 0xa7, 0x87, 0x9b, 0xdb,
0xed, 0xfd, 0x29, 0xee, 0x32, 0xd5, 0x3f, 0xd1, 0x14, 0xf6, 0x8a, 0xbd, 0xdd, 0x83, 0x92, 0x3d, 0xdb, 0xfb, 0x53, 0xdc, 0x65, 0xaa, 0x7f, 0xa2, 0x29, 0xec, 0x15, 0x7b, 0xbb, 0x07, 0x25, 0x7b,
0x2f, 0x2f, 0xc1, 0x87, 0x8e, 0x1a, 0x4f, 0x1f, 0xe6, 0xeb, 0x6b, 0xef, 0x0b, 0xf6, 0x74, 0xe5, 0x5e, 0x5e, 0x82, 0x0f, 0x1d, 0x35, 0x9e, 0x3e, 0xcc, 0xd7, 0xd7, 0xde, 0x67, 0xec, 0xe9, 0xca,
0xa6, 0x55, 0xa4, 0x53, 0x00, 0xd2, 0xb7, 0x91, 0xe0, 0x26, 0xd4, 0x6e, 0x1c, 0x3a, 0xc7, 0x21, 0x4d, 0xab, 0x48, 0xa7, 0x00, 0xa4, 0x6f, 0x23, 0xc1, 0x4d, 0xa8, 0xdd, 0x38, 0x74, 0x8e, 0x43,
0x24, 0x1e, 0x39, 0xb9, 0xe3, 0x89, 0x4c, 0x4b, 0x84, 0x9c, 0x09, 0x6f, 0x19, 0xe0, 0x0d, 0x89, 0x48, 0x3c, 0x72, 0x72, 0xc7, 0x13, 0x99, 0x96, 0x08, 0x39, 0x13, 0xde, 0x32, 0xc0, 0x1b, 0x12,
0x0f, 0x8e, 0x8b, 0x57, 0x4a, 0xe4, 0xc1, 0x33, 0x8f, 0x3d, 0x92, 0xbf, 0x5f, 0x5d, 0xfe, 0x1c, 0xef, 0x1d, 0x17, 0xaf, 0x94, 0xc8, 0x83, 0x67, 0x1e, 0x7b, 0x22, 0x7f, 0xbf, 0xbe, 0xfa, 0x39,
0xc7, 0xc1, 0x2d, 0x64, 0x0f, 0x2c, 0x8a, 0xbb, 0xde, 0xee, 0x6b, 0x1b, 0xb9, 0x53, 0x36, 0xd9, 0x8e, 0x83, 0x3b, 0xc8, 0x1e, 0x58, 0x14, 0x77, 0xbd, 0xdd, 0xd7, 0x36, 0x72, 0xa7, 0x6c, 0xb2,
0x45, 0x88, 0x78, 0xee, 0xe0, 0x81, 0xa1, 0x28, 0xf0, 0x21, 0x46, 0xde, 0xb1, 0xa7, 0x58, 0xe3, 0x8b, 0x10, 0xf1, 0xdc, 0xc1, 0x03, 0x43, 0x51, 0xe0, 0x43, 0x8c, 0xbc, 0x67, 0xdf, 0x62, 0x8d,
0x4f, 0x80, 0xcd, 0x78, 0x19, 0xe1, 0x59, 0x08, 0x98, 0xa4, 0x0a, 0xb1, 0x6b, 0xf7, 0x95, 0x8e, 0x3f, 0x01, 0x36, 0xe3, 0x65, 0x84, 0x67, 0x21, 0x60, 0x92, 0x2a, 0xc4, 0xae, 0xdd, 0x57, 0x3a,
0x0c, 0x2f, 0xcb, 0x23, 0xc6, 0x43, 0xba, 0x96, 0x7d, 0xaf, 0x1d, 0x24, 0x08, 0xc4, 0x8d, 0x9b, 0x32, 0xbc, 0x2c, 0x8f, 0x18, 0x0f, 0xe9, 0x5a, 0xf6, 0x83, 0x76, 0x90, 0x20, 0x10, 0x37, 0x6e,
0x9b, 0x6b, 0x58, 0x4d, 0x8d, 0xd6, 0xc5, 0x74, 0xe4, 0x86, 0x47, 0xcc, 0x67, 0xf2, 0xc1, 0x0f, 0x6e, 0x6f, 0x60, 0x35, 0x35, 0x5a, 0x17, 0xd3, 0x91, 0x1b, 0x1e, 0x31, 0x9f, 0xc9, 0x7b, 0x3f,
0x17, 0x78, 0xd8, 0x2b, 0x3d, 0x2c, 0x28, 0xaf, 0xa4, 0x28, 0x14, 0x8f, 0x08, 0xcb, 0x33, 0xab, 0x5c, 0xe0, 0x61, 0xaf, 0xf4, 0xb0, 0xa0, 0xbc, 0x92, 0xa2, 0x50, 0x3c, 0x22, 0x2c, 0xcf, 0xac,
0xfc, 0xb4, 0x30, 0xde, 0x11, 0x89, 0x40, 0x7c, 0x78, 0x4d, 0xc4, 0xab, 0x45, 0x08, 0x13, 0xab, 0xf2, 0xd3, 0xc2, 0x78, 0x47, 0x24, 0x02, 0xf1, 0xe1, 0x35, 0x11, 0xaf, 0x16, 0x21, 0x4c, 0xac,
0x5a, 0xc9, 0x69, 0xe2, 0x83, 0x8d, 0x0b, 0x37, 0x67, 0xd3, 0x59, 0x2a, 0x3d, 0x2d, 0xee, 0xd2, 0x6a, 0x25, 0xa7, 0x89, 0x0f, 0x36, 0x2e, 0xdc, 0x9c, 0x4d, 0x67, 0xa9, 0xf4, 0xb4, 0xb8, 0x4b,
0xe4, 0x25, 0x05, 0x2b, 0x04, 0xc7, 0x0f, 0x71, 0x53, 0x5e, 0x0f, 0x42, 0x39, 0xdf, 0x32, 0x0b, 0x93, 0x97, 0x14, 0xac, 0x10, 0x1c, 0x3f, 0xc4, 0x4d, 0x79, 0x3d, 0x08, 0xe5, 0x7c, 0xc7, 0x2c,
0x52, 0xaa, 0x01, 0xcc, 0x84, 0xd3, 0x1b, 0xb0, 0x94, 0xee, 0x40, 0xc1, 0x58, 0x9e, 0x72, 0xa1, 0x48, 0xa9, 0x06, 0x30, 0x13, 0x4e, 0x6f, 0xc0, 0x52, 0xba, 0x03, 0x05, 0x63, 0x79, 0xca, 0x85,
0x48, 0xfe, 0xd3, 0x31, 0x78, 0xe8, 0x09, 0xc9, 0x99, 0x79, 0xd1, 0x60, 0x68, 0xc6, 0x61, 0xa0, 0x22, 0xf9, 0x4f, 0xc7, 0xe0, 0xa1, 0x27, 0x24, 0x67, 0xe6, 0x45, 0x83, 0xa1, 0x19, 0x87, 0x81,
0x00, 0xa0, 0x94, 0x28, 0xf3, 0xa5, 0x1b, 0xcb, 0xe9, 0xf3, 0xa3, 0xfd, 0x5c, 0x79, 0x14, 0x8f, 0x02, 0x80, 0x52, 0xa2, 0xcc, 0x97, 0x6e, 0x2c, 0xa7, 0xcf, 0x8f, 0xf6, 0x73, 0xe5, 0x51, 0x3c,
0x37, 0xf1, 0xe3, 0xda, 0xfc, 0x91, 0xef, 0x90, 0xe0, 0x07, 0xd0, 0xfd, 0x49, 0x66, 0x33, 0xe2, 0xde, 0xc4, 0x8f, 0x6b, 0xf3, 0x27, 0xbe, 0x43, 0x82, 0x1f, 0x40, 0xf7, 0x27, 0x99, 0xcd, 0x88,
0xb4, 0x87, 0xa1, 0xf3, 0x73, 0x1e, 0xc9, 0x1e, 0x03, 0x68, 0x73, 0x37, 0x01, 0xc5, 0x74, 0xa7, 0xd3, 0x1e, 0x86, 0xce, 0xcf, 0x79, 0x24, 0x7b, 0x0c, 0xa0, 0xcd, 0xdd, 0x04, 0x14, 0xd3, 0x9d,
0x06, 0xd0, 0xe7, 0x96, 0x3d, 0x57, 0x64, 0xec, 0x34, 0xfb, 0xcf, 0x09, 0xa8, 0x21, 0x32, 0x85, 0x1a, 0x40, 0x5f, 0x58, 0xf6, 0x5c, 0x91, 0xb1, 0xd3, 0xec, 0x3f, 0x27, 0xa0, 0x86, 0xc8, 0x14,
0x0c, 0x15, 0xab, 0x05, 0x8e, 0x97, 0x3f, 0x3c, 0x52, 0x66, 0x35, 0x5f, 0x79, 0xf5, 0x89, 0xf1, 0x32, 0x54, 0xac, 0x16, 0x38, 0x5e, 0xfe, 0xf0, 0x48, 0x99, 0xd5, 0x7c, 0xe1, 0xd5, 0x27, 0xc6,
0xec, 0x6b, 0xee, 0x54, 0x13, 0x1f, 0xfa, 0xd9, 0xf9, 0xd2, 0xdd, 0xb9, 0x89, 0xe2, 0x15, 0xa0, 0xb3, 0x2f, 0xb9, 0x53, 0x4d, 0x7c, 0xe8, 0x27, 0xe7, 0x73, 0x77, 0xe7, 0x26, 0x8a, 0x57, 0x80,
0x51, 0xc8, 0xda, 0xce, 0xcd, 0x9d, 0x22, 0x2c, 0xb7, 0x14, 0xed, 0x2d, 0xc7, 0x4b, 0x45, 0x5e, 0x46, 0x21, 0x6b, 0x3b, 0x37, 0x77, 0x8a, 0xb0, 0xdc, 0x52, 0xb4, 0xb7, 0x1c, 0x2f, 0x15, 0x79,
0x55, 0x0e, 0x7a, 0x76, 0xbd, 0x09, 0xea, 0x63, 0xa2, 0xac, 0xbd, 0xe5, 0xf4, 0x29, 0x32, 0x01, 0x55, 0x39, 0xe8, 0xd9, 0xcd, 0x26, 0xa8, 0x8f, 0x89, 0xb2, 0xf6, 0x96, 0xd3, 0xa7, 0xc8, 0x04,
0x05, 0x7a, 0x39, 0xec, 0xed, 0x87, 0x04, 0x36, 0xb5, 0x5a, 0x58, 0xd3, 0xe9, 0x0e, 0x2e, 0x7e, 0x14, 0xe8, 0xe5, 0xb0, 0x77, 0xef, 0x13, 0xd8, 0xd4, 0x6a, 0x61, 0x4d, 0xa7, 0x3b, 0xb8, 0xf8,
0x2b, 0x03, 0x7e, 0x58, 0xab, 0xeb, 0x64, 0x89, 0x21, 0x3d, 0x02, 0x17, 0x91, 0x26, 0x79, 0x78, 0xad, 0x0c, 0xf8, 0x71, 0xad, 0xae, 0x93, 0x25, 0x86, 0xf4, 0x08, 0x5c, 0x44, 0x9a, 0xe4, 0xe1,
0x8b, 0x48, 0x3c, 0x4d, 0x57, 0x92, 0x89, 0x35, 0xe4, 0x19, 0x99, 0x14, 0x8e, 0x98, 0xb7, 0x9c, 0x2d, 0x22, 0xf1, 0x34, 0x5d, 0x49, 0x26, 0xd6, 0x90, 0x67, 0x64, 0x52, 0x38, 0x62, 0xde, 0x72,
0x12, 0x37, 0x33, 0x3e, 0x0a, 0xbc, 0x77, 0x52, 0x7e, 0x25, 0xdf, 0xbb, 0xc5, 0x83, 0x25, 0xbc, 0x4a, 0xdc, 0xcc, 0xf8, 0x28, 0xf0, 0xde, 0x49, 0xf9, 0x95, 0x7c, 0xef, 0x16, 0x0f, 0x96, 0xf0,
0x3a, 0x55, 0x93, 0xd3, 0x80, 0x5b, 0xde, 0x9e, 0xe2, 0x49, 0xf7, 0xdd, 0x6a, 0x84, 0x29, 0x19, 0xea, 0x54, 0x4d, 0x4e, 0x03, 0x6e, 0x79, 0x7b, 0x8a, 0x27, 0xdd, 0x77, 0xab, 0x11, 0xa6, 0x64,
0x92, 0xc5, 0xb5, 0x47, 0x23, 0xe4, 0xcb, 0x8a, 0x97, 0x92, 0x4a, 0xe7, 0x7e, 0x77, 0x47, 0x73, 0x48, 0x16, 0xd7, 0x1e, 0x8d, 0x90, 0x2f, 0x2b, 0x5e, 0x4a, 0x2a, 0x9d, 0xfb, 0xfd, 0x3d, 0xcd,
0x22, 0xb5, 0x6a, 0x71, 0xbc, 0xe6, 0x5c, 0x39, 0xe1, 0xae, 0xb3, 0x73, 0x17, 0xb7, 0xf9, 0x11, 0x89, 0xd4, 0xaa, 0xc5, 0xf1, 0x9a, 0x73, 0xe5, 0x84, 0xbb, 0xce, 0xce, 0x5d, 0xde, 0xe5, 0x47,
0x12, 0x18, 0xa9, 0x95, 0x13, 0xb8, 0xb8, 0x2b, 0x03, 0xe7, 0x3c, 0x09, 0x79, 0x84, 0x0c, 0x12, 0x48, 0x60, 0xa4, 0x56, 0x4e, 0xe0, 0xf2, 0xbe, 0x0c, 0x9c, 0xf3, 0x24, 0xe4, 0x11, 0x32, 0x48,
0xcd, 0x5d, 0xc4, 0x6e, 0x2f, 0xb7, 0x46, 0x73, 0xf8, 0xdd, 0xf4, 0x6e, 0xaf, 0x68, 0x61, 0x29, 0x34, 0x77, 0x11, 0xbb, 0xbb, 0xda, 0x1a, 0xcd, 0xe1, 0x77, 0xd3, 0xbb, 0xbb, 0xa6, 0x85, 0xa5,
0x73, 0x63, 0x20, 0x64, 0x27, 0xb5, 0x82, 0x86, 0x26, 0x6e, 0x4d, 0x4e, 0x23, 0x74, 0xaa, 0x60, 0xcc, 0x8d, 0x81, 0x90, 0x9d, 0xd4, 0x0a, 0x1a, 0x9a, 0xb8, 0x35, 0x39, 0x8d, 0xd0, 0xa9, 0x82,
0xd5, 0x6a, 0x47, 0xde, 0x6f, 0xb9, 0x71, 0x19, 0x1e, 0x03, 0x97, 0x79, 0xa0, 0x45, 0xd0, 0xf6, 0x55, 0xab, 0x1d, 0x79, 0xbf, 0xe5, 0xd6, 0x65, 0x78, 0x0c, 0x5c, 0xe6, 0x81, 0x16, 0x41, 0xdb,
0xf9, 0xad, 0x37, 0xd1, 0x08, 0x3a, 0xa0, 0x29, 0xe4, 0x1d, 0x78, 0x62, 0x32, 0x0e, 0xfd, 0x47, 0xe7, 0xb7, 0xde, 0x44, 0x23, 0xe8, 0x80, 0xa6, 0x90, 0xf7, 0xe0, 0x89, 0xc9, 0x38, 0xf4, 0x9f,
0xa8, 0x5e, 0xc8, 0xc4, 0x67, 0x11, 0xde, 0xf3, 0xc1, 0xbd, 0x63, 0x3f, 0x84, 0x44, 0x75, 0xce, 0xa0, 0x7a, 0x21, 0x13, 0x9f, 0x45, 0x78, 0xcf, 0x07, 0xf7, 0x8e, 0xfd, 0x10, 0x12, 0xd5, 0x39,
0xc8, 0x57, 0xee, 0x82, 0xbe, 0x92, 0x20, 0x04, 0xe7, 0x0a, 0x11, 0x05, 0x13, 0x7f, 0x8e, 0x89, 0x23, 0x5f, 0xb8, 0x0b, 0xfa, 0x42, 0x82, 0x10, 0x9c, 0x2b, 0x44, 0x14, 0x4c, 0xfc, 0x39, 0x26,
0xe7, 0xb2, 0x11, 0xbf, 0x2b, 0x93, 0x9d, 0xff, 0xcc, 0xd0, 0x32, 0x01, 0x75, 0x7a, 0x73, 0x41, 0x9e, 0xcb, 0x46, 0xfc, 0xae, 0x4c, 0x76, 0xfe, 0x33, 0x43, 0xcb, 0x04, 0xd4, 0xe9, 0xed, 0x25,
0x9c, 0x3c, 0x52, 0xde, 0x89, 0x25, 0x71, 0x9e, 0xec, 0x0a, 0x5c, 0x55, 0xfe, 0x52, 0xe4, 0x08, 0x71, 0xf2, 0x48, 0x79, 0x27, 0x96, 0xc4, 0x79, 0xb2, 0x2b, 0x70, 0x55, 0xf9, 0x4b, 0x91, 0x23,
0xa2, 0x07, 0xc5, 0xd1, 0x1d, 0xf0, 0x99, 0xd2, 0x59, 0xba, 0xbe, 0xcd, 0xaf, 0x61, 0xd4, 0x80, 0x88, 0x1e, 0x14, 0x47, 0x77, 0xc0, 0x67, 0x4a, 0x67, 0xe9, 0xfa, 0x36, 0xbf, 0x86, 0x51, 0x03,
0x8f, 0xd8, 0xb7, 0x7d, 0x3c, 0x14, 0xc9, 0xaf, 0x72, 0xea, 0x9a, 0xc2, 0xaf, 0x95, 0x9a, 0x08, 0x3e, 0x62, 0xdf, 0xf6, 0xf1, 0x50, 0x24, 0xbf, 0xca, 0xa9, 0x6b, 0x0a, 0xbf, 0x56, 0x6a, 0x22,
0xe1, 0x8e, 0x62, 0x3f, 0xb4, 0x66, 0x0c, 0x45, 0x7a, 0x11, 0xb3, 0x05, 0xc6, 0x25, 0xfb, 0x22, 0x84, 0x3b, 0x8a, 0xfd, 0xd0, 0x9a, 0x31, 0x14, 0xe9, 0x65, 0xcc, 0x16, 0x18, 0x97, 0xec, 0xcb,
0x80, 0x2a, 0x04, 0x12, 0x07, 0x01, 0x06, 0xe3, 0x17, 0x01, 0x70, 0x88, 0x9e, 0x94, 0x5c, 0x41, 0x00, 0xaa, 0x10, 0x48, 0x1c, 0x04, 0x18, 0x8c, 0x5f, 0x04, 0xc0, 0x21, 0x7a, 0x52, 0x72, 0x0d,
0x16, 0x5c, 0x23, 0x52, 0x5a, 0x0c, 0xd3, 0x19, 0xf2, 0x09, 0xcf, 0x18, 0x5c, 0xdc, 0x80, 0x88, 0x59, 0x70, 0x8d, 0x48, 0x69, 0x31, 0x4c, 0x67, 0xc8, 0x47, 0x3c, 0x63, 0x70, 0x79, 0x0b, 0x22,
0xb4, 0x02, 0xc6, 0xa8, 0x88, 0x51, 0xe3, 0xd8, 0x54, 0x15, 0xa1, 0xf8, 0x25, 0x4b, 0x44, 0x3f, 0xd2, 0x0a, 0x18, 0xa3, 0x22, 0x46, 0x8d, 0x63, 0x53, 0x55, 0x84, 0xe2, 0x97, 0x2c, 0x11, 0xfd,
0xe0, 0x97, 0x47, 0x3b, 0xf5, 0x3a, 0xad, 0xf2, 0xd7, 0x78, 0xe0, 0xa0, 0x9a, 0x5d, 0x00, 0xad, 0x80, 0x5f, 0x1e, 0xed, 0xd4, 0xeb, 0xb4, 0xca, 0x5f, 0xe3, 0x81, 0x83, 0x6a, 0x76, 0x01, 0xb4,
0x47, 0xb5, 0x6f, 0xd1, 0x20, 0x30, 0x1b, 0x18, 0x34, 0xd4, 0x75, 0x05, 0x72, 0x22, 0x71, 0x39, 0x1e, 0xd5, 0xbe, 0x46, 0x83, 0xc0, 0x6c, 0x60, 0xd0, 0x50, 0xd7, 0x15, 0xc8, 0x89, 0xc4, 0xe5,
0xb6, 0xc7, 0x53, 0xab, 0xfe, 0xbf, 0x39, 0x0b, 0x2e, 0xf6, 0x65, 0xe8, 0x42, 0xb0, 0x16, 0xa7, 0xd8, 0x1e, 0x4f, 0xad, 0xfa, 0xff, 0xe6, 0x2c, 0xb8, 0xd8, 0x97, 0xa1, 0x0b, 0xc1, 0x5a, 0x9c,
0x2a, 0x22, 0xdc, 0xb0, 0x07, 0x40, 0x0e, 0xd0, 0xab, 0x8b, 0x5b, 0xc1, 0x78, 0x97, 0x92, 0x48, 0xaa, 0x88, 0x70, 0xc3, 0x1e, 0x00, 0x39, 0x40, 0xaf, 0x2e, 0x6e, 0x05, 0xe3, 0x5d, 0x4a, 0x22,
0xf7, 0x4f, 0x47, 0xbc, 0x1f, 0x07, 0x46, 0xb4, 0xa8, 0xf0, 0x82, 0x1c, 0x3f, 0xfd, 0x11, 0xa5, 0xdd, 0x3f, 0x1d, 0xf1, 0x7e, 0x1c, 0x18, 0xd1, 0xa2, 0xc2, 0x0b, 0x72, 0xfc, 0xf4, 0x47, 0x94,
0x1d, 0xbd, 0x29, 0x14, 0x16, 0x2c, 0x9e, 0xfb, 0xd8, 0x17, 0xf5, 0x23, 0xbc, 0xac, 0x9b, 0x6b, 0x76, 0xf4, 0xa6, 0x50, 0x58, 0xb0, 0x78, 0xee, 0x63, 0x5f, 0xd4, 0x8f, 0xf0, 0xb2, 0x6e, 0xae,
0x96, 0xc4, 0x3e, 0x88, 0xe3, 0xb1, 0xf8, 0x6c, 0xce, 0xdc, 0x60, 0x48, 0xfb, 0x95, 0x9e, 0x48, 0x59, 0x12, 0xfb, 0x20, 0x8e, 0xa7, 0xe2, 0xb3, 0x39, 0x73, 0x83, 0x21, 0xed, 0x57, 0x7a, 0x22,
0xcd, 0x65, 0xb5, 0x22, 0xbe, 0xe4, 0x72, 0xbd, 0x9f, 0x91, 0xec, 0xa0, 0x57, 0x17, 0x2f, 0xd2, 0x35, 0x97, 0xd5, 0x8a, 0xf8, 0x92, 0xcb, 0xf5, 0x7e, 0x46, 0xb2, 0x83, 0x5e, 0x5d, 0xbc, 0x48,
0x66, 0x7a, 0xd9, 0x98, 0x4a, 0x3a, 0x68, 0x88, 0x83, 0x86, 0x10, 0xb2, 0xb3, 0x71, 0x85, 0x11, 0x9b, 0xe9, 0x65, 0x63, 0x2a, 0xe9, 0xa0, 0x21, 0x0e, 0x1a, 0x42, 0xc8, 0xce, 0xc6, 0x15, 0x46,
0xf2, 0x92, 0x40, 0x7f, 0x64, 0x3d, 0xb0, 0x0c, 0x64, 0x9e, 0x14, 0xde, 0xbd, 0x79, 0xa3, 0x5f, 0xc8, 0x4b, 0x02, 0xfd, 0x91, 0xf5, 0xc8, 0x32, 0x90, 0x79, 0x52, 0x78, 0xf7, 0xe6, 0x8d, 0x7e,
0xc1, 0xf5, 0x39, 0xb4, 0x16, 0x41, 0x97, 0xfc, 0x6c, 0x85, 0x78, 0x0c, 0x05, 0xf5, 0x3c, 0x5e, 0x05, 0xd7, 0xe7, 0xd0, 0x5a, 0x04, 0x5d, 0xf2, 0xb3, 0x15, 0xe2, 0x31, 0x14, 0xd4, 0xf3, 0x78,
0x06, 0x20, 0x9c, 0x06, 0xe4, 0xd3, 0xb1, 0xe5, 0x26, 0x7d, 0xce, 0xb4, 0xef, 0xea, 0xda, 0x9c, 0x19, 0x80, 0x70, 0x1a, 0x90, 0x4f, 0xc7, 0x96, 0x9b, 0xf4, 0x39, 0xd3, 0xbe, 0xab, 0x6b, 0x73,
0x55, 0xd9, 0xc2, 0xcf, 0xfa, 0xc4, 0x36, 0x4e, 0x33, 0x4b, 0x4c, 0x7b, 0x4e, 0xff, 0x96, 0x81, 0x56, 0x65, 0x0b, 0x3f, 0xeb, 0x13, 0xdb, 0x38, 0xcd, 0x2c, 0x31, 0xed, 0x39, 0xfd, 0x3b, 0x06,
0x3b, 0x04, 0x4b, 0x9c, 0x80, 0x9a, 0x06, 0xfe, 0x23, 0xe8, 0x83, 0x3c, 0x47, 0x81, 0x07, 0x21, 0xee, 0x10, 0x2c, 0x71, 0x02, 0x6a, 0x1a, 0xf8, 0x4f, 0xa0, 0x0f, 0xf2, 0x1c, 0x05, 0x1e, 0x84,
0xc6, 0xa2, 0xbb, 0x17, 0xc5, 0xa2, 0x8b, 0xd8, 0xe9, 0xd5, 0x1d, 0x31, 0x6e, 0x2c, 0x7b, 0xbc, 0x18, 0x8b, 0xee, 0x5e, 0x14, 0x8b, 0x2e, 0x62, 0xa7, 0x57, 0x77, 0xc4, 0xb8, 0xb1, 0xec, 0xf1,
0x15, 0xb1, 0x55, 0xb3, 0xcc, 0xa8, 0xe1, 0xc1, 0x93, 0x62, 0x0f, 0x98, 0x1f, 0x79, 0x90, 0xcd, 0x56, 0xc4, 0x56, 0xcd, 0x32, 0xa3, 0x86, 0x07, 0x4f, 0x8a, 0x3d, 0x60, 0x7e, 0xe4, 0x41, 0x36,
0x84, 0x94, 0x72, 0xe5, 0xdc, 0xc3, 0x42, 0x8a, 0x58, 0x4b, 0x48, 0x76, 0x41, 0xcf, 0x6d, 0x49, 0x13, 0x52, 0xca, 0x95, 0x0b, 0x0f, 0x0b, 0x29, 0x62, 0x2d, 0x21, 0xd9, 0x05, 0x3d, 0xb7, 0x25,
0xcb, 0x63, 0x51, 0x44, 0x5c, 0xbc, 0x76, 0xc9, 0xc2, 0x57, 0x9a, 0xc4, 0xa7, 0x43, 0x26, 0x45, 0x2d, 0x8f, 0x45, 0x11, 0x71, 0xf1, 0xda, 0x25, 0x0b, 0x5f, 0x69, 0x12, 0x9f, 0x0e, 0x99, 0x14,
0x2d, 0xeb, 0x45, 0x79, 0xf9, 0x44, 0xf4, 0x8a, 0xf8, 0xdd, 0x14, 0x41, 0x35, 0xe9, 0x9e, 0xe2, 0xb5, 0xac, 0x17, 0xe5, 0xe5, 0x13, 0xd1, 0x2b, 0xe2, 0x77, 0x53, 0x04, 0xd5, 0xa4, 0x7b, 0x8a,
0x85, 0x9f, 0xfe, 0x95, 0xb8, 0xec, 0x4d, 0xce, 0x96, 0x61, 0x08, 0xfa, 0x9f, 0xd2, 0x90, 0x57, 0x17, 0x7e, 0xfa, 0xd7, 0xe2, 0xb2, 0x37, 0x39, 0x5b, 0x86, 0x21, 0xe8, 0x7f, 0x4a, 0x43, 0x5e,
0xbc, 0xaf, 0x4e, 0xe9, 0x46, 0xb5, 0xba, 0xd1, 0x6c, 0x6a, 0xb4, 0xb3, 0xa6, 0x97, 0xae, 0xeb, 0xf1, 0xbe, 0x3e, 0xa5, 0x1b, 0xd5, 0xea, 0x46, 0xb3, 0xa9, 0xd1, 0xce, 0x9a, 0x5e, 0xba, 0xae,
0x9b, 0x5d, 0xa5, 0xb4, 0xe1, 0xd4, 0xaf, 0x90, 0xc5, 0x69, 0x91, 0x7c, 0x76, 0x89, 0x21, 0xad, 0x6f, 0x76, 0x95, 0xd2, 0x86, 0x53, 0xbf, 0x42, 0x16, 0xa7, 0x45, 0xf2, 0xd9, 0x25, 0x86, 0xb4,
0x2c, 0xb0, 0xc9, 0xd4, 0x11, 0x47, 0x83, 0xba, 0xc5, 0xcd, 0xbb, 0xca, 0xe1, 0x77, 0xef, 0x4e, 0xb2, 0xc0, 0x26, 0x53, 0x47, 0x1c, 0x0d, 0xea, 0x16, 0x37, 0xef, 0x2a, 0x87, 0xdf, 0xbd, 0x3b,
0x4e, 0x4e, 0xba, 0xe4, 0xdf, 0xfd, 0x65, 0x58, 0x5c, 0x19, 0xd0, 0xe0, 0x07, 0x6c, 0x09, 0x90, 0x39, 0x39, 0xe9, 0x92, 0x7f, 0xf7, 0x97, 0x61, 0x71, 0x65, 0x40, 0x83, 0x1f, 0xb1, 0x25, 0x40,
0x39, 0x48, 0x8c, 0xd8, 0x62, 0x22, 0x35, 0x2e, 0xd5, 0x3b, 0x9f, 0x80, 0x49, 0xc1, 0x7b, 0xc6, 0xe6, 0x20, 0x31, 0x62, 0x8b, 0x89, 0xd4, 0xb8, 0x54, 0xef, 0x7d, 0x02, 0x26, 0x05, 0xef, 0x19,
0x5d, 0x59, 0x64, 0x4d, 0x99, 0x70, 0x60, 0x2b, 0xc4, 0xc2, 0xb5, 0x46, 0x43, 0xc0, 0x40, 0x38, 0x77, 0x65, 0x91, 0x35, 0x65, 0xc2, 0x81, 0xad, 0x10, 0x0b, 0xd7, 0x1a, 0x0d, 0x01, 0x03, 0xe1,
0x80, 0x65, 0x84, 0x70, 0xa0, 0xa8, 0xc4, 0x46, 0x79, 0x45, 0xfc, 0x5d, 0x65, 0x01, 0x29, 0x94, 0x00, 0x96, 0x11, 0xc2, 0x81, 0xa2, 0x12, 0x1b, 0xe5, 0x15, 0xf1, 0x77, 0x95, 0x05, 0xa4, 0x50,
0x03, 0x10, 0x92, 0xaa, 0xe3, 0x7d, 0x63, 0xf2, 0x62, 0x2b, 0x16, 0x40, 0x11, 0xb1, 0xbc, 0x09, 0x0e, 0x40, 0x48, 0xaa, 0x8e, 0xf7, 0x95, 0xc9, 0x8b, 0xad, 0x58, 0x00, 0x45, 0xc4, 0xf2, 0x26,
0x78, 0xd8, 0x29, 0x0c, 0x3e, 0xc8, 0x5a, 0x44, 0xa0, 0x4a, 0x95, 0xd3, 0x64, 0x31, 0x2d, 0x17, 0xe0, 0x61, 0xa7, 0x30, 0xf8, 0x20, 0x6b, 0x11, 0x81, 0x2a, 0x55, 0x4e, 0x93, 0xc5, 0xb4, 0x5c,
0xd8, 0xe4, 0xab, 0x18, 0xe5, 0xd7, 0x35, 0xf6, 0xb1, 0x7d, 0xb8, 0x02, 0x91, 0xfa, 0x11, 0xbf, 0x60, 0x93, 0xaf, 0x62, 0x94, 0x5f, 0xd7, 0xd8, 0xc7, 0xf6, 0xe1, 0x0a, 0x44, 0xea, 0x47, 0xfc,
0x2f, 0x86, 0x3c, 0x72, 0x30, 0xc1, 0xfd, 0xdf, 0x18, 0x0b, 0x88, 0x15, 0x93, 0x43, 0x48, 0xe1, 0xbe, 0x18, 0xf2, 0xc8, 0xc1, 0x04, 0xf7, 0x7f, 0x63, 0x2c, 0x20, 0x56, 0x4c, 0x0e, 0x21, 0x85,
0x8c, 0x53, 0xe2, 0x4c, 0x05, 0x07, 0x78, 0xba, 0x89, 0x9f, 0x5f, 0x9a, 0x80, 0x60, 0xed, 0x18, 0x33, 0x4e, 0x89, 0x33, 0x15, 0x1c, 0xe0, 0xe9, 0x26, 0x7e, 0x7e, 0x69, 0x02, 0x82, 0xb5, 0x63,
0x75, 0x13, 0xbb, 0xd8, 0x38, 0x38, 0x3b, 0x40, 0xc4, 0x59, 0xa9, 0x5c, 0xf0, 0x99, 0xf2, 0xdb, 0xd4, 0x4d, 0xec, 0x62, 0xe3, 0xe0, 0xec, 0x00, 0x11, 0x67, 0xa5, 0x72, 0xc9, 0x67, 0xca, 0x6f,
0x8d, 0xe9, 0x35, 0x33, 0x88, 0x14, 0x2c, 0x84, 0xe2, 0xaf, 0x20, 0x44, 0x4d, 0x3a, 0x3f, 0xe4, 0x37, 0xa6, 0xd7, 0xcc, 0x20, 0x52, 0xb0, 0x10, 0x8a, 0xbf, 0x82, 0x10, 0x35, 0xe9, 0xfc, 0x90,
0x10, 0xaf, 0x3e, 0x7b, 0x33, 0xc1, 0x82, 0x22, 0xf5, 0x82, 0x80, 0xd2, 0xe3, 0x45, 0x63, 0xb0, 0x43, 0xbc, 0xfa, 0xec, 0xcd, 0x04, 0x0b, 0x8a, 0xd4, 0x0b, 0x02, 0x4a, 0x8f, 0x17, 0x8d, 0xc1,
0x8a, 0x65, 0x04, 0xde, 0x30, 0x31, 0x2e, 0xa9, 0x0d, 0x01, 0xfa, 0x90, 0xa5, 0x77, 0xef, 0xf9, 0x2a, 0x96, 0x11, 0x78, 0xc3, 0xc4, 0xb8, 0xa4, 0x36, 0x04, 0xe8, 0x43, 0x96, 0xde, 0x83, 0xe7,
0x8f, 0x9e, 0xd4, 0x6a, 0x35, 0x33, 0x8e, 0x50, 0xd8, 0xec, 0x83, 0xef, 0xc6, 0x78, 0x67, 0x5a, 0x3f, 0x79, 0x52, 0xab, 0xd5, 0xcc, 0x38, 0x42, 0x61, 0xb3, 0x8f, 0xbe, 0x1b, 0xe3, 0x9d, 0x69,
0xb9, 0xc2, 0x93, 0x5c, 0x72, 0x9d, 0xb8, 0x5d, 0x59, 0x04, 0x99, 0x03, 0x09, 0x03, 0x98, 0x5a, 0xe5, 0x1a, 0x4f, 0x72, 0xc9, 0x75, 0xe2, 0x76, 0x65, 0x11, 0x64, 0x0e, 0x24, 0x0c, 0x60, 0x6a,
0xd2, 0x8a, 0xe7, 0xa7, 0xa6, 0x36, 0x74, 0x1b, 0xef, 0x8d, 0x6d, 0xed, 0xdb, 0xe2, 0x46, 0x45, 0x49, 0x2b, 0x9e, 0x9f, 0x9a, 0xda, 0xd0, 0x6d, 0xbc, 0x37, 0xb6, 0xb5, 0x6f, 0x8b, 0x1b, 0x15,
0x52, 0xe6, 0x9a, 0x59, 0xc1, 0xdb, 0x07, 0x99, 0xc8, 0x2b, 0x4f, 0x44, 0x69, 0xb7, 0x17, 0xa7, 0x49, 0x99, 0x6b, 0x66, 0x05, 0x6f, 0x1f, 0x64, 0x22, 0xaf, 0x3c, 0x11, 0xa5, 0xdd, 0x5e, 0x9c,
0x6a, 0x65, 0xe7, 0xd6, 0x6c, 0x9b, 0x43, 0xb3, 0xe9, 0xd4, 0xb1, 0xf1, 0x4c, 0x1e, 0x51, 0x9a, 0xaa, 0x95, 0x9d, 0x5b, 0xb3, 0x6d, 0x0e, 0xcd, 0xa6, 0x53, 0xc7, 0xc6, 0x33, 0x79, 0x44, 0x69,
0x08, 0xbf, 0x13, 0x5c, 0x07, 0xd5, 0xc4, 0x03, 0x58, 0x4a, 0x53, 0xdf, 0x03, 0x86, 0x3b, 0x28, 0x22, 0xfc, 0x4e, 0x70, 0x1d, 0x54, 0x13, 0x0f, 0x60, 0x29, 0x4d, 0x7d, 0x0f, 0x18, 0xee, 0xa0,
0x7d, 0x79, 0x5c, 0x4b, 0x31, 0x1a, 0x7b, 0x20, 0xf1, 0xf0, 0x48, 0xe5, 0x8c, 0xd7, 0xbc, 0x25, 0xf4, 0xe5, 0x71, 0x2d, 0xc5, 0x68, 0xec, 0x81, 0xc4, 0xc3, 0x23, 0x95, 0x33, 0x5e, 0xf3, 0x96,
0xbb, 0xc3, 0x05, 0x47, 0x22, 0xee, 0x6d, 0x95, 0xef, 0x75, 0x4b, 0x14, 0xe2, 0xd0, 0x5c, 0x22, 0xec, 0x0e, 0x17, 0x1c, 0x89, 0xb8, 0xb7, 0x55, 0xbe, 0xd7, 0x2d, 0x51, 0x88, 0x43, 0x73, 0x89,
0x6a, 0x3c, 0xef, 0x06, 0x12, 0x4e, 0x6d, 0x3c, 0x11, 0x2e, 0x2d, 0x6b, 0x48, 0x15, 0x36, 0x7f, 0xa8, 0xf1, 0xbc, 0x1b, 0x48, 0x38, 0xb5, 0xf1, 0x44, 0xb8, 0xb4, 0xac, 0x21, 0x55, 0xd8, 0xfc,
0xb8, 0x5f, 0x73, 0xad, 0xdd, 0xd6, 0x9d, 0x18, 0x77, 0xb2, 0xdf, 0x96, 0x29, 0x6f, 0x22, 0x77, 0xe1, 0x7e, 0xcd, 0xb5, 0x76, 0x5b, 0x77, 0x62, 0xdc, 0xc9, 0x7e, 0x5b, 0xa6, 0xbc, 0x89, 0xdc,
0x27, 0xa7, 0x8a, 0x5e, 0xb4, 0x84, 0x3f, 0xd6, 0xd8, 0x07, 0x26, 0xb8, 0x25, 0x22, 0x7d, 0x34, 0x9d, 0x9c, 0x2a, 0x7a, 0xd1, 0x12, 0xfe, 0x58, 0x63, 0x1f, 0x98, 0xe0, 0x96, 0x88, 0xf4, 0xd1,
0x4b, 0x54, 0xeb, 0x5a, 0xaa, 0x38, 0xd2, 0xe5, 0x37, 0xfb, 0x95, 0x2d, 0x47, 0xdf, 0xcc, 0xfc, 0x2c, 0x51, 0xad, 0x6b, 0xa9, 0xe2, 0x48, 0x97, 0xdf, 0xec, 0x57, 0xb6, 0x1c, 0x7d, 0x33, 0xf3,
0x08, 0x9e, 0x49, 0xe2, 0xbf, 0x3c, 0x21, 0x8e, 0xf2, 0x45, 0x9d, 0x64, 0x5c, 0x79, 0xe7, 0x7f, 0x23, 0x78, 0x26, 0x89, 0xff, 0xf2, 0x84, 0x38, 0xca, 0x17, 0x75, 0x92, 0x71, 0xe5, 0x9d, 0xff,
0x47, 0x58, 0x43, 0x4c, 0xd5, 0x5c, 0x74, 0x4b, 0x0b, 0x19, 0x8c, 0xd4, 0xb4, 0x5f, 0x4d, 0x83, 0x1d, 0x61, 0x0d, 0x31, 0x55, 0x73, 0xd1, 0x2d, 0x2d, 0x64, 0x30, 0x52, 0xd3, 0x7e, 0x35, 0x0d,
0x11, 0x49, 0xc6, 0x57, 0xb6, 0x11, 0x1c, 0x95, 0x20, 0x38, 0x92, 0x18, 0x8e, 0x72, 0x11, 0x2f, 0x46, 0x24, 0x19, 0x5f, 0xd9, 0x46, 0x70, 0x54, 0x82, 0xe0, 0x48, 0x62, 0x38, 0xca, 0x45, 0xbc,
0xe4, 0xfc, 0x5e, 0xf1, 0x73, 0x8c, 0xe4, 0x57, 0x61, 0x4f, 0x95, 0x6c, 0x61, 0x17, 0xa0, 0x03, 0x90, 0xf3, 0x7b, 0xcd, 0xcf, 0x31, 0x92, 0x5f, 0x85, 0x3d, 0x55, 0xb2, 0x85, 0x5d, 0x80, 0x0e,
0x7a, 0x12, 0xad, 0xea, 0xb9, 0x78, 0xb5, 0x30, 0x72, 0x61, 0x6c, 0x58, 0xf0, 0xa6, 0xfc, 0x8c, 0xe8, 0x49, 0xb4, 0xaa, 0xe7, 0xe2, 0xd5, 0xc2, 0xc8, 0x85, 0xb1, 0x61, 0xc1, 0x9b, 0xf2, 0x33,
0x29, 0xa9, 0x94, 0x76, 0xef, 0x8f, 0xc6, 0x90, 0x8c, 0xdc, 0x77, 0x85, 0x18, 0x0c, 0x1d, 0xc4, 0xa6, 0xa4, 0x52, 0xda, 0xbd, 0x3f, 0x1a, 0x43, 0x32, 0xf2, 0xd0, 0x15, 0x62, 0x30, 0x74, 0x10,
0xd0, 0x9d, 0x33, 0xf4, 0x42, 0xf0, 0x05, 0x3e, 0x8f, 0x79, 0x66, 0x7f, 0x84, 0x87, 0x50, 0x97, 0x43, 0x77, 0xce, 0xd0, 0x0b, 0xc1, 0x17, 0xf8, 0x3c, 0xe6, 0x99, 0xfd, 0x11, 0x1e, 0x42, 0x5d,
0x51, 0xa7, 0xc1, 0xa5, 0x24, 0x64, 0x58, 0x29, 0x90, 0xc8, 0x9d, 0xf9, 0xfc, 0x93, 0x0e, 0x1b, 0x46, 0x9d, 0x06, 0x97, 0x92, 0x90, 0x61, 0xa5, 0x40, 0x22, 0x77, 0xe6, 0xf3, 0x4f, 0x3a, 0x6c,
0x34, 0x0a, 0xa8, 0x91, 0x70, 0x09, 0xd3, 0xf0, 0x84, 0xd7, 0x1b, 0x3b, 0xae, 0x83, 0xae, 0x38, 0xd0, 0x28, 0xa0, 0x46, 0xc2, 0x25, 0x4c, 0xc3, 0x13, 0x5e, 0x6f, 0xec, 0xb8, 0x0e, 0xba, 0xe2,
0x24, 0xae, 0x35, 0x83, 0x04, 0x31, 0x5a, 0xb2, 0x88, 0xbb, 0x9c, 0x5f, 0xc1, 0x15, 0xba, 0xdc, 0x90, 0xb8, 0xd6, 0x0c, 0x12, 0xc4, 0x68, 0xc9, 0x22, 0xee, 0x72, 0x7e, 0x05, 0x57, 0xe8, 0x72,
0x3b, 0x82, 0xa9, 0x93, 0x5c, 0x58, 0x4d, 0x0e, 0x89, 0xf6, 0x4b, 0xce, 0x6f, 0x26, 0x32, 0x41, 0xef, 0x08, 0xa6, 0x4e, 0x72, 0x61, 0x35, 0x39, 0x24, 0xda, 0x2f, 0x39, 0xbf, 0x99, 0xc8, 0x04,
0x67, 0x82, 0x7e, 0x70, 0x8c, 0x31, 0x9a, 0x3d, 0x01, 0x00, 0xd8, 0xb0, 0x5d, 0xf0, 0xcb, 0xa0, 0x9d, 0x09, 0xfa, 0xc1, 0x31, 0xc6, 0x68, 0xf6, 0x0d, 0x00, 0xc0, 0x86, 0xed, 0x82, 0x5f, 0x06,
0x16, 0x95, 0x32, 0xbd, 0xb8, 0xb2, 0xee, 0x19, 0x3a, 0x22, 0x36, 0x5b, 0x24, 0x6e, 0x89, 0x41, 0xb5, 0xa8, 0x94, 0xe9, 0xc5, 0xb5, 0xf5, 0xc0, 0xd0, 0x11, 0xb1, 0xd9, 0x22, 0x71, 0x4b, 0x0c,
0x51, 0x22, 0x09, 0xec, 0x8c, 0xbd, 0x49, 0x9c, 0x1c, 0x89, 0xe0, 0x2a, 0xcd, 0x6e, 0xbc, 0x8c, 0x8a, 0x12, 0x49, 0x60, 0x67, 0xec, 0x4d, 0xe2, 0xe4, 0x48, 0x04, 0x57, 0x69, 0x76, 0xe3, 0x65,
0xc4, 0xce, 0x10, 0xcc, 0x77, 0xe2, 0xd8, 0x2c, 0xda, 0x3d, 0x3e, 0xf3, 0x69, 0xa2, 0x1d, 0xc3, 0x24, 0x76, 0x86, 0x60, 0xbe, 0x13, 0xc7, 0x66, 0xd1, 0xee, 0xf1, 0x99, 0x4f, 0x13, 0xed, 0x18,
0x3b, 0x23, 0x32, 0xeb, 0x97, 0xb1, 0x3b, 0x72, 0x64, 0xe4, 0xde, 0xa1, 0xd2, 0x7c, 0x85, 0x2a, 0xde, 0x19, 0x91, 0x59, 0xbf, 0x8c, 0xdd, 0x91, 0x23, 0x90, 0xa3, 0x68, 0x66, 0xae, 0x3f, 0x16,
0xe2, 0x80, 0x10, 0xac, 0xc7, 0x1f, 0x7c, 0x3d, 0xff, 0x58, 0x58, 0x41, 0x80, 0x6b, 0x95, 0xdf, 0x09, 0x0e, 0x10, 0x99, 0x4e, 0x73, 0x59, 0x41, 0xa5, 0x3c, 0x2d, 0xb8, 0x3a, 0x97, 0x61, 0x7f,
0xba, 0x21, 0x49, 0xff, 0xbc, 0x93, 0x3b, 0x53, 0x94, 0x6d, 0x62, 0xbc, 0x26, 0xa3, 0xdd, 0xa6, 0x87, 0x3d, 0xf0, 0xe5, 0xad, 0x88, 0xd3, 0x45, 0xb0, 0x98, 0x7f, 0x70, 0x65, 0xf8, 0x63, 0x61,
0x93, 0xb4, 0xed, 0x0b, 0xfa, 0xcf, 0x6b, 0x4c, 0xb0, 0x9d, 0xca, 0xb6, 0xf1, 0x94, 0x63, 0xc0, 0x05, 0x01, 0x2e, 0x74, 0x7e, 0xdf, 0x87, 0x24, 0xcd, 0xf7, 0x4e, 0xee, 0x40, 0x52, 0xb6, 0x03,
0xd6, 0x7d, 0x86, 0x21, 0xd9, 0xff, 0xd8, 0xb4, 0x9d, 0xca, 0x7e, 0x03, 0x4f, 0x67, 0xc6, 0x2b, 0xf2, 0x9a, 0x80, 0x77, 0xdb, 0x5d, 0xd2, 0xf3, 0x2f, 0x18, 0x0f, 0x2f, 0x50, 0xc1, 0xf0, 0x2a,
0x4e, 0x39, 0x25, 0xde, 0x66, 0x05, 0xd5, 0xc0, 0x9d, 0x67, 0xdf, 0x9d, 0x64, 0x69, 0x4e, 0x69, 0xdb, 0x96, 0x57, 0x8e, 0x01, 0xfb, 0xfe, 0x19, 0x86, 0x64, 0xf3, 0x64, 0xd3, 0xf0, 0x2a, 0xfb,
0x72, 0xb3, 0xb9, 0x9f, 0x67, 0xe8, 0x69, 0x53, 0x1e, 0x0a, 0xcd, 0xcc, 0xeb, 0x21, 0x37, 0x17, 0xbd, 0x43, 0x3a, 0x33, 0x5e, 0xae, 0xca, 0x29, 0xf1, 0x1e, 0x2d, 0xe8, 0x15, 0x6e, 0x5b, 0xfb,
0xb7, 0x85, 0xde, 0x7e, 0xe5, 0x8d, 0xcd, 0x7d, 0x28, 0x3f, 0xf7, 0xb4, 0xf6, 0xd3, 0xf8, 0x27, 0xee, 0x64, 0x53, 0xe2, 0x1b, 0x99, 0xd1, 0xe6, 0x66, 0xa0, 0xa1, 0xa7, 0x1d, 0x7d, 0xa8, 0x52,
0xd5, 0x0b, 0xaa, 0xcf, 0x4d, 0xe8, 0x92, 0x23, 0x4b, 0xb7, 0xe0, 0x50, 0x62, 0x46, 0x26, 0x9b, 0x33, 0x97, 0x89, 0xdc, 0x5c, 0xde, 0x15, 0x36, 0x06, 0x2a, 0x6f, 0xdc, 0x19, 0x80, 0xda, 0x75,
0x4d, 0xf9, 0x04, 0xb2, 0x92, 0x6d, 0xb5, 0x35, 0x5a, 0x47, 0xf7, 0x6c, 0x55, 0x38, 0xa2, 0xb7, 0xcf, 0xbe, 0x40, 0x1a, 0x3c, 0xa5, 0x6e, 0x42, 0xe9, 0xba, 0x09, 0x5d, 0x72, 0xde, 0xe9, 0x0e,
0xbd, 0xdf, 0x26, 0x81, 0xf8, 0x51, 0xe4, 0xdc, 0xe1, 0xbb, 0x4d, 0x74, 0x4d, 0x3c, 0x12, 0xc9, 0xbc, 0x51, 0xcc, 0xc8, 0x64, 0xb3, 0xa3, 0x9f, 0x40, 0x56, 0xb2, 0x7d, 0xba, 0x46, 0xeb, 0xe8,
0x21, 0xc7, 0xf8, 0xf3, 0x0e, 0x3b, 0xf0, 0xe1, 0xc1, 0xc9, 0xdd, 0x44, 0x2b, 0xd9, 0x2e, 0x5c, 0x81, 0xad, 0x0a, 0xe7, 0xfb, 0xb6, 0x37, 0xeb, 0x24, 0x10, 0x3f, 0xc7, 0x9c, 0x3b, 0xb9, 0xb7,
0xc3, 0x78, 0x8d, 0xb5, 0x63, 0xda, 0x3f, 0x96, 0xf4, 0x78, 0x25, 0xb1, 0x03, 0xd7, 0x4f, 0xb4, 0x89, 0xae, 0x89, 0xe7, 0x29, 0x39, 0xe4, 0x18, 0x7f, 0x1b, 0x62, 0x07, 0x3e, 0x3c, 0x75, 0xb9,
0xff, 0x8e, 0x83, 0x85, 0x25, 0xb2, 0x48, 0xdb, 0xe3, 0x7d, 0x5e, 0x1a, 0x87, 0x5c, 0x74, 0x25, 0x9b, 0x68, 0x25, 0xdb, 0xc2, 0x6b, 0x18, 0xaf, 0xb1, 0x76, 0x4c, 0xfb, 0xc7, 0x92, 0x1e, 0x2f,
0x11, 0x17, 0xfd, 0x4a, 0x65, 0xa3, 0xf3, 0x2d, 0x1b, 0xdf, 0x99, 0xaa, 0xfe, 0x88, 0x7d, 0x6f, 0x43, 0x76, 0xe0, 0xfa, 0x89, 0xf6, 0xdf, 0x71, 0xb0, 0xb0, 0x44, 0x16, 0x69, 0x6f, 0xbd, 0xcf,
0xde, 0x51, 0xf8, 0x71, 0x77, 0xd7, 0xbb, 0x72, 0xca, 0xb3, 0x55, 0xd0, 0x17, 0xb1, 0x8e, 0x98, 0xeb, 0xea, 0x90, 0x8b, 0xae, 0x24, 0x5c, 0xa3, 0x53, 0xaa, 0x6c, 0xb4, 0xcd, 0x65, 0xd7, 0x3c,
0xf0, 0x2d, 0x2c, 0xc7, 0x4b, 0x5d, 0x0e, 0xfe, 0xf2, 0xc4, 0x2b, 0x39, 0xfe, 0xd5, 0xe8, 0x3a, 0x53, 0xd5, 0x1f, 0xb1, 0x69, 0xce, 0xdb, 0x11, 0x3f, 0xee, 0x6e, 0x99, 0x57, 0x4e, 0x79, 0xaa,
0x4b, 0xe2, 0x45, 0xb5, 0xc7, 0x0f, 0x49, 0x97, 0x27, 0x01, 0x69, 0xd1, 0xbf, 0x81, 0x95, 0xff, 0x0b, 0xfa, 0x22, 0xd6, 0x11, 0xb3, 0xc5, 0x85, 0xe5, 0x78, 0xa9, 0xbf, 0xc2, 0x9f, 0xad, 0x78,
0xfa, 0x8d, 0xc4, 0xc8, 0xbb, 0x9e, 0xa4, 0x62, 0xd9, 0x36, 0x0b, 0x20, 0xac, 0xd7, 0x38, 0xba, 0xa5, 0x40, 0xb8, 0x1e, 0xdd, 0x64, 0x15, 0x80, 0x28, 0x15, 0xf9, 0x09, 0xeb, 0xf2, 0x0c, 0x22,
0x1d, 0x86, 0x9e, 0x58, 0xc7, 0xc2, 0xcd, 0x95, 0x74, 0x3f, 0xe6, 0x7a, 0xc6, 0xb4, 0xee, 0x84, 0xed, 0x18, 0x6c, 0x60, 0xe5, 0x3f, 0x9d, 0x23, 0x31, 0xf2, 0x96, 0x29, 0xa9, 0x58, 0xb6, 0xcd,
0x02, 0x03, 0x08, 0xe2, 0x57, 0xfe, 0xbc, 0x60, 0xb9, 0xd2, 0x70, 0x2d, 0x52, 0x01, 0x43, 0x9c, 0x02, 0xc8, 0x09, 0x6a, 0x1c, 0xdd, 0x0e, 0x43, 0x4f, 0xac, 0x63, 0xe1, 0xe6, 0xea, 0xc1, 0x1f,
0x9a, 0xa5, 0xbf, 0xb4, 0xc4, 0x45, 0x3b, 0xb5, 0xc0, 0x67, 0xc2, 0xc7, 0x69, 0x08, 0x41, 0x7f, 0x73, 0x0d, 0x67, 0x5a, 0x77, 0x42, 0x81, 0x01, 0x04, 0xf1, 0x2b, 0x7f, 0x5e, 0xb0, 0x5c, 0x69,
0x52, 0x87, 0x04, 0x85, 0xf7, 0x33, 0x4d, 0xfa, 0x07, 0x2c, 0xb9, 0x77, 0x4f, 0xd1, 0xea, 0xe0, 0xb8, 0x16, 0xa9, 0x80, 0x21, 0x4e, 0xcd, 0xd2, 0x9f, 0x69, 0xe2, 0xa2, 0x9d, 0x5a, 0xe0, 0x70,
0xad, 0xdf, 0xab, 0x5b, 0x42, 0xb6, 0xb7, 0xd8, 0x19, 0x79, 0xfb, 0x26, 0x1b, 0x1e, 0xf0, 0x91, 0xe1, 0xe3, 0x34, 0x84, 0x8c, 0x61, 0x52, 0x87, 0xec, 0x86, 0x37, 0x43, 0x4d, 0xfa, 0x07, 0x2c,
0x67, 0x4b, 0x2e, 0xb7, 0xed, 0xb0, 0x92, 0x33, 0x44, 0x22, 0xae, 0xfb, 0xed, 0x5f, 0x96, 0xdb, 0xb9, 0xf7, 0x40, 0xd1, 0xea, 0xe0, 0xad, 0xdf, 0xab, 0x5b, 0x42, 0xb6, 0x77, 0xd8, 0x56, 0x79,
0x2b, 0x9a, 0x14, 0x80, 0x6f, 0xd2, 0x14, 0x6c, 0x07, 0xed, 0xd1, 0x94, 0xdd, 0xfe, 0x17, 0xf2, 0xfb, 0x0e, 0x1d, 0x9e, 0x0e, 0x92, 0x07, 0x53, 0xae, 0xb6, 0xed, 0xb0, 0x92, 0x33, 0x44, 0x22,
0x1e, 0xf9, 0x93, 0x15, 0x11, 0x4f, 0x82, 0xee, 0xb0, 0x85, 0xcd, 0x63, 0x21, 0xee, 0x63, 0x4e, 0xee, 0x0a, 0xee, 0x5f, 0x96, 0xbb, 0x6b, 0x9a, 0x54, 0x8f, 0x6f, 0xd2, 0x14, 0xec, 0x25, 0xed,
0x31, 0x83, 0x17, 0x59, 0xfd, 0x32, 0xa8, 0xf3, 0x36, 0xdf, 0xa6, 0xa3, 0xdb, 0xe4, 0x7c, 0x28, 0xd1, 0x94, 0xdd, 0xfe, 0x17, 0x92, 0x26, 0xf9, 0x7b, 0x17, 0x11, 0xcf, 0xa0, 0xee, 0xb1, 0xff,
0xf5, 0x49, 0x62, 0xcd, 0x55, 0x27, 0x1b, 0x59, 0xe2, 0x19, 0x64, 0x89, 0xe5, 0xce, 0x72, 0x51, 0xcd, 0x03, 0x29, 0x6e, 0x82, 0x4e, 0x31, 0xfd, 0x17, 0x25, 0xc1, 0x32, 0xa8, 0xf3, 0x1e, 0xe1,
0x96, 0x30, 0x66, 0x89, 0xa1, 0xa2, 0x1f, 0xc1, 0x13, 0x35, 0xa9, 0x04, 0x4e, 0x65, 0xc9, 0x86, 0x6b, 0xa1, 0x65, 0x28, 0xf5, 0x49, 0x62, 0xcd, 0x95, 0x36, 0x1b, 0x29, 0xe6, 0x19, 0xa4, 0x98,
0xcc, 0x41, 0xce, 0x93, 0x27, 0x31, 0xbc, 0xd9, 0x51, 0x6b, 0x6e, 0x53, 0xd0, 0x0b, 0x85, 0x25, 0xe5, 0xce, 0x72, 0x51, 0x96, 0x6d, 0x66, 0x59, 0xa5, 0xa2, 0x1f, 0xc1, 0x13, 0x35, 0x29, 0x23,
0x64, 0x99, 0x63, 0xdf, 0x87, 0x54, 0x5d, 0xc7, 0x0a, 0x2e, 0x4a, 0x52, 0xce, 0x28, 0x25, 0x8a, 0x4e, 0x65, 0xbd, 0x87, 0xcc, 0x41, 0xc2, 0x94, 0x27, 0x31, 0xbc, 0xdd, 0x51, 0xa8, 0x6e, 0x53,
0x39, 0xc5, 0x47, 0x6b, 0xb1, 0xb0, 0x88, 0xed, 0x87, 0xa1, 0xac, 0xde, 0x30, 0xc2, 0x8b, 0xfc, 0xd0, 0x0b, 0x55, 0x29, 0xa4, 0xa8, 0x63, 0xdf, 0x87, 0x3c, 0x5f, 0xc7, 0xf2, 0x2f, 0x4a, 0xf2,
0xe5, 0x15, 0x19, 0x7d, 0x84, 0xfc, 0x92, 0x28, 0x51, 0x1c, 0xfa, 0x50, 0xa3, 0xa0, 0x37, 0x49, 0xd5, 0x28, 0x25, 0x8a, 0x51, 0xf7, 0x83, 0xb5, 0x58, 0x58, 0xc4, 0xf6, 0xc3, 0x50, 0x96, 0x7e,
0x3b, 0x04, 0x9c, 0x40, 0x65, 0x27, 0xf6, 0x12, 0x61, 0xee, 0xa0, 0x80, 0xed, 0x16, 0xa2, 0xe0, 0x98, 0x1e, 0x88, 0xe4, 0xe7, 0x15, 0x19, 0x7d, 0x80, 0xe4, 0x94, 0x28, 0x51, 0x1c, 0xfa, 0x50,
0x4f, 0xde, 0x6c, 0x62, 0xc7, 0x7f, 0xc3, 0xac, 0x64, 0x04, 0xc3, 0x88, 0x73, 0x1c, 0x4b, 0xc1, 0xe0, 0xa0, 0x37, 0x49, 0xdb, 0x0b, 0x9c, 0x40, 0x65, 0x27, 0xf6, 0x12, 0x61, 0xee, 0xa0, 0x80,
0x7d, 0xd8, 0x14, 0x5c, 0x65, 0x43, 0x72, 0x46, 0xf9, 0xda, 0xfc, 0x80, 0x0a, 0x75, 0x07, 0xd9, 0xbd, 0x1a, 0xa2, 0xe0, 0xef, 0xe5, 0x6c, 0x62, 0xc7, 0x7f, 0xc3, 0xac, 0xde, 0x04, 0xc3, 0x88,
0x5b, 0xe4, 0x20, 0xd3, 0x42, 0xa7, 0xce, 0x42, 0x3f, 0x8a, 0xa6, 0xd6, 0x84, 0xbd, 0x26, 0x97, 0x73, 0x1c, 0x4b, 0xc1, 0xbd, 0xdf, 0x14, 0x5c, 0x65, 0x43, 0x72, 0x46, 0xf9, 0xda, 0xfc, 0x80,
0xbb, 0x0f, 0x42, 0x77, 0x32, 0x04, 0x04, 0x7f, 0x71, 0x6a, 0x83, 0xb9, 0xbb, 0xf7, 0xbb, 0x98, 0x0a, 0x75, 0x0f, 0xa9, 0x5f, 0xe4, 0x20, 0xd3, 0x42, 0xa7, 0xce, 0x42, 0x3f, 0x8a, 0xa6, 0xd6,
0x7b, 0x72, 0xb7, 0x8f, 0xcd, 0xe0, 0x4f, 0xd6, 0x91, 0x45, 0x84, 0x68, 0x65, 0x47, 0xe4, 0xc6, 0x84, 0xbd, 0x26, 0x97, 0xfb, 0xf7, 0x42, 0x77, 0x32, 0x04, 0x04, 0x7f, 0xae, 0x6a, 0x83, 0xb9,
0x72, 0x59, 0x0c, 0x51, 0x2d, 0xce, 0xd8, 0x7c, 0x8d, 0xb1, 0x9b, 0x0f, 0xc2, 0x54, 0x90, 0x9b, 0xfb, 0xf3, 0x5d, 0xcc, 0x7d, 0x73, 0xb7, 0xcf, 0xdc, 0xe0, 0xef, 0xdd, 0x91, 0x45, 0x84, 0x68,
0x09, 0x14, 0xd4, 0x20, 0x3c, 0x3e, 0xb3, 0x44, 0xc9, 0xdf, 0xcb, 0x5f, 0xf7, 0xda, 0x6c, 0x76, 0x65, 0x3b, 0xe5, 0xd6, 0x72, 0x59, 0x0c, 0x51, 0x2d, 0xce, 0xd8, 0x7c, 0x8d, 0xb1, 0xdb, 0xf7,
0xdc, 0x5d, 0xbe, 0xa2, 0x80, 0x3b, 0xc4, 0x08, 0xef, 0xb8, 0x22, 0x24, 0xf8, 0xef, 0xb8, 0xb3, 0xc2, 0x54, 0x90, 0x9b, 0x09, 0x54, 0xe3, 0x20, 0x3c, 0x3e, 0xb3, 0x44, 0xc9, 0xcf, 0xe5, 0x4f,
0xda, 0x6d, 0x4b, 0x77, 0xc3, 0xd7, 0x15, 0xbd, 0x52, 0x42, 0x08, 0x89, 0x60, 0xc3, 0x72, 0xf3, 0x83, 0x6d, 0x76, 0x4a, 0xee, 0xaf, 0x5e, 0x51, 0xc0, 0x1d, 0x62, 0x84, 0x77, 0x5c, 0x11, 0x12,
0x10, 0xf3, 0xdd, 0xa7, 0xb2, 0x6c, 0xe0, 0x93, 0xe5, 0xc4, 0xbc, 0x37, 0x01, 0x96, 0x56, 0xd9, 0xfc, 0xf7, 0xdc, 0x59, 0xed, 0xb6, 0xa5, 0xfb, 0xe1, 0xeb, 0x8a, 0x5e, 0x29, 0x21, 0x84, 0x44,
0x73, 0x92, 0xf9, 0x03, 0x2c, 0xf5, 0x9e, 0x24, 0x00, 0x5f, 0x13, 0x9e, 0x42, 0xa6, 0x40, 0x95, 0xb0, 0xdb, 0xb9, 0x79, 0x02, 0xfa, 0xfe, 0x63, 0x59, 0x36, 0xf0, 0xd1, 0x72, 0x62, 0xde, 0xd8,
0xed, 0xa3, 0x37, 0xa3, 0xa5, 0x17, 0x3a, 0x51, 0x59, 0x00, 0x05, 0xb9, 0xf3, 0x4b, 0x05, 0xf8, 0x00, 0x4b, 0xab, 0xec, 0x39, 0x06, 0xfd, 0x1e, 0x96, 0x7a, 0x4f, 0x12, 0x80, 0xaf, 0x09, 0x4f,
0x03, 0x39, 0x50, 0xe8, 0x60, 0xa4, 0xe3, 0x8b, 0x51, 0x11, 0x4f, 0x87, 0x16, 0x38, 0x74, 0x9b, 0x21, 0x53, 0xa0, 0xca, 0xf6, 0xb9, 0x9d, 0xd1, 0xd2, 0x0b, 0x9d, 0xa8, 0x2c, 0x80, 0x82, 0xdc,
0xe5, 0x4c, 0xe7, 0xb5, 0xb3, 0x90, 0x67, 0x77, 0xf9, 0x53, 0x95, 0x89, 0x32, 0x3d, 0xda, 0xb4, 0xf9, 0x8d, 0x04, 0xfc, 0x75, 0x1d, 0xa8, 0x92, 0x30, 0xd2, 0xf1, 0xc5, 0xa8, 0x88, 0xa7, 0x43,
0xff, 0xd1, 0xf5, 0xc7, 0x96, 0xcb, 0x6f, 0x7e, 0x61, 0x8e, 0xcb, 0x6d, 0xb0, 0xec, 0xf4, 0x5f, 0x0b, 0x1c, 0xba, 0xcd, 0x72, 0xa6, 0xf3, 0xda, 0x41, 0xca, 0xb3, 0xfb, 0xfc, 0x91, 0xcc, 0x44,
0xe9, 0x61, 0x3f, 0xba, 0x35, 0x2d, 0x5e, 0xb4, 0xbf, 0xdf, 0x95, 0x4c, 0xbd, 0x72, 0x52, 0x3c, 0x99, 0x9e, 0x6c, 0xda, 0xff, 0x20, 0x12, 0x6b, 0x5f, 0xe6, 0xb8, 0xdc, 0x06, 0xcb, 0x8e, 0x0e,
0x97, 0x6b, 0xbd, 0x72, 0x26, 0x10, 0x85, 0xfc, 0xca, 0xa9, 0x40, 0x94, 0x70, 0xa5, 0xfc, 0x60, 0x96, 0x9e, 0x14, 0xa4, 0x5b, 0xd3, 0xe2, 0x15, 0xff, 0xf9, 0xae, 0x64, 0xea, 0x95, 0x63, 0xe6,
0x20, 0x2f, 0x3a, 0xd2, 0xe9, 0x81, 0x70, 0xb2, 0x23, 0x8d, 0xaf, 0x94, 0x2c, 0x67, 0xb7, 0xb2, 0xb9, 0x5c, 0xeb, 0x95, 0x03, 0x85, 0x28, 0xe4, 0x57, 0x8e, 0x14, 0xa2, 0x84, 0x2b, 0xe5, 0xa7,
0x64, 0x81, 0x31, 0x90, 0xac, 0x83, 0x69, 0x3d, 0x40, 0xe1, 0xe4, 0x82, 0xeb, 0x81, 0xaa, 0x61, 0x0a, 0x79, 0xc5, 0x92, 0x4e, 0x0f, 0x84, 0x93, 0x9d, 0x87, 0x7c, 0xa5, 0xde, 0x39, 0xbb, 0x93,
0x47, 0x14, 0xdd, 0xce, 0x8f, 0x2b, 0x9b, 0x09, 0xf2, 0xd9, 0xb0, 0xe8, 0x61, 0x64, 0x58, 0x83, 0xf5, 0x0e, 0x8c, 0x81, 0x64, 0x1d, 0x4c, 0xeb, 0x11, 0xaa, 0x2e, 0x17, 0x5c, 0x0f, 0x54, 0x0d,
0x15, 0x3f, 0x9d, 0x3c, 0xe0, 0x52, 0x4f, 0xf8, 0xf2, 0x27, 0x66, 0x9d, 0x23, 0x28, 0x66, 0x54, 0x3b, 0xa2, 0xe8, 0x76, 0x7e, 0x5c, 0xd9, 0x4c, 0x90, 0xcf, 0x86, 0x45, 0x0f, 0x23, 0xc3, 0x1a,
0x49, 0x8c, 0x78, 0x58, 0xa6, 0xd4, 0x97, 0xfc, 0xc6, 0x24, 0x51, 0x1e, 0x43, 0x2b, 0xc0, 0x96, 0xac, 0xf8, 0xe9, 0xe4, 0x11, 0x97, 0x7a, 0xc2, 0x97, 0x3f, 0x31, 0xeb, 0x1c, 0x41, 0x31, 0xa3,
0xc2, 0xc2, 0x7f, 0x80, 0xc1, 0xea, 0x1e, 0xf5, 0xae, 0x24, 0x43, 0x2c, 0xf7, 0xd1, 0x5a, 0x45, 0x4a, 0x62, 0xc4, 0xc3, 0x32, 0xa5, 0xbe, 0xe2, 0xd7, 0x2d, 0x89, 0xf2, 0x14, 0x5a, 0x01, 0xf6,
0x04, 0x47, 0xaa, 0x7b, 0x96, 0x22, 0x01, 0xf7, 0xf0, 0x84, 0xee, 0x06, 0x74, 0x89, 0xe2, 0xe3, 0x23, 0x16, 0xfe, 0x23, 0x0c, 0x56, 0xf7, 0xa8, 0x77, 0x25, 0x19, 0x62, 0xb9, 0x4f, 0xd6, 0x2a,
0xe2, 0x97, 0x78, 0xee, 0xd2, 0x75, 0xaa, 0x48, 0xc7, 0x10, 0x8a, 0x13, 0xb0, 0xd8, 0x68, 0x63, 0x22, 0x38, 0x52, 0xdd, 0xb3, 0x14, 0x09, 0xb8, 0x87, 0xc7, 0x7b, 0x37, 0xa0, 0x4b, 0x14, 0x1f,
0x6f, 0x13, 0x74, 0xe2, 0x78, 0x8c, 0x46, 0x2a, 0xe7, 0x0f, 0x50, 0x40, 0x54, 0x32, 0x41, 0x7f, 0x17, 0xbf, 0xc4, 0x73, 0x97, 0xae, 0x53, 0x45, 0x3a, 0x86, 0x50, 0x1c, 0x9f, 0xc5, 0x2e, 0x1d,
0xb8, 0x19, 0xbd, 0x5a, 0x10, 0xd9, 0x53, 0x5e, 0x0d, 0xe2, 0xef, 0x1b, 0x92, 0x98, 0x2d, 0x02, 0x7b, 0x9b, 0xa0, 0x13, 0xc7, 0x63, 0x34, 0x52, 0x39, 0xbf, 0x87, 0x02, 0xa2, 0x92, 0x09, 0xfa,
0x37, 0x4f, 0xbf, 0x52, 0x9e, 0x1b, 0x36, 0x28, 0xf9, 0xe7, 0x73, 0x43, 0x9a, 0x6c, 0x87, 0xa7, 0xfd, 0xed, 0xe8, 0xd5, 0x82, 0xc8, 0x9e, 0xf2, 0x6a, 0x10, 0x7f, 0x1c, 0x91, 0xc4, 0x6c, 0x11,
0xbb, 0xe6, 0x0d, 0x28, 0x5c, 0x78, 0x0a, 0x50, 0x96, 0x17, 0x62, 0x9b, 0xff, 0xff, 0x64, 0xff, 0xb8, 0x79, 0xfa, 0x95, 0xf2, 0xdc, 0xb0, 0x41, 0xc9, 0x3f, 0x9f, 0x1b, 0xd2, 0x64, 0x2f, 0x3d,
0xa0, 0x8e, 0x5b, 0x22, 0xb9, 0x32, 0x59, 0xfc, 0x0a, 0x63, 0x42, 0xb6, 0x8e, 0xbb, 0x29, 0xb8, 0xdd, 0x72, 0x6f, 0x40, 0xe1, 0xc2, 0x53, 0x80, 0xb2, 0xbc, 0x10, 0xf7, 0x08, 0xfe, 0x4f, 0x36,
0xb5, 0x82, 0x3f, 0xc3, 0xfa, 0x3f, 0x59, 0xcf, 0xc5, 0xe9, 0x96, 0x55, 0x00, 0x00 0x1f, 0xea, 0xb8, 0x9f, 0x92, 0x2b, 0x93, 0xc5, 0x4f, 0x38, 0x26, 0x64, 0xeb, 0xb8, 0x15, 0x83,
0xfb, 0x32, 0xf8, 0x1b, 0xae, 0xff, 0x03, 0x0d, 0x22, 0xe8, 0x1f, 0xd3, 0x55, 0x00, 0x00
}; };

View File

@ -85,6 +85,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
Bus::setCCTBlend(strip.cctBlending); Bus::setCCTBlend(strip.cctBlending);
Bus::setAutoWhiteMode(request->arg(F("AW")).toInt()); Bus::setAutoWhiteMode(request->arg(F("AW")).toInt());
strip.setTargetFps(request->arg(F("FR")).toInt()); strip.setTargetFps(request->arg(F("FR")).toInt());
strip.useLedsArray = request->hasArg(F("LD"));
bool busesChanged = false; bool busesChanged = false;
for (uint8_t s = 0; s < WLED_MAX_BUSSES; s++) { for (uint8_t s = 0; s < WLED_MAX_BUSSES; s++) {

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2208041 #define VERSION 2208051
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG

View File

@ -326,6 +326,7 @@ void getSettingsJS(byte subPage, char* dest)
sappend('v',SET_F("CB"),strip.cctBlending); sappend('v',SET_F("CB"),strip.cctBlending);
sappend('v',SET_F("FR"),strip.getTargetFps()); sappend('v',SET_F("FR"),strip.getTargetFps());
sappend('v',SET_F("AW"),Bus::getAutoWhiteMode()); sappend('v',SET_F("AW"),Bus::getAutoWhiteMode());
sappend('v',SET_F("LD"),strip.useLedsArray);
for (uint8_t s=0; s < busses.getNumBusses(); s++) { for (uint8_t s=0; s < busses.getNumBusses(); s++) {
Bus* bus = busses.getBus(s); Bus* bus = busses.getBus(s);