Feature/nine additional alexa devices for presets (#2787)

* add 9 further alexa devices for calling presets 1-9

* use preset names from WLED for Alexa preset device names instead of hardcoded names

* update readme and version

* call alexaInit() at end of savePreset() to keep Alexa in sync with the preset IDs and names

* This reverts commit f8db06c7c5.

* change order to configured Alexa WLED name first, preset names afterwards

* fix status of devices when shown within Alexa, i.e. switching one preset on switches others off (except for alexaInvocationName)

* re-add getPresetName() after merge with master

* restore original readme for pull request

* restore original platformio.ini for pull request

* Logic simplification

* Pass string by reference

* Added number of presets check

* fix alexaInit() in case of alexaNumPresets==0

Co-authored-by: Christian Schwinne <dev.aircoookie@gmail.com>
This commit is contained in:
siggel 2022-10-25 23:42:26 +02:00 committed by GitHub
parent e1d7d9511f
commit 82af52a0bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 288 additions and 222 deletions

View File

@ -14,17 +14,25 @@ void onAlexaChange(EspalexaDevice* dev);
void alexaInit() void alexaInit()
{ {
if (alexaEnabled && WLED_CONNECTED) if (!alexaEnabled || !WLED_CONNECTED) return;
{
if (espalexaDevice == nullptr) //only init once espalexa.removeAllDevices();
// the original configured device for on/off or macros (added first, i.e. index 0)
espalexaDevice = new EspalexaDevice(alexaInvocationName, onAlexaChange, EspalexaDeviceType::extendedcolor);
espalexa.addDevice(espalexaDevice);
// up to 9 devices (added second, third, ... i.e. index 1 to 9) serve for switching on up to nine presets (preset IDs 1 to 9 in WLED),
// names are identical as the preset names, switching off can be done by switching off any of them
if (alexaNumPresets) {
String name = "";
for (byte presetIndex = 1; presetIndex <= alexaNumPresets; presetIndex++)
{ {
espalexaDevice = new EspalexaDevice(alexaInvocationName, onAlexaChange, EspalexaDeviceType::extendedcolor); if (!getPresetName(presetIndex, name)) break; // no more presets
espalexa.addDevice(espalexaDevice); EspalexaDevice* dev = new EspalexaDevice(name.c_str(), onAlexaChange, EspalexaDeviceType::extendedcolor);
espalexa.begin(&server); espalexa.addDevice(dev);
} else {
espalexaDevice->setName(alexaInvocationName);
} }
} }
espalexa.begin(&server);
} }
void handleAlexa() void handleAlexa()
@ -35,20 +43,34 @@ void handleAlexa()
void onAlexaChange(EspalexaDevice* dev) void onAlexaChange(EspalexaDevice* dev)
{ {
EspalexaDeviceProperty m = espalexaDevice->getLastChangedProperty(); EspalexaDeviceProperty m = dev->getLastChangedProperty();
if (m == EspalexaDeviceProperty::on) if (m == EspalexaDeviceProperty::on)
{ {
if (!macroAlexaOn) if (dev->getId() == 0) // Device 0 is for on/off or macros
{ {
if (bri == 0) if (!macroAlexaOn)
{ {
bri = briLast; if (bri == 0)
stateUpdated(CALL_MODE_ALEXA); {
bri = briLast;
stateUpdated(CALL_MODE_ALEXA);
}
} else
{
applyPreset(macroAlexaOn, CALL_MODE_ALEXA);
if (bri == 0) dev->setValue(briLast); //stop Alexa from complaining if macroAlexaOn does not actually turn on
} }
} else { } else // switch-on behavior for preset devices
applyPreset(macroAlexaOn, CALL_MODE_ALEXA); {
if (bri == 0) espalexaDevice->setValue(briLast); //stop Alexa from complaining if macroAlexaOn does not actually turn on // turn off other preset devices
for (byte i = 1; i < espalexa.getDeviceCount(); i++)
{
if (i == dev->getId()) continue;
espalexa.getDevice(i)->setValue(0); // turn off other presets
}
applyPreset(dev->getId(), CALL_MODE_ALEXA); // in alexaInit() preset 1 device was added second (index 1), preset 2 third (index 2) etc.
} }
} else if (m == EspalexaDeviceProperty::off) } else if (m == EspalexaDeviceProperty::off)
{ {
@ -60,20 +82,25 @@ void onAlexaChange(EspalexaDevice* dev)
bri = 0; bri = 0;
stateUpdated(CALL_MODE_ALEXA); stateUpdated(CALL_MODE_ALEXA);
} }
} else { } else
{
applyPreset(macroAlexaOff, CALL_MODE_ALEXA); applyPreset(macroAlexaOff, CALL_MODE_ALEXA);
if (bri != 0) espalexaDevice->setValue(0); //stop Alexa from complaining if macroAlexaOff does not actually turn off // below for loop stops Alexa from complaining if macroAlexaOff does not actually turn off
}
for (byte i = 0; i < espalexa.getDeviceCount(); i++)
{
espalexa.getDevice(i)->setValue(0);
} }
} else if (m == EspalexaDeviceProperty::bri) } else if (m == EspalexaDeviceProperty::bri)
{ {
bri = espalexaDevice->getValue(); bri = dev->getValue();
stateUpdated(CALL_MODE_ALEXA); stateUpdated(CALL_MODE_ALEXA);
} else //color } else //color
{ {
if (espalexaDevice->getColorMode() == EspalexaColorMode::ct) //shade of white if (dev->getColorMode() == EspalexaColorMode::ct) //shade of white
{ {
byte rgbw[4]; byte rgbw[4];
uint16_t ct = espalexaDevice->getCt(); uint16_t ct = dev->getCt();
if (!ct) return; if (!ct) return;
uint16_t k = 1000000 / ct; //mireds to kelvin uint16_t k = 1000000 / ct; //mireds to kelvin
@ -94,7 +121,7 @@ void onAlexaChange(EspalexaDevice* dev)
} }
strip.setColor(0, RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3])); strip.setColor(0, RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]));
} else { } else {
uint32_t color = espalexaDevice->getRGB(); uint32_t color = dev->getRGB();
strip.setColor(0, color); strip.setColor(0, color);
} }
stateUpdated(CALL_MODE_ALEXA); stateUpdated(CALL_MODE_ALEXA);

