Compare commits

...

16 Commits

Author SHA1 Message Date
Blaz Kristan
5eadbe7ecd FX update
- Meteor: trail & 0.13 behaviour
- Meteor Smooth: train & 0.13 behaviour
- Scrolling Text: rotation
2023-09-24 16:48:59 +02:00
Frank
ea7e0c6204 npm run build
regenerate UI files from latest sources.
2023-09-23 21:22:14 +02:00
Frank
2dcb126e6d version bump 0.14.0-b6
beta release preparation.
2023-09-23 21:08:11 +02:00
Frank
438525e8ec AR: use bandpass filter for analog input
Many bad quality analog mics are not centered properly at 1.6V, but stuck at 0V or stuck at 3.3V in silence. The bandpass filter removes DC offsets and improve signal quality.
2023-09-23 16:48:45 +02:00
Frank
eb66a403d9 Merge pull request #3377 from christianpatterson/audioreactive-initialize-i2ssource-bugfix
Fix ES8388Source & ES7243 initialization.
2023-09-19 16:32:10 +02:00
Frank
26ac612474 fix wrong signature of SPH0654::initialize()
* debug messages added to different initializers
* SPH0654::initialize() was having a wrong signature: uint8 instead of int8.

C++ can be a real bastard ;-)
2023-09-19 15:27:41 +02:00
Frank
43613e3b10 Matrix effect speedup
Typically, more than 50% of pixels are black. 
This optimization avoids to fade and rewrite already black pixels.
2023-09-18 15:56:50 +02:00
Frank
555dd2e726 matrix: fix for a corner case (e.g. gapmaps)
workaround for a corner case; if the reference pixels falls into a "gap" then gPC returns BLACK. Solutions is to reject BLACK.
2023-09-18 15:34:53 +02:00
Frank
3260f46543 bugfix for #3375
* improves robustness of the Matrix effect, by dynamically adjusting the "reference color" used to identify "falling code" head pixels.
* a bit faster, as I've removed the need to scan all pixels a second time for "black screen" detection.

Its still not perfect, and the main loop could be simplified a lot by leveraging on the fact that all changes actually happen in the top row, and "falling" is actually just moving everything down by one pixel.
2023-09-18 14:57:15 +02:00
Christian Patterson
f9de23402a Remove obsolete I2C parameters from AudioSource::initialize and all overriding methods. 2023-09-17 19:10:18 -05:00
Christian Patterson
9e155cf94a Fix ES8388Source & ES7243 initialization.
Update ES8388Source::initialize and ES7243::initialize method signatures to match I2SSource::initialize so that when initialize is called on a AudioSource pointer the child class's method is used.
2023-09-17 14:12:20 -05:00
Frank
527e3d6cd0 Merge pull request #3373 from Aircoookie/ripple-tweak
2D Ripple and Meteor effect tweak
2023-09-17 18:48:43 +02:00
Blaz Kristan
c7d45c28cf Meteor effect change
- remedy for #3374
2023-09-16 12:30:57 +02:00
Blaz Kristan
87cc3fd714 2D Ripple effect tweak
for #3370
2023-09-16 00:21:10 +02:00
Frank
282d58a6fe audioreactive: stack size tuning
This gives ~3KB extra free heap on -S2.
2023-09-14 18:26:57 +02:00
Blaz Kristan
fc4ed1c50b Fix for #3369 2023-09-12 16:48:32 +02:00
14 changed files with 892 additions and 863 deletions

View File