View File

@ -392,6 +392,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(macroAlexaOn, interfaces["va"]["macros"][0]); CJSON(macroAlexaOn, interfaces["va"]["macros"][0]);
CJSON(macroAlexaOff, interfaces["va"]["macros"][1]); CJSON(macroAlexaOff, interfaces["va"]["macros"][1]);
CJSON(alexaNumPresets, interfaces["va"]["p"]);
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
const char* apikey = interfaces["blynk"][F("token")] | "Hidden"; const char* apikey = interfaces["blynk"][F("token")] | "Hidden";
tdd = strnlen(apikey, 36); tdd = strnlen(apikey, 36);
@ -849,6 +851,8 @@ void serializeConfig() {
if_va_macros.add(macroAlexaOn); if_va_macros.add(macroAlexaOn);
if_va_macros.add(macroAlexaOff); if_va_macros.add(macroAlexaOff);
if_va["p"] = alexaNumPresets;
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
JsonObject if_blynk = interfaces.createNestedObject("blynk"); JsonObject if_blynk = interfaces.createNestedObject("blynk");
if_blynk[F("token")] = strlen(blynkApiKey) ? "Hidden":""; if_blynk[F("token")] = strlen(blynkApiKey) ? "Hidden":"";

View File

@ -165,7 +165,8 @@ Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required> Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required>
<h3>Alexa Voice Assistant</h3> <h3>Alexa Voice Assistant</h3>
Emulate Alexa device: <input type="checkbox" name="AL"><br> Emulate Alexa device: <input type="checkbox" name="AL"><br>
Alexa invocation name: <input type="text" name="AI" maxlength="32"> Alexa invocation name: <input type="text" name="AI" maxlength="32"><br>
Also emulate devices to call the first <input name="AP" type="number" class="s" min="0" max="9" required> presets
<h3>Blynk</h3> <h3>Blynk</h3>
<b>Blynk, MQTT and Hue sync all connect to external hosts!<br> <b>Blynk, MQTT and Hue sync all connect to external hosts!<br>
This may impact the responsiveness of the ESP8266.</b><br> This may impact the responsiveness of the ESP8266.</b><br>

View File

@ -201,6 +201,7 @@ inline bool applyTemporaryPreset() {return applyPreset(255);};
void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject()); void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject());
inline void saveTemporaryPreset() {savePreset(255);}; inline void saveTemporaryPreset() {savePreset(255);};
void deletePreset(byte index); void deletePreset(byte index);
bool getPresetName(byte index, String& name);
//set.cpp //set.cpp
bool isAsterisksOnly(const char* str, byte maxLen); bool isAsterisksOnly(const char* str, byte maxLen);

View File

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

View File

@ -75,6 +75,22 @@ static void doSaveState() {
playlistSave = false; playlistSave = false;
} }
bool getPresetName(byte index, String& name)
{
if (!requestJSONBufferLock(9)) return false;
bool presetExists = false;
if (readObjectFromFileUsingId("/presets.json", index, &doc))
{
JsonObject fdo = doc.as<JsonObject>();
if (fdo["n"]) {
name = (const char*)(fdo["n"]);
presetExists = true;
}
}
releaseJSONBufferLock();
return presetExists;
}
bool applyPreset(byte index, byte callMode) bool applyPreset(byte index, byte callMode)
{ {
DEBUG_PRINT(F("Request to apply preset: ")); DEBUG_PRINT(F("Request to apply preset: "));

View File

@ -277,6 +277,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
alexaEnabled = request->hasArg(F("AL")); alexaEnabled = request->hasArg(F("AL"));
strlcpy(alexaInvocationName, request->arg(F("AI")).c_str(), 33); strlcpy(alexaInvocationName, request->arg(F("AI")).c_str(), 33);
t = request->arg(F("AP")).toInt();
if (t >= 0 && t <= 9) alexaNumPresets = t;
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
strlcpy(blynkHost, request->arg("BH").c_str(), 33); strlcpy(blynkHost, request->arg("BH").c_str(), 33);

View File

@ -359,6 +359,11 @@ public:
return false; return false;
} }
// get device count, function only in WLED version of Espalexa
uint8_t getDeviceCount() {
return currentDeviceCount;
}
//service loop //service loop
void loop() { void loop() {
#ifndef ESPALEXA_ASYNC #ifndef ESPALEXA_ASYNC
@ -393,6 +398,13 @@ public:
} }
} }
// Function only in WLED version of Espalexa, does not actually release memory for names
void removeAllDevices()
{
currentDeviceCount=0;
return;
}
// returns device index or 0 on failure // returns device index or 0 on failure
uint8_t addDevice(EspalexaDevice* d) uint8_t addDevice(EspalexaDevice* d)
{ {

View File

@ -113,7 +113,7 @@
#ifndef WLED_DISABLE_ALEXA #ifndef WLED_DISABLE_ALEXA
#define ESPALEXA_ASYNC #define ESPALEXA_ASYNC
#define ESPALEXA_NO_SUBPAGE #define ESPALEXA_NO_SUBPAGE
#define ESPALEXA_MAXDEVICES 1 #define ESPALEXA_MAXDEVICES 10
// #define ESPALEXA_DEBUG // #define ESPALEXA_DEBUG
#include "src/dependencies/espalexa/Espalexa.h" #include "src/dependencies/espalexa/Espalexa.h"
#endif #endif
@ -358,6 +358,7 @@ WLED_GLOBAL uint8_t udpNumRetries _INIT(0); // Number of t
WLED_GLOBAL bool alexaEnabled _INIT(false); // enable device discovery by Amazon Echo WLED_GLOBAL bool alexaEnabled _INIT(false); // enable device discovery by Amazon Echo
WLED_GLOBAL char alexaInvocationName[33] _INIT("Light"); // speech control name of device. Choose something voice-to-text can understand WLED_GLOBAL char alexaInvocationName[33] _INIT("Light"); // speech control name of device. Choose something voice-to-text can understand
WLED_GLOBAL byte alexaNumPresets _INIT(0); // number of presets to expose to Alexa, starting from preset 1, up to 9
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
WLED_GLOBAL char blynkApiKey[36] _INIT(""); // Auth token for Blynk server. If empty, no connection will be made WLED_GLOBAL char blynkApiKey[36] _INIT(""); // Auth token for Blynk server. If empty, no connection will be made

View File

@ -509,6 +509,7 @@ void getSettingsJS(byte subPage, char* dest)
sappend('c',SET_F("AL"),alexaEnabled); sappend('c',SET_F("AL"),alexaEnabled);
sappends('s',SET_F("AI"),alexaInvocationName); sappends('s',SET_F("AI"),alexaInvocationName);
sappend('c',SET_F("SA"),notifyAlexa); sappend('c',SET_F("SA"),notifyAlexa);
sappend('v',SET_F("AP"),alexaNumPresets);
sappends('s',SET_F("BK"),(char*)((blynkEnabled)?SET_F("Hidden"):"")); sappends('s',SET_F("BK"),(char*)((blynkEnabled)?SET_F("Hidden"):""));
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
sappends('s',SET_F("BH"),blynkHost); sappends('s',SET_F("BH"),blynkHost);