@@ -1,12 +1,17 @@
## WLED changelog
#### Build 2309240
- Release of WLED beta version 0.14.0-b6 "Hoshi"
- Effect bugfixes and improvements (Meteor, Meteor Smooth, Scrolling Text)
- audioreactive: bugfixes for ES8388 and ES7243 init; minor improvements for analog inputs
#### Build 2309100
- Release of WLED beta version 0.14.0-b5 "Hoshi"
- New standard esp32 build with audioreactive
- Effect blending bugfixes, and minor optimizations
#### Build 2309050
- Effect blending (#3311) (finally efect transitions!)
- Effect blending (#3311) (finally effect transitions!)
*WARNING*: May not work well with ESP8266, with plenty of segments or usermods (low RAM condition)!!!
- Added receive and send sync groups to JSON API (#3317) (you can change sync groups using preset)
- Internal temperature usermod (#3246)
@@ -35,7 +40,7 @@
- Preset cycle bugfix (#3262)
- Rotary encoder ALT fix for large LED count (#3276)
- effect updates (2D Plasmaball), `blur()` speedup
- On/Off toggle from nodes view (may show unknow device type on older versions) (#3291)
- On/Off toggle from nodes view (may show unknown device type on older versions) (#3291)
- various fixes and improvements (ABL, crashes when changing presets with different segments)
#### Build 2306270
@@ -48,7 +53,7 @@
#### Build 2306210
- 0.14.0-b3 release
- respect global I2C in all usermods (no local initilaisation of I2C bus)
- respect global I2C in all usermods (no local initialization of I2C bus)
- Multi relay usermod compile-time enabled option (-D MULTI_RELAY_ENABLED=true|false)
#### Build 2306180
@@ -74,7 +79,7 @@
#### Build 2306020
- Support for segment sets (PR #3171)
- Reduce sound simulation modes to 2 to facilitiate segment sets
- Reduce sound simulation modes to 2 to facilitate segment sets
- Trigger button immediately on press if all configured presets are the same (PR #3226)
- Changes for allowing Alexa to change light color to White when auto-calculating from RGB (PR #3211)

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "wled",
"version": "0.14.0-b5",
"version": "0.14.0-b6",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "wled",
"version": "0.14.0-b5",
"version": "0.14.0-b6",
"description": "Tools for WLED project",
"main": "tools/cdata.js",
"directories": {

View File

@@ -1175,6 +1175,7 @@ class AudioReactive : public Usermod {
DEBUGSR_PRINTLN(F("AR: Analog Microphone (left channel only)."));
audioSource = new I2SAdcSource(SAMPLE_RATE, BLOCK_SIZE);
delay(100);
useBandPassFilter = true; // PDM bandpass filter seems to help for bad quality analog
if (audioSource) audioSource->initialize(audioPin);
break;
#endif
@@ -1408,7 +1409,7 @@ class AudioReactive : public Usermod {
xTaskCreateUniversal( // xTaskCreateUniversal also works on -S2 and -C3 with single core
FFTcode, // Function to implement the task
"FFT", // Name of the task
5000, // Stack size in words
3592, // Stack size in words // 3592 leaves 800-1024 bytes of task stack free
NULL, // Task input parameter
FFTTASK_PRIORITY, // Priority of the task
&FFT_Task // Task handle

View File

@@ -122,7 +122,7 @@ class AudioSource {
This function needs to take care of anything that needs to be done
before samples can be obtained from the microphone.
*/
virtual void initialize(int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) = 0;
virtual void initialize(int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) = 0;
/* Deinitialize
Release all resources and deactivate any functionality that is used
@@ -191,7 +191,8 @@ class I2SSource : public AudioSource {
};
}
virtual void initialize(int8_t i2swsPin = I2S_PIN_NO_CHANGE, int8_t i2ssdPin = I2S_PIN_NO_CHANGE, int8_t i2sckPin = I2S_PIN_NO_CHANGE, int8_t mclkPin = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) {
virtual void initialize(int8_t i2swsPin = I2S_PIN_NO_CHANGE, int8_t i2ssdPin = I2S_PIN_NO_CHANGE, int8_t i2sckPin = I2S_PIN_NO_CHANGE, int8_t mclkPin = I2S_PIN_NO_CHANGE) {
DEBUGSR_PRINTLN("I2SSource:: initialize().");
if (i2swsPin != I2S_PIN_NO_CHANGE && i2ssdPin != I2S_PIN_NO_CHANGE) {
if (!pinManager.allocatePin(i2swsPin, true, PinOwner::UM_Audioreactive) ||
!pinManager.allocatePin(i2ssdPin, false, PinOwner::UM_Audioreactive)) { // #206
@@ -412,6 +413,7 @@ public:
};
void initialize(int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t mclkPin) {
DEBUGSR_PRINTLN("ES7243:: initialize();");
if ((i2sckPin < 0) || (mclkPin < 0)) {
DEBUGSR_PRINTF("\nAR: invalid I2S pin: SCK=%d, MCLK=%d\n", i2sckPin, mclkPin);
return;
@@ -527,7 +529,7 @@ class ES8388Source : public I2SSource {
};
void initialize(int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t mclkPin) {
DEBUGSR_PRINTLN("ES8388Source:: initialize();");
if ((i2sckPin < 0) || (mclkPin < 0)) {
DEBUGSR_PRINTF("\nAR: invalid I2S pin: SCK=%d, MCLK=%d\n", i2sckPin, mclkPin);
return;
@@ -584,7 +586,8 @@ class I2SAdcSource : public I2SSource {
/* identify Audiosource type - I2S-ADC*/
AudioSourceType getType(void) {return(Type_I2SAdc);}
void initialize(int8_t audioPin, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) {
void initialize(int8_t audioPin, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) {
DEBUGSR_PRINTLN("I2SAdcSource:: initialize().");
_myADCchannel = 0x0F;
if(!pinManager.allocatePin(audioPin, false, PinOwner::UM_Audioreactive)) {
DEBUGSR_PRINTF("failed to allocate GPIO for audio analog input: %d\n", audioPin);
@@ -755,7 +758,8 @@ class SPH0654 : public I2SSource {
I2SSource(sampleRate, blockSize, sampleScale)
{}
void initialize(uint8_t i2swsPin, uint8_t i2ssdPin, uint8_t i2sckPin, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) {
void initialize(int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t = I2S_PIN_NO_CHANGE) {
DEBUGSR_PRINTLN("SPH0654:: initialize();");
I2SSource::initialize(i2swsPin, i2ssdPin, i2sckPin);
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3)
// these registers are only existing in "classic" ESP32

View File

@@ -2260,17 +2260,18 @@ uint16_t mode_meteor() {
byte* trail = SEGENV.data;
byte meteorSize= 1+ SEGLEN / 10;
const unsigned meteorSize= 1 + SEGLEN / 20; // 5%
uint16_t counter = strip.now * ((SEGMENT.speed >> 2) +8);
uint16_t in = counter * SEGLEN >> 16;
const int max = SEGMENT.palette==5 || !SEGMENT.check1 ? 240 : 255;
// fade all leds to colors[1] in LEDs one step
for (int i = 0; i < SEGLEN; i++) {
if (random8() <= 255 - SEGMENT.intensity)
{
byte meteorTrailDecay = 128 + random8(127);
if (random8() <= 255 - SEGMENT.intensity) {
byte meteorTrailDecay = 162 + random8(92);
trail[i] = scale8(trail[i], meteorTrailDecay);
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, false, 0, trail[i]));
uint32_t col = SEGMENT.check1 ? SEGMENT.color_from_palette(i, true, false, 0, trail[i]) : SEGMENT.color_from_palette(trail[i], false, true, 255);
SEGMENT.setPixelColor(i, col);
}
}
@@ -2280,13 +2281,14 @@ uint16_t mode_meteor() {
if (index >= SEGLEN) {
index -= SEGLEN;
}
trail[index] = 240;
SEGMENT.setPixelColor(index, SEGMENT.color_from_palette(index, true, false, 0, 255));
trail[index] = max;
uint32_t col = SEGMENT.check1 ? SEGMENT.color_from_palette(index, true, false, 0, trail[index]) : SEGMENT.color_from_palette(trail[index], false, true, 255);
SEGMENT.setPixelColor(index, col);
}
return FRAMETIME;
}
static const char _data_FX_MODE_METEOR[] PROGMEM = "Meteor@!,Trail length;!;!";
static const char _data_FX_MODE_METEOR[] PROGMEM = "Meteor@!,Trail,,,,Gradient;;!;1";
// smooth meteor effect
@@ -2298,18 +2300,17 @@ uint16_t mode_meteor_smooth() {
byte* trail = SEGENV.data;
byte meteorSize= 1+ SEGLEN / 10;
const unsigned meteorSize= 1+ SEGLEN / 20; // 5%
uint16_t in = map((SEGENV.step >> 6 & 0xFF), 0, 255, 0, SEGLEN -1);
const int max = SEGMENT.palette==5 || !SEGMENT.check1 ? 240 : 255;
// fade all leds to colors[1] in LEDs one step
for (int i = 0; i < SEGLEN; i++) {
if (trail[i] != 0 && random8() <= 255 - SEGMENT.intensity)
{
int change = 3 - random8(12); //change each time between -8 and +3
trail[i] += change;
if (trail[i] > 245) trail[i] = 0;
if (trail[i] > 240) trail[i] = 240;
SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, false, 0, trail[i]));
if (/*trail[i] != 0 &&*/ random8() <= 255 - SEGMENT.intensity) {
int change = trail[i] + 4 - random8(24); //change each time between -20 and +4
trail[i] = constrain(change, 0, max);
uint32_t col = SEGMENT.check1 ? SEGMENT.color_from_palette(i, true, false, 0, trail[i]) : SEGMENT.color_from_palette(trail[i], false, true, 255);
SEGMENT.setPixelColor(i, col);
}
}
@@ -2319,14 +2320,15 @@ uint16_t mode_meteor_smooth() {
if (index >= SEGLEN) {
index -= SEGLEN;
}
trail[index] = 240;
SEGMENT.setPixelColor(index, SEGMENT.color_from_palette(index, true, false, 0, 255));
trail[index] = max;
uint32_t col = SEGMENT.check1 ? SEGMENT.color_from_palette(index, true, false, 0, trail[index]) : SEGMENT.color_from_palette(trail[index], false, true, 255);
SEGMENT.setPixelColor(index, col);
}
SEGENV.step += SEGMENT.speed +1;
return FRAMETIME;
}
static const char _data_FX_MODE_METEOR_SMOOTH[] PROGMEM = "Meteor Smooth@!,Trail length;!;!";
static const char _data_FX_MODE_METEOR_SMOOTH[] PROGMEM = "Meteor Smooth@!,Trail,,,,Gradient;;!;1";
//Railway Crossing / Christmas Fairy lights
@@ -2400,9 +2402,10 @@ uint16_t ripple_base()
#ifndef WLED_DISABLE_2D
if (SEGMENT.is2D()) {
propI /= 2;
uint16_t cx = rippleorigin >> 8;
uint16_t cy = rippleorigin & 0xFF;
uint8_t mag = scale8(cubicwave8((propF>>2)), amp);
uint8_t mag = scale8(sin8((propF>>2)), amp);
if (propI > 0) SEGMENT.draw_circle(cx, cy, propI, color_blend(SEGMENT.getPixelColorXY(cx + propI, cy), col, mag));
} else
#endif
@@ -2418,7 +2421,7 @@ uint16_t ripple_base()
ripplestate += rippledecay;
ripples[i].state = (ripplestate > 254) ? 0 : ripplestate;
} else {//randomly create new wave
if (random16(IBN + 10000) <= SEGMENT.intensity) {
if (random16(IBN + 10000) <= (SEGMENT.intensity >> (SEGMENT.is2D()*3))) {
ripples[i].state = 1;
ripples[i].pos = SEGMENT.is2D() ? ((random8(SEGENV.virtualWidth())<<8) | (random8(SEGENV.virtualHeight()))) : random16(SEGLEN);
ripples[i].color = random8(); //color
@@ -2434,6 +2437,7 @@ uint16_t ripple_base()
uint16_t mode_ripple(void) {
if (SEGLEN == 1) return mode_static();
if (!SEGMENT.check2) SEGMENT.fill(SEGCOLOR(1));
else SEGMENT.fade_out(250);
return ripple_base();
}
static const char _data_FX_MODE_RIPPLE[] PROGMEM = "Ripple@!,Wave #,,,,,Overlay;,!;!;12";
@@ -5167,7 +5171,7 @@ static const char _data_FX_MODE_2DLISSAJOUS[] PROGMEM = "Lissajous@X frequency,F
///////////////////////
// 2D Matrix //
///////////////////////
uint16_t mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams. Adapted by Andrew Tuline & improved by merkisoft and ewowi.
uint16_t mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams. Adapted by Andrew Tuline & improved by merkisoft and ewowi, and softhack007.
if (!strip.isMatrix) return mode_static(); // not a 2D set-up
const uint16_t cols = SEGMENT.virtualWidth();
@@ -5175,6 +5179,8 @@ uint16_t mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams.
if (SEGENV.call == 0) {
SEGMENT.fill(BLACK);
SEGENV.aux0 = SEGENV.aux1 = UINT16_MAX;
SEGENV.step = 0;
}
uint8_t fade = map(SEGMENT.custom1, 0, 255, 50, 250); // equals trail size
@@ -5192,32 +5198,43 @@ uint16_t mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams.
if (strip.now - SEGENV.step >= speed) {
SEGENV.step = strip.now;
// find out what color value is returned by gPC for a "falling code" example pixel
// the color values returned may differ from the previously set values, due to
// - auto brightness limiter (dimming)
// - lossy color buffer (when not using global buffer)
// - color balance correction
// - segment opacity
CRGB oldSpawnColor = spawnColor;
if ((SEGENV.aux0 < cols) && (SEGENV.aux1 < rows)) { // we have a hint from last run
oldSpawnColor = SEGMENT.getPixelColorXY(SEGENV.aux0, SEGENV.aux1); // find color of previous spawns
SEGENV.aux1 ++; // our sample pixel will be one row down the next time
}
if ((oldSpawnColor == CRGB::Black) || (oldSpawnColor == trailColor)) oldSpawnColor = spawnColor; // reject "black", as it would mean that ALL pixels create trails
// move pixels one row down. Falling codes keep color and add trail pixels; all others pixels are faded
for (int row=rows-1; row>=0; row--) {
for (int col=0; col<cols; col++) {
CRGB pix = SEGMENT.getPixelColorXY(col, row);
if (pix == spawnColor) {
if (pix == oldSpawnColor) { // this comparison may still fail due to overlays changing pixels, or due to gaps (2d-gaps.json)
SEGMENT.setPixelColorXY(col, row, trailColor); // create trail
if (row < rows-1) SEGMENT.setPixelColorXY(col, row+1, spawnColor);
} else {
// fade other pixels
SEGMENT.setPixelColorXY(col, row, pix.nscale8(fade));
if (pix != CRGB::Black) SEGMENT.setPixelColorXY(col, row, pix.nscale8(fade)); // optimization: don't fade black pixels
}
}
}
// check for empty screen to ensure code spawn
bool emptyScreen = true;
for (int x=0; x<cols; x++) for (int y=0; y<rows; y++) {
if (SEGMENT.getPixelColorXY(x,y)) {
emptyScreen = false;
break;
}
}
bool emptyScreen = (SEGENV.aux1 >= rows); // empty screen means that the last falling code has moved out of screen area
// spawn new falling code
if (random8() < SEGMENT.intensity || emptyScreen) {
if (random8() <= SEGMENT.intensity || emptyScreen) {
uint8_t spawnX = random8(cols);
SEGMENT.setPixelColorXY(spawnX, 0, spawnColor);
// update hint for next run
SEGENV.aux0 = spawnX;
SEGENV.aux1 = 0;
}
} // if millis
@@ -5909,7 +5926,6 @@ uint16_t mode_2Dscrollingtext(void) {
char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'};
if (SEGMENT.name) for (size_t i=0,j=0; i<strlen(SEGMENT.name); i++) if (SEGMENT.name[i]>31 && SEGMENT.name[i]<128) text[j++] = SEGMENT.name[i];
const bool zero = strchr(text, '0') != nullptr;
const int numberOfLetters = strlen(text);
char sec[5];
int AmPmHour = hour(localTime);
@@ -5922,7 +5938,7 @@ uint16_t mode_2Dscrollingtext(void) {
sprintf_P(sec, PSTR(":%02d"), second(localTime));
}
if (!numberOfLetters) { // fallback if empty segment name: display date and time
if (!strlen(text)) { // fallback if empty segment name: display date and time
sprintf_P(text, PSTR("%s %d, %d %d:%02d%s"), monthShortStr(month(localTime)), day(localTime), year(localTime), AmPmHour, minute(localTime), sec);
} else {
if (!strncmp_P(text,PSTR("#DATE"),5)) sprintf_P(text, zero?PSTR("%02d.%02d.%04d"):PSTR("%d.%d.%d"), day(localTime), month(localTime), year(localTime));
@@ -5932,6 +5948,7 @@ uint16_t mode_2Dscrollingtext(void) {
else if (!strncmp_P(text,PSTR("#HHMM"),5)) sprintf_P(text, zero?PSTR("%02d:%02d") :PSTR("%d:%02d"), AmPmHour, minute(localTime));
}
const int numberOfLetters = strlen(text);
const unsigned long now = millis(); // reduce millis() calls
int width = (numberOfLetters * rotLW);
int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-rotLH)/2;
@@ -5969,12 +5986,12 @@ uint16_t mode_2Dscrollingtext(void) {
col1 = SEGCOLOR(0);
col2 = SEGCOLOR(2);
}
SEGMENT.drawCharacter(text[i], xoffset, yoffset, letterWidth, letterHeight, col1, col2, (SEGMENT.custom3+1)>>3);
SEGMENT.drawCharacter(text[i], xoffset, yoffset, letterWidth, letterHeight, col1, col2, map(SEGMENT.custom3, 0, 31, -2, 2));
}
return FRAMETIME;
}
static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Overlay,Reverse;!,!,Gradient;!;2;ix=128,c1=0,c3=0,rev=0,mi=0,rY=0,mY=0";
static const char _data_FX_MODE_2DSCROLLTEXT[] PROGMEM = "Scrolling Text@!,Y Offset,Trail,Font size,Rotate,Gradient,Overlay,Reverse;!,!,Gradient;!;2;ix=128,c1=0,rev=0,mi=0,rY=0,mY=0";
////////////////////////////

View File

@@ -629,9 +629,9 @@ typedef struct Segment {
void fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c);
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c);
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c) { drawLine(x0, y0, x1, y1, 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, uint32_t color, uint32_t col2 = 0, uint8_t rotate = 0);
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2 = 0, int8_t rotate = 0);
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, CRGB c2, uint8_t rotate = 0) { drawCharacter(chr, x, y, w, h, RGBW32(c.r,c.g,c.b,0), RGBW32(c2.r,c2.g,c2.b,0), rotate); } // automatic inline
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c, CRGB c2, int8_t rotate = 0) { drawCharacter(chr, x, y, w, h, RGBW32(c.r,c.g,c.b,0), RGBW32(c2.r,c2.g,c2.b,0), rotate); } // automatic inline
void wu_pixel(uint32_t x, uint32_t y, CRGB c);
void blur1d(fract8 blur_amount); // blur all rows in 1 dimension
void blur2d(fract8 blur_amount) { blur(blur_amount); }
@@ -661,8 +661,9 @@ typedef struct Segment {
void fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB c) {}
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) {}
void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c) {}
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, uint32_t = 0, int8_t = 0) {}
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color) {}
void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB c, CRGB c2, int8_t rotate = 0) {}
void wu_pixel(uint32_t x, uint32_t y, CRGB c) {}
#endif
} segment;

View File

@@ -571,7 +571,7 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3
// draws a raster font character on canvas
// only supports: 4x6=24, 5x8=40, 5x12=60, 6x8=48 and 7x9=63 fonts ATM
void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2, uint8_t rotate) {
void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2, int8_t rotate) {
if (!isActive()) return; // not active
if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported
chr -= 32; // align with font table entries
@@ -597,10 +597,11 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w,
for (int j = 0; j<w; j++) { // character width
int x0, y0;
switch (rotate) {
case 3: x0 = x + (h-1) - i; y0 = y + (w-1) - j; break;
case 2: x0 = x + j; y0 = y + (h-1) - i; break;
case 1: x0 = x + i; y0 = y + j; break;
default: x0 = x + (w-1) - j; y0 = y + i; break;
case -1: x0 = x + (h-1) - i; y0 = y + (w-1) - j; break; // -90 deg
case -2:
case 2: x0 = x + j; y0 = y + (h-1) - i; break; // 180 deg
case 1: x0 = x + i; y0 = y + j; break; // +90 deg
default: x0 = x + (w-1) - j; y0 = y + i; break; // no rotation
}
if (x0 < 0 || x0 >= cols || y0 < 0 || y0 >= rows) continue; // drawing off-screen
if (((bits>>(j+(8-w))) & 0x01)) { // bit set

View File

@@ -1248,7 +1248,7 @@ function updateSelectedPalette(s)
if (s > 1 && s < 6) {
cd[0].classList.remove('hide'); // * Color 1
if (s > 2) cd[1].classList.remove('hide'); // * Color 1 & 2
if (s == 5) cd[2].classList.remove('hide'); // all colors
if (s > 3) cd[2].classList.remove('hide'); // all colors
} else {
for (let i of cd) if (i.dataset.hide == '1') i.classList.add('hide');
}

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -210,7 +210,7 @@ void sendImprovInfoResponse() {
//Use serverDescription if it has been changed from the default "WLED", else mDNS name
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
char vString[20];
sprintf_P(vString, PSTR("0.14.0-b5/%i"), VERSION);
sprintf_P(vString, PSTR("0.14.0-b6/%i"), VERSION);
const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);

View File

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