From 7143e9cd9e2073351cfd239e242e2132a36eec0b Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Thu, 6 Jun 2024 05:27:06 +1000 Subject: [PATCH 001/151] [config] Allow file: scheme for git external components (#6844) --- esphome/config_validation.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 5fc72921e1..7259e3c062 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -1949,13 +1949,13 @@ def url(value): except ValueError as e: raise Invalid("Not a valid URL") from e - if not parsed.scheme or not parsed.netloc: - raise Invalid("Expected a URL scheme and host") - return parsed.geturl() + if parsed.scheme and parsed.netloc or parsed.scheme == "file": + return parsed.geturl() + raise Invalid("Expected a file scheme or a URL scheme with host") def git_ref(value): - if re.match(r"[a-zA-Z0-9\-_.\./]+", value) is None: + if re.match(r"[a-zA-Z0-9_./-]+", value) is None: raise Invalid("Not a valid git ref") return value From 8ef4aaa70eac95656f2742b7e57d1010cfb235b5 Mon Sep 17 00:00:00 2001 From: Olivier ARCHER Date: Thu, 6 Jun 2024 04:35:28 +0200 Subject: [PATCH 002/151] [ota] http_request update platform (#5586) Co-authored-by: Keith Burzinski Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> --- CODEOWNERS | 1 + .../components/http_request/ota/__init__.py | 189 +++++++++++ .../components/http_request/ota/automation.h | 42 +++ .../http_request/ota/ota_http_request.cpp | 293 ++++++++++++++++++ .../http_request/ota/ota_http_request.h | 72 +++++ .../ota/ota_http_request_arduino.cpp | 134 ++++++++ .../ota/ota_http_request_arduino.h | 42 +++ .../http_request/ota/ota_http_request_idf.cpp | 86 +++++ .../http_request/ota/ota_http_request_idf.h | 24 ++ .../components/http_request/ota/watchdog.cpp | 71 +++++ .../components/http_request/ota/watchdog.h | 27 ++ esphome/core/defines.h | 1 + .../{common.yaml => common_http_request.yaml} | 4 - tests/components/http_request/common_ota.yaml | 36 +++ .../http_request/test-nossl.esp8266.yaml | 38 +++ .../http_request/test.esp32-c3-idf.yaml | 4 + .../http_request/test.esp32-c3.yaml | 7 +- .../http_request/test.esp32-idf.yaml | 4 + tests/components/http_request/test.esp32.yaml | 7 +- .../components/http_request/test.esp8266.yaml | 7 +- .../components/http_request/test.rp2040.yaml | 4 + 21 files changed, 1083 insertions(+), 10 deletions(-) create mode 100644 esphome/components/http_request/ota/__init__.py create mode 100644 esphome/components/http_request/ota/automation.h create mode 100644 esphome/components/http_request/ota/ota_http_request.cpp create mode 100644 esphome/components/http_request/ota/ota_http_request.h create mode 100644 esphome/components/http_request/ota/ota_http_request_arduino.cpp create mode 100644 esphome/components/http_request/ota/ota_http_request_arduino.h create mode 100644 esphome/components/http_request/ota/ota_http_request_idf.cpp create mode 100644 esphome/components/http_request/ota/ota_http_request_idf.h create mode 100644 esphome/components/http_request/ota/watchdog.cpp create mode 100644 esphome/components/http_request/ota/watchdog.h rename tests/components/http_request/{common.yaml => common_http_request.yaml} (95%) create mode 100644 tests/components/http_request/common_ota.yaml create mode 100644 tests/components/http_request/test-nossl.esp8266.yaml create mode 100644 tests/components/http_request/test.esp32-c3-idf.yaml create mode 100644 tests/components/http_request/test.esp32-idf.yaml create mode 100644 tests/components/http_request/test.rp2040.yaml diff --git a/CODEOWNERS b/CODEOWNERS index 82f61c3b80..90574ca9ba 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -171,6 +171,7 @@ esphome/components/host/* @clydebarrow @esphome/core esphome/components/host/time/* @clydebarrow esphome/components/hrxl_maxsonar_wr/* @netmikey esphome/components/hte501/* @Stock-M +esphome/components/http_request/ota/* @oarcher esphome/components/htu31d/* @betterengineering esphome/components/hydreon_rgxx/* @functionpointer esphome/components/hyt271/* @Philippe12 diff --git a/esphome/components/http_request/ota/__init__.py b/esphome/components/http_request/ota/__init__.py new file mode 100644 index 0000000000..6a56fac83a --- /dev/null +++ b/esphome/components/http_request/ota/__init__.py @@ -0,0 +1,189 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome import automation +from esphome.const import ( + CONF_ESP8266_DISABLE_SSL_SUPPORT, + CONF_ID, + CONF_PASSWORD, + CONF_TIMEOUT, + CONF_URL, + CONF_USERNAME, +) +from esphome.components import esp32 +from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent +from esphome.core import CORE, coroutine_with_priority +from .. import http_request_ns + +CODEOWNERS = ["@oarcher"] + +AUTO_LOAD = ["md5"] +DEPENDENCIES = ["network"] + +CONF_MD5 = "md5" +CONF_MD5_URL = "md5_url" +CONF_VERIFY_SSL = "verify_ssl" +CONF_WATCHDOG_TIMEOUT = "watchdog_timeout" + +OtaHttpRequestComponent = http_request_ns.class_( + "OtaHttpRequestComponent", OTAComponent +) +OtaHttpRequestComponentArduino = http_request_ns.class_( + "OtaHttpRequestComponentArduino", OtaHttpRequestComponent +) +OtaHttpRequestComponentIDF = http_request_ns.class_( + "OtaHttpRequestComponentIDF", OtaHttpRequestComponent +) +OtaHttpRequestComponentFlashAction = http_request_ns.class_( + "OtaHttpRequestComponentFlashAction", automation.Action +) + + +def validate_ssl_verification(config): + error_message = "" + + if CORE.is_esp32: + if not CORE.using_esp_idf and config[CONF_VERIFY_SSL]: + error_message = "ESPHome supports certificate verification only via ESP-IDF" + + if CORE.is_rp2040 and config[CONF_VERIFY_SSL]: + error_message = "ESPHome does not support certificate verification in Arduino" + + if ( + CORE.is_esp8266 + and not config[CONF_ESP8266_DISABLE_SSL_SUPPORT] + and config[CONF_VERIFY_SSL] + ): + error_message = "ESPHome does not support certificate verification in Arduino" + + if len(error_message) > 0: + raise cv.Invalid( + f"{error_message}. Set '{CONF_VERIFY_SSL}: false' to skip certificate validation and allow less secure HTTPS connections." + ) + + return config + + +def _declare_request_class(value): + if CORE.using_esp_idf: + return cv.declare_id(OtaHttpRequestComponentIDF)(value) + + if CORE.is_esp8266 or CORE.is_esp32 or CORE.is_rp2040: + return cv.declare_id(OtaHttpRequestComponentArduino)(value) + return NotImplementedError + + +CONFIG_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(): _declare_request_class, + cv.SplitDefault(CONF_ESP8266_DISABLE_SSL_SUPPORT, esp8266=False): cv.All( + cv.only_on_esp8266, cv.boolean + ), + cv.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + cv.Optional( + CONF_TIMEOUT, default="5min" + ): cv.positive_time_period_milliseconds, + cv.Optional(CONF_WATCHDOG_TIMEOUT): cv.All( + cv.Any(cv.only_on_esp32, cv.only_on_rp2040), + cv.positive_not_null_time_period, + cv.positive_time_period_milliseconds, + ), + } + ) + .extend(BASE_OTA_SCHEMA) + .extend(cv.COMPONENT_SCHEMA), + cv.require_framework_version( + esp8266_arduino=cv.Version(2, 5, 1), + esp32_arduino=cv.Version(0, 0, 0), + esp_idf=cv.Version(0, 0, 0), + rp2040_arduino=cv.Version(0, 0, 0), + ), + validate_ssl_verification, +) + + +@coroutine_with_priority(52.0) +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await ota_to_code(var, config) + + cg.add(var.set_timeout(config[CONF_TIMEOUT])) + + if timeout_ms := config.get(CONF_WATCHDOG_TIMEOUT): + cg.add_define( + "USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT", + timeout_ms, + ) + + if CORE.is_esp8266 and not config[CONF_ESP8266_DISABLE_SSL_SUPPORT]: + cg.add_define("USE_HTTP_REQUEST_ESP8266_HTTPS") + + if CORE.is_esp32: + if CORE.using_esp_idf: + esp32.add_idf_sdkconfig_option( + "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE", + config.get(CONF_VERIFY_SSL), + ) + esp32.add_idf_sdkconfig_option( + "CONFIG_ESP_TLS_INSECURE", + not config.get(CONF_VERIFY_SSL), + ) + esp32.add_idf_sdkconfig_option( + "CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY", + not config.get(CONF_VERIFY_SSL), + ) + else: + cg.add_library("WiFiClientSecure", None) + cg.add_library("HTTPClient", None) + if CORE.is_esp8266: + cg.add_library("ESP8266HTTPClient", None) + if CORE.is_rp2040 and CORE.using_arduino: + cg.add_library("HTTPClient", None) + + await cg.register_component(var, config) + + +OTA_HTTP_REQUEST_FLASH_ACTION_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(): cv.use_id(OtaHttpRequestComponent), + cv.Optional(CONF_MD5_URL): cv.templatable(cv.url), + cv.Optional(CONF_MD5): cv.templatable(cv.string), + cv.Optional(CONF_PASSWORD): cv.templatable(cv.string), + cv.Optional(CONF_USERNAME): cv.templatable(cv.string), + cv.Required(CONF_URL): cv.templatable(cv.url), + } + ), + cv.has_exactly_one_key(CONF_MD5, CONF_MD5_URL), +) + + +@automation.register_action( + "ota_http_request.flash", + OtaHttpRequestComponentFlashAction, + OTA_HTTP_REQUEST_FLASH_ACTION_SCHEMA, +) +async def ota_http_request_action_to_code(config, action_id, template_arg, args): + paren = await cg.get_variable(config[CONF_ID]) + var = cg.new_Pvariable(action_id, template_arg, paren) + + if md5_url := config.get(CONF_MD5_URL): + template_ = await cg.templatable(md5_url, args, cg.std_string) + cg.add(var.set_md5_url(template_)) + + if md5_str := config.get(CONF_MD5): + template_ = await cg.templatable(md5_str, args, cg.std_string) + cg.add(var.set_md5(template_)) + + if password_str := config.get(CONF_PASSWORD): + template_ = await cg.templatable(password_str, args, cg.std_string) + cg.add(var.set_password(template_)) + + if username_str := config.get(CONF_USERNAME): + template_ = await cg.templatable(username_str, args, cg.std_string) + cg.add(var.set_username(template_)) + + template_ = await cg.templatable(config[CONF_URL], args, cg.std_string) + cg.add(var.set_url(template_)) + + return var diff --git a/esphome/components/http_request/ota/automation.h b/esphome/components/http_request/ota/automation.h new file mode 100644 index 0000000000..d4c21f1c72 --- /dev/null +++ b/esphome/components/http_request/ota/automation.h @@ -0,0 +1,42 @@ +#pragma once +#include "ota_http_request.h" + +#include "esphome/core/automation.h" + +namespace esphome { +namespace http_request { + +template class OtaHttpRequestComponentFlashAction : public Action { + public: + OtaHttpRequestComponentFlashAction(OtaHttpRequestComponent *parent) : parent_(parent) {} + TEMPLATABLE_VALUE(std::string, md5_url) + TEMPLATABLE_VALUE(std::string, md5) + TEMPLATABLE_VALUE(std::string, password) + TEMPLATABLE_VALUE(std::string, url) + TEMPLATABLE_VALUE(std::string, username) + + void play(Ts... x) override { + if (this->md5_url_.has_value()) { + this->parent_->set_md5_url(this->md5_url_.value(x...)); + } + if (this->md5_.has_value()) { + this->parent_->set_md5(this->md5_.value(x...)); + } + if (this->password_.has_value()) { + this->parent_->set_password(this->password_.value(x...)); + } + if (this->username_.has_value()) { + this->parent_->set_username(this->username_.value(x...)); + } + this->parent_->set_url(this->url_.value(x...)); + + this->parent_->flash(); + // Normally never reached due to reboot + } + + protected: + OtaHttpRequestComponent *parent_; +}; + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp new file mode 100644 index 0000000000..cf0816c858 --- /dev/null +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -0,0 +1,293 @@ +#include "ota_http_request.h" +#include "watchdog.h" + +#include "esphome/core/application.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" + +#include "esphome/components/md5/md5.h" +#include "esphome/components/ota/ota_backend_arduino_esp32.h" +#include "esphome/components/ota/ota_backend_arduino_esp8266.h" +#include "esphome/components/ota/ota_backend_arduino_rp2040.h" +#include "esphome/components/ota/ota_backend_esp_idf.h" +#include "esphome/components/ota/ota_backend.h" + +namespace esphome { +namespace http_request { + +void OtaHttpRequestComponent::setup() { +#ifdef USE_OTA_STATE_CALLBACK + ota::register_ota_platform(this); +#endif +} + +void OtaHttpRequestComponent::dump_config() { + ESP_LOGCONFIG(TAG, "Over-The-Air updates via HTTP request:"); + ESP_LOGCONFIG(TAG, " Timeout: %llus", this->timeout_ / 1000); +#ifdef USE_ESP8266 +#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS + ESP_LOGCONFIG(TAG, " ESP8266 SSL support: No"); +#else + ESP_LOGCONFIG(TAG, " ESP8266 SSL support: Yes"); +#endif +#endif +#ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE + ESP_LOGCONFIG(TAG, " TLS server verification: Yes"); +#else + ESP_LOGCONFIG(TAG, " TLS server verification: No"); +#endif +#ifdef USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT + ESP_LOGCONFIG(TAG, " Watchdog timeout: %ds", USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT / 1000); +#endif +}; + +void OtaHttpRequestComponent::set_md5_url(const std::string &url) { + if (!this->validate_url_(url)) { + this->md5_url_.clear(); // URL was not valid; prevent flashing until it is + return; + } + this->md5_url_ = url; + this->md5_expected_.clear(); // to be retrieved later +} + +void OtaHttpRequestComponent::set_url(const std::string &url) { + if (!this->validate_url_(url)) { + this->url_.clear(); // URL was not valid; prevent flashing until it is + return; + } + this->url_ = url; +} + +bool OtaHttpRequestComponent::check_status() { + // status can be -1, or HTTP status code + if (this->status_ < 100) { + ESP_LOGE(TAG, "HTTP server did not respond (error %d)", this->status_); + return false; + } + if (this->status_ >= 310) { + ESP_LOGE(TAG, "HTTP error %d", this->status_); + return false; + } + ESP_LOGV(TAG, "HTTP status %d", this->status_); + return true; +} + +void OtaHttpRequestComponent::flash() { + if (this->url_.empty()) { + ESP_LOGE(TAG, "URL not set; cannot start update"); + return; + } + + ESP_LOGI(TAG, "Starting update..."); +#ifdef USE_OTA_STATE_CALLBACK + this->state_callback_.call(ota::OTA_STARTED, 0.0f, 0); +#endif + + auto ota_status = this->do_ota_(); + + switch (ota_status) { + case ota::OTA_RESPONSE_OK: +#ifdef USE_OTA_STATE_CALLBACK + this->state_callback_.call(ota::OTA_COMPLETED, 100.0f, ota_status); +#endif + delay(10); + App.safe_reboot(); + break; + + default: +#ifdef USE_OTA_STATE_CALLBACK + this->state_callback_.call(ota::OTA_ERROR, 0.0f, ota_status); +#endif + this->md5_computed_.clear(); // will be reset at next attempt + this->md5_expected_.clear(); // will be reset at next attempt + break; + } +} + +void OtaHttpRequestComponent::cleanup_(std::unique_ptr backend) { + if (this->update_started_) { + ESP_LOGV(TAG, "Aborting OTA backend"); + backend->abort(); + } + ESP_LOGV(TAG, "Aborting HTTP connection"); + this->http_end(); +}; + +uint8_t OtaHttpRequestComponent::do_ota_() { + uint8_t buf[this->http_recv_buffer_ + 1]; + uint32_t last_progress = 0; + uint32_t update_start_time = millis(); + md5::MD5Digest md5_receive; + std::unique_ptr md5_receive_str(new char[33]); + + if (this->md5_expected_.empty() && !this->http_get_md5_()) { + return OTA_MD5_INVALID; + } + + ESP_LOGD(TAG, "MD5 expected: %s", this->md5_expected_.c_str()); + + auto url_with_auth = this->get_url_with_auth_(this->url_); + if (url_with_auth.empty()) { + return OTA_BAD_URL; + } + ESP_LOGVV(TAG, "url_with_auth: %s", url_with_auth.c_str()); + ESP_LOGI(TAG, "Connecting to: %s", this->url_.c_str()); + this->http_init(url_with_auth); + if (!this->check_status()) { + this->http_end(); + return OTA_CONNECTION_ERROR; + } + + // we will compute MD5 on the fly for verification -- Arduino OTA seems to ignore it + md5_receive.init(); + ESP_LOGV(TAG, "MD5Digest initialized"); + + ESP_LOGV(TAG, "OTA backend begin"); + auto backend = ota::make_ota_backend(); + auto error_code = backend->begin(this->body_length_); + if (error_code != ota::OTA_RESPONSE_OK) { + ESP_LOGW(TAG, "backend->begin error: %d", error_code); + this->cleanup_(std::move(backend)); + return error_code; + } + + this->bytes_read_ = 0; + while (this->bytes_read_ < this->body_length_) { + // read a maximum of chunk_size bytes into buf. (real read size returned) + int bufsize = this->http_read(buf, this->http_recv_buffer_); + ESP_LOGVV(TAG, "bytes_read_ = %u, body_length_ = %u, bufsize = %i", this->bytes_read_, this->body_length_, bufsize); + + // feed watchdog and give other tasks a chance to run + App.feed_wdt(); + yield(); + + if (bufsize < 0) { + ESP_LOGE(TAG, "Stream closed"); + this->cleanup_(std::move(backend)); + return OTA_CONNECTION_ERROR; + } else if (bufsize > 0 && bufsize <= this->http_recv_buffer_) { + // add read bytes to MD5 + md5_receive.add(buf, bufsize); + + // write bytes to OTA backend + this->update_started_ = true; + error_code = backend->write(buf, bufsize); + if (error_code != ota::OTA_RESPONSE_OK) { + // error code explanation available at + // https://github.com/esphome/esphome/blob/dev/esphome/components/ota/ota_backend.h + ESP_LOGE(TAG, "Error code (%02X) writing binary data to flash at offset %d and size %d", error_code, + this->bytes_read_ - bufsize, this->body_length_); + this->cleanup_(std::move(backend)); + return error_code; + } + } + + uint32_t now = millis(); + if ((now - last_progress > 1000) or (this->bytes_read_ == this->body_length_)) { + last_progress = now; + float percentage = this->bytes_read_ * 100.0f / this->body_length_; + ESP_LOGD(TAG, "Progress: %0.1f%%", percentage); +#ifdef USE_OTA_STATE_CALLBACK + this->state_callback_.call(ota::OTA_IN_PROGRESS, percentage, 0); +#endif + } + } // while + + ESP_LOGI(TAG, "Done in %.0f seconds", float(millis() - update_start_time) / 1000); + + // verify MD5 is as expected and act accordingly + md5_receive.calculate(); + md5_receive.get_hex(md5_receive_str.get()); + this->md5_computed_ = md5_receive_str.get(); + if (strncmp(this->md5_computed_.c_str(), this->md5_expected_.c_str(), MD5_SIZE) != 0) { + ESP_LOGE(TAG, "MD5 computed: %s - Aborting due to MD5 mismatch", this->md5_computed_.c_str()); + this->cleanup_(std::move(backend)); + return ota::OTA_RESPONSE_ERROR_MD5_MISMATCH; + } else { + backend->set_update_md5(md5_receive_str.get()); + } + + this->http_end(); + + // feed watchdog and give other tasks a chance to run + App.feed_wdt(); + yield(); + delay(100); // NOLINT + + error_code = backend->end(); + if (error_code != ota::OTA_RESPONSE_OK) { + ESP_LOGW(TAG, "Error ending update! error_code: %d", error_code); + this->cleanup_(std::move(backend)); + return error_code; + } + + ESP_LOGI(TAG, "Update complete"); + return ota::OTA_RESPONSE_OK; +} + +std::string OtaHttpRequestComponent::get_url_with_auth_(const std::string &url) { + if (this->username_.empty() || this->password_.empty()) { + return url; + } + + auto start_char = url.find("://"); + if ((start_char == std::string::npos) || (start_char < 4)) { + ESP_LOGE(TAG, "Incorrect URL prefix"); + return {}; + } + + ESP_LOGD(TAG, "Using basic HTTP authentication"); + + start_char += 3; // skip '://' characters + auto url_with_auth = + url.substr(0, start_char) + this->username_ + ":" + this->password_ + "@" + url.substr(start_char); + return url_with_auth; +} + +bool OtaHttpRequestComponent::http_get_md5_() { + if (this->md5_url_.empty()) { + return false; + } + + auto url_with_auth = this->get_url_with_auth_(this->md5_url_); + if (url_with_auth.empty()) { + return false; + } + + ESP_LOGVV(TAG, "url_with_auth: %s", url_with_auth.c_str()); + ESP_LOGI(TAG, "Connecting to: %s", this->md5_url_.c_str()); + this->http_init(url_with_auth); + if (!this->check_status()) { + this->http_end(); + return false; + } + int length = this->body_length_; + if (length < 0) { + this->http_end(); + return false; + } + if (length < MD5_SIZE) { + ESP_LOGE(TAG, "MD5 file must be %u bytes; %u bytes reported by HTTP server. Aborting", MD5_SIZE, + this->body_length_); + this->http_end(); + return false; + } + + this->bytes_read_ = 0; + this->md5_expected_.resize(MD5_SIZE); + auto read_len = this->http_read((uint8_t *) this->md5_expected_.data(), MD5_SIZE); + this->http_end(); + + return read_len == MD5_SIZE; +} + +bool OtaHttpRequestComponent::validate_url_(const std::string &url) { + if ((url.length() < 8) || (url.find("http") != 0) || (url.find("://") == std::string::npos)) { + ESP_LOGE(TAG, "URL is invalid and/or must be prefixed with 'http://' or 'https://'"); + return false; + } + return true; +} + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h new file mode 100644 index 0000000000..9fbdf2ec25 --- /dev/null +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -0,0 +1,72 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/defines.h" +#include "esphome/components/ota/ota_backend.h" + +#include +#include +#include + +namespace esphome { +namespace http_request { + +static const char *const TAG = "http_request.ota"; +static const uint8_t MD5_SIZE = 32; + +enum OtaHttpRequestError : uint8_t { + OTA_MD5_INVALID = 0x10, + OTA_BAD_URL = 0x11, + OTA_CONNECTION_ERROR = 0x12, +}; + +class OtaHttpRequestComponent : public ota::OTAComponent { + public: + void setup() override; + void dump_config() override; + float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } + + void set_md5_url(const std::string &md5_url); + void set_md5(const std::string &md5) { this->md5_expected_ = md5; } + void set_password(const std::string &password) { this->password_ = password; } + void set_timeout(const uint64_t timeout) { this->timeout_ = timeout; } + void set_url(const std::string &url); + void set_username(const std::string &username) { this->username_ = username; } + + std::string md5_computed() { return this->md5_computed_; } + std::string md5_expected() { return this->md5_expected_; } + + bool check_status(); + + void flash(); + + virtual void http_init(const std::string &url){}; + virtual int http_read(uint8_t *buf, size_t len) { return 0; }; + virtual void http_end(){}; + + protected: + void cleanup_(std::unique_ptr backend); + uint8_t do_ota_(); + std::string get_url_with_auth_(const std::string &url); + bool http_get_md5_(); + bool secure_() { return this->url_.find("https:") != std::string::npos; }; + bool validate_url_(const std::string &url); + + std::string md5_computed_{}; + std::string md5_expected_{}; + std::string md5_url_{}; + std::string password_{}; + std::string username_{}; + std::string url_{}; + size_t body_length_ = 0; + size_t bytes_read_ = 0; + int status_ = -1; + uint64_t timeout_ = 0; + bool update_started_ = false; + const uint16_t http_recv_buffer_ = 256; // the firmware GET chunk size + const uint16_t max_http_recv_buffer_ = 512; // internal max http buffer size must be > HTTP_RECV_BUFFER_ (TLS + // overhead) and must be a power of two from 512 to 4096 +}; + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/http_request/ota/ota_http_request_arduino.cpp b/esphome/components/http_request/ota/ota_http_request_arduino.cpp new file mode 100644 index 0000000000..d1dc638d5e --- /dev/null +++ b/esphome/components/http_request/ota/ota_http_request_arduino.cpp @@ -0,0 +1,134 @@ +#include "ota_http_request.h" +#include "watchdog.h" + +#ifdef USE_ARDUINO +#include "ota_http_request_arduino.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" +#include "esphome/core/application.h" +#include "esphome/components/network/util.h" +#include "esphome/components/md5/md5.h" + +namespace esphome { +namespace http_request { + +struct Header { + const char *name; + const char *value; +}; + +void OtaHttpRequestComponentArduino::http_init(const std::string &url) { + const char *header_keys[] = {"Content-Length", "Content-Type"}; + const size_t header_count = sizeof(header_keys) / sizeof(header_keys[0]); + watchdog::WatchdogManager wdts; + +#ifdef USE_ESP8266 + if (this->stream_ptr_ == nullptr && this->set_stream_ptr_()) { + ESP_LOGE(TAG, "Unable to set client"); + return; + } +#endif // USE_ESP8266 + +#ifdef USE_RP2040 + this->client_.setInsecure(); +#endif + + App.feed_wdt(); + +#if defined(USE_ESP32) || defined(USE_RP2040) + this->status_ = this->client_.begin(url.c_str()); +#endif +#ifdef USE_ESP8266 + this->client_.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); + this->status_ = this->client_.begin(*this->stream_ptr_, url.c_str()); +#endif + + if (!this->status_) { + this->client_.end(); + return; + } + + this->client_.setReuse(true); + + // returned needed headers must be collected before the requests + this->client_.collectHeaders(header_keys, header_count); + + // HTTP GET + this->status_ = this->client_.GET(); + + this->body_length_ = (size_t) this->client_.getSize(); + +#if defined(USE_ESP32) || defined(USE_RP2040) + if (this->stream_ptr_ == nullptr) { + this->set_stream_ptr_(); + } +#endif +} + +int OtaHttpRequestComponentArduino::http_read(uint8_t *buf, const size_t max_len) { +#ifdef USE_ESP8266 +#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(3, 1, 0) // && USE_ARDUINO_VERSION_CODE < VERSION_CODE(?, ?, ?) + if (!this->secure_()) { + ESP_LOGW(TAG, "Using HTTP on Arduino version >= 3.1 is **very** slow. Consider setting framework version to 3.0.2 " + "in your YAML, or use HTTPS"); + } +#endif // USE_ARDUINO_VERSION_CODE +#endif // USE_ESP8266 + + watchdog::WatchdogManager wdts; + + // Since arduino8266 >= 3.1 using this->stream_ptr_ is broken (https://github.com/esp8266/Arduino/issues/9035) + WiFiClient *stream_ptr = this->client_.getStreamPtr(); + if (stream_ptr == nullptr) { + ESP_LOGE(TAG, "Stream pointer vanished!"); + return -1; + } + + int available_data = stream_ptr->available(); + int bufsize = std::min((int) max_len, available_data); + if (bufsize > 0) { + stream_ptr->readBytes(buf, bufsize); + this->bytes_read_ += bufsize; + buf[bufsize] = '\0'; // not fed to ota + } + + return bufsize; +} + +void OtaHttpRequestComponentArduino::http_end() { + watchdog::WatchdogManager wdts; + this->client_.end(); +} + +int OtaHttpRequestComponentArduino::set_stream_ptr_() { +#ifdef USE_ESP8266 +#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS + if (this->secure_()) { + ESP_LOGV(TAG, "ESP8266 HTTPS connection with WiFiClientSecure"); + this->stream_ptr_ = std::make_unique(); + WiFiClientSecure *secure_client = static_cast(this->stream_ptr_.get()); + secure_client->setBufferSizes(this->max_http_recv_buffer_, 512); + secure_client->setInsecure(); + } else { + this->stream_ptr_ = std::make_unique(); + } +#else + ESP_LOGV(TAG, "ESP8266 HTTP connection with WiFiClient"); + if (this->secure_()) { + ESP_LOGE(TAG, "Can't use HTTPS connection with esp8266_disable_ssl_support"); + return -1; + } + this->stream_ptr_ = std::make_unique(); +#endif // USE_HTTP_REQUEST_ESP8266_HTTPS +#endif // USE_ESP8266 + +#if defined(USE_ESP32) || defined(USE_RP2040) + this->stream_ptr_ = std::unique_ptr(this->client_.getStreamPtr()); +#endif + return 0; +} + +} // namespace http_request +} // namespace esphome + +#endif // USE_ARDUINO diff --git a/esphome/components/http_request/ota/ota_http_request_arduino.h b/esphome/components/http_request/ota/ota_http_request_arduino.h new file mode 100644 index 0000000000..02bc046520 --- /dev/null +++ b/esphome/components/http_request/ota/ota_http_request_arduino.h @@ -0,0 +1,42 @@ +#pragma once + +#include "ota_http_request.h" + +#ifdef USE_ARDUINO +#include "esphome/core/automation.h" +#include "esphome/core/component.h" +#include "esphome/core/defines.h" + +#include +#include +#include + +#if defined(USE_ESP32) || defined(USE_RP2040) +#include +#endif +#ifdef USE_ESP8266 +#include +#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS +#include +#endif +#endif + +namespace esphome { +namespace http_request { + +class OtaHttpRequestComponentArduino : public OtaHttpRequestComponent { + public: + void http_init(const std::string &url) override; + int http_read(uint8_t *buf, size_t len) override; + void http_end() override; + + protected: + int set_stream_ptr_(); + HTTPClient client_{}; + std::unique_ptr stream_ptr_; +}; + +} // namespace http_request +} // namespace esphome + +#endif // USE_ARDUINO diff --git a/esphome/components/http_request/ota/ota_http_request_idf.cpp b/esphome/components/http_request/ota/ota_http_request_idf.cpp new file mode 100644 index 0000000000..9fa565d9bb --- /dev/null +++ b/esphome/components/http_request/ota/ota_http_request_idf.cpp @@ -0,0 +1,86 @@ +#include "ota_http_request_idf.h" +#include "watchdog.h" + +#ifdef USE_ESP_IDF +#include "esphome/core/application.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" +#include "esphome/components/md5/md5.h" +#include "esphome/components/network/util.h" + +#include "esp_event.h" +#include "esp_http_client.h" +#include "esp_idf_version.h" +#include "esp_log.h" +#include "esp_netif.h" +#include "esp_system.h" +#include "esp_task_wdt.h" +#include "esp_tls.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "nvs_flash.h" + +#include +#include +#include +#include +#include +#if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE +#include "esp_crt_bundle.h" +#endif + +namespace esphome { +namespace http_request { + +void OtaHttpRequestComponentIDF::http_init(const std::string &url) { + App.feed_wdt(); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" + esp_http_client_config_t config = {nullptr}; + config.url = url.c_str(); + config.method = HTTP_METHOD_GET; + config.timeout_ms = (int) this->timeout_; + config.buffer_size = this->max_http_recv_buffer_; + config.auth_type = HTTP_AUTH_TYPE_BASIC; + config.max_authorization_retries = -1; +#if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE + if (this->secure_()) { + config.crt_bundle_attach = esp_crt_bundle_attach; + } +#endif +#pragma GCC diagnostic pop + + watchdog::WatchdogManager wdts; + this->client_ = esp_http_client_init(&config); + if ((this->status_ = esp_http_client_open(this->client_, 0)) == ESP_OK) { + this->body_length_ = esp_http_client_fetch_headers(this->client_); + this->status_ = esp_http_client_get_status_code(this->client_); + } +} + +int OtaHttpRequestComponentIDF::http_read(uint8_t *buf, const size_t max_len) { + watchdog::WatchdogManager wdts; + int bufsize = std::min(max_len, this->body_length_ - this->bytes_read_); + + App.feed_wdt(); + int read_len = esp_http_client_read(this->client_, (char *) buf, bufsize); + if (read_len > 0) { + this->bytes_read_ += bufsize; + buf[bufsize] = '\0'; // not fed to ota + } + + return read_len; +} + +void OtaHttpRequestComponentIDF::http_end() { + watchdog::WatchdogManager wdts; + + esp_http_client_close(this->client_); + esp_http_client_cleanup(this->client_); +} + +} // namespace http_request +} // namespace esphome + +#endif // USE_ESP_IDF diff --git a/esphome/components/http_request/ota/ota_http_request_idf.h b/esphome/components/http_request/ota/ota_http_request_idf.h new file mode 100644 index 0000000000..9783b2a3e1 --- /dev/null +++ b/esphome/components/http_request/ota/ota_http_request_idf.h @@ -0,0 +1,24 @@ +#pragma once + +#include "ota_http_request.h" + +#ifdef USE_ESP_IDF +#include "esp_http_client.h" + +namespace esphome { +namespace http_request { + +class OtaHttpRequestComponentIDF : public OtaHttpRequestComponent { + public: + void http_init(const std::string &url) override; + int http_read(uint8_t *buf, size_t len) override; + void http_end() override; + + protected: + esp_http_client_handle_t client_{}; +}; + +} // namespace http_request +} // namespace esphome + +#endif // USE_ESP_IDF diff --git a/esphome/components/http_request/ota/watchdog.cpp b/esphome/components/http_request/ota/watchdog.cpp new file mode 100644 index 0000000000..663c9afaac --- /dev/null +++ b/esphome/components/http_request/ota/watchdog.cpp @@ -0,0 +1,71 @@ +#include "watchdog.h" + +#ifdef USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT + +#include "esphome/core/application.h" +#include "esphome/core/log.h" + +#include +#include +#ifdef USE_ESP32 +#include "esp_idf_version.h" +#include "esp_task_wdt.h" +#endif +#ifdef USE_RP2040 +#include "hardware/watchdog.h" +#include "pico/stdlib.h" +#endif + +namespace esphome { +namespace http_request { +namespace watchdog { + +static const char *const TAG = "watchdog.http_request.ota"; + +WatchdogManager::WatchdogManager() { + this->saved_timeout_ms_ = this->get_timeout_(); + this->set_timeout_(USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT); +} + +WatchdogManager::~WatchdogManager() { this->set_timeout_(this->saved_timeout_ms_); } + +void WatchdogManager::set_timeout_(uint32_t timeout_ms) { + ESP_LOGV(TAG, "Adjusting WDT to %" PRIu32 "ms", timeout_ms); +#ifdef USE_ESP32 +#if ESP_IDF_VERSION_MAJOR >= 5 + esp_task_wdt_config_t wdt_config = { + .timeout_ms = timeout_ms, + .idle_core_mask = 0x03, + .trigger_panic = true, + }; + esp_task_wdt_reconfigure(&wdt_config); +#else + esp_task_wdt_init(timeout_ms, true); +#endif // ESP_IDF_VERSION_MAJOR +#endif // USE_ESP32 + +#ifdef USE_RP2040 + watchdog_enable(timeout_ms, true); +#endif +} + +uint32_t WatchdogManager::get_timeout_() { + uint32_t timeout_ms = 0; + +#ifdef USE_ESP32 + timeout_ms = (uint32_t) CONFIG_ESP_TASK_WDT_TIMEOUT_S * 1000; +#endif // USE_ESP32 + +#ifdef USE_RP2040 + timeout_ms = watchdog_get_count() / 1000; +#endif + + ESP_LOGVV(TAG, "get_timeout: %" PRIu32 "ms", timeout_ms); + + return timeout_ms; +} + +} // namespace watchdog +} // namespace http_request +} // namespace esphome +#endif diff --git a/esphome/components/http_request/ota/watchdog.h b/esphome/components/http_request/ota/watchdog.h new file mode 100644 index 0000000000..0a09dcd6fa --- /dev/null +++ b/esphome/components/http_request/ota/watchdog.h @@ -0,0 +1,27 @@ +#pragma once + +#include "esphome/core/defines.h" + +#include + +namespace esphome { +namespace http_request { +namespace watchdog { + +class WatchdogManager { +#ifdef USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT + public: + WatchdogManager(); + ~WatchdogManager(); + + private: + uint32_t get_timeout_(); + void set_timeout_(uint32_t timeout_ms); + + uint32_t saved_timeout_ms_{0}; +#endif +}; + +} // namespace watchdog +} // namespace http_request +} // namespace esphome diff --git a/esphome/core/defines.h b/esphome/core/defines.h index c2ad0f641c..76b6af6592 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -33,6 +33,7 @@ #define USE_GRAPH #define USE_GRAPHICAL_DISPLAY_MENU #define USE_HOMEASSISTANT_TIME +#define USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT 8000 // NOLINT #define USE_JSON #define USE_LIGHT #define USE_LOCK diff --git a/tests/components/http_request/common.yaml b/tests/components/http_request/common_http_request.yaml similarity index 95% rename from tests/components/http_request/common.yaml rename to tests/components/http_request/common_http_request.yaml index 848fe3f509..b00768c736 100644 --- a/tests/components/http_request/common.yaml +++ b/tests/components/http_request/common_http_request.yaml @@ -28,10 +28,6 @@ esphome: body: "Some data" verify_ssl: false -wifi: - ssid: MySSID - password: password1 - http_request: useragent: esphome/tagreader timeout: 10s diff --git a/tests/components/http_request/common_ota.yaml b/tests/components/http_request/common_ota.yaml new file mode 100644 index 0000000000..10e7d54c3f --- /dev/null +++ b/tests/components/http_request/common_ota.yaml @@ -0,0 +1,36 @@ +wifi: + ssid: MySSID + password: password1 + +ota: + - platform: http_request + verify_ssl: ${verify_ssl} + on_begin: + then: + - logger.log: "OTA start" + on_progress: + then: + - logger.log: + format: "OTA progress %0.1f%%" + args: ["x"] + on_end: + then: + - logger.log: "OTA end" + on_error: + then: + - logger.log: + format: "OTA update error %d" + args: ["x"] + on_state_change: + then: + lambda: 'ESP_LOGD("ota", "State %d", state);' + +button: + - platform: template + name: Firmware update + on_press: + then: + - ota_http_request.flash: + md5_url: http://my.ha.net:8123/local/esphome/firmware.md5 + url: http://my.ha.net:8123/local/esphome/firmware.bin + - logger.log: "This message should be not displayed (reboot)" diff --git a/tests/components/http_request/test-nossl.esp8266.yaml b/tests/components/http_request/test-nossl.esp8266.yaml new file mode 100644 index 0000000000..65116d5550 --- /dev/null +++ b/tests/components/http_request/test-nossl.esp8266.yaml @@ -0,0 +1,38 @@ +<<: !include common_http_request.yaml + +wifi: + ssid: MySSID + password: password1 + +ota: + - platform: http_request + esp8266_disable_ssl_support: true + on_begin: + then: + - logger.log: "OTA start" + on_progress: + then: + - logger.log: + format: "OTA progress %0.1f%%" + args: ["x"] + on_end: + then: + - logger.log: "OTA end" + on_error: + then: + - logger.log: + format: "OTA update error %d" + args: ["x"] + on_state_change: + then: + lambda: 'ESP_LOGD("ota", "State %d", state);' + +button: + - platform: template + name: Firmware update + on_press: + then: + - ota_http_request.flash: + md5_url: http://my.ha.net:8123/local/esphome/firmware.md5 + url: http://my.ha.net:8123/local/esphome/firmware.bin + - logger.log: "This message should be not displayed (reboot)" diff --git a/tests/components/http_request/test.esp32-c3-idf.yaml b/tests/components/http_request/test.esp32-c3-idf.yaml new file mode 100644 index 0000000000..da629e83a9 --- /dev/null +++ b/tests/components/http_request/test.esp32-c3-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + verify_ssl: "true" + +<<: !include common_ota.yaml diff --git a/tests/components/http_request/test.esp32-c3.yaml b/tests/components/http_request/test.esp32-c3.yaml index 25cb37a0b4..1f597bb500 100644 --- a/tests/components/http_request/test.esp32-c3.yaml +++ b/tests/components/http_request/test.esp32-c3.yaml @@ -1,2 +1,5 @@ -packages: - common: !include common.yaml +substitutions: + verify_ssl: "false" + +<<: !include common_http_request.yaml +<<: !include common_ota.yaml diff --git a/tests/components/http_request/test.esp32-idf.yaml b/tests/components/http_request/test.esp32-idf.yaml new file mode 100644 index 0000000000..da629e83a9 --- /dev/null +++ b/tests/components/http_request/test.esp32-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + verify_ssl: "true" + +<<: !include common_ota.yaml diff --git a/tests/components/http_request/test.esp32.yaml b/tests/components/http_request/test.esp32.yaml index 25cb37a0b4..1f597bb500 100644 --- a/tests/components/http_request/test.esp32.yaml +++ b/tests/components/http_request/test.esp32.yaml @@ -1,2 +1,5 @@ -packages: - common: !include common.yaml +substitutions: + verify_ssl: "false" + +<<: !include common_http_request.yaml +<<: !include common_ota.yaml diff --git a/tests/components/http_request/test.esp8266.yaml b/tests/components/http_request/test.esp8266.yaml index 25cb37a0b4..1f597bb500 100644 --- a/tests/components/http_request/test.esp8266.yaml +++ b/tests/components/http_request/test.esp8266.yaml @@ -1,2 +1,5 @@ -packages: - common: !include common.yaml +substitutions: + verify_ssl: "false" + +<<: !include common_http_request.yaml +<<: !include common_ota.yaml diff --git a/tests/components/http_request/test.rp2040.yaml b/tests/components/http_request/test.rp2040.yaml new file mode 100644 index 0000000000..077e4d82da --- /dev/null +++ b/tests/components/http_request/test.rp2040.yaml @@ -0,0 +1,4 @@ +substitutions: + verify_ssl: "false" + +<<: !include common_ota.yaml From ccab57fc583189976248b7574eb4ca448860b16a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:30:49 +1200 Subject: [PATCH 003/151] [logger] Fix defines for development (#6870) * [logger] Fix defines for development * Set debugging flags for rp2040 --- esphome/components/logger/__init__.py | 27 ++++++++++++++++++++------- esphome/core/defines.h | 9 +++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/esphome/components/logger/__init__.py b/esphome/components/logger/__init__.py index c05f3d54aa..99aa39c4ba 100644 --- a/esphome/components/logger/__init__.py +++ b/esphome/components/logger/__init__.py @@ -112,11 +112,18 @@ HARDWARE_UART_TO_UART_SELECTION = { } HARDWARE_UART_TO_SERIAL = { - UART0: cg.global_ns.Serial, - UART0_SWAP: cg.global_ns.Serial, - UART1: cg.global_ns.Serial1, - UART2: cg.global_ns.Serial2, - DEFAULT: cg.global_ns.Serial, + PLATFORM_ESP8266: { + UART0: cg.global_ns.Serial, + UART0_SWAP: cg.global_ns.Serial, + UART1: cg.global_ns.Serial1, + UART2: cg.global_ns.Serial2, + DEFAULT: cg.global_ns.Serial, + }, + PLATFORM_RP2040: { + UART0: cg.global_ns.Serial1, + UART1: cg.global_ns.Serial2, + USB_CDC: cg.global_ns.Serial, + }, } is_log_level = cv.one_of(*LOG_LEVELS, upper=True) @@ -244,8 +251,14 @@ async def to_code(config): is_at_least_very_verbose = this_severity >= very_verbose_severity has_serial_logging = baud_rate != 0 - if CORE.is_esp8266 and has_serial_logging and is_at_least_verbose: - debug_serial_port = HARDWARE_UART_TO_SERIAL[config.get(CONF_HARDWARE_UART)] + if ( + (CORE.is_esp8266 or CORE.is_rp2040) + and has_serial_logging + and is_at_least_verbose + ): + debug_serial_port = HARDWARE_UART_TO_SERIAL[CORE.target_platform][ + config.get(CONF_HARDWARE_UART) + ] cg.add_build_flag(f"-DDEBUG_ESP_PORT={debug_serial_port}") cg.add_build_flag("-DLWIP_DEBUG") DEBUG_COMPONENTS = { diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 76b6af6592..affcd78089 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -101,6 +101,14 @@ #ifdef USE_ESP_IDF #define USE_ESP_IDF_VERSION_CODE VERSION_CODE(4, 4, 2) #endif + +#if defined(USE_ESP32_VARIANT_ESP32S2) +#define USE_LOGGER_USB_CDC +#elif defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C3) || \ + defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2) +#define USE_LOGGER_USB_CDC +#define USE_LOGGER_USB_SERIAL_JTAG +#endif #endif // ESP8266-specific feature flags @@ -123,6 +131,7 @@ #ifdef USE_RP2040 #define USE_ARDUINO_VERSION_CODE VERSION_CODE(3, 3, 0) +#define USE_LOGGER_USB_CDC #define USE_SOCKET_IMPL_LWIP_TCP #define USE_SPI #endif From 276eea2b69f71a91dd87c672ad8c72d8883592a3 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Fri, 7 Jun 2024 12:36:07 -0700 Subject: [PATCH 004/151] [docker] Avoid unsafe git error when container user and file config volume permissions don't match (#6873) --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f6234235f7..36be700f55 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -101,7 +101,7 @@ RUN --mount=type=tmpfs,target=/root/.cargo if [ "$TARGETARCH$TARGETVARIANT" = "a && /platformio_install_deps.py /platformio.ini --libraries # Avoid unsafe git error when container user and file config volume permissions don't match -RUN git config --system --add safe.directory '/config/*' +RUN git config --system --add safe.directory '*' # ======================= docker-type image ======================= From 861a23d039cdc3900087958fb0586bffd790fd7c Mon Sep 17 00:00:00 2001 From: RFDarter Date: Fri, 7 Jun 2024 21:37:05 +0200 Subject: [PATCH 005/151] [datetime] Add logs on DateCall perform (#6868) --- esphome/components/datetime/date_entity.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/esphome/components/datetime/date_entity.cpp b/esphome/components/datetime/date_entity.cpp index 19399c1e59..b5bcef43af 100644 --- a/esphome/components/datetime/date_entity.cpp +++ b/esphome/components/datetime/date_entity.cpp @@ -80,6 +80,17 @@ void DateCall::validate_() { void DateCall::perform() { this->validate_(); + ESP_LOGD(TAG, "'%s' - Setting", this->parent_->get_name().c_str()); + + if (this->year_.has_value()) { + ESP_LOGD(TAG, " Year: %d", *this->year_); + } + if (this->month_.has_value()) { + ESP_LOGD(TAG, " Month: %d", *this->month_); + } + if (this->day_.has_value()) { + ESP_LOGD(TAG, " Day: %d", *this->day_); + } this->parent_->control(*this); } From 8718e15a6a6dc56323e8e1ce1163da8b6eec9e9f Mon Sep 17 00:00:00 2001 From: Mischa Siekmann <45062894+gnumpi@users.noreply.github.com> Date: Fri, 7 Jun 2024 21:43:22 +0200 Subject: [PATCH 006/151] fix: arduino media player sets wrong state for announcements (#6849) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- .../i2s_audio/media_player/i2s_audio_media_player.cpp | 11 ++++++++--- .../i2s_audio/media_player/i2s_audio_media_player.h | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp index 1890e27bdf..ef494fac2e 100644 --- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp @@ -27,6 +27,11 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) { this->start(); } } + + if (this->state == media_player::MEDIA_PLAYER_STATE_ANNOUNCING) { + this->is_announcement_ = true; + } + if (call.get_volume().has_value()) { this->volume = call.get_volume().value(); this->set_volume_(volume); @@ -171,9 +176,8 @@ void I2SAudioMediaPlayer::start_() { if (this->current_url_.has_value()) { this->audio_->connecttohost(this->current_url_.value().c_str()); this->state = media_player::MEDIA_PLAYER_STATE_PLAYING; - if (this->is_announcement_.has_value()) { - this->state = this->is_announcement_.value() ? media_player::MEDIA_PLAYER_STATE_ANNOUNCING - : media_player::MEDIA_PLAYER_STATE_PLAYING; + if (this->is_announcement_) { + this->state = media_player::MEDIA_PLAYER_STATE_ANNOUNCING; } this->publish_state(); } @@ -202,6 +206,7 @@ void I2SAudioMediaPlayer::stop_() { this->high_freq_.stop(); this->state = media_player::MEDIA_PLAYER_STATE_IDLE; this->publish_state(); + this->is_announcement_ = false; } media_player::MediaPlayerTraits I2SAudioMediaPlayer::get_traits() { diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h index d7d9b1f74a..5afe778122 100644 --- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h +++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h @@ -78,7 +78,7 @@ class I2SAudioMediaPlayer : public Component, public media_player::MediaPlayer, HighFrequencyLoopRequester high_freq_; optional current_url_{}; - optional is_announcement_{}; + bool is_announcement_{false}; }; } // namespace i2s_audio From d77ea461571e338ee1344f56e225fd4de26d66c7 Mon Sep 17 00:00:00 2001 From: RFDarter Date: Fri, 7 Jun 2024 22:29:10 +0200 Subject: [PATCH 007/151] [datetime] datetime-datetime strptime support value string without seconds (#6867) --- esphome/core/time.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/esphome/core/time.cpp b/esphome/core/time.cpp index add671701f..f7aa4fdddb 100644 --- a/esphome/core/time.cpp +++ b/esphome/core/time.cpp @@ -84,6 +84,16 @@ bool ESPTime::strptime(const std::string &time_to_parse, ESPTime &esp_time) { esp_time.hour = hour; esp_time.minute = minute; esp_time.second = second; + } else if (sscanf(time_to_parse.c_str(), "%04hu-%02hhu-%02hhu %02hhu:%02hhu %n", &year, &month, &day, // NOLINT + &hour, // NOLINT + &minute, &num) == 5 && // NOLINT + num == time_to_parse.size()) { + esp_time.year = year; + esp_time.month = month; + esp_time.day_of_month = day; + esp_time.hour = hour; + esp_time.minute = minute; + esp_time.second = 0; } else if (sscanf(time_to_parse.c_str(), "%02hhu:%02hhu:%02hhu %n", &hour, &minute, &second, &num) == 3 && // NOLINT num == time_to_parse.size()) { esp_time.hour = hour; From 38b7bed2faa522e7e065d8362d6ea0bcaf1c64d5 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Sat, 8 Jun 2024 21:55:57 +1200 Subject: [PATCH 008/151] Update webserver local assets to 20240608-093147 (#6874) --- .../components/web_server/server_index_v2.h | 1231 +++++++++-------- .../components/web_server/server_index_v3.h | 721 +++++----- 2 files changed, 977 insertions(+), 975 deletions(-) diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index 31c2d1fd85..7417f37015 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -11,623 +11,624 @@ namespace web_server { const uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcd, 0x7d, 0xd9, 0x92, 0xdb, 0x46, 0xb6, 0xe0, 0xf3, - 0xdc, 0xaf, 0x40, 0xc1, 0xd5, 0x25, 0x64, 0x33, 0x89, 0x22, 0x59, 0xda, 0x0c, 0x56, 0x92, 0x5d, 0x2a, 0xc9, 0x2d, - 0xbb, 0xb5, 0xd8, 0x2a, 0xc9, 0x6e, 0x9b, 0x66, 0x57, 0xa1, 0x88, 0x24, 0x99, 0x16, 0x88, 0xa4, 0x13, 0xc9, 0x5a, + 0xdc, 0xaf, 0x40, 0xa5, 0xab, 0x4b, 0xc8, 0x66, 0x12, 0x45, 0xb2, 0xb4, 0x19, 0xac, 0x24, 0xbb, 0x54, 0x92, 0x5b, + 0x76, 0x6b, 0xb1, 0x55, 0x92, 0xdd, 0x36, 0xcd, 0xae, 0x42, 0x11, 0x49, 0x32, 0x2d, 0x10, 0x49, 0x03, 0xc9, 0x5a, 0x4c, 0xe2, 0xc6, 0x7c, 0xc0, 0x44, 0x4c, 0xc4, 0x3c, 0xcd, 0xcb, 0xc4, 0xdc, 0x87, 0xf9, 0x88, 0x79, 0xbe, 0x9f, 0x72, 0x7f, 0x60, 0xe6, 0x13, 0x26, 0x4e, 0x2e, 0x40, 0x82, 0x4b, 0xa9, 0xbc, 0xdc, 0x1b, 0x13, 0x0a, 0x49, 0x44, - 0xae, 0x27, 0x4f, 0x9e, 0x3c, 0x7b, 0x02, 0xc7, 0x7b, 0x09, 0x1f, 0xc9, 0xdb, 0x39, 0xf5, 0xa6, 0x72, 0x96, 0xf6, - 0x8e, 0xcd, 0xbf, 0x34, 0x4e, 0x7a, 0xc7, 0x29, 0xcb, 0x3e, 0x7a, 0x82, 0xa6, 0x84, 0x8d, 0x78, 0xe6, 0x4d, 0x05, - 0x1d, 0x93, 0x24, 0x96, 0x71, 0xc4, 0x66, 0xf1, 0x84, 0x7a, 0x87, 0xbd, 0xe3, 0x19, 0x95, 0xb1, 0x37, 0x9a, 0xc6, - 0x22, 0xa7, 0x92, 0x7c, 0x78, 0xff, 0x45, 0xf3, 0x69, 0xef, 0x38, 0x1f, 0x09, 0x36, 0x97, 0x1e, 0x0c, 0x49, 0x66, - 0x3c, 0x59, 0xa4, 0xb4, 0x77, 0x78, 0x78, 0x7d, 0x7d, 0x1d, 0xfe, 0x94, 0xff, 0xd3, 0x88, 0x67, 0xb9, 0xf4, 0x5e, - 0x91, 0x6b, 0x96, 0x25, 0xfc, 0x1a, 0x53, 0x49, 0x5e, 0x85, 0x67, 0xd3, 0x38, 0xe1, 0xd7, 0xef, 0x38, 0x97, 0x07, - 0x07, 0x81, 0x7e, 0xbc, 0x3d, 0x3d, 0x3b, 0x23, 0x84, 0x5c, 0x71, 0x96, 0x78, 0xad, 0xd5, 0xaa, 0x2a, 0x0c, 0xb3, - 0x58, 0xb2, 0x2b, 0xaa, 0xbb, 0xa0, 0x83, 0x03, 0x3f, 0x4e, 0xf8, 0x5c, 0xd2, 0xe4, 0x4c, 0xde, 0xa6, 0xf4, 0x6c, - 0x4a, 0xa9, 0xcc, 0x7d, 0x96, 0x79, 0xcf, 0xf9, 0x68, 0x31, 0xa3, 0x99, 0x0c, 0xe7, 0x82, 0x4b, 0x0e, 0x90, 0x1c, - 0x1c, 0xf8, 0x82, 0xce, 0xd3, 0x78, 0x44, 0xa1, 0xfe, 0xf4, 0xec, 0xac, 0xea, 0x51, 0x35, 0xc2, 0x4c, 0x92, 0xb3, - 0xdb, 0xd9, 0x25, 0x4f, 0x03, 0x84, 0x53, 0x49, 0x32, 0x7a, 0xed, 0x7d, 0x47, 0xe3, 0x8f, 0xaf, 0xe3, 0x79, 0x77, - 0x94, 0xc6, 0x79, 0xee, 0x5d, 0xca, 0xa5, 0x5a, 0x82, 0x58, 0x8c, 0x24, 0x17, 0x81, 0xc4, 0x14, 0x33, 0xb4, 0x64, - 0xe3, 0x40, 0x4e, 0x59, 0x1e, 0x9e, 0xef, 0x8f, 0xf2, 0xfc, 0x1d, 0xcd, 0x17, 0xa9, 0xdc, 0x27, 0x7b, 0x2d, 0xcc, - 0xf6, 0x08, 0x61, 0x12, 0xc9, 0xa9, 0xe0, 0xd7, 0xde, 0x0b, 0x21, 0xb8, 0x08, 0xfc, 0xd3, 0xb3, 0x33, 0xdd, 0xc2, - 0x63, 0xb9, 0x97, 0x71, 0xe9, 0x95, 0xe3, 0xc5, 0x97, 0x29, 0x0d, 0xbd, 0x0f, 0x39, 0xf5, 0x2e, 0x16, 0x59, 0x1e, - 0x8f, 0xe9, 0xe9, 0xd9, 0xd9, 0x85, 0xc7, 0x85, 0x77, 0x31, 0xca, 0xf3, 0x0b, 0x8f, 0x65, 0xb9, 0xa4, 0x71, 0x12, - 0xfa, 0xa8, 0xab, 0x26, 0x1b, 0xe5, 0xf9, 0x7b, 0x7a, 0x23, 0x89, 0xc4, 0xea, 0x51, 0x12, 0x5a, 0x4c, 0xa8, 0xf4, - 0xf2, 0x72, 0x5d, 0x01, 0x5a, 0xa6, 0x54, 0x7a, 0x92, 0xa8, 0x7a, 0xde, 0xd5, 0xb8, 0xa7, 0xfa, 0x51, 0x76, 0xd9, - 0x38, 0xa0, 0xf2, 0xe0, 0x40, 0x96, 0x78, 0x46, 0x7a, 0x69, 0x1e, 0x23, 0x74, 0xcf, 0x96, 0x1d, 0x1c, 0xd0, 0x30, - 0xa5, 0xd9, 0x44, 0x4e, 0x09, 0x21, 0xed, 0x2e, 0x3b, 0x38, 0x08, 0x24, 0x49, 0x65, 0x38, 0xa1, 0x32, 0xa0, 0x08, - 0xe1, 0xaa, 0xf7, 0xc1, 0x41, 0xa0, 0x91, 0xc0, 0x89, 0x46, 0x5c, 0x0d, 0xc7, 0x28, 0x34, 0xd8, 0x3f, 0xbb, 0xcd, - 0x46, 0x81, 0x0b, 0x3f, 0xc2, 0xec, 0xe0, 0x20, 0x95, 0x61, 0x0e, 0x23, 0x62, 0x89, 0x50, 0x21, 0xa8, 0x5c, 0x88, - 0xcc, 0x93, 0x85, 0xe4, 0x67, 0x52, 0xb0, 0x6c, 0x12, 0xa0, 0xa5, 0x2d, 0x73, 0x3a, 0x16, 0x85, 0x06, 0xf7, 0x6b, - 0x49, 0x04, 0xe9, 0xc1, 0x8c, 0x97, 0x32, 0x80, 0x5d, 0xe4, 0x63, 0x4f, 0x10, 0xe2, 0xe7, 0xaa, 0xaf, 0xdf, 0x17, - 0x91, 0x68, 0xf8, 0x3e, 0xd6, 0x50, 0x62, 0x26, 0x11, 0xfe, 0x48, 0x02, 0x81, 0xc3, 0x30, 0x94, 0x88, 0xf4, 0x96, - 0x16, 0x2b, 0xc2, 0x59, 0x67, 0x5f, 0x0c, 0x5a, 0xc3, 0x48, 0x86, 0x82, 0x26, 0x8b, 0x11, 0x0d, 0x02, 0x86, 0x73, - 0x9c, 0x21, 0xd2, 0x63, 0x8d, 0x80, 0x93, 0x1e, 0x6c, 0x37, 0xaf, 0xef, 0x35, 0x21, 0x7b, 0x2d, 0x64, 0x60, 0xe4, - 0x16, 0x40, 0xc0, 0xb0, 0x81, 0x87, 0x13, 0xe2, 0x67, 0x8b, 0xd9, 0x25, 0x15, 0x7e, 0xd9, 0xac, 0x5b, 0x23, 0x8b, - 0x45, 0x4e, 0xbd, 0x51, 0x9e, 0x7b, 0xe3, 0x45, 0x36, 0x92, 0x8c, 0x67, 0x9e, 0xdf, 0xe0, 0x0d, 0x5f, 0x93, 0x43, - 0x49, 0x0d, 0x3e, 0x2a, 0x50, 0x90, 0xa3, 0x86, 0x18, 0x64, 0x8d, 0xf6, 0x10, 0x03, 0x94, 0xa8, 0x6b, 0xc6, 0x33, - 0x08, 0xa0, 0x58, 0xc0, 0x1a, 0x0b, 0xfc, 0x41, 0xc2, 0x2a, 0xd5, 0x12, 0xa9, 0xec, 0x8b, 0x70, 0xf3, 0xa0, 0x10, - 0x19, 0xce, 0xe2, 0x79, 0x40, 0x49, 0x8f, 0x2a, 0xe2, 0x8a, 0xb3, 0x11, 0xc0, 0x5a, 0xdb, 0xb7, 0x3e, 0x8d, 0x68, - 0x58, 0x91, 0x14, 0x8a, 0x64, 0x38, 0xe6, 0xe2, 0x45, 0x3c, 0x9a, 0x42, 0xbf, 0x92, 0x60, 0x12, 0x7b, 0xde, 0x46, - 0x82, 0xc6, 0x92, 0xbe, 0x48, 0x29, 0x3c, 0x05, 0xbe, 0xea, 0xe9, 0x23, 0x9c, 0x93, 0x57, 0x61, 0xca, 0xe4, 0x1b, - 0x9e, 0x8d, 0x68, 0x37, 0x77, 0xa8, 0x8b, 0xc1, 0xbe, 0x9f, 0x48, 0x29, 0xd8, 0xe5, 0x42, 0xd2, 0xc0, 0xcf, 0xa0, - 0x85, 0x8f, 0x73, 0x84, 0x59, 0x28, 0xe9, 0x8d, 0x3c, 0xe5, 0x99, 0xa4, 0x99, 0x24, 0xd4, 0x22, 0x15, 0x8b, 0x30, - 0x9e, 0xcf, 0x69, 0x96, 0x9c, 0x4e, 0x59, 0x9a, 0x04, 0x0c, 0x15, 0xa8, 0xc0, 0xb1, 0x24, 0xb0, 0x46, 0xd2, 0x13, - 0x11, 0xfc, 0xb3, 0x7b, 0x35, 0x81, 0x24, 0x3d, 0x75, 0x28, 0x28, 0xf1, 0xfd, 0xee, 0x98, 0x8b, 0xc0, 0xac, 0xc0, - 0xe3, 0x63, 0x4f, 0xc2, 0x1c, 0xef, 0x16, 0x29, 0xcd, 0x11, 0x6d, 0x10, 0x56, 0x6e, 0xa3, 0x41, 0xf0, 0xd7, 0x40, - 0xf1, 0x05, 0x0a, 0x04, 0x8a, 0x44, 0xf7, 0x2a, 0x16, 0xde, 0x17, 0xe6, 0x44, 0xfd, 0x64, 0xb9, 0xd9, 0x54, 0x92, - 0x9f, 0x42, 0x29, 0x16, 0xb9, 0xa4, 0xc9, 0xfb, 0xdb, 0x39, 0xcd, 0xf1, 0x4b, 0x49, 0xa6, 0xb2, 0x3f, 0x95, 0x21, - 0x9d, 0xcd, 0xe5, 0xed, 0x99, 0x62, 0x8c, 0x91, 0xef, 0xe3, 0x11, 0xb4, 0x14, 0x34, 0x1e, 0x01, 0x33, 0x33, 0xd8, - 0xfa, 0x9a, 0xa7, 0xb7, 0x63, 0x96, 0xa6, 0x67, 0x8b, 0xf9, 0x9c, 0x0b, 0x89, 0xff, 0x4a, 0x96, 0x92, 0x57, 0xa8, - 0x81, 0xbd, 0x5c, 0xe6, 0xd7, 0x4c, 0x8e, 0xa6, 0x81, 0x44, 0xcb, 0x51, 0x9c, 0x53, 0xef, 0x19, 0xe7, 0x29, 0x8d, - 0xb3, 0x48, 0x10, 0xd1, 0x7f, 0x29, 0xa3, 0x6c, 0x91, 0xa6, 0xdd, 0x4b, 0x41, 0xe3, 0x8f, 0x5d, 0x55, 0xfd, 0xf6, - 0xf2, 0x27, 0x3a, 0x92, 0x91, 0xfa, 0x7d, 0x22, 0x44, 0x7c, 0x0b, 0x0d, 0x09, 0x81, 0x66, 0x7d, 0x11, 0x7d, 0x75, - 0xf6, 0xf6, 0x4d, 0xa8, 0x0f, 0x09, 0x1b, 0xdf, 0x06, 0xa2, 0x3c, 0x78, 0xa2, 0xc0, 0x63, 0xc1, 0x67, 0x6b, 0x53, - 0x6b, 0xac, 0x89, 0xee, 0x0e, 0x10, 0x28, 0x11, 0x7b, 0x7a, 0x68, 0x17, 0x82, 0x37, 0x8a, 0xe6, 0xa1, 0x92, 0x98, - 0x79, 0xe1, 0x9f, 0x48, 0x17, 0x07, 0x02, 0xdd, 0x0d, 0xad, 0x14, 0xb7, 0x4b, 0x4a, 0x14, 0x9c, 0x73, 0x90, 0x30, - 0x00, 0xe3, 0x28, 0x96, 0xa3, 0xe9, 0x92, 0xaa, 0xc1, 0x0a, 0x0b, 0x31, 0x2d, 0x0a, 0x7c, 0x5d, 0xd2, 0xbb, 0xdc, - 0x23, 0x44, 0x28, 0x46, 0x45, 0xe4, 0x6a, 0x25, 0x08, 0x11, 0x08, 0x7f, 0x47, 0x96, 0xb1, 0x5d, 0x4f, 0xb4, 0xd7, - 0xc2, 0x70, 0x2e, 0x23, 0xcd, 0x5d, 0xf0, 0x88, 0x67, 0x57, 0x54, 0x48, 0x2a, 0xa2, 0xbf, 0x62, 0x41, 0xc7, 0x29, - 0x40, 0xb1, 0xd7, 0xc6, 0xd3, 0x38, 0x3f, 0x9d, 0xc6, 0xd9, 0x84, 0x26, 0xd1, 0xb5, 0x2c, 0xf0, 0xdf, 0x89, 0x3f, - 0x66, 0x59, 0x9c, 0xb2, 0x5f, 0x68, 0xe2, 0x1b, 0x69, 0x70, 0xe2, 0xd1, 0x1b, 0x49, 0xb3, 0x24, 0xf7, 0x5e, 0xbe, - 0x7f, 0xfd, 0xca, 0xec, 0x63, 0x4d, 0x40, 0xa0, 0x65, 0xbe, 0x98, 0x53, 0x11, 0x20, 0x6c, 0x04, 0xc4, 0x0b, 0xa6, - 0x98, 0xe3, 0xeb, 0x78, 0xae, 0x4b, 0x58, 0xfe, 0x61, 0x9e, 0xc4, 0x92, 0x7e, 0x4d, 0xb3, 0x84, 0x65, 0x13, 0xb2, - 0xd7, 0xd6, 0xe5, 0xd3, 0xd8, 0x54, 0x24, 0x65, 0xd1, 0xf9, 0xfe, 0x8b, 0x54, 0xad, 0xbb, 0x7c, 0x5c, 0x04, 0xa8, - 0xc8, 0x65, 0x2c, 0xd9, 0xc8, 0x8b, 0x93, 0xe4, 0xcb, 0x8c, 0x49, 0xa6, 0x00, 0x14, 0xb0, 0x3d, 0x40, 0xa2, 0x54, - 0x8b, 0x0a, 0x0b, 0x78, 0x80, 0x70, 0x10, 0x18, 0x01, 0x30, 0x45, 0x66, 0xbf, 0x0e, 0x0e, 0x2a, 0x76, 0xdf, 0xa7, - 0x91, 0xae, 0x24, 0x83, 0x21, 0x0a, 0xe7, 0x8b, 0x1c, 0x36, 0xda, 0x4e, 0x01, 0xd2, 0x85, 0x5f, 0xe6, 0x54, 0x5c, - 0xd1, 0xa4, 0x24, 0x8e, 0x3c, 0x40, 0xcb, 0xb5, 0x39, 0xcc, 0xb1, 0x90, 0x64, 0x30, 0xec, 0xba, 0x7c, 0x9b, 0x1a, - 0x3a, 0x17, 0x7c, 0x4e, 0x85, 0x64, 0x34, 0x2f, 0x59, 0x49, 0x00, 0x52, 0xb4, 0x64, 0x27, 0x39, 0xb1, 0xeb, 0x9b, - 0x07, 0x0c, 0x53, 0x54, 0x63, 0x18, 0x56, 0xd0, 0xbe, 0xb8, 0x52, 0x12, 0x23, 0xc7, 0x0c, 0x61, 0xa9, 0x21, 0xcd, - 0x11, 0x2a, 0x10, 0x96, 0x16, 0x5c, 0xcd, 0x8a, 0xcc, 0x6c, 0xb7, 0x20, 0xaa, 0xc9, 0x77, 0x4a, 0x54, 0x03, 0x43, - 0x8b, 0x25, 0x3d, 0x38, 0x08, 0x68, 0x58, 0x12, 0x05, 0xd9, 0x6b, 0x9b, 0x3d, 0x72, 0x90, 0xb5, 0x03, 0x6c, 0x98, - 0x58, 0x62, 0x8a, 0xf0, 0x1e, 0x0d, 0x33, 0x7e, 0x32, 0x1a, 0xd1, 0x3c, 0xe7, 0xe2, 0xe0, 0x60, 0x4f, 0xb5, 0x2f, - 0xb5, 0x09, 0xd8, 0xc3, 0xb7, 0xd7, 0x59, 0x05, 0x01, 0xaa, 0x24, 0xac, 0x91, 0x0b, 0x12, 0xe4, 0x94, 0x52, 0x38, - 0xfc, 0xbe, 0x55, 0x3c, 0x22, 0xff, 0xfc, 0xdc, 0x6f, 0x48, 0x6c, 0xd0, 0x30, 0xa1, 0x76, 0xea, 0xdb, 0xe7, 0x54, - 0xab, 0x56, 0x4a, 0xf1, 0xd8, 0xc0, 0x8c, 0x3e, 0x3f, 0x61, 0x42, 0xc7, 0x2c, 0x73, 0x96, 0x5d, 0x03, 0x09, 0x4b, - 0x9c, 0xa3, 0xc2, 0xd9, 0xd0, 0xad, 0x43, 0x2b, 0x9d, 0x46, 0xef, 0xdc, 0x72, 0xa2, 0xf4, 0x08, 0x67, 0x1b, 0x07, - 0x74, 0x58, 0x60, 0x85, 0x7a, 0xbb, 0x9a, 0x4c, 0x01, 0x3a, 0x90, 0xc3, 0xae, 0xa9, 0x27, 0xb9, 0xc6, 0x9c, 0xa0, - 0x3f, 0x2f, 0x68, 0x2e, 0x35, 0x1d, 0x07, 0x12, 0x67, 0x98, 0xa1, 0x02, 0x8e, 0xdb, 0x98, 0x4d, 0x16, 0x02, 0xd4, - 0x1d, 0x38, 0x8a, 0x34, 0x5b, 0xcc, 0xa8, 0x7d, 0xda, 0x06, 0xdb, 0xdb, 0x39, 0x08, 0xc4, 0x1c, 0x68, 0xfa, 0x6e, - 0x72, 0x02, 0x58, 0x25, 0x5a, 0xad, 0xbe, 0xb3, 0x83, 0x54, 0x5b, 0x59, 0xaa, 0x68, 0x6b, 0x7b, 0xf2, 0x77, 0x64, - 0xe4, 0xf1, 0x5e, 0x5b, 0x43, 0xff, 0xf7, 0x21, 0xd9, 0x6b, 0x95, 0x14, 0x6c, 0x70, 0xaa, 0x81, 0xd1, 0x28, 0x7c, - 0xab, 0x07, 0x42, 0x4a, 0xba, 0xd7, 0x88, 0x25, 0x9c, 0x6e, 0xd0, 0xe9, 0x94, 0x0c, 0x40, 0xcf, 0x08, 0xa7, 0xc3, - 0x5d, 0xc4, 0x64, 0xb9, 0x41, 0x20, 0x37, 0xeb, 0x2a, 0xa6, 0x71, 0x55, 0x67, 0x1a, 0x6b, 0x8b, 0xf0, 0xe7, 0x65, - 0x17, 0xbf, 0xa4, 0x31, 0x73, 0xcc, 0xab, 0x2a, 0xcc, 0x14, 0x30, 0xd5, 0x92, 0x9c, 0x21, 0xde, 0xc4, 0x33, 0x9a, - 0x07, 0x14, 0xe1, 0x5d, 0x0d, 0x34, 0x71, 0x42, 0x93, 0xa1, 0x23, 0x36, 0x73, 0x10, 0x9b, 0x0c, 0x69, 0xad, 0xac, - 0x7e, 0xdc, 0x72, 0x4c, 0x07, 0xf9, 0xb0, 0x52, 0xe6, 0x9c, 0xc5, 0x2b, 0x79, 0x6c, 0xa8, 0xdb, 0xe2, 0x4f, 0x97, - 0x69, 0xa4, 0x29, 0xa5, 0x21, 0x47, 0x78, 0xaf, 0xb5, 0xbe, 0x8f, 0xb6, 0x55, 0xb5, 0xc6, 0xc1, 0x10, 0xf6, 0x41, - 0x89, 0x8b, 0x90, 0xe5, 0xea, 0xff, 0xda, 0x39, 0x03, 0xb4, 0x9d, 0x01, 0x59, 0x84, 0xe3, 0x34, 0x96, 0x41, 0xfb, - 0xb0, 0x05, 0x9a, 0xe8, 0x15, 0x05, 0x69, 0x82, 0xd0, 0xe6, 0x52, 0x68, 0xb8, 0xc8, 0xf2, 0x29, 0x1b, 0xcb, 0x20, - 0x96, 0x8a, 0xa1, 0xd0, 0x34, 0xa7, 0x9e, 0xac, 0xe9, 0xc3, 0x8a, 0xd9, 0xc4, 0x40, 0x6a, 0xa5, 0xf2, 0x45, 0x2d, - 0xa4, 0x8a, 0x69, 0x01, 0x6f, 0xa8, 0x74, 0xe9, 0x8a, 0xc7, 0xd8, 0xd6, 0x0c, 0xf4, 0xc5, 0x76, 0x5f, 0x8f, 0x18, - 0x19, 0x56, 0xc0, 0x1c, 0x95, 0x95, 0x45, 0x2e, 0x7f, 0x30, 0x85, 0x32, 0x94, 0xfc, 0x15, 0xbf, 0xa6, 0xe2, 0x34, - 0x06, 0xe0, 0x23, 0xdd, 0xbd, 0xd0, 0x62, 0x40, 0x71, 0x7b, 0xd9, 0xb5, 0xf4, 0x72, 0xae, 0x16, 0xfe, 0xb5, 0xe0, - 0x33, 0x96, 0x53, 0xd0, 0xd4, 0x34, 0xfe, 0x33, 0x38, 0x65, 0xea, 0x38, 0x82, 0xa8, 0xa1, 0x25, 0x7d, 0x9d, 0xbc, - 0xaa, 0xd3, 0xd7, 0xf9, 0xfe, 0x8b, 0x89, 0x65, 0x7f, 0xf5, 0x43, 0x8c, 0x70, 0x60, 0xec, 0x09, 0x47, 0xca, 0x85, - 0x53, 0x64, 0xc4, 0xfb, 0x6a, 0x25, 0x1d, 0xb3, 0xad, 0xa6, 0x2b, 0x52, 0x7d, 0x6c, 0x50, 0x11, 0x27, 0x09, 0x68, - 0x75, 0x82, 0xa7, 0xa9, 0x23, 0xa8, 0x30, 0xeb, 0x96, 0xa2, 0xe9, 0x7c, 0xff, 0xc5, 0xd9, 0x5d, 0xd2, 0x09, 0xea, - 0x5d, 0x01, 0x65, 0x01, 0xcd, 0x12, 0x2a, 0xc0, 0x8c, 0x74, 0x76, 0xcb, 0xc8, 0xd8, 0x53, 0x9e, 0x65, 0x74, 0x24, - 0x69, 0x02, 0x56, 0x0a, 0x23, 0x32, 0x9c, 0xf2, 0x5c, 0x96, 0x85, 0x15, 0xf4, 0xcc, 0x81, 0x9e, 0x85, 0xa3, 0x38, - 0x4d, 0x03, 0x6d, 0x91, 0xcc, 0xf8, 0x15, 0xdd, 0x02, 0x75, 0xb7, 0x06, 0x72, 0x39, 0x0c, 0x75, 0x86, 0xa1, 0x61, - 0x3e, 0x4f, 0xd9, 0x88, 0x96, 0x82, 0xeb, 0x2c, 0x64, 0x59, 0x42, 0x6f, 0x80, 0x8f, 0xa0, 0x5e, 0xaf, 0xd7, 0xc2, - 0x6d, 0x54, 0x68, 0x84, 0x2f, 0x37, 0x10, 0x7b, 0x87, 0xc8, 0x04, 0x22, 0x23, 0xbd, 0xe5, 0x36, 0x7e, 0x40, 0x91, - 0x23, 0x27, 0x99, 0xb5, 0xac, 0x34, 0x6f, 0x46, 0x38, 0xa1, 0x29, 0x95, 0xd4, 0xf2, 0x72, 0xd0, 0x9f, 0xf5, 0xd1, - 0x7d, 0x57, 0xe2, 0xaf, 0x24, 0x27, 0x7b, 0xca, 0xec, 0x9e, 0xe7, 0xa5, 0xa5, 0x5e, 0x6d, 0x4f, 0x85, 0xed, 0xbe, - 0xd4, 0xdb, 0x13, 0x4b, 0x19, 0x8f, 0xa6, 0xda, 0x44, 0x0f, 0x36, 0x96, 0x54, 0x8d, 0x61, 0xf8, 0x7a, 0x79, 0x88, - 0x3e, 0x58, 0x30, 0xb7, 0xa1, 0xe0, 0xcc, 0x30, 0x05, 0x0a, 0x56, 0x9f, 0xde, 0xb6, 0xd3, 0x38, 0x4d, 0x2f, 0xe3, - 0xd1, 0xc7, 0x3a, 0xf5, 0x57, 0x64, 0x40, 0xd6, 0xb9, 0xb1, 0x53, 0xe5, 0xb0, 0x2c, 0x77, 0xdd, 0x96, 0x4b, 0xd7, - 0x0e, 0x4a, 0xb0, 0xd7, 0xaa, 0xc8, 0xbe, 0xbe, 0xd1, 0x3b, 0xa9, 0x5d, 0x41, 0xc4, 0xcc, 0xca, 0x02, 0xe0, 0x02, - 0x9f, 0xa4, 0x38, 0xcb, 0x0f, 0x0c, 0xdd, 0x81, 0xad, 0x51, 0xac, 0x01, 0x22, 0xd1, 0xb2, 0x48, 0x58, 0xbe, 0x1b, - 0x03, 0x7f, 0x08, 0x94, 0xcf, 0x9d, 0x19, 0xee, 0x0b, 0x68, 0xc9, 0xe3, 0x8c, 0xca, 0x5c, 0x42, 0x66, 0xb4, 0x09, - 0xcb, 0x68, 0xfe, 0x06, 0x9a, 0x8b, 0xa2, 0xf7, 0xb7, 0xba, 0x0a, 0x74, 0x32, 0x80, 0x22, 0xef, 0xba, 0xca, 0x44, - 0x8d, 0x02, 0x0c, 0x4f, 0x65, 0x4a, 0xe4, 0x66, 0x35, 0xe3, 0xd1, 0xa8, 0xeb, 0xda, 0xfe, 0x36, 0x2c, 0x97, 0x93, - 0x20, 0x08, 0x72, 0xb0, 0xdf, 0xac, 0x5e, 0x5f, 0x2d, 0x22, 0xdf, 0x58, 0x44, 0x1e, 0x3a, 0x46, 0x16, 0xaa, 0x68, - 0xd9, 0xe9, 0x1e, 0xfd, 0x15, 0xb9, 0x8d, 0x40, 0x59, 0x0d, 0x81, 0x3f, 0xa3, 0x92, 0xdd, 0xa6, 0x44, 0x62, 0x6e, - 0x0c, 0x1c, 0x43, 0x69, 0xc0, 0x30, 0xaa, 0x2e, 0x19, 0xd2, 0x47, 0xa3, 0x66, 0xec, 0x66, 0x98, 0xa3, 0x35, 0xcd, - 0xbe, 0x28, 0x0c, 0x8e, 0x28, 0x32, 0x7b, 0x53, 0x53, 0x89, 0x1d, 0xac, 0xe0, 0x8c, 0x18, 0x35, 0x58, 0x6b, 0x3d, - 0xeb, 0xb8, 0x29, 0xc7, 0x85, 0x83, 0x5a, 0xa1, 0xa6, 0xa6, 0x4f, 0x5a, 0xc5, 0x2a, 0x43, 0x78, 0x6a, 0x35, 0x52, - 0x5e, 0xad, 0x9b, 0x10, 0xdf, 0x7a, 0x23, 0xfc, 0xfe, 0xb2, 0x66, 0x12, 0x46, 0x4e, 0xb3, 0x22, 0x02, 0x96, 0xca, - 0xb7, 0xa1, 0x7b, 0x1b, 0xcd, 0xd4, 0xc6, 0x71, 0x10, 0xce, 0x5d, 0x84, 0x3b, 0x98, 0xcd, 0x34, 0xe7, 0xca, 0x86, - 0x64, 0x5a, 0xef, 0x1b, 0x50, 0xcc, 0xf5, 0x3e, 0x6c, 0x20, 0x71, 0x5d, 0xf1, 0x54, 0x24, 0x08, 0x06, 0x6c, 0x0e, - 0xca, 0x9d, 0x2b, 0x1f, 0x02, 0x80, 0x9d, 0xad, 0x56, 0x1b, 0x44, 0xb7, 0x55, 0xff, 0x44, 0x61, 0x65, 0x14, 0xae, - 0x56, 0xd7, 0x12, 0x05, 0x46, 0xf3, 0xc5, 0x14, 0xf5, 0x2d, 0xc7, 0x3d, 0x79, 0x05, 0xad, 0x94, 0x22, 0x5a, 0x95, - 0x94, 0x26, 0x43, 0x9d, 0x66, 0xeb, 0xfb, 0x24, 0x1d, 0xb6, 0x7d, 0xba, 0xc1, 0xbd, 0x54, 0xa1, 0x11, 0xd3, 0xd5, - 0x92, 0x4f, 0xcd, 0xd0, 0x0c, 0x21, 0x14, 0xe5, 0xca, 0x8a, 0xd9, 0xdb, 0x66, 0x58, 0x1e, 0x1c, 0xe4, 0xce, 0x40, - 0xe7, 0x25, 0x9b, 0xf8, 0x29, 0x00, 0x91, 0x9c, 0xdf, 0x66, 0x4a, 0x77, 0xf9, 0xc9, 0x0a, 0xa1, 0x0d, 0xb3, 0xb4, - 0xd5, 0x05, 0x6b, 0x3c, 0xbe, 0x8e, 0x99, 0xf4, 0xca, 0x51, 0xb4, 0x35, 0x1e, 0x50, 0xb4, 0x34, 0xaa, 0x46, 0x28, - 0x28, 0x28, 0x8f, 0xc0, 0x13, 0xac, 0x0a, 0xad, 0xe9, 0x7e, 0x34, 0xa5, 0xe0, 0x08, 0xb6, 0x5a, 0x44, 0x69, 0x17, - 0xee, 0x19, 0x29, 0x62, 0x06, 0xde, 0x0e, 0x7b, 0xb1, 0xde, 0xbd, 0x66, 0x07, 0xcc, 0xa9, 0x18, 0x73, 0x31, 0xb3, - 0x75, 0xc5, 0xda, 0xb3, 0xe1, 0x8c, 0x6c, 0x1c, 0x6c, 0x1d, 0xdb, 0xa8, 0xff, 0xdd, 0x35, 0xa3, 0xbb, 0x32, 0xd7, - 0x6b, 0xa2, 0xb4, 0x94, 0xbe, 0xda, 0x1f, 0x68, 0x29, 0x33, 0x77, 0xcd, 0x7b, 0xe3, 0x4c, 0xed, 0x6a, 0x87, 0xc9, - 0x5e, 0xbb, 0x5b, 0xda, 0x7c, 0x96, 0x1a, 0xba, 0xda, 0xb1, 0x61, 0x44, 0x2a, 0x5f, 0xa4, 0x89, 0x01, 0x96, 0x21, - 0x4c, 0x0d, 0x1d, 0x5d, 0xb3, 0x34, 0xad, 0x4a, 0x7f, 0x0d, 0x5f, 0xcf, 0x0d, 0x5f, 0xcf, 0x2c, 0x5f, 0x07, 0x4e, - 0x01, 0x7c, 0x5d, 0x0f, 0x57, 0x75, 0xcf, 0x36, 0x4e, 0x67, 0xa6, 0x39, 0x7a, 0xae, 0xec, 0x68, 0x98, 0x6f, 0x61, - 0x21, 0x40, 0xa5, 0xe6, 0xf5, 0x31, 0x30, 0x4e, 0x18, 0x30, 0x00, 0xb5, 0x0b, 0x93, 0xba, 0x2e, 0x8a, 0x8f, 0x01, - 0xc2, 0x79, 0x41, 0x4b, 0xca, 0x3e, 0x79, 0x01, 0x4e, 0x3a, 0x67, 0x39, 0x20, 0xc4, 0x54, 0xf1, 0xaf, 0x52, 0xa2, - 0xec, 0xea, 0x98, 0x59, 0x5d, 0x6e, 0x57, 0x07, 0x9c, 0xbe, 0x5a, 0x5d, 0x72, 0x37, 0xaf, 0x57, 0xcb, 0x63, 0xe5, - 0xf2, 0xaa, 0xfd, 0x5e, 0xad, 0x82, 0xb5, 0x12, 0xf0, 0xdf, 0x1b, 0x13, 0x45, 0x94, 0xa3, 0x03, 0x0f, 0x70, 0x31, - 0x03, 0x05, 0x85, 0x5e, 0x74, 0x29, 0xe2, 0x5e, 0x7d, 0xca, 0xc1, 0xa3, 0xdc, 0xf4, 0xba, 0xff, 0x29, 0x9f, 0xcd, - 0x41, 0x1b, 0x5b, 0x23, 0xe9, 0x09, 0x35, 0x13, 0x56, 0xf5, 0xc5, 0x96, 0xb2, 0x5a, 0x1f, 0x75, 0x1e, 0x6b, 0xd4, - 0x54, 0xda, 0xcb, 0x7b, 0xad, 0x62, 0x51, 0x16, 0x95, 0x8c, 0x63, 0x9b, 0x53, 0xe5, 0x74, 0xdd, 0x25, 0x63, 0x2b, - 0xde, 0x06, 0x4c, 0xf3, 0x61, 0x06, 0xbc, 0xce, 0x61, 0x3f, 0x96, 0xdc, 0xdd, 0xfd, 0x2f, 0x2a, 0xe4, 0x2c, 0x8b, - 0x35, 0xf4, 0x2d, 0x8b, 0xe2, 0x44, 0x1b, 0xd9, 0xf8, 0x64, 0xb7, 0x35, 0x5c, 0xd5, 0x19, 0x63, 0x71, 0x30, 0xc4, - 0x27, 0x9b, 0xaa, 0x23, 0x59, 0xce, 0x78, 0x42, 0x23, 0x9f, 0xcf, 0x69, 0xe6, 0x17, 0xe0, 0x55, 0x35, 0x7b, 0x3f, - 0x92, 0xc1, 0xf2, 0x5d, 0xdd, 0xbd, 0x1a, 0x9d, 0x14, 0xe0, 0xfd, 0xfa, 0x62, 0xd3, 0xf1, 0xfa, 0x2d, 0x15, 0xb9, - 0x52, 0x44, 0x4b, 0x9d, 0xf6, 0x8b, 0x4a, 0x2c, 0x7d, 0x11, 0xed, 0x6c, 0x5f, 0x99, 0x20, 0x7e, 0x3b, 0x7c, 0x1c, - 0x1e, 0xf9, 0x48, 0xb9, 0x85, 0xbf, 0x32, 0x07, 0xfe, 0xb9, 0x75, 0x0b, 0xbf, 0x20, 0xcf, 0xeb, 0x5e, 0xe1, 0x44, - 0x92, 0x17, 0xfd, 0x17, 0xd6, 0x62, 0xe6, 0x29, 0x1b, 0xdd, 0x06, 0x7e, 0xca, 0x64, 0x13, 0x42, 0x6f, 0x3e, 0x5e, - 0xea, 0x0a, 0x70, 0x29, 0x2a, 0x77, 0x76, 0x61, 0x6d, 0x3d, 0x2c, 0x25, 0xf1, 0xf7, 0x53, 0x26, 0xf7, 0x7d, 0x3c, - 0x23, 0x17, 0xf0, 0x63, 0x7f, 0x19, 0xbc, 0x8e, 0xe5, 0x34, 0x14, 0x71, 0x96, 0xf0, 0x59, 0x80, 0x1a, 0xbe, 0x8f, - 0xc2, 0x5c, 0xd9, 0x1b, 0x9f, 0xa3, 0x62, 0xff, 0x02, 0xdf, 0x48, 0xe2, 0xf7, 0xfd, 0xc6, 0x0c, 0xbf, 0x91, 0xe4, - 0xe2, 0x78, 0x7f, 0x79, 0x23, 0x8b, 0xde, 0x05, 0xbe, 0x29, 0x3d, 0xf6, 0xf8, 0x6b, 0x12, 0x20, 0xd2, 0xbb, 0x31, - 0xd0, 0x9c, 0xf2, 0x99, 0xf6, 0xdc, 0xfb, 0x08, 0x7f, 0x80, 0xb8, 0x8a, 0xa8, 0xb8, 0x8d, 0x09, 0xad, 0xec, 0x11, - 0x9f, 0x2b, 0x17, 0x81, 0x7f, 0x70, 0xe0, 0x94, 0x95, 0xaa, 0x02, 0x3e, 0x91, 0xa4, 0x66, 0x90, 0xe3, 0xf7, 0x2a, - 0x42, 0x73, 0x22, 0x03, 0x81, 0xec, 0x30, 0x81, 0xf5, 0x43, 0x9b, 0xa3, 0x29, 0x06, 0xda, 0xc3, 0x10, 0x32, 0x49, - 0x45, 0x2c, 0xb9, 0x18, 0x22, 0x57, 0xfd, 0xc0, 0x7f, 0x23, 0x17, 0x03, 0xef, 0x3f, 0xfd, 0xd3, 0x8f, 0xe3, 0x1f, - 0xc5, 0xf0, 0x02, 0xbf, 0x25, 0x87, 0xc7, 0x41, 0x3f, 0x0a, 0xf6, 0x9a, 0xcd, 0xd5, 0x8f, 0x87, 0x83, 0x7f, 0xc4, - 0xcd, 0x5f, 0x4e, 0x9a, 0x3f, 0x0c, 0xd1, 0x2a, 0xf8, 0xf1, 0xb0, 0x3f, 0x30, 0x4f, 0x83, 0x7f, 0xf4, 0x7e, 0xcc, - 0x87, 0x7f, 0xd6, 0x85, 0xfb, 0x08, 0x1d, 0x4e, 0xf0, 0x42, 0x92, 0xc3, 0x66, 0xb3, 0x77, 0x38, 0xc1, 0x73, 0x49, - 0x0e, 0xe1, 0xff, 0x4b, 0xf2, 0x8e, 0x4e, 0x5e, 0xdc, 0xcc, 0x83, 0x8b, 0xde, 0x6a, 0x7f, 0xf9, 0xb7, 0x02, 0x46, - 0x1d, 0xfc, 0xe3, 0xc7, 0x1f, 0x73, 0xff, 0x41, 0x8f, 0x1c, 0x0e, 0x1b, 0x28, 0x80, 0xd2, 0x3f, 0x13, 0xf5, 0x6f, - 0xd0, 0x8f, 0x06, 0xff, 0x30, 0x50, 0xf8, 0x0f, 0x7e, 0xbc, 0x38, 0xee, 0x91, 0xe1, 0x2a, 0xf0, 0x57, 0x0f, 0xd0, - 0x0a, 0xa1, 0xd5, 0x3e, 0xba, 0xc0, 0xfe, 0xc4, 0x47, 0x78, 0x22, 0xc9, 0xe1, 0x83, 0xc3, 0x09, 0xbe, 0x92, 0xe4, - 0xd0, 0x3f, 0x9c, 0xe0, 0x17, 0x92, 0x1c, 0xfe, 0x23, 0xe8, 0x47, 0xda, 0xc3, 0xb6, 0x52, 0xee, 0x8d, 0x15, 0x04, - 0x37, 0x62, 0x41, 0xe3, 0x95, 0x64, 0x32, 0xa5, 0x68, 0xff, 0x90, 0xe1, 0x33, 0x85, 0xa6, 0x40, 0x82, 0x13, 0x06, - 0x6c, 0xbb, 0x60, 0x79, 0x0e, 0x9b, 0x0d, 0x34, 0xb3, 0x1f, 0x09, 0xac, 0xfd, 0x00, 0x79, 0x24, 0xf1, 0x55, 0x9c, - 0x2e, 0x68, 0x1e, 0xd1, 0x02, 0xe1, 0x11, 0x39, 0x93, 0x41, 0x1b, 0xe1, 0x77, 0x12, 0x7e, 0x74, 0x10, 0x3e, 0x33, - 0x01, 0x4c, 0x38, 0xc8, 0x9a, 0xa8, 0x32, 0xae, 0x35, 0x16, 0x1f, 0xe1, 0xf9, 0x96, 0x4a, 0x39, 0x05, 0xef, 0x02, - 0xc2, 0xe3, 0x5a, 0xb8, 0x13, 0x5f, 0x13, 0x4b, 0x12, 0xef, 0x05, 0xa5, 0xdf, 0xc5, 0xe9, 0x47, 0x2a, 0x82, 0x1b, - 0xdc, 0xee, 0x7c, 0x8e, 0x95, 0x0b, 0x7a, 0xaf, 0x8d, 0xba, 0x65, 0xac, 0xea, 0x54, 0xea, 0x18, 0x01, 0x08, 0xd9, - 0xba, 0x2f, 0x06, 0x76, 0x7c, 0x4f, 0x6c, 0x38, 0xac, 0x44, 0x7c, 0xed, 0xa3, 0x7a, 0x5c, 0x94, 0x65, 0x57, 0x71, - 0xca, 0x12, 0x4f, 0xd2, 0xd9, 0x3c, 0x8d, 0x25, 0xf5, 0xcc, 0x7a, 0xbd, 0x18, 0x06, 0xf2, 0x4b, 0x95, 0x21, 0x71, - 0x0c, 0xce, 0xc4, 0x06, 0x9c, 0xe0, 0xac, 0x04, 0x10, 0x9d, 0x32, 0x6a, 0xc7, 0xeb, 0x2a, 0xf8, 0xb5, 0x1e, 0xdf, - 0x6b, 0xb6, 0xc1, 0x11, 0x36, 0x54, 0xe2, 0x39, 0xc7, 0x19, 0x01, 0x21, 0xda, 0xe9, 0xfb, 0xc7, 0xf9, 0xd5, 0xa4, - 0xe7, 0x43, 0x6c, 0x86, 0x93, 0xb7, 0xca, 0x2f, 0x04, 0x0d, 0xa6, 0xa4, 0xd5, 0x9d, 0x1e, 0xd3, 0xee, 0xb4, 0xd1, - 0xb0, 0x3a, 0x74, 0x4a, 0xc4, 0x60, 0xaa, 0xbb, 0xc7, 0x38, 0xc1, 0x0b, 0xd2, 0x6c, 0xe3, 0x09, 0x69, 0xa9, 0x2e, - 0xdd, 0xc9, 0x71, 0x6a, 0xa6, 0x39, 0x38, 0x08, 0x78, 0x98, 0xc6, 0xb9, 0xfc, 0x12, 0x8c, 0x7d, 0x32, 0xc1, 0x09, - 0xe1, 0x21, 0xbd, 0xa1, 0xa3, 0x20, 0x45, 0x38, 0x31, 0x9c, 0x06, 0x75, 0xd1, 0x84, 0x38, 0xcd, 0xc0, 0x88, 0x20, - 0x6f, 0xfb, 0xc9, 0xa0, 0x3d, 0x24, 0x84, 0xf8, 0x7b, 0xcd, 0xa6, 0xdf, 0xe7, 0x64, 0x21, 0x23, 0x28, 0x71, 0x54, - 0x65, 0x32, 0x87, 0xa2, 0x8e, 0x53, 0x14, 0xbc, 0x90, 0xa1, 0xa4, 0xb9, 0x0c, 0xa0, 0x18, 0xcc, 0xff, 0xdc, 0x12, - 0xb6, 0x7f, 0x7c, 0xe8, 0x37, 0xa0, 0x54, 0x11, 0x27, 0xc2, 0x9c, 0x5c, 0xa2, 0x28, 0x19, 0x1c, 0x0d, 0x5d, 0xfe, - 0xaf, 0x0a, 0x61, 0xf2, 0xcb, 0x7e, 0x32, 0x68, 0xa9, 0xc9, 0x7b, 0x7e, 0x3f, 0xe0, 0x24, 0xd7, 0x0a, 0x5a, 0x3f, - 0x8f, 0xde, 0xaa, 0xa5, 0xa2, 0xc8, 0x00, 0x67, 0xe6, 0x5d, 0x90, 0x66, 0x27, 0x0a, 0x16, 0xee, 0x22, 0x9a, 0x30, - 0x99, 0xc1, 0x02, 0x8e, 0x09, 0xb4, 0xc7, 0x9c, 0xc0, 0x8c, 0x55, 0xb7, 0xcb, 0xc8, 0x3c, 0x3f, 0xf0, 0x1f, 0xf4, - 0xaf, 0x64, 0x34, 0x91, 0x7a, 0xfa, 0x2b, 0xb9, 0x5a, 0xc1, 0xff, 0x13, 0xd9, 0xe7, 0xe4, 0x52, 0x15, 0x2d, 0x4c, - 0xd1, 0x1c, 0x8a, 0xde, 0x46, 0x00, 0x2a, 0xce, 0x4b, 0x25, 0x4b, 0xef, 0xc9, 0x15, 0x51, 0xb0, 0x1f, 0x1c, 0x88, - 0xc1, 0xb4, 0xd1, 0x1e, 0x82, 0x7f, 0x5f, 0xc8, 0xfc, 0x3b, 0x26, 0xa7, 0x81, 0x7f, 0xd8, 0xf3, 0x51, 0xdf, 0xf7, - 0x60, 0x6b, 0xbb, 0x59, 0x83, 0x68, 0x0c, 0xa7, 0x8d, 0x37, 0x32, 0x5a, 0xf4, 0x48, 0xab, 0x1f, 0x30, 0xe3, 0xcf, - 0x43, 0x38, 0x35, 0x8c, 0xb3, 0x85, 0x17, 0xa8, 0x21, 0x65, 0xc3, 0x3e, 0x2f, 0x50, 0x63, 0xd6, 0xb8, 0x42, 0x51, - 0xda, 0x98, 0x35, 0x82, 0x05, 0x21, 0xa4, 0xd9, 0x29, 0xbb, 0x59, 0xe9, 0x37, 0x45, 0xd1, 0x95, 0x75, 0x76, 0x0e, - 0xd4, 0x71, 0xc8, 0x1a, 0x81, 0x18, 0xd0, 0xe1, 0x6a, 0xe5, 0x1f, 0xf7, 0x7b, 0x3e, 0x6a, 0x04, 0x96, 0xd0, 0x0e, - 0x2d, 0xa5, 0x21, 0x84, 0xd9, 0xb0, 0x30, 0xa1, 0xa4, 0x97, 0xb5, 0xb0, 0xd1, 0xb2, 0x3a, 0xec, 0x0e, 0x0f, 0xa0, - 0x45, 0x69, 0xc7, 0x68, 0x7d, 0x75, 0x0e, 0xcb, 0xb4, 0xc4, 0x9c, 0x91, 0x16, 0xe6, 0xc4, 0xfa, 0xae, 0xa7, 0x44, - 0x56, 0x04, 0x9f, 0x92, 0xaa, 0x39, 0x1e, 0xc4, 0x38, 0x19, 0x92, 0xd7, 0xda, 0x1e, 0xe9, 0x5a, 0xbf, 0x38, 0x4d, - 0xc9, 0xcb, 0xb5, 0xe8, 0x6d, 0x0c, 0xb1, 0x95, 0xeb, 0x70, 0xb4, 0x10, 0x82, 0x66, 0xf2, 0x0d, 0x4f, 0x8c, 0x9a, - 0x46, 0x53, 0xb0, 0x94, 0x20, 0x2c, 0x8b, 0x41, 0x47, 0xeb, 0xd8, 0x93, 0xb1, 0xd8, 0xa8, 0x9e, 0x90, 0x85, 0x56, - 0x9f, 0x54, 0xb0, 0xb6, 0x3b, 0x31, 0x76, 0x71, 0x80, 0xf0, 0xc2, 0x44, 0x71, 0x83, 0x30, 0x0c, 0x27, 0xe1, 0x08, - 0xaa, 0x61, 0x82, 0x1c, 0x15, 0xea, 0x1c, 0x05, 0x39, 0xb9, 0x0e, 0x33, 0x7a, 0xa3, 0x66, 0x0d, 0x50, 0x25, 0x99, - 0xed, 0xf1, 0x3a, 0x9e, 0x76, 0x15, 0xbb, 0xc9, 0xc3, 0x8c, 0x27, 0x14, 0xd0, 0x03, 0x71, 0x7b, 0x53, 0x34, 0x8d, - 0x73, 0x37, 0x3e, 0x55, 0xc1, 0x37, 0x70, 0x9d, 0xd7, 0x13, 0xf0, 0xf8, 0x2a, 0x5d, 0xab, 0x6c, 0xac, 0xdd, 0xe0, - 0x08, 0xb1, 0x71, 0x30, 0x09, 0x21, 0xae, 0xa7, 0x48, 0x48, 0x82, 0x29, 0x37, 0x71, 0x89, 0x6a, 0x56, 0x8e, 0x79, - 0x45, 0x92, 0x01, 0x6f, 0x34, 0x94, 0x17, 0x7a, 0xa1, 0x49, 0x62, 0x82, 0xf0, 0x55, 0x79, 0xb6, 0x6c, 0xbb, 0xb7, - 0x92, 0xd4, 0xa7, 0x0a, 0xae, 0xea, 0xee, 0xdc, 0x86, 0x94, 0x48, 0x79, 0x0a, 0x65, 0x30, 0x43, 0xf8, 0x19, 0x39, - 0x0c, 0x06, 0x61, 0xff, 0x2f, 0x43, 0xd4, 0x0f, 0xc2, 0x3f, 0xa3, 0x43, 0xcd, 0x39, 0xae, 0x50, 0x37, 0xd5, 0x73, - 0x2c, 0x55, 0xfc, 0xb2, 0x8d, 0x95, 0x27, 0x31, 0xca, 0x70, 0x16, 0xcf, 0x68, 0xf4, 0x0c, 0x0e, 0xb9, 0x25, 0x9c, - 0xb7, 0x12, 0x03, 0x25, 0x45, 0xcf, 0x0c, 0x2f, 0x09, 0xfd, 0xfe, 0x2b, 0x59, 0x3e, 0xf5, 0xfd, 0xfe, 0xf3, 0xea, - 0xe9, 0x2f, 0x7e, 0xff, 0x17, 0x19, 0xfd, 0x5c, 0x18, 0x6f, 0x77, 0x6d, 0x8e, 0xc7, 0x76, 0x8e, 0x42, 0x6f, 0x8d, - 0x83, 0xbb, 0x05, 0xda, 0x74, 0x74, 0x4c, 0x50, 0xc1, 0xc6, 0x25, 0x33, 0xca, 0x43, 0x19, 0x4f, 0x00, 0xa9, 0xce, - 0x1e, 0xe4, 0x6e, 0x5c, 0xbf, 0x5a, 0x31, 0x90, 0x8a, 0xa5, 0x57, 0x40, 0xe6, 0xa4, 0xd7, 0x42, 0xcb, 0x5a, 0x5b, - 0xa5, 0x33, 0xd5, 0xe3, 0xe8, 0x25, 0x9f, 0xbe, 0x22, 0xad, 0xee, 0xd5, 0xf1, 0xa4, 0x7b, 0xd5, 0x68, 0xa0, 0xdc, - 0x92, 0xd6, 0x62, 0x70, 0x35, 0xc4, 0x5f, 0x83, 0x53, 0xcf, 0xa5, 0x25, 0x5c, 0x5b, 0x5e, 0xc7, 0x2c, 0xaf, 0xd1, - 0xc8, 0x0a, 0xd4, 0x75, 0xba, 0x4e, 0x74, 0xd7, 0xa2, 0xd0, 0x38, 0x59, 0x27, 0xb5, 0xa7, 0x48, 0x95, 0x40, 0x32, - 0x14, 0x21, 0xe4, 0x46, 0xa2, 0xad, 0xa3, 0xc2, 0x98, 0xd0, 0x5d, 0x9d, 0x59, 0x60, 0x9f, 0x5a, 0x4a, 0x04, 0x80, - 0x05, 0xe8, 0x5a, 0x7a, 0x82, 0x67, 0x78, 0xd1, 0x68, 0x2b, 0x32, 0x6f, 0xb6, 0xbb, 0xf5, 0xb1, 0x9e, 0x54, 0x63, - 0xe1, 0x45, 0x83, 0xcc, 0x4a, 0x2c, 0x15, 0x59, 0xa3, 0x51, 0xd4, 0x83, 0x9d, 0xf6, 0xe4, 0xd6, 0x02, 0x10, 0x37, - 0xeb, 0x49, 0x19, 0x56, 0xc2, 0x56, 0x32, 0x95, 0x85, 0x2c, 0xcb, 0xa8, 0x00, 0x29, 0x4a, 0x24, 0x66, 0x45, 0x51, - 0x49, 0x76, 0x10, 0xa3, 0x98, 0x12, 0x01, 0x9c, 0x47, 0xd9, 0x5d, 0x38, 0xc3, 0x1c, 0x4f, 0x15, 0xdf, 0x20, 0x84, - 0x9c, 0xd9, 0x74, 0x16, 0xa9, 0x78, 0x50, 0x4a, 0x98, 0x23, 0x93, 0x72, 0x42, 0xc3, 0xf3, 0xfd, 0x53, 0x7e, 0xa7, - 0x4d, 0x36, 0x60, 0xc3, 0x48, 0x35, 0x4b, 0x0d, 0xe7, 0x8a, 0xc9, 0x87, 0x40, 0xa2, 0x32, 0x3a, 0x12, 0x2a, 0x06, - 0xf8, 0x9c, 0x09, 0xaa, 0x74, 0xf0, 0x7d, 0x6b, 0xf7, 0xa5, 0x75, 0x05, 0x32, 0x75, 0xbd, 0x37, 0x80, 0xc8, 0x18, - 0x9c, 0x3b, 0x19, 0xd9, 0x68, 0x76, 0xbe, 0x7f, 0xf2, 0x76, 0x9b, 0x0d, 0xbc, 0x5a, 0x19, 0xeb, 0x57, 0xe9, 0x36, - 0x38, 0xae, 0x20, 0x4d, 0xcd, 0x8f, 0x28, 0x48, 0x95, 0x8a, 0x14, 0x07, 0x02, 0xa8, 0xe8, 0x7c, 0xff, 0xe4, 0x7d, - 0x20, 0x94, 0x6f, 0x09, 0x61, 0x77, 0xd9, 0x01, 0x27, 0xc1, 0x94, 0x50, 0xa4, 0xd7, 0x5e, 0xb2, 0x2e, 0xee, 0x08, - 0xf0, 0x68, 0xaa, 0x2a, 0xc1, 0x82, 0x18, 0xb0, 0x21, 0x49, 0x0d, 0x06, 0x48, 0x8a, 0x70, 0x5a, 0xb3, 0xcb, 0x08, - 0x6c, 0x80, 0x9a, 0xeb, 0x0c, 0x76, 0x22, 0xd4, 0xaa, 0x1f, 0xc2, 0xa9, 0x9a, 0x55, 0x16, 0x5a, 0x78, 0x3c, 0xdb, - 0xc8, 0x4a, 0xab, 0xcc, 0xd1, 0x6f, 0xc1, 0x76, 0xb2, 0x0f, 0x6f, 0x88, 0xb5, 0x24, 0x4c, 0xc1, 0x73, 0x9b, 0x3e, - 0x76, 0xbe, 0x7f, 0xf2, 0xda, 0x64, 0x90, 0xcd, 0x63, 0xcb, 0xef, 0x37, 0x4c, 0xcc, 0x93, 0xd7, 0x61, 0x55, 0xab, - 0x1a, 0x9f, 0xef, 0x9f, 0x7c, 0xd8, 0xd6, 0x0c, 0xca, 0x8b, 0x45, 0x65, 0xe3, 0x2b, 0xf8, 0x96, 0x34, 0x8d, 0x96, - 0x46, 0x38, 0x44, 0xac, 0xc0, 0x4a, 0x20, 0x45, 0x79, 0x51, 0xba, 0x46, 0x9e, 0xe3, 0x8c, 0xa8, 0x30, 0x50, 0x7d, - 0xd7, 0x8c, 0x9a, 0xc7, 0x78, 0x76, 0x36, 0xe2, 0x73, 0xba, 0x23, 0x36, 0x74, 0x83, 0x42, 0x36, 0x83, 0xd4, 0x19, - 0x05, 0x3a, 0xc3, 0x7b, 0x2d, 0xd4, 0xad, 0x8b, 0xaf, 0x4c, 0x11, 0x29, 0xaf, 0xc9, 0x16, 0x3c, 0x25, 0x2d, 0x9c, - 0x92, 0x16, 0x8e, 0x49, 0x3e, 0x68, 0x69, 0x01, 0xd1, 0x8d, 0xcb, 0x71, 0xb5, 0x98, 0x81, 0xac, 0x30, 0x73, 0x5a, - 0xb5, 0x00, 0x4e, 0xba, 0xb1, 0xf2, 0x3d, 0x2a, 0x99, 0x9e, 0x28, 0xb2, 0x78, 0x1f, 0x70, 0xcc, 0xd5, 0xc0, 0x67, - 0xec, 0x32, 0x85, 0xc4, 0x12, 0x58, 0x15, 0x96, 0x28, 0x2a, 0x9b, 0xb6, 0x4d, 0xd3, 0x38, 0x54, 0xfb, 0xc4, 0x71, - 0x1c, 0x02, 0xe7, 0xc6, 0xb1, 0xc9, 0xc3, 0xc9, 0x37, 0xbb, 0x3c, 0x3e, 0x38, 0x08, 0x74, 0xa7, 0x2f, 0x65, 0xc0, - 0x6d, 0x7d, 0x15, 0xb9, 0xfb, 0x56, 0xf3, 0x8a, 0x04, 0x29, 0xf8, 0x1b, 0x8d, 0x74, 0x58, 0x40, 0x18, 0x3a, 0x88, - 0xeb, 0x18, 0xb4, 0xc0, 0x2b, 0x5d, 0xaf, 0xbe, 0xfc, 0x46, 0xa3, 0x8c, 0xd2, 0xd6, 0xb1, 0x75, 0x83, 0xb3, 0xe2, - 0x2a, 0x28, 0x53, 0x7f, 0x5a, 0x1b, 0xf9, 0x52, 0x16, 0x04, 0xc4, 0x5c, 0x9a, 0x65, 0x76, 0x31, 0xce, 0x91, 0x60, - 0xd0, 0xee, 0x4b, 0x93, 0xb5, 0x80, 0x55, 0x76, 0x95, 0x69, 0x64, 0xd9, 0x59, 0x07, 0x45, 0xb6, 0x11, 0x44, 0xa5, - 0xa0, 0x51, 0xa3, 0x30, 0xe4, 0xfd, 0x7e, 0x33, 0xe7, 0x12, 0xe7, 0xc8, 0x38, 0xb9, 0x14, 0x14, 0x0a, 0x59, 0x9d, - 0x12, 0x29, 0x2f, 0xc9, 0x7c, 0x37, 0xc9, 0x9f, 0x38, 0x24, 0xff, 0x8c, 0x50, 0x87, 0xfc, 0xb5, 0x8b, 0x23, 0xe4, - 0xc6, 0xb9, 0x90, 0xdb, 0xaa, 0xd3, 0x39, 0x01, 0x27, 0x5a, 0x1d, 0xa3, 0xb5, 0xb0, 0xe2, 0x0e, 0x86, 0xe2, 0x9e, - 0x10, 0xe5, 0x86, 0xc4, 0x36, 0x06, 0x1c, 0x54, 0x41, 0x35, 0x98, 0x7a, 0x9b, 0x4f, 0xcf, 0xe5, 0x80, 0x27, 0x1f, - 0xee, 0x8e, 0x87, 0x9e, 0xce, 0x37, 0x4f, 0xae, 0x93, 0xfb, 0x09, 0xab, 0x76, 0x0e, 0x6e, 0x3d, 0x13, 0x14, 0xe6, - 0x2f, 0xe3, 0xd8, 0x75, 0xe6, 0xb3, 0x76, 0x08, 0xad, 0xfc, 0x03, 0x68, 0xdb, 0x6d, 0xd5, 0x82, 0x3a, 0xc3, 0x02, - 0x3f, 0xd2, 0x19, 0xa8, 0xb1, 0xd8, 0xc1, 0x3e, 0x4e, 0x54, 0x03, 0x9a, 0x25, 0xdb, 0xab, 0x9f, 0x15, 0x86, 0x4c, - 0x34, 0x68, 0x68, 0x09, 0xfc, 0x4f, 0x93, 0x3c, 0xd0, 0x8d, 0x92, 0x0b, 0x80, 0xa0, 0xb9, 0xc2, 0x53, 0x85, 0x30, - 0xdf, 0xaf, 0xbc, 0xef, 0x2f, 0xf7, 0x08, 0x99, 0x57, 0xde, 0xc7, 0x77, 0x55, 0xea, 0x15, 0x90, 0x05, 0x8a, 0xc0, - 0x7c, 0x2c, 0x0b, 0x74, 0xf8, 0xf2, 0xcc, 0x36, 0x57, 0x26, 0x64, 0x58, 0x69, 0xdc, 0x4e, 0x68, 0x53, 0xb9, 0xe5, - 0x74, 0xbd, 0x45, 0xc3, 0x5a, 0xed, 0x3e, 0xd4, 0xbe, 0x97, 0x0a, 0x46, 0x78, 0x7e, 0xaf, 0x5a, 0xdb, 0x71, 0x8b, - 0x8f, 0xeb, 0xf9, 0x2b, 0x6b, 0x9b, 0x12, 0xb2, 0x2c, 0xa7, 0x42, 0x3e, 0xa3, 0x63, 0x2e, 0x20, 0x66, 0x51, 0xe2, - 0x04, 0x15, 0xfb, 0x8e, 0xdf, 0x4e, 0xad, 0xcf, 0x09, 0x14, 0xac, 0x2d, 0x50, 0xfd, 0xfa, 0xa8, 0x82, 0xd6, 0xe7, - 0xeb, 0xbd, 0xe6, 0x07, 0x07, 0x1f, 0x2a, 0x34, 0x19, 0x28, 0x15, 0x14, 0x0e, 0xd3, 0xd2, 0x2a, 0x8d, 0x89, 0xe4, - 0xee, 0x07, 0xa5, 0x13, 0xc0, 0x32, 0x0c, 0x97, 0xf7, 0xbc, 0x24, 0xb2, 0x98, 0xac, 0xb3, 0x78, 0xe3, 0x9c, 0x60, - 0xae, 0xe1, 0x02, 0x1c, 0x1e, 0x4c, 0x6d, 0xed, 0x2d, 0xca, 0xab, 0x64, 0xd8, 0x12, 0x86, 0x53, 0x40, 0x56, 0xa0, - 0xcc, 0x10, 0x87, 0x02, 0xb7, 0x9a, 0x25, 0xa7, 0xa0, 0x57, 0x4e, 0x71, 0x1e, 0x4e, 0x21, 0xfd, 0xb5, 0x76, 0x64, - 0x11, 0xc2, 0x3a, 0x31, 0xc7, 0x49, 0x25, 0x38, 0x79, 0xb9, 0xcd, 0xa5, 0x6c, 0x89, 0x9a, 0x2a, 0xa9, 0xa3, 0x5a, - 0xa0, 0xb2, 0x43, 0x78, 0x15, 0x30, 0xa3, 0xb8, 0xd9, 0xb8, 0x19, 0x30, 0xe0, 0x67, 0x32, 0xd0, 0xc1, 0x28, 0x90, - 0x19, 0x3c, 0x5c, 0x04, 0xb5, 0xa9, 0xbb, 0x5c, 0x75, 0xc3, 0x06, 0x71, 0x53, 0x17, 0x4d, 0x5c, 0xc5, 0xf5, 0x4e, - 0x2b, 0x5e, 0x3a, 0xd6, 0x19, 0xd4, 0xd2, 0x72, 0xc1, 0x2a, 0x91, 0xc4, 0x59, 0xfe, 0x58, 0x27, 0x45, 0x97, 0x8d, - 0x30, 0x55, 0x60, 0xbc, 0x54, 0x7b, 0x40, 0x0b, 0xa0, 0xaf, 0xe5, 0x89, 0x74, 0x76, 0xd4, 0x3a, 0xb1, 0xd5, 0x9c, - 0x8e, 0xd4, 0x7f, 0x07, 0xa9, 0x2e, 0xeb, 0x67, 0xfe, 0xa5, 0x92, 0x85, 0x0c, 0xe7, 0x35, 0xc6, 0x9e, 0x29, 0xc6, - 0x8e, 0x40, 0x4f, 0xb3, 0x89, 0xdf, 0x7d, 0x93, 0xf1, 0xc2, 0x8c, 0x94, 0x33, 0x24, 0xf6, 0x75, 0x19, 0x2d, 0x77, - 0x7e, 0xaf, 0xed, 0x46, 0xc4, 0x08, 0x64, 0x01, 0x61, 0xc3, 0xd9, 0x33, 0x84, 0xf3, 0x46, 0xa3, 0x9b, 0x1f, 0xd3, - 0xca, 0x49, 0x52, 0xc1, 0xc8, 0x20, 0xa0, 0x0b, 0x04, 0x5f, 0x93, 0xa1, 0x10, 0xf2, 0xb7, 0x99, 0xd9, 0x39, 0xf8, - 0xda, 0x4f, 0xde, 0x05, 0x2e, 0x57, 0x73, 0xdb, 0x96, 0x41, 0x53, 0x58, 0x4f, 0x50, 0x05, 0x5c, 0xbe, 0xbe, 0x3b, - 0xc1, 0x03, 0xe0, 0xde, 0x6b, 0x63, 0x48, 0x45, 0x43, 0x5d, 0xa9, 0x59, 0x42, 0x79, 0xfa, 0xba, 0xa8, 0xca, 0x4a, - 0x74, 0x27, 0xeb, 0xca, 0xca, 0x98, 0x95, 0x24, 0x2f, 0x8a, 0x9c, 0x56, 0xe1, 0xfd, 0xb5, 0xf4, 0x4b, 0x25, 0x5c, - 0x36, 0xbd, 0xed, 0xa7, 0x73, 0x22, 0xb1, 0x43, 0xa8, 0x5f, 0xef, 0x8a, 0x7d, 0x54, 0x60, 0xc2, 0xb9, 0x36, 0x42, - 0xf1, 0xe7, 0x6d, 0x42, 0x11, 0x67, 0xe6, 0xc8, 0x2b, 0x81, 0xd8, 0xbe, 0x87, 0x40, 0x34, 0x6e, 0x76, 0x2b, 0x13, - 0x41, 0x1d, 0xa9, 0xc9, 0xc4, 0xfa, 0x96, 0x92, 0x0c, 0x33, 0xb3, 0x1b, 0xbd, 0xce, 0x6a, 0xc5, 0x06, 0x2d, 0x70, - 0x23, 0xf9, 0x3e, 0xfc, 0x6c, 0xeb, 0x9f, 0x0e, 0x27, 0xd6, 0x6e, 0xe0, 0x80, 0x95, 0x26, 0x0b, 0x0a, 0x21, 0xc1, - 0x39, 0x50, 0x49, 0x59, 0x8a, 0xa6, 0x0d, 0x05, 0x19, 0x02, 0x27, 0xac, 0x0c, 0x33, 0x01, 0xc4, 0x4a, 0x56, 0x18, - 0x03, 0x32, 0xd8, 0x9a, 0xfb, 0x67, 0xcd, 0xcb, 0x4f, 0x6b, 0xa2, 0x35, 0xb9, 0xa2, 0xd5, 0x87, 0x5a, 0xbe, 0x81, - 0x81, 0xc0, 0xe8, 0x87, 0x7b, 0xca, 0x04, 0xad, 0x44, 0x39, 0x72, 0xe5, 0x10, 0x6e, 0x81, 0x13, 0x6d, 0xef, 0x83, - 0x8e, 0xf0, 0x6e, 0x91, 0x26, 0x98, 0x3b, 0x74, 0xfd, 0x92, 0xc8, 0x1a, 0x2b, 0x99, 0x12, 0x63, 0x29, 0xe1, 0x58, - 0x91, 0xa9, 0x24, 0xd9, 0xa0, 0x35, 0x04, 0x05, 0xb4, 0x9b, 0x1e, 0x67, 0x95, 0x09, 0x9c, 0x36, 0x1a, 0x28, 0xb6, - 0xb3, 0x4e, 0x07, 0xac, 0x91, 0x0e, 0x31, 0xc5, 0xa9, 0x36, 0x4c, 0xce, 0x0e, 0x0e, 0x82, 0xb8, 0x9a, 0x77, 0x90, - 0x0e, 0x11, 0xe6, 0xab, 0x55, 0xa0, 0xc0, 0x8a, 0xd1, 0x6a, 0x15, 0xbb, 0x60, 0xa9, 0x6a, 0xe8, 0x36, 0xef, 0x4b, - 0x32, 0x57, 0x02, 0x70, 0x0e, 0x10, 0x36, 0x48, 0x10, 0x1b, 0xf7, 0x5e, 0x0c, 0xee, 0xa8, 0x46, 0x36, 0x48, 0x1b, - 0xed, 0xa1, 0xc3, 0xb8, 0x06, 0xe9, 0x90, 0xc4, 0x05, 0x3f, 0x38, 0xd8, 0xcb, 0x8d, 0x88, 0xfc, 0x09, 0x44, 0xd9, - 0x4f, 0x4a, 0xb2, 0xe8, 0x01, 0xdd, 0xdd, 0x58, 0x77, 0x06, 0x94, 0x14, 0x65, 0xb6, 0xd5, 0xb6, 0xab, 0x65, 0x41, - 0x94, 0x8d, 0xb0, 0x09, 0x06, 0xf7, 0xc1, 0xb2, 0x2f, 0xc9, 0xfc, 0x95, 0x2c, 0x73, 0xac, 0x7f, 0xde, 0x9a, 0x59, - 0x1d, 0x86, 0x61, 0x2c, 0x26, 0x2a, 0x96, 0x61, 0xc3, 0xb0, 0x8a, 0xf8, 0x8f, 0x0c, 0x98, 0xce, 0xc4, 0x83, 0x72, - 0xae, 0x21, 0xd1, 0xe0, 0x5b, 0xd5, 0xc6, 0xde, 0x25, 0xf9, 0x69, 0xab, 0x97, 0x41, 0x43, 0xf2, 0xfc, 0xb7, 0x42, - 0xf2, 0xd0, 0x40, 0xa2, 0xc9, 0x63, 0x0d, 0x67, 0x3b, 0x70, 0xf1, 0x93, 0x5c, 0xc3, 0xd9, 0x6e, 0xdc, 0x5a, 0x4c, - 0xfd, 0xb2, 0x0b, 0x3e, 0x87, 0x37, 0x68, 0x40, 0xab, 0x02, 0x07, 0xca, 0x47, 0xeb, 0xba, 0x97, 0x66, 0xa5, 0x20, - 0x4c, 0x25, 0x09, 0x58, 0xfd, 0x00, 0x54, 0xda, 0xa8, 0x63, 0xf8, 0xb2, 0x68, 0x8e, 0x1c, 0x97, 0x40, 0x3d, 0x75, - 0x05, 0xc8, 0xc9, 0x78, 0xdb, 0xe7, 0x07, 0x07, 0x60, 0x1b, 0x80, 0x12, 0x17, 0x8e, 0xe2, 0xb9, 0x5c, 0x08, 0x50, - 0xa5, 0x72, 0xfb, 0x1b, 0x8a, 0xe1, 0x16, 0x88, 0x2a, 0x83, 0x1f, 0x50, 0x30, 0x8f, 0xf3, 0x9c, 0x5d, 0xe9, 0x32, - 0xf3, 0x1b, 0x73, 0x62, 0x49, 0x39, 0xd7, 0x3a, 0x61, 0x86, 0xba, 0x99, 0xa1, 0xd3, 0x3a, 0xda, 0x5e, 0x5c, 0xd1, - 0x4c, 0xbe, 0x62, 0xb9, 0xa4, 0x19, 0x2c, 0xbf, 0xa2, 0x38, 0x58, 0x51, 0x8e, 0xe0, 0xc0, 0xd6, 0x7a, 0xc5, 0x49, - 0x72, 0x67, 0x17, 0x59, 0xd7, 0x81, 0xa6, 0x71, 0x96, 0xa4, 0x7a, 0x12, 0x37, 0x9f, 0xd1, 0xe6, 0x70, 0x96, 0x2d, - 0xdd, 0x7c, 0x9a, 0x4a, 0xd9, 0x50, 0xdc, 0x3d, 0x60, 0xc4, 0x4a, 0x02, 0x2b, 0x3d, 0xef, 0xd4, 0x5a, 0x20, 0xe2, - 0xbd, 0x63, 0x13, 0xdc, 0x95, 0x60, 0xe9, 0x70, 0xd4, 0xb0, 0x0e, 0xa7, 0xa5, 0x9b, 0x2f, 0xb7, 0x5e, 0x69, 0xdb, - 0x26, 0x1c, 0x14, 0x9d, 0x3c, 0xde, 0x6d, 0x59, 0xbd, 0xb6, 0x92, 0xc3, 0x4a, 0x0b, 0x76, 0x5f, 0xc6, 0x8c, 0x96, - 0x96, 0xbc, 0x90, 0x3d, 0x8a, 0xfb, 0x92, 0x3c, 0x87, 0x3b, 0x43, 0x2f, 0xe5, 0x2c, 0x5d, 0xbb, 0x1a, 0xd3, 0xdd, - 0x2f, 0xb5, 0xff, 0x7d, 0x19, 0xbc, 0xc4, 0xef, 0x21, 0xb0, 0xfb, 0x55, 0xd5, 0x7c, 0x33, 0xa0, 0xfb, 0x55, 0x85, - 0xa0, 0xaf, 0xa2, 0x8d, 0x76, 0x4e, 0x20, 0xb7, 0x13, 0x3e, 0x0d, 0x5b, 0xbe, 0xd5, 0x96, 0x7e, 0xd6, 0x61, 0x24, - 0x9d, 0x69, 0xa9, 0xce, 0x03, 0xae, 0xf2, 0xd4, 0x20, 0x5f, 0xae, 0x6e, 0x21, 0x51, 0x93, 0x61, 0xa8, 0x75, 0xf8, - 0x5d, 0xdb, 0x63, 0x64, 0x4c, 0xa6, 0xed, 0x8c, 0xaf, 0x63, 0x21, 0xf7, 0xe1, 0x94, 0xf1, 0x8d, 0x7b, 0x78, 0x53, - 0x02, 0x1e, 0xb4, 0xfb, 0x4d, 0xe1, 0x18, 0xdb, 0xb9, 0xbe, 0x07, 0xe4, 0x8e, 0x4f, 0xb8, 0xd5, 0xdd, 0xea, 0x56, - 0xc6, 0xd7, 0x60, 0xff, 0x23, 0x3c, 0xb5, 0x97, 0xe3, 0xa8, 0xe1, 0xc0, 0x34, 0x5a, 0x16, 0xa5, 0x53, 0x80, 0x6b, - 0xe5, 0x4d, 0x20, 0xcc, 0x0b, 0x15, 0xe0, 0xfe, 0x01, 0x7f, 0x63, 0x58, 0xe2, 0xb8, 0xe4, 0x38, 0x27, 0xf7, 0xe5, - 0x88, 0x1a, 0xfc, 0x32, 0x7e, 0x0f, 0x74, 0xac, 0x28, 0xb4, 0xb0, 0x54, 0xf4, 0x9c, 0x9b, 0x85, 0xec, 0x4c, 0x4b, - 0xc5, 0xb4, 0x4c, 0xa9, 0x51, 0xd3, 0x6c, 0xc9, 0xe3, 0xb4, 0x56, 0xb6, 0x2c, 0x4f, 0x55, 0x6d, 0x5e, 0xb4, 0x03, - 0x8b, 0x55, 0x68, 0x71, 0xb5, 0x0a, 0xea, 0xa8, 0x26, 0xcc, 0x89, 0x64, 0x20, 0xcc, 0x9c, 0x8c, 0x8a, 0x9a, 0x66, - 0xad, 0xfb, 0x04, 0x68, 0x3d, 0xa1, 0xc8, 0xea, 0xe6, 0x35, 0x38, 0x5c, 0x17, 0x82, 0xee, 0xee, 0xfa, 0x14, 0xb0, - 0x5e, 0x5d, 0x39, 0x91, 0x83, 0xa1, 0x9f, 0xcb, 0x54, 0xd9, 0x2a, 0xa7, 0x75, 0x0b, 0x7e, 0xd1, 0x1d, 0xc9, 0xb2, - 0x06, 0x75, 0x9b, 0xf5, 0x4e, 0xb2, 0xd1, 0x73, 0xbe, 0x2b, 0xd9, 0xa8, 0xa6, 0xed, 0xee, 0xb5, 0xd0, 0xdd, 0x69, - 0xa9, 0x7a, 0xae, 0xed, 0x4d, 0x7e, 0xc3, 0x74, 0x6d, 0xa0, 0x4d, 0x8d, 0x66, 0xcb, 0x55, 0xce, 0x8a, 0x62, 0x5c, - 0x5e, 0x26, 0x50, 0xb9, 0x3b, 0x63, 0x4d, 0xff, 0xc6, 0x6a, 0x54, 0xd7, 0x71, 0x83, 0x1f, 0xc8, 0x24, 0xe5, 0x97, - 0x71, 0xfa, 0x1e, 0xe6, 0xab, 0x2a, 0x5f, 0xde, 0x26, 0x22, 0x96, 0xd4, 0x70, 0x97, 0x0a, 0x86, 0x1f, 0x1c, 0x18, - 0x7e, 0xd0, 0x7c, 0xba, 0xea, 0x8f, 0x97, 0xaf, 0xca, 0x01, 0xa2, 0x71, 0x61, 0x59, 0xc6, 0xb9, 0xdc, 0x3e, 0xc7, - 0x3a, 0x0b, 0x3b, 0x2f, 0x59, 0xd8, 0xb9, 0x0c, 0xd6, 0x87, 0x0a, 0x82, 0x6f, 0xb6, 0x8f, 0xb2, 0xc9, 0xd9, 0xbe, - 0xa9, 0x0e, 0xfe, 0x37, 0xd1, 0x9d, 0x7d, 0x1c, 0x2e, 0x77, 0x14, 0x1e, 0xa9, 0x74, 0x15, 0x0d, 0xf2, 0x3b, 0x48, - 0x3b, 0x90, 0xa4, 0xe7, 0xdc, 0x39, 0xa8, 0xe4, 0x94, 0x4d, 0x04, 0x0a, 0x46, 0x8b, 0x5c, 0xf2, 0x99, 0x19, 0x33, - 0x37, 0xd7, 0x8c, 0x54, 0x25, 0xb8, 0xa2, 0x55, 0xb4, 0x3d, 0xaa, 0x5f, 0xe4, 0x5a, 0x7e, 0x64, 0x59, 0x12, 0xe5, - 0xd8, 0x48, 0x91, 0x3c, 0xca, 0x0a, 0x62, 0x93, 0x8d, 0x37, 0xeb, 0xf0, 0x98, 0x65, 0x2c, 0x9f, 0x52, 0x11, 0x70, - 0xb4, 0xdc, 0x35, 0x19, 0x87, 0x80, 0x8c, 0x9e, 0x0c, 0x7f, 0x5b, 0x5d, 0xf8, 0x0b, 0x61, 0x34, 0xf0, 0x03, 0xcd, - 0xa8, 0x9c, 0xf2, 0x04, 0x12, 0x53, 0xc2, 0xa4, 0xbc, 0xd1, 0x74, 0x70, 0xb0, 0x17, 0xf8, 0xca, 0x2d, 0x01, 0x57, - 0xbf, 0xdd, 0x1a, 0xd4, 0x5f, 0xc2, 0xf5, 0x9c, 0x6a, 0x6a, 0x8a, 0x96, 0x74, 0xfd, 0x26, 0x8b, 0x0c, 0x3f, 0xd2, - 0x5b, 0x2c, 0x50, 0x51, 0x44, 0x1a, 0x6a, 0x7f, 0xcc, 0x68, 0x9a, 0xf8, 0xf8, 0x23, 0xbd, 0x8d, 0xca, 0xdb, 0xe2, - 0xea, 0x72, 0xb3, 0xda, 0x40, 0x9f, 0x5f, 0x67, 0x3e, 0xae, 0x26, 0x89, 0x96, 0x05, 0xe6, 0x82, 0x4d, 0x80, 0x38, - 0xff, 0x46, 0x6f, 0x23, 0x3d, 0x1e, 0x73, 0x2e, 0xeb, 0xa1, 0xa5, 0x45, 0x7d, 0xe8, 0x14, 0xbb, 0xdb, 0x60, 0x0c, - 0x8a, 0x81, 0xea, 0x3b, 0x24, 0xb5, 0x76, 0x95, 0x79, 0x88, 0x50, 0x71, 0xdf, 0xa5, 0xe0, 0x2f, 0x5c, 0xd1, 0x26, - 0x6b, 0xa9, 0xaf, 0x6b, 0x9d, 0x28, 0x74, 0xa8, 0x72, 0x3d, 0xce, 0x03, 0x61, 0x4f, 0x9d, 0xb9, 0x83, 0xe0, 0x38, - 0xc2, 0xbe, 0x90, 0x66, 0xd0, 0xe8, 0x5b, 0x9d, 0x12, 0x52, 0x45, 0x92, 0x5e, 0x57, 0xfd, 0xbc, 0xf3, 0x00, 0xf0, - 0x0e, 0x29, 0x2d, 0xb1, 0xba, 0x8e, 0x59, 0xd8, 0x74, 0xd1, 0xef, 0x24, 0x09, 0x96, 0x76, 0x09, 0x91, 0x70, 0xb1, - 0x28, 0x0b, 0xa0, 0x42, 0x43, 0x5f, 0x3a, 0x03, 0x90, 0x8d, 0x03, 0xb6, 0x21, 0x35, 0x33, 0x25, 0x35, 0x43, 0x07, - 0xe3, 0x3b, 0xa4, 0x24, 0x55, 0xc8, 0x50, 0x4a, 0xa4, 0x12, 0x7a, 0x66, 0x73, 0x0d, 0x09, 0xb9, 0x1b, 0x5a, 0x5e, - 0x9f, 0xd3, 0x7b, 0x9e, 0xd5, 0xc0, 0x0a, 0xd4, 0x38, 0xa8, 0x88, 0x60, 0x49, 0x54, 0x37, 0x28, 0xac, 0x3b, 0x47, - 0xd8, 0xfc, 0xd6, 0x80, 0x87, 0x76, 0x59, 0xc4, 0xa2, 0x24, 0x98, 0xa2, 0xa5, 0x08, 0xa6, 0x38, 0x83, 0x7c, 0x44, - 0x5e, 0x94, 0xf0, 0x53, 0x77, 0x37, 0x6a, 0xd9, 0xca, 0xdb, 0xaf, 0xf8, 0x81, 0x32, 0x2f, 0x21, 0x47, 0x13, 0x0b, - 0xcb, 0x53, 0x44, 0xa0, 0xee, 0xda, 0x39, 0xdb, 0xf6, 0x95, 0x49, 0xd1, 0x31, 0x80, 0x7d, 0x27, 0x83, 0xa5, 0xb3, - 0x0a, 0xf7, 0x2e, 0xb7, 0xb9, 0xf2, 0x67, 0x82, 0x7d, 0x55, 0x12, 0x69, 0x90, 0x93, 0x35, 0x89, 0x73, 0x77, 0xae, - 0xe5, 0xcf, 0x0b, 0x2a, 0x6e, 0xcf, 0x28, 0xe4, 0x3a, 0x73, 0xb8, 0xeb, 0x5b, 0x6d, 0x43, 0x95, 0xa7, 0xde, 0xcf, - 0x94, 0xb2, 0x52, 0xd4, 0x2f, 0x01, 0xae, 0x5f, 0x11, 0x2c, 0x54, 0xb4, 0xd1, 0x71, 0xc4, 0xe8, 0xd3, 0x42, 0x77, - 0x5e, 0x9e, 0xa4, 0x5d, 0x06, 0xfe, 0xb5, 0x0a, 0xd3, 0x26, 0x58, 0x80, 0xb9, 0x7b, 0x21, 0x75, 0x90, 0x0f, 0xd7, - 0xbd, 0x32, 0x50, 0x04, 0xe1, 0xbb, 0x6c, 0xf7, 0x52, 0xb7, 0x65, 0xcd, 0xee, 0x5e, 0x6a, 0x2d, 0xe8, 0xa7, 0x52, - 0x7e, 0xb0, 0x99, 0xa7, 0xbc, 0xbc, 0xcc, 0x8a, 0x02, 0x15, 0x00, 0xde, 0xf7, 0xdd, 0x20, 0xf8, 0xde, 0x24, 0x0d, - 0x86, 0x10, 0x8b, 0x3d, 0x4b, 0xb9, 0x65, 0xe2, 0xd5, 0xfc, 0xdf, 0x6f, 0xcc, 0xff, 0xbd, 0x73, 0xe5, 0x14, 0x4c, - 0xa3, 0x49, 0x46, 0x13, 0xcb, 0x3a, 0x91, 0x26, 0x40, 0xa5, 0xb7, 0xe5, 0x92, 0x7c, 0xbc, 0x88, 0x40, 0xe3, 0x5a, - 0x8e, 0x79, 0x26, 0x9b, 0xe3, 0x78, 0xc6, 0xd2, 0xdb, 0x68, 0xc1, 0x9a, 0x33, 0x9e, 0xf1, 0x7c, 0x1e, 0x8f, 0x28, - 0xce, 0x6f, 0x73, 0x49, 0x67, 0xcd, 0x05, 0xc3, 0x2f, 0x69, 0x7a, 0x45, 0x25, 0x1b, 0xc5, 0xd8, 0x3f, 0x11, 0x2c, - 0x4e, 0xbd, 0x37, 0xb1, 0x10, 0xfc, 0xda, 0xc7, 0xef, 0xf8, 0x25, 0x97, 0x1c, 0xbf, 0xbd, 0xb9, 0x9d, 0xd0, 0x0c, - 0x7f, 0xb8, 0x5c, 0x64, 0x72, 0x81, 0xf3, 0x38, 0xcb, 0x9b, 0x39, 0x15, 0x6c, 0xdc, 0x1d, 0xf1, 0x94, 0x8b, 0x26, - 0xa4, 0x6c, 0xcf, 0x68, 0x94, 0xb2, 0xc9, 0x54, 0x7a, 0x49, 0x2c, 0x3e, 0x76, 0x9b, 0xcd, 0xb9, 0x60, 0xb3, 0x58, - 0xdc, 0x36, 0x55, 0x8b, 0xe8, 0xb3, 0xd6, 0x51, 0xfc, 0xf9, 0xf8, 0x61, 0x57, 0x8a, 0x38, 0xcb, 0x19, 0x6c, 0x53, - 0x14, 0xa7, 0xa9, 0x77, 0xf4, 0xa8, 0x35, 0xcb, 0xf7, 0x74, 0x20, 0x2f, 0xce, 0x64, 0x71, 0x81, 0x3f, 0x02, 0xdc, - 0xe1, 0xa5, 0xcc, 0xf0, 0xe5, 0x42, 0x4a, 0x9e, 0x2d, 0x47, 0x0b, 0x91, 0x73, 0x11, 0xcd, 0x39, 0xcb, 0x24, 0x15, - 0xdd, 0x4b, 0x2e, 0x12, 0x2a, 0x9a, 0x22, 0x4e, 0xd8, 0x22, 0x8f, 0x1e, 0xce, 0x6f, 0xba, 0xa0, 0x59, 0x4c, 0x04, - 0x5f, 0x64, 0x89, 0x99, 0x8b, 0x65, 0x53, 0x2a, 0x98, 0x74, 0x2b, 0xd4, 0x2b, 0x4c, 0xa2, 0x94, 0x65, 0x34, 0x16, - 0xcd, 0x09, 0x74, 0x06, 0xb3, 0xa8, 0x95, 0xd0, 0x09, 0x16, 0x93, 0xcb, 0x38, 0x68, 0x77, 0x9e, 0x60, 0xfb, 0x37, - 0x7c, 0x84, 0xbc, 0xd6, 0xf6, 0xe2, 0x76, 0xab, 0xf5, 0x27, 0xd4, 0x5d, 0x9b, 0x45, 0x01, 0x14, 0xb5, 0xe7, 0x37, - 0x5e, 0xce, 0x21, 0xa7, 0x6d, 0x5b, 0xcf, 0xee, 0x3c, 0x4e, 0x20, 0x21, 0x38, 0xea, 0xcc, 0x6f, 0x0a, 0x58, 0x5d, - 0xa4, 0x93, 0x4c, 0xcd, 0x22, 0xcd, 0xd3, 0xf2, 0xb7, 0x42, 0xfc, 0x74, 0x3b, 0xc4, 0x1d, 0x0b, 0x71, 0x85, 0xf5, - 0x66, 0xb2, 0x10, 0x2a, 0xb6, 0x1a, 0xb5, 0x73, 0x0d, 0xc8, 0x94, 0x5f, 0x51, 0x61, 0xe1, 0x50, 0x0f, 0xbf, 0x19, - 0x8c, 0xce, 0x76, 0x30, 0x9e, 0x7e, 0x0a, 0x0c, 0x91, 0x25, 0xcb, 0xfa, 0xbe, 0xb6, 0x05, 0x9d, 0x75, 0xa7, 0x14, - 0xe8, 0x29, 0xea, 0xc0, 0xef, 0x6b, 0x96, 0xc8, 0xa9, 0xfe, 0xa9, 0xc8, 0xf9, 0x5a, 0xd7, 0x3d, 0x6a, 0xb5, 0xf4, - 0x73, 0xce, 0x7e, 0xa1, 0x51, 0x3b, 0x84, 0x06, 0xc5, 0x05, 0xfe, 0x5b, 0x79, 0x99, 0xb7, 0xce, 0x3d, 0xf1, 0x0f, - 0xee, 0x2d, 0x5f, 0x27, 0x49, 0xb1, 0xba, 0x11, 0x8d, 0x85, 0x95, 0x95, 0x5a, 0xf8, 0x80, 0xdb, 0x4e, 0x9d, 0x27, - 0xc2, 0x7a, 0xe5, 0x2d, 0x4e, 0xd6, 0xff, 0x41, 0xe7, 0x5d, 0x44, 0x10, 0xe9, 0x70, 0x92, 0x0d, 0x79, 0x37, 0xeb, - 0x91, 0x56, 0x37, 0x6b, 0x36, 0x51, 0xc0, 0x89, 0x18, 0x64, 0x26, 0x3d, 0x2f, 0x60, 0x7d, 0xae, 0x8c, 0xed, 0x1c, - 0x45, 0x1c, 0xae, 0x9a, 0xae, 0x56, 0x55, 0x18, 0x80, 0xa9, 0xeb, 0x1a, 0x7f, 0x93, 0xa6, 0x01, 0xce, 0x1d, 0x4e, - 0x9e, 0xd9, 0x17, 0xbb, 0x08, 0xcb, 0x2b, 0x52, 0x3e, 0x52, 0x98, 0x0b, 0xe7, 0xb1, 0x9c, 0x82, 0x97, 0xa2, 0x14, - 0x3f, 0x55, 0x12, 0x93, 0x7f, 0xe8, 0xa3, 0xbe, 0x28, 0x33, 0xdc, 0x20, 0x93, 0x4f, 0x14, 0x30, 0xca, 0x37, 0x92, - 0xc0, 0x88, 0xf8, 0x17, 0xa2, 0x6d, 0x3a, 0x6b, 0xd1, 0x8d, 0xef, 0x6b, 0xd1, 0xd1, 0x4c, 0x32, 0x95, 0xbb, 0x6d, - 0x23, 0x0e, 0xd3, 0x38, 0x3f, 0x1f, 0xe9, 0xbb, 0x92, 0x79, 0x75, 0x33, 0x20, 0x56, 0xd0, 0x6b, 0x23, 0x8d, 0x0a, - 0x65, 0x8f, 0x7e, 0x2f, 0x77, 0xda, 0x27, 0xe2, 0x2e, 0xfb, 0xa4, 0x5c, 0x78, 0xce, 0x17, 0x62, 0x04, 0xe1, 0x48, - 0x23, 0xf5, 0x36, 0x1d, 0x37, 0xbe, 0x52, 0x31, 0x7c, 0x2c, 0x9d, 0x4c, 0x50, 0x89, 0x99, 0xfb, 0x52, 0x09, 0xaa, - 0x42, 0x5e, 0xfa, 0xbe, 0x86, 0x11, 0x71, 0x76, 0x49, 0x20, 0xb3, 0x13, 0x95, 0xd4, 0x18, 0x64, 0xa4, 0x97, 0x85, - 0x8b, 0x8c, 0xfd, 0xbc, 0xa0, 0xe7, 0x0c, 0x74, 0x4d, 0x16, 0xb2, 0x44, 0xc5, 0x9a, 0x40, 0xf6, 0x35, 0xdb, 0x10, - 0xbc, 0x60, 0x89, 0xde, 0x98, 0x4c, 0x55, 0x9a, 0xdc, 0x26, 0xbf, 0xe9, 0x83, 0xbf, 0x18, 0xb4, 0x03, 0x86, 0x13, - 0x3e, 0x8b, 0x59, 0x16, 0x29, 0x97, 0x6f, 0x39, 0x58, 0x04, 0xad, 0x31, 0x4b, 0xa2, 0xcc, 0x6c, 0x4f, 0x1b, 0x85, - 0x3f, 0x71, 0x96, 0xa9, 0xae, 0x45, 0x97, 0x2b, 0x84, 0x6a, 0xf4, 0x11, 0x8b, 0xe0, 0x13, 0x2d, 0xd7, 0x38, 0xc2, - 0x6e, 0x75, 0x79, 0xed, 0xbc, 0xb6, 0x03, 0xad, 0xb5, 0x8d, 0xd2, 0x46, 0x00, 0x5f, 0x2f, 0xcd, 0xb9, 0x90, 0x41, - 0x30, 0xc5, 0x29, 0x22, 0xbd, 0xa9, 0x72, 0x76, 0x1d, 0xa7, 0xea, 0xbf, 0x7e, 0xb3, 0x1d, 0xb5, 0x4b, 0xf3, 0xbd, - 0x76, 0x1b, 0x58, 0x27, 0x47, 0x99, 0x1b, 0xa5, 0x6a, 0x19, 0xe5, 0x6f, 0xbd, 0xd4, 0xea, 0xb9, 0x5c, 0x2e, 0x36, - 0xc7, 0x4d, 0x8b, 0xaa, 0xa0, 0x06, 0x84, 0x0a, 0x16, 0xed, 0x98, 0x0a, 0x15, 0xd5, 0xba, 0x4b, 0x55, 0xf2, 0x42, - 0x8b, 0xe8, 0xf3, 0xfd, 0xa5, 0x30, 0x33, 0x16, 0x17, 0xcc, 0x3a, 0x99, 0xea, 0x24, 0x57, 0x18, 0x8c, 0x38, 0x7a, - 0xe8, 0xb6, 0x66, 0x1a, 0x96, 0x5b, 0x22, 0xb6, 0xd2, 0x6d, 0xa8, 0x1f, 0xa9, 0x20, 0x55, 0xb8, 0x6b, 0x63, 0x00, - 0xc8, 0xd5, 0xdb, 0x06, 0x18, 0x98, 0xad, 0xb9, 0xb4, 0x4b, 0x00, 0x6d, 0x6c, 0x4c, 0xe1, 0x22, 0xcd, 0xc5, 0xfe, - 0xf2, 0x1b, 0x59, 0x1c, 0x3a, 0x4d, 0xd5, 0x6f, 0x96, 0xc0, 0xff, 0x20, 0x01, 0x97, 0x5a, 0x29, 0x8d, 0xfc, 0xaf, - 0xdf, 0x9e, 0xbd, 0xf7, 0xf1, 0x25, 0x4f, 0x6e, 0x23, 0x5f, 0x8a, 0x05, 0xf5, 0x0b, 0x14, 0xca, 0x29, 0xcd, 0xca, - 0x97, 0xf1, 0xf0, 0x94, 0x86, 0x29, 0x9f, 0xe8, 0x4b, 0x99, 0xeb, 0x46, 0xf2, 0xe8, 0xe2, 0x58, 0xbd, 0x64, 0xaa, - 0x77, 0x2c, 0xf5, 0xeb, 0xbd, 0xa4, 0x80, 0x9f, 0x3d, 0x08, 0xa1, 0x1c, 0x1f, 0xca, 0xa9, 0x7a, 0x38, 0x83, 0x03, - 0xa3, 0x9e, 0xf6, 0x97, 0x1b, 0xc4, 0xd4, 0x87, 0x21, 0xa6, 0x3d, 0xbd, 0x84, 0x5c, 0xb5, 0xba, 0x88, 0x46, 0x17, - 0x17, 0xc5, 0xf1, 0x21, 0x8c, 0x75, 0x68, 0xc7, 0x05, 0x08, 0x6d, 0xff, 0x92, 0xc0, 0xe0, 0x65, 0x43, 0x82, 0xf4, - 0x60, 0x08, 0x98, 0x37, 0xe9, 0xc1, 0x22, 0x81, 0xc0, 0xa0, 0x77, 0x52, 0x96, 0xa8, 0x13, 0xab, 0x8b, 0x76, 0x41, - 0xa0, 0x1b, 0x56, 0x74, 0xaf, 0xbd, 0xa9, 0xd5, 0xfe, 0x5a, 0x90, 0x12, 0x17, 0xba, 0x0b, 0x04, 0xff, 0x2b, 0xc8, - 0x8e, 0x0f, 0x35, 0x1e, 0x2e, 0xdc, 0x57, 0x9b, 0xe8, 0xd7, 0x0e, 0x94, 0xd8, 0x1a, 0xe4, 0x12, 0x7f, 0x94, 0xf8, - 0xe3, 0x85, 0x6a, 0x6a, 0x85, 0x11, 0x68, 0x49, 0x20, 0xb4, 0x5b, 0x56, 0xeb, 0x18, 0xf1, 0x34, 0x8d, 0xe7, 0x39, - 0x8d, 0xec, 0x0f, 0x23, 0x97, 0x40, 0xbc, 0x6d, 0x2a, 0x02, 0x26, 0xbd, 0xe6, 0x14, 0xd4, 0x85, 0x4d, 0x2d, 0xe5, - 0x2a, 0x16, 0x41, 0xb3, 0x39, 0x6a, 0x5e, 0x4e, 0x50, 0x21, 0xa7, 0x4b, 0x57, 0xaa, 0x3d, 0x6e, 0xb5, 0xba, 0x90, - 0x0b, 0xd9, 0x8c, 0x53, 0x36, 0xc9, 0xa2, 0x94, 0x8e, 0x65, 0x21, 0xe1, 0x96, 0xda, 0xd2, 0xaa, 0x11, 0x61, 0xe7, - 0x91, 0xa0, 0x33, 0x2f, 0x84, 0x7f, 0xef, 0x9e, 0xb8, 0x90, 0x49, 0x94, 0xc9, 0x69, 0x53, 0x65, 0xdd, 0xc2, 0x9d, - 0x01, 0x39, 0xad, 0x3d, 0x2f, 0x9d, 0x89, 0x46, 0x14, 0x54, 0xac, 0x42, 0x0a, 0x4f, 0x4e, 0xb1, 0x14, 0x6e, 0xbb, - 0x0c, 0x2d, 0x37, 0x56, 0xb0, 0x29, 0xe9, 0x8f, 0x50, 0x91, 0x2b, 0xc5, 0x78, 0xb3, 0xb1, 0x55, 0x97, 0xea, 0x4f, - 0x1b, 0xe8, 0x73, 0x14, 0xbb, 0x42, 0x3b, 0x96, 0x97, 0xba, 0xc7, 0x7d, 0x90, 0x59, 0x53, 0x39, 0xb1, 0xdb, 0x03, - 0x15, 0x2c, 0x9b, 0x2f, 0xe4, 0x40, 0x39, 0xb5, 0x05, 0x5c, 0x90, 0x18, 0x62, 0xa7, 0x04, 0x70, 0x30, 0x5c, 0x6a, - 0x60, 0x46, 0x71, 0x3a, 0x0a, 0x00, 0x22, 0xaf, 0xe9, 0x3d, 0x15, 0x74, 0x86, 0xba, 0x33, 0x96, 0x35, 0x75, 0xdd, - 0x23, 0x47, 0x2d, 0x09, 0x9f, 0xc0, 0x53, 0x11, 0xaa, 0xd1, 0xb0, 0xca, 0x5d, 0xdd, 0x82, 0xcb, 0x8b, 0x61, 0x51, - 0x74, 0x85, 0x0c, 0x06, 0xaf, 0x03, 0x34, 0xc4, 0xbf, 0x38, 0x2f, 0x67, 0xf1, 0xed, 0x51, 0xf1, 0x71, 0x07, 0xed, - 0x68, 0xe2, 0x9e, 0x05, 0xd5, 0xec, 0x17, 0x02, 0x0d, 0xdf, 0x05, 0x3e, 0xcd, 0xe7, 0x4d, 0xcd, 0xbb, 0x9a, 0x8a, - 0x64, 0x7d, 0xe8, 0x8a, 0x8c, 0xa7, 0xf6, 0x7b, 0xb9, 0x54, 0x6c, 0xc9, 0x5c, 0xd2, 0xd0, 0xce, 0x84, 0x61, 0x79, - 0xa9, 0xc7, 0x3c, 0xbb, 0xd7, 0x78, 0x50, 0x8d, 0x9f, 0x5c, 0x9c, 0xd4, 0x79, 0x1c, 0xf0, 0xa5, 0xf2, 0x05, 0x76, - 0x71, 0x9a, 0xc2, 0x84, 0x17, 0x56, 0x7d, 0x71, 0x5f, 0xfa, 0x31, 0x90, 0xc3, 0x00, 0x15, 0xe6, 0x9c, 0x3e, 0x53, - 0x2a, 0xa5, 0xf3, 0xd6, 0xbc, 0x3d, 0x69, 0x83, 0x45, 0x5a, 0xfa, 0x32, 0x08, 0x77, 0xd7, 0xf2, 0xa2, 0xbb, 0x15, - 0xef, 0xd2, 0x0a, 0xa9, 0xa7, 0x16, 0x44, 0x7c, 0x91, 0x25, 0xbe, 0xf7, 0x97, 0x51, 0xca, 0x46, 0x1f, 0x89, 0xbf, - 0xbf, 0x0c, 0xd0, 0xe6, 0xb5, 0x47, 0xc5, 0x15, 0x2c, 0xc3, 0x46, 0x75, 0x47, 0x7a, 0x16, 0x3a, 0xbc, 0x58, 0xbf, - 0x15, 0xc7, 0xef, 0xed, 0x2f, 0x81, 0xf1, 0xe8, 0x79, 0x7a, 0x17, 0xc5, 0x79, 0xf5, 0xae, 0xab, 0x0a, 0x0a, 0x40, - 0xb3, 0x2e, 0xf7, 0x14, 0x51, 0x11, 0xff, 0x93, 0x94, 0xe6, 0x7b, 0x9a, 0xa9, 0x01, 0x9c, 0xd2, 0xf0, 0x37, 0xdf, - 0xfb, 0x4b, 0x59, 0x46, 0x4b, 0x8f, 0x86, 0x4a, 0xc9, 0x20, 0x3e, 0xcc, 0x05, 0x66, 0x6c, 0x98, 0x50, 0x19, 0xb3, - 0x54, 0x77, 0xe9, 0x5a, 0x03, 0x7c, 0x6d, 0x45, 0xab, 0x55, 0x5e, 0x5f, 0x0b, 0xab, 0x63, 0x50, 0xad, 0xec, 0xf8, - 0xb0, 0x82, 0x5b, 0xad, 0x4c, 0x9d, 0x49, 0x37, 0x34, 0x58, 0xad, 0x50, 0xd7, 0x79, 0x7f, 0x19, 0xa9, 0x6b, 0x43, - 0x00, 0x20, 0x37, 0x00, 0x42, 0xd0, 0x5a, 0x5f, 0x8b, 0x09, 0x52, 0xc2, 0x43, 0x19, 0x8b, 0x09, 0x95, 0x6b, 0x88, - 0x4d, 0x75, 0x8e, 0x6a, 0xd7, 0x06, 0xa8, 0x37, 0xa0, 0x8d, 0xeb, 0xd0, 0x5e, 0x00, 0xd2, 0xfb, 0xfb, 0x4b, 0x56, - 0x90, 0xfd, 0x25, 0xcd, 0x46, 0x3c, 0xa1, 0x1f, 0xde, 0x7d, 0x09, 0x97, 0x1c, 0x79, 0x06, 0x86, 0xc5, 0x14, 0x81, - 0xe0, 0x54, 0x9b, 0xa3, 0x45, 0x08, 0x57, 0x22, 0x44, 0x73, 0x02, 0x4f, 0xcd, 0xa5, 0x40, 0x2c, 0x7c, 0xaf, 0xaf, - 0x21, 0xa7, 0x89, 0x86, 0x99, 0x64, 0xaa, 0x17, 0x2f, 0x8e, 0x0f, 0x75, 0x6b, 0x2d, 0x02, 0x74, 0x23, 0x40, 0x82, - 0x3a, 0xa7, 0x15, 0x0e, 0x20, 0xaf, 0xd9, 0xc5, 0x43, 0xc2, 0xae, 0x4a, 0x62, 0x53, 0x17, 0xa8, 0x7a, 0xc7, 0x69, - 0x7c, 0x49, 0xd3, 0xde, 0xfe, 0x32, 0x5b, 0xad, 0x5a, 0xc5, 0xf1, 0xa1, 0x7e, 0xf4, 0x8e, 0x15, 0xdf, 0xd0, 0x2f, - 0xbc, 0x54, 0x5b, 0x0c, 0xb7, 0x12, 0x21, 0xdb, 0xd3, 0xa6, 0x39, 0x45, 0x66, 0x80, 0xc2, 0xf7, 0x54, 0x82, 0x85, - 0x6a, 0x54, 0x2a, 0x44, 0x85, 0xef, 0xb1, 0x64, 0xb3, 0x2c, 0x97, 0x74, 0x0e, 0xa5, 0xd3, 0xd5, 0xaa, 0x5d, 0xf8, - 0xde, 0x8c, 0x65, 0xf0, 0x94, 0xad, 0x56, 0xea, 0xc2, 0xdf, 0x8c, 0x65, 0x41, 0x0b, 0xc8, 0xd6, 0xf7, 0x66, 0xf1, - 0x8d, 0x5a, 0xb0, 0xad, 0x89, 0x6f, 0x82, 0xb6, 0xa9, 0x0a, 0x4b, 0xfc, 0xe4, 0x40, 0x71, 0xd5, 0x8e, 0xa6, 0x66, - 0x47, 0x13, 0xbc, 0xd0, 0x57, 0x99, 0x48, 0x90, 0x90, 0x74, 0xfb, 0x8e, 0x26, 0x76, 0x47, 0x17, 0x3b, 0x76, 0x74, - 0x71, 0xc7, 0x8e, 0xc6, 0x66, 0xf7, 0xbc, 0x12, 0x77, 0x7c, 0xb5, 0x6a, 0xb7, 0x2a, 0xec, 0x1d, 0x1f, 0x26, 0xec, - 0x0a, 0x76, 0x03, 0xd4, 0x3c, 0xc9, 0x66, 0x74, 0x3b, 0x51, 0xd6, 0x51, 0x4c, 0x7f, 0x15, 0x26, 0x2b, 0x2c, 0x64, - 0x75, 0x2c, 0xb8, 0x74, 0x5d, 0xc6, 0xdc, 0xfe, 0x48, 0xca, 0x66, 0x80, 0x87, 0x1c, 0xf0, 0x30, 0x35, 0x78, 0xb8, - 0x28, 0xce, 0x41, 0x24, 0xa8, 0xe5, 0xdc, 0x8b, 0xf4, 0xa0, 0xb5, 0xdf, 0xdb, 0x4d, 0x62, 0x10, 0x0d, 0xbf, 0xe6, - 0x22, 0xf1, 0x23, 0xdd, 0xf4, 0x57, 0x61, 0x66, 0xc6, 0x32, 0x93, 0x5b, 0xb5, 0x93, 0xb4, 0xaa, 0x7a, 0x97, 0xc0, - 0x3a, 0x8f, 0x1e, 0xe9, 0x16, 0xf3, 0x58, 0x4a, 0x2a, 0x32, 0x43, 0xa8, 0xbe, 0xff, 0xff, 0x05, 0xd1, 0x6d, 0x61, - 0x23, 0xb1, 0x65, 0x23, 0x96, 0xde, 0x8c, 0x7e, 0x6e, 0x58, 0xbc, 0x96, 0x46, 0x7b, 0x95, 0xc2, 0x7a, 0x8b, 0x5c, - 0x1b, 0x41, 0x17, 0x81, 0xc9, 0xb2, 0x98, 0xd1, 0xe4, 0x5c, 0xf1, 0xe3, 0xfe, 0xe8, 0xc2, 0xe8, 0xa7, 0x6b, 0xd2, - 0xad, 0xea, 0x80, 0xfd, 0x1f, 0x17, 0x9d, 0x27, 0x0f, 0x4f, 0x7d, 0xac, 0x59, 0x3a, 0x1f, 0x8f, 0x7d, 0x54, 0x78, - 0xf7, 0xeb, 0xd6, 0x7e, 0xf8, 0xe3, 0xe2, 0x8b, 0x17, 0xad, 0x2f, 0xca, 0xce, 0x99, 0x8f, 0x8a, 0x0b, 0x13, 0xce, - 0xb7, 0x92, 0xc9, 0x81, 0xd7, 0xae, 0x68, 0x1c, 0x67, 0xbb, 0x97, 0x33, 0x70, 0x97, 0x93, 0xcf, 0x29, 0x4d, 0xb0, - 0xef, 0xf9, 0x78, 0xa3, 0xf4, 0x3c, 0xa5, 0x57, 0xd4, 0xbe, 0x68, 0x70, 0xcb, 0x64, 0x5b, 0x7a, 0x8c, 0xf8, 0x22, - 0x93, 0x26, 0xaf, 0xc1, 0x70, 0x56, 0x67, 0x49, 0x17, 0x6a, 0x0d, 0xae, 0x49, 0x70, 0xab, 0xc5, 0x5a, 0x5d, 0x58, - 0x15, 0x17, 0xd8, 0x77, 0x00, 0xd8, 0x09, 0x59, 0x7f, 0x47, 0x79, 0xd4, 0xc2, 0xad, 0x5d, 0xb0, 0xe1, 0x36, 0x8a, - 0x7c, 0x7f, 0x68, 0xf1, 0xa4, 0x5c, 0x93, 0xb5, 0xf7, 0x43, 0xec, 0xc4, 0xd7, 0x27, 0x31, 0x70, 0x29, 0x60, 0xb0, - 0x8c, 0xe6, 0xf9, 0x4e, 0x04, 0x94, 0x9b, 0x88, 0xfd, 0xaa, 0xb5, 0xbf, 0x63, 0x14, 0xdc, 0xc2, 0x70, 0xc2, 0x14, - 0xc0, 0x65, 0x80, 0xd4, 0xb4, 0xa2, 0xe3, 0x31, 0x1d, 0x95, 0x9e, 0x5d, 0x08, 0x75, 0x8d, 0x59, 0x2a, 0x21, 0xe2, - 0xa3, 0x42, 0x31, 0xfe, 0x1b, 0x9e, 0x51, 0x1f, 0xd9, 0xe4, 0x4d, 0x03, 0xbf, 0x11, 0xf7, 0xdb, 0xe1, 0xd1, 0x23, - 0xd6, 0x61, 0x31, 0xb3, 0xac, 0x56, 0xd6, 0xab, 0x53, 0x2b, 0xaf, 0x23, 0x92, 0x2b, 0xb7, 0xcd, 0xae, 0x03, 0x74, - 0xbf, 0x63, 0xb2, 0x6c, 0x7f, 0xf1, 0xa8, 0xdd, 0x2a, 0x7c, 0xec, 0xc3, 0x70, 0xf7, 0x3d, 0x25, 0xaa, 0xd7, 0x11, - 0xf4, 0x5a, 0x64, 0xbf, 0xa6, 0x5f, 0xa7, 0xfd, 0x79, 0xdb, 0xc7, 0xfa, 0xbd, 0x01, 0xa8, 0x28, 0x99, 0xc1, 0x08, - 0x7c, 0x9d, 0xbf, 0x7b, 0x29, 0xf5, 0xc1, 0xef, 0x07, 0xcf, 0xe3, 0x76, 0xcb, 0xc7, 0x7e, 0x2e, 0xf9, 0xfc, 0x57, - 0x2c, 0xe1, 0xc8, 0xc7, 0xfe, 0x28, 0xe5, 0x39, 0x75, 0xd7, 0xa0, 0xb5, 0xd7, 0xdf, 0xbf, 0x08, 0x0d, 0xd1, 0x5c, - 0xd0, 0x3c, 0xf7, 0xdc, 0xf1, 0x0d, 0x29, 0x7d, 0x82, 0x61, 0x6e, 0xa5, 0xb8, 0x9c, 0x4a, 0x85, 0x17, 0x7d, 0xa5, - 0xdf, 0xa5, 0x2a, 0x5d, 0xb6, 0x41, 0x6c, 0x4a, 0x04, 0x94, 0x8c, 0x4d, 0x2b, 0x53, 0x9f, 0x9c, 0x79, 0xcb, 0xd1, - 0xd3, 0x13, 0xeb, 0x10, 0xf0, 0xe6, 0x04, 0xb5, 0x92, 0x19, 0xcb, 0xce, 0xb7, 0x94, 0xc6, 0x37, 0x5b, 0x4a, 0x41, - 0x43, 0x2b, 0xa1, 0x33, 0x6f, 0x9b, 0xf9, 0x34, 0xd6, 0x2b, 0x3d, 0xc7, 0x05, 0x31, 0x51, 0x6e, 0xca, 0x4f, 0x40, - 0xea, 0x6c, 0x83, 0x1a, 0xe1, 0xb7, 0x4f, 0x07, 0x25, 0xbf, 0x6a, 0x3a, 0x7a, 0xf3, 0xe9, 0x3d, 0x77, 0x14, 0x9b, - 0xdf, 0x81, 0x7d, 0x73, 0x73, 0x7c, 0x1d, 0xfd, 0x5b, 0x8a, 0x8d, 0xee, 0x51, 0x6e, 0xc1, 0x28, 0x65, 0xb3, 0x6a, - 0x17, 0x36, 0xc1, 0x54, 0x4a, 0x07, 0xa4, 0x0f, 0xb9, 0x83, 0x68, 0xed, 0xe3, 0x1c, 0x2e, 0x45, 0xc2, 0x9b, 0x27, - 0x16, 0x82, 0x9e, 0xa7, 0xfc, 0x7a, 0xfd, 0x4d, 0x5a, 0xbb, 0x1b, 0x4f, 0xd9, 0x64, 0xea, 0xdc, 0x74, 0xa2, 0xa4, - 0x44, 0xfd, 0x9d, 0x13, 0x14, 0xff, 0xfa, 0x2f, 0x61, 0xf8, 0xaf, 0xff, 0xf2, 0xc9, 0xa6, 0x30, 0x7c, 0x71, 0x81, - 0x65, 0x35, 0xec, 0x6e, 0x02, 0xdf, 0x3e, 0x53, 0x1d, 0xe7, 0xdb, 0xdb, 0x6c, 0x6c, 0x02, 0xd4, 0x6f, 0x6c, 0xc1, - 0x46, 0xa1, 0x3e, 0x00, 0xde, 0x6f, 0x01, 0x0c, 0xd6, 0xf5, 0x49, 0xc8, 0xa0, 0xd1, 0xef, 0x02, 0xed, 0x02, 0x45, - 0xf7, 0xda, 0x91, 0xdf, 0x8e, 0xe1, 0x4f, 0xad, 0xe1, 0x77, 0x82, 0x6f, 0x3c, 0x02, 0xa3, 0x8b, 0x8b, 0x32, 0xa5, - 0xcd, 0xed, 0x0a, 0x57, 0xe6, 0xfb, 0x1b, 0x25, 0x46, 0xf6, 0x47, 0x2d, 0xd4, 0x53, 0x17, 0xf2, 0xc8, 0xe8, 0xe2, - 0x35, 0xbc, 0x27, 0xe7, 0xf8, 0x52, 0x58, 0x97, 0xea, 0x1d, 0xfc, 0x19, 0x86, 0xa8, 0xaf, 0x4a, 0x0d, 0xba, 0xc1, - 0x9c, 0xa1, 0x14, 0x34, 0x7e, 0x00, 0x13, 0x8f, 0x2e, 0x8c, 0x7d, 0x77, 0xaa, 0x1d, 0x1f, 0xd1, 0x3a, 0x69, 0x1b, - 0x87, 0x48, 0x0d, 0xe9, 0xd8, 0x7b, 0xaf, 0xf0, 0xa5, 0x1a, 0xd3, 0xca, 0x9e, 0x56, 0xce, 0x25, 0x50, 0xe5, 0x2f, - 0x0a, 0x15, 0x18, 0xff, 0xeb, 0xae, 0xd8, 0xdd, 0xdf, 0x3f, 0x1d, 0xbb, 0xe3, 0xf7, 0x8a, 0xdd, 0xfd, 0xfd, 0x0f, - 0x8f, 0xdd, 0xfd, 0xd5, 0x8d, 0xdd, 0xc1, 0x26, 0x7e, 0x79, 0xaf, 0xf8, 0x9a, 0x8d, 0x7d, 0xf0, 0xeb, 0x9c, 0xb4, - 0x8d, 0x26, 0x9b, 0xf2, 0x09, 0x04, 0xd7, 0xfe, 0xfd, 0x63, 0x65, 0x29, 0x9f, 0xb8, 0x91, 0x32, 0x78, 0x4f, 0x2a, - 0x84, 0xc6, 0xba, 0x36, 0xa6, 0x65, 0xa2, 0x53, 0xad, 0xf2, 0x0e, 0x48, 0xf3, 0xa1, 0x7d, 0x67, 0x81, 0x1f, 0x95, - 0xef, 0x1d, 0x6a, 0xe1, 0x8e, 0x8d, 0x5f, 0x45, 0x2a, 0xf4, 0x55, 0x76, 0xec, 0x34, 0xec, 0x05, 0x07, 0x77, 0x84, - 0xae, 0x7d, 0xaf, 0x8a, 0xbe, 0xef, 0xbe, 0xf4, 0x7f, 0xbc, 0x69, 0x3f, 0x1b, 0xb4, 0xbb, 0x47, 0xed, 0x99, 0x1f, - 0xf9, 0x20, 0xa5, 0x54, 0x41, 0xab, 0x7b, 0x74, 0x04, 0x05, 0xd7, 0x4e, 0x41, 0x07, 0x0a, 0x98, 0x53, 0xf0, 0x08, - 0x0a, 0x46, 0x4e, 0xc1, 0x63, 0x28, 0x48, 0x9c, 0x82, 0x27, 0x50, 0x70, 0xe5, 0x17, 0x03, 0x56, 0x82, 0xfb, 0x04, - 0x0d, 0xb1, 0x36, 0x1e, 0x6c, 0xd9, 0x13, 0xdc, 0x86, 0xa0, 0x59, 0x3c, 0x51, 0xb9, 0x3e, 0xe0, 0x82, 0x8b, 0x38, - 0xbe, 0x9e, 0xd2, 0x2c, 0x82, 0xb0, 0xe5, 0x73, 0x25, 0x63, 0x42, 0xc9, 0xdf, 0xb3, 0x19, 0xb5, 0x5f, 0xa8, 0xb0, - 0x78, 0xf0, 0x7c, 0x34, 0x68, 0x0d, 0x8b, 0x6e, 0xb9, 0x73, 0x3a, 0xda, 0x66, 0xf2, 0x3e, 0xf4, 0x5e, 0x56, 0x75, - 0x7a, 0xba, 0x66, 0xb9, 0xe7, 0x3b, 0xa2, 0x36, 0x8e, 0x3b, 0x60, 0x9c, 0xf2, 0xeb, 0xe6, 0x8d, 0xdf, 0xdb, 0x1e, - 0xc9, 0x01, 0x88, 0xca, 0x48, 0x8e, 0x5a, 0x53, 0xf9, 0xf4, 0x3e, 0x9e, 0x94, 0xbf, 0x5f, 0xd3, 0x3c, 0x8f, 0x27, - 0xa6, 0xe5, 0xee, 0xc8, 0x8d, 0x02, 0xd1, 0x8d, 0xda, 0x58, 0x20, 0x20, 0xfa, 0x02, 0x9b, 0x05, 0xe6, 0xb4, 0x09, - 0xc6, 0x00, 0x76, 0xea, 0x71, 0x1c, 0x35, 0x7d, 0xbd, 0x48, 0xc6, 0x93, 0xaa, 0xe0, 0x78, 0x2e, 0xa8, 0x2a, 0xd5, - 0x18, 0x2e, 0x8e, 0x0f, 0xa1, 0x40, 0x57, 0xef, 0x88, 0xd7, 0x58, 0xdb, 0x7d, 0x77, 0xd4, 0xc6, 0xb3, 0xf1, 0x1a, - 0x37, 0xc3, 0xa5, 0x4c, 0x6f, 0xd9, 0x8c, 0x12, 0x7c, 0xd6, 0x1e, 0xc1, 0x1f, 0x13, 0x83, 0xf8, 0x6c, 0x3c, 0x1e, - 0xdf, 0x19, 0xbf, 0xf9, 0x2c, 0x19, 0xd3, 0x0e, 0x7d, 0xd4, 0x85, 0xec, 0x87, 0xa6, 0xf1, 0xfa, 0xb7, 0x0b, 0x85, - 0xbb, 0xe5, 0xfd, 0x1a, 0x43, 0x80, 0x40, 0x4e, 0x97, 0xf7, 0x8f, 0xe5, 0x14, 0x73, 0x41, 0x97, 0xb3, 0x58, 0x4c, - 0x58, 0x16, 0xb5, 0x8a, 0xf0, 0xca, 0x04, 0x3f, 0x3e, 0x7b, 0xfa, 0xf4, 0x69, 0x11, 0x26, 0xf6, 0xa9, 0x95, 0x24, - 0x45, 0x38, 0x5a, 0x96, 0xcb, 0x68, 0xb5, 0xc6, 0xe3, 0x22, 0x64, 0xb6, 0xe0, 0xa8, 0x33, 0x4a, 0x8e, 0x3a, 0x45, - 0x78, 0xed, 0xb4, 0x28, 0x42, 0x6a, 0x9e, 0x04, 0x4d, 0x6a, 0x29, 0x14, 0x4f, 0x5a, 0xad, 0x22, 0xd4, 0x84, 0xb6, - 0x04, 0x8b, 0x48, 0xff, 0x8c, 0xe2, 0x85, 0xe4, 0xc0, 0x92, 0xbb, 0x5c, 0x06, 0x83, 0x73, 0xf3, 0x7a, 0x0a, 0xfd, - 0x29, 0x87, 0x02, 0x0d, 0xf1, 0x97, 0x6e, 0x98, 0x02, 0x88, 0x59, 0x85, 0x27, 0xb8, 0x8d, 0x62, 0xd4, 0xaa, 0x81, - 0xb2, 0x54, 0xf5, 0x97, 0x84, 0x57, 0xd1, 0x0b, 0xe0, 0x3f, 0xd0, 0x52, 0xbf, 0x47, 0x4d, 0xd2, 0x1d, 0x5c, 0x9f, - 0xd2, 0x4f, 0x72, 0xfd, 0xdb, 0xfb, 0x30, 0x7d, 0x4a, 0xff, 0x68, 0xa6, 0x6f, 0x5e, 0x36, 0xaa, 0x99, 0xbe, 0x66, - 0x6b, 0x33, 0x49, 0xfc, 0xd1, 0x94, 0x8e, 0x3e, 0x5e, 0xf2, 0x9b, 0x26, 0x1c, 0x09, 0xe1, 0x2b, 0x7e, 0xba, 0xff, - 0x5b, 0xd3, 0x2d, 0xec, 0x60, 0xce, 0x97, 0x20, 0x94, 0xd8, 0x7c, 0x9b, 0x11, 0xff, 0xad, 0x35, 0xab, 0x74, 0xc9, - 0x78, 0x4c, 0xfc, 0xb7, 0xe3, 0xb1, 0x6f, 0x2f, 0xd9, 0xc5, 0x92, 0xaa, 0x56, 0x6f, 0x6a, 0x25, 0xaa, 0xd5, 0x17, - 0x5f, 0xb8, 0x65, 0x6e, 0x81, 0x09, 0x72, 0xb8, 0x01, 0x0d, 0x53, 0x93, 0xb0, 0x1c, 0x8e, 0x1a, 0x7c, 0xa0, 0xa2, - 0xfe, 0x96, 0x3f, 0x51, 0x7b, 0x21, 0x73, 0x09, 0xf0, 0x96, 0xb7, 0x48, 0xaf, 0xdf, 0x30, 0x9f, 0x50, 0x9b, 0xf0, - 0xf6, 0xec, 0xf6, 0xcb, 0x24, 0x98, 0x49, 0x54, 0xb0, 0xfc, 0x6d, 0xb6, 0x76, 0x7b, 0x44, 0xc3, 0x48, 0x88, 0xbb, - 0xac, 0x42, 0xf2, 0xc9, 0x24, 0x85, 0x4f, 0x84, 0x2c, 0x6b, 0x6f, 0x1e, 0xd5, 0xdd, 0xfb, 0xb5, 0xf5, 0x46, 0x6e, - 0x47, 0xf3, 0x9e, 0x4e, 0xf5, 0xc5, 0x22, 0x9d, 0x75, 0x7c, 0x65, 0x3e, 0x5d, 0xa3, 0x2c, 0xb2, 0xa5, 0xe1, 0xff, - 0x4b, 0x9d, 0xab, 0x2a, 0x21, 0x4f, 0x43, 0x0f, 0x9c, 0x14, 0x85, 0xc9, 0xf2, 0x4f, 0x58, 0x3e, 0x87, 0x37, 0x62, - 0xea, 0x9e, 0xf4, 0x53, 0x2c, 0x3c, 0xbf, 0x76, 0x22, 0x09, 0xb5, 0xed, 0x2a, 0x6c, 0x28, 0x41, 0xfb, 0x6a, 0x67, - 0xb2, 0xf0, 0x8d, 0xcb, 0xd7, 0x22, 0xd1, 0xf7, 0x34, 0x3e, 0x75, 0x8c, 0xc3, 0x59, 0x21, 0xf8, 0x5d, 0xcb, 0x0d, - 0xb1, 0x55, 0xb6, 0xa0, 0x70, 0x23, 0x65, 0xaa, 0x46, 0x63, 0x4b, 0xf9, 0xe5, 0xf3, 0x79, 0x9c, 0x69, 0x36, 0x4a, - 0x7c, 0xcd, 0x0f, 0xf6, 0x97, 0xd5, 0xce, 0x17, 0xbe, 0x05, 0x5b, 0x13, 0x6f, 0xef, 0xf8, 0x10, 0x3a, 0xf4, 0xbc, - 0x1a, 0xe8, 0xd9, 0x86, 0x3b, 0xff, 0x13, 0x81, 0xf5, 0x8b, 0x30, 0xbf, 0xc6, 0x61, 0x7e, 0xed, 0xfd, 0x79, 0xd9, - 0xbc, 0xa6, 0x97, 0x1f, 0x99, 0x6c, 0xca, 0x78, 0xde, 0x04, 0x85, 0x5f, 0xf9, 0xe5, 0x0c, 0x7b, 0x56, 0xe9, 0x61, - 0xfa, 0x8e, 0x7c, 0x77, 0x91, 0x43, 0xfc, 0x5d, 0xa9, 0xad, 0x51, 0xc6, 0x33, 0xda, 0xad, 0xa7, 0x01, 0xba, 0xe1, - 0x5c, 0x8b, 0xad, 0xe1, 0x92, 0x43, 0xbc, 0x5e, 0xde, 0x46, 0x2d, 0xc3, 0xd6, 0x5b, 0x36, 0x56, 0xdb, 0xda, 0xda, - 0x3e, 0x32, 0xc8, 0x6d, 0x28, 0xe9, 0x25, 0x36, 0x63, 0xd6, 0xbb, 0x62, 0xce, 0x9f, 0x4a, 0x8a, 0x03, 0x6f, 0x9e, - 0xfd, 0xeb, 0x64, 0x13, 0xae, 0x17, 0xab, 0xa4, 0xb8, 0xfb, 0x40, 0x16, 0xc5, 0x63, 0x49, 0x05, 0xbe, 0x4f, 0xcb, - 0x4b, 0x75, 0x7f, 0x65, 0x09, 0x62, 0x26, 0x6a, 0x3f, 0x9d, 0xdf, 0xdc, 0x7f, 0xf8, 0xbb, 0x97, 0x5f, 0x18, 0x1c, - 0xd9, 0xf7, 0xb9, 0xf8, 0x7e, 0x17, 0x0e, 0x42, 0x1a, 0xdf, 0x46, 0x2c, 0x53, 0x32, 0xef, 0x12, 0x5c, 0x72, 0xdd, - 0x39, 0x37, 0xd9, 0x9d, 0x82, 0xa6, 0xea, 0xe3, 0x6d, 0x66, 0x2b, 0x8e, 0x1e, 0xcf, 0x6f, 0xec, 0x6e, 0xb4, 0xd7, - 0xb2, 0x36, 0xff, 0xd0, 0xe4, 0xcc, 0xdd, 0xd9, 0xa0, 0xf5, 0x04, 0xc3, 0x47, 0xf3, 0x9b, 0xae, 0x16, 0xb4, 0x4d, - 0xa1, 0xa1, 0x6a, 0xcd, 0x6f, 0xdc, 0xf4, 0xd4, 0x6a, 0x20, 0x2f, 0x3c, 0xca, 0x3d, 0x1a, 0xe7, 0xb4, 0x0b, 0x6f, - 0xac, 0x66, 0xa3, 0x38, 0x35, 0xc2, 0x7c, 0xc6, 0x92, 0x24, 0xa5, 0x5d, 0x2b, 0xaf, 0xbd, 0xf6, 0x63, 0xc8, 0xee, - 0x74, 0xb7, 0xac, 0xbe, 0x2b, 0x0e, 0xf2, 0x4a, 0x3c, 0xc5, 0x97, 0x39, 0x4f, 0xe1, 0x73, 0x11, 0x5b, 0xd1, 0x69, - 0xd2, 0x1e, 0x5b, 0x15, 0xf2, 0xd4, 0xef, 0xfa, 0x5a, 0x1e, 0xb5, 0xfe, 0xd4, 0x55, 0x1b, 0xde, 0xea, 0x4a, 0x3e, - 0x8f, 0x9a, 0x47, 0xf5, 0x85, 0x40, 0x55, 0xb9, 0x04, 0xbc, 0x65, 0x59, 0x18, 0xa4, 0x95, 0xe6, 0xd3, 0x5e, 0xd8, - 0x36, 0x65, 0x6a, 0x00, 0x78, 0xb5, 0x72, 0x59, 0x54, 0xd4, 0x17, 0xf3, 0xef, 0x73, 0x5a, 0x3e, 0xdf, 0x7e, 0x5a, - 0x3e, 0xb7, 0xa7, 0xe5, 0x6e, 0x8a, 0xfd, 0x6c, 0xdc, 0x86, 0x3f, 0xdd, 0x6a, 0x41, 0x51, 0xcb, 0x3b, 0x9a, 0xdf, - 0x78, 0xa0, 0xa7, 0x35, 0x3b, 0xf3, 0x1b, 0x9d, 0x9c, 0x0b, 0x61, 0x83, 0x16, 0xa4, 0xab, 0xe2, 0x96, 0x07, 0x85, - 0xf0, 0xb7, 0x55, 0xab, 0x6a, 0x3f, 0x84, 0x3a, 0xe8, 0xf5, 0x68, 0xb3, 0xae, 0x73, 0xf7, 0xa1, 0x8d, 0x32, 0x2e, - 0x83, 0xc8, 0x72, 0x63, 0x14, 0xca, 0xf8, 0xf2, 0x92, 0x26, 0xd1, 0x98, 0x8f, 0x16, 0xf9, 0x3f, 0x1b, 0xf8, 0x0d, - 0x12, 0xef, 0x3c, 0xd2, 0x6b, 0xe3, 0xd8, 0xae, 0x3a, 0x55, 0xd8, 0x8e, 0xb0, 0x2c, 0xf7, 0x29, 0xca, 0x47, 0x71, - 0x4a, 0x83, 0x4e, 0xf8, 0x70, 0xcb, 0x21, 0xf8, 0x0f, 0xd9, 0x9b, 0xad, 0x8b, 0xf9, 0xbd, 0xc8, 0xb8, 0x13, 0x09, - 0xbf, 0x0a, 0x07, 0xee, 0x1e, 0xb6, 0x9e, 0x6e, 0x07, 0x77, 0x60, 0x67, 0x1a, 0x5a, 0xa1, 0x60, 0xe4, 0x4e, 0x42, - 0xc7, 0xf1, 0x22, 0x95, 0x77, 0x8f, 0xba, 0x8b, 0x32, 0x36, 0x46, 0xbd, 0x83, 0xa1, 0x57, 0x6d, 0xef, 0xc9, 0xa5, - 0x3f, 0xfb, 0xfc, 0x21, 0xfc, 0xd1, 0x99, 0x46, 0xb7, 0x95, 0xae, 0xae, 0x6d, 0x55, 0xd0, 0xd5, 0xf7, 0x6b, 0xca, - 0xb8, 0x16, 0xe1, 0x4a, 0x1f, 0xbf, 0x6f, 0x6b, 0xd0, 0x2a, 0xef, 0xd5, 0xdc, 0x68, 0x59, 0xbf, 0xaa, 0xf5, 0xaf, - 0x1b, 0xfc, 0x9e, 0x6d, 0x47, 0x5a, 0x73, 0xad, 0xb7, 0x35, 0x5f, 0xaf, 0xdb, 0x68, 0x6c, 0x31, 0xae, 0xda, 0xef, - 0x93, 0xdb, 0xd2, 0x44, 0xd1, 0x81, 0x40, 0xb0, 0x52, 0xf6, 0xb5, 0x95, 0xc2, 0x28, 0x79, 0x00, 0xef, 0x8e, 0xf5, - 0x6e, 0x66, 0x69, 0x96, 0x13, 0x7f, 0x2a, 0xe5, 0x3c, 0xd2, 0x9f, 0x3b, 0xbd, 0x3e, 0x0a, 0xb9, 0x98, 0x1c, 0x76, - 0x5a, 0xad, 0x16, 0xbc, 0xf3, 0xd3, 0xf7, 0xae, 0x18, 0xbd, 0x7e, 0xc6, 0x6f, 0x88, 0xff, 0xc4, 0x7b, 0xea, 0x3d, - 0x39, 0xf2, 0x1e, 0x3d, 0xf6, 0x3d, 0xc5, 0xce, 0x89, 0xff, 0xe4, 0xc8, 0xf7, 0x34, 0x3b, 0x27, 0xfe, 0xa3, 0xc7, - 0x7e, 0xef, 0x78, 0x62, 0x55, 0x32, 0xb8, 0x34, 0xa8, 0xf5, 0x9d, 0x5c, 0x0a, 0xfe, 0x91, 0xd6, 0x0f, 0xae, 0x2e, - 0x33, 0xb9, 0x68, 0x1d, 0xfb, 0x08, 0xa7, 0x77, 0x14, 0xcf, 0x23, 0x45, 0x14, 0x6e, 0x21, 0xb8, 0x65, 0x74, 0xa9, - 0x9a, 0x02, 0xd4, 0xcc, 0x4b, 0xbf, 0x77, 0x0c, 0x79, 0xe3, 0x5e, 0x42, 0xfc, 0xd7, 0x9d, 0x27, 0x5e, 0xfb, 0xf1, - 0x55, 0xf3, 0xe1, 0xa8, 0xd5, 0x6c, 0x7b, 0xed, 0x66, 0x27, 0x7c, 0xe2, 0x75, 0xf4, 0xbf, 0x5e, 0xcb, 0x3b, 0xf2, - 0xda, 0xe1, 0x13, 0xef, 0xc8, 0xeb, 0x84, 0x4f, 0xae, 0x1e, 0xea, 0x7c, 0x82, 0xd8, 0x3f, 0xec, 0x1d, 0xc3, 0xa7, - 0x2b, 0x6f, 0x88, 0xff, 0xb9, 0xaf, 0x3f, 0x10, 0xeb, 0x7f, 0xe6, 0x96, 0xb6, 0x9f, 0x6e, 0x2d, 0xee, 0x3c, 0xd9, - 0x5a, 0x7c, 0xf4, 0x78, 0x6b, 0xf1, 0xc3, 0x47, 0xf5, 0xe2, 0xc3, 0x89, 0xae, 0x2a, 0x4f, 0x39, 0xf1, 0x67, 0xb1, - 0x14, 0xec, 0x26, 0x68, 0x7b, 0x2d, 0xaf, 0xe5, 0x35, 0xe1, 0xbf, 0x27, 0x1d, 0x54, 0xf6, 0xba, 0x84, 0x5e, 0xe5, - 0x2a, 0x9f, 0x3c, 0xf5, 0xda, 0x8f, 0x5f, 0x76, 0x1e, 0x8f, 0xa0, 0x9d, 0x5a, 0x68, 0xdb, 0x6b, 0x5f, 0x1d, 0x3d, - 0x1d, 0xb5, 0x3c, 0xe8, 0xd8, 0x86, 0x3f, 0xd3, 0x47, 0x9d, 0x91, 0x7e, 0x68, 0x41, 0xfd, 0xb7, 0xed, 0x27, 0x79, - 0xab, 0xd9, 0x86, 0x3f, 0xbf, 0x94, 0x1a, 0x31, 0xe8, 0xe3, 0xee, 0xb8, 0x0f, 0x5b, 0xde, 0xd1, 0xd3, 0x69, 0x27, - 0xfc, 0xfc, 0xea, 0x49, 0xf8, 0x74, 0xda, 0x7e, 0xf2, 0xad, 0x7e, 0x4a, 0x9b, 0x9d, 0xf0, 0x73, 0xf8, 0xfb, 0xed, - 0x51, 0x6b, 0xda, 0x6c, 0x87, 0x4f, 0xaf, 0x8e, 0xc2, 0xa3, 0xb4, 0xf9, 0x38, 0x7c, 0x0a, 0x7f, 0xab, 0xe1, 0xa6, - 0x7c, 0x46, 0x7d, 0x0f, 0xf6, 0x7b, 0xcd, 0xdc, 0x72, 0xe7, 0xe8, 0x3c, 0xf4, 0x1e, 0x3d, 0x7c, 0xf9, 0xf4, 0xaa, - 0xf9, 0x70, 0xda, 0xee, 0x5c, 0x35, 0x77, 0xfe, 0xfc, 0x16, 0x10, 0x6f, 0x06, 0x8e, 0x29, 0x5c, 0xe0, 0xb1, 0x88, - 0x53, 0xef, 0x9f, 0x7d, 0x80, 0xf3, 0x5d, 0xe6, 0xb5, 0xf8, 0xb4, 0x79, 0x9d, 0xd1, 0xfb, 0xd8, 0xd7, 0xe2, 0x0f, - 0xb7, 0xaf, 0x73, 0xba, 0xe6, 0x54, 0xbd, 0x95, 0x1b, 0x66, 0xf4, 0xba, 0xed, 0xf5, 0x4e, 0x06, 0x03, 0x06, 0xdf, - 0x39, 0x2a, 0xba, 0xb7, 0xf0, 0x8a, 0x6b, 0xd7, 0xdb, 0xc0, 0xe1, 0x20, 0xdf, 0x4a, 0x7d, 0x92, 0xf9, 0x2e, 0x84, - 0xa4, 0x9f, 0x46, 0xc8, 0xb7, 0xf7, 0xc1, 0x47, 0xfa, 0x87, 0xe3, 0x83, 0xbb, 0xf8, 0xa8, 0xf9, 0x79, 0x95, 0x3d, - 0xab, 0xec, 0xd1, 0x33, 0xf5, 0x1c, 0xc0, 0x1d, 0x8f, 0x86, 0x7f, 0x48, 0xa1, 0x28, 0xf7, 0x75, 0x5c, 0xe1, 0xcd, - 0xaf, 0x71, 0x49, 0xeb, 0x0b, 0x5d, 0xc4, 0x37, 0xc6, 0xff, 0x1c, 0xbe, 0x65, 0x60, 0x1f, 0xae, 0xf4, 0x15, 0x63, - 0xe2, 0x77, 0xc2, 0x56, 0xd8, 0x2a, 0x1d, 0x07, 0x70, 0x89, 0x8f, 0x2c, 0xb9, 0x8c, 0xe1, 0x73, 0x9a, 0x29, 0x9f, - 0xa8, 0x0f, 0x6f, 0xc2, 0xeb, 0xce, 0xd5, 0x27, 0x50, 0xf5, 0x9b, 0xe6, 0x23, 0xdf, 0x37, 0x57, 0xff, 0xe1, 0x92, - 0xd8, 0x37, 0x70, 0x91, 0xce, 0x7a, 0xac, 0x67, 0x60, 0x53, 0xbf, 0xa6, 0x09, 0x8b, 0x03, 0x3f, 0x98, 0x0b, 0x3a, - 0xa6, 0x22, 0x6f, 0xd6, 0x6e, 0x97, 0xa9, 0x8b, 0x65, 0xc8, 0xb7, 0x1f, 0x6e, 0x14, 0xf0, 0xfa, 0x5e, 0x32, 0x30, - 0x5e, 0x2d, 0xdf, 0xa8, 0xf9, 0x7e, 0x81, 0x6d, 0x89, 0x00, 0x8e, 0x5e, 0xa9, 0x06, 0xbe, 0xd6, 0x0d, 0xda, 0x61, - 0xe7, 0x11, 0xd2, 0xbc, 0x04, 0x5e, 0x8b, 0xfa, 0x7d, 0xd0, 0x3c, 0x6a, 0xfd, 0x09, 0x39, 0xdd, 0xca, 0x81, 0x86, - 0xc6, 0xa9, 0x23, 0xaa, 0x0f, 0xde, 0xd6, 0xaf, 0xfe, 0xf9, 0x9a, 0x22, 0x3e, 0xd3, 0x6b, 0x87, 0x17, 0xac, 0x9a, - 0xf8, 0xa1, 0xbe, 0xc0, 0x3e, 0x66, 0x93, 0xc0, 0xfd, 0x9c, 0xa9, 0x7e, 0xed, 0xaa, 0xfa, 0x0a, 0x32, 0x2a, 0xaa, - 0x26, 0x02, 0x2d, 0x95, 0x2f, 0x9e, 0x65, 0x9e, 0x58, 0xad, 0x02, 0x01, 0x8e, 0x58, 0xe2, 0xe0, 0x14, 0x9e, 0x51, - 0x0d, 0xc9, 0x02, 0x97, 0x00, 0x29, 0x04, 0x13, 0xa1, 0xff, 0xaf, 0x8a, 0xed, 0x0f, 0xe3, 0x5e, 0x09, 0xd3, 0x38, - 0x9b, 0x00, 0x15, 0xc6, 0xd9, 0x64, 0xc3, 0x79, 0xa3, 0xc3, 0x09, 0x6b, 0xa5, 0xd5, 0x50, 0x95, 0x93, 0x26, 0x7f, - 0x76, 0xfb, 0xde, 0xbc, 0x9f, 0xc9, 0x07, 0x1f, 0xa8, 0xf2, 0x7d, 0x57, 0xef, 0x92, 0x6d, 0x90, 0x07, 0xfa, 0x03, - 0xe1, 0x2a, 0x21, 0x0d, 0xa4, 0x1f, 0x5c, 0xea, 0xf3, 0x8c, 0xcd, 0x43, 0x7c, 0x2d, 0xfb, 0x12, 0x7a, 0xc5, 0x46, - 0x46, 0x84, 0x61, 0xcf, 0x5c, 0x6c, 0x6e, 0xaa, 0xad, 0x21, 0x6d, 0xac, 0xad, 0xfe, 0x51, 0xac, 0x32, 0x8c, 0x49, - 0xc6, 0xfd, 0xde, 0x83, 0xf2, 0xeb, 0x8c, 0xbb, 0x36, 0x01, 0xbe, 0x5a, 0x3e, 0x10, 0x34, 0xfd, 0x67, 0xf2, 0x00, - 0xbe, 0x5b, 0xfe, 0x60, 0x08, 0x9f, 0xcc, 0x0e, 0x95, 0x28, 0x78, 0x50, 0x7d, 0xbe, 0x1c, 0xf8, 0x60, 0xe3, 0x66, - 0x96, 0xe2, 0xfb, 0x8a, 0x6f, 0x23, 0xaa, 0x3b, 0x8f, 0x2a, 0x51, 0xdd, 0x79, 0xe4, 0x4a, 0xcf, 0xb6, 0xd7, 0xee, - 0x84, 0x8f, 0x1c, 0x01, 0x70, 0xd5, 0x84, 0xff, 0x6b, 0x22, 0xe0, 0x61, 0xf8, 0xa8, 0x94, 0x01, 0xaf, 0xda, 0x9d, - 0xf0, 0x48, 0x8b, 0x9b, 0x4e, 0xf8, 0xe8, 0x07, 0xc5, 0xa0, 0x35, 0x73, 0xae, 0x1f, 0x88, 0x2d, 0xa1, 0x1a, 0x9d, - 0x54, 0xe7, 0xe3, 0xa0, 0xfc, 0x06, 0x9c, 0x39, 0x9f, 0xc6, 0x25, 0xf4, 0x3c, 0x16, 0xf0, 0x21, 0x8e, 0xfa, 0xd9, - 0xad, 0xd5, 0xe1, 0x1a, 0xbf, 0xd8, 0x32, 0x05, 0x9c, 0x70, 0x1f, 0xbb, 0x37, 0x83, 0xe1, 0x5a, 0xad, 0x7a, 0x6d, - 0xb1, 0x7d, 0x7b, 0xdb, 0x6e, 0xd2, 0xd6, 0x0d, 0xed, 0x1b, 0xe2, 0x14, 0xb3, 0x60, 0xea, 0x15, 0xf1, 0x6a, 0x92, - 0x2f, 0x93, 0x62, 0x7d, 0x7e, 0xc8, 0xed, 0x13, 0xdc, 0xb9, 0x1c, 0x4d, 0xab, 0x04, 0xf4, 0x84, 0xc1, 0x75, 0xf6, - 0xa2, 0xb0, 0xa0, 0xd7, 0x9c, 0x81, 0x15, 0x96, 0x14, 0xbf, 0xa0, 0x79, 0xdf, 0x87, 0x22, 0x3f, 0xf2, 0x95, 0x23, - 0xc9, 0x2f, 0x3f, 0x46, 0x52, 0x12, 0x76, 0x55, 0x80, 0xd5, 0x25, 0x12, 0x38, 0xb5, 0x80, 0x1f, 0x1f, 0x1d, 0x1c, - 0xec, 0x3c, 0x2f, 0x4a, 0x1b, 0x83, 0xb5, 0x56, 0x1f, 0x31, 0x70, 0x59, 0x91, 0xef, 0x22, 0xba, 0x1c, 0x57, 0xa1, - 0x10, 0x19, 0x3c, 0x5d, 0xd2, 0x58, 0x86, 0x71, 0xa6, 0x53, 0x14, 0x1c, 0x86, 0x85, 0xdb, 0xf4, 0x08, 0x15, 0x5c, - 0xc6, 0xce, 0x57, 0x4a, 0xcd, 0x39, 0xe7, 0x32, 0xb6, 0x57, 0xfd, 0x32, 0x59, 0xcb, 0x85, 0x9f, 0x76, 0x7a, 0x6f, - 0xdf, 0x9f, 0x78, 0xfa, 0x78, 0x1e, 0x1f, 0x4e, 0x3b, 0xbd, 0x63, 0x65, 0x99, 0xeb, 0x8b, 0x42, 0x44, 0x5f, 0x14, - 0xf2, 0xcc, 0xa5, 0x31, 0x88, 0xd7, 0x14, 0x87, 0x7a, 0xd9, 0xbe, 0x47, 0xb3, 0x91, 0xf6, 0x29, 0xce, 0x16, 0xa9, - 0x64, 0xf0, 0x0a, 0xde, 0x43, 0xe8, 0xda, 0x84, 0x0d, 0x2b, 0x13, 0x4d, 0xad, 0x86, 0x23, 0x33, 0xeb, 0x81, 0x1c, - 0xb3, 0x94, 0xda, 0xd4, 0x52, 0x33, 0x54, 0x99, 0xf9, 0xbc, 0xd9, 0x3a, 0x5f, 0x5c, 0xce, 0x98, 0xf4, 0x6d, 0x7e, - 0xf6, 0x07, 0xd3, 0xe1, 0x58, 0x4d, 0xd5, 0xbb, 0x28, 0x8c, 0x8b, 0xd4, 0x7e, 0x6e, 0x64, 0xed, 0x03, 0xef, 0x7a, - 0xf5, 0x46, 0x42, 0xc0, 0x8d, 0x9f, 0xe9, 0x51, 0xaf, 0x74, 0x4a, 0xba, 0x75, 0xc5, 0xf1, 0xe1, 0xf4, 0xa8, 0x77, - 0x11, 0xcd, 0xcd, 0x78, 0xaf, 0xf8, 0xc6, 0xc7, 0xe2, 0x4b, 0x8e, 0xd9, 0x57, 0xa9, 0xed, 0xfa, 0x0e, 0xa5, 0x01, - 0x78, 0xc4, 0x53, 0xbf, 0x77, 0x6c, 0x94, 0x01, 0x4f, 0x05, 0x5d, 0xfd, 0x47, 0x2d, 0x9b, 0x2d, 0x9f, 0x72, 0xa5, - 0x2d, 0xe9, 0x2e, 0xce, 0x24, 0x35, 0xbf, 0xee, 0xb4, 0xdd, 0x3b, 0x8e, 0x8d, 0x9a, 0x09, 0xcc, 0x23, 0x8f, 0x0e, - 0xa1, 0x33, 0xe8, 0x72, 0x21, 0xe3, 0x87, 0xd7, 0xf4, 0xb2, 0x19, 0xcf, 0x59, 0xe5, 0x44, 0x05, 0xa5, 0xa3, 0x9c, - 0x92, 0x57, 0x33, 0xc1, 0xcf, 0x78, 0x6d, 0x91, 0x8a, 0x85, 0x17, 0xc6, 0x43, 0xab, 0x74, 0x75, 0x1a, 0x4b, 0xdf, - 0xd3, 0x1c, 0xde, 0x7a, 0x72, 0x8d, 0xec, 0x2d, 0xfc, 0xde, 0xbf, 0xfd, 0x8f, 0xff, 0x65, 0x9c, 0xb3, 0xc7, 0x87, - 0xd3, 0xb6, 0x1d, 0x6b, 0x0d, 0xd1, 0xc5, 0x31, 0x5c, 0x30, 0xab, 0xa2, 0x89, 0xf4, 0xa6, 0x39, 0x11, 0x2c, 0x69, - 0x4e, 0xe3, 0x74, 0xec, 0xf7, 0x76, 0x23, 0xc8, 0xbd, 0x59, 0x62, 0xa0, 0xae, 0x17, 0x01, 0x09, 0xfe, 0xa6, 0xbb, - 0x11, 0x36, 0xc5, 0x5e, 0x9d, 0x56, 0xf7, 0xa6, 0x44, 0x75, 0xa0, 0x6a, 0xb7, 0x25, 0x84, 0xf9, 0x2a, 0x91, 0x61, - 0x6a, 0xa2, 0x76, 0x49, 0xa2, 0xf0, 0xbd, 0x32, 0x1a, 0xf2, 0x7f, 0xff, 0xe7, 0x7f, 0xf9, 0x6f, 0xf6, 0x11, 0x82, - 0x1c, 0xff, 0xf6, 0xdf, 0xff, 0xf3, 0xff, 0xf9, 0xdf, 0xff, 0x15, 0x12, 0xeb, 0x4d, 0x20, 0x44, 0xf1, 0x09, 0xaf, - 0x8a, 0x82, 0x68, 0x86, 0xe1, 0x41, 0x32, 0xda, 0x8c, 0xe5, 0x92, 0x8d, 0xea, 0xd7, 0x26, 0xce, 0xd4, 0x84, 0xea, - 0xb0, 0x19, 0xe8, 0xd4, 0xa1, 0x2d, 0x2a, 0x1a, 0xa9, 0xa1, 0x5c, 0xd1, 0x62, 0x71, 0x7c, 0x08, 0xf8, 0xbe, 0xdf, - 0x4d, 0xb3, 0xb0, 0xdc, 0x8e, 0xa5, 0x75, 0xfd, 0x41, 0x49, 0x51, 0x95, 0x7b, 0xe0, 0x94, 0x5f, 0xc2, 0x63, 0xd4, - 0x71, 0x8a, 0xd5, 0xee, 0xd5, 0xfa, 0x74, 0x7f, 0x5a, 0xe4, 0x92, 0x8d, 0x01, 0xe5, 0xda, 0xc1, 0xa8, 0xe2, 0x9f, - 0x4d, 0x50, 0xff, 0xd2, 0xdb, 0x42, 0x8d, 0xa2, 0x6d, 0xc6, 0x87, 0x4f, 0xff, 0x54, 0xfc, 0x65, 0x06, 0x4a, 0x96, - 0x17, 0xcc, 0xe2, 0x1b, 0x63, 0x49, 0x3e, 0x6e, 0xb5, 0xe6, 0x37, 0x68, 0x59, 0xcd, 0x80, 0x77, 0x4d, 0xa6, 0x9c, - 0x92, 0xee, 0x80, 0x2a, 0x70, 0x5a, 0xfa, 0x3f, 0x5b, 0x1e, 0x38, 0x51, 0xbd, 0x56, 0x51, 0xfc, 0x79, 0xa9, 0x5c, - 0x70, 0xec, 0x17, 0x08, 0x70, 0x1a, 0x6f, 0xe5, 0x25, 0x77, 0x17, 0xb7, 0x74, 0x7a, 0x75, 0x74, 0xaf, 0x69, 0x7b, - 0xf3, 0x02, 0x95, 0x1b, 0xa0, 0x75, 0x43, 0xab, 0x0f, 0x21, 0x58, 0x3a, 0x6d, 0xe3, 0x69, 0x67, 0x59, 0x0e, 0x2f, - 0x25, 0x9f, 0xb9, 0x11, 0x59, 0x1a, 0xd3, 0x11, 0x1d, 0x5b, 0x2f, 0xaf, 0xa9, 0xd7, 0xd1, 0xd6, 0x62, 0x7a, 0xb4, - 0x65, 0x2e, 0x03, 0x92, 0x8a, 0xc4, 0x7a, 0xad, 0xe2, 0x33, 0x38, 0x81, 0xcb, 0x71, 0xca, 0x63, 0x19, 0x29, 0x82, - 0xed, 0xba, 0x71, 0xdd, 0x18, 0xd8, 0x0c, 0x5f, 0x3a, 0xf0, 0x74, 0x75, 0x53, 0xf0, 0xb7, 0xd6, 0xaf, 0xb9, 0x15, - 0xa1, 0xea, 0xee, 0x0e, 0xa5, 0xdd, 0x35, 0xdf, 0x9a, 0x70, 0xe9, 0x9b, 0x9a, 0x9f, 0xc3, 0xc8, 0x98, 0x0e, 0xda, - 0x5e, 0xaf, 0x45, 0xb5, 0xae, 0xfd, 0x4a, 0x06, 0xbe, 0x02, 0xd3, 0x5f, 0x6f, 0xa5, 0x0a, 0xa1, 0xd5, 0x1b, 0xf2, - 0x6d, 0x69, 0x05, 0xc5, 0xf3, 0xb9, 0x6a, 0x88, 0xba, 0xc7, 0x87, 0x5a, 0x79, 0x05, 0xee, 0xa1, 0x72, 0x01, 0x74, - 0xe8, 0xdd, 0x34, 0x32, 0x47, 0x41, 0xff, 0x32, 0x41, 0x79, 0xf8, 0x5c, 0x55, 0xef, 0xff, 0x01, 0xb9, 0x37, 0x65, - 0xfc, 0x3f, 0x86, 0x00, 0x00}; + 0xae, 0x27, 0x4f, 0x9e, 0x3c, 0x7b, 0x02, 0xc7, 0x7b, 0xb1, 0x18, 0xc9, 0xdb, 0x39, 0xf3, 0xa6, 0x72, 0x96, 0xf4, + 0x8e, 0xcd, 0xbf, 0x2c, 0x8a, 0x7b, 0xc7, 0x09, 0x4f, 0x3f, 0x7a, 0x19, 0x4b, 0x28, 0x1f, 0x89, 0xd4, 0x9b, 0x66, + 0x6c, 0x4c, 0xe3, 0x48, 0x46, 0x21, 0x9f, 0x45, 0x13, 0xe6, 0x1d, 0xf6, 0x8e, 0x67, 0x4c, 0x46, 0xde, 0x68, 0x1a, + 0x65, 0x39, 0x93, 0xf4, 0xc3, 0xfb, 0x2f, 0x9a, 0x4f, 0x7b, 0xc7, 0xf9, 0x28, 0xe3, 0x73, 0xe9, 0xc1, 0x90, 0x74, + 0x26, 0xe2, 0x45, 0xc2, 0x7a, 0x87, 0x87, 0xd7, 0xd7, 0xd7, 0xc1, 0x4f, 0xf9, 0x3f, 0x8d, 0x44, 0x9a, 0x4b, 0xef, + 0x15, 0xbd, 0xe6, 0x69, 0x2c, 0xae, 0x09, 0x93, 0xf4, 0x55, 0x70, 0x36, 0x8d, 0x62, 0x71, 0xfd, 0x4e, 0x08, 0x79, + 0x70, 0xe0, 0xeb, 0xc7, 0xdb, 0xd3, 0xb3, 0x33, 0x4a, 0xe9, 0x95, 0xe0, 0xb1, 0xd7, 0x5a, 0xad, 0xaa, 0xc2, 0x20, + 0x8d, 0x24, 0xbf, 0x62, 0xba, 0x0b, 0x3e, 0x38, 0x40, 0x51, 0x2c, 0xe6, 0x92, 0xc5, 0x67, 0xf2, 0x36, 0x61, 0x67, + 0x53, 0xc6, 0x64, 0x8e, 0x78, 0xea, 0x3d, 0x17, 0xa3, 0xc5, 0x8c, 0xa5, 0x32, 0x98, 0x67, 0x42, 0x0a, 0x80, 0xe4, + 0xe0, 0x00, 0x65, 0x6c, 0x9e, 0x44, 0x23, 0x06, 0xf5, 0xa7, 0x67, 0x67, 0x55, 0x8f, 0xaa, 0x11, 0xe1, 0x92, 0x9e, + 0xdd, 0xce, 0x2e, 0x45, 0xe2, 0x63, 0x92, 0x48, 0x9a, 0xb2, 0x6b, 0xef, 0x3b, 0x16, 0x7d, 0x7c, 0x1d, 0xcd, 0xbb, + 0xa3, 0x24, 0xca, 0x73, 0xef, 0x52, 0x2e, 0xd5, 0x12, 0xb2, 0xc5, 0x48, 0x8a, 0xcc, 0x97, 0x84, 0x11, 0x8e, 0x97, + 0x7c, 0xec, 0xcb, 0x29, 0xcf, 0x83, 0xf3, 0xfd, 0x51, 0x9e, 0xbf, 0x63, 0xf9, 0x22, 0x91, 0xfb, 0x74, 0xaf, 0x45, + 0xf8, 0x1e, 0xa5, 0x5c, 0x62, 0x39, 0xcd, 0xc4, 0xb5, 0xf7, 0x22, 0xcb, 0x44, 0xe6, 0xa3, 0xd3, 0xb3, 0x33, 0xdd, + 0xc2, 0xe3, 0xb9, 0x97, 0x0a, 0xe9, 0x95, 0xe3, 0x45, 0x97, 0x09, 0x0b, 0xbc, 0x0f, 0x39, 0xf3, 0x2e, 0x16, 0x69, + 0x1e, 0x8d, 0xd9, 0xe9, 0xd9, 0xd9, 0x85, 0x27, 0x32, 0xef, 0x62, 0x94, 0xe7, 0x17, 0x1e, 0x4f, 0x73, 0xc9, 0xa2, + 0x38, 0x40, 0xb8, 0xab, 0x26, 0x1b, 0xe5, 0xf9, 0x7b, 0x76, 0x23, 0xa9, 0x24, 0xea, 0x51, 0x52, 0x56, 0x4c, 0x98, + 0xf4, 0xf2, 0x72, 0x5d, 0x3e, 0x5e, 0x26, 0x4c, 0x7a, 0x92, 0xaa, 0x7a, 0xd1, 0xd5, 0xb8, 0x67, 0xfa, 0x51, 0x76, + 0xf9, 0xd8, 0x67, 0xf2, 0xe0, 0x40, 0x96, 0x78, 0xc6, 0x7a, 0x69, 0x1e, 0xa7, 0x6c, 0xcf, 0x96, 0x1d, 0x1c, 0xb0, + 0x20, 0x61, 0xe9, 0x44, 0x4e, 0x29, 0xa5, 0xed, 0x2e, 0x3f, 0x38, 0xf0, 0x25, 0x4d, 0x64, 0x30, 0x61, 0xd2, 0x67, + 0x18, 0x93, 0xaa, 0xf7, 0xc1, 0x81, 0xaf, 0x91, 0x20, 0xa8, 0x46, 0x5c, 0x0d, 0xc7, 0x38, 0x30, 0xd8, 0x3f, 0xbb, + 0x4d, 0x47, 0xbe, 0x0b, 0x3f, 0x26, 0xfc, 0xe0, 0x20, 0x91, 0x41, 0x0e, 0x23, 0x12, 0x89, 0x71, 0x91, 0x31, 0xb9, + 0xc8, 0x52, 0x4f, 0x16, 0x52, 0x9c, 0xc9, 0x8c, 0xa7, 0x13, 0x1f, 0x2f, 0x6d, 0x99, 0xd3, 0xb1, 0x28, 0x34, 0xb8, + 0x5f, 0x4b, 0x9a, 0xd1, 0x1e, 0xcc, 0x78, 0x29, 0x7d, 0xd8, 0x45, 0x31, 0xf6, 0x32, 0x4a, 0x51, 0xae, 0xfa, 0xa2, + 0x7e, 0x16, 0x66, 0x0d, 0x84, 0x88, 0x86, 0x92, 0x70, 0x89, 0xc9, 0x47, 0xea, 0x67, 0x24, 0x08, 0x02, 0x89, 0x69, + 0x6f, 0x69, 0xb1, 0x92, 0x39, 0xeb, 0xec, 0x67, 0x83, 0xd6, 0x30, 0x94, 0x41, 0xc6, 0xe2, 0xc5, 0x88, 0xf9, 0x3e, + 0x27, 0x39, 0x49, 0x31, 0xed, 0xf1, 0x86, 0x2f, 0x68, 0x0f, 0xb6, 0x5b, 0xd4, 0xf7, 0x9a, 0xd2, 0xbd, 0x16, 0x36, + 0x30, 0x0a, 0x0b, 0x20, 0x60, 0xd8, 0xc0, 0x23, 0x28, 0x45, 0xe9, 0x62, 0x76, 0xc9, 0x32, 0x54, 0x36, 0xeb, 0xd6, + 0xc8, 0x62, 0x91, 0x33, 0x6f, 0x94, 0xe7, 0xde, 0x78, 0x91, 0x8e, 0x24, 0x17, 0xa9, 0x87, 0x1a, 0xa2, 0x81, 0x34, + 0x39, 0x94, 0xd4, 0x80, 0x70, 0x81, 0xfd, 0x1c, 0x37, 0xb2, 0x41, 0xda, 0x68, 0x0f, 0x09, 0x40, 0x89, 0xbb, 0x66, + 0x3c, 0x83, 0x00, 0x46, 0x32, 0x58, 0x63, 0x41, 0x3e, 0x48, 0x58, 0xa5, 0x5a, 0x22, 0x93, 0xfd, 0x2c, 0xd8, 0x3c, + 0x28, 0x54, 0x06, 0xb3, 0x68, 0xee, 0x33, 0xda, 0x63, 0x8a, 0xb8, 0xa2, 0x74, 0x04, 0xb0, 0xd6, 0xf6, 0xad, 0xcf, + 0x42, 0x16, 0x54, 0x24, 0x85, 0x43, 0x19, 0x8c, 0x45, 0xf6, 0x22, 0x1a, 0x4d, 0xa1, 0x5f, 0x49, 0x30, 0xb1, 0x3d, + 0x6f, 0xa3, 0x8c, 0x45, 0x92, 0xbd, 0x48, 0x18, 0x3c, 0xf9, 0x48, 0xf5, 0x44, 0x98, 0xe4, 0xf4, 0x55, 0x90, 0x70, + 0xf9, 0x46, 0xa4, 0x23, 0xd6, 0xcd, 0x1d, 0xea, 0xe2, 0xb0, 0xef, 0x27, 0x52, 0x66, 0xfc, 0x72, 0x21, 0x99, 0x8f, + 0x52, 0x68, 0x81, 0x48, 0x8e, 0x09, 0x0f, 0x24, 0xbb, 0x91, 0xa7, 0x22, 0x95, 0x2c, 0x95, 0x94, 0x59, 0xa4, 0x92, + 0x2c, 0x88, 0xe6, 0x73, 0x96, 0xc6, 0xa7, 0x53, 0x9e, 0xc4, 0x3e, 0xc7, 0x05, 0x2e, 0x48, 0x24, 0x29, 0xac, 0x91, + 0xf6, 0xb2, 0x10, 0xfe, 0xd9, 0xbd, 0x1a, 0x5f, 0xd2, 0x9e, 0x3a, 0x14, 0x8c, 0x22, 0xd4, 0x1d, 0x8b, 0xcc, 0x37, + 0x2b, 0xf0, 0xc4, 0xd8, 0x93, 0x30, 0xc7, 0xbb, 0x45, 0xc2, 0x72, 0xcc, 0x1a, 0x94, 0x97, 0xdb, 0x68, 0x10, 0xfc, + 0x35, 0x50, 0x7c, 0x81, 0xfd, 0x0c, 0x87, 0x59, 0xf7, 0x2a, 0xca, 0xbc, 0x2f, 0xcc, 0x89, 0xfa, 0xc9, 0x72, 0xb3, + 0xa9, 0xa4, 0x3f, 0x05, 0x32, 0x5b, 0xe4, 0x92, 0xc5, 0xef, 0x6f, 0xe7, 0x2c, 0x27, 0xef, 0x25, 0x9d, 0xca, 0xfe, + 0x54, 0x06, 0x6c, 0x36, 0x97, 0xb7, 0x67, 0x8a, 0x31, 0x86, 0x08, 0x91, 0x11, 0xb4, 0xcc, 0x58, 0x34, 0x02, 0x66, + 0x66, 0xb0, 0xf5, 0xb5, 0x48, 0x6e, 0xc7, 0x3c, 0x49, 0xce, 0x16, 0xf3, 0xb9, 0xc8, 0x24, 0xf9, 0x2b, 0x5d, 0x4a, + 0x51, 0xa1, 0x06, 0xf6, 0x72, 0x99, 0x5f, 0x73, 0x39, 0x9a, 0xfa, 0x12, 0x2f, 0x47, 0x51, 0xce, 0xbc, 0x67, 0x42, + 0x24, 0x2c, 0x4a, 0xc3, 0x8c, 0x66, 0xfd, 0xf7, 0x32, 0x4c, 0x17, 0x49, 0xd2, 0xbd, 0xcc, 0x58, 0xf4, 0xb1, 0xab, + 0xaa, 0xdf, 0x5e, 0xfe, 0xc4, 0x46, 0x32, 0x54, 0xbf, 0x4f, 0xb2, 0x2c, 0xba, 0x85, 0x86, 0x94, 0x42, 0xb3, 0x7e, + 0x16, 0x7e, 0x75, 0xf6, 0xf6, 0x4d, 0xa0, 0x0f, 0x09, 0x1f, 0xdf, 0xfa, 0x59, 0x79, 0xf0, 0xb2, 0x82, 0x8c, 0x33, + 0x31, 0x5b, 0x9b, 0x5a, 0x63, 0x2d, 0xeb, 0xee, 0x00, 0x81, 0xd1, 0x6c, 0x4f, 0x0f, 0xed, 0x42, 0xf0, 0x46, 0xd1, + 0x3c, 0x54, 0x52, 0x33, 0x2f, 0xfc, 0x13, 0xea, 0x62, 0x3f, 0xc3, 0x77, 0x43, 0x2b, 0xb3, 0xdb, 0x25, 0xa3, 0x0a, + 0xce, 0x39, 0x48, 0x18, 0x80, 0x71, 0x14, 0xc9, 0xd1, 0x74, 0xc9, 0xd4, 0x60, 0x85, 0x85, 0x98, 0x15, 0x05, 0xb9, + 0x2e, 0xe9, 0x5d, 0xee, 0x51, 0x9a, 0x29, 0x46, 0x45, 0xe5, 0x6a, 0x95, 0x51, 0x9a, 0x61, 0xf2, 0x1d, 0x5d, 0x46, + 0x76, 0x3d, 0xe1, 0x5e, 0x8b, 0xc0, 0xb9, 0x0c, 0x35, 0x77, 0x21, 0x23, 0x91, 0x5e, 0xb1, 0x4c, 0xb2, 0x2c, 0xfc, + 0x2b, 0xc9, 0xd8, 0x38, 0x01, 0x28, 0xf6, 0xda, 0x64, 0x1a, 0xe5, 0xa7, 0xd3, 0x28, 0x9d, 0xb0, 0x38, 0xbc, 0x96, + 0x05, 0xf9, 0x3b, 0x45, 0x63, 0x9e, 0x46, 0x09, 0xff, 0x85, 0xc5, 0xc8, 0x48, 0x83, 0x13, 0x8f, 0xdd, 0x48, 0x96, + 0xc6, 0xb9, 0xf7, 0xf2, 0xfd, 0xeb, 0x57, 0x66, 0x1f, 0x6b, 0x02, 0x02, 0x2f, 0xf3, 0xc5, 0x9c, 0x65, 0x3e, 0x26, + 0x46, 0x40, 0xbc, 0xe0, 0x8a, 0x39, 0xbe, 0x8e, 0xe6, 0xba, 0x84, 0xe7, 0x1f, 0xe6, 0x71, 0x24, 0xd9, 0xd7, 0x2c, + 0x8d, 0x79, 0x3a, 0xa1, 0x7b, 0x6d, 0x5d, 0x3e, 0x8d, 0x4c, 0x45, 0x5c, 0x16, 0x9d, 0xef, 0xbf, 0x48, 0xd4, 0xba, + 0xcb, 0xc7, 0x85, 0x8f, 0x8b, 0x5c, 0x46, 0x92, 0x8f, 0xbc, 0x28, 0x8e, 0xbf, 0x4c, 0xb9, 0xe4, 0x0a, 0xc0, 0x0c, + 0xb6, 0x07, 0x48, 0x94, 0x69, 0x51, 0x61, 0x01, 0xf7, 0x31, 0xf1, 0x7d, 0x23, 0x00, 0xa6, 0xd8, 0xec, 0xd7, 0xc1, + 0x41, 0xc5, 0xee, 0xfb, 0x2c, 0xd4, 0x95, 0x74, 0x30, 0xc4, 0xc1, 0x7c, 0x91, 0xc3, 0x46, 0xdb, 0x29, 0x40, 0xba, + 0x88, 0xcb, 0x9c, 0x65, 0x57, 0x2c, 0x2e, 0x89, 0x23, 0xf7, 0xf1, 0x72, 0x6d, 0x0e, 0x73, 0x2c, 0x24, 0x1d, 0x0c, + 0xbb, 0x2e, 0xdf, 0x66, 0x86, 0xce, 0x33, 0x31, 0x67, 0x99, 0xe4, 0x2c, 0x2f, 0x59, 0x89, 0x0f, 0x52, 0xb4, 0x64, + 0x27, 0x39, 0xb5, 0xeb, 0x9b, 0xfb, 0x9c, 0x30, 0x5c, 0x63, 0x18, 0x56, 0xd0, 0xbe, 0xb8, 0x52, 0x12, 0x23, 0x27, + 0x1c, 0x13, 0xa9, 0x21, 0xcd, 0x31, 0x2e, 0x30, 0x91, 0x16, 0x5c, 0xcd, 0x8a, 0xcc, 0x6c, 0xb7, 0x20, 0xaa, 0xe9, + 0x77, 0x4a, 0x54, 0x03, 0x43, 0x8b, 0x24, 0x3b, 0x38, 0xf0, 0x59, 0x50, 0x12, 0x05, 0xdd, 0x6b, 0x9b, 0x3d, 0x72, + 0x90, 0xb5, 0x03, 0x6c, 0x98, 0x58, 0x12, 0x86, 0xc9, 0x1e, 0x0b, 0x52, 0x71, 0x32, 0x1a, 0xb1, 0x3c, 0x17, 0xd9, + 0xc1, 0xc1, 0x9e, 0x6a, 0x5f, 0x6a, 0x13, 0xb0, 0x87, 0x6f, 0xaf, 0xd3, 0x0a, 0x02, 0x5c, 0x49, 0x58, 0x23, 0x17, + 0x24, 0xc8, 0x29, 0xa5, 0x70, 0xa0, 0xbe, 0x55, 0x3c, 0x42, 0x74, 0x7e, 0x8e, 0x1a, 0x92, 0x18, 0x34, 0x4c, 0x98, + 0x9d, 0xfa, 0xf6, 0x39, 0xd3, 0xaa, 0x95, 0x52, 0x3c, 0x36, 0x30, 0xa3, 0xcf, 0x4f, 0x10, 0xb3, 0x31, 0x4f, 0x9d, + 0x65, 0xd7, 0x40, 0x22, 0x92, 0xe4, 0xb8, 0x70, 0x36, 0x74, 0xeb, 0xd0, 0x4a, 0xa7, 0xd1, 0x3b, 0xb7, 0x9c, 0x28, + 0x3d, 0xc2, 0xd9, 0xc6, 0x01, 0x1b, 0x16, 0x44, 0xa1, 0xde, 0xae, 0x26, 0x55, 0x80, 0x0e, 0xe4, 0xb0, 0x6b, 0xea, + 0x69, 0xae, 0x31, 0x97, 0xb1, 0x9f, 0x17, 0x2c, 0x97, 0x9a, 0x8e, 0x7d, 0x49, 0x52, 0xc2, 0x71, 0x01, 0xc7, 0x6d, + 0xcc, 0x27, 0x8b, 0x0c, 0xd4, 0x1d, 0x38, 0x8a, 0x2c, 0x5d, 0xcc, 0x98, 0x7d, 0xda, 0x06, 0xdb, 0xdb, 0x39, 0x08, + 0xc4, 0x1c, 0x68, 0xfa, 0x6e, 0x72, 0x02, 0x58, 0x25, 0x5e, 0xad, 0xbe, 0xb3, 0x83, 0x54, 0x5b, 0x59, 0xaa, 0x68, + 0x6b, 0x7b, 0xf2, 0x77, 0x6c, 0xe4, 0xf1, 0x5e, 0x5b, 0x43, 0xff, 0xf7, 0x21, 0xdd, 0x6b, 0x95, 0x14, 0x6c, 0x70, + 0xaa, 0x81, 0xd1, 0x28, 0x7c, 0xab, 0x07, 0xc2, 0x4a, 0xba, 0xd7, 0x88, 0x25, 0x98, 0x6e, 0xd0, 0xe9, 0x94, 0x0e, + 0x40, 0xcf, 0x08, 0xa6, 0xc3, 0x5d, 0xc4, 0x64, 0xb9, 0x81, 0x2f, 0x37, 0xeb, 0x2a, 0xa6, 0x71, 0x55, 0x67, 0x1a, + 0x6b, 0x8b, 0x40, 0xf3, 0xb2, 0x0b, 0x2a, 0x69, 0xcc, 0x1c, 0xf3, 0xaa, 0x8a, 0x70, 0x05, 0x4c, 0xb5, 0x24, 0x67, + 0x88, 0x37, 0xd1, 0x8c, 0xe5, 0x3e, 0xc3, 0x64, 0x57, 0x03, 0x4d, 0x9c, 0xd0, 0x64, 0xe8, 0x88, 0xcd, 0x1c, 0xc4, + 0x26, 0xc7, 0x5a, 0x2b, 0xab, 0x1f, 0xb7, 0x9c, 0xb0, 0x41, 0x3e, 0xac, 0x94, 0x39, 0x67, 0xf1, 0x4a, 0x1e, 0x1b, + 0xea, 0xb6, 0xf8, 0xd3, 0x65, 0x1a, 0x69, 0x4a, 0x69, 0xc8, 0x31, 0xd9, 0x6b, 0xad, 0xef, 0xa3, 0x6d, 0x55, 0xad, + 0x71, 0x30, 0x84, 0x7d, 0x50, 0xe2, 0x22, 0xe0, 0xb9, 0xfa, 0xbf, 0x76, 0xce, 0x00, 0x6d, 0x67, 0x40, 0x16, 0xc1, + 0x38, 0x89, 0xa4, 0xdf, 0x3e, 0x6c, 0x81, 0x26, 0x7a, 0xc5, 0x40, 0x9a, 0x60, 0xbc, 0xb9, 0x14, 0x16, 0x2c, 0xd2, + 0x7c, 0xca, 0xc7, 0xd2, 0x8f, 0xa4, 0x62, 0x28, 0x2c, 0xc9, 0x99, 0x27, 0x6b, 0xfa, 0xb0, 0x62, 0x36, 0x11, 0x90, + 0x5a, 0xa9, 0x7c, 0x31, 0x0b, 0xa9, 0x62, 0x5a, 0xc0, 0x1b, 0x2a, 0x5d, 0xba, 0xe2, 0x31, 0xb6, 0x35, 0x07, 0x7d, + 0xb1, 0xdd, 0xd7, 0x23, 0x86, 0x86, 0x15, 0x70, 0x47, 0x65, 0xe5, 0xa1, 0xcb, 0x1f, 0x4c, 0xa1, 0x0c, 0xa4, 0x78, + 0x25, 0xae, 0x59, 0x76, 0x1a, 0x01, 0xf0, 0xa1, 0xee, 0x5e, 0x68, 0x31, 0xa0, 0xb8, 0xbd, 0xec, 0x5a, 0x7a, 0x39, + 0x57, 0x0b, 0xff, 0x3a, 0x13, 0x33, 0x9e, 0x33, 0xd0, 0xd4, 0x34, 0xfe, 0x53, 0x38, 0x65, 0xea, 0x38, 0x82, 0xa8, + 0x61, 0x25, 0x7d, 0x9d, 0xbc, 0xaa, 0xd3, 0xd7, 0xf9, 0xfe, 0x8b, 0x89, 0x65, 0x7f, 0xf5, 0x43, 0x8c, 0x89, 0x6f, + 0xec, 0x09, 0x47, 0xca, 0x05, 0x53, 0x6c, 0xc4, 0xfb, 0x6a, 0x25, 0x1d, 0xb3, 0xad, 0xa6, 0x2b, 0x32, 0x7d, 0x6c, + 0x70, 0x11, 0xc5, 0x31, 0x68, 0x75, 0x99, 0x48, 0x12, 0x47, 0x50, 0x11, 0xde, 0x2d, 0x45, 0xd3, 0xf9, 0xfe, 0x8b, + 0xb3, 0xbb, 0xa4, 0x13, 0xd4, 0xbb, 0x02, 0xca, 0x02, 0x9a, 0xc6, 0x2c, 0x03, 0x33, 0xd2, 0xd9, 0x2d, 0x23, 0x63, + 0x4f, 0x45, 0x9a, 0xb2, 0x91, 0x64, 0x31, 0x58, 0x29, 0x9c, 0xca, 0x60, 0x2a, 0x72, 0x59, 0x16, 0x56, 0xd0, 0x73, + 0x07, 0x7a, 0x1e, 0x8c, 0xa2, 0x24, 0xf1, 0xb5, 0x45, 0x32, 0x13, 0x57, 0x6c, 0x0b, 0xd4, 0xdd, 0x1a, 0xc8, 0xe5, + 0x30, 0xcc, 0x19, 0x86, 0x05, 0xf9, 0x3c, 0xe1, 0x23, 0x56, 0x0a, 0xae, 0xb3, 0x80, 0xa7, 0x31, 0xbb, 0x01, 0x3e, + 0x82, 0x7b, 0xbd, 0x5e, 0x8b, 0xb4, 0x71, 0xa1, 0x11, 0xbe, 0xdc, 0x40, 0xec, 0x1d, 0x22, 0x13, 0x88, 0x8c, 0xf6, + 0x96, 0xdb, 0xf8, 0x01, 0xc3, 0x8e, 0x9c, 0xe4, 0xd6, 0xb2, 0xd2, 0xbc, 0x19, 0x93, 0x98, 0x25, 0x4c, 0x32, 0xcb, + 0xcb, 0x41, 0x7f, 0xd6, 0x47, 0xf7, 0x5d, 0x89, 0xbf, 0x92, 0x9c, 0xec, 0x29, 0xb3, 0x7b, 0x9e, 0x97, 0x96, 0x7a, + 0xb5, 0x3d, 0x15, 0xb6, 0xfb, 0x52, 0x6f, 0x4f, 0x24, 0x65, 0x34, 0x9a, 0x6a, 0x13, 0xdd, 0xdf, 0x58, 0x52, 0x35, + 0x86, 0xe1, 0xeb, 0xe5, 0x21, 0xfa, 0x60, 0xc1, 0xdc, 0x86, 0x82, 0x33, 0xc3, 0x14, 0x18, 0x58, 0x7d, 0x7a, 0xdb, + 0x4e, 0xa3, 0x24, 0xb9, 0x8c, 0x46, 0x1f, 0xeb, 0xd4, 0x5f, 0x91, 0x01, 0x5d, 0xe7, 0xc6, 0x4e, 0x95, 0xc3, 0xb2, + 0xdc, 0x75, 0x5b, 0x2e, 0x5d, 0x3b, 0x28, 0xfe, 0x5e, 0xab, 0x22, 0xfb, 0xfa, 0x46, 0xef, 0xa4, 0x76, 0x05, 0x11, + 0x37, 0x2b, 0xf3, 0x81, 0x0b, 0x7c, 0x92, 0xe2, 0x2c, 0x3f, 0x30, 0x74, 0x07, 0xb6, 0x46, 0xb1, 0x06, 0x88, 0xc4, + 0xcb, 0x22, 0xe6, 0xf9, 0x6e, 0x0c, 0xfc, 0x21, 0x50, 0x3e, 0x77, 0x66, 0xb8, 0x2f, 0xa0, 0x25, 0x8f, 0x33, 0x2a, + 0x73, 0x09, 0x99, 0xd1, 0x26, 0x2c, 0xa3, 0xf9, 0x1b, 0x68, 0x2e, 0x8a, 0xde, 0xdf, 0xea, 0x2a, 0xd0, 0xc9, 0x00, + 0x8a, 0xbc, 0xeb, 0x2a, 0x13, 0x35, 0x0a, 0x30, 0x3c, 0x95, 0x2b, 0x91, 0x9b, 0xd6, 0x8c, 0x47, 0xa3, 0xae, 0x6b, + 0xfb, 0xdb, 0xb0, 0x5c, 0x41, 0x7d, 0xdf, 0xcf, 0xc1, 0x7e, 0xb3, 0x7a, 0x7d, 0xb5, 0x88, 0x7c, 0x63, 0x11, 0x79, + 0xe0, 0x18, 0x59, 0xb8, 0xa2, 0x65, 0xa7, 0x7b, 0xf8, 0x57, 0xec, 0x36, 0x02, 0x65, 0x35, 0x00, 0xfe, 0x8c, 0x4b, + 0x76, 0x9b, 0x50, 0x49, 0x84, 0x31, 0x70, 0x0c, 0xa5, 0x01, 0xc3, 0xa8, 0xba, 0xa4, 0x58, 0x1f, 0x8d, 0x9a, 0xb1, + 0x9b, 0x12, 0x81, 0xd7, 0x34, 0xfb, 0xa2, 0x30, 0x38, 0x62, 0xd8, 0xec, 0x4d, 0x4d, 0x25, 0x76, 0xb0, 0x42, 0x52, + 0x6a, 0xd4, 0x60, 0xad, 0xf5, 0xac, 0xe3, 0xa6, 0x1c, 0x17, 0x0e, 0x6a, 0x85, 0x9a, 0x9a, 0x3e, 0x69, 0x15, 0xab, + 0x14, 0x93, 0xa9, 0xd5, 0x48, 0x45, 0xb5, 0x6e, 0x4a, 0x91, 0xf5, 0x46, 0xa0, 0xfe, 0xb2, 0x66, 0x12, 0x86, 0x4e, + 0xb3, 0x22, 0x04, 0x96, 0x2a, 0xb6, 0xa1, 0x7b, 0x1b, 0xcd, 0xd4, 0xc6, 0x71, 0x10, 0x2e, 0x5c, 0x84, 0x3b, 0x98, + 0x4d, 0x35, 0xe7, 0x4a, 0x87, 0x74, 0x5a, 0xef, 0xeb, 0x33, 0x22, 0xf4, 0x3e, 0x6c, 0x20, 0x71, 0x5d, 0xf1, 0x54, + 0x24, 0x08, 0x06, 0x6c, 0x0e, 0xca, 0x9d, 0x2b, 0x1f, 0x7c, 0x80, 0x9d, 0xaf, 0x56, 0x1b, 0x44, 0xb7, 0x55, 0xff, + 0xc4, 0x41, 0x65, 0x14, 0xae, 0x56, 0xd7, 0x12, 0xfb, 0x46, 0xf3, 0x25, 0x0c, 0xf7, 0x2d, 0xc7, 0x3d, 0x79, 0x05, + 0xad, 0x94, 0x22, 0x5a, 0x95, 0x94, 0x26, 0x43, 0x9d, 0x66, 0xeb, 0xfb, 0x24, 0x1d, 0xb6, 0x7d, 0xba, 0xc1, 0xbd, + 0x54, 0xa1, 0x11, 0xd3, 0xd5, 0x92, 0x4f, 0xcd, 0xd0, 0x1c, 0x63, 0x1c, 0xe6, 0xca, 0x8a, 0xd9, 0xdb, 0x66, 0x58, + 0x1e, 0x1c, 0xe4, 0xce, 0x40, 0xe7, 0x25, 0x9b, 0xf8, 0xc9, 0x07, 0x91, 0x9c, 0xdf, 0xa6, 0x4a, 0x77, 0xf9, 0xc9, + 0x0a, 0xa1, 0x0d, 0xb3, 0xb4, 0xd5, 0x05, 0x6b, 0x3c, 0xba, 0x8e, 0xb8, 0xf4, 0xca, 0x51, 0xb4, 0x35, 0xee, 0x33, + 0xbc, 0x34, 0xaa, 0x46, 0x90, 0x31, 0x50, 0x1e, 0x81, 0x27, 0x58, 0x15, 0x5a, 0xd3, 0xfd, 0x68, 0xca, 0xc0, 0x11, + 0x6c, 0xb5, 0x88, 0xd2, 0x2e, 0xdc, 0x33, 0x52, 0xc4, 0x0c, 0xbc, 0x1d, 0xf6, 0x62, 0xbd, 0x7b, 0xcd, 0x0e, 0x98, + 0xb3, 0x6c, 0x2c, 0xb2, 0x99, 0xad, 0x2b, 0xd6, 0x9e, 0x0d, 0x67, 0xe4, 0x63, 0x7f, 0xeb, 0xd8, 0x46, 0xfd, 0xef, + 0xae, 0x19, 0xdd, 0x95, 0xb9, 0x5e, 0x13, 0xa5, 0xa5, 0xf4, 0xd5, 0xfe, 0x40, 0x4b, 0x99, 0xb9, 0x6b, 0xde, 0x1b, + 0x67, 0x6a, 0x57, 0x3b, 0x4c, 0xf6, 0xda, 0xdd, 0xd2, 0xe6, 0xb3, 0xd4, 0xd0, 0xd5, 0x8e, 0x0d, 0x23, 0x52, 0xc5, + 0x22, 0x89, 0x0d, 0xb0, 0x1c, 0x13, 0x66, 0xe8, 0xe8, 0x9a, 0x27, 0x49, 0x55, 0xfa, 0x6b, 0xf8, 0x7a, 0x6e, 0xf8, + 0x7a, 0x6a, 0xf9, 0x3a, 0x70, 0x0a, 0xe0, 0xeb, 0x7a, 0xb8, 0xaa, 0x7b, 0xba, 0x71, 0x3a, 0x53, 0xcd, 0xd1, 0x73, + 0x65, 0x47, 0xc3, 0x7c, 0x0b, 0x0b, 0x01, 0x2e, 0x35, 0xaf, 0x8f, 0xbe, 0x71, 0xc2, 0x80, 0x01, 0xa8, 0x5d, 0x98, + 0xcc, 0x75, 0x51, 0x7c, 0xf4, 0x31, 0xc9, 0x0b, 0x56, 0x52, 0xf6, 0xc9, 0x0b, 0x70, 0xd2, 0x39, 0xcb, 0x01, 0x21, + 0xa6, 0x8a, 0x7f, 0x95, 0x12, 0x65, 0x57, 0xc7, 0xcd, 0xea, 0x72, 0xbb, 0x3a, 0xe0, 0xf4, 0xd5, 0xea, 0xe2, 0xbb, + 0x79, 0xbd, 0x5a, 0x1e, 0x2f, 0x97, 0x57, 0xed, 0xf7, 0x6a, 0xe5, 0xaf, 0x95, 0x80, 0xff, 0xde, 0x98, 0x28, 0x59, + 0x39, 0x3a, 0xf0, 0x00, 0x17, 0x33, 0x50, 0x50, 0xe8, 0x45, 0x97, 0x22, 0xee, 0xd5, 0xa7, 0x1c, 0x3c, 0xca, 0x4d, + 0xaf, 0xfb, 0x9f, 0x8a, 0xd9, 0x1c, 0xb4, 0xb1, 0x35, 0x92, 0x9e, 0x30, 0x33, 0x61, 0x55, 0x5f, 0x6c, 0x29, 0xab, + 0xf5, 0x51, 0xe7, 0xb1, 0x46, 0x4d, 0xa5, 0xbd, 0xbc, 0xd7, 0x2a, 0x16, 0x65, 0x51, 0xc9, 0x38, 0xb6, 0x39, 0x55, + 0x4e, 0xd7, 0x5d, 0x32, 0xb6, 0xe2, 0xad, 0xcf, 0x35, 0x1f, 0xe6, 0xc0, 0xeb, 0x1c, 0xf6, 0x63, 0xc9, 0xdd, 0xdd, + 0xff, 0xa2, 0x42, 0xce, 0xb2, 0x58, 0x43, 0xdf, 0xb2, 0x28, 0x4e, 0xb4, 0x91, 0x4d, 0x4e, 0x76, 0x5b, 0xc3, 0x55, + 0x9d, 0x31, 0x16, 0x07, 0x43, 0x72, 0xb2, 0xa9, 0x3a, 0xd2, 0xe5, 0x4c, 0xc4, 0x2c, 0x44, 0x62, 0xce, 0x52, 0x54, + 0x80, 0x57, 0xd5, 0xec, 0xfd, 0x48, 0xfa, 0xcb, 0x77, 0x75, 0xf7, 0x6a, 0x78, 0x52, 0x80, 0xf7, 0xeb, 0x8b, 0x4d, + 0xc7, 0xeb, 0xb7, 0x2c, 0xcb, 0x95, 0x22, 0x5a, 0xea, 0xb4, 0x5f, 0x54, 0x62, 0xe9, 0x8b, 0x70, 0x67, 0xfb, 0xca, + 0x04, 0x41, 0xed, 0xe0, 0x71, 0x70, 0x84, 0xb0, 0x72, 0x0b, 0x7f, 0x65, 0x0e, 0xfc, 0x73, 0xeb, 0x16, 0x7e, 0x41, + 0x9f, 0xd7, 0xbd, 0xc2, 0xb1, 0xa4, 0x2f, 0xfa, 0x2f, 0xac, 0xc5, 0x2c, 0x12, 0x3e, 0xba, 0xf5, 0x51, 0xc2, 0x65, + 0x13, 0x42, 0x6f, 0x88, 0x2c, 0x75, 0x05, 0xb8, 0x14, 0x95, 0x3b, 0xbb, 0xb0, 0xb6, 0x1e, 0x91, 0x92, 0xa2, 0xfd, + 0x84, 0xcb, 0x7d, 0x44, 0x66, 0xf4, 0x02, 0x7e, 0xec, 0x2f, 0xfd, 0xd7, 0x91, 0x9c, 0x06, 0x59, 0x94, 0xc6, 0x62, + 0xe6, 0xe3, 0x06, 0x42, 0x38, 0xc8, 0x95, 0xbd, 0xf1, 0x39, 0x2e, 0xf6, 0x2f, 0xc8, 0x8d, 0xa4, 0xa8, 0x8f, 0x1a, + 0x33, 0xf2, 0x52, 0xd2, 0x8b, 0xe3, 0xfd, 0xe5, 0x8d, 0x2c, 0x7a, 0x17, 0xe4, 0xa6, 0xf4, 0xd8, 0x93, 0xaf, 0xa9, + 0x8f, 0x69, 0xef, 0xc6, 0x40, 0x73, 0x2a, 0x66, 0xda, 0x73, 0x8f, 0x30, 0xf9, 0x00, 0x71, 0x95, 0xac, 0xe2, 0x36, + 0x26, 0xb4, 0xb2, 0x47, 0x91, 0x50, 0x2e, 0x02, 0x74, 0x70, 0xe0, 0x94, 0x95, 0xaa, 0x02, 0x39, 0x91, 0xb4, 0x66, + 0x90, 0x93, 0x37, 0x2a, 0x42, 0x73, 0x22, 0xfd, 0x0c, 0xdb, 0x61, 0x7c, 0xeb, 0x87, 0x36, 0x47, 0x33, 0x1b, 0x68, + 0x0f, 0x43, 0xc0, 0x25, 0xcb, 0x22, 0x29, 0xb2, 0x21, 0x76, 0xd5, 0x0f, 0xf2, 0x37, 0x7a, 0x31, 0xf0, 0xfe, 0xd3, + 0x3f, 0xfd, 0x38, 0xfe, 0x31, 0x1b, 0x5e, 0x90, 0xb7, 0xf4, 0xf0, 0xd8, 0xef, 0x87, 0xfe, 0x5e, 0xb3, 0xb9, 0xfa, + 0xf1, 0x70, 0xf0, 0x8f, 0xa8, 0xf9, 0xcb, 0x49, 0xf3, 0x87, 0x21, 0x5e, 0xf9, 0x3f, 0x1e, 0xf6, 0x07, 0xe6, 0x69, + 0xf0, 0x8f, 0xde, 0x8f, 0xf9, 0xf0, 0xcf, 0xba, 0x70, 0x1f, 0xe3, 0xc3, 0x09, 0x59, 0x48, 0x7a, 0xd8, 0x6c, 0xf6, + 0x0e, 0x27, 0x64, 0x2e, 0xe9, 0x21, 0xfc, 0x7f, 0x49, 0xdf, 0xb1, 0xc9, 0x8b, 0x9b, 0xb9, 0x7f, 0xd1, 0x5b, 0xed, + 0x2f, 0xff, 0x56, 0xc0, 0xa8, 0x83, 0x7f, 0xfc, 0xf8, 0x63, 0x8e, 0x1e, 0xf4, 0xe8, 0xe1, 0xb0, 0x81, 0x7d, 0x28, + 0xfd, 0x33, 0x55, 0xff, 0xfa, 0xfd, 0x70, 0xf0, 0x0f, 0x03, 0x05, 0x7a, 0xf0, 0xe3, 0xc5, 0x71, 0x8f, 0x0e, 0x57, + 0x3e, 0x5a, 0x3d, 0xc0, 0x2b, 0x8c, 0x57, 0xfb, 0xf8, 0x82, 0xa0, 0x09, 0xc2, 0x64, 0x22, 0xe9, 0xe1, 0x83, 0xc3, + 0x09, 0xb9, 0x92, 0xf4, 0x10, 0x1d, 0x4e, 0xc8, 0x0b, 0x49, 0x0f, 0xff, 0xe1, 0xf7, 0x43, 0xed, 0x61, 0x5b, 0x29, + 0xf7, 0xc6, 0x0a, 0x82, 0x1b, 0x51, 0xc6, 0xa2, 0x95, 0xe4, 0x32, 0x61, 0x78, 0xff, 0x90, 0x93, 0x33, 0x85, 0x26, + 0x5f, 0x82, 0x13, 0x06, 0x6c, 0x3b, 0x7f, 0x79, 0x0e, 0x9b, 0x0d, 0x34, 0xb3, 0x1f, 0x66, 0x44, 0xfb, 0x01, 0xf2, + 0x50, 0x92, 0xab, 0x28, 0x59, 0xb0, 0x3c, 0x64, 0x05, 0x26, 0x23, 0x7a, 0x26, 0xfd, 0x36, 0x26, 0xef, 0x24, 0xfc, + 0xe8, 0x60, 0x72, 0x66, 0x02, 0x98, 0x70, 0x90, 0x35, 0x51, 0xa5, 0x42, 0x6b, 0x2c, 0x08, 0x93, 0xf9, 0x96, 0x4a, + 0x39, 0x05, 0xef, 0x02, 0x26, 0xe3, 0x5a, 0xb8, 0x93, 0x5c, 0x53, 0x4b, 0x12, 0xef, 0x33, 0xc6, 0xbe, 0x8b, 0x92, + 0x8f, 0x2c, 0xf3, 0x6f, 0x48, 0xbb, 0xf3, 0x39, 0x51, 0x2e, 0xe8, 0xbd, 0x36, 0xee, 0x96, 0xb1, 0xaa, 0x53, 0xa9, + 0x63, 0x04, 0x20, 0x64, 0xeb, 0xbe, 0x18, 0xd8, 0xf1, 0xbd, 0x6c, 0xc3, 0x61, 0x95, 0x45, 0xd7, 0x08, 0xd7, 0xe3, + 0xa2, 0x3c, 0xbd, 0x8a, 0x12, 0x1e, 0x7b, 0x92, 0xcd, 0xe6, 0x49, 0x24, 0x99, 0x67, 0xd6, 0xeb, 0x45, 0x30, 0x10, + 0x2a, 0x55, 0x86, 0xd8, 0x31, 0x38, 0x63, 0x1b, 0x70, 0x82, 0xb3, 0xe2, 0x43, 0x74, 0xca, 0xa8, 0x1d, 0xaf, 0xab, + 0xe0, 0xd7, 0x7a, 0x7c, 0xaf, 0xd9, 0x06, 0x47, 0xd8, 0x50, 0x89, 0xe7, 0x9c, 0xa4, 0x14, 0x84, 0x68, 0xa7, 0x8f, + 0x8e, 0xf3, 0xab, 0x49, 0x0f, 0x41, 0x6c, 0x46, 0xd0, 0xb7, 0xca, 0x2f, 0x04, 0x0d, 0xa6, 0xb4, 0xd5, 0x9d, 0x1e, + 0xb3, 0xee, 0xb4, 0xd1, 0xb0, 0x3a, 0x74, 0x42, 0xb3, 0xc1, 0x54, 0x77, 0x8f, 0x48, 0x4c, 0x16, 0xb4, 0xd9, 0x26, + 0x13, 0xda, 0x52, 0x5d, 0xba, 0x93, 0xe3, 0xc4, 0x4c, 0x73, 0x70, 0xe0, 0x8b, 0x20, 0x89, 0x72, 0xf9, 0x25, 0x18, + 0xfb, 0x74, 0x42, 0x62, 0x2a, 0x02, 0x76, 0xc3, 0x46, 0x7e, 0x82, 0x49, 0x6c, 0x38, 0x0d, 0xee, 0xe2, 0x09, 0x75, + 0x9a, 0x81, 0x11, 0x41, 0xdf, 0xf6, 0xe3, 0x41, 0x7b, 0x48, 0x29, 0x45, 0x7b, 0xcd, 0x26, 0xea, 0x0b, 0xba, 0x90, + 0x21, 0x94, 0x38, 0xaa, 0x32, 0x9d, 0x43, 0x51, 0xc7, 0x29, 0xf2, 0x5f, 0xc8, 0x40, 0xb2, 0x5c, 0xfa, 0x50, 0x0c, + 0xe6, 0x7f, 0x6e, 0x09, 0x1b, 0x1d, 0x1f, 0xa2, 0x06, 0x94, 0x2a, 0xe2, 0xc4, 0x44, 0xd0, 0x4b, 0x1c, 0xc6, 0x83, + 0xa3, 0xa1, 0xcb, 0xff, 0x55, 0x21, 0x4c, 0x7e, 0xd9, 0x8f, 0x07, 0x2d, 0x35, 0x79, 0x0f, 0xf5, 0x7d, 0x41, 0x73, + 0xad, 0xa0, 0xf5, 0xf3, 0xf0, 0xad, 0x5a, 0x2a, 0x0e, 0x0d, 0x70, 0x66, 0xde, 0x05, 0x6d, 0x76, 0x42, 0x7f, 0xe1, + 0x2e, 0xa2, 0x09, 0x93, 0x19, 0x2c, 0x90, 0x88, 0x42, 0x7b, 0x22, 0x28, 0xcc, 0x58, 0x75, 0xbb, 0x0c, 0xcd, 0xf3, + 0x03, 0xf4, 0xa0, 0x7f, 0x25, 0xc3, 0x89, 0xd4, 0xd3, 0x5f, 0xc9, 0xd5, 0x0a, 0xfe, 0x9f, 0xc8, 0xbe, 0xa0, 0x97, + 0xaa, 0x68, 0x61, 0x8a, 0xe6, 0x50, 0xf4, 0x36, 0x04, 0x50, 0x49, 0x5e, 0x2a, 0x59, 0x7a, 0x4f, 0xae, 0xa8, 0x82, + 0xfd, 0xe0, 0x20, 0x1b, 0x4c, 0x1b, 0xed, 0x21, 0xf8, 0xf7, 0x33, 0x99, 0x7f, 0xc7, 0xe5, 0xd4, 0x47, 0x87, 0x3d, + 0x84, 0xfb, 0xc8, 0x83, 0xad, 0xed, 0xa6, 0x0d, 0xaa, 0x31, 0x9c, 0x34, 0x5e, 0xca, 0x70, 0xd1, 0xa3, 0xad, 0xbe, + 0xcf, 0x8d, 0x3f, 0x0f, 0x93, 0xc4, 0x30, 0xce, 0x16, 0x59, 0xe0, 0x86, 0x94, 0x0d, 0xfb, 0xbc, 0xc0, 0x8d, 0x59, + 0xe3, 0x0a, 0x87, 0x49, 0x63, 0xd6, 0xf0, 0x17, 0x94, 0xd2, 0x66, 0xa7, 0xec, 0x66, 0xa5, 0xdf, 0x14, 0x87, 0x57, + 0xd6, 0xd9, 0x39, 0x50, 0xc7, 0x21, 0x6d, 0xf8, 0xd9, 0x80, 0x0d, 0x57, 0x2b, 0x74, 0xdc, 0xef, 0x21, 0xdc, 0xf0, + 0x2d, 0xa1, 0x1d, 0x5a, 0x4a, 0xc3, 0x98, 0xf0, 0x61, 0x61, 0x42, 0x49, 0xef, 0x6b, 0x61, 0xa3, 0x65, 0x75, 0xd8, + 0x1d, 0x1e, 0xc0, 0x8a, 0xd2, 0x8e, 0xd1, 0xfa, 0xea, 0x1c, 0x96, 0x69, 0x89, 0x39, 0xa5, 0x2d, 0x22, 0xa8, 0xf5, + 0x5d, 0x4f, 0xa9, 0xac, 0x08, 0x3e, 0xa1, 0x55, 0x73, 0x32, 0x88, 0x48, 0x3c, 0xa4, 0xaf, 0xb5, 0x3d, 0xd2, 0xb5, + 0x7e, 0x71, 0x96, 0xd0, 0xf7, 0x6b, 0xd1, 0xdb, 0x08, 0x62, 0x2b, 0xd7, 0xc1, 0x68, 0x91, 0x65, 0x2c, 0x95, 0x6f, + 0x44, 0x6c, 0xd4, 0x34, 0x96, 0x80, 0xa5, 0x04, 0x61, 0x59, 0x02, 0x3a, 0x5a, 0xc7, 0x9e, 0x8c, 0xc5, 0x46, 0xf5, + 0x84, 0x2e, 0xb4, 0xfa, 0xa4, 0x82, 0xb5, 0xdd, 0x89, 0xb1, 0x8b, 0x7d, 0x4c, 0x16, 0x26, 0x8a, 0xeb, 0x07, 0x41, + 0x30, 0x09, 0x46, 0x50, 0x0d, 0x13, 0xe4, 0xb8, 0x50, 0xe7, 0xc8, 0xcf, 0xe9, 0x75, 0x90, 0xb2, 0x1b, 0x35, 0xab, + 0x8f, 0x2b, 0xc9, 0x6c, 0x8f, 0xd7, 0xf1, 0xb4, 0xab, 0xd8, 0x4d, 0x1e, 0xa4, 0x22, 0x66, 0x80, 0x1e, 0x88, 0xdb, + 0x9b, 0xa2, 0x69, 0x94, 0xbb, 0xf1, 0xa9, 0x0a, 0xbe, 0x81, 0xeb, 0xbc, 0x9e, 0x80, 0xc7, 0x57, 0xe9, 0x5a, 0x65, + 0x63, 0xed, 0x06, 0xc7, 0x98, 0x8f, 0xfd, 0x49, 0x00, 0x71, 0x3d, 0x45, 0x42, 0x12, 0x4c, 0xb9, 0x89, 0x4b, 0x54, + 0xb3, 0x72, 0xcc, 0x2b, 0x1a, 0x0f, 0x44, 0xa3, 0xa1, 0xbc, 0xd0, 0x0b, 0x4d, 0x12, 0x13, 0x4c, 0xae, 0xca, 0xb3, + 0x65, 0xdb, 0xbd, 0x95, 0xb4, 0x3e, 0x95, 0x7f, 0x55, 0x77, 0xe7, 0x36, 0xa4, 0xc4, 0xca, 0x53, 0x28, 0xfd, 0x19, + 0x26, 0xcf, 0xe8, 0xa1, 0x3f, 0x08, 0xfa, 0x7f, 0x19, 0xe2, 0xbe, 0x1f, 0xfc, 0x19, 0x1f, 0x6a, 0xce, 0x71, 0x85, + 0xbb, 0x89, 0x9e, 0x63, 0xa9, 0xe2, 0x97, 0x6d, 0xa2, 0x3c, 0x89, 0x61, 0x4a, 0xd2, 0x68, 0xc6, 0xc2, 0x67, 0x70, + 0xc8, 0x2d, 0xe1, 0xbc, 0x95, 0x04, 0x28, 0x29, 0x7c, 0x66, 0x78, 0x49, 0x80, 0xfa, 0xaf, 0x64, 0xf9, 0xd4, 0x47, + 0xfd, 0xe7, 0xd5, 0xd3, 0x5f, 0x50, 0xff, 0x17, 0x19, 0xfe, 0x5c, 0x18, 0x6f, 0x77, 0x6d, 0x8e, 0xc7, 0x76, 0x8e, + 0x42, 0x6f, 0x8d, 0x83, 0xbb, 0x05, 0xde, 0x74, 0x74, 0x4c, 0x70, 0xc1, 0xc7, 0x25, 0x33, 0xca, 0x03, 0x19, 0x4d, + 0x00, 0xa9, 0xce, 0x1e, 0xe4, 0x6e, 0x5c, 0xbf, 0x5a, 0x31, 0x90, 0x8a, 0xa5, 0x57, 0x40, 0xe6, 0xa4, 0xd7, 0xc2, + 0xcb, 0x5a, 0x5b, 0xa5, 0x33, 0xd5, 0xe3, 0xe8, 0x25, 0x9f, 0xbe, 0xa2, 0xad, 0xee, 0xd5, 0xf1, 0xa4, 0x7b, 0xd5, + 0x68, 0xe0, 0xdc, 0x92, 0xd6, 0x62, 0x70, 0x35, 0x24, 0x5f, 0x83, 0x53, 0xcf, 0xa5, 0x25, 0x52, 0x5b, 0x5e, 0xc7, + 0x2c, 0xaf, 0xd1, 0x48, 0x0b, 0xdc, 0x75, 0xba, 0x4e, 0x74, 0xd7, 0xa2, 0xd0, 0x38, 0x59, 0x27, 0xb5, 0xa7, 0x58, + 0x95, 0x40, 0x32, 0x14, 0xa5, 0xf4, 0x46, 0xe2, 0xad, 0xa3, 0xc2, 0x98, 0xd0, 0x5d, 0x9d, 0x59, 0x60, 0x9f, 0x5a, + 0x4a, 0xf8, 0x80, 0x05, 0xe8, 0x5a, 0x7a, 0x82, 0x67, 0x64, 0xd1, 0x68, 0x2b, 0x32, 0x6f, 0xb6, 0xbb, 0xf5, 0xb1, + 0x9e, 0x54, 0x63, 0x91, 0x45, 0x83, 0xce, 0x4a, 0x2c, 0x15, 0x69, 0xa3, 0x51, 0xd4, 0x83, 0x9d, 0xf6, 0xe4, 0xd6, + 0x02, 0x10, 0x37, 0xeb, 0x49, 0x19, 0x56, 0xc2, 0x56, 0x32, 0x95, 0x07, 0x3c, 0x4d, 0x59, 0x06, 0x52, 0x94, 0x4a, + 0xc2, 0x8b, 0xa2, 0x92, 0xec, 0x20, 0x46, 0x09, 0xa3, 0x19, 0x70, 0x1e, 0x65, 0x77, 0x91, 0x94, 0x08, 0x32, 0x55, + 0x7c, 0x83, 0x52, 0x7a, 0x66, 0xd3, 0x59, 0xa4, 0xe2, 0x41, 0x09, 0xe5, 0x8e, 0x4c, 0xca, 0x29, 0x0b, 0xce, 0xf7, + 0x4f, 0xc5, 0x9d, 0x36, 0xd9, 0x80, 0x0f, 0x43, 0xd5, 0x2c, 0x31, 0x9c, 0x2b, 0xa2, 0x1f, 0x7c, 0x89, 0xcb, 0xe8, + 0x48, 0xa0, 0x18, 0xe0, 0x73, 0x9e, 0x31, 0xa5, 0x83, 0xef, 0x5b, 0xbb, 0x2f, 0xa9, 0x2b, 0x90, 0x89, 0xeb, 0xbd, + 0x01, 0x44, 0x46, 0xe0, 0xdc, 0x49, 0xe9, 0x46, 0xb3, 0xf3, 0xfd, 0x93, 0xb7, 0xdb, 0x6c, 0xe0, 0xd5, 0xca, 0x58, + 0xbf, 0x4a, 0xb7, 0x21, 0x51, 0x05, 0x69, 0x62, 0x7e, 0x84, 0x7e, 0xa2, 0x54, 0xa4, 0xc8, 0xcf, 0x80, 0x8a, 0xce, + 0xf7, 0x4f, 0xde, 0xfb, 0x99, 0xf2, 0x2d, 0x61, 0xe2, 0x2e, 0xdb, 0x17, 0xd4, 0x9f, 0x52, 0x86, 0xf5, 0xda, 0x4b, + 0xd6, 0x25, 0x1c, 0x01, 0x1e, 0x4e, 0x55, 0x25, 0x58, 0x10, 0x03, 0x3e, 0xa4, 0x89, 0xc1, 0x00, 0x4d, 0x30, 0x49, + 0x6a, 0x76, 0x19, 0x85, 0x0d, 0x50, 0x73, 0x9d, 0xc1, 0x4e, 0x04, 0x5a, 0xf5, 0xc3, 0x24, 0x51, 0xb3, 0xca, 0x42, + 0x0b, 0x8f, 0x67, 0x1b, 0x59, 0x69, 0x95, 0x39, 0xfa, 0x2d, 0xd8, 0x4e, 0xf6, 0xe1, 0x0d, 0xb5, 0x96, 0x84, 0x29, + 0x78, 0x6e, 0xd3, 0xc7, 0xce, 0xf7, 0x4f, 0x5e, 0x9b, 0x0c, 0xb2, 0x79, 0x64, 0xf9, 0xfd, 0x86, 0x89, 0x79, 0xf2, + 0x3a, 0xa8, 0x6a, 0x55, 0xe3, 0xf3, 0xfd, 0x93, 0x0f, 0xdb, 0x9a, 0x41, 0x79, 0xb1, 0xa8, 0x6c, 0x7c, 0x05, 0xdf, + 0x92, 0x25, 0xe1, 0xd2, 0x08, 0x87, 0x90, 0x17, 0x44, 0x09, 0xa4, 0x30, 0x2f, 0x4a, 0xd7, 0xc8, 0x73, 0x92, 0x52, + 0x15, 0x06, 0xaa, 0xef, 0x9a, 0x51, 0xf3, 0xb8, 0x48, 0xcf, 0x46, 0x62, 0xce, 0x76, 0xc4, 0x86, 0x6e, 0x70, 0xc0, + 0x67, 0x90, 0x3a, 0xa3, 0x40, 0xe7, 0x64, 0xaf, 0x85, 0xbb, 0x75, 0xf1, 0x95, 0x2a, 0x22, 0x15, 0x35, 0xd9, 0x42, + 0xa6, 0xb4, 0x45, 0x12, 0xda, 0x22, 0x11, 0xcd, 0x07, 0x2d, 0x2d, 0x20, 0xba, 0x51, 0x39, 0xae, 0x16, 0x33, 0x90, + 0x15, 0x66, 0x4e, 0xab, 0x16, 0xc0, 0x71, 0x37, 0x52, 0xbe, 0x47, 0x25, 0xd3, 0x63, 0x45, 0x16, 0x6f, 0x7c, 0x41, + 0x84, 0x1a, 0xf8, 0x8c, 0x5f, 0x26, 0x90, 0x58, 0x02, 0xab, 0x22, 0x12, 0x87, 0x65, 0xd3, 0xb6, 0x69, 0x1a, 0x05, + 0x6a, 0x9f, 0x04, 0x89, 0x02, 0xe0, 0xdc, 0x24, 0x32, 0x79, 0x38, 0xf9, 0x66, 0x97, 0xc7, 0x07, 0x07, 0xbe, 0xee, + 0xf4, 0xa5, 0xf4, 0x85, 0xad, 0xaf, 0x22, 0x77, 0xdf, 0x6a, 0x5e, 0x11, 0x63, 0x05, 0x7f, 0xa3, 0x91, 0x0c, 0x0b, + 0x08, 0x43, 0xfb, 0x51, 0x1d, 0x83, 0x16, 0x78, 0xa5, 0xeb, 0xd5, 0x97, 0xdf, 0x68, 0x94, 0x51, 0xda, 0x3a, 0xb6, + 0x6e, 0x48, 0x5a, 0x5c, 0xf9, 0x65, 0xea, 0x4f, 0x6b, 0x23, 0x5f, 0xca, 0x82, 0x80, 0xb9, 0x4b, 0xb3, 0xdc, 0x2e, + 0xc6, 0x39, 0x12, 0x1c, 0xda, 0x7d, 0x69, 0xb2, 0x16, 0x88, 0xca, 0xae, 0x32, 0x8d, 0x2c, 0x3b, 0xeb, 0xe0, 0xd0, + 0x36, 0x82, 0xa8, 0x14, 0x34, 0x6a, 0x14, 0x86, 0xbc, 0xdf, 0x6c, 0xe6, 0x5c, 0x92, 0x1c, 0x1b, 0x27, 0x97, 0x82, + 0x42, 0x21, 0xab, 0x53, 0x22, 0xe5, 0x25, 0x9d, 0xef, 0x26, 0xf9, 0x13, 0x87, 0xe4, 0x9f, 0x51, 0xe6, 0x90, 0xbf, + 0x76, 0x71, 0x04, 0xc2, 0x38, 0x17, 0x72, 0x5b, 0x75, 0x3a, 0xa7, 0xe0, 0x44, 0xab, 0x63, 0xb4, 0x16, 0x56, 0xdc, + 0xc1, 0x50, 0xdc, 0x13, 0xa2, 0xdc, 0x90, 0xc4, 0xc6, 0x80, 0xfd, 0x2a, 0xa8, 0x06, 0x53, 0x6f, 0xf3, 0xe9, 0xb9, + 0x1c, 0xf0, 0xe4, 0xc3, 0xdd, 0xf1, 0xd0, 0xd3, 0xf9, 0xe6, 0xc9, 0x75, 0x72, 0x3f, 0x61, 0xd5, 0xce, 0xc1, 0xad, + 0x67, 0x82, 0xc2, 0xfc, 0x65, 0x1c, 0xbb, 0xce, 0x7c, 0xd6, 0x0e, 0xa1, 0x95, 0x7f, 0x00, 0x6d, 0xbb, 0xad, 0x5a, + 0x30, 0x67, 0x58, 0xe0, 0x47, 0x3a, 0x03, 0x35, 0xca, 0x76, 0xb0, 0x8f, 0x13, 0xd5, 0x80, 0xa5, 0xf1, 0xf6, 0xea, + 0x67, 0x85, 0x21, 0x13, 0x0d, 0x1a, 0x5e, 0x02, 0xff, 0xd3, 0x24, 0x0f, 0x74, 0xa3, 0xe4, 0x02, 0x20, 0x68, 0xae, + 0xf0, 0x54, 0x21, 0x0c, 0xa1, 0xca, 0xfb, 0xfe, 0x72, 0x8f, 0xd2, 0x79, 0xe5, 0x7d, 0x7c, 0x57, 0xa5, 0x5e, 0x01, + 0x59, 0xe0, 0x10, 0xcc, 0xc7, 0xb2, 0x40, 0x87, 0x2f, 0xcf, 0x6c, 0x73, 0x65, 0x42, 0x06, 0x95, 0xc6, 0xed, 0x84, + 0x36, 0x95, 0x5b, 0x4e, 0xd7, 0x5b, 0x34, 0xac, 0xd5, 0xee, 0x43, 0xed, 0x1b, 0xa9, 0x60, 0x84, 0xe7, 0xf7, 0xaa, + 0xb5, 0x1d, 0xb7, 0xf8, 0xb8, 0x9e, 0xbf, 0xb2, 0xb6, 0x29, 0x01, 0x4f, 0x73, 0x96, 0xc9, 0x67, 0x6c, 0x2c, 0x32, + 0x88, 0x59, 0x94, 0x38, 0xc1, 0xc5, 0xbe, 0xe3, 0xb7, 0x53, 0xeb, 0x73, 0x02, 0x05, 0x6b, 0x0b, 0x54, 0xbf, 0x3e, + 0xaa, 0xa0, 0xf5, 0xf9, 0x7a, 0xaf, 0xf9, 0xc1, 0xc1, 0x87, 0x0a, 0x4d, 0x06, 0x4a, 0x05, 0x85, 0xc3, 0xb4, 0xb4, + 0x4a, 0x63, 0x22, 0xb9, 0xfb, 0x7e, 0xe9, 0x04, 0xb0, 0x0c, 0xc3, 0xe5, 0x3d, 0x2f, 0xa9, 0x2c, 0x26, 0xeb, 0x2c, + 0xde, 0x38, 0x27, 0xb8, 0x6b, 0xb8, 0x00, 0x87, 0x07, 0x53, 0x5b, 0x7b, 0x8b, 0xf2, 0x2a, 0x19, 0xb6, 0x84, 0xe1, + 0x14, 0x90, 0xe5, 0x2b, 0x33, 0xc4, 0xa1, 0xc0, 0xad, 0x66, 0xc9, 0x29, 0xe8, 0x95, 0x53, 0x92, 0x07, 0x53, 0x48, + 0x7f, 0xad, 0x1d, 0x59, 0x8c, 0x89, 0x4e, 0xcc, 0x71, 0x52, 0x09, 0x4e, 0x5e, 0x6e, 0x73, 0x29, 0x5b, 0xa2, 0x66, + 0x4a, 0xea, 0xa8, 0x16, 0xb8, 0xec, 0x10, 0x5c, 0xf9, 0xdc, 0x28, 0x6e, 0x36, 0x6e, 0x06, 0x0c, 0xf8, 0x99, 0xf4, + 0x75, 0x30, 0x0a, 0x64, 0x86, 0x08, 0x16, 0x7e, 0x6d, 0xea, 0xae, 0x50, 0xdd, 0x88, 0x41, 0xdc, 0xd4, 0x45, 0x93, + 0x50, 0x71, 0xbd, 0xd3, 0x8a, 0x97, 0x8e, 0x75, 0x06, 0xb5, 0xb4, 0x5c, 0xb0, 0x4a, 0x24, 0x71, 0x96, 0x3f, 0xd6, + 0x49, 0xd1, 0x65, 0x23, 0xc2, 0x14, 0x18, 0xef, 0xd5, 0x1e, 0xb0, 0x02, 0xfe, 0x5f, 0x9e, 0x48, 0x67, 0x47, 0xad, + 0x13, 0x5b, 0xcd, 0xe9, 0x48, 0xfd, 0x77, 0x90, 0xea, 0xb2, 0x7e, 0xe6, 0x5f, 0x2a, 0x59, 0xc8, 0x49, 0x5e, 0x63, + 0xec, 0xa9, 0x62, 0xec, 0x18, 0xf4, 0x34, 0x9b, 0xf8, 0xdd, 0x37, 0x19, 0x2f, 0xdc, 0x48, 0x39, 0x43, 0x62, 0x5f, + 0x97, 0xd1, 0x72, 0xe7, 0xf7, 0xda, 0x6e, 0x84, 0x9c, 0x42, 0x16, 0x10, 0x31, 0x9c, 0x3d, 0xc5, 0x24, 0x6f, 0x34, + 0xba, 0xf9, 0x31, 0xab, 0x9c, 0x24, 0x15, 0x8c, 0x1c, 0x02, 0xba, 0x40, 0xf0, 0x35, 0x19, 0x0a, 0x21, 0x7f, 0x9b, + 0x99, 0x9d, 0x83, 0xaf, 0xfd, 0xe4, 0x9d, 0xef, 0x72, 0x35, 0xb7, 0x6d, 0x19, 0x34, 0x85, 0xf5, 0xf8, 0x55, 0xc0, + 0xe5, 0xeb, 0xbb, 0x13, 0x3c, 0x00, 0xee, 0xbd, 0x36, 0x81, 0x54, 0x34, 0xdc, 0x95, 0x9a, 0x25, 0x94, 0xa7, 0xaf, + 0x8b, 0xab, 0xac, 0x44, 0x77, 0xb2, 0xae, 0xac, 0x8c, 0x59, 0x49, 0xf3, 0xa2, 0xc8, 0x59, 0x15, 0xde, 0x5f, 0x4b, + 0xbf, 0x54, 0xc2, 0x65, 0xd3, 0xdb, 0x7e, 0x3a, 0xa7, 0x92, 0x38, 0x84, 0xfa, 0xf5, 0xae, 0xd8, 0x47, 0x05, 0x26, + 0x9c, 0x6b, 0x23, 0x14, 0x7f, 0xde, 0x26, 0x14, 0x49, 0x6a, 0x8e, 0xbc, 0x12, 0x88, 0xed, 0x7b, 0x08, 0x44, 0xe3, + 0x66, 0xb7, 0x32, 0x11, 0xd4, 0x91, 0x9a, 0x4c, 0xac, 0x6f, 0x29, 0x4d, 0x09, 0x37, 0xbb, 0xd1, 0xeb, 0xac, 0x56, + 0x7c, 0xd0, 0x02, 0x37, 0x12, 0x42, 0xf0, 0xb3, 0xad, 0x7f, 0x3a, 0x9c, 0x58, 0xbb, 0x81, 0x7d, 0x5e, 0x9a, 0x2c, + 0x38, 0x80, 0x04, 0x67, 0x5f, 0x25, 0x65, 0x29, 0x9a, 0x36, 0x14, 0x64, 0x08, 0x9c, 0xf2, 0x32, 0xcc, 0x04, 0x10, + 0x2b, 0x59, 0x61, 0x0c, 0x48, 0x7f, 0x6b, 0xee, 0x9f, 0x35, 0x2f, 0x3f, 0xad, 0x89, 0xd6, 0xe4, 0x8a, 0x56, 0x1f, + 0x6a, 0xf9, 0x06, 0x06, 0x02, 0xa3, 0x1f, 0xee, 0x29, 0x13, 0xb4, 0x12, 0xe5, 0xd8, 0x95, 0x43, 0xa4, 0x05, 0x4e, + 0xb4, 0xbd, 0x0f, 0x3a, 0xc2, 0xbb, 0x45, 0x9a, 0x10, 0xe1, 0xd0, 0xf5, 0x4b, 0x2a, 0x6b, 0xac, 0x64, 0x4a, 0x8d, + 0xa5, 0x44, 0x22, 0x45, 0xa6, 0x92, 0xa6, 0x83, 0xd6, 0x10, 0x14, 0xd0, 0x6e, 0x72, 0x9c, 0x56, 0x26, 0x70, 0xd2, + 0x68, 0xe0, 0xc8, 0xce, 0x3a, 0x1d, 0xf0, 0x46, 0x32, 0x24, 0x8c, 0x24, 0xda, 0x30, 0x39, 0x3b, 0x38, 0xf0, 0xa3, + 0x6a, 0xde, 0x41, 0x32, 0xc4, 0x44, 0xac, 0x56, 0xbe, 0x02, 0x2b, 0xc2, 0xab, 0x55, 0xe4, 0x82, 0xa5, 0xaa, 0xa1, + 0xdb, 0xbc, 0x2f, 0xe9, 0x5c, 0x09, 0xc0, 0x39, 0x40, 0xd8, 0xa0, 0x7e, 0x64, 0xdc, 0x7b, 0x11, 0xb8, 0xa3, 0x1a, + 0xe9, 0x20, 0x69, 0xb4, 0x87, 0x0e, 0xe3, 0x1a, 0x24, 0x43, 0x1a, 0x15, 0xe2, 0xe0, 0x60, 0x2f, 0x37, 0x22, 0xf2, + 0x27, 0x10, 0x65, 0x3f, 0x29, 0xc9, 0xa2, 0x07, 0x74, 0x77, 0x63, 0xdd, 0x19, 0x50, 0x52, 0x94, 0xd9, 0x56, 0xdb, + 0xae, 0x96, 0x05, 0x51, 0x36, 0x22, 0x26, 0x18, 0xdc, 0x07, 0xcb, 0xbe, 0x24, 0xf3, 0x57, 0xb2, 0xcc, 0xb1, 0xfe, + 0x79, 0x6b, 0x66, 0x75, 0x10, 0x04, 0x51, 0x36, 0x51, 0xb1, 0x0c, 0x1b, 0x86, 0x55, 0xc4, 0x7f, 0x64, 0xc0, 0x74, + 0x26, 0x1e, 0x94, 0x73, 0x0d, 0xa9, 0x06, 0xdf, 0xaa, 0x36, 0xf6, 0x2e, 0xc9, 0x4f, 0x5b, 0xbd, 0x0c, 0x1a, 0x92, + 0xe7, 0xbf, 0x15, 0x92, 0x87, 0x06, 0x12, 0x4d, 0x1e, 0x6b, 0x38, 0xdb, 0x81, 0x8b, 0x9f, 0xe4, 0x1a, 0xce, 0x76, + 0xe3, 0xd6, 0x62, 0xea, 0x97, 0x5d, 0xf0, 0x39, 0xbc, 0x41, 0x03, 0x5a, 0x15, 0x38, 0x50, 0x3e, 0x5a, 0xd7, 0xbd, + 0x34, 0x2b, 0x05, 0x61, 0x2a, 0xa9, 0xcf, 0xeb, 0x07, 0xa0, 0xd2, 0x46, 0x1d, 0xc3, 0x97, 0x87, 0x73, 0xec, 0xb8, + 0x04, 0xea, 0xa9, 0x2b, 0x40, 0x4e, 0xc6, 0xdb, 0x3e, 0x3f, 0x38, 0x00, 0xdb, 0x00, 0x94, 0xb8, 0x60, 0x14, 0xcd, + 0xe5, 0x22, 0x03, 0x55, 0x2a, 0xb7, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xa8, 0x32, 0xf8, 0x01, 0x05, 0xf3, 0x28, 0xcf, + 0xf9, 0x95, 0x2e, 0x33, 0xbf, 0x89, 0xa0, 0x96, 0x94, 0x73, 0xad, 0x13, 0xa6, 0xb8, 0x9b, 0x1a, 0x3a, 0xad, 0xa3, + 0xed, 0xc5, 0x15, 0x4b, 0xe5, 0x2b, 0x9e, 0x4b, 0x96, 0xc2, 0xf2, 0x2b, 0x8a, 0x83, 0x15, 0xe5, 0x18, 0x0e, 0x6c, + 0xad, 0x57, 0x14, 0xc7, 0x77, 0x76, 0x91, 0x75, 0x1d, 0x68, 0x1a, 0xa5, 0x71, 0xa2, 0x27, 0x71, 0xf3, 0x19, 0x6d, + 0x0e, 0x67, 0xd9, 0xd2, 0xcd, 0xa7, 0xa9, 0x94, 0x0d, 0xc5, 0xdd, 0x7d, 0x4e, 0xad, 0x24, 0xb0, 0xd2, 0xf3, 0x4e, + 0xad, 0x05, 0x22, 0xde, 0x3b, 0x36, 0xc1, 0x5d, 0x09, 0x91, 0x0e, 0x47, 0x0d, 0xea, 0x70, 0x5a, 0xba, 0xf9, 0x72, + 0xeb, 0x95, 0xb6, 0x6d, 0xc2, 0x41, 0xd1, 0xc9, 0xe3, 0xdd, 0x96, 0xd5, 0x6b, 0x2b, 0x39, 0xac, 0xb4, 0xe0, 0xf7, + 0x65, 0xcc, 0x78, 0x69, 0xc9, 0x0b, 0xdb, 0xa3, 0xb8, 0x2f, 0xe9, 0x73, 0xb8, 0x33, 0xf4, 0x52, 0xce, 0x92, 0xb5, + 0xab, 0x31, 0xdd, 0xfd, 0x52, 0xfb, 0xdf, 0x97, 0xfe, 0x7b, 0xf2, 0x06, 0x02, 0xbb, 0x5f, 0x55, 0xcd, 0x37, 0x03, + 0xba, 0x5f, 0x55, 0x08, 0xfa, 0x2a, 0xdc, 0x68, 0xe7, 0x04, 0x72, 0x3b, 0xc1, 0xd3, 0xa0, 0x85, 0xac, 0xb6, 0xf4, + 0xb3, 0x0e, 0x23, 0xe9, 0x4c, 0x4b, 0x75, 0x1e, 0x48, 0x95, 0xa7, 0x06, 0xf9, 0x72, 0x75, 0x0b, 0x89, 0x99, 0x0c, + 0x43, 0xad, 0xc3, 0xef, 0xda, 0x1e, 0x23, 0x63, 0x52, 0x6d, 0x67, 0x7c, 0x1d, 0x65, 0x72, 0x1f, 0x4e, 0x99, 0xd8, + 0xb8, 0x87, 0x37, 0xa5, 0xe0, 0x41, 0xbb, 0xdf, 0x14, 0x8e, 0xb1, 0x9d, 0xeb, 0x7b, 0x40, 0xee, 0xf8, 0x54, 0x58, + 0xdd, 0xad, 0x6e, 0x65, 0x7c, 0x0d, 0xf6, 0x3f, 0x26, 0x53, 0x7b, 0x39, 0x8e, 0x19, 0x0e, 0xcc, 0xc2, 0x65, 0x51, + 0x3a, 0x05, 0x84, 0x56, 0xde, 0x32, 0x4c, 0x44, 0xa1, 0x02, 0xdc, 0x3f, 0x90, 0x6f, 0x0c, 0x4b, 0x1c, 0x97, 0x1c, + 0xe7, 0xe4, 0xbe, 0x1c, 0x51, 0x83, 0x5f, 0xc6, 0xef, 0x81, 0x8e, 0x15, 0x85, 0x16, 0x96, 0x8a, 0x9e, 0x0b, 0xb3, + 0x90, 0x9d, 0x69, 0xa9, 0x84, 0x95, 0x29, 0x35, 0x6a, 0x9a, 0x2d, 0x79, 0x9c, 0xd6, 0xca, 0x96, 0xe5, 0xa9, 0xaa, + 0xcd, 0x8b, 0x77, 0x60, 0xb1, 0x0a, 0x2d, 0xae, 0x56, 0x7e, 0x1d, 0xd5, 0x94, 0x3b, 0x91, 0x0c, 0x4c, 0xb8, 0x93, + 0x51, 0x51, 0xd3, 0xac, 0x75, 0x1f, 0x1f, 0xaf, 0x27, 0x14, 0x59, 0xdd, 0xbc, 0x06, 0x87, 0xeb, 0x42, 0xd0, 0xdd, + 0x5d, 0x9f, 0x02, 0xd1, 0xab, 0x2b, 0x27, 0x72, 0x30, 0xf4, 0x73, 0x99, 0x2a, 0x5b, 0xe5, 0xb4, 0x6e, 0xc1, 0x2f, + 0xbe, 0x23, 0x59, 0xd6, 0xa0, 0x6e, 0xb3, 0xde, 0x49, 0x36, 0x7a, 0x2e, 0x76, 0x25, 0x1b, 0xd5, 0xb4, 0xdd, 0xbd, + 0x16, 0xbe, 0x3b, 0x2d, 0x55, 0xcf, 0xb5, 0xbd, 0xc9, 0x6f, 0x98, 0xae, 0x0d, 0xb4, 0xa9, 0xd1, 0x6c, 0xb9, 0xca, + 0x59, 0x51, 0x8c, 0xcb, 0xcb, 0x04, 0x2a, 0x77, 0x67, 0xac, 0xe9, 0xdf, 0x58, 0x8d, 0xea, 0x3a, 0xae, 0xff, 0x03, + 0x9d, 0x24, 0xe2, 0x32, 0x4a, 0xde, 0xc3, 0x7c, 0x55, 0xe5, 0xcb, 0xdb, 0x38, 0x8b, 0x24, 0x33, 0xdc, 0xa5, 0x82, + 0xe1, 0x07, 0x07, 0x86, 0x1f, 0x34, 0x9f, 0xae, 0xfa, 0x93, 0xe5, 0xab, 0x72, 0x80, 0x70, 0x5c, 0x58, 0x96, 0x71, + 0x2e, 0xb7, 0xcf, 0xb1, 0xce, 0xc2, 0xce, 0x4b, 0x16, 0x76, 0x2e, 0xfd, 0xf5, 0xa1, 0x7c, 0xff, 0x9b, 0xed, 0xa3, + 0x6c, 0x72, 0xb6, 0x6f, 0xaa, 0x83, 0xff, 0x4d, 0x78, 0x67, 0x1f, 0x87, 0xcb, 0x1d, 0x05, 0x47, 0x2a, 0x5d, 0x45, + 0x83, 0xfc, 0x0e, 0xd2, 0x0e, 0x24, 0xed, 0x39, 0x77, 0x0e, 0x2a, 0x39, 0x65, 0x13, 0x81, 0xfc, 0xd1, 0x22, 0x97, + 0x62, 0x66, 0xc6, 0xcc, 0xcd, 0x35, 0x23, 0x55, 0x09, 0xae, 0x68, 0x15, 0x6d, 0x0f, 0xeb, 0x17, 0xb9, 0x96, 0x1f, + 0x79, 0x1a, 0x87, 0x39, 0x31, 0x52, 0x24, 0x0f, 0xd3, 0x82, 0xda, 0x64, 0xe3, 0xcd, 0x3a, 0x32, 0xe6, 0x29, 0xcf, + 0xa7, 0x2c, 0xf3, 0x05, 0x5e, 0xee, 0x9a, 0x4c, 0x40, 0x40, 0x46, 0x4f, 0x46, 0xbe, 0xad, 0x2e, 0xfc, 0x05, 0x30, + 0x1a, 0xf8, 0x81, 0x66, 0x4c, 0x4e, 0x45, 0x0c, 0x89, 0x29, 0x41, 0x5c, 0xde, 0x68, 0x3a, 0x38, 0xd8, 0xf3, 0x91, + 0x72, 0x4b, 0xc0, 0xd5, 0x6f, 0xb7, 0x06, 0xf7, 0x97, 0x70, 0x3d, 0xa7, 0x9a, 0x9a, 0xe1, 0x25, 0x5b, 0xbf, 0xc9, + 0x22, 0x83, 0x8f, 0xec, 0x96, 0x64, 0xb8, 0x28, 0x42, 0x0d, 0x35, 0x1a, 0x73, 0x96, 0xc4, 0x88, 0x7c, 0x64, 0xb7, + 0x61, 0x79, 0x5b, 0x5c, 0x5d, 0x6e, 0x56, 0x1b, 0x88, 0xc4, 0x75, 0x8a, 0x48, 0x35, 0x49, 0xb8, 0x2c, 0x88, 0xc8, + 0xf8, 0x04, 0x88, 0xf3, 0x6f, 0xec, 0x36, 0xd4, 0xe3, 0x71, 0xe7, 0xb2, 0x1e, 0x5e, 0x5a, 0xd4, 0x07, 0x4e, 0xb1, + 0xbb, 0x0d, 0xc6, 0xa0, 0x18, 0xa8, 0xbe, 0x43, 0x5a, 0x6b, 0x57, 0x99, 0x87, 0x18, 0x17, 0xf7, 0x5d, 0x0a, 0xf9, + 0xc2, 0x15, 0x6d, 0xb2, 0x96, 0xfa, 0xba, 0xd6, 0x89, 0x41, 0x87, 0x2a, 0xd7, 0xe3, 0xdc, 0xcf, 0xec, 0xa9, 0x33, + 0x77, 0x10, 0x1c, 0x47, 0xd8, 0x17, 0xd2, 0x0c, 0x1a, 0x7e, 0xab, 0x53, 0x42, 0xaa, 0x48, 0xd2, 0xeb, 0xaa, 0x9f, + 0x77, 0xee, 0x03, 0xde, 0x21, 0xa5, 0x25, 0x52, 0xd7, 0x31, 0x0b, 0x9b, 0x2e, 0xfa, 0x9d, 0xa4, 0xfe, 0xd2, 0x2e, + 0x21, 0xcc, 0x5c, 0x2c, 0xca, 0x02, 0xa8, 0xd0, 0xd0, 0x97, 0xce, 0x00, 0xe4, 0x63, 0x9f, 0x6f, 0x48, 0xcd, 0x54, + 0x49, 0xcd, 0xc0, 0xc1, 0xf8, 0x0e, 0x29, 0xc9, 0x14, 0x32, 0x94, 0x12, 0xa9, 0x84, 0x9e, 0xd9, 0x5c, 0x43, 0x42, + 0xee, 0x86, 0x96, 0xd7, 0xe7, 0xf4, 0x9e, 0xa7, 0x35, 0xb0, 0x7c, 0x35, 0x0e, 0x2e, 0x42, 0x58, 0x12, 0xd3, 0x0d, + 0x0a, 0xeb, 0xce, 0xc9, 0x6c, 0x7e, 0xab, 0x2f, 0x02, 0xbb, 0x2c, 0x6a, 0x51, 0xe2, 0x4f, 0xf1, 0x32, 0xf3, 0xa7, + 0x24, 0x85, 0x7c, 0x44, 0x51, 0x94, 0xf0, 0x33, 0x77, 0x37, 0x6a, 0xd9, 0xca, 0xdb, 0xaf, 0xf8, 0x81, 0x32, 0x2f, + 0x21, 0x47, 0x93, 0x64, 0x96, 0xa7, 0x64, 0xbe, 0xba, 0x6b, 0xe7, 0x6c, 0xdb, 0x57, 0x26, 0x45, 0xc7, 0x00, 0xf6, + 0x9d, 0xf4, 0x97, 0xce, 0x2a, 0xdc, 0xbb, 0xdc, 0xe6, 0xca, 0x9f, 0x09, 0xf6, 0x55, 0x49, 0xa4, 0x7e, 0x4e, 0xd7, + 0x24, 0xce, 0xdd, 0xb9, 0x96, 0x3f, 0x2f, 0x58, 0x76, 0x7b, 0xc6, 0x20, 0xd7, 0x59, 0xc0, 0x5d, 0xdf, 0x6a, 0x1b, + 0xaa, 0x3c, 0xf5, 0x7e, 0xaa, 0x94, 0x95, 0xa2, 0x7e, 0x09, 0x70, 0xfd, 0x8a, 0x60, 0xa1, 0xa2, 0x8d, 0x8e, 0x23, + 0x46, 0x9f, 0x16, 0xb6, 0xf3, 0xf2, 0x24, 0xeb, 0x72, 0xf0, 0xaf, 0x55, 0x98, 0x36, 0xc1, 0x02, 0x22, 0xdc, 0x0b, + 0xa9, 0x83, 0x7c, 0xb8, 0xee, 0x95, 0x81, 0x22, 0x08, 0xdf, 0xa5, 0xbb, 0x97, 0xba, 0x2d, 0x6b, 0x76, 0xf7, 0x52, + 0x6b, 0x41, 0x3f, 0x95, 0xf2, 0x43, 0xcc, 0x3c, 0xe5, 0xe5, 0x65, 0x5e, 0x14, 0xb8, 0x00, 0xf0, 0xbe, 0xef, 0xfa, + 0xfe, 0xf7, 0x26, 0x69, 0x30, 0x80, 0x58, 0xec, 0x59, 0x22, 0x2c, 0x13, 0xaf, 0xe6, 0xff, 0x7e, 0x63, 0xfe, 0xef, + 0x9d, 0x2b, 0xa7, 0x60, 0x1a, 0x4d, 0x52, 0x16, 0x5b, 0xd6, 0x89, 0x35, 0x01, 0x2a, 0xbd, 0x2d, 0x97, 0xf4, 0xe3, + 0x45, 0x08, 0x1a, 0xd7, 0x72, 0x2c, 0x52, 0xd9, 0x1c, 0x47, 0x33, 0x9e, 0xdc, 0x86, 0x0b, 0xde, 0x9c, 0x89, 0x54, + 0xe4, 0xf3, 0x68, 0xc4, 0x48, 0x7e, 0x9b, 0x4b, 0x36, 0x6b, 0x2e, 0x38, 0x79, 0xc9, 0x92, 0x2b, 0x26, 0xf9, 0x28, + 0x22, 0xe8, 0x24, 0xe3, 0x51, 0xe2, 0xbd, 0x89, 0xb2, 0x4c, 0x5c, 0x23, 0xf2, 0x4e, 0x5c, 0x0a, 0x29, 0xc8, 0xdb, + 0x9b, 0xdb, 0x09, 0x4b, 0xc9, 0x87, 0xcb, 0x45, 0x2a, 0x17, 0x24, 0x8f, 0xd2, 0xbc, 0x99, 0xb3, 0x8c, 0x8f, 0xbb, + 0x23, 0x91, 0x88, 0xac, 0x09, 0x29, 0xdb, 0x33, 0x16, 0x26, 0x7c, 0x32, 0x95, 0x5e, 0x1c, 0x65, 0x1f, 0xbb, 0xcd, + 0xe6, 0x3c, 0xe3, 0xb3, 0x28, 0xbb, 0x6d, 0xaa, 0x16, 0xe1, 0x67, 0xad, 0xa3, 0xe8, 0xf3, 0xf1, 0xc3, 0xae, 0xcc, + 0xa2, 0x34, 0xe7, 0xb0, 0x4d, 0x61, 0x94, 0x24, 0xde, 0xd1, 0xa3, 0xd6, 0x2c, 0xdf, 0xd3, 0x81, 0xbc, 0x28, 0x95, + 0xc5, 0x05, 0xf9, 0x08, 0x70, 0x07, 0x97, 0x32, 0x25, 0x97, 0x0b, 0x29, 0x45, 0xba, 0x1c, 0x2d, 0xb2, 0x5c, 0x64, + 0xe1, 0x5c, 0xf0, 0x54, 0xb2, 0xac, 0x7b, 0x29, 0xb2, 0x98, 0x65, 0xcd, 0x2c, 0x8a, 0xf9, 0x22, 0x0f, 0x1f, 0xce, + 0x6f, 0xba, 0xa0, 0x59, 0x4c, 0x32, 0xb1, 0x48, 0x63, 0x33, 0x17, 0x4f, 0xa7, 0x2c, 0xe3, 0xd2, 0xad, 0x50, 0xaf, + 0x30, 0x09, 0x13, 0x9e, 0xb2, 0x28, 0x6b, 0x4e, 0xa0, 0x33, 0x98, 0x45, 0xad, 0x98, 0x4d, 0x48, 0x36, 0xb9, 0x8c, + 0xfc, 0x76, 0xe7, 0x09, 0xb1, 0x7f, 0x83, 0x47, 0xd8, 0x6b, 0x6d, 0x2f, 0x6e, 0xb7, 0x5a, 0x7f, 0xc2, 0xdd, 0xb5, + 0x59, 0x14, 0x40, 0x61, 0x7b, 0x7e, 0xe3, 0xe5, 0x02, 0x72, 0xda, 0xb6, 0xf5, 0xec, 0xce, 0xa3, 0x18, 0x12, 0x82, + 0xc3, 0xce, 0xfc, 0xa6, 0x80, 0xd5, 0x85, 0x3a, 0xc9, 0xd4, 0x2c, 0xd2, 0x3c, 0x2d, 0x7f, 0x2b, 0xc4, 0x4f, 0xb7, + 0x43, 0xdc, 0xb1, 0x10, 0x57, 0x58, 0x6f, 0xc6, 0x8b, 0x4c, 0xc5, 0x56, 0xc3, 0x76, 0xae, 0x01, 0x99, 0x8a, 0x2b, + 0x96, 0x59, 0x38, 0xd4, 0xc3, 0x6f, 0x06, 0xa3, 0xb3, 0x1d, 0x8c, 0xa7, 0x9f, 0x02, 0x23, 0x4b, 0xe3, 0x65, 0x7d, + 0x5f, 0xdb, 0x19, 0x9b, 0x75, 0xa7, 0x0c, 0xe8, 0x29, 0xec, 0xc0, 0xef, 0x6b, 0x1e, 0xcb, 0xa9, 0xfe, 0xa9, 0xc8, + 0xf9, 0x5a, 0xd7, 0x3d, 0x6a, 0xb5, 0xf4, 0x73, 0xce, 0x7f, 0x61, 0x61, 0x3b, 0x80, 0x06, 0xc5, 0x05, 0xf9, 0x5b, + 0x79, 0x99, 0xb7, 0xce, 0x3d, 0xc9, 0x0f, 0xee, 0x2d, 0x5f, 0x27, 0x49, 0xb1, 0xba, 0x11, 0x4d, 0x32, 0x2b, 0x2b, + 0xb5, 0xf0, 0x01, 0xb7, 0x9d, 0x3a, 0x4f, 0x94, 0xf7, 0xca, 0x5b, 0x9c, 0xbc, 0xff, 0x83, 0xce, 0xbb, 0x08, 0x21, + 0xd2, 0xe1, 0x24, 0x1b, 0x8a, 0x6e, 0xda, 0xa3, 0xad, 0x6e, 0xda, 0x6c, 0x62, 0x5f, 0xd0, 0x6c, 0x90, 0x9a, 0xf4, + 0x3c, 0x9f, 0xf7, 0x85, 0x32, 0xb6, 0x73, 0x1c, 0x0a, 0xb8, 0x6a, 0xba, 0x5a, 0x55, 0x61, 0x00, 0xae, 0xae, 0x6b, + 0xfc, 0x4d, 0x9a, 0x06, 0x24, 0x77, 0x38, 0x79, 0x6a, 0x5f, 0xec, 0x92, 0x59, 0x5e, 0x91, 0x88, 0x91, 0xc2, 0x5c, + 0x30, 0x8f, 0xe4, 0x14, 0xbc, 0x14, 0xa5, 0xf8, 0xa9, 0x92, 0x98, 0xd0, 0x21, 0xc2, 0xfd, 0xac, 0xcc, 0x70, 0x83, + 0x4c, 0xbe, 0xac, 0x80, 0x51, 0xbe, 0x91, 0x14, 0x46, 0x24, 0xbf, 0x50, 0x6d, 0xd3, 0x59, 0x8b, 0x6e, 0x7c, 0x5f, + 0x8b, 0x8e, 0xa5, 0x92, 0xab, 0xdc, 0x6d, 0x1b, 0x71, 0x98, 0x46, 0xf9, 0xf9, 0x48, 0xdf, 0x95, 0xcc, 0xab, 0x9b, + 0x01, 0x91, 0x82, 0x5e, 0x1b, 0x69, 0x2c, 0x53, 0xf6, 0xe8, 0xf7, 0x72, 0xa7, 0x7d, 0x92, 0xdd, 0x65, 0x9f, 0x94, + 0x0b, 0xcf, 0xc5, 0x22, 0x1b, 0x41, 0x38, 0xd2, 0x48, 0xbd, 0x4d, 0xc7, 0x0d, 0x52, 0x2a, 0x06, 0x22, 0xd2, 0xc9, + 0x04, 0x95, 0x84, 0xbb, 0x2f, 0x95, 0x60, 0x2a, 0xe4, 0xa5, 0xef, 0x6b, 0x18, 0x11, 0x67, 0x97, 0x04, 0x32, 0x3b, + 0x56, 0x49, 0x8d, 0x7e, 0x4a, 0x7b, 0x69, 0xb0, 0x48, 0xf9, 0xcf, 0x0b, 0x76, 0xce, 0x41, 0xd7, 0xe4, 0x01, 0x8f, + 0x55, 0xac, 0x09, 0x64, 0x5f, 0xb3, 0x0d, 0xc1, 0x0b, 0x1e, 0xeb, 0x8d, 0x49, 0x55, 0xa5, 0xc9, 0x6d, 0x42, 0x4d, + 0x04, 0xfe, 0x62, 0xd0, 0x0e, 0x38, 0x89, 0xc5, 0x2c, 0xe2, 0x69, 0xa8, 0x5c, 0xbe, 0xe5, 0x60, 0x21, 0xb4, 0x26, + 0x3c, 0x0e, 0x53, 0xb3, 0x3d, 0x6d, 0x1c, 0xfc, 0x24, 0x78, 0xaa, 0xba, 0x16, 0x5d, 0xa1, 0x10, 0xaa, 0xd1, 0x47, + 0x2d, 0x82, 0x4f, 0xb4, 0x5c, 0x13, 0x98, 0xb8, 0xd5, 0xe5, 0xb5, 0xf3, 0xda, 0x0e, 0xb4, 0xd6, 0x36, 0x4a, 0x1b, + 0x01, 0x62, 0xbd, 0x34, 0x17, 0x99, 0xf4, 0xfd, 0x29, 0x49, 0x30, 0xed, 0x4d, 0x95, 0xb3, 0xeb, 0x38, 0x51, 0xff, + 0xf5, 0x9b, 0xed, 0xb0, 0x5d, 0x9a, 0xef, 0xb5, 0xdb, 0xc0, 0x3a, 0x39, 0xca, 0xdc, 0x28, 0x55, 0xcb, 0x28, 0x7f, + 0xeb, 0xa5, 0x56, 0xcf, 0xe5, 0x72, 0x89, 0x39, 0x6e, 0x5a, 0x54, 0xf9, 0x35, 0x20, 0x54, 0xb0, 0x68, 0xc7, 0x54, + 0xb8, 0xa8, 0xd6, 0x5d, 0xaa, 0x92, 0x17, 0x5a, 0x44, 0x9f, 0xef, 0x2f, 0x33, 0x33, 0x63, 0x71, 0xc1, 0xad, 0x93, + 0xa9, 0x4e, 0x72, 0x85, 0xc1, 0x88, 0xa3, 0x87, 0x6e, 0x6b, 0xa6, 0x61, 0xb9, 0xa5, 0xd9, 0x56, 0xba, 0x0d, 0xf4, + 0x23, 0xcb, 0x68, 0x15, 0xee, 0xda, 0x18, 0x00, 0x72, 0xf5, 0xb6, 0x01, 0x06, 0x66, 0x6b, 0x2e, 0xed, 0x12, 0x40, + 0x1b, 0x1b, 0x33, 0xb8, 0x48, 0x73, 0xb1, 0xbf, 0xfc, 0x46, 0x16, 0x87, 0x4e, 0x53, 0xf5, 0x9b, 0xc7, 0xf0, 0x3f, + 0x48, 0xc0, 0xa5, 0x56, 0x4a, 0x43, 0xf4, 0xf5, 0xdb, 0xb3, 0xf7, 0x88, 0x5c, 0x8a, 0xf8, 0x36, 0x44, 0x32, 0x5b, + 0x30, 0x54, 0xe0, 0x40, 0x4e, 0x59, 0x5a, 0xbe, 0x8c, 0x47, 0x24, 0x2c, 0x48, 0xc4, 0x44, 0x5f, 0xca, 0x5c, 0x37, + 0x92, 0x47, 0x17, 0xc7, 0xea, 0x25, 0x53, 0xbd, 0x63, 0xa9, 0x5f, 0xef, 0x25, 0x33, 0xf8, 0xd9, 0x83, 0x10, 0xca, + 0xf1, 0xa1, 0x9c, 0xaa, 0x87, 0x33, 0x38, 0x30, 0xea, 0x69, 0x7f, 0xb9, 0x41, 0x4c, 0x7d, 0x18, 0x62, 0xda, 0xd3, + 0x4b, 0xc8, 0x55, 0xab, 0x8b, 0x70, 0x74, 0x71, 0x51, 0x1c, 0x1f, 0xc2, 0x58, 0x87, 0x76, 0x5c, 0x80, 0xd0, 0xf6, + 0x2f, 0x09, 0x0c, 0x5e, 0x36, 0x94, 0xd1, 0x1e, 0x0c, 0x01, 0xf3, 0xc6, 0x3d, 0x58, 0x24, 0x10, 0x18, 0xf4, 0x8e, + 0xcb, 0x12, 0x75, 0x62, 0x75, 0xd1, 0x2e, 0x08, 0x74, 0xc3, 0x8a, 0xee, 0xb5, 0x37, 0xb5, 0xda, 0x5f, 0x0b, 0x52, + 0xec, 0x42, 0x77, 0x81, 0xe1, 0x7f, 0x05, 0xd9, 0xf1, 0xa1, 0xc6, 0xc3, 0x85, 0xfb, 0x6a, 0x13, 0xfd, 0xda, 0x81, + 0x12, 0x5b, 0x83, 0x5c, 0x92, 0x8f, 0x92, 0x7c, 0xbc, 0x50, 0x4d, 0xad, 0x30, 0x02, 0x2d, 0x09, 0x84, 0x76, 0xcb, + 0x6a, 0x1d, 0x23, 0x91, 0x24, 0xd1, 0x3c, 0x67, 0xa1, 0xfd, 0x61, 0xe4, 0x12, 0x88, 0xb7, 0x4d, 0x45, 0xc0, 0xa4, + 0xd7, 0x9c, 0x82, 0xba, 0xb0, 0xa9, 0xa5, 0x5c, 0x45, 0x99, 0xdf, 0x6c, 0x8e, 0x9a, 0x97, 0x13, 0x5c, 0xc8, 0xe9, + 0xd2, 0x95, 0x6a, 0x8f, 0x5b, 0xad, 0x2e, 0xe4, 0x42, 0x36, 0xa3, 0x84, 0x4f, 0xd2, 0x30, 0x61, 0x63, 0x59, 0x48, + 0xb8, 0xa5, 0xb6, 0xb4, 0x6a, 0x44, 0xd0, 0x79, 0x94, 0xb1, 0x99, 0x17, 0xc0, 0xbf, 0x77, 0x4f, 0x5c, 0xc8, 0x38, + 0x4c, 0xe5, 0xb4, 0xa9, 0xb2, 0x6e, 0xe1, 0xce, 0x80, 0x9c, 0xd6, 0x9e, 0x97, 0xce, 0x44, 0x23, 0x06, 0x2a, 0x56, + 0x21, 0x33, 0x4f, 0x4e, 0x89, 0xcc, 0xdc, 0x76, 0x29, 0x5e, 0x6e, 0xac, 0x60, 0x53, 0xd2, 0x1f, 0xe1, 0x22, 0x57, + 0x8a, 0xf1, 0x66, 0x63, 0xab, 0x2e, 0xd5, 0x9f, 0x36, 0xd0, 0xe7, 0x28, 0x76, 0x85, 0x76, 0x2c, 0x2f, 0x75, 0x8f, + 0xfb, 0x20, 0xb3, 0xa6, 0x72, 0x12, 0xb7, 0x07, 0x2e, 0x78, 0x3a, 0x5f, 0xc8, 0x81, 0x72, 0x6a, 0x67, 0x70, 0x41, + 0x62, 0x48, 0x9c, 0x12, 0xc0, 0xc1, 0x70, 0xa9, 0x81, 0x19, 0x45, 0xc9, 0xc8, 0x07, 0x88, 0xbc, 0xa6, 0xf7, 0x34, + 0x63, 0x33, 0xdc, 0x9d, 0xf1, 0xb4, 0xa9, 0xeb, 0x1e, 0x39, 0x6a, 0x49, 0xf0, 0x04, 0x9e, 0x8a, 0x40, 0x8d, 0x46, + 0x54, 0xee, 0xea, 0x16, 0x5c, 0x5e, 0x0c, 0x8b, 0xa2, 0x9b, 0x49, 0x7f, 0xf0, 0xda, 0xc7, 0x43, 0xf2, 0x8b, 0xf3, + 0x72, 0x16, 0x64, 0x8f, 0x0a, 0x22, 0x1d, 0xbc, 0xa3, 0x89, 0x7b, 0x16, 0x54, 0xb3, 0x5f, 0x28, 0x34, 0x7c, 0xe7, + 0x23, 0x96, 0xcf, 0x9b, 0x9a, 0x77, 0x35, 0x15, 0xc9, 0x22, 0xe8, 0x8a, 0x8d, 0xa7, 0xf6, 0x7b, 0xb9, 0x54, 0x6c, + 0xc9, 0x5c, 0xd2, 0xd0, 0xce, 0x84, 0x61, 0x79, 0xa9, 0xc7, 0x3c, 0xbb, 0xd7, 0x78, 0x70, 0x8d, 0x9f, 0x5c, 0x9c, + 0xd4, 0x79, 0x1c, 0xf0, 0xa5, 0xf2, 0x05, 0x76, 0x51, 0x92, 0xc0, 0x84, 0x17, 0x56, 0x7d, 0x71, 0x5f, 0xfa, 0x31, + 0x90, 0x43, 0x1f, 0x17, 0xe6, 0x9c, 0x3e, 0x53, 0x2a, 0xa5, 0xf3, 0xd6, 0xbc, 0x3d, 0x69, 0x83, 0x45, 0x5a, 0xfa, + 0x72, 0x08, 0x77, 0xd7, 0xf2, 0xa2, 0xbb, 0x15, 0xef, 0xd2, 0x0a, 0xa9, 0xa7, 0x16, 0x44, 0x51, 0x96, 0xc6, 0xc8, + 0xfb, 0xcb, 0x28, 0xe1, 0xa3, 0x8f, 0x14, 0xed, 0x2f, 0x7d, 0xbc, 0x79, 0xed, 0x51, 0x71, 0x05, 0xcb, 0xb0, 0x71, + 0xdd, 0x91, 0x9e, 0x06, 0x0e, 0x2f, 0xd6, 0x6f, 0xc5, 0x41, 0xbd, 0xfd, 0x25, 0x30, 0x1e, 0x3d, 0x4f, 0xef, 0xa2, + 0x38, 0xaf, 0xde, 0x75, 0x55, 0x41, 0x01, 0x68, 0xd6, 0xe5, 0x9e, 0x22, 0x2a, 0x8a, 0x3e, 0x49, 0x69, 0xc8, 0xd3, + 0x4c, 0x0d, 0xe0, 0x94, 0x86, 0xbf, 0x21, 0xef, 0x2f, 0x65, 0x19, 0x2b, 0x3d, 0x1a, 0x2a, 0x25, 0x83, 0x22, 0x98, + 0x0b, 0xcc, 0xd8, 0x20, 0x66, 0x32, 0xe2, 0x89, 0xee, 0xd2, 0xb5, 0x06, 0xf8, 0xda, 0x8a, 0x56, 0xab, 0xbc, 0xbe, + 0x16, 0x5e, 0xc7, 0xa0, 0x5a, 0xd9, 0xf1, 0x61, 0x05, 0xb7, 0x5a, 0x99, 0x3a, 0x93, 0x6e, 0x68, 0xb0, 0x5a, 0xa1, + 0xae, 0xf3, 0xfe, 0x32, 0x52, 0xd7, 0x86, 0x00, 0x40, 0x61, 0x00, 0x84, 0xa0, 0xb5, 0xbe, 0x16, 0xe3, 0x27, 0x54, + 0x04, 0x32, 0xca, 0x26, 0x4c, 0xae, 0x21, 0x36, 0xd1, 0x39, 0xaa, 0x5d, 0x1b, 0xa0, 0xde, 0x80, 0x36, 0xaa, 0x43, + 0x7b, 0x01, 0x48, 0xef, 0xef, 0x2f, 0x79, 0x41, 0xf7, 0x97, 0x2c, 0x1d, 0x89, 0x98, 0x7d, 0x78, 0xf7, 0x25, 0x5c, + 0x72, 0x14, 0x29, 0x18, 0x16, 0x53, 0x0c, 0x82, 0x53, 0x6d, 0x8e, 0x16, 0x21, 0x42, 0x89, 0x10, 0xcd, 0x09, 0x3c, + 0x35, 0x97, 0x02, 0xb1, 0x40, 0x5e, 0x5f, 0x43, 0xce, 0x62, 0x0d, 0x33, 0x4d, 0x55, 0x2f, 0x51, 0x1c, 0x1f, 0xea, + 0xd6, 0x5a, 0x04, 0xe8, 0x46, 0x80, 0x04, 0x75, 0x4e, 0x2b, 0x1c, 0x40, 0x5e, 0xb3, 0x8b, 0x87, 0x98, 0x5f, 0x95, + 0xc4, 0xa6, 0x2e, 0x50, 0xf5, 0x8e, 0x93, 0xe8, 0x92, 0x25, 0xbd, 0xfd, 0x65, 0xba, 0x5a, 0xb5, 0x8a, 0xe3, 0x43, + 0xfd, 0xe8, 0x1d, 0x2b, 0xbe, 0xa1, 0x5f, 0x78, 0xa9, 0xb6, 0x18, 0x6e, 0x25, 0x42, 0xb6, 0xa7, 0x4d, 0x73, 0x0a, + 0xcd, 0x00, 0x05, 0xf2, 0x54, 0x82, 0x85, 0x6a, 0x54, 0x2a, 0x44, 0x05, 0xf2, 0x78, 0xbc, 0x59, 0x96, 0x4b, 0x36, + 0x87, 0xd2, 0xe9, 0x6a, 0xd5, 0x2e, 0x90, 0x37, 0xe3, 0x29, 0x3c, 0xa5, 0xab, 0x95, 0xba, 0xf0, 0x37, 0xe3, 0xa9, + 0xdf, 0x02, 0xb2, 0x45, 0xde, 0x2c, 0xba, 0x51, 0x0b, 0xb6, 0x35, 0xd1, 0x8d, 0xdf, 0x36, 0x55, 0x41, 0x89, 0x9f, + 0x1c, 0x28, 0xae, 0xda, 0xd1, 0xc4, 0xec, 0x68, 0x4c, 0x16, 0xfa, 0x2a, 0x13, 0xf5, 0x63, 0x9a, 0x6c, 0xdf, 0xd1, + 0xd8, 0xee, 0xe8, 0x62, 0xc7, 0x8e, 0x2e, 0xee, 0xd8, 0xd1, 0xc8, 0xec, 0x9e, 0x57, 0xe2, 0x4e, 0xac, 0x56, 0xed, + 0x56, 0x85, 0xbd, 0xe3, 0xc3, 0x98, 0x5f, 0xc1, 0x6e, 0x80, 0x9a, 0x27, 0xf9, 0x8c, 0x6d, 0x27, 0xca, 0x3a, 0x8a, + 0xd9, 0xaf, 0xc2, 0x64, 0x85, 0x85, 0xb4, 0x8e, 0x05, 0x97, 0xae, 0xcb, 0x98, 0xdb, 0x1f, 0x49, 0xd9, 0x1c, 0xf0, + 0x90, 0x03, 0x1e, 0xa6, 0xf6, 0x05, 0x98, 0x3e, 0x7a, 0x8f, 0x08, 0xf2, 0x90, 0x25, 0xeb, 0x8b, 0xe2, 0x1c, 0x64, + 0x84, 0x5a, 0xdf, 0xbd, 0x68, 0x11, 0x5a, 0xa3, 0xde, 0x6e, 0x9a, 0x83, 0xf0, 0xf8, 0xb5, 0xc8, 0x62, 0x14, 0xea, + 0xa6, 0xbf, 0x0a, 0x55, 0x33, 0x9e, 0x9a, 0x64, 0xab, 0x9d, 0xb4, 0x56, 0xd5, 0xbb, 0x14, 0xd7, 0x79, 0xf4, 0x48, + 0xb7, 0x98, 0x47, 0x52, 0xb2, 0x2c, 0x35, 0x94, 0x8b, 0xd0, 0xff, 0x17, 0x54, 0xb8, 0x85, 0xaf, 0x44, 0x76, 0x03, + 0x2c, 0x01, 0x1a, 0x85, 0xdd, 0xf0, 0x7c, 0x2d, 0x9e, 0xf6, 0x2a, 0x0d, 0xf6, 0x16, 0xbb, 0x46, 0x83, 0x2e, 0x02, + 0x1b, 0x66, 0x31, 0x63, 0xf1, 0xb9, 0x62, 0xd0, 0xfd, 0xd1, 0x85, 0x51, 0x58, 0xd7, 0xc4, 0x5d, 0xd5, 0x81, 0xa0, + 0x1f, 0x17, 0x9d, 0x27, 0x0f, 0x4f, 0x11, 0xd1, 0x3c, 0x5e, 0x8c, 0xc7, 0x08, 0x17, 0xde, 0xfd, 0xba, 0xb5, 0x1f, + 0xfe, 0xb8, 0xf8, 0xe2, 0x45, 0xeb, 0x8b, 0xb2, 0x73, 0x0a, 0x44, 0x64, 0xe2, 0xfb, 0x56, 0x54, 0x39, 0xf0, 0xda, + 0x15, 0x8d, 0xa3, 0x74, 0xf7, 0x72, 0x06, 0xee, 0x72, 0xf2, 0x39, 0x63, 0x31, 0x10, 0x27, 0xd9, 0x28, 0x3d, 0x4f, + 0xd8, 0x15, 0xb3, 0x6f, 0x1e, 0xdc, 0x32, 0xd9, 0x96, 0x1e, 0x23, 0xb1, 0x48, 0xa5, 0x49, 0x74, 0x30, 0xac, 0xd6, + 0x59, 0xd2, 0x85, 0x5a, 0x83, 0x6b, 0x23, 0xdc, 0x6a, 0x39, 0x57, 0x97, 0x5e, 0xc5, 0x05, 0x41, 0x0e, 0x00, 0x3b, + 0x21, 0xeb, 0xef, 0x28, 0x0f, 0x5b, 0xa4, 0xb5, 0x0b, 0x36, 0xd2, 0xc6, 0x21, 0x42, 0x43, 0x8b, 0x27, 0xe5, 0xab, + 0xac, 0xbd, 0x30, 0x62, 0x27, 0xbe, 0x3e, 0x89, 0x81, 0xcb, 0x0c, 0x06, 0x4b, 0x59, 0x9e, 0xef, 0x44, 0x40, 0xb9, + 0x89, 0x04, 0x55, 0xad, 0xd1, 0x8e, 0x51, 0x48, 0x8b, 0xc0, 0x09, 0x53, 0x00, 0x97, 0x11, 0x53, 0xd3, 0x8a, 0x8d, + 0xc7, 0x6c, 0x54, 0xba, 0x7a, 0x21, 0xf6, 0x35, 0xe6, 0x89, 0x84, 0x10, 0x90, 0x8a, 0xcd, 0xa0, 0x37, 0x22, 0x65, + 0x08, 0xdb, 0x6c, 0x4e, 0x03, 0xbf, 0x91, 0xff, 0xdb, 0xe1, 0xd1, 0x23, 0xd6, 0x61, 0x31, 0xb3, 0xac, 0x56, 0xd6, + 0xcd, 0x53, 0x2b, 0xaf, 0x23, 0x52, 0x28, 0x3f, 0xce, 0xae, 0x03, 0x74, 0xbf, 0x63, 0xb2, 0x6c, 0x7f, 0xf1, 0xa8, + 0xdd, 0x2a, 0x10, 0x41, 0x30, 0xdc, 0x7d, 0x4f, 0x89, 0xea, 0x75, 0x04, 0xbd, 0x16, 0xe9, 0xaf, 0xe9, 0xd7, 0x69, + 0x7f, 0xde, 0x46, 0x44, 0xbf, 0x48, 0x00, 0x17, 0x25, 0x33, 0x18, 0x81, 0xf3, 0xf3, 0x77, 0x2f, 0xa5, 0x3e, 0xf8, + 0xfd, 0xe0, 0x79, 0xdc, 0x6e, 0x21, 0x82, 0x72, 0x29, 0xe6, 0xbf, 0x62, 0x09, 0x47, 0x88, 0xa0, 0x51, 0x22, 0x72, + 0xe6, 0xae, 0x41, 0xab, 0xb3, 0xbf, 0x7f, 0x11, 0x1a, 0xa2, 0x79, 0xc6, 0xf2, 0xdc, 0x73, 0xc7, 0x37, 0xa4, 0xf4, + 0x09, 0x86, 0xb9, 0x95, 0xe2, 0x72, 0x26, 0x15, 0x5e, 0xf4, 0x1d, 0x7f, 0x97, 0xaa, 0x74, 0xd9, 0x06, 0xb1, 0x29, + 0x11, 0x50, 0x32, 0x36, 0xad, 0x5d, 0x7d, 0x72, 0xe6, 0x2d, 0x47, 0x4f, 0x4f, 0xac, 0x63, 0xc2, 0x9b, 0x13, 0xd4, + 0x4a, 0x66, 0x3c, 0x3d, 0xdf, 0x52, 0x1a, 0xdd, 0x6c, 0x29, 0x05, 0x95, 0xad, 0x84, 0xce, 0xbc, 0x7e, 0xe6, 0xd3, + 0x58, 0xaf, 0x14, 0x1f, 0x17, 0xc4, 0x58, 0xf9, 0x2d, 0x3f, 0x01, 0xa9, 0xb3, 0x0d, 0x6a, 0x84, 0xdf, 0x3e, 0x1d, + 0x94, 0xfc, 0x9a, 0xe9, 0xca, 0x51, 0x7e, 0xdf, 0x0a, 0xa1, 0xb4, 0x09, 0xfe, 0xeb, 0xe4, 0x57, 0xad, 0x95, 0xdd, + 0x7c, 0x9a, 0xe0, 0x1c, 0xad, 0xea, 0x77, 0x6c, 0xbd, 0xb9, 0xc7, 0xbe, 0xbe, 0xf7, 0x5b, 0x8a, 0x8d, 0xe2, 0x53, + 0xee, 0xff, 0x28, 0xe1, 0xb3, 0x8a, 0x04, 0x36, 0xc1, 0x54, 0x1a, 0x0f, 0x24, 0x33, 0xb9, 0x83, 0x68, 0xd5, 0xe7, + 0x1c, 0xae, 0x68, 0xc2, 0x7b, 0x30, 0x16, 0x19, 0x3b, 0x4f, 0xc4, 0xf5, 0xfa, 0x7b, 0xbd, 0x76, 0x37, 0x9e, 0xf2, + 0xc9, 0xd4, 0xb9, 0x77, 0xc5, 0x68, 0xb9, 0x09, 0x77, 0x4e, 0x50, 0xfc, 0xeb, 0xbf, 0x04, 0xc1, 0xbf, 0xfe, 0xcb, + 0x27, 0x9b, 0xc2, 0xf0, 0xc5, 0x05, 0x91, 0xd5, 0xb0, 0xbb, 0x4f, 0xd7, 0xf6, 0x99, 0xea, 0x38, 0xdf, 0xde, 0x66, + 0x63, 0x13, 0xa0, 0x7e, 0x63, 0x0b, 0x36, 0x0a, 0xf5, 0xe9, 0xf3, 0x7e, 0x0b, 0x60, 0xb0, 0xae, 0x4f, 0x42, 0x06, + 0x8d, 0x7e, 0x17, 0x68, 0x17, 0x38, 0xbc, 0xd7, 0x8e, 0xfc, 0x76, 0x0c, 0x7f, 0x6a, 0x0d, 0xbf, 0x13, 0x7c, 0xe3, + 0x9f, 0x18, 0x5d, 0x5c, 0x94, 0x09, 0x76, 0x6e, 0x57, 0xb8, 0xc0, 0xdf, 0xdf, 0x28, 0x31, 0x8a, 0x47, 0xd8, 0xc2, + 0x3d, 0x75, 0x3d, 0x90, 0x8e, 0x2e, 0x5e, 0xc3, 0x5b, 0x7b, 0x8e, 0x2f, 0x33, 0xeb, 0xe0, 0xbd, 0x43, 0x38, 0xc0, + 0x10, 0xf5, 0x55, 0xa9, 0x41, 0x37, 0x24, 0x03, 0x94, 0x82, 0xb9, 0x01, 0x60, 0x92, 0xd1, 0x85, 0xb1, 0x36, 0x4f, + 0xb5, 0x1b, 0x26, 0x5c, 0x27, 0x6d, 0xe3, 0x9e, 0xa9, 0x21, 0x9d, 0x78, 0xef, 0x15, 0xbe, 0x54, 0x63, 0x56, 0x59, + 0xf7, 0xca, 0xd5, 0x05, 0x76, 0xc4, 0x45, 0xa1, 0xc2, 0xf4, 0x7f, 0xdd, 0x15, 0x49, 0xfc, 0xfb, 0xa7, 0x23, 0x89, + 0xe2, 0x5e, 0x91, 0xc4, 0xbf, 0xff, 0xe1, 0x91, 0xc4, 0xbf, 0xba, 0x91, 0x44, 0xd8, 0xc4, 0x2f, 0xef, 0x15, 0xed, + 0xb3, 0x91, 0x18, 0x71, 0x9d, 0xd3, 0xb6, 0x51, 0xa3, 0x13, 0x31, 0x81, 0x50, 0xdf, 0xbf, 0x7f, 0xe4, 0x2e, 0x11, + 0x13, 0x37, 0x6e, 0x07, 0x6f, 0x6d, 0x85, 0x40, 0x5d, 0xd7, 0x46, 0xd8, 0x4c, 0xac, 0xac, 0x55, 0xde, 0x48, 0x69, + 0x3e, 0xb4, 0x6f, 0x50, 0x40, 0x61, 0xf9, 0x16, 0xa4, 0x16, 0xe9, 0xd8, 0x68, 0x5a, 0xa8, 0x02, 0x71, 0x65, 0xc7, + 0x4e, 0xc3, 0x5e, 0xb7, 0x70, 0x47, 0xe8, 0xda, 0xb7, 0xbc, 0xe8, 0xdb, 0xf7, 0x4b, 0xf4, 0xe3, 0x4d, 0xfb, 0xd9, + 0xa0, 0xdd, 0x3d, 0x6a, 0xcf, 0x50, 0x88, 0x40, 0x44, 0xaa, 0x82, 0x56, 0xf7, 0xe8, 0x08, 0x0a, 0xae, 0x9d, 0x82, + 0x0e, 0x14, 0x70, 0xa7, 0xe0, 0x11, 0x14, 0x8c, 0x9c, 0x82, 0xc7, 0x50, 0x10, 0x3b, 0x05, 0x4f, 0xa0, 0xe0, 0x0a, + 0x15, 0x03, 0x5e, 0x82, 0xfb, 0x04, 0x0f, 0x89, 0xb6, 0x5c, 0x6c, 0xd9, 0x13, 0xd2, 0x86, 0x10, 0x5e, 0x34, 0x51, + 0x99, 0x47, 0xe0, 0x10, 0x0c, 0x05, 0xb9, 0x9e, 0xb2, 0x34, 0x84, 0x20, 0xea, 0x73, 0x25, 0x63, 0x02, 0x29, 0xde, + 0xf3, 0x19, 0xb3, 0xdf, 0xcb, 0xb0, 0x78, 0xf0, 0x10, 0x1e, 0xb4, 0x86, 0x45, 0xb7, 0xdc, 0x39, 0x1d, 0xfb, 0x33, + 0x59, 0x28, 0x7a, 0x2f, 0xab, 0x3a, 0x3d, 0x5d, 0xb3, 0xdc, 0xf3, 0x1d, 0x31, 0x24, 0xc7, 0x17, 0x31, 0x4e, 0xc4, + 0x75, 0xf3, 0x06, 0xf5, 0xb6, 0xc7, 0x95, 0x00, 0xa2, 0x32, 0xae, 0xa4, 0xd6, 0x54, 0x3e, 0xbd, 0x8f, 0x26, 0xe5, + 0xef, 0xd7, 0x2c, 0xcf, 0xa3, 0x89, 0x69, 0xb9, 0x3b, 0x8e, 0xa4, 0x40, 0x74, 0x63, 0x48, 0x16, 0x08, 0x88, 0x05, + 0xc1, 0x66, 0x81, 0x2d, 0x6f, 0x42, 0x43, 0x80, 0x9d, 0x7a, 0x54, 0x49, 0x4d, 0x5f, 0x2f, 0x92, 0xd1, 0xa4, 0x2a, + 0x38, 0x9e, 0x67, 0x4c, 0x95, 0x6a, 0x0c, 0x17, 0xc7, 0x87, 0x50, 0xa0, 0xab, 0x77, 0x44, 0x8f, 0xac, 0xe3, 0x60, + 0x77, 0x0c, 0xc9, 0xb3, 0xd1, 0x23, 0x37, 0xdf, 0xa6, 0x4c, 0xb6, 0xd9, 0x8c, 0x59, 0x7c, 0xd6, 0x1e, 0xc1, 0x1f, + 0x13, 0x11, 0xf9, 0x6c, 0x3c, 0x1e, 0xdf, 0x19, 0x4d, 0xfa, 0x2c, 0x1e, 0xb3, 0x0e, 0x7b, 0xd4, 0x85, 0x5c, 0x8c, + 0xa6, 0x89, 0x41, 0xb4, 0x0b, 0x85, 0xbb, 0xe5, 0xfd, 0x1a, 0x43, 0xb8, 0x42, 0x4e, 0x97, 0xf7, 0x8f, 0x2c, 0x15, + 0xf3, 0x8c, 0x2d, 0x67, 0x51, 0x36, 0xe1, 0x69, 0xd8, 0x2a, 0x82, 0x2b, 0x13, 0x8a, 0xf9, 0xec, 0xe9, 0xd3, 0xa7, + 0x45, 0x10, 0xdb, 0xa7, 0x56, 0x1c, 0x17, 0xc1, 0x68, 0x59, 0x2e, 0xa3, 0xd5, 0x1a, 0x8f, 0x8b, 0x80, 0xdb, 0x82, + 0xa3, 0xce, 0x28, 0x3e, 0xea, 0x14, 0xc1, 0xb5, 0xd3, 0xa2, 0x08, 0x98, 0x79, 0xca, 0x58, 0x5c, 0x4b, 0xe8, 0x78, + 0xd2, 0x6a, 0x15, 0x81, 0x26, 0xb4, 0x25, 0x98, 0x63, 0xfa, 0x67, 0x18, 0x2d, 0xa4, 0x00, 0x96, 0xdc, 0x15, 0xd2, + 0x1f, 0x9c, 0x9b, 0x97, 0x65, 0xe8, 0x0f, 0x4b, 0x14, 0x78, 0x48, 0xbe, 0x74, 0x83, 0x26, 0x40, 0xcc, 0x2a, 0x58, + 0x22, 0x6c, 0x4c, 0xa5, 0x56, 0x0d, 0x94, 0xa5, 0xaa, 0xbf, 0xa4, 0xa2, 0x8a, 0xa5, 0x00, 0xff, 0x81, 0x96, 0xfa, + 0xad, 0x6e, 0x92, 0xed, 0xe0, 0xfa, 0x8c, 0x7d, 0x92, 0xeb, 0xdf, 0xde, 0x87, 0xe9, 0x33, 0xf6, 0x47, 0x33, 0x7d, + 0xf3, 0xea, 0x53, 0xcd, 0xf4, 0x35, 0x5b, 0x9b, 0x49, 0x8a, 0x46, 0x53, 0x36, 0xfa, 0x78, 0x29, 0x6e, 0x9a, 0x70, + 0x24, 0x32, 0xa4, 0xf8, 0xe9, 0xfe, 0x6f, 0x4d, 0xfe, 0xb0, 0x83, 0x39, 0xdf, 0xa5, 0x50, 0x62, 0xf3, 0x6d, 0x4a, + 0xd1, 0x5b, 0x6b, 0xd3, 0xe9, 0x92, 0xf1, 0x98, 0xa2, 0xb7, 0xe3, 0x31, 0xb2, 0x57, 0xfe, 0x22, 0xc9, 0x54, 0xab, + 0x37, 0xb5, 0x12, 0xd5, 0xea, 0x8b, 0x2f, 0xdc, 0x32, 0xb7, 0xc0, 0x84, 0x5c, 0xdc, 0xf0, 0x8a, 0xa9, 0x89, 0x79, + 0x0e, 0x47, 0x0d, 0x3e, 0x97, 0x51, 0x7f, 0xe7, 0x60, 0x56, 0x7b, 0x3d, 0x74, 0x09, 0xf0, 0x96, 0x77, 0x5a, 0xaf, + 0xdf, 0x77, 0x9f, 0x30, 0x9b, 0x7e, 0xf7, 0xec, 0xf6, 0xcb, 0xd8, 0x9f, 0x49, 0x5c, 0xf0, 0xfc, 0x6d, 0xba, 0x76, + 0x97, 0x45, 0xc3, 0x48, 0xa9, 0xbb, 0xac, 0x42, 0x8a, 0xc9, 0x24, 0x81, 0x0f, 0x96, 0x2c, 0x6b, 0xef, 0x41, 0xd5, + 0xdd, 0xfb, 0xb5, 0xf5, 0x86, 0x6e, 0x47, 0xf3, 0xd6, 0x50, 0xf5, 0xfd, 0x24, 0x9d, 0x03, 0x7d, 0x65, 0x3e, 0xa4, + 0xa3, 0xcc, 0xc1, 0xa5, 0xe1, 0xff, 0x4b, 0x9d, 0x39, 0x2b, 0x21, 0x6b, 0x44, 0x0f, 0x1c, 0x17, 0x85, 0xb9, 0x73, + 0x10, 0xf3, 0x7c, 0x0e, 0xef, 0xe7, 0xd4, 0x3d, 0xd9, 0xa7, 0x58, 0x78, 0x7e, 0xed, 0xc4, 0x35, 0x6a, 0xdb, 0x55, + 0xd8, 0xc0, 0x86, 0x76, 0x14, 0xcf, 0x64, 0x81, 0x8c, 0xbf, 0xd9, 0x22, 0x11, 0x79, 0x1a, 0x9f, 0x3a, 0xe2, 0xe2, + 0xac, 0x10, 0x9c, 0xbe, 0xe5, 0x86, 0xd8, 0x2a, 0x5b, 0x50, 0xb8, 0x71, 0x3b, 0x55, 0xa3, 0xb1, 0xa5, 0xa2, 0x04, + 0xf9, 0x3c, 0x4a, 0x35, 0x1b, 0xa5, 0x48, 0xf3, 0x83, 0xfd, 0x65, 0xb5, 0xf3, 0x05, 0xb2, 0x60, 0x6b, 0xe2, 0xed, + 0x1d, 0x1f, 0x42, 0x87, 0x9e, 0x57, 0x03, 0x3d, 0xdd, 0x08, 0x2e, 0x7c, 0x22, 0xcc, 0x7f, 0x11, 0xe4, 0xd7, 0x24, + 0xc8, 0xaf, 0xbd, 0x3f, 0x2f, 0x9b, 0xd7, 0xec, 0xf2, 0x23, 0x97, 0x4d, 0x19, 0xcd, 0x9b, 0xa0, 0xf0, 0x2b, 0xa7, + 0xa0, 0x61, 0xcf, 0x2a, 0x59, 0x4d, 0xdf, 0xd8, 0xef, 0x2e, 0x72, 0xc8, 0x06, 0x50, 0x6a, 0x6b, 0x98, 0x8a, 0x94, + 0x75, 0xeb, 0x49, 0x89, 0x6e, 0x70, 0xd9, 0x62, 0x6b, 0xb8, 0x14, 0x90, 0x3d, 0x20, 0x6f, 0xc3, 0x96, 0x61, 0xeb, + 0x2d, 0x1b, 0x39, 0x6e, 0x6d, 0x6d, 0x1f, 0x1a, 0xe4, 0x36, 0x94, 0xf4, 0xca, 0x36, 0x23, 0xe8, 0xbb, 0x22, 0xe0, + 0x9f, 0x4a, 0xd1, 0x03, 0x57, 0xa2, 0xfd, 0xeb, 0xe4, 0x36, 0xae, 0x17, 0xab, 0x14, 0xbd, 0xfb, 0x40, 0x16, 0x46, + 0x63, 0xc9, 0x32, 0x72, 0x9f, 0x96, 0x97, 0xea, 0x36, 0xcd, 0x12, 0xc4, 0x4c, 0xd8, 0x7e, 0x3a, 0xbf, 0xb9, 0xff, + 0xf0, 0x77, 0x2f, 0xbf, 0x30, 0x38, 0xb2, 0x6f, 0x97, 0x41, 0xa8, 0x0b, 0x07, 0x21, 0x89, 0x6e, 0x43, 0x9e, 0x2a, + 0x99, 0x77, 0x09, 0xfe, 0xc0, 0xee, 0x5c, 0x98, 0x5c, 0xd3, 0x8c, 0x25, 0xea, 0x53, 0x72, 0x66, 0x2b, 0x8e, 0x1e, + 0xcf, 0x6f, 0xec, 0x6e, 0xb4, 0xd7, 0x72, 0x48, 0xff, 0xd0, 0x54, 0xd1, 0xdd, 0xb9, 0xa9, 0xf5, 0x74, 0xc7, 0x47, + 0xf3, 0x9b, 0xae, 0x16, 0xb4, 0xcd, 0x4c, 0x43, 0xd5, 0x9a, 0xdf, 0xb8, 0xc9, 0xb2, 0xd5, 0x40, 0x5e, 0x70, 0x94, + 0x7b, 0x2c, 0xca, 0x59, 0x17, 0xde, 0x9f, 0xcd, 0x47, 0x51, 0x62, 0x84, 0xf9, 0x8c, 0xc7, 0x71, 0xc2, 0xba, 0x56, + 0x5e, 0x7b, 0xed, 0xc7, 0x90, 0x6b, 0xea, 0x6e, 0x59, 0x7d, 0x57, 0x1c, 0xe4, 0x95, 0x78, 0x8a, 0x2e, 0x73, 0x91, + 0xc0, 0xc7, 0x2b, 0xb6, 0xa2, 0xd3, 0x24, 0x61, 0xb6, 0x2a, 0xe4, 0xa9, 0xdf, 0xf5, 0xb5, 0x3c, 0x6a, 0xfd, 0xa9, + 0xab, 0x36, 0xbc, 0xd5, 0x95, 0x62, 0x1e, 0x36, 0x8f, 0xea, 0x0b, 0x81, 0xaa, 0x72, 0x09, 0x64, 0xcb, 0xb2, 0x08, + 0x48, 0x2b, 0xcd, 0xa7, 0xbd, 0xa0, 0x6d, 0xca, 0xd4, 0x00, 0xf0, 0xa2, 0xe7, 0xb2, 0xa8, 0xa8, 0x2f, 0xe6, 0xdf, + 0xe7, 0xb4, 0x7c, 0xbe, 0xfd, 0xb4, 0x7c, 0x6e, 0x4f, 0xcb, 0xdd, 0x14, 0xfb, 0xd9, 0xb8, 0x0d, 0x7f, 0xba, 0xd5, + 0x82, 0xc2, 0x96, 0x77, 0x34, 0xbf, 0xf1, 0x40, 0x4f, 0x6b, 0x76, 0xe6, 0x37, 0x3a, 0x55, 0x18, 0x62, 0x16, 0x2d, + 0x48, 0x9e, 0x25, 0x2d, 0x0f, 0x0a, 0xe1, 0x6f, 0xab, 0x56, 0xd5, 0x7e, 0x08, 0x75, 0xd0, 0xeb, 0xd1, 0x66, 0x5d, + 0xe7, 0xee, 0x43, 0x1b, 0xa6, 0x42, 0xfa, 0xa1, 0xe5, 0xc6, 0x38, 0x90, 0xd1, 0xe5, 0x25, 0x8b, 0xc3, 0xb1, 0x18, + 0x2d, 0xf2, 0x7f, 0x36, 0xf0, 0x1b, 0x24, 0xde, 0x79, 0xa4, 0xd7, 0xc6, 0xb1, 0x5d, 0x75, 0xe2, 0xb2, 0x1d, 0x61, + 0x59, 0xee, 0x53, 0x98, 0x8f, 0xa2, 0x84, 0xf9, 0x9d, 0xe0, 0xe1, 0x96, 0x43, 0xf0, 0x1f, 0xb2, 0x37, 0x5b, 0x17, + 0xf3, 0x7b, 0x91, 0x71, 0x27, 0x12, 0x7e, 0x15, 0x0e, 0xdc, 0x3d, 0x6c, 0x3d, 0xdd, 0x0e, 0xee, 0xc0, 0xce, 0x34, + 0xb4, 0x42, 0xc1, 0xc8, 0x9d, 0x98, 0x8d, 0xa3, 0x45, 0x22, 0xef, 0x1e, 0x75, 0x17, 0x65, 0x6c, 0x8c, 0x7a, 0x07, + 0x43, 0xaf, 0xda, 0xde, 0x93, 0x4b, 0x7f, 0xf6, 0xf9, 0x43, 0xf8, 0xa3, 0xf3, 0x9e, 0x6e, 0x2b, 0x5d, 0x5d, 0xdb, + 0xaa, 0xa0, 0xab, 0xef, 0xd7, 0x94, 0x71, 0x2d, 0xc2, 0x95, 0x3e, 0x7e, 0xdf, 0xd6, 0xa0, 0x55, 0xde, 0xab, 0xb9, + 0xd1, 0xb2, 0x7e, 0x55, 0xeb, 0x5f, 0x37, 0xf8, 0x3d, 0xdb, 0x8e, 0xb4, 0xe6, 0x5a, 0x6f, 0x6b, 0xbe, 0xa5, 0xb7, + 0xd1, 0xd8, 0x62, 0x5c, 0xb5, 0xdf, 0xa7, 0xb7, 0xa5, 0x89, 0xa2, 0xa3, 0x90, 0x60, 0xa5, 0xec, 0x6b, 0x2b, 0x85, + 0x33, 0xfa, 0x00, 0xde, 0x64, 0xeb, 0xdd, 0xcc, 0x92, 0x34, 0xa7, 0x68, 0x2a, 0xe5, 0x3c, 0xd4, 0x1f, 0x5f, 0xbd, + 0x3e, 0x0a, 0x44, 0x36, 0x39, 0xec, 0xb4, 0x5a, 0x2d, 0x78, 0x03, 0x29, 0xf2, 0xae, 0x38, 0xbb, 0x7e, 0x26, 0x6e, + 0x28, 0x7a, 0xe2, 0x3d, 0xf5, 0x9e, 0x1c, 0x79, 0x8f, 0x1e, 0x23, 0x4f, 0xb1, 0x73, 0x8a, 0x9e, 0x1c, 0x21, 0x4f, + 0xb3, 0x73, 0x8a, 0x1e, 0x3d, 0x46, 0xbd, 0xe3, 0x89, 0x55, 0xc9, 0xe0, 0x0a, 0xa3, 0xd6, 0x77, 0x72, 0x99, 0x89, + 0x8f, 0xac, 0x7e, 0x70, 0x75, 0x99, 0xc9, 0x8c, 0xeb, 0xd8, 0x47, 0x38, 0xbd, 0xa3, 0x68, 0x1e, 0x2a, 0xa2, 0x70, + 0x0b, 0xc1, 0x2d, 0xa3, 0x4b, 0xd5, 0x14, 0xa0, 0x66, 0x5e, 0xa2, 0xde, 0x31, 0x64, 0xb1, 0x7b, 0x31, 0x45, 0xaf, + 0x3b, 0x4f, 0xbc, 0xf6, 0xe3, 0xab, 0xe6, 0xc3, 0x51, 0xab, 0xd9, 0xf6, 0xda, 0xcd, 0x4e, 0xf0, 0xc4, 0xeb, 0xe8, + 0x7f, 0xbd, 0x96, 0x77, 0xe4, 0xb5, 0x83, 0x27, 0xde, 0x91, 0xd7, 0x09, 0x9e, 0x5c, 0x3d, 0xd4, 0xc9, 0x0c, 0x11, + 0x3a, 0xec, 0x1d, 0xc3, 0x87, 0x34, 0x6f, 0x28, 0xfa, 0x1c, 0xe9, 0xcf, 0xd5, 0xa2, 0xcf, 0xdc, 0xd2, 0xf6, 0xd3, + 0xad, 0xc5, 0x9d, 0x27, 0x5b, 0x8b, 0x8f, 0x1e, 0x6f, 0x2d, 0x7e, 0xf8, 0xa8, 0x5e, 0x7c, 0x38, 0xd1, 0x55, 0xe5, + 0x29, 0xa7, 0x68, 0x16, 0xc9, 0x8c, 0xdf, 0xf8, 0x6d, 0xaf, 0xe5, 0xb5, 0xbc, 0x26, 0xfc, 0xf7, 0xa4, 0x83, 0xcb, + 0x5e, 0x97, 0xd0, 0xab, 0x5c, 0xe5, 0x93, 0xa7, 0x5e, 0xfb, 0xf1, 0xcb, 0xce, 0xe3, 0x11, 0xb4, 0x53, 0x0b, 0x6d, + 0x7b, 0xed, 0xab, 0xa3, 0xa7, 0xa3, 0x96, 0x07, 0x1d, 0xdb, 0xf0, 0x67, 0xfa, 0xa8, 0x33, 0xd2, 0x0f, 0x2d, 0xa8, + 0xff, 0xb6, 0xfd, 0x24, 0x6f, 0x35, 0xdb, 0xf0, 0xe7, 0x97, 0x52, 0x23, 0x06, 0x7d, 0xdc, 0x1d, 0xf7, 0x61, 0xcb, + 0x3b, 0x7a, 0x3a, 0xed, 0x04, 0x9f, 0x5f, 0x3d, 0x09, 0x9e, 0x4e, 0xdb, 0x4f, 0xbe, 0xd5, 0x4f, 0x49, 0xb3, 0x13, + 0x7c, 0x0e, 0x7f, 0xbf, 0x3d, 0x6a, 0x4d, 0x9b, 0xed, 0xe0, 0xe9, 0xd5, 0x51, 0x70, 0x94, 0x34, 0x1f, 0x07, 0x4f, + 0xe1, 0x6f, 0x35, 0xdc, 0x54, 0xcc, 0x18, 0xf2, 0x60, 0xbf, 0xd7, 0xcc, 0x2d, 0x77, 0x8e, 0xce, 0x43, 0xef, 0xd1, + 0xc3, 0x97, 0x4f, 0xaf, 0x9a, 0x0f, 0xa7, 0xed, 0xce, 0x55, 0x73, 0xe7, 0xcf, 0x6f, 0x01, 0xf1, 0x66, 0xe0, 0x88, + 0xc1, 0x75, 0x22, 0x8b, 0x38, 0xf5, 0x36, 0xdc, 0x07, 0x24, 0xdf, 0x65, 0x5e, 0x67, 0x9f, 0x36, 0xaf, 0x53, 0x76, + 0x1f, 0xfb, 0x3a, 0xfb, 0xc3, 0xed, 0xeb, 0x9c, 0xad, 0x39, 0x55, 0x6f, 0xe5, 0x86, 0x19, 0xbd, 0x6e, 0x7b, 0xbd, + 0x93, 0xfe, 0x80, 0xc3, 0x57, 0x97, 0x8a, 0xee, 0x2d, 0xbc, 0x70, 0xdb, 0xf5, 0x36, 0x08, 0x38, 0xc8, 0xb7, 0x52, + 0x9f, 0x64, 0xb1, 0x0b, 0x21, 0xc9, 0xa7, 0x11, 0xf2, 0xed, 0x7d, 0xf0, 0x91, 0xfc, 0xe1, 0xf8, 0x10, 0x2e, 0x3e, + 0x6a, 0x7e, 0x5e, 0x65, 0xcf, 0x2a, 0x7b, 0xf4, 0x4c, 0x3d, 0xfb, 0x70, 0xe3, 0xa4, 0x81, 0x0e, 0x19, 0x14, 0xe5, + 0x48, 0xc7, 0x15, 0x5e, 0xfe, 0x1a, 0x97, 0xb4, 0xbe, 0x5e, 0x46, 0x91, 0x31, 0xfe, 0xe7, 0xf0, 0x65, 0x05, 0xfb, + 0x70, 0xa5, 0x2f, 0x3c, 0x53, 0xd4, 0x09, 0x5a, 0x41, 0xab, 0x74, 0x1c, 0xc0, 0x95, 0x42, 0xba, 0x14, 0x32, 0x82, + 0x8f, 0x7b, 0x26, 0x62, 0xa2, 0x3e, 0x03, 0x0a, 0x2f, 0x5f, 0x57, 0x1f, 0x64, 0xd5, 0xef, 0xbd, 0x0f, 0x11, 0x32, + 0x2f, 0x22, 0x80, 0x2b, 0x6b, 0xdf, 0xc0, 0xb5, 0x3e, 0xeb, 0xb1, 0x9e, 0x81, 0x4d, 0xfd, 0x9a, 0xc5, 0x3c, 0xf2, + 0x91, 0x3f, 0xcf, 0xd8, 0x98, 0x65, 0x79, 0xb3, 0x76, 0xd7, 0x4d, 0x5d, 0x73, 0xc3, 0xc8, 0x7e, 0x46, 0x32, 0x83, + 0x97, 0x09, 0xd3, 0x81, 0xf1, 0x6a, 0x21, 0xa3, 0xe6, 0xa3, 0x82, 0xd8, 0x92, 0x0c, 0x38, 0x7a, 0xa5, 0x1a, 0x20, + 0xad, 0x1b, 0xb4, 0x83, 0xce, 0x23, 0xac, 0x79, 0x09, 0xbc, 0xa4, 0xf5, 0x7b, 0xbf, 0x79, 0xd4, 0xfa, 0x13, 0x76, + 0xba, 0x95, 0x03, 0x0d, 0x8d, 0x53, 0x27, 0xab, 0x3e, 0xbf, 0x5b, 0xbf, 0x88, 0x88, 0x34, 0x45, 0x7c, 0xa6, 0xd7, + 0x0e, 0xaf, 0x7b, 0x35, 0xf1, 0x43, 0x7d, 0x9d, 0x7e, 0xcc, 0x27, 0xbe, 0xfb, 0x71, 0x55, 0xfd, 0x12, 0x58, 0xf5, + 0x4d, 0x66, 0x5c, 0x54, 0x4d, 0x32, 0xbc, 0x54, 0xbe, 0x78, 0x9e, 0x7a, 0xd9, 0x6a, 0xe5, 0x67, 0xe0, 0x88, 0xa5, + 0x0e, 0x4e, 0xe1, 0x19, 0xd7, 0x90, 0x9c, 0x91, 0x12, 0x20, 0x85, 0x60, 0x9a, 0xe9, 0xff, 0xab, 0x62, 0xfb, 0xc3, + 0xb8, 0x57, 0x82, 0x24, 0x4a, 0x27, 0x40, 0x85, 0x51, 0x3a, 0xd9, 0x70, 0xde, 0xe8, 0x70, 0xc2, 0x5a, 0x69, 0x35, + 0x54, 0xe5, 0xa4, 0xc9, 0x9f, 0xdd, 0xbe, 0x37, 0x6f, 0x8b, 0x42, 0xe0, 0x03, 0x55, 0xbe, 0xef, 0xea, 0xcd, 0xb6, + 0x0d, 0xfa, 0x40, 0x7f, 0xae, 0x5c, 0x65, 0xc3, 0x81, 0xf4, 0x83, 0x2b, 0x86, 0x9e, 0xb1, 0x79, 0x28, 0xd2, 0xb2, + 0x2f, 0x66, 0x57, 0x7c, 0x64, 0x44, 0x18, 0xf1, 0xcc, 0x35, 0xeb, 0xa6, 0xda, 0x1a, 0xda, 0x26, 0xda, 0xea, 0x1f, + 0x45, 0x2a, 0xdf, 0x99, 0xa6, 0x02, 0xf5, 0x1e, 0x94, 0xdf, 0x8a, 0xdc, 0xb5, 0x09, 0xf0, 0x0d, 0xf5, 0x41, 0xc6, + 0x92, 0x7f, 0xa6, 0x0f, 0xe0, 0x2b, 0xea, 0x0f, 0x86, 0xf0, 0x01, 0xef, 0x40, 0x89, 0x82, 0x07, 0xd5, 0xc7, 0xd4, + 0x81, 0x0f, 0x36, 0x6e, 0x66, 0x09, 0xb9, 0xaf, 0xf8, 0x36, 0xa2, 0xba, 0xf3, 0xa8, 0x12, 0xd5, 0x9d, 0x47, 0xae, + 0xf4, 0x6c, 0x7b, 0xed, 0x4e, 0xf0, 0xc8, 0x11, 0x00, 0x57, 0x4d, 0xf8, 0xbf, 0x26, 0x02, 0x1e, 0x06, 0x8f, 0x4a, + 0x19, 0xf0, 0xaa, 0xdd, 0x09, 0x8e, 0xb4, 0xb8, 0xe9, 0x04, 0x8f, 0x7e, 0x50, 0x0c, 0x5a, 0x33, 0xe7, 0xfa, 0x81, + 0xd8, 0x12, 0xaa, 0xd1, 0x19, 0x7d, 0x88, 0xf8, 0xe5, 0x17, 0xe9, 0xcc, 0xf9, 0x34, 0x2e, 0xa1, 0xe7, 0x51, 0x06, + 0x9f, 0x05, 0xa9, 0x9f, 0xdd, 0x5a, 0x1d, 0xa9, 0xf1, 0x8b, 0x2d, 0x53, 0xc0, 0x09, 0x47, 0xc4, 0xbd, 0xa7, 0x0c, + 0x97, 0x7c, 0xd5, 0x4b, 0x94, 0xed, 0xbb, 0xe4, 0x76, 0x93, 0xb6, 0x6e, 0x68, 0xdf, 0x57, 0xa7, 0x98, 0x05, 0x57, + 0x2f, 0xac, 0x57, 0x93, 0x7c, 0x19, 0x17, 0xeb, 0xf3, 0x43, 0x62, 0x61, 0x26, 0x9c, 0xab, 0xda, 0xac, 0x4a, 0x87, + 0x8f, 0x39, 0x5c, 0xae, 0x2f, 0x0a, 0x0b, 0x7a, 0xcd, 0x19, 0x58, 0x61, 0x49, 0xf1, 0x0b, 0x96, 0xf7, 0x11, 0x14, + 0xa1, 0x10, 0x29, 0x47, 0x12, 0x2a, 0x3f, 0x8d, 0x52, 0x12, 0x76, 0x55, 0x40, 0xd4, 0x95, 0x16, 0x38, 0xb5, 0x80, + 0x1f, 0x84, 0x0f, 0x0e, 0x76, 0x9e, 0x17, 0xa5, 0x8d, 0xc1, 0x5a, 0xab, 0x4f, 0x2a, 0xb8, 0xac, 0x08, 0xb9, 0x88, + 0x2e, 0xc7, 0x55, 0x28, 0xc4, 0x06, 0x4f, 0x97, 0x2c, 0x92, 0x41, 0x94, 0xea, 0x14, 0x05, 0x87, 0x61, 0x91, 0x36, + 0x3b, 0xc2, 0x85, 0x90, 0x91, 0xf3, 0xcd, 0x54, 0x73, 0xce, 0x85, 0x8c, 0xec, 0xc5, 0xc3, 0x54, 0xd6, 0x32, 0xf3, + 0xa7, 0x9d, 0xde, 0xdb, 0xf7, 0x27, 0x9e, 0x3e, 0x9e, 0xc7, 0x87, 0xd3, 0x4e, 0xef, 0x58, 0x59, 0xe6, 0xfa, 0xda, + 0x12, 0xd5, 0xd7, 0x96, 0x3c, 0x73, 0x85, 0x0d, 0xe2, 0x35, 0xc5, 0xa1, 0x5e, 0x36, 0xf2, 0x58, 0x3a, 0xd2, 0x3e, + 0xc5, 0xd9, 0x22, 0x91, 0x1c, 0x5e, 0x08, 0x7c, 0x08, 0x5d, 0x9b, 0xb0, 0x61, 0x65, 0x96, 0xab, 0xd5, 0x70, 0x64, + 0x6a, 0x3d, 0x90, 0x63, 0x9e, 0x30, 0x9b, 0xd7, 0x6a, 0x86, 0x2a, 0xf3, 0xb0, 0x37, 0x5b, 0xe7, 0x8b, 0xcb, 0x19, + 0x97, 0xc8, 0x66, 0x8b, 0x7f, 0x30, 0x1d, 0x8e, 0xd5, 0x54, 0xbd, 0x8b, 0xc2, 0xb8, 0x48, 0xed, 0xc7, 0x4f, 0xd6, + 0x3e, 0x37, 0xaf, 0x57, 0x6f, 0x24, 0x04, 0xdc, 0x3f, 0x9a, 0x1e, 0xf5, 0x4a, 0xa7, 0xa4, 0x5b, 0x57, 0x1c, 0x1f, + 0x4e, 0x8f, 0x7a, 0x17, 0xe1, 0xdc, 0x8c, 0xf7, 0x4a, 0x6c, 0x7c, 0xba, 0xbe, 0xe4, 0x98, 0x7d, 0x95, 0x68, 0xaf, + 0x6f, 0x74, 0x1a, 0x80, 0x47, 0x22, 0x41, 0xbd, 0x63, 0xa3, 0x0c, 0x78, 0x2a, 0xe8, 0x8a, 0x1e, 0xb5, 0x6c, 0xee, + 0x7e, 0x22, 0x94, 0xb6, 0xa4, 0xbb, 0x38, 0x93, 0xd4, 0xfc, 0xba, 0xd3, 0x76, 0xef, 0x38, 0x32, 0x6a, 0x26, 0x30, + 0x8f, 0x3c, 0x3c, 0x84, 0xce, 0xa0, 0xcb, 0x05, 0x5c, 0x1c, 0x5e, 0xb3, 0xcb, 0x66, 0x34, 0xe7, 0x95, 0x13, 0x15, + 0x94, 0x8e, 0x72, 0x4a, 0x51, 0xcd, 0x04, 0x3f, 0xa3, 0xb5, 0x45, 0x2a, 0x16, 0x5e, 0x18, 0x0f, 0xad, 0xd2, 0xd5, + 0x59, 0x24, 0x91, 0xa7, 0x39, 0xbc, 0xf5, 0xe4, 0x1a, 0xd9, 0x5b, 0xa0, 0xde, 0xbf, 0xfd, 0x8f, 0xff, 0x65, 0x9c, + 0xb3, 0xc7, 0x87, 0xd3, 0xb6, 0x1d, 0x6b, 0x0d, 0xd1, 0xc5, 0x31, 0x5c, 0x77, 0xab, 0xa2, 0x89, 0xec, 0xa6, 0x39, + 0xc9, 0x78, 0xdc, 0x9c, 0x46, 0xc9, 0x18, 0xf5, 0x76, 0x23, 0xc8, 0xbd, 0xe7, 0x62, 0xa0, 0xae, 0x17, 0x01, 0x09, + 0xfe, 0xa6, 0x9b, 0x1a, 0x36, 0xe1, 0x5f, 0x9d, 0x56, 0xf7, 0xde, 0x46, 0x75, 0xa0, 0x6a, 0x77, 0x37, 0x32, 0xf3, + 0x8d, 0x24, 0xc3, 0xd4, 0xb2, 0xda, 0x95, 0x8d, 0x02, 0x79, 0x65, 0x34, 0xe4, 0xff, 0xfe, 0xcf, 0xff, 0xf2, 0xdf, + 0xec, 0x23, 0x04, 0x39, 0xfe, 0xed, 0xbf, 0xff, 0xe7, 0xff, 0xf3, 0xbf, 0xff, 0x2b, 0xa4, 0xf9, 0x9b, 0x40, 0x88, + 0xe2, 0x13, 0x5e, 0x15, 0x05, 0xd1, 0x0c, 0xc3, 0x83, 0x4c, 0xb8, 0x19, 0xcf, 0x25, 0x1f, 0xd5, 0x2f, 0x71, 0x9c, + 0xa9, 0x09, 0xd5, 0x61, 0x33, 0xd0, 0xa9, 0x43, 0x5b, 0x54, 0x34, 0x52, 0x43, 0xb9, 0xa2, 0xc5, 0xe2, 0xf8, 0x10, + 0xf0, 0x7d, 0xbf, 0x7b, 0x6f, 0x41, 0xb9, 0x1d, 0x4b, 0xeb, 0xfa, 0x83, 0x92, 0xa2, 0x2a, 0xf7, 0xc0, 0x29, 0xbf, + 0x84, 0xc7, 0xb0, 0xe3, 0x14, 0xab, 0xdd, 0xab, 0xf5, 0xe9, 0xfe, 0xb4, 0xc8, 0x25, 0x1f, 0x03, 0xca, 0xb5, 0x83, + 0x51, 0xc5, 0x3f, 0x9b, 0xa0, 0xfe, 0x25, 0xb7, 0x85, 0x1a, 0x45, 0xdb, 0x8c, 0x0f, 0x9f, 0xfe, 0xa9, 0xf8, 0xcb, + 0x0c, 0x94, 0x2c, 0xcf, 0x9f, 0x45, 0x37, 0xc6, 0x92, 0x7c, 0xdc, 0x6a, 0xcd, 0x6f, 0xf0, 0xb2, 0x9a, 0x81, 0xec, + 0x9a, 0x4c, 0x39, 0x25, 0xdd, 0x01, 0x55, 0xe0, 0xb4, 0xf4, 0x7f, 0xb6, 0x3c, 0x70, 0xa2, 0x7a, 0xad, 0xa2, 0xf8, + 0xf3, 0x52, 0xb9, 0xe0, 0xf8, 0x2f, 0x10, 0xe0, 0x34, 0xde, 0xca, 0x4b, 0xe1, 0x2e, 0x6e, 0xe9, 0xf4, 0xea, 0xe8, + 0x5e, 0xd3, 0xf6, 0xe6, 0x75, 0x2e, 0x37, 0x40, 0xeb, 0x86, 0x56, 0x1f, 0x42, 0xb0, 0x74, 0xda, 0x26, 0xd3, 0xce, + 0xb2, 0x1c, 0x5e, 0x4a, 0x31, 0x73, 0x23, 0xb2, 0x2c, 0x62, 0x23, 0x36, 0xb6, 0x5e, 0x5e, 0x53, 0xaf, 0xa3, 0xad, + 0xc5, 0xf4, 0x68, 0xcb, 0x5c, 0x06, 0x24, 0x15, 0x89, 0xf5, 0x5a, 0xc5, 0x67, 0x70, 0x02, 0x97, 0xe3, 0x44, 0x44, + 0x32, 0x54, 0x04, 0xdb, 0x75, 0xe3, 0xba, 0x11, 0xb0, 0x19, 0xb1, 0x74, 0xe0, 0xe9, 0xea, 0xa6, 0xe0, 0x6f, 0xad, + 0x5f, 0xba, 0x2b, 0x02, 0xd5, 0xdd, 0x1d, 0x4a, 0xbb, 0x6b, 0xbe, 0x35, 0xe1, 0xd2, 0x97, 0x35, 0x3f, 0x87, 0x91, + 0x31, 0x1d, 0xbc, 0xbd, 0x5e, 0x8b, 0x6a, 0x5d, 0xfb, 0x95, 0xf4, 0x91, 0x02, 0x13, 0xad, 0xb7, 0x52, 0x85, 0xd0, + 0xea, 0x25, 0xfd, 0xb6, 0xb4, 0x82, 0xa2, 0xf9, 0x5c, 0x35, 0xc4, 0xdd, 0xe3, 0x43, 0xad, 0xbc, 0x02, 0xf7, 0x50, + 0xb9, 0x00, 0x3a, 0xf4, 0x6e, 0x1a, 0x99, 0xa3, 0xa0, 0x7f, 0x99, 0xa0, 0x3c, 0x7c, 0x3c, 0xab, 0xf7, 0xff, 0x00, + 0x08, 0x50, 0x84, 0x3d, 0xcd, 0x86, 0x00, 0x00}; } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index f2f278b08f..f649a9385e 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -3632,366 +3632,367 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0xb3, 0x2e, 0xb7, 0x6d, 0x5c, 0xfd, 0xbf, 0x4f, 0x01, 0xc3, 0xae, 0x03, 0xd8, 0x00, 0x04, 0x90, 0xa2, 0x28, - 0x93, 0x22, 0x95, 0xc4, 0x76, 0xa6, 0xea, 0x28, 0x71, 0xc6, 0x56, 0x3d, 0x6d, 0x14, 0x8d, 0x08, 0x82, 0x4b, 0x12, - 0x35, 0x08, 0x60, 0x00, 0x50, 0xa2, 0x42, 0xa3, 0xcf, 0xd2, 0x67, 0xe9, 0x93, 0x7d, 0x73, 0xce, 0x5e, 0xb0, 0xb8, - 0x91, 0x54, 0xec, 0xb4, 0xdf, 0xa4, 0xaa, 0x89, 0xc5, 0xee, 0x62, 0xf7, 0xec, 0xee, 0xd9, 0x73, 0x3f, 0xee, 0x82, - 0xc9, 0x5e, 0x0c, 0x8d, 0x1c, 0xf6, 0xb9, 0xcf, 0x9f, 0x89, 0x85, 0x5b, 0x12, 0x08, 0x3e, 0x2b, 0x8b, 0x16, 0x8b, - 0x80, 0x68, 0x2a, 0x4f, 0x1e, 0xa2, 0x1a, 0xe2, 0x33, 0xe7, 0x4f, 0x6c, 0x1e, 0xb1, 0x53, 0xcf, 0xdb, 0x8e, 0x16, - 0x9f, 0x31, 0x11, 0x21, 0xed, 0x28, 0xe5, 0x8a, 0xb2, 0xd9, 0x3b, 0x54, 0x6f, 0xb0, 0x75, 0x29, 0x8e, 0xae, 0x39, - 0x8b, 0xd6, 0xd3, 0x80, 0x98, 0xb8, 0xdd, 0xe1, 0x93, 0xdb, 0xe9, 0x7a, 0x3a, 0x85, 0x2c, 0x2d, 0x4f, 0x6c, 0x03, - 0xe2, 0xce, 0x44, 0x29, 0xf2, 0x83, 0xb9, 0x3e, 0x84, 0x49, 0x59, 0x59, 0x75, 0xf8, 0x60, 0x2b, 0x02, 0xa2, 0x1e, - 0xfa, 0x81, 0x0c, 0x78, 0xbf, 0x86, 0x53, 0x3b, 0x52, 0x3f, 0xc0, 0xee, 0x4b, 0xd5, 0x61, 0xd3, 0xd1, 0x1f, 0x5d, - 0xab, 0x1f, 0x10, 0xc6, 0x98, 0xbd, 0xf8, 0x35, 0xdd, 0xbd, 0xaa, 0xa1, 0x52, 0xa5, 0xf7, 0x1a, 0xf3, 0x18, 0x80, - 0xd0, 0xf7, 0x8d, 0xef, 0x2e, 0xc2, 0x28, 0xcd, 0x7c, 0x4f, 0xbd, 0x19, 0x5e, 0xf8, 0xda, 0xf5, 0x2a, 0xd3, 0xf4, - 0x1b, 0xc3, 0xcb, 0xe4, 0x14, 0x28, 0x1c, 0x61, 0x62, 0x06, 0x94, 0xb6, 0x4a, 0xf2, 0x09, 0xda, 0x59, 0x91, 0xa3, - 0x66, 0xac, 0xe4, 0x65, 0x23, 0xa8, 0x57, 0xc9, 0xa7, 0x82, 0x89, 0xa1, 0x54, 0x6c, 0xa9, 0x0f, 0x29, 0xa7, 0xf2, - 0x7a, 0xbd, 0xc5, 0xab, 0x3c, 0x2b, 0x6e, 0x4b, 0x8c, 0x01, 0xcc, 0x1d, 0x67, 0xe8, 0xf3, 0x13, 0xd9, 0xe8, 0xb3, - 0x74, 0xef, 0x4e, 0xbe, 0x2b, 0xd3, 0x05, 0x70, 0x7f, 0x83, 0xc5, 0x45, 0x18, 0x65, 0x0a, 0x04, 0xb6, 0x81, 0x2f, - 0x4e, 0xaa, 0x46, 0x62, 0xac, 0x57, 0x4d, 0xcf, 0x19, 0x32, 0xf8, 0x1e, 0x2f, 0x3f, 0x8d, 0x85, 0x37, 0x2b, 0x45, - 0xb0, 0xa0, 0xcc, 0x42, 0x08, 0x0b, 0x98, 0x45, 0x97, 0xd1, 0x7d, 0x55, 0x0f, 0xf2, 0x7a, 0xb2, 0xff, 0xee, 0xd5, - 0x38, 0x99, 0xcc, 0xb3, 0xfa, 0x69, 0x2c, 0x31, 0x29, 0x27, 0x74, 0x2a, 0x67, 0x0a, 0x0d, 0x3f, 0x38, 0x0d, 0x93, - 0x81, 0x9d, 0x18, 0xde, 0x05, 0x80, 0x92, 0xd8, 0x35, 0x3d, 0xc9, 0x6f, 0x79, 0xea, 0x64, 0x9e, 0xb8, 0x58, 0xba, - 0x9c, 0x01, 0xbb, 0x86, 0xf1, 0x3a, 0xc3, 0x50, 0xbb, 0x30, 0x00, 0x92, 0xab, 0x0a, 0x86, 0xee, 0x04, 0x2c, 0x5d, - 0x90, 0x89, 0xb9, 0xaa, 0xf8, 0xb3, 0x7a, 0x19, 0x23, 0x7a, 0x01, 0x79, 0x21, 0x7e, 0x47, 0x41, 0x15, 0x3c, 0x26, - 0x6c, 0x1a, 0x9e, 0x51, 0xc4, 0xa9, 0xd7, 0x3c, 0x54, 0xe8, 0x34, 0x60, 0x06, 0x8f, 0xf6, 0x33, 0xd4, 0x82, 0xc6, - 0xc9, 0x42, 0xf8, 0xcd, 0xd2, 0x34, 0x27, 0xcf, 0xb6, 0x61, 0x7e, 0xfe, 0x6c, 0x9b, 0xe6, 0xa3, 0x67, 0x5b, 0x17, - 0x28, 0xb9, 0x5c, 0x85, 0x89, 0x16, 0x8e, 0x3a, 0xc5, 0xf4, 0x60, 0x53, 0xd1, 0x72, 0x05, 0x35, 0xf5, 0x23, 0xa6, - 0x8f, 0x8f, 0x13, 0x7f, 0xe5, 0x26, 0x0f, 0x54, 0x7d, 0x6f, 0xc8, 0x3a, 0x7e, 0x5d, 0x55, 0x28, 0x5e, 0xa7, 0xf3, - 0xa5, 0x28, 0x5e, 0x55, 0xbe, 0x15, 0x65, 0x84, 0x4d, 0x4e, 0xe8, 0x30, 0xe1, 0x5b, 0xb7, 0xea, 0x4b, 0x62, 0xcd, - 0x48, 0xe6, 0xfa, 0x01, 0x6d, 0x32, 0xe4, 0xc9, 0xe9, 0x6b, 0xb3, 0x49, 0xcb, 0xb3, 0x09, 0xcb, 0xdb, 0x05, 0x27, - 0x43, 0x31, 0x3e, 0x1d, 0x37, 0xce, 0x0c, 0x93, 0x56, 0x35, 0x2f, 0x20, 0x7d, 0xf7, 0x5f, 0x85, 0x3e, 0x01, 0xe8, - 0x87, 0x00, 0x7d, 0x12, 0x7a, 0xd1, 0x8c, 0xfc, 0xed, 0xfd, 0x85, 0xc8, 0x92, 0x05, 0x02, 0x9f, 0x09, 0xdb, 0x87, - 0x29, 0x92, 0x0b, 0x09, 0x92, 0x0a, 0x34, 0x9f, 0x95, 0x22, 0x76, 0x4c, 0x92, 0xab, 0xca, 0x39, 0x1d, 0x3b, 0x99, - 0xd1, 0x51, 0x8f, 0x22, 0x6c, 0x95, 0xe4, 0x67, 0x47, 0xb4, 0x36, 0xbd, 0xdc, 0x68, 0x25, 0x00, 0x43, 0x02, 0x33, - 0x2c, 0xa0, 0x00, 0x09, 0x3d, 0x47, 0x4e, 0xc1, 0x3f, 0x58, 0x2b, 0x14, 0xab, 0x3b, 0xe7, 0x65, 0xca, 0x04, 0x5b, - 0xa9, 0xe3, 0x33, 0x4c, 0xd1, 0x05, 0xd7, 0x33, 0x04, 0xf5, 0x38, 0x3b, 0xa2, 0x8f, 0x4a, 0xe5, 0x00, 0x14, 0x9d, - 0x70, 0x4e, 0x6e, 0xc0, 0x3a, 0x78, 0xd4, 0xc9, 0x80, 0x8c, 0xf0, 0x50, 0xea, 0xe6, 0xaa, 0xb2, 0x62, 0x94, 0x10, - 0x8b, 0x1e, 0x04, 0xa1, 0x05, 0x6c, 0x38, 0xaa, 0xaa, 0xb2, 0x72, 0x37, 0x38, 0x73, 0xfe, 0xc6, 0xdd, 0x68, 0x0e, - 0x7b, 0x55, 0x1c, 0xad, 0xb4, 0x7c, 0xb4, 0x3c, 0xb6, 0xb8, 0xe0, 0x37, 0x20, 0x18, 0xe9, 0x25, 0xea, 0x63, 0x1b, - 0x16, 0x77, 0xc9, 0x17, 0x77, 0xd6, 0xb2, 0xb8, 0xb3, 0x1d, 0x8b, 0x1b, 0xb0, 0x85, 0x54, 0x04, 0xe8, 0x12, 0xf4, - 0x05, 0x13, 0xc0, 0x63, 0x74, 0xc5, 0x80, 0x9d, 0x33, 0x84, 0x93, 0x99, 0x06, 0x60, 0x0b, 0xd5, 0x02, 0xab, 0x26, - 0xb8, 0x48, 0x80, 0xa8, 0x4f, 0x5c, 0x9c, 0x3a, 0x3e, 0x6f, 0x48, 0xb9, 0xa9, 0x05, 0xd5, 0xf9, 0xc2, 0x2e, 0xa5, - 0xe9, 0xc4, 0xb5, 0x65, 0xcb, 0x4c, 0x97, 0x3b, 0x66, 0xea, 0x95, 0x8e, 0x2e, 0x9b, 0x36, 0x3d, 0x84, 0xf2, 0xa4, - 0x60, 0x0f, 0x82, 0x7d, 0x28, 0x6e, 0x99, 0xf2, 0x3e, 0x6c, 0x47, 0xa9, 0xd2, 0x8e, 0x8a, 0xdd, 0x34, 0xbd, 0x8f, - 0x12, 0x50, 0xb0, 0x40, 0x37, 0x8f, 0xdb, 0x52, 0x2b, 0x3f, 0x64, 0xb1, 0x5b, 0x5a, 0x37, 0x53, 0xf1, 0x5e, 0xde, - 0x52, 0x9d, 0x5e, 0x8f, 0xd6, 0x88, 0xdd, 0x2c, 0x23, 0x09, 0x02, 0xdd, 0x85, 0x20, 0xdf, 0xff, 0x4f, 0xb6, 0x59, - 0x03, 0x0e, 0x09, 0xf4, 0x02, 0xab, 0x23, 0x86, 0x8e, 0x81, 0x94, 0x4a, 0xf8, 0xbd, 0x2b, 0xc5, 0x81, 0x4b, 0x04, - 0xe0, 0x7f, 0xc2, 0xe3, 0xaa, 0x25, 0x92, 0xa7, 0x92, 0x73, 0xa2, 0x5b, 0xb1, 0x3b, 0xfb, 0x00, 0x7a, 0x3c, 0xad, - 0x63, 0x80, 0x4d, 0xae, 0x1c, 0xf5, 0x2d, 0xa1, 0xb4, 0x9d, 0x57, 0x20, 0x49, 0xc4, 0x92, 0xcc, 0xe2, 0x09, 0x9c, - 0x25, 0x5d, 0x73, 0x7e, 0xb3, 0xed, 0xe4, 0x47, 0x0b, 0x5f, 0xaf, 0x61, 0x4d, 0x40, 0x6d, 0xc1, 0x68, 0x2c, 0x58, - 0xac, 0xc0, 0x70, 0x4e, 0x74, 0x10, 0xf4, 0x5e, 0x43, 0xfa, 0x52, 0x9b, 0xf3, 0xaf, 0x93, 0x04, 0x2e, 0xa9, 0x6b, - 0xfb, 0x26, 0x7f, 0xbe, 0xc0, 0x5f, 0xce, 0x4d, 0xfe, 0x7c, 0x8a, 0xbf, 0x3a, 0x37, 0x98, 0xa8, 0xae, 0x81, 0x6f, - 0x97, 0xe6, 0xac, 0x8e, 0x4b, 0xfb, 0x89, 0x9a, 0x9b, 0x3d, 0x62, 0xdb, 0xb0, 0x05, 0x7e, 0xfa, 0x6c, 0x9b, 0x82, - 0x83, 0xa5, 0x3c, 0x87, 0xd0, 0x4a, 0xf4, 0xbc, 0xb1, 0x7c, 0xd1, 0x52, 0x3e, 0xd5, 0xff, 0xcb, 0xf7, 0x3c, 0xee, - 0x92, 0xa8, 0xb8, 0x53, 0xca, 0x52, 0x87, 0xdb, 0xa9, 0x1f, 0xba, 0xc9, 0xc3, 0x2d, 0xe5, 0x26, 0x34, 0x4e, 0xaa, - 0x0b, 0x69, 0x0a, 0xa5, 0x26, 0xcb, 0xda, 0xad, 0x4c, 0x92, 0xe7, 0x3e, 0xb0, 0x8b, 0x7e, 0xf4, 0xf7, 0x44, 0xa2, - 0xd2, 0x4a, 0xfc, 0x26, 0x5b, 0x90, 0xd2, 0x87, 0x6e, 0x9f, 0x6d, 0x35, 0x52, 0xef, 0xa6, 0x32, 0xdb, 0x0a, 0x19, - 0x08, 0xcb, 0x83, 0xbc, 0xeb, 0x6a, 0xe6, 0x0f, 0x50, 0x7d, 0x35, 0x8d, 0x36, 0xe6, 0xb3, 0x6d, 0x76, 0xae, 0xae, - 0xdc, 0xe4, 0x13, 0x99, 0x99, 0x9e, 0x9f, 0x78, 0x01, 0x51, 0x07, 0xea, 0x34, 0x70, 0xc3, 0x4f, 0xec, 0xd1, 0x8c, - 0xd6, 0x19, 0x2a, 0xa4, 0xf7, 0xb2, 0xba, 0x1c, 0x26, 0x54, 0x42, 0x87, 0xb4, 0x69, 0x03, 0x14, 0x94, 0xd7, 0x42, - 0xbe, 0x55, 0xd0, 0x85, 0x45, 0x2d, 0x03, 0xec, 0x29, 0x41, 0x47, 0x0e, 0x0e, 0xaa, 0x86, 0x8a, 0xeb, 0xa5, 0x1a, - 0xf2, 0x54, 0xa9, 0x6c, 0x52, 0x64, 0x58, 0xbc, 0xc5, 0x1e, 0x7e, 0xff, 0xe7, 0x68, 0xee, 0xeb, 0xc3, 0x3f, 0xc7, - 0x68, 0xbc, 0xf6, 0x0f, 0xca, 0x8d, 0xdd, 0x34, 0x5d, 0xaf, 0xc8, 0x8c, 0xea, 0xe2, 0xce, 0x8b, 0xa1, 0x94, 0x69, - 0x79, 0x79, 0x38, 0xbf, 0xae, 0x3b, 0xfd, 0xe3, 0xd7, 0x60, 0x23, 0x00, 0x34, 0x5d, 0x34, 0x9f, 0xab, 0x05, 0x57, - 0xbd, 0xa7, 0x99, 0x73, 0xfc, 0xeb, 0xfa, 0x87, 0xb7, 0xf6, 0x0f, 0xa2, 0x71, 0xa8, 0xea, 0xf9, 0x84, 0x2b, 0x3c, - 0x19, 0x69, 0x2a, 0x8d, 0x97, 0xcf, 0x68, 0xee, 0x86, 0xed, 0xd3, 0xb9, 0x2e, 0xed, 0xb2, 0x98, 0x90, 0x19, 0xd8, - 0xc2, 0x1a, 0xb5, 0xd2, 0xdb, 0x80, 0xdc, 0x11, 0xa1, 0x4c, 0xad, 0x7f, 0xac, 0xa1, 0x05, 0x46, 0x7b, 0x63, 0x4a, - 0x5a, 0x46, 0x58, 0x49, 0x53, 0x9a, 0xe0, 0x1c, 0xd8, 0xcc, 0xe5, 0x5d, 0x5e, 0xd9, 0xd5, 0x13, 0x43, 0x95, 0x06, - 0xd0, 0x3a, 0xb2, 0xf3, 0x96, 0xf2, 0x01, 0xa6, 0x7a, 0x6e, 0x1e, 0x9b, 0xe1, 0xe8, 0x03, 0x88, 0x8e, 0xcd, 0xe0, - 0x14, 0xc0, 0xe6, 0xd7, 0x0a, 0x01, 0x44, 0x1b, 0xc4, 0x9a, 0xc4, 0x52, 0x2a, 0x95, 0x77, 0x70, 0xfb, 0x42, 0x34, - 0xb4, 0xe5, 0x92, 0x9f, 0xc6, 0xb5, 0x51, 0xca, 0x33, 0x9f, 0x62, 0x0a, 0xd5, 0x90, 0xa4, 0x69, 0x2b, 0xc0, 0xc4, - 0xa2, 0x1b, 0x6a, 0x51, 0xbb, 0x0c, 0x8f, 0xa2, 0xdc, 0xb0, 0x0d, 0xb8, 0x95, 0x71, 0x82, 0xd5, 0x6f, 0x21, 0x86, - 0xbf, 0x5d, 0x31, 0x0b, 0x91, 0x64, 0x31, 0x55, 0x99, 0xf6, 0xbe, 0xed, 0xfd, 0xbd, 0xca, 0x06, 0x55, 0xba, 0x29, - 0x1b, 0x87, 0xa6, 0x95, 0xb0, 0x5f, 0x4d, 0x40, 0x83, 0x1d, 0xf0, 0x31, 0x55, 0x50, 0x1c, 0x99, 0xcf, 0x89, 0x97, - 0xa5, 0x3a, 0x17, 0xd7, 0x88, 0x78, 0xad, 0xe0, 0xa7, 0xf3, 0x64, 0xa4, 0xfe, 0x04, 0x5e, 0xeb, 0x3c, 0xac, 0x11, - 0x1b, 0x10, 0x67, 0x5b, 0x9a, 0xc1, 0x44, 0x7b, 0x2c, 0x83, 0x88, 0x7d, 0x05, 0xd2, 0x71, 0x37, 0x94, 0xe3, 0xd0, - 0xd8, 0x15, 0x50, 0xec, 0x8b, 0x48, 0xd8, 0x91, 0xec, 0x46, 0x40, 0xbb, 0x8e, 0xef, 0xd6, 0xf9, 0xa1, 0xe7, 0xd8, - 0xb9, 0x6a, 0x80, 0xb7, 0xd4, 0xa7, 0x43, 0x0f, 0x3d, 0xb6, 0xea, 0x42, 0xab, 0x75, 0xf8, 0x98, 0x76, 0x1d, 0xe7, - 0x95, 0xa3, 0x1a, 0xd4, 0x48, 0x4d, 0xc2, 0x6d, 0x5e, 0x74, 0x47, 0x92, 0x2f, 0x9e, 0x4a, 0xb9, 0xf3, 0xc3, 0xc6, - 0x73, 0xe2, 0xd8, 0x80, 0x84, 0xb3, 0x28, 0x7e, 0xc4, 0x14, 0xba, 0xaa, 0xa1, 0x7a, 0x41, 0x94, 0x12, 0x79, 0x0e, - 0x54, 0xec, 0xf0, 0x85, 0x93, 0xf8, 0xf9, 0xfd, 0xdb, 0x0f, 0x1f, 0x54, 0x03, 0x73, 0x6f, 0xa6, 0x72, 0xef, 0x6c, - 0x43, 0xed, 0xc1, 0xfe, 0x8d, 0xfb, 0x8e, 0xde, 0x30, 0x94, 0xaf, 0x2c, 0xef, 0x39, 0x5a, 0x56, 0xdb, 0x72, 0xec, - 0xe6, 0x61, 0x5f, 0xa6, 0xcc, 0xe0, 0x41, 0xf3, 0x6a, 0xc0, 0x0d, 0xbb, 0xaf, 0xb7, 0x52, 0xc9, 0xca, 0x0f, 0x6f, - 0x1b, 0x4a, 0xdd, 0x4d, 0x43, 0x29, 0x70, 0x53, 0x35, 0x5c, 0xb5, 0x8e, 0x56, 0xd2, 0xed, 0x0c, 0xa9, 0x93, 0xf7, - 0x81, 0x4b, 0x62, 0x69, 0xbe, 0x60, 0xd0, 0x2c, 0x76, 0x7a, 0x75, 0xd4, 0x0d, 0xc5, 0x8c, 0x0f, 0x11, 0xb0, 0xf5, - 0x02, 0x30, 0xb1, 0x23, 0xb2, 0x1e, 0xac, 0x4c, 0xb9, 0x09, 0x03, 0x59, 0xa9, 0x13, 0x4a, 0x61, 0xde, 0x66, 0x64, - 0x15, 0x93, 0xc4, 0xcd, 0xd6, 0x09, 0xb9, 0x0d, 0xa2, 0xfb, 0x27, 0x85, 0x01, 0xfb, 0x9e, 0xca, 0x4b, 0x7f, 0xb1, - 0x14, 0xb5, 0xcf, 0x35, 0x32, 0x12, 0x0b, 0xb8, 0xf3, 0x03, 0xf9, 0x7f, 0xfe, 0x6d, 0x59, 0xff, 0xf9, 0xf7, 0xde, - 0xaa, 0xd0, 0x7d, 0x3e, 0x31, 0xb2, 0xd1, 0x01, 0xfb, 0xa2, 0xf9, 0x4b, 0x65, 0x98, 0x37, 0xd7, 0xa9, 0x2d, 0x02, - 0xbc, 0xaf, 0x2d, 0x41, 0xad, 0xb0, 0xbc, 0x6f, 0x1e, 0x35, 0x30, 0x98, 0xd7, 0xde, 0x91, 0x41, 0xa5, 0x2f, 0x1a, - 0xda, 0x44, 0x1f, 0x1c, 0xb4, 0x22, 0xbf, 0x1f, 0xc2, 0xfb, 0xe6, 0xf0, 0x85, 0xc3, 0x67, 0xa2, 0xc1, 0xd7, 0x93, - 0x89, 0xc8, 0xe6, 0x26, 0x37, 0x05, 0xa3, 0xfa, 0xf3, 0x5a, 0x09, 0xbb, 0x3c, 0x07, 0xb6, 0x4e, 0xbd, 0xdd, 0x47, - 0xaf, 0x27, 0x68, 0xfe, 0x75, 0x36, 0x4d, 0x0a, 0x62, 0xa5, 0x15, 0xb5, 0x51, 0xf3, 0xed, 0x5a, 0xa7, 0x35, 0xbc, - 0x06, 0xa5, 0x98, 0xe2, 0x2b, 0x9f, 0xe8, 0xc6, 0xeb, 0x09, 0x93, 0xed, 0x30, 0x8b, 0xd3, 0x41, 0x75, 0x6b, 0x33, - 0xc9, 0x68, 0x09, 0xe8, 0x86, 0x42, 0x35, 0x2e, 0x58, 0x99, 0x14, 0xa2, 0x34, 0x14, 0xa9, 0x03, 0x53, 0x3f, 0xc9, - 0x31, 0xc3, 0xc8, 0xbb, 0x36, 0xab, 0xac, 0x9f, 0xf7, 0x5b, 0x65, 0x5d, 0x1d, 0x64, 0x95, 0xf5, 0xf3, 0x57, 0xb7, - 0xca, 0x7a, 0x27, 0x5b, 0x65, 0xc1, 0x22, 0xbe, 0x25, 0x07, 0x99, 0x4a, 0x71, 0x3b, 0x89, 0xe8, 0x3e, 0x1d, 0x39, - 0x8c, 0xa4, 0x4d, 0xbd, 0x25, 0x01, 0x36, 0x9d, 0xad, 0x4a, 0x10, 0x2d, 0xc0, 0x6c, 0xea, 0x8f, 0x37, 0x70, 0x0a, - 0xa2, 0x85, 0x6c, 0xde, 0x14, 0xb2, 0x18, 0xab, 0x45, 0xdc, 0x24, 0x6a, 0x52, 0x64, 0x1b, 0x3c, 0xca, 0x92, 0x79, - 0xac, 0x4b, 0x79, 0xa4, 0x85, 0xbd, 0x58, 0x87, 0x1b, 0x1d, 0x0d, 0xd0, 0x5e, 0x49, 0x34, 0xec, 0xbc, 0xe4, 0xd1, - 0x24, 0xe4, 0x1e, 0x84, 0x5d, 0x2e, 0x8d, 0xcc, 0xb0, 0x55, 0x7f, 0xdd, 0x38, 0xdf, 0x5f, 0x3b, 0xc3, 0xae, 0x03, - 0xee, 0xd0, 0xc0, 0xe4, 0x61, 0x81, 0x3d, 0xec, 0x76, 0xa1, 0xe0, 0x5e, 0x2a, 0xe8, 0x40, 0x81, 0x2f, 0x15, 0xf4, - 0xa0, 0xc0, 0x93, 0x0a, 0x4e, 0xa0, 0x60, 0x26, 0x15, 0xf4, 0xa1, 0xe0, 0x4e, 0xcd, 0xaf, 0x43, 0x31, 0xdc, 0xbe, - 0x7e, 0x63, 0x50, 0xa6, 0x82, 0x97, 0xf5, 0x0d, 0x07, 0xec, 0x94, 0xdc, 0xc5, 0x20, 0x32, 0xa8, 0x80, 0x6f, 0x90, - 0x18, 0xf7, 0x4b, 0x42, 0x43, 0x33, 0xbf, 0xc1, 0x3b, 0xc7, 0xca, 0x22, 0xb0, 0x54, 0xe6, 0x21, 0x0f, 0x38, 0x1c, - 0x14, 0x55, 0x07, 0x99, 0xcd, 0x50, 0xac, 0x1c, 0x0f, 0x1b, 0x21, 0xad, 0x65, 0xf1, 0x8e, 0x7e, 0xce, 0x14, 0x5b, - 0xa0, 0xb0, 0xf1, 0xd0, 0x64, 0xc1, 0xe0, 0xd7, 0xd0, 0xf4, 0xbf, 0x21, 0xd3, 0xf5, 0x42, 0xb9, 0x8c, 0x16, 0x7b, - 0x95, 0xf6, 0xf2, 0x2b, 0x18, 0xa5, 0x4a, 0x35, 0x20, 0x26, 0xdf, 0x96, 0xec, 0x5b, 0xf4, 0x31, 0x2f, 0xd7, 0xcf, - 0x60, 0x6c, 0x4a, 0x46, 0x4d, 0x46, 0xe0, 0x3b, 0x00, 0x23, 0x49, 0x6b, 0x7e, 0x09, 0x70, 0x96, 0x9e, 0xaf, 0x5c, - 0x69, 0x3c, 0xe3, 0x1f, 0x49, 0x9a, 0xba, 0x0b, 0x5e, 0xbf, 0x3e, 0x4e, 0x30, 0x93, 0x11, 0xfc, 0x17, 0x02, 0x10, - 0x84, 0x69, 0x7e, 0xcd, 0x1a, 0x22, 0x89, 0xee, 0x15, 0xb0, 0xb7, 0x81, 0x0d, 0x55, 0x58, 0x06, 0xf8, 0x16, 0x2c, - 0x61, 0x59, 0x87, 0x0f, 0x87, 0xff, 0x8e, 0x04, 0xd5, 0xc2, 0xcc, 0x5d, 0x54, 0x8b, 0xe8, 0x3e, 0xc8, 0xe5, 0xb1, - 0x09, 0x15, 0x7a, 0xa9, 0xf0, 0x4b, 0x74, 0xc2, 0x41, 0xb4, 0xf8, 0x43, 0x15, 0xc2, 0x3b, 0x14, 0xf9, 0x1f, 0x42, - 0xc3, 0xcf, 0x26, 0x16, 0xc2, 0x58, 0xb1, 0x00, 0x84, 0x83, 0x30, 0x5b, 0x9a, 0xe8, 0xcc, 0xa5, 0x75, 0x42, 0xdd, - 0xb0, 0x70, 0x6d, 0xb7, 0x55, 0x17, 0xd6, 0x41, 0xb2, 0x98, 0xba, 0x9a, 0xd3, 0xe9, 0x1b, 0xfc, 0xcf, 0xb2, 0x7b, - 0x7a, 0x8e, 0x3d, 0x28, 0x33, 0xff, 0x6e, 0x3b, 0x8f, 0xc2, 0xcc, 0x9c, 0xbb, 0x2b, 0x3f, 0x78, 0x18, 0xac, 0xa2, - 0x30, 0x4a, 0x63, 0xd7, 0x23, 0xc3, 0x82, 0xa1, 0x1e, 0x62, 0x70, 0x04, 0xe6, 0x9f, 0xe7, 0x58, 0x9d, 0x84, 0xac, - 0x68, 0x6b, 0x11, 0xfb, 0x60, 0x1e, 0x90, 0x4d, 0xce, 0x3e, 0x5f, 0xaa, 0x4c, 0xab, 0xe2, 0x96, 0xa3, 0x2d, 0x80, - 0x22, 0x65, 0x81, 0x15, 0x20, 0x9c, 0xd0, 0x30, 0x76, 0x67, 0x18, 0x0b, 0xd0, 0xea, 0xf4, 0x12, 0xb2, 0x52, 0xac, - 0x5e, 0x6b, 0xe7, 0x49, 0x74, 0x3f, 0x86, 0xd1, 0x62, 0x63, 0x33, 0x25, 0xc1, 0x1c, 0xdf, 0x98, 0xe8, 0xcb, 0xc1, - 0xfb, 0x31, 0x91, 0x11, 0x87, 0xde, 0xc8, 0x6a, 0x08, 0xaf, 0x07, 0x1d, 0xc5, 0x1e, 0xae, 0xfc, 0xd0, 0xa4, 0xd3, - 0xe9, 0xdb, 0xb1, 0xd4, 0x97, 0x0c, 0x3f, 0x7d, 0x8b, 0xd5, 0x1d, 0xc5, 0x1e, 0x02, 0xb3, 0x36, 0x0f, 0xa2, 0xfb, - 0xc1, 0xd2, 0x9f, 0xcd, 0x48, 0x38, 0xc4, 0x31, 0x8b, 0x42, 0x12, 0x04, 0x7e, 0x9c, 0xfa, 0xe9, 0x70, 0xe5, 0x6e, - 0x58, 0xaf, 0xc7, 0x6d, 0xbd, 0x76, 0x59, 0xaf, 0xdd, 0x83, 0x7b, 0x95, 0xba, 0x01, 0xbf, 0x11, 0xda, 0x0f, 0x1b, - 0x5a, 0x4f, 0xb1, 0x2b, 0xf3, 0x3c, 0xb8, 0xd7, 0x38, 0x21, 0xdb, 0x95, 0x9b, 0x2c, 0xfc, 0x70, 0x60, 0xe7, 0xd6, - 0xdd, 0x96, 0x6e, 0x8c, 0xa7, 0xa7, 0xa7, 0xa7, 0xb9, 0x35, 0xe3, 0x4f, 0xf6, 0x6c, 0x96, 0x5b, 0x1e, 0x7f, 0x9a, - 0xcf, 0x6d, 0x7b, 0x3e, 0xcf, 0x2d, 0x9f, 0x17, 0x74, 0x3b, 0xde, 0xac, 0xdb, 0xc9, 0xad, 0x7b, 0xa9, 0x46, 0x6e, - 0x11, 0xf6, 0x94, 0x90, 0xd9, 0x10, 0x37, 0x12, 0x35, 0xe4, 0x1c, 0xf4, 0x6d, 0x3b, 0x47, 0x0c, 0x70, 0x5d, 0xc2, - 0x4d, 0x28, 0xeb, 0xb9, 0xd9, 0x1e, 0x5c, 0x53, 0x29, 0x3e, 0xe7, 0x79, 0x8d, 0xf5, 0x66, 0x6e, 0xf2, 0xe9, 0x46, - 0x91, 0x66, 0xe1, 0xba, 0xb4, 0xda, 0x96, 0x83, 0xc1, 0xdc, 0x0c, 0x20, 0x48, 0xd6, 0x70, 0x1a, 0x25, 0x70, 0x66, - 0x13, 0x77, 0xe6, 0xaf, 0xd3, 0x81, 0xd3, 0x89, 0x37, 0xbc, 0x88, 0xed, 0xf5, 0xa2, 0x00, 0xcf, 0xde, 0x20, 0x8d, - 0x02, 0x7f, 0xc6, 0x8b, 0xda, 0xce, 0x92, 0xd3, 0xd1, 0x87, 0xe8, 0x22, 0xee, 0x63, 0xa0, 0x03, 0x37, 0x08, 0x14, - 0xab, 0x9b, 0x2a, 0xc4, 0x4d, 0x51, 0xc4, 0xab, 0xd8, 0x29, 0x85, 0x0b, 0xba, 0x83, 0x3b, 0xc7, 0xf1, 0x46, 0xec, - 0x79, 0xe7, 0x24, 0xde, 0xe4, 0xdf, 0xae, 0xc8, 0xcc, 0x77, 0x15, 0xad, 0xd8, 0x4d, 0x8e, 0x0d, 0x62, 0x60, 0x7d, - 0xdb, 0xb2, 0x4d, 0xf9, 0xb1, 0x80, 0x60, 0x82, 0x4f, 0xfc, 0x55, 0x1c, 0x25, 0x99, 0x1b, 0x66, 0x79, 0x3e, 0xb9, - 0xc9, 0xf3, 0xe1, 0x95, 0xaf, 0x5d, 0xff, 0x43, 0xa3, 0xf7, 0x34, 0x55, 0x9b, 0xe4, 0xfa, 0x8d, 0xf1, 0x96, 0xc8, - 0x56, 0x1a, 0x70, 0x8d, 0xa1, 0x85, 0x86, 0x5c, 0x99, 0xde, 0x92, 0xf5, 0xca, 0x14, 0xc8, 0xa2, 0x3a, 0xb5, 0xfa, - 0x28, 0x57, 0xc1, 0x1b, 0x08, 0x2a, 0xbc, 0x25, 0xa3, 0x2b, 0xc9, 0xe2, 0x03, 0x88, 0x15, 0xac, 0x4c, 0x2d, 0xf9, - 0x9f, 0xb5, 0xd1, 0x8c, 0xdf, 0xed, 0xa7, 0x19, 0x7f, 0xc9, 0x0e, 0xa1, 0x19, 0xbf, 0xfb, 0xea, 0x34, 0xe3, 0xb3, - 0xba, 0x25, 0xff, 0x45, 0x34, 0x52, 0x85, 0x90, 0x1f, 0xae, 0xa6, 0x84, 0xc6, 0xc8, 0xb9, 0xf8, 0xdd, 0x86, 0xf7, - 0xbc, 0x37, 0x9a, 0xf5, 0x8d, 0xde, 0xdc, 0x20, 0x8f, 0x7d, 0x17, 0x8e, 0xfe, 0x9e, 0xc8, 0xcf, 0xf3, 0xf9, 0xe8, - 0x4d, 0x24, 0x15, 0x88, 0x27, 0x66, 0xff, 0x50, 0x8a, 0x67, 0x40, 0xdf, 0x70, 0xbb, 0x47, 0xcc, 0xf8, 0x00, 0xee, - 0xd0, 0xd4, 0xce, 0x77, 0x26, 0xec, 0xbd, 0x86, 0xe5, 0x21, 0x68, 0xc2, 0xc8, 0x92, 0x3b, 0xbd, 0xd4, 0x44, 0x89, - 0x0b, 0x92, 0x31, 0x2f, 0xd5, 0xef, 0x1f, 0x2e, 0x66, 0xda, 0x45, 0xa4, 0xe7, 0x7e, 0xfa, 0xae, 0xea, 0x72, 0xc2, - 0xd4, 0x2f, 0x23, 0x79, 0x3a, 0x39, 0xb3, 0xd9, 0x92, 0x53, 0x3a, 0xc3, 0x6b, 0xda, 0xfc, 0xbc, 0x34, 0xd3, 0x81, - 0xdc, 0x90, 0xa5, 0x96, 0xaa, 0x5d, 0xc6, 0xcc, 0xde, 0x7f, 0xcb, 0x28, 0x40, 0xcc, 0x96, 0x85, 0x9e, 0xba, 0x33, - 0xda, 0xdc, 0x9f, 0xe5, 0xb9, 0x3e, 0xe4, 0x80, 0x90, 0x2e, 0x5a, 0xb2, 0x8f, 0x88, 0x4b, 0xef, 0x85, 0x59, 0x01, - 0x53, 0xd2, 0x51, 0x0d, 0xdc, 0x05, 0xe8, 0xb4, 0x99, 0xbe, 0x8e, 0xc1, 0x4c, 0x55, 0x28, 0xf8, 0xa8, 0xad, 0x83, - 0x34, 0x21, 0x50, 0xc2, 0x0a, 0xf8, 0xf3, 0x57, 0xbc, 0xa0, 0x6e, 0x35, 0x49, 0x81, 0x83, 0x4a, 0x79, 0xf0, 0xab, - 0xe7, 0x72, 0x6d, 0x8a, 0x76, 0x58, 0x1d, 0x7c, 0xc8, 0x55, 0x41, 0xfb, 0xe1, 0xf6, 0x1b, 0x9f, 0x1d, 0x41, 0x83, - 0x71, 0x45, 0x77, 0xbf, 0xc7, 0x26, 0x10, 0x48, 0x89, 0xf4, 0xde, 0xb0, 0xd2, 0x7b, 0xe5, 0xc5, 0x96, 0xc7, 0xa4, - 0xc8, 0xdc, 0xd8, 0x04, 0x16, 0x1f, 0x71, 0x2f, 0xc3, 0x78, 0x52, 0xf8, 0x8b, 0xe1, 0x3a, 0x05, 0xdc, 0x88, 0x8c, - 0x2a, 0xe2, 0x9f, 0xa1, 0xb7, 0x4e, 0xd2, 0x28, 0x19, 0xc4, 0x91, 0x1f, 0x66, 0x24, 0xc9, 0x11, 0x54, 0xd7, 0x08, - 0x1f, 0x0e, 0x9e, 0x9b, 0x6d, 0x14, 0xbb, 0x9e, 0x9f, 0x3d, 0x0c, 0x6c, 0x46, 0x52, 0xd8, 0x43, 0x46, 0x1d, 0xd8, - 0x8d, 0xf5, 0x07, 0x0c, 0x9a, 0x2f, 0x91, 0xf0, 0x4b, 0xea, 0xe4, 0x8c, 0xbc, 0xcd, 0x87, 0xd2, 0x5b, 0x1a, 0x95, - 0x03, 0xc8, 0x0f, 0x37, 0x31, 0x17, 0x80, 0xe5, 0x61, 0xa9, 0xed, 0x19, 0x59, 0x18, 0x88, 0xb5, 0x41, 0x2e, 0xcf, - 0xff, 0xac, 0x9e, 0xae, 0xd8, 0xcd, 0xc5, 0x40, 0xf1, 0xe8, 0x87, 0x8c, 0x6c, 0xe0, 0x42, 0x0e, 0x2b, 0xe3, 0x90, - 0x9a, 0x53, 0x32, 0x8f, 0x12, 0x42, 0x23, 0xb8, 0x3a, 0xa7, 0xf1, 0xe6, 0xf0, 0xee, 0x77, 0x4f, 0xbf, 0xb9, 0x9f, - 0x30, 0xca, 0x34, 0xde, 0x99, 0xbe, 0xa7, 0xb7, 0xfa, 0x7d, 0x06, 0xa4, 0x21, 0x85, 0xbc, 0x47, 0x83, 0x65, 0x0d, - 0x54, 0x75, 0xd8, 0x18, 0x28, 0x2b, 0x8e, 0xd8, 0x9d, 0x97, 0x90, 0xc0, 0xcd, 0xfc, 0x3b, 0x4e, 0x33, 0x76, 0x4f, - 0xe2, 0x0d, 0x5f, 0x63, 0xbc, 0xf0, 0x1e, 0xb1, 0x48, 0x95, 0xa1, 0xf0, 0x45, 0xaa, 0x16, 0xe3, 0x22, 0x0d, 0x6b, - 0xb3, 0xe1, 0xb1, 0x23, 0x2a, 0x37, 0x7d, 0x2f, 0xde, 0xc8, 0x57, 0x74, 0xd1, 0x4c, 0xdc, 0xd4, 0xd5, 0xa0, 0x5f, - 0x2b, 0x7f, 0x36, 0x0b, 0x48, 0x5e, 0x5a, 0xe8, 0xf2, 0x5a, 0x4a, 0xc0, 0x11, 0x70, 0x70, 0xa7, 0x69, 0x14, 0xac, - 0x33, 0xd2, 0x0c, 0x2e, 0x0a, 0x9c, 0x8e, 0x5d, 0x00, 0x07, 0x7f, 0x97, 0xc7, 0xda, 0x03, 0x72, 0x1b, 0xb6, 0x89, - 0x3d, 0x84, 0x18, 0xbf, 0x66, 0xb7, 0x3c, 0x74, 0x78, 0x25, 0x06, 0x6d, 0x34, 0x4c, 0xc4, 0x80, 0x6b, 0x89, 0x62, - 0x6f, 0xc5, 0x72, 0x58, 0x99, 0x88, 0x73, 0x2a, 0x8a, 0xf2, 0xf2, 0x64, 0xfe, 0x98, 0x33, 0xf6, 0xaa, 0xf9, 0x8c, - 0xbd, 0xe2, 0x67, 0x6c, 0xf7, 0xce, 0x7c, 0x3a, 0x77, 0xe0, 0xbf, 0x61, 0x31, 0xa1, 0x81, 0xad, 0x74, 0xe3, 0x8d, - 0xe2, 0xc4, 0x1b, 0xc5, 0xec, 0xc4, 0x1b, 0x05, 0xbb, 0x46, 0x93, 0x0c, 0xc3, 0xea, 0xe8, 0x86, 0xad, 0x40, 0x21, - 0xfc, 0xd9, 0xa5, 0x57, 0xce, 0x31, 0xbc, 0x83, 0x56, 0xbd, 0xfa, 0xbb, 0xce, 0xee, 0xa3, 0x4e, 0xcf, 0x12, 0x47, - 0xda, 0xba, 0x95, 0xb9, 0xd3, 0x29, 0x99, 0x0d, 0xe6, 0x91, 0xb7, 0x4e, 0xff, 0xc5, 0xc6, 0xcf, 0x80, 0xb8, 0x13, - 0x11, 0x54, 0xfa, 0xe1, 0x4d, 0x41, 0x51, 0x72, 0x47, 0x78, 0x0f, 0x5b, 0xb1, 0x4e, 0x03, 0x1a, 0x90, 0xb8, 0x63, - 0x1d, 0x37, 0x6c, 0xf2, 0x66, 0x40, 0xff, 0x61, 0xab, 0xd4, 0x8e, 0x62, 0xbe, 0x00, 0x2c, 0x3b, 0xc1, 0xf1, 0x78, - 0x68, 0xb0, 0xd5, 0xb4, 0x4f, 0x9b, 0x87, 0x7b, 0xcd, 0xbf, 0x74, 0xc3, 0x2f, 0x15, 0x76, 0x6f, 0x31, 0x57, 0x90, - 0xdd, 0xbd, 0xb6, 0xed, 0x91, 0x5a, 0xaf, 0x3b, 0x2e, 0x84, 0xa2, 0xee, 0x81, 0x58, 0xfe, 0xe9, 0xab, 0x63, 0xf8, - 0x8f, 0x52, 0xf5, 0xbf, 0x64, 0x4d, 0x84, 0xfa, 0x45, 0xd9, 0xf6, 0x9a, 0x92, 0x4a, 0x48, 0x88, 0x1f, 0x5e, 0x7f, - 0x3e, 0x7f, 0x5c, 0x83, 0x83, 0x6b, 0x53, 0x6b, 0xa6, 0x6a, 0xed, 0xef, 0xa3, 0x08, 0x92, 0x65, 0xd6, 0xab, 0x73, - 0xf0, 0x50, 0xf3, 0xf2, 0x6c, 0x04, 0x8d, 0x38, 0x1f, 0x41, 0xb5, 0xf8, 0x2a, 0xb6, 0xa1, 0xac, 0xc4, 0xdb, 0x36, - 0x56, 0xe2, 0xcd, 0x7e, 0x56, 0xe2, 0xaf, 0x07, 0xb1, 0x12, 0x6f, 0xbe, 0x3a, 0x2b, 0xf1, 0xb6, 0xce, 0x4a, 0x5c, - 0x45, 0xdc, 0x84, 0xd5, 0xb8, 0x58, 0xb3, 0x9f, 0x1f, 0xa9, 0x52, 0xee, 0x32, 0x1a, 0xf5, 0x6c, 0x1a, 0x64, 0xf8, - 0xea, 0x77, 0x33, 0x16, 0xb8, 0x11, 0xdf, 0xa3, 0x45, 0x57, 0xc1, 0x5a, 0x30, 0xcc, 0x8e, 0xdf, 0x91, 0x8a, 0x83, - 0x28, 0x5c, 0xfc, 0x0c, 0x4a, 0x59, 0x10, 0x07, 0x26, 0xd2, 0x0b, 0x3f, 0xfd, 0x39, 0x8a, 0xd7, 0xf1, 0x05, 0xf4, - 0xf5, 0xd1, 0x4f, 0xfd, 0x69, 0x40, 0x84, 0xef, 0x2f, 0xb5, 0x40, 0x63, 0x32, 0x71, 0x30, 0xfa, 0xe4, 0x3f, 0xdd, - 0x0d, 0xff, 0x89, 0x66, 0xa1, 0xec, 0x37, 0x35, 0x6d, 0x53, 0x9b, 0x19, 0x11, 0xae, 0x04, 0x94, 0x06, 0xfd, 0x78, - 0x66, 0xe4, 0x2a, 0xd2, 0x1b, 0x66, 0xc9, 0xed, 0x1d, 0x5a, 0xfb, 0x21, 0x35, 0xa6, 0x66, 0xad, 0x1b, 0x22, 0xe8, - 0x55, 0x5d, 0x0c, 0xbf, 0x8a, 0xd6, 0x29, 0x99, 0x45, 0xf7, 0xa1, 0x6a, 0x84, 0xc2, 0xac, 0x1f, 0x34, 0x9c, 0xa2, - 0x0d, 0xa6, 0x6b, 0xfc, 0x80, 0x84, 0x72, 0x94, 0x68, 0x2a, 0x64, 0x0b, 0x5d, 0xc7, 0x26, 0x55, 0x35, 0x9b, 0x38, - 0x45, 0x55, 0xe4, 0x15, 0x7a, 0xa2, 0x69, 0xd1, 0xe8, 0x71, 0x2d, 0xb9, 0xa9, 0x46, 0x64, 0x31, 0xa9, 0x70, 0xaa, - 0x85, 0x5c, 0xb8, 0xc8, 0x23, 0x4f, 0x34, 0x2c, 0x1c, 0x7b, 0x43, 0x9d, 0x45, 0x8b, 0xb7, 0x10, 0xb7, 0x23, 0x5f, - 0xb3, 0xf5, 0x60, 0x71, 0x18, 0xe8, 0xe3, 0x6b, 0x09, 0x8c, 0xef, 0xee, 0x48, 0x12, 0xb8, 0x0f, 0x9a, 0x9e, 0x47, - 0xe1, 0x8f, 0x00, 0x80, 0x37, 0xd1, 0x7d, 0x28, 0x57, 0xc0, 0xf4, 0x28, 0x0d, 0x7b, 0xa9, 0x31, 0x62, 0x08, 0xb8, - 0x8a, 0x48, 0x23, 0x80, 0xc4, 0xb4, 0x0b, 0xf2, 0x77, 0x83, 0xfe, 0xfb, 0x0f, 0x3d, 0x37, 0x2e, 0x23, 0xf1, 0xa1, - 0xbf, 0xc5, 0x07, 0x7c, 0xe6, 0xf9, 0xf3, 0x27, 0xed, 0xd3, 0x2e, 0x27, 0x44, 0x6f, 0x68, 0xad, 0xb7, 0x9e, 0x02, - 0x18, 0xc5, 0x55, 0xb4, 0xf6, 0x96, 0x68, 0x6b, 0xfa, 0xf5, 0xe6, 0x9b, 0x41, 0x9f, 0x98, 0x17, 0x54, 0x4c, 0xbd, - 0x52, 0x54, 0x40, 0x01, 0xbf, 0xff, 0x16, 0x42, 0x5e, 0xfe, 0x0f, 0xc1, 0x50, 0xdf, 0x35, 0x8c, 0x8b, 0xf7, 0x1f, - 0xb7, 0x79, 0x87, 0x90, 0xbe, 0x92, 0x05, 0x93, 0xe0, 0xca, 0xb5, 0x66, 0x24, 0x93, 0x57, 0x81, 0x26, 0x07, 0x6e, - 0x6b, 0x8b, 0x49, 0xc7, 0xbf, 0x42, 0x2c, 0xca, 0xa6, 0x33, 0x5b, 0x7f, 0x83, 0x30, 0x6c, 0x55, 0x41, 0x32, 0xcc, - 0xe4, 0x81, 0x20, 0xfa, 0xaa, 0xbe, 0x5b, 0xf9, 0xa1, 0x81, 0x71, 0xd7, 0xeb, 0x6f, 0xdc, 0x0d, 0x44, 0x1e, 0x06, - 0xe4, 0x56, 0x7d, 0x05, 0x85, 0x86, 0xec, 0xa9, 0x06, 0xc9, 0x95, 0xd4, 0x46, 0x48, 0x70, 0x2d, 0xde, 0xe4, 0x4f, - 0x8a, 0xa2, 0x28, 0x82, 0x8d, 0x50, 0x04, 0x1f, 0x81, 0xe5, 0xc8, 0x0e, 0x80, 0xb6, 0x24, 0x8f, 0x37, 0xb4, 0x04, - 0x38, 0x03, 0xd4, 0xc9, 0xf2, 0x02, 0x16, 0x5c, 0xaf, 0x67, 0xf3, 0x02, 0xce, 0xd0, 0x43, 0x60, 0x34, 0x37, 0x81, - 0x18, 0xbc, 0x03, 0x05, 0x19, 0x76, 0x7c, 0xcb, 0x24, 0xc1, 0x8a, 0x4d, 0x1f, 0x27, 0x43, 0xd2, 0x1c, 0x85, 0x2d, - 0x94, 0xb0, 0x20, 0x68, 0x1d, 0x2a, 0x41, 0x95, 0x0d, 0xd2, 0x80, 0x1b, 0x91, 0x2f, 0xda, 0x64, 0x2b, 0x12, 0xae, - 0x55, 0xcc, 0xc2, 0x84, 0x51, 0xf1, 0xa0, 0xce, 0x1b, 0x4a, 0x6c, 0x01, 0xb6, 0x69, 0x6e, 0xb9, 0xa4, 0x77, 0x61, - 0xca, 0x50, 0xaa, 0x6b, 0x78, 0x4c, 0xb1, 0x99, 0x32, 0xdc, 0x56, 0xbd, 0x21, 0xd8, 0x92, 0x46, 0x55, 0xd7, 0x29, - 0x6a, 0x8c, 0x0c, 0x7d, 0xd0, 0x78, 0x14, 0x4c, 0x5c, 0xc4, 0xc1, 0xae, 0xb9, 0xd5, 0x45, 0x13, 0x1a, 0x19, 0xb7, - 0x22, 0x28, 0x4a, 0xf4, 0x7a, 0x37, 0x6c, 0x9c, 0x10, 0x0a, 0xa8, 0xb5, 0x1f, 0xaf, 0xd6, 0x4f, 0xcb, 0xa4, 0x3f, - 0x91, 0x07, 0x7a, 0x91, 0x50, 0x50, 0x7d, 0x22, 0x0f, 0x60, 0xfb, 0xf7, 0x16, 0xa4, 0x29, 0xea, 0x0e, 0x74, 0x6d, - 0x40, 0x70, 0x7d, 0x0f, 0xc2, 0x43, 0xed, 0x38, 0x40, 0x76, 0xbe, 0x03, 0x8b, 0x23, 0x88, 0x21, 0x8f, 0x32, 0x3f, - 0xc4, 0xcc, 0xca, 0x5e, 0x6b, 0x84, 0xb1, 0xd9, 0x70, 0x34, 0xf4, 0x17, 0x8e, 0x6d, 0x1f, 0xd5, 0xea, 0x83, 0x20, - 0xbb, 0xa9, 0xb6, 0x6e, 0x64, 0x23, 0xc7, 0x36, 0xfd, 0x17, 0x56, 0x67, 0x58, 0xbb, 0xa3, 0xa5, 0xe8, 0x8d, 0x13, - 0x14, 0x7f, 0x8d, 0x9f, 0x6d, 0xb5, 0xda, 0x81, 0xd4, 0xab, 0x56, 0xeb, 0x38, 0xb6, 0x9c, 0xc9, 0xbf, 0x26, 0xf5, - 0xab, 0x9f, 0xc6, 0x8e, 0xa4, 0x99, 0x44, 0x26, 0x10, 0x7f, 0x58, 0x83, 0x63, 0xf4, 0x67, 0xe5, 0xa5, 0xa2, 0xd1, - 0xe3, 0xa3, 0xeb, 0x13, 0x91, 0xa0, 0x9a, 0xbb, 0x75, 0xc9, 0x1d, 0x54, 0xbe, 0x98, 0x56, 0x31, 0x1c, 0x8b, 0x74, - 0x4a, 0x0a, 0x8d, 0xde, 0x4e, 0x6a, 0x01, 0xfb, 0x6f, 0xb9, 0x3e, 0xad, 0x29, 0x44, 0x02, 0x80, 0x1a, 0x10, 0xad, - 0x7c, 0x6f, 0x87, 0xeb, 0xb8, 0xdc, 0x5d, 0xf9, 0x92, 0x3c, 0xbc, 0x33, 0xbc, 0x74, 0x50, 0x87, 0x26, 0xfa, 0x6b, - 0xbe, 0xee, 0x1e, 0xd9, 0x25, 0x09, 0x67, 0xe5, 0x0e, 0x2b, 0xf7, 0xd7, 0xe1, 0xdd, 0x95, 0x30, 0x0a, 0x84, 0xf1, - 0x8f, 0x1a, 0x30, 0x4a, 0x1e, 0x85, 0xb8, 0xf9, 0xe9, 0x71, 0xf3, 0x0f, 0xa2, 0x62, 0xb0, 0x01, 0x8d, 0xc1, 0x25, - 0x9a, 0x49, 0x42, 0x71, 0x88, 0x15, 0x8d, 0x8e, 0xb8, 0x1a, 0x27, 0x44, 0x5b, 0x77, 0x62, 0xc6, 0x6d, 0x0a, 0x8b, - 0x36, 0x3e, 0x8b, 0xfe, 0x78, 0xa8, 0xd4, 0xda, 0xdf, 0x2f, 0xb5, 0xce, 0xf6, 0x49, 0xad, 0xa9, 0x47, 0xd3, 0x7d, - 0xe2, 0xc6, 0x92, 0x53, 0x1c, 0x27, 0xce, 0x65, 0xdf, 0xb8, 0x92, 0xa8, 0x1b, 0x1d, 0xa0, 0x78, 0xab, 0x5a, 0x6f, - 0xd4, 0x4a, 0x10, 0xc5, 0xdf, 0x12, 0x83, 0xc2, 0x15, 0xea, 0xb2, 0x6c, 0xfc, 0xaa, 0x90, 0x8d, 0x53, 0xae, 0xa6, - 0xf0, 0x65, 0xe1, 0xd4, 0xbf, 0xe4, 0x27, 0x26, 0xb8, 0x83, 0xc2, 0x5f, 0xac, 0x18, 0xa9, 0xe4, 0x01, 0x55, 0x30, - 0x1a, 0x92, 0x5f, 0x1d, 0xe7, 0x32, 0xca, 0xee, 0x75, 0xe5, 0xaa, 0x85, 0x03, 0x54, 0x51, 0x0e, 0x52, 0x77, 0x1c, - 0xb2, 0x28, 0x96, 0xb7, 0x4d, 0xd9, 0x03, 0x46, 0x7e, 0x2d, 0x6d, 0x12, 0xe1, 0xaa, 0x42, 0x01, 0xcc, 0xc5, 0xf4, - 0x15, 0xbd, 0xb6, 0xb0, 0x81, 0xc0, 0x41, 0x36, 0x78, 0xd6, 0xed, 0x97, 0xce, 0xd3, 0x0c, 0x05, 0x85, 0x16, 0x5e, - 0x96, 0x41, 0x20, 0x7c, 0x6f, 0xb6, 0x0d, 0xb7, 0x3c, 0x5e, 0xf2, 0xec, 0x7e, 0x07, 0xf1, 0xa2, 0x62, 0xcb, 0x8a, - 0x7c, 0x3c, 0x99, 0x26, 0x35, 0xcf, 0xc5, 0xaa, 0xf5, 0x4e, 0xa9, 0x10, 0x67, 0xcb, 0x9c, 0x53, 0xca, 0x32, 0x7a, - 0x56, 0x63, 0xc0, 0xbf, 0xcb, 0xb6, 0x4e, 0xb2, 0x0e, 0x31, 0x9a, 0xbc, 0x99, 0x25, 0xae, 0xf7, 0x49, 0x1a, 0x32, - 0x97, 0x73, 0x82, 0x0c, 0xb8, 0xac, 0x29, 0x18, 0xba, 0x18, 0x7c, 0x91, 0x0c, 0xac, 0x4e, 0x2a, 0x49, 0x5f, 0x06, - 0x4f, 0xed, 0xae, 0xfb, 0x6a, 0x7e, 0x5c, 0x11, 0x8a, 0x76, 0x7a, 0x65, 0x91, 0x79, 0xcb, 0x38, 0xb2, 0xe5, 0x7a, - 0x35, 0xdd, 0xca, 0xb2, 0x55, 0x49, 0xe4, 0x5a, 0x17, 0xb3, 0xca, 0x9f, 0x9d, 0xcf, 0xe7, 0x65, 0x41, 0xa3, 0xad, - 0x1c, 0xa3, 0xb0, 0xf0, 0xa9, 0x6d, 0xdb, 0xd5, 0xb1, 0xef, 0x06, 0xbb, 0x89, 0x72, 0xdb, 0xd3, 0xc6, 0x11, 0x23, - 0x6c, 0xf7, 0xc1, 0xaf, 0x0e, 0x8e, 0xdc, 0x2a, 0x4e, 0x76, 0xc9, 0x2c, 0x62, 0x48, 0x8d, 0x21, 0xfc, 0x8c, 0xac, - 0xd2, 0x81, 0x47, 0x50, 0x07, 0x63, 0x49, 0x07, 0x1a, 0x0d, 0x07, 0xcc, 0x05, 0x98, 0x8a, 0x38, 0x7c, 0x57, 0xd8, - 0x0a, 0xca, 0xc3, 0x6b, 0xc2, 0x7b, 0xfe, 0x11, 0x3c, 0x28, 0xdb, 0xba, 0x4c, 0x1b, 0xa7, 0xd5, 0xb3, 0xff, 0x5c, - 0xaa, 0xa7, 0xc0, 0x05, 0xb8, 0xe5, 0x0a, 0x6d, 0x2a, 0x9f, 0xc5, 0xff, 0x17, 0xf2, 0xff, 0x57, 0xf1, 0xa6, 0x6c, - 0x3f, 0x72, 0x0a, 0x12, 0xed, 0xe2, 0xb4, 0xd0, 0x51, 0x37, 0xed, 0x01, 0x61, 0x65, 0x30, 0x97, 0x15, 0xe8, 0xa0, - 0xa4, 0x2f, 0xa5, 0xdc, 0x68, 0x10, 0xbf, 0x23, 0xc5, 0x0c, 0x4b, 0x5c, 0x88, 0x10, 0x8b, 0x84, 0x71, 0x30, 0x07, - 0xe3, 0xe5, 0x29, 0xea, 0x0f, 0x4a, 0x7b, 0x02, 0xb4, 0xf1, 0xb5, 0xb9, 0x1d, 0x24, 0xee, 0xaf, 0xea, 0xb5, 0x78, - 0xc7, 0x00, 0x32, 0x07, 0x0e, 0x21, 0x1a, 0x12, 0x28, 0x95, 0xcd, 0x4d, 0x47, 0x29, 0xde, 0xca, 0x7a, 0x36, 0x3e, - 0x30, 0xec, 0xae, 0xb9, 0x0a, 0xed, 0x9b, 0x6b, 0x0b, 0x60, 0xb2, 0x6c, 0xfb, 0xe1, 0xb3, 0x09, 0x4b, 0x2c, 0xef, - 0x47, 0x07, 0x97, 0x1c, 0xf7, 0xaf, 0x89, 0x77, 0x67, 0x4a, 0xcf, 0x3f, 0xca, 0x17, 0xff, 0xda, 0x28, 0xd0, 0xbb, - 0x2a, 0x49, 0xe8, 0x98, 0xb5, 0x78, 0x47, 0x3f, 0xa8, 0xf6, 0xca, 0x0f, 0x0f, 0xaf, 0xeb, 0x6e, 0x0e, 0xae, 0x0b, - 0x17, 0xc6, 0xc1, 0x95, 0xe1, 0xc6, 0xa1, 0x96, 0x0b, 0xd9, 0xe8, 0xaf, 0x92, 0x40, 0x51, 0x76, 0xfc, 0x55, 0xb1, - 0x15, 0xa5, 0xf2, 0xaf, 0xd6, 0x40, 0x7c, 0x1e, 0x94, 0x52, 0x41, 0xe1, 0x59, 0xd1, 0xd4, 0xbe, 0x72, 0xaa, 0xf4, - 0xbb, 0xca, 0x89, 0xad, 0x52, 0x2e, 0x6c, 0xa4, 0xf6, 0x3a, 0x85, 0x43, 0xdf, 0xb1, 0xad, 0x8e, 0xcf, 0x16, 0xfc, - 0x92, 0x98, 0xfb, 0x41, 0x40, 0x51, 0x45, 0x9a, 0x25, 0xd1, 0x27, 0x52, 0x56, 0xb3, 0xd0, 0x32, 0x66, 0x04, 0xd2, - 0xe1, 0x8f, 0x70, 0x76, 0x3c, 0x37, 0x1e, 0xe0, 0xd9, 0x90, 0x0b, 0xc1, 0x80, 0x93, 0x96, 0xe2, 0x27, 0xe0, 0x0e, - 0x9e, 0xaa, 0xe3, 0x33, 0x08, 0x1a, 0xa8, 0xcc, 0x46, 0xea, 0x8f, 0x9d, 0xbe, 0xe2, 0xf4, 0xee, 0xcc, 0xae, 0x67, - 0x9b, 0x8e, 0x75, 0xac, 0xd8, 0xd6, 0x89, 0xd9, 0xb1, 0xfa, 0x4a, 0xc7, 0xea, 0xc1, 0xbf, 0x9e, 0x63, 0xbd, 0x52, - 0x6c, 0x78, 0x52, 0x1c, 0xab, 0x8b, 0xff, 0x76, 0xac, 0xfe, 0x5d, 0x97, 0xde, 0xf4, 0xae, 0x70, 0xab, 0xaa, 0x8c, - 0x02, 0x9c, 0x40, 0xd4, 0xa3, 0xf1, 0xd9, 0x3a, 0x25, 0xca, 0x66, 0xa4, 0xbe, 0x52, 0x95, 0x65, 0x42, 0xe6, 0x23, - 0xf5, 0xa9, 0x2b, 0x95, 0x3a, 0xa7, 0x8d, 0xc5, 0x9d, 0x7e, 0x63, 0x71, 0xf7, 0xa4, 0xb1, 0xf8, 0xb8, 0x57, 0x2e, - 0x3e, 0x5a, 0xd0, 0x57, 0x52, 0xce, 0xbe, 0x95, 0x9b, 0x25, 0xfe, 0x46, 0x73, 0x14, 0x40, 0xd7, 0x26, 0xfc, 0xd3, - 0xef, 0xe8, 0xa2, 0xd5, 0x14, 0x5a, 0x09, 0x68, 0xf4, 0x4f, 0x15, 0xe7, 0xe4, 0x2f, 0x9d, 0x13, 0x0f, 0xea, 0x41, - 0x86, 0x49, 0xf8, 0xbb, 0xeb, 0x9e, 0x7a, 0xb6, 0x02, 0x0d, 0x1d, 0xf8, 0x6f, 0xd9, 0xeb, 0x78, 0xf4, 0xc1, 0x86, - 0xf7, 0x1f, 0x9d, 0x7e, 0x6a, 0x9b, 0x0e, 0xfc, 0xf7, 0x9b, 0x50, 0xb9, 0x83, 0xc2, 0x5f, 0xee, 0xf7, 0xd8, 0x56, - 0xba, 0xa7, 0xcb, 0x8e, 0xf5, 0xea, 0xae, 0x6f, 0x9d, 0x2e, 0x9d, 0xfe, 0x47, 0xfa, 0x14, 0x98, 0x1d, 0xeb, 0x15, - 0xfc, 0x7d, 0xec, 0xda, 0x4b, 0xd3, 0xb1, 0x4e, 0xef, 0xba, 0x56, 0x37, 0x30, 0x4f, 0xac, 0x53, 0xf8, 0xfb, 0x0d, - 0xc0, 0x0b, 0x70, 0x65, 0x29, 0x41, 0x15, 0xd8, 0x18, 0x15, 0xfb, 0x0d, 0xf9, 0x23, 0x9d, 0x63, 0xa5, 0x77, 0xfc, - 0x97, 0xd3, 0x3b, 0xf3, 0x78, 0xe9, 0x74, 0xee, 0xcc, 0xd6, 0x9f, 0x1f, 0x01, 0xf2, 0xbb, 0x17, 0x0e, 0xc0, 0x88, - 0x39, 0x40, 0xfe, 0x34, 0x31, 0x2e, 0xdb, 0xc4, 0xe8, 0xef, 0xf7, 0x8b, 0xd1, 0x7f, 0x58, 0x1f, 0x22, 0x46, 0x7f, - 0xff, 0xd5, 0xc5, 0xe8, 0x97, 0x55, 0x2b, 0xee, 0xf7, 0xd5, 0x58, 0xe5, 0xbf, 0x6c, 0xab, 0x44, 0xb2, 0xef, 0x6a, - 0xd7, 0x57, 0xeb, 0x1b, 0x88, 0xb6, 0xf3, 0x3e, 0x1a, 0xfd, 0xb0, 0x2e, 0x99, 0x28, 0x45, 0x80, 0x01, 0xde, 0x47, - 0x14, 0x03, 0xfc, 0xb6, 0x1e, 0x81, 0x5d, 0x04, 0xbb, 0x35, 0xfd, 0x99, 0xb9, 0x74, 0x83, 0xb9, 0xb8, 0x71, 0xa1, - 0x64, 0x88, 0xc5, 0x60, 0x33, 0x0f, 0x97, 0x09, 0x28, 0x6b, 0xd6, 0xab, 0x30, 0x1d, 0x9c, 0xd8, 0x80, 0xe6, 0x3b, - 0xf3, 0x24, 0xaf, 0x34, 0xb6, 0x78, 0x7c, 0xa2, 0x5b, 0x66, 0xd3, 0xdf, 0xfa, 0x1e, 0x4d, 0xd6, 0x9a, 0x7b, 0x77, - 0xea, 0xfd, 0x2a, 0x60, 0x0b, 0xc2, 0x4d, 0xfa, 0x80, 0xd8, 0x68, 0x7a, 0x5f, 0x36, 0x1c, 0xab, 0x98, 0x0a, 0xb6, - 0x8f, 0x14, 0x46, 0x52, 0x6d, 0xef, 0x94, 0x0d, 0xcf, 0xf6, 0x4d, 0xb3, 0xe1, 0xf3, 0xa5, 0xe6, 0x3b, 0xac, 0xde, - 0x44, 0xc7, 0x55, 0x50, 0x55, 0x32, 0x6d, 0x35, 0x02, 0xa4, 0xa0, 0x3d, 0x0b, 0xd3, 0xb8, 0x82, 0xf0, 0xb1, 0x15, - 0xbc, 0x8d, 0x6d, 0xe9, 0x5d, 0xa9, 0x4f, 0xd9, 0x9c, 0xee, 0xc5, 0x16, 0xe9, 0x41, 0xff, 0x37, 0x20, 0x6c, 0xd8, - 0x7d, 0x3c, 0x8d, 0x64, 0x38, 0x6f, 0xa5, 0x7e, 0x29, 0xa9, 0x9d, 0x2f, 0x9d, 0x6d, 0x9d, 0xb4, 0x69, 0x35, 0xa4, - 0x75, 0xc8, 0x8a, 0xdf, 0xd1, 0xf8, 0x79, 0x6a, 0xb6, 0x9a, 0x53, 0xd3, 0x62, 0xb4, 0xcc, 0xdd, 0xd5, 0x19, 0xaf, - 0xf7, 0x14, 0x36, 0xb1, 0xc1, 0x1e, 0x64, 0xc7, 0xf1, 0xed, 0x1c, 0xb2, 0x22, 0x0f, 0x90, 0x88, 0x90, 0x28, 0xa8, - 0x0e, 0xda, 0xd8, 0x0e, 0x77, 0x98, 0x7f, 0xc8, 0x1d, 0xb3, 0x4e, 0xd0, 0x56, 0x77, 0x97, 0xc5, 0x88, 0x70, 0x6d, - 0xd8, 0x96, 0x14, 0xa8, 0x4e, 0xaf, 0x6f, 0x38, 0x27, 0x86, 0xd5, 0xef, 0xe9, 0x39, 0x3f, 0x70, 0x72, 0x97, 0x25, - 0x80, 0x80, 0xc9, 0xae, 0x18, 0xa6, 0x1f, 0xfa, 0x99, 0xef, 0x06, 0x39, 0xa0, 0xfa, 0x32, 0xcd, 0xfb, 0xcf, 0x75, - 0x9a, 0xc1, 0x1c, 0x39, 0x49, 0x86, 0xe6, 0xca, 0xe6, 0x94, 0x64, 0xf7, 0x84, 0x84, 0x2d, 0xaa, 0xdc, 0xaa, 0xf5, - 0xf3, 0x1f, 0x67, 0x0b, 0x9a, 0x53, 0x3b, 0x8b, 0x69, 0x16, 0xb2, 0xfd, 0xc1, 0x4d, 0x75, 0xf3, 0x89, 0xf1, 0x53, - 0x1b, 0xc2, 0xfd, 0xe7, 0x7e, 0x84, 0x9b, 0x91, 0x43, 0x10, 0xee, 0x3f, 0xbf, 0x3a, 0xc2, 0xfd, 0x49, 0x46, 0xb8, - 0x25, 0x4f, 0x95, 0x42, 0x26, 0xfa, 0x01, 0x9f, 0x35, 0x08, 0xf2, 0xfb, 0x52, 0x3d, 0xa2, 0xe4, 0xa5, 0x2a, 0x25, - 0x5f, 0xfd, 0x58, 0xca, 0x26, 0x83, 0x2c, 0x3b, 0x06, 0x25, 0xa5, 0x99, 0x2b, 0x20, 0x31, 0xa9, 0x48, 0xb1, 0x0d, - 0x7d, 0x5e, 0x84, 0x59, 0x60, 0xbd, 0x67, 0x6c, 0x09, 0xa8, 0x20, 0x7e, 0x88, 0x92, 0x95, 0x8b, 0x01, 0xd9, 0x54, - 0xcc, 0x42, 0x07, 0x0f, 0x36, 0x78, 0x47, 0x79, 0x51, 0x38, 0x13, 0x72, 0x74, 0x32, 0xba, 0xa6, 0xf4, 0xa0, 0xfa, - 0x40, 0xdc, 0x44, 0x35, 0xe8, 0x6b, 0x58, 0xdc, 0x17, 0x5d, 0xfb, 0x45, 0xe7, 0xf8, 0xc5, 0x89, 0x0d, 0xff, 0x73, - 0x48, 0x37, 0x37, 0x58, 0xc5, 0x55, 0x14, 0x42, 0x22, 0x0c, 0x5e, 0xb3, 0xad, 0xda, 0x3d, 0x21, 0x9f, 0x8a, 0x5a, - 0xfd, 0xe6, 0x4a, 0x33, 0xf7, 0xa1, 0xa8, 0xd3, 0x58, 0x63, 0x19, 0xad, 0xa5, 0x61, 0x35, 0x8c, 0xc6, 0x0f, 0xd7, - 0x20, 0x19, 0x92, 0x6a, 0xc8, 0xaf, 0xd9, 0x74, 0x8b, 0x79, 0x91, 0x6e, 0x7e, 0x53, 0x64, 0xdb, 0xe1, 0x59, 0x3f, - 0xf6, 0x42, 0x90, 0x09, 0xd5, 0x6d, 0x8c, 0xd5, 0x8d, 0xf9, 0x66, 0x14, 0xc8, 0x75, 0x57, 0xa4, 0x54, 0xc7, 0x05, - 0xca, 0x92, 0x75, 0xe8, 0xd1, 0xac, 0xe9, 0xee, 0x34, 0xd5, 0xfc, 0x23, 0x88, 0xd6, 0x89, 0x1f, 0xd6, 0x71, 0xd5, - 0xdc, 0xb1, 0x5d, 0xa4, 0x26, 0x48, 0xf9, 0xaa, 0xb8, 0x2f, 0x32, 0x23, 0xa1, 0x09, 0x4d, 0x71, 0x69, 0xcd, 0x91, - 0xfb, 0x42, 0x34, 0x7c, 0x91, 0x19, 0x90, 0x54, 0x14, 0x96, 0xfb, 0xf9, 0x73, 0x5a, 0x0b, 0xd2, 0xfc, 0xd1, 0x69, - 0x9d, 0x7b, 0x22, 0x35, 0x98, 0xaa, 0xb8, 0x8b, 0x48, 0xc5, 0xd4, 0x60, 0x03, 0xcf, 0x88, 0x5e, 0xbe, 0x1c, 0x8f, - 0x1c, 0x9d, 0x25, 0xa9, 0x2c, 0x65, 0x54, 0xba, 0x3c, 0x4c, 0x35, 0xae, 0x37, 0x3a, 0x6d, 0xc5, 0x7e, 0xb8, 0xe0, - 0x9a, 0x69, 0x81, 0xbd, 0x20, 0xc3, 0x01, 0x55, 0x81, 0xb9, 0x5c, 0x45, 0xcd, 0xeb, 0xdc, 0x91, 0x04, 0x12, 0x6c, - 0x8e, 0xd4, 0xae, 0x65, 0x5b, 0xb6, 0x2a, 0x1a, 0xce, 0xfd, 0xc5, 0x68, 0x1b, 0x65, 0x2e, 0xe4, 0x8a, 0x09, 0xa2, - 0x05, 0x78, 0x7e, 0x64, 0x7e, 0x16, 0x40, 0xe2, 0x11, 0x70, 0x01, 0x59, 0x51, 0xae, 0x31, 0x67, 0xf6, 0xb8, 0x6e, - 0xf2, 0x09, 0x93, 0xcf, 0x71, 0xa7, 0x2f, 0x0c, 0x49, 0xf3, 0x23, 0x5c, 0x86, 0x9a, 0xaa, 0x41, 0xea, 0x43, 0x92, - 0xa4, 0xa6, 0x6c, 0xdf, 0x3e, 0x50, 0xa0, 0x0d, 0xa4, 0x25, 0xc7, 0x0e, 0xe6, 0x89, 0xbb, 0x82, 0x18, 0xdd, 0xdb, - 0xdc, 0x60, 0x98, 0x56, 0x65, 0xa8, 0x56, 0x71, 0x5e, 0x9d, 0x18, 0x4a, 0xc7, 0x31, 0x14, 0x1b, 0xd0, 0xad, 0x9a, - 0x1b, 0xdb, 0xfc, 0x66, 0xb8, 0x4f, 0x45, 0x47, 0xf1, 0xcb, 0x53, 0x3a, 0x0f, 0xaa, 0x9c, 0x63, 0xc2, 0xcf, 0x8c, - 0x06, 0x14, 0xd4, 0xa4, 0xe8, 0xd9, 0x3e, 0x15, 0xd3, 0x5f, 0x91, 0x4d, 0xa6, 0x63, 0x62, 0x0e, 0x56, 0xc5, 0xd7, - 0xb7, 0xe8, 0x9a, 0xe6, 0x87, 0x8a, 0xff, 0xf9, 0xb3, 0xe6, 0x83, 0xf9, 0xfd, 0x48, 0x82, 0x0f, 0x3c, 0xeb, 0x25, - 0x80, 0xf9, 0x85, 0x62, 0x09, 0x81, 0x05, 0xbe, 0x31, 0xf0, 0x6f, 0x51, 0xcc, 0x7f, 0x30, 0xc5, 0x9e, 0x15, 0xb8, - 0xe1, 0x02, 0x50, 0x9a, 0x1b, 0x2e, 0x6a, 0x06, 0x04, 0xd4, 0xbb, 0xae, 0x52, 0x5a, 0x74, 0x55, 0x28, 0xf7, 0xd3, - 0xef, 0x1f, 0xae, 0x68, 0xe2, 0x21, 0x48, 0x72, 0xed, 0xce, 0xd0, 0x15, 0xac, 0xd0, 0x3d, 0xbc, 0x1c, 0x7d, 0x73, - 0xb6, 0x22, 0x99, 0x4b, 0x05, 0x97, 0xc0, 0xe2, 0x01, 0x39, 0xa0, 0x78, 0x3c, 0x69, 0x28, 0x65, 0xf0, 0x66, 0xe4, - 0xce, 0xf7, 0x18, 0x9f, 0x66, 0x28, 0xec, 0x9e, 0x32, 0xd1, 0x46, 0x69, 0xe4, 0x18, 0xd4, 0x44, 0xd6, 0x73, 0x31, - 0xec, 0xe0, 0x28, 0x8c, 0xd4, 0xf1, 0x37, 0xc2, 0x9b, 0xa8, 0x6d, 0x11, 0x20, 0xfb, 0xdf, 0x75, 0x42, 0x82, 0x7f, - 0x8d, 0xbe, 0x81, 0x8b, 0xfb, 0x9b, 0x1b, 0x55, 0x1f, 0x66, 0x16, 0xf2, 0x31, 0xdf, 0x34, 0x64, 0xc1, 0x43, 0x1e, - 0x95, 0x31, 0x9b, 0x5d, 0x89, 0xd9, 0x84, 0xdf, 0xfb, 0x59, 0xd7, 0xf1, 0x19, 0x5e, 0x68, 0x63, 0xe0, 0x2e, 0xb6, - 0x25, 0x9e, 0xd3, 0x19, 0x22, 0x83, 0x3a, 0x0d, 0x5c, 0xef, 0x13, 0xe7, 0x50, 0xe5, 0x87, 0x43, 0x78, 0x51, 0x41, - 0xd9, 0x35, 0xee, 0x65, 0xdc, 0xca, 0x5b, 0xfc, 0x32, 0x7e, 0xea, 0x7e, 0xe9, 0x67, 0x82, 0x19, 0xc6, 0x87, 0x1c, - 0xb4, 0x39, 0x38, 0xbe, 0x82, 0xfd, 0x01, 0x06, 0xd5, 0x39, 0xfd, 0x4b, 0xef, 0xce, 0xb1, 0x97, 0x1d, 0xc7, 0x02, - 0x36, 0x67, 0xd9, 0xb5, 0xfa, 0x81, 0xd9, 0xb5, 0xfa, 0xf0, 0xf7, 0x11, 0x58, 0x2f, 0xb3, 0x63, 0x1d, 0x7f, 0x74, - 0x3a, 0x81, 0x79, 0x6a, 0xf5, 0xe1, 0xef, 0x92, 0xb6, 0xfa, 0x05, 0x99, 0x1e, 0x60, 0x78, 0xbe, 0x29, 0x61, 0x01, - 0xe9, 0xb7, 0xd0, 0x22, 0x18, 0xa5, 0xeb, 0xad, 0x41, 0x13, 0x01, 0x28, 0x43, 0x35, 0x78, 0x94, 0xc0, 0x70, 0xa8, - 0x41, 0x5a, 0x6e, 0x0c, 0x28, 0xcf, 0x0d, 0x32, 0xc2, 0x22, 0xc5, 0x7c, 0xfb, 0x31, 0x62, 0x6d, 0x9a, 0x03, 0x70, - 0xf3, 0x4c, 0x45, 0x54, 0x75, 0xf1, 0xb7, 0x18, 0x03, 0xeb, 0xf0, 0x90, 0xe1, 0x12, 0x56, 0x2a, 0xb2, 0xe5, 0xe5, - 0xfb, 0x07, 0x8e, 0x7e, 0xa3, 0x44, 0x64, 0x6b, 0xf9, 0xaa, 0x7d, 0x33, 0x75, 0x86, 0xe8, 0xfd, 0xf7, 0xf6, 0x83, - 0x49, 0x4a, 0x69, 0x3f, 0x3c, 0xba, 0xe7, 0xcc, 0x4f, 0xc4, 0xf0, 0x24, 0x14, 0xed, 0x34, 0x47, 0x2e, 0xd7, 0x21, - 0xad, 0xc5, 0x05, 0x50, 0xc9, 0x77, 0x6e, 0x20, 0x99, 0x5e, 0x48, 0x2d, 0x9f, 0x08, 0xcc, 0xff, 0xfc, 0x79, 0x31, - 0x38, 0xb3, 0x32, 0xee, 0x33, 0xa7, 0x07, 0xd7, 0x6e, 0x8f, 0x74, 0x77, 0x5a, 0x01, 0xed, 0x0f, 0x0f, 0x5b, 0xc4, - 0x93, 0xe4, 0x9a, 0x7e, 0xae, 0x63, 0x6c, 0x35, 0x45, 0xaa, 0x69, 0x18, 0x21, 0xb0, 0x6e, 0x85, 0xd5, 0x51, 0xf5, - 0x61, 0xc8, 0x15, 0x66, 0xe1, 0x8e, 0x90, 0xb8, 0x8c, 0x17, 0x53, 0x01, 0x34, 0x3b, 0xe6, 0xb1, 0xc7, 0xa5, 0xf1, - 0x7f, 0x3d, 0x09, 0x74, 0x2f, 0x02, 0x0d, 0x5f, 0xe5, 0xb4, 0x96, 0xdc, 0x4d, 0xc4, 0xbd, 0x4a, 0x2f, 0x54, 0x92, - 0x9e, 0xab, 0x50, 0x04, 0xf9, 0x8e, 0x30, 0xc5, 0x99, 0x30, 0x6f, 0x12, 0xb7, 0x45, 0x51, 0x60, 0xf8, 0x10, 0x13, - 0x5a, 0xe3, 0xae, 0x4e, 0xfa, 0xf3, 0xe7, 0xad, 0x97, 0x10, 0x55, 0x27, 0xcb, 0x99, 0x1e, 0x55, 0x19, 0xbf, 0xa9, - 0x32, 0x8a, 0x11, 0xfd, 0x22, 0xd6, 0xe0, 0x56, 0x59, 0x74, 0xef, 0xe1, 0xcf, 0x29, 0x71, 0x33, 0x8b, 0xe9, 0x41, - 0x34, 0xe9, 0x72, 0x37, 0x1c, 0xd2, 0x05, 0x7b, 0x2c, 0x16, 0x7f, 0x8b, 0x05, 0x9b, 0x7b, 0xb6, 0xfd, 0xb8, 0x66, - 0x7e, 0xc8, 0xd0, 0xc7, 0x67, 0xbb, 0x08, 0x9e, 0xf2, 0x2e, 0x73, 0x69, 0x84, 0x0d, 0xf9, 0xca, 0x8d, 0x32, 0x97, - 0xe7, 0x15, 0x01, 0xba, 0x7c, 0xd8, 0xa8, 0x30, 0x94, 0x7c, 0x95, 0xc7, 0xef, 0xae, 0xbe, 0x53, 0xd8, 0xfe, 0xa7, - 0xfa, 0x2d, 0x64, 0x64, 0x68, 0x14, 0xfc, 0x11, 0x8d, 0x82, 0xaf, 0xb0, 0xb4, 0x12, 0x10, 0x4b, 0x3e, 0x3f, 0xa2, - 0x10, 0x54, 0x15, 0x12, 0x7a, 0x54, 0xeb, 0xb7, 0x5a, 0x07, 0x99, 0x1f, 0xbb, 0x49, 0x76, 0x04, 0x4d, 0x4d, 0x40, - 0x72, 0x6a, 0x9b, 0x07, 0x33, 0x55, 0x1c, 0x72, 0xa1, 0x5a, 0x16, 0x72, 0xcd, 0xe1, 0xdc, 0x0f, 0x84, 0xe2, 0x90, - 0x7f, 0xc0, 0xf5, 0x3c, 0x12, 0x67, 0x23, 0xd5, 0x8d, 0x21, 0x1b, 0x02, 0xc6, 0x37, 0x3e, 0x8a, 0xbc, 0x8c, 0x64, - 0x66, 0x9a, 0x25, 0xc4, 0x5d, 0xa9, 0x22, 0xd6, 0x67, 0xbd, 0xbf, 0x74, 0x3d, 0x5d, 0xf9, 0x99, 0x08, 0x96, 0x47, - 0x27, 0x08, 0x2a, 0x3c, 0x18, 0xe2, 0x78, 0x92, 0x33, 0x10, 0x5e, 0x46, 0x8b, 0xca, 0x8e, 0x2a, 0x28, 0x97, 0x73, - 0x0c, 0xc5, 0xca, 0x22, 0xe0, 0xcf, 0xd0, 0x23, 0xe7, 0x96, 0x79, 0x5d, 0x8b, 0x98, 0x7e, 0xea, 0xf8, 0x8c, 0xb1, - 0xb7, 0x0a, 0x06, 0x0a, 0x50, 0x7b, 0x36, 0x04, 0x9b, 0x6d, 0xf3, 0xc7, 0x3e, 0x62, 0x95, 0xe1, 0x6a, 0xa2, 0x3d, - 0x63, 0xdc, 0x6f, 0x3a, 0x96, 0x2b, 0x20, 0x84, 0x4a, 0x2a, 0xde, 0xa5, 0x33, 0x16, 0x0e, 0x40, 0x38, 0x2a, 0xa4, - 0x95, 0x3e, 0x7f, 0x7e, 0x3d, 0xf9, 0xcf, 0xbf, 0x21, 0x38, 0xf9, 0xd2, 0xe1, 0x5e, 0xd0, 0xd7, 0x72, 0x2d, 0x46, - 0x7d, 0x1a, 0x13, 0x54, 0xef, 0x93, 0x19, 0x0f, 0x0b, 0xc2, 0xb7, 0x56, 0x3e, 0xb9, 0xe1, 0xa1, 0x9e, 0x20, 0x01, - 0x81, 0xce, 0x7d, 0xb5, 0x27, 0xb0, 0xbc, 0x13, 0x1e, 0x22, 0x40, 0xf9, 0x75, 0xf3, 0x7d, 0x1f, 0xb2, 0xf4, 0xd6, - 0xf2, 0x02, 0x48, 0x03, 0xc4, 0x3d, 0x34, 0x3e, 0x73, 0x99, 0xf0, 0x15, 0xc8, 0x8f, 0x74, 0x70, 0x04, 0xd3, 0x5c, - 0x46, 0x2b, 0x62, 0xf9, 0xd1, 0xd1, 0x3d, 0x99, 0x9a, 0x6e, 0xec, 0x53, 0xf9, 0x32, 0xca, 0xdd, 0x14, 0x4a, 0xf9, - 0x09, 0x05, 0x2d, 0xa5, 0xaf, 0xf3, 0x02, 0x94, 0x51, 0x01, 0x28, 0xf8, 0xe9, 0x8e, 0xcb, 0x01, 0xfc, 0x2c, 0x1e, - 0x31, 0xbe, 0x8c, 0xe5, 0xcf, 0x69, 0x1c, 0x3e, 0x1e, 0x72, 0xaf, 0x78, 0x30, 0xa3, 0xf9, 0x5c, 0x0e, 0xba, 0x67, - 0x95, 0xbf, 0x2f, 0xa0, 0x52, 0xec, 0xd9, 0x28, 0xa6, 0x5f, 0xaa, 0x7f, 0x42, 0xfc, 0x84, 0x6c, 0xb9, 0x2c, 0x3e, - 0x23, 0x9c, 0xe7, 0x5a, 0xf0, 0x3e, 0x01, 0x92, 0xa7, 0xb4, 0x12, 0x43, 0x14, 0xd5, 0xc8, 0xd0, 0x2d, 0xa4, 0xc9, - 0x93, 0xd1, 0x88, 0xe2, 0xb1, 0x2a, 0x3a, 0x03, 0x28, 0x35, 0x44, 0xcf, 0x87, 0xc9, 0x66, 0xd0, 0xd0, 0xa4, 0x1e, - 0x5c, 0xd8, 0xa8, 0x3a, 0x9d, 0xfa, 0x18, 0x8f, 0x5c, 0xbe, 0xbf, 0x4a, 0x3b, 0x10, 0x76, 0x16, 0x5b, 0x58, 0x40, - 0xe0, 0xbc, 0x9f, 0x0a, 0x1e, 0x57, 0xbe, 0xa5, 0x28, 0xdb, 0x0c, 0xdc, 0x87, 0x48, 0xd2, 0xac, 0x33, 0x27, 0xfb, - 0x4b, 0x2c, 0xbd, 0xe2, 0xce, 0x6d, 0xb5, 0x93, 0x24, 0x22, 0x90, 0xd7, 0x4f, 0x93, 0x1c, 0x32, 0x7c, 0xdf, 0x61, - 0x92, 0xeb, 0x96, 0x27, 0x83, 0xd8, 0x31, 0x2f, 0x0e, 0x5a, 0xe9, 0x25, 0x9e, 0xfb, 0xfc, 0xec, 0x08, 0xe6, 0x07, - 0x81, 0x01, 0x4a, 0x94, 0x91, 0xaf, 0x43, 0xf4, 0x01, 0x37, 0xa5, 0xd6, 0x01, 0x17, 0x33, 0x4e, 0xd4, 0x21, 0xe7, - 0x28, 0xa2, 0x83, 0x96, 0xaa, 0xd4, 0x89, 0x15, 0xbb, 0x99, 0xca, 0xdb, 0x1f, 0xb1, 0xff, 0xb7, 0x35, 0x86, 0xeb, - 0xcf, 0x87, 0x19, 0xe1, 0x7e, 0xb7, 0x97, 0x59, 0x8b, 0x6b, 0x6e, 0x5b, 0x15, 0x4a, 0xb0, 0xee, 0xa8, 0x50, 0xec, - 0xe3, 0x5d, 0xb5, 0x0a, 0xd2, 0x48, 0x54, 0x8b, 0x5d, 0x4d, 0x7d, 0x8a, 0x3b, 0xbe, 0x56, 0x1b, 0x4b, 0xa1, 0xde, - 0x65, 0x36, 0x82, 0xaa, 0x5c, 0xd8, 0xee, 0xc6, 0x31, 0xad, 0xac, 0x0f, 0xcf, 0x8e, 0x28, 0xdf, 0x39, 0xa6, 0x3b, - 0x6c, 0x7c, 0x06, 0xd6, 0x85, 0x74, 0xd1, 0xdd, 0x38, 0x66, 0x4b, 0x4a, 0x7f, 0xd1, 0x37, 0x47, 0xcb, 0x6c, 0x15, - 0x8c, 0xff, 0x0f, 0x00, 0xa3, 0x9b, 0x76, 0x11, 0x5a, 0x03, 0x00}; + 0xdc, 0xd3, 0x2f, 0xb7, 0x8d, 0x1b, 0xff, 0x7f, 0x9f, 0x82, 0x61, 0xd2, 0x1c, 0x99, 0x90, 0x34, 0x29, 0x59, 0xb6, + 0x23, 0x59, 0xf6, 0xdd, 0x25, 0xb9, 0xa9, 0x3b, 0xbe, 0xcb, 0x4d, 0xe2, 0x66, 0xda, 0xf3, 0x79, 0x2c, 0x4a, 0x82, + 0x24, 0x36, 0x14, 0xa9, 0x21, 0x29, 0x5b, 0x3e, 0x85, 0x7d, 0x96, 0x3e, 0x4b, 0x9f, 0xec, 0x37, 0xbb, 0x0b, 0x80, + 0xe0, 0x87, 0x3e, 0x7c, 0xc9, 0xb5, 0xbf, 0xb9, 0xba, 0x11, 0x41, 0x00, 0x04, 0x16, 0xc0, 0x62, 0xbf, 0xd7, 0x9f, + 0x72, 0xd9, 0x8b, 0x65, 0xb0, 0xfd, 0x3e, 0xf7, 0xf9, 0x33, 0x73, 0x70, 0x4b, 0x02, 0xc1, 0xe7, 0x64, 0xf1, 0x74, + 0x1a, 0x32, 0x43, 0x17, 0xc9, 0x43, 0x74, 0x4b, 0x7e, 0xe6, 0xfc, 0x89, 0x2b, 0x22, 0x76, 0x9a, 0xf9, 0xa6, 0xa3, + 0x25, 0x66, 0xcc, 0x64, 0x48, 0x3b, 0xa2, 0x5c, 0x51, 0x36, 0x7b, 0x87, 0xea, 0x0d, 0xbe, 0x2e, 0xc5, 0xd1, 0xb5, + 0xc7, 0xf1, 0x72, 0x18, 0x32, 0x1b, 0xb7, 0x3b, 0x7c, 0x72, 0x3d, 0x5c, 0x0e, 0x87, 0x90, 0xa5, 0xe5, 0x89, 0x6b, + 0x41, 0xdc, 0x99, 0x38, 0x45, 0x7e, 0x30, 0x37, 0x7b, 0x30, 0x29, 0x27, 0xab, 0x0e, 0x1f, 0x6c, 0x45, 0x40, 0xd4, + 0x43, 0x1f, 0xc8, 0x80, 0xf7, 0x6b, 0x38, 0xb5, 0x7d, 0xfd, 0x03, 0xec, 0xbe, 0x54, 0xef, 0x35, 0x1d, 0xfd, 0xfe, + 0xb5, 0xfe, 0x01, 0x61, 0x8c, 0xd9, 0x8b, 0x5f, 0xd3, 0xee, 0xd5, 0x2d, 0x9d, 0x94, 0xde, 0x4b, 0xcc, 0x63, 0x00, + 0x42, 0xdf, 0x37, 0x81, 0x3f, 0x8d, 0xe2, 0x34, 0x0b, 0x46, 0xfa, 0x4d, 0xef, 0x22, 0x30, 0xae, 0xe7, 0x99, 0x61, + 0xde, 0x58, 0xa3, 0x4c, 0x4d, 0x81, 0x22, 0x10, 0x26, 0x66, 0x40, 0xd9, 0x54, 0x49, 0x3d, 0x41, 0x5b, 0x2b, 0x0a, + 0xd4, 0x8c, 0x95, 0x46, 0x59, 0x1f, 0xea, 0x55, 0xf2, 0xa9, 0x60, 0x62, 0x28, 0x1d, 0x5b, 0x9a, 0x3d, 0xe2, 0x54, + 0x5e, 0x2f, 0xd7, 0x78, 0x95, 0x67, 0xc5, 0x6d, 0x89, 0x31, 0x80, 0x85, 0xe3, 0x0c, 0x3d, 0x3f, 0x51, 0x8d, 0x3e, + 0x4b, 0xf7, 0xee, 0xe0, 0xbb, 0x32, 0x5d, 0x00, 0xf7, 0x37, 0x58, 0x5c, 0x44, 0x71, 0xa6, 0x41, 0x60, 0x1b, 0xf8, + 0xe2, 0xa0, 0x6a, 0x24, 0xc6, 0x7b, 0x35, 0xcc, 0x9c, 0x23, 0x83, 0xef, 0xf1, 0xf2, 0x33, 0x78, 0x78, 0xb3, 0x52, + 0x04, 0x0b, 0x62, 0x16, 0x22, 0x58, 0xc0, 0x2c, 0xbe, 0x8c, 0xef, 0xab, 0x7a, 0x90, 0xd7, 0x83, 0xdd, 0x77, 0xaf, + 0x21, 0xc8, 0x64, 0x91, 0xd5, 0xcf, 0xe0, 0x89, 0x49, 0x05, 0xa1, 0x53, 0x39, 0x53, 0x68, 0xf8, 0x21, 0x68, 0x98, + 0x0c, 0xec, 0xc4, 0xf0, 0x2e, 0x00, 0x94, 0xc4, 0xaf, 0xe9, 0x41, 0x7e, 0x2b, 0x52, 0x27, 0x8b, 0xc4, 0xc5, 0xca, + 0xe5, 0x0c, 0xd8, 0x35, 0x5a, 0x2c, 0x33, 0x0c, 0xb5, 0x0b, 0x03, 0x60, 0xb9, 0xae, 0x61, 0xe8, 0x4e, 0xc0, 0xd2, + 0x05, 0x99, 0x98, 0xeb, 0x5a, 0x30, 0xae, 0x97, 0x71, 0xa2, 0x17, 0x90, 0x17, 0xe2, 0x77, 0x14, 0x54, 0xc1, 0x63, + 0xc2, 0xa7, 0x31, 0xb2, 0x8a, 0x38, 0xf5, 0xc6, 0x08, 0x15, 0x3a, 0x0d, 0x98, 0x61, 0x44, 0xfd, 0xf4, 0x8c, 0xb0, + 0x71, 0xb2, 0x10, 0x7e, 0xb3, 0x34, 0xcd, 0xc1, 0xb3, 0x75, 0x94, 0x9f, 0x3f, 0x5b, 0xa7, 0x79, 0xff, 0xd9, 0xda, + 0x97, 0xb6, 0x02, 0xfa, 0x95, 0x4e, 0x86, 0x02, 0x03, 0x04, 0xc3, 0x20, 0xbf, 0x2d, 0x3c, 0x77, 0x8a, 0xf9, 0xc2, + 0x2e, 0xa3, 0x72, 0x0d, 0x55, 0xf7, 0x7d, 0xae, 0xa0, 0x5f, 0x24, 0xc1, 0xdc, 0x4f, 0x1e, 0x48, 0x9f, 0x6f, 0xa9, + 0x4a, 0x7f, 0x53, 0xd7, 0x08, 0xd1, 0x13, 0x00, 0x08, 0xe7, 0xeb, 0xda, 0xb7, 0xb2, 0x8c, 0xf1, 0xd9, 0x4a, 0xa5, + 0x26, 0x7c, 0xeb, 0x56, 0x7f, 0xc9, 0x9c, 0x31, 0xcb, 0xfc, 0x20, 0xa4, 0x26, 0x3d, 0x91, 0xad, 0xbe, 0x36, 0xbd, + 0xb4, 0x3c, 0xbd, 0xa8, 0xbc, 0x7f, 0x70, 0x32, 0x74, 0x05, 0xd0, 0xb8, 0x71, 0x66, 0x98, 0xc5, 0xaa, 0x79, 0x45, + 0xe9, 0xdd, 0x7f, 0x75, 0x39, 0x18, 0x2c, 0x47, 0x04, 0xcb, 0xc1, 0xa2, 0x51, 0x3c, 0x66, 0x7f, 0x7b, 0x7f, 0x21, + 0xd3, 0x66, 0x81, 0x04, 0x68, 0xc0, 0x37, 0x66, 0x8a, 0xf4, 0x43, 0x82, 0xb4, 0x03, 0x25, 0xb8, 0xd2, 0xe4, 0x16, + 0x4a, 0x72, 0x5d, 0x3b, 0xa7, 0xb1, 0xb3, 0x31, 0x8d, 0xba, 0x1f, 0x63, 0xab, 0x24, 0x3f, 0x3d, 0xa0, 0xda, 0x74, + 0xdb, 0x51, 0x25, 0x00, 0x43, 0x02, 0x33, 0x2c, 0xa0, 0x00, 0x19, 0x3e, 0xfb, 0x5e, 0xc1, 0x50, 0x38, 0x73, 0x94, + 0xb3, 0x7b, 0xe7, 0x65, 0x52, 0x05, 0x5b, 0xe9, 0x67, 0xa7, 0x98, 0xb3, 0x0b, 0xee, 0x6b, 0x88, 0xf2, 0x71, 0x7a, + 0x40, 0x8f, 0x5a, 0xe5, 0x44, 0x14, 0x9d, 0x08, 0xd6, 0xae, 0xcb, 0x3b, 0x78, 0xd4, 0x51, 0x81, 0x14, 0xf1, 0x50, + 0xea, 0xe7, 0xba, 0x36, 0xe7, 0xa4, 0x11, 0x0f, 0x27, 0x04, 0xb1, 0x06, 0x5c, 0x38, 0xbb, 0xba, 0x36, 0xf7, 0x57, + 0x38, 0x73, 0xf1, 0xc6, 0x5f, 0x19, 0x1e, 0x7f, 0x55, 0x9c, 0xb5, 0xb4, 0x7c, 0xd6, 0x46, 0x7c, 0x71, 0xc1, 0x91, + 0x40, 0x72, 0xd6, 0x33, 0x54, 0xd0, 0x36, 0x2c, 0xee, 0x4c, 0x2c, 0xee, 0x78, 0xc3, 0xe2, 0x8e, 0xb7, 0x2c, 0x6e, + 0xc8, 0x17, 0x52, 0x93, 0xa0, 0x4b, 0xd0, 0x39, 0x4c, 0x02, 0x8f, 0x13, 0x1a, 0x5d, 0x7e, 0xce, 0x10, 0x4e, 0x76, + 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x58, 0x35, 0xc1, 0x45, 0x01, 0x44, 0x7d, 0xe2, 0xf2, 0xd4, 0x89, 0x79, 0x43, 0x0e, + 0x4e, 0x23, 0xac, 0xce, 0x17, 0x76, 0x29, 0xe5, 0x17, 0x37, 0x66, 0x1b, 0x66, 0x3a, 0xdb, 0x32, 0xd3, 0x51, 0xe9, + 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x0c, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, + 0xab, 0xec, 0xa8, 0x85, 0x9f, 0xa6, 0xf7, 0x71, 0x02, 0x1a, 0x17, 0xe8, 0xe6, 0x71, 0x5b, 0x6a, 0x1e, 0x44, 0x3c, + 0x98, 0xcb, 0xc6, 0xcd, 0x54, 0xbc, 0x57, 0xb7, 0x54, 0xab, 0xd3, 0xa1, 0x1a, 0x0b, 0x3f, 0xcb, 0x58, 0x82, 0x40, + 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x6d, 0xd6, 0x80, 0x43, 0x42, 0x05, 0xab, 0x23, 0x86, 0x5e, 0x00, 0x6d, 0x95, + 0x88, 0x8b, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc0, 0xff, 0x84, 0xc7, 0xd5, 0x48, 0x14, 0xd7, 0x25, 0xef, 0xc8, 0x74, + 0x16, 0xfe, 0xf8, 0x03, 0x28, 0xf6, 0x8c, 0x96, 0x05, 0x46, 0xba, 0x6a, 0x18, 0xb8, 0x84, 0x88, 0xbd, 0x51, 0x81, + 0x24, 0x11, 0x4b, 0x72, 0x13, 0x28, 0xf0, 0x9e, 0xf4, 0xed, 0xc9, 0xcd, 0xba, 0x95, 0x1f, 0x4c, 0x03, 0xb3, 0x86, + 0x35, 0x01, 0xb5, 0x85, 0xfd, 0x33, 0xc9, 0x73, 0x85, 0x96, 0x77, 0x64, 0x82, 0xe4, 0xf7, 0x1a, 0xf2, 0x99, 0xba, + 0x82, 0xa1, 0x1d, 0x24, 0x70, 0x6b, 0x5d, 0xbb, 0x37, 0xf9, 0xf3, 0x29, 0xfe, 0xf2, 0x6e, 0xf2, 0xe7, 0x43, 0xfc, + 0xd5, 0xba, 0xc1, 0xcc, 0x75, 0x0d, 0x8c, 0xbc, 0x32, 0x67, 0xfd, 0xac, 0xb4, 0x9f, 0xc8, 0xfe, 0xec, 0x11, 0xdb, + 0x86, 0x2f, 0xf0, 0xd3, 0x67, 0xeb, 0x14, 0x3c, 0x2e, 0xd5, 0x39, 0x44, 0x4e, 0x62, 0xe6, 0x8d, 0xe5, 0xd3, 0x0d, + 0xe5, 0x43, 0xf3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0x2c, 0x86, 0xb8, 0x1d, 0x06, 0x91, 0x9f, + 0x3c, 0xdc, 0x12, 0x7b, 0x61, 0x08, 0xda, 0x5d, 0x8a, 0x57, 0x88, 0xbc, 0x2c, 0xab, 0xbb, 0x32, 0x45, 0xc0, 0xfb, + 0xc0, 0x2f, 0xfa, 0xfe, 0xdf, 0x13, 0x85, 0x6c, 0x2b, 0x31, 0xa0, 0x7c, 0x41, 0x4a, 0x1f, 0xba, 0x7d, 0xb6, 0x36, + 0x58, 0xbd, 0x9b, 0xca, 0x6c, 0x2b, 0x74, 0x21, 0x2c, 0x0f, 0x32, 0xb3, 0xf3, 0x71, 0xd0, 0x45, 0x7d, 0xd6, 0x30, + 0x5e, 0xd9, 0xcf, 0xd6, 0xd9, 0xb9, 0x3e, 0xf7, 0x93, 0x4f, 0x6c, 0x6c, 0x8f, 0x82, 0x64, 0x14, 0x32, 0xbd, 0xab, + 0x0f, 0x43, 0x3f, 0xfa, 0xc4, 0x1f, 0xed, 0x78, 0x99, 0xa1, 0x86, 0x7a, 0x27, 0xef, 0x2b, 0x60, 0x42, 0x22, 0x3b, + 0x24, 0x56, 0x1b, 0xa0, 0xa0, 0xbd, 0x96, 0x02, 0xaf, 0x82, 0x50, 0x2c, 0x6a, 0x59, 0x60, 0x60, 0x09, 0x4a, 0x73, + 0xf0, 0x58, 0xb5, 0x74, 0x5c, 0x2f, 0xdd, 0x52, 0xa7, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x16, 0x7b, 0xf8, 0xfd, + 0x9f, 0xa3, 0x64, 0xd8, 0xfb, 0x7f, 0x4e, 0xf6, 0xf2, 0x65, 0x33, 0x84, 0x52, 0x9b, 0x3c, 0x25, 0x1e, 0xf1, 0x71, + 0x4e, 0x60, 0x6e, 0xfe, 0xb4, 0xda, 0xd8, 0x4f, 0xd3, 0xe5, 0x9c, 0x8d, 0x49, 0x33, 0x78, 0x5e, 0x0c, 0xaa, 0xcc, + 0x59, 0xa8, 0x03, 0xfb, 0x75, 0xd9, 0x3a, 0x3e, 0x7c, 0x0d, 0x16, 0x0b, 0x40, 0x50, 0xc6, 0x93, 0x89, 0x5e, 0xf0, + 0xf8, 0x3b, 0x9a, 0x79, 0x87, 0xbf, 0x2e, 0x7f, 0x78, 0xeb, 0xfe, 0x20, 0x1b, 0x47, 0x40, 0x18, 0x0b, 0xf5, 0x2b, + 0xa7, 0x8b, 0x95, 0xf1, 0x8a, 0x19, 0x4d, 0xfc, 0x68, 0xf3, 0x74, 0xae, 0x4b, 0x5b, 0x7c, 0xc1, 0xd8, 0x18, 0x08, + 0x6e, 0xab, 0x56, 0x7a, 0x1b, 0xb2, 0x3b, 0x26, 0x55, 0xbb, 0xf5, 0x8f, 0x35, 0xb4, 0xc0, 0xd8, 0x73, 0x5c, 0x65, + 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x03, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x60, 0xe9, 0xca, 0x00, + 0x36, 0x8e, 0xec, 0x7c, 0x43, 0x79, 0x17, 0x13, 0x4f, 0x37, 0x8f, 0xcd, 0xf2, 0xcc, 0x2e, 0xc4, 0xea, 0xe6, 0x70, + 0x0a, 0xe1, 0xe4, 0x19, 0x85, 0x38, 0x64, 0x13, 0xc4, 0x9a, 0x84, 0x64, 0x3a, 0x49, 0x5f, 0x84, 0xb5, 0x23, 0x9a, + 0xfd, 0x0a, 0x39, 0x54, 0xe3, 0xda, 0x68, 0xe5, 0x99, 0x0f, 0x31, 0xa1, 0x6b, 0xc4, 0xd2, 0x74, 0x23, 0xc0, 0xe4, + 0xa2, 0x5b, 0x7a, 0x51, 0xbb, 0x0c, 0x8f, 0xa2, 0xdc, 0x72, 0x2d, 0x20, 0x09, 0x70, 0x82, 0xd5, 0x6f, 0xe1, 0xf5, + 0x72, 0x3b, 0xe7, 0xf6, 0x2a, 0xc9, 0x74, 0xa8, 0x73, 0x5b, 0x82, 0x4d, 0xef, 0xef, 0x75, 0x3e, 0xa8, 0xd2, 0x35, + 0xdd, 0x38, 0x34, 0xa3, 0x84, 0x7a, 0x6b, 0xe2, 0x22, 0xec, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x64, 0xc2, 0x46, + 0x59, 0x6a, 0x0a, 0xe1, 0x91, 0x8c, 0x1e, 0x0b, 0x5e, 0x43, 0x4f, 0xfa, 0xfa, 0x4f, 0xe0, 0x43, 0x2f, 0x82, 0x2c, + 0xf1, 0x01, 0x09, 0x9e, 0xa9, 0x19, 0x4c, 0xd4, 0x63, 0x19, 0x44, 0xfc, 0x2b, 0x90, 0x1c, 0xbc, 0xa1, 0x1c, 0x87, + 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0xd2, 0xaa, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xde, 0x0f, 0x1d, 0xcf, + 0xcd, 0x75, 0x0b, 0x7c, 0xb7, 0x3e, 0xed, 0x7b, 0xe8, 0xb1, 0x55, 0x1b, 0x5a, 0x2d, 0xa3, 0xc7, 0xb4, 0x6b, 0x79, + 0xaf, 0x3c, 0xdd, 0x22, 0x93, 0x39, 0x05, 0xb7, 0x8d, 0xe2, 0x3b, 0x96, 0x7c, 0xf1, 0x54, 0xca, 0x9d, 0xef, 0x37, + 0x9e, 0x23, 0xcf, 0x05, 0x24, 0x9c, 0xc5, 0x8b, 0x47, 0x4c, 0xa1, 0xad, 0x5b, 0xfa, 0x28, 0x8c, 0x53, 0xa6, 0xce, + 0x81, 0x84, 0x20, 0x5f, 0x38, 0x89, 0x9f, 0xdf, 0xbf, 0xfd, 0xf0, 0x41, 0xb7, 0x30, 0x13, 0x68, 0xaa, 0xf6, 0xce, + 0x37, 0xd4, 0x0e, 0xec, 0xdf, 0xb8, 0xef, 0xe8, 0x86, 0x21, 0xa6, 0xb6, 0xbc, 0xe7, 0xa8, 0xac, 0xb6, 0xe5, 0xf8, + 0xcd, 0xc3, 0xbf, 0x4c, 0x9c, 0xe8, 0x5e, 0xf3, 0x6a, 0xc0, 0x0d, 0xdb, 0xaf, 0xb7, 0x52, 0xc9, 0x3c, 0x88, 0x6e, + 0x1b, 0x4a, 0xfd, 0x55, 0x43, 0x29, 0xb0, 0x72, 0x35, 0x5c, 0xb5, 0x8c, 0xe7, 0x0a, 0x69, 0x00, 0x89, 0x9c, 0x77, + 0x81, 0x4b, 0xe1, 0xa7, 0xbe, 0x60, 0xd0, 0x3c, 0x92, 0x7b, 0x75, 0xd4, 0x0d, 0xc5, 0x9c, 0x09, 0x92, 0xb0, 0x1d, + 0x85, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6c, 0x94, 0xe6, 0xba, 0x4a, 0x27, 0x44, 0xde, 0xde, 0x66, 0x6c, + 0xbe, 0x60, 0x89, 0x9f, 0x2d, 0x13, 0x76, 0x1b, 0xc6, 0xf7, 0x4f, 0x0a, 0x73, 0xfa, 0x1d, 0x95, 0x67, 0xc1, 0x74, + 0x26, 0x6b, 0x9f, 0x1b, 0xac, 0x2f, 0x17, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0x71, 0xfe, 0xf3, 0xef, 0x9d, + 0x55, 0xa1, 0xfb, 0x7c, 0x60, 0x65, 0xfd, 0x3d, 0xf6, 0x45, 0xf3, 0x97, 0xca, 0x30, 0x6f, 0xae, 0x53, 0x5b, 0x04, + 0x78, 0x5f, 0x5b, 0x82, 0x5a, 0x61, 0x79, 0xdf, 0x3c, 0x6a, 0x60, 0x30, 0xaf, 0x9d, 0x23, 0x83, 0x4a, 0x5f, 0x34, + 0xb4, 0x81, 0xd9, 0xdd, 0x6b, 0x45, 0x7e, 0x3f, 0x84, 0x77, 0xcd, 0xe1, 0x0b, 0x87, 0xcf, 0xe5, 0x92, 0xaf, 0x07, + 0x03, 0x99, 0x5b, 0x4e, 0x6d, 0x0a, 0x26, 0xfe, 0xe7, 0xb5, 0x12, 0x7e, 0x79, 0x76, 0x5d, 0x93, 0x7c, 0xef, 0xfb, + 0xaf, 0x07, 0x68, 0x8c, 0x76, 0x3a, 0x4c, 0x0a, 0x62, 0x65, 0x23, 0x6a, 0x23, 0x63, 0xf2, 0x5a, 0xa7, 0x35, 0xbc, + 0x06, 0xa5, 0x98, 0x70, 0x2c, 0x1f, 0x98, 0xd6, 0xeb, 0x01, 0x17, 0x2c, 0x71, 0xfb, 0xd7, 0x6e, 0x75, 0x6b, 0x73, + 0xb1, 0x6c, 0x09, 0xe8, 0x96, 0x46, 0xfa, 0x1f, 0xac, 0xcc, 0x0a, 0x39, 0x1e, 0x0a, 0xf8, 0x41, 0xa2, 0x30, 0xc8, + 0x31, 0xdf, 0xc9, 0xbb, 0x4d, 0x36, 0x62, 0x3f, 0xef, 0xb6, 0x11, 0xbb, 0xda, 0xcb, 0x46, 0xec, 0xe7, 0xaf, 0x6e, + 0x23, 0xf6, 0x4e, 0xb5, 0x11, 0x83, 0x45, 0x7c, 0xcb, 0xf6, 0x32, 0xdc, 0x12, 0x56, 0x1b, 0xf1, 0x7d, 0xda, 0xf7, + 0x38, 0x49, 0x9b, 0x8e, 0x66, 0x0c, 0x64, 0x04, 0x7c, 0x55, 0xc2, 0x78, 0x0a, 0x46, 0x5c, 0x7f, 0xbc, 0xb9, 0x55, + 0x18, 0x4f, 0x55, 0x63, 0xab, 0x88, 0x47, 0x7c, 0x2d, 0xa2, 0x38, 0x91, 0x81, 0x93, 0x6b, 0x89, 0x98, 0x4f, 0xf6, + 0xa1, 0xa9, 0x64, 0xb5, 0x96, 0xd6, 0x6b, 0x2d, 0x61, 0x02, 0xd5, 0x45, 0xeb, 0x29, 0xd9, 0xb0, 0xf5, 0x52, 0xc4, + 0xb6, 0x50, 0x7b, 0x90, 0x56, 0xc2, 0x14, 0x27, 0x62, 0xad, 0xff, 0xba, 0xf2, 0xbe, 0xbf, 0xf6, 0x7a, 0x6d, 0x0f, + 0x9c, 0xb3, 0x81, 0xc3, 0xc4, 0x02, 0xb7, 0xd7, 0x6e, 0x43, 0xc1, 0xbd, 0x52, 0xd0, 0x82, 0x82, 0x40, 0x29, 0xe8, + 0x40, 0xc1, 0x48, 0x29, 0x38, 0x82, 0x82, 0xb1, 0x52, 0x70, 0x0c, 0x05, 0x77, 0x7a, 0x7e, 0x1d, 0xc9, 0xe1, 0x1e, + 0x9b, 0x37, 0x16, 0x31, 0x15, 0xa2, 0xec, 0xd8, 0xf2, 0xc0, 0x6a, 0xca, 0x9f, 0x76, 0x63, 0x8b, 0xa4, 0x8b, 0xdd, + 0xc4, 0xba, 0x9f, 0x31, 0x0a, 0x14, 0xfd, 0x06, 0xef, 0x1c, 0x27, 0x8b, 0xc1, 0x6e, 0x5a, 0x04, 0x60, 0x10, 0x70, + 0xd0, 0x74, 0x13, 0x04, 0x46, 0x3d, 0xb9, 0x72, 0x22, 0x88, 0x85, 0xb2, 0x96, 0xc5, 0x3b, 0xfa, 0x9c, 0x2d, 0xb7, + 0x40, 0x61, 0x71, 0x62, 0xa8, 0x52, 0xc9, 0xaf, 0x61, 0x77, 0xf0, 0x86, 0x0d, 0x97, 0x53, 0xed, 0x32, 0x9e, 0xee, + 0x34, 0x21, 0x50, 0x5f, 0xc1, 0x28, 0x75, 0x52, 0xbf, 0xd8, 0x62, 0x5b, 0xf2, 0x6f, 0xd1, 0x63, 0x5e, 0xae, 0x9f, + 0xc1, 0xd8, 0xb4, 0x8c, 0x0c, 0x58, 0xe0, 0x3b, 0x00, 0x23, 0x45, 0x87, 0x7f, 0x09, 0x70, 0x56, 0x9e, 0xaf, 0x7c, + 0x65, 0x3c, 0x67, 0x3f, 0xb2, 0x34, 0xf5, 0xa7, 0xa2, 0x7e, 0x7d, 0x9c, 0x60, 0xb4, 0x23, 0xf9, 0x2f, 0x04, 0x20, + 0x48, 0xf2, 0x82, 0x9a, 0x6d, 0x46, 0x12, 0xdf, 0x6b, 0x60, 0xfd, 0x03, 0x1b, 0xaa, 0xb0, 0x53, 0x08, 0x1c, 0x58, + 0xc2, 0xb2, 0x45, 0x01, 0x1c, 0xfe, 0x3b, 0x16, 0x56, 0x0b, 0x33, 0x7f, 0x5a, 0x2d, 0xa2, 0x7d, 0x90, 0xab, 0x63, + 0x93, 0x0a, 0xfd, 0x52, 0xe1, 0x97, 0x68, 0xa8, 0xc3, 0x78, 0xfa, 0x87, 0xaa, 0xa7, 0xb7, 0x98, 0x15, 0x7c, 0x88, + 0xac, 0x20, 0x1b, 0x38, 0x08, 0x63, 0xcd, 0x01, 0x10, 0x76, 0xa3, 0x6c, 0x66, 0xa3, 0x6b, 0x99, 0xd1, 0x8a, 0x4c, + 0xcb, 0xc1, 0xb5, 0x5d, 0x57, 0x1d, 0x6a, 0xbb, 0xc9, 0x74, 0xe8, 0x1b, 0x5e, 0xeb, 0xd8, 0x12, 0x7f, 0x8e, 0xdb, + 0x31, 0x73, 0xec, 0x41, 0x1b, 0x07, 0x77, 0xeb, 0x49, 0x1c, 0x65, 0xf6, 0xc4, 0x9f, 0x07, 0xe1, 0x43, 0x77, 0x1e, + 0x47, 0x71, 0xba, 0xf0, 0x47, 0xac, 0x57, 0x30, 0xd4, 0x3d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x3d, 0xa7, 0x95, 0xb0, + 0x39, 0xb5, 0x96, 0x91, 0x18, 0x26, 0x21, 0x5b, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0xb7, 0x1c, 0xb5, 0x00, + 0x8a, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xbd, 0x85, 0x3f, 0xc6, 0xc8, 0x84, 0x4e, 0xab, 0x93, 0xb0, 0xb9, 0xe6, + 0x74, 0x36, 0x76, 0x9e, 0xc4, 0xf7, 0x67, 0x30, 0x5a, 0x6c, 0x6c, 0xa7, 0x2c, 0x9c, 0xe0, 0x1b, 0x1b, 0x3d, 0x4b, + 0x44, 0x3f, 0x36, 0x32, 0xe2, 0xd0, 0x1b, 0x9b, 0xf7, 0xe0, 0x75, 0xb7, 0xa5, 0xb9, 0xbd, 0x79, 0x10, 0xd9, 0x34, + 0x9d, 0x63, 0x77, 0xa1, 0xf4, 0xa5, 0xc2, 0xcf, 0x5c, 0x63, 0x75, 0x4f, 0x73, 0x7b, 0xc0, 0xac, 0x4d, 0xc2, 0xf8, + 0xbe, 0x3b, 0x0b, 0xc6, 0x63, 0x16, 0xf5, 0x70, 0xcc, 0xb2, 0x90, 0x85, 0x61, 0xb0, 0x48, 0x83, 0xb4, 0x37, 0xf7, + 0x57, 0xbc, 0xd7, 0xc3, 0x4d, 0xbd, 0xb6, 0x79, 0xaf, 0xed, 0xbd, 0x7b, 0x55, 0xba, 0x01, 0x2f, 0x16, 0xea, 0x87, + 0x0f, 0xad, 0xa3, 0xb9, 0x95, 0x79, 0xee, 0xdd, 0xeb, 0x22, 0x61, 0xeb, 0xb9, 0x9f, 0x4c, 0x83, 0xa8, 0xeb, 0xe6, + 0xce, 0xdd, 0x9a, 0x36, 0xc6, 0xd3, 0x93, 0x93, 0x93, 0xdc, 0x19, 0x8b, 0x27, 0x77, 0x3c, 0xce, 0x9d, 0x91, 0x78, + 0x9a, 0x4c, 0x5c, 0x77, 0x32, 0xc9, 0x9d, 0x40, 0x14, 0xb4, 0x5b, 0xa3, 0x71, 0xbb, 0x95, 0x3b, 0xf7, 0x4a, 0x8d, + 0xdc, 0x61, 0xfc, 0x29, 0x61, 0xe3, 0x1e, 0x6e, 0x24, 0x32, 0x2b, 0xed, 0x1e, 0xbb, 0x6e, 0x8e, 0x18, 0xe0, 0xba, + 0x84, 0x9b, 0x50, 0xd6, 0x73, 0xb3, 0xde, 0xbb, 0xa6, 0x56, 0x7c, 0x6e, 0x34, 0x6a, 0xac, 0x37, 0xf6, 0x93, 0x4f, + 0x37, 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x6a, 0x6b, 0x01, 0x06, 0x7b, 0xd5, 0x85, 0x90, 0x5d, 0xbd, 0x61, 0x9c, 0xc0, + 0x99, 0x4d, 0xfc, 0x71, 0xb0, 0x4c, 0xbb, 0x5e, 0x6b, 0xb1, 0x12, 0x45, 0x7c, 0xaf, 0x17, 0x05, 0x78, 0xf6, 0xba, + 0x69, 0x1c, 0x06, 0x63, 0x51, 0xb4, 0xe9, 0x2c, 0x79, 0x2d, 0xb3, 0x87, 0x0e, 0xeb, 0x01, 0x86, 0x5d, 0xf0, 0xc3, + 0x50, 0x73, 0xda, 0xa9, 0xc6, 0xfc, 0x14, 0xe5, 0xcb, 0x9a, 0x9b, 0x12, 0x5c, 0xd0, 0x39, 0xdd, 0x3b, 0x5c, 0xac, + 0xe4, 0x9e, 0xf7, 0x8e, 0x16, 0xab, 0xfc, 0xdb, 0x39, 0x1b, 0x07, 0xbe, 0x66, 0x14, 0xbb, 0xc9, 0x73, 0x41, 0x06, + 0x6d, 0xae, 0x37, 0x6c, 0x53, 0x71, 0x2c, 0x20, 0xb4, 0xe1, 0x93, 0x60, 0xbe, 0x88, 0x93, 0xcc, 0x8f, 0xb2, 0x3c, + 0x1f, 0xdc, 0xe4, 0x79, 0xef, 0x2a, 0x30, 0xae, 0xff, 0x61, 0xd0, 0x3d, 0x4d, 0x3a, 0x9b, 0xdc, 0xbc, 0xb1, 0xde, + 0x32, 0xd5, 0x66, 0x04, 0xae, 0x31, 0xb4, 0x17, 0x51, 0x2b, 0xd3, 0x2d, 0x59, 0xaf, 0x4c, 0x40, 0x96, 0xd5, 0xc9, + 0x06, 0xa5, 0x5c, 0x05, 0x6f, 0x20, 0xa8, 0xf0, 0x96, 0xf5, 0xaf, 0x14, 0xfb, 0x13, 0x20, 0x56, 0xb0, 0x32, 0xf9, + 0x15, 0x3c, 0xdb, 0x44, 0x33, 0x7e, 0xb7, 0x9b, 0x66, 0xfc, 0x25, 0xdb, 0x87, 0x66, 0xfc, 0xee, 0xab, 0xd3, 0x8c, + 0xcf, 0xea, 0x7e, 0x05, 0x17, 0x71, 0x5f, 0x97, 0x1a, 0x06, 0xb8, 0x9a, 0x12, 0x8a, 0xd8, 0x73, 0xf1, 0xbb, 0xdd, + 0x00, 0x44, 0x6f, 0x94, 0x83, 0x8e, 0x6e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0xfa, 0x7f, 0x4f, 0xd4, 0xe7, 0xc9, 0xa4, + 0xff, 0x26, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, 0x4f, 0x80, + 0x73, 0x36, 0x59, 0x1d, 0x8f, 0xa5, 0xf5, 0x59, 0xaf, 0x3c, 0x04, 0x43, 0x9a, 0x7c, 0x0a, 0x17, 0x9c, 0x9a, 0x28, + 0x71, 0xca, 0x32, 0xee, 0x33, 0xfb, 0xfd, 0xc3, 0xc5, 0xd8, 0xb8, 0x88, 0xcd, 0x3c, 0x48, 0xdf, 0x55, 0x1d, 0x60, + 0xb8, 0xee, 0xa7, 0xaf, 0x4e, 0x27, 0xe7, 0x16, 0x64, 0x6a, 0x82, 0x69, 0x78, 0x4d, 0xcd, 0xcf, 0x4b, 0x33, 0xed, + 0xaa, 0x0d, 0x79, 0xa2, 0xab, 0xda, 0x65, 0xcc, 0xbd, 0x0f, 0xd6, 0x9c, 0x02, 0xc4, 0xdc, 0x5d, 0xe8, 0x37, 0x3c, + 0xa6, 0xe6, 0xc1, 0x38, 0xcf, 0xcd, 0x9e, 0x00, 0x84, 0x72, 0xd1, 0xb2, 0x5d, 0x44, 0x5c, 0x7a, 0x2f, 0x6d, 0x1a, + 0xb8, 0x86, 0x90, 0xd4, 0x7f, 0x17, 0xa0, 0x50, 0xe7, 0xca, 0x42, 0x0e, 0x33, 0x5d, 0x23, 0xf0, 0x91, 0xa1, 0x85, + 0x32, 0x21, 0xd0, 0x00, 0x4b, 0xf8, 0x8b, 0x57, 0xa2, 0xa0, 0x6e, 0xc3, 0x49, 0xc0, 0x41, 0x8b, 0x00, 0xf0, 0xf2, + 0x17, 0x72, 0x6d, 0x42, 0x3b, 0xbc, 0x0e, 0x3e, 0xe4, 0xba, 0xa4, 0xfd, 0x70, 0xfb, 0x9d, 0x9d, 0x1e, 0x40, 0x83, + 0xb3, 0x8a, 0xe1, 0xc0, 0x0e, 0x0b, 0x45, 0x20, 0x25, 0xd2, 0x7b, 0xcb, 0x49, 0xef, 0xb5, 0x17, 0x6b, 0x11, 0x21, + 0x23, 0xf3, 0x17, 0x36, 0xb0, 0xf8, 0x88, 0x7b, 0x39, 0xc6, 0x53, 0x82, 0x71, 0xf4, 0x96, 0x29, 0xe0, 0x46, 0x64, + 0x54, 0x11, 0xff, 0xf4, 0x46, 0xcb, 0x24, 0x8d, 0x93, 0xee, 0x22, 0x0e, 0xa2, 0x8c, 0x25, 0x39, 0x82, 0xea, 0x1a, + 0xe1, 0x23, 0xc0, 0x73, 0xb3, 0x8e, 0x17, 0xfe, 0x28, 0xc8, 0x1e, 0xba, 0x2e, 0x27, 0x29, 0xdc, 0x1e, 0xa7, 0x0e, + 0xdc, 0xc6, 0xfa, 0x5d, 0x0e, 0xcd, 0x97, 0x48, 0xf8, 0x25, 0x75, 0x72, 0x46, 0xdd, 0xe6, 0x3d, 0xe5, 0x2d, 0xc5, + 0x08, 0x01, 0xf2, 0xc3, 0x4f, 0xec, 0x29, 0x60, 0x79, 0x58, 0x6a, 0x77, 0xcc, 0xa6, 0x16, 0x62, 0x6d, 0x90, 0xcb, + 0x8b, 0x3f, 0xa7, 0x63, 0x6a, 0x6e, 0x73, 0x31, 0x50, 0x3c, 0xe6, 0x3e, 0x23, 0xeb, 0xfa, 0x90, 0x51, 0xcb, 0xda, + 0xa7, 0xe6, 0x90, 0x4d, 0xe2, 0x84, 0x51, 0x3c, 0x59, 0xef, 0x64, 0xb1, 0xda, 0xbf, 0xfb, 0xed, 0xd3, 0x6f, 0xee, + 0x27, 0x8a, 0x33, 0x43, 0x74, 0x66, 0xee, 0xe8, 0xad, 0x7e, 0x9f, 0x01, 0x69, 0x48, 0x90, 0x1f, 0x51, 0xe8, 0xae, + 0xae, 0xae, 0xf7, 0x1a, 0xc3, 0x76, 0x2d, 0x62, 0x7e, 0xe7, 0x25, 0x2c, 0xf4, 0xb3, 0xe0, 0x4e, 0xd0, 0x8c, 0xed, + 0xa3, 0xc5, 0x4a, 0xac, 0x31, 0x5e, 0x78, 0x8f, 0x58, 0xa4, 0xca, 0x50, 0xc4, 0x22, 0x55, 0x8b, 0x71, 0x91, 0x7a, + 0xb5, 0xd9, 0x88, 0x48, 0x16, 0x95, 0x9b, 0xbe, 0xb3, 0x58, 0xa9, 0x57, 0x74, 0xd1, 0x4c, 0xde, 0xd4, 0xd5, 0x10, + 0x64, 0xf3, 0x60, 0x3c, 0x0e, 0x59, 0x5e, 0x5a, 0xe8, 0xf2, 0x5a, 0x2a, 0xc0, 0x91, 0x70, 0xf0, 0x87, 0x69, 0x1c, + 0x2e, 0x33, 0xd6, 0x0c, 0x2e, 0x02, 0x4e, 0xcb, 0x2d, 0x80, 0x83, 0xbf, 0xcb, 0x63, 0xed, 0x00, 0xb9, 0x0d, 0xdb, + 0xc4, 0xed, 0x41, 0xc4, 0x61, 0xbb, 0x5d, 0x1e, 0x3a, 0xbc, 0x92, 0x83, 0xb6, 0x1a, 0x26, 0x62, 0xc1, 0xb5, 0x44, + 0xd8, 0x5b, 0x73, 0x3c, 0x5e, 0x26, 0xa3, 0xae, 0xca, 0xa2, 0xbc, 0x3c, 0x99, 0x3f, 0xe6, 0x8c, 0xbd, 0x6a, 0x3e, + 0x63, 0xaf, 0xc4, 0x19, 0xdb, 0xbe, 0x33, 0x9f, 0x4e, 0x3c, 0xf8, 0xaf, 0x57, 0x4c, 0xa8, 0xeb, 0x6a, 0xed, 0xc5, + 0x4a, 0xf3, 0x16, 0x2b, 0xcd, 0x6e, 0x2d, 0x56, 0x1a, 0x76, 0x8d, 0xf6, 0x20, 0x96, 0xd3, 0x32, 0x2d, 0x57, 0x83, + 0x42, 0xf8, 0x73, 0x4b, 0xaf, 0xbc, 0x43, 0x78, 0x07, 0xad, 0x3a, 0xf5, 0x77, 0xad, 0xed, 0x47, 0x9d, 0xce, 0x92, + 0x40, 0xda, 0xa6, 0x93, 0xf9, 0xc3, 0x21, 0x1b, 0x77, 0x27, 0xf1, 0x68, 0x99, 0xfe, 0x8b, 0x8f, 0x9f, 0x03, 0x71, + 0x2b, 0x22, 0xa8, 0xf4, 0x23, 0x9a, 0x82, 0xa2, 0xe4, 0x8e, 0x89, 0x1e, 0xd6, 0x72, 0x9d, 0xba, 0x14, 0x1e, 0xb9, + 0xe5, 0x1c, 0x36, 0x6c, 0xf2, 0x66, 0x40, 0xff, 0x61, 0xab, 0xb4, 0x19, 0xc5, 0x7c, 0x01, 0x58, 0xb6, 0x82, 0xe3, + 0xf1, 0xd0, 0xe0, 0xab, 0xe9, 0x9e, 0x34, 0x0f, 0xf7, 0x5a, 0x7c, 0xe9, 0x46, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x8e, + 0x29, 0xdb, 0x7b, 0xdd, 0xb4, 0x47, 0x6a, 0xbd, 0x6e, 0xb9, 0x10, 0x8a, 0xba, 0x7b, 0x62, 0xf9, 0xa7, 0xaf, 0x0e, + 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xc9, 0x9a, 0x08, 0xf5, 0x8b, 0xb2, 0x25, 0x38, 0x91, 0x4a, 0x48, 0x88, 0xef, 0x5f, + 0x7f, 0x32, 0x79, 0x5c, 0x83, 0xbd, 0x6b, 0x93, 0x29, 0x55, 0xb5, 0xf6, 0xf7, 0x71, 0x0c, 0xa9, 0x3b, 0xeb, 0xd5, + 0x05, 0x78, 0xc8, 0xd8, 0x3d, 0xeb, 0x43, 0x23, 0xc1, 0x47, 0x90, 0x16, 0x5f, 0xc7, 0x36, 0xc4, 0x4a, 0xbc, 0xdd, + 0xc4, 0x4a, 0xbc, 0xd9, 0xcd, 0x4a, 0xfc, 0x75, 0x2f, 0x56, 0xe2, 0xcd, 0x57, 0x67, 0x25, 0xde, 0xd6, 0x59, 0x89, + 0xab, 0x58, 0xd8, 0xcf, 0x5a, 0x17, 0x4b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0x2e, 0xe3, 0x7e, 0xc7, 0xa5, 0x90, 0xc7, + 0x57, 0xbf, 0x9b, 0xb1, 0xc0, 0x8d, 0xf8, 0x1e, 0xcd, 0xc9, 0x0a, 0xd6, 0x82, 0x63, 0x76, 0xfc, 0x8e, 0x52, 0x1c, + 0xc6, 0xd1, 0xf4, 0x67, 0x50, 0xca, 0x82, 0x38, 0x30, 0x51, 0x5e, 0x04, 0xe9, 0xcf, 0xf1, 0x62, 0xb9, 0xb8, 0x80, + 0xbe, 0x3e, 0x06, 0x69, 0x30, 0x0c, 0x99, 0xf4, 0x44, 0x26, 0xf3, 0x37, 0x2e, 0x13, 0x07, 0x8b, 0x53, 0xf1, 0xd3, + 0x5f, 0x89, 0x9f, 0x68, 0x93, 0xca, 0x7f, 0x93, 0x5d, 0x9d, 0xde, 0xcc, 0x88, 0x08, 0x25, 0xa0, 0x32, 0xe8, 0xc7, + 0x33, 0x23, 0x57, 0xb1, 0xd9, 0x30, 0x4b, 0x61, 0xef, 0xb0, 0xb1, 0x1f, 0x56, 0x63, 0x6a, 0x96, 0xa6, 0x25, 0x43, + 0x70, 0xd5, 0xc5, 0xf0, 0xf3, 0x78, 0x99, 0xb2, 0x71, 0x7c, 0x1f, 0xe9, 0x56, 0x24, 0x9d, 0x0c, 0x40, 0xc3, 0x29, + 0xdb, 0x60, 0xf2, 0xc8, 0x0f, 0x48, 0x28, 0xc7, 0x89, 0xa1, 0x43, 0xee, 0xd2, 0xe5, 0xc2, 0x26, 0x55, 0xb3, 0x8d, + 0x53, 0xd4, 0x65, 0x96, 0xa3, 0x27, 0x86, 0x11, 0xf7, 0x1f, 0xd7, 0x52, 0x98, 0x6a, 0xc4, 0x0e, 0x97, 0x0a, 0xa7, + 0x46, 0x24, 0x84, 0x8b, 0x22, 0x0e, 0x46, 0xc3, 0xc2, 0xf1, 0x37, 0xe4, 0xba, 0x5a, 0xbc, 0x85, 0x28, 0x22, 0xf9, + 0x92, 0xaf, 0x07, 0x8f, 0x0a, 0x41, 0x8f, 0xaf, 0x15, 0x30, 0xbe, 0xbb, 0x63, 0x49, 0xe8, 0x3f, 0x18, 0x66, 0x1e, + 0x47, 0x3f, 0x02, 0x00, 0xde, 0xc4, 0xf7, 0x91, 0x5a, 0x01, 0x93, 0xb5, 0x34, 0xec, 0xa5, 0xc6, 0xf8, 0x25, 0xe0, + 0xb8, 0xa2, 0x8c, 0x00, 0xd2, 0xe4, 0x4e, 0xd9, 0xdf, 0x2d, 0xfa, 0xf7, 0x1f, 0x66, 0x6e, 0x5d, 0xc6, 0xf2, 0x43, + 0x7f, 0x5b, 0xec, 0xf1, 0x99, 0xe7, 0xcf, 0x9f, 0x6c, 0x9e, 0x76, 0x39, 0x3d, 0x7b, 0x43, 0x6b, 0x73, 0xe3, 0x29, + 0x80, 0x51, 0x5c, 0xc5, 0xcb, 0xd1, 0x0c, 0x0d, 0x5d, 0xbf, 0xde, 0x7c, 0x33, 0xe8, 0x13, 0xb3, 0x94, 0xca, 0xa9, + 0x57, 0x8a, 0x0a, 0x28, 0xe0, 0xf7, 0xdf, 0x42, 0x00, 0xce, 0xff, 0x21, 0x18, 0xea, 0xbb, 0x86, 0x73, 0xf1, 0xc1, + 0xe3, 0x36, 0x6f, 0x0f, 0x92, 0x69, 0xf2, 0xd0, 0x16, 0x42, 0xb9, 0xd6, 0x8c, 0x64, 0xf2, 0x2a, 0xd0, 0xd4, 0x30, + 0x72, 0x9b, 0x22, 0xe4, 0x89, 0xaf, 0x30, 0x87, 0xd8, 0x74, 0xee, 0x68, 0x60, 0x31, 0x8e, 0xad, 0x2a, 0x48, 0x86, + 0x9b, 0x3c, 0x30, 0x44, 0x5f, 0xd5, 0x77, 0xf3, 0x20, 0xb2, 0x30, 0x0a, 0x7c, 0xfd, 0x8d, 0xbf, 0x82, 0x38, 0xc8, + 0x80, 0xdc, 0xaa, 0xaf, 0xa0, 0xd0, 0x52, 0xfd, 0xe6, 0x20, 0xd5, 0x93, 0xde, 0x08, 0x09, 0xa1, 0xc5, 0x1b, 0xfc, + 0x49, 0xd3, 0x34, 0x4d, 0xb2, 0x11, 0x9a, 0xe4, 0x23, 0xb0, 0x1c, 0xd9, 0x01, 0xd0, 0x96, 0xe4, 0x8b, 0x15, 0x95, + 0x00, 0x67, 0x80, 0x3a, 0x59, 0x51, 0xc0, 0x43, 0xfd, 0x75, 0x5c, 0x51, 0x20, 0x18, 0x7a, 0x08, 0xd3, 0xe6, 0x27, + 0x10, 0x11, 0xb8, 0xab, 0x21, 0xc3, 0x8e, 0x6f, 0xb9, 0x24, 0x58, 0x73, 0xe9, 0x71, 0xd0, 0x63, 0xcd, 0x31, 0xe1, + 0x22, 0x05, 0x0b, 0x82, 0xd6, 0xa1, 0x12, 0xe2, 0xd9, 0x62, 0x0d, 0xb8, 0x11, 0xf9, 0xa2, 0x55, 0x36, 0x67, 0xd1, + 0x52, 0xc7, 0x9c, 0x50, 0x18, 0xa3, 0x0f, 0xea, 0xbc, 0x21, 0x62, 0x0b, 0xb0, 0x4d, 0x73, 0xcb, 0x19, 0xdd, 0x85, + 0x29, 0x47, 0xa9, 0xbe, 0x35, 0xe2, 0x8a, 0xcd, 0x94, 0xe3, 0xb6, 0xea, 0x0d, 0xc1, 0x97, 0x34, 0xae, 0x3a, 0x72, + 0x91, 0x25, 0x34, 0xf4, 0x41, 0xd1, 0x31, 0xb8, 0xb8, 0x48, 0x80, 0xdd, 0xf0, 0xab, 0x8b, 0x26, 0x35, 0x32, 0x7e, + 0x45, 0x50, 0x94, 0x98, 0xf5, 0x6e, 0xf8, 0x38, 0x21, 0x30, 0xd1, 0xc6, 0x7e, 0x46, 0xb5, 0x7e, 0x36, 0x4c, 0xfa, + 0x13, 0x7b, 0xa0, 0x8b, 0x84, 0x40, 0xf5, 0x89, 0x3d, 0x80, 0xed, 0xdf, 0x5b, 0x90, 0xa6, 0xe8, 0x5b, 0xd0, 0xb5, + 0x05, 0xa1, 0xfe, 0x47, 0x10, 0xac, 0x6a, 0xcb, 0x01, 0x72, 0xf3, 0x2d, 0x58, 0x1c, 0x41, 0x0c, 0x59, 0x9d, 0xc5, + 0x21, 0xe6, 0x26, 0xfe, 0x46, 0x23, 0x8c, 0xed, 0x86, 0xa3, 0x61, 0xbe, 0xf0, 0x5c, 0xf7, 0xa0, 0x56, 0x1f, 0x04, + 0xd9, 0x4d, 0xb5, 0x4d, 0x2b, 0xeb, 0x7b, 0xae, 0x1d, 0xbc, 0x70, 0x5a, 0xbd, 0xda, 0x1d, 0xad, 0xc4, 0x92, 0x1c, + 0xa0, 0xf8, 0xeb, 0xec, 0xd9, 0xda, 0xa8, 0x1d, 0x48, 0xb3, 0x6a, 0x32, 0x8f, 0x63, 0xcb, 0xb9, 0xfc, 0x6b, 0x50, + 0xbf, 0xfa, 0x29, 0x92, 0x25, 0xe5, 0x35, 0x19, 0x40, 0x34, 0x64, 0x03, 0x8e, 0xd1, 0x9f, 0xb5, 0x97, 0x9a, 0x41, + 0xc7, 0xc7, 0x34, 0x07, 0x32, 0x5d, 0xb6, 0xf0, 0x29, 0x53, 0x3b, 0xa8, 0x7c, 0x31, 0xad, 0x62, 0x38, 0x1e, 0x77, + 0x95, 0x15, 0x1a, 0xbd, 0xad, 0xd4, 0x02, 0xf6, 0xbf, 0xe1, 0xfa, 0x74, 0x86, 0x10, 0x97, 0x00, 0x6a, 0x40, 0xec, + 0xf4, 0x9d, 0x1d, 0x2e, 0x17, 0xe5, 0xee, 0xca, 0x97, 0xe4, 0xfe, 0x9d, 0xe1, 0xa5, 0x83, 0x3a, 0x34, 0xd9, 0x5f, + 0xf3, 0x75, 0xf7, 0xc8, 0x2e, 0x59, 0x34, 0x2e, 0x77, 0x58, 0xb9, 0xbf, 0xf6, 0xef, 0xae, 0x84, 0x51, 0x20, 0xa9, + 0x40, 0xdc, 0x80, 0x51, 0xf2, 0x38, 0xc2, 0xcd, 0x4f, 0xc7, 0x2d, 0xd8, 0x8b, 0x8a, 0xc1, 0x06, 0x14, 0x11, 0x4c, + 0x36, 0x53, 0x84, 0xe2, 0x10, 0xb9, 0x1a, 0xdd, 0x82, 0x0d, 0x41, 0x88, 0x6e, 0xdc, 0x89, 0x99, 0xb0, 0x29, 0x2c, + 0xda, 0x04, 0x3c, 0x16, 0xe5, 0xbe, 0x52, 0xeb, 0x60, 0xb7, 0xd4, 0x3a, 0xdb, 0x25, 0xb5, 0x26, 0x77, 0xaa, 0xfb, + 0xc4, 0x5f, 0x28, 0x1e, 0x79, 0x82, 0x38, 0x57, 0x1d, 0xf3, 0x4a, 0xa2, 0x6e, 0xf4, 0xbe, 0x12, 0xad, 0x6a, 0xbd, + 0x91, 0x95, 0x20, 0x8a, 0xbf, 0x15, 0x06, 0x45, 0x28, 0xd4, 0x55, 0xd9, 0xf8, 0x55, 0x21, 0x1b, 0x27, 0xae, 0xa6, + 0x70, 0xa4, 0x11, 0xd4, 0xbf, 0xe2, 0xa4, 0x26, 0xb9, 0x83, 0xc2, 0x59, 0xad, 0x18, 0xa9, 0xe2, 0x7e, 0x55, 0x30, + 0x1a, 0x8a, 0x53, 0x9f, 0xe0, 0x32, 0xca, 0xbe, 0x7d, 0xe5, 0xaa, 0x85, 0xf7, 0x55, 0x51, 0x0e, 0x52, 0x77, 0x1c, + 0xb2, 0x2c, 0x56, 0xb7, 0x4d, 0xd9, 0xfd, 0x46, 0x7d, 0xad, 0x6c, 0x12, 0xe9, 0x27, 0x43, 0x00, 0x16, 0x62, 0xfa, + 0x8a, 0x5e, 0x5b, 0xda, 0x40, 0xe0, 0x20, 0x1b, 0xdc, 0xfa, 0x76, 0x4b, 0xe7, 0x29, 0x5f, 0x42, 0xa1, 0x85, 0x57, + 0x65, 0x10, 0x08, 0xdf, 0x9b, 0x75, 0xc3, 0x2d, 0x8f, 0x97, 0x3c, 0xbf, 0xdf, 0x41, 0xbc, 0xa8, 0xb9, 0xaa, 0x22, + 0x1f, 0x4f, 0xa6, 0x4d, 0xe6, 0xb9, 0x58, 0xb5, 0xde, 0x29, 0x09, 0x71, 0xd6, 0xdc, 0x33, 0xa6, 0x2c, 0xa3, 0xe7, + 0x35, 0xba, 0xe2, 0xbb, 0x7c, 0xeb, 0x24, 0xcb, 0x08, 0x63, 0xdb, 0xdb, 0x59, 0xe2, 0x8f, 0x3e, 0x29, 0x43, 0x16, + 0x72, 0x4e, 0x90, 0x01, 0x97, 0x35, 0x05, 0x3d, 0x1f, 0x43, 0x41, 0xb2, 0xae, 0xd3, 0x4a, 0x15, 0xe9, 0x4b, 0xf7, + 0xa9, 0xdb, 0xf6, 0x5f, 0x4d, 0x0e, 0x2b, 0x42, 0xd1, 0x56, 0xa7, 0x2c, 0x32, 0xdf, 0x30, 0x8e, 0x6c, 0xb6, 0x9c, + 0x0f, 0xd7, 0xaa, 0x6c, 0x55, 0x11, 0xb9, 0xd6, 0xc5, 0xac, 0xea, 0x67, 0x27, 0x93, 0x49, 0x59, 0xd0, 0xe8, 0x6a, + 0x87, 0x28, 0x2c, 0x7c, 0xea, 0xba, 0x6e, 0x75, 0xec, 0xdb, 0xc1, 0x6e, 0xa3, 0xdc, 0xf6, 0xa4, 0x71, 0xc4, 0x08, + 0xdb, 0x5d, 0xf0, 0xab, 0x83, 0x23, 0x77, 0x8a, 0x93, 0x5d, 0x32, 0x8b, 0xe8, 0x91, 0x31, 0x44, 0x90, 0xb1, 0x79, + 0xda, 0x1d, 0x31, 0xd4, 0xc1, 0x38, 0xca, 0x81, 0x46, 0xc3, 0x01, 0x7b, 0x0a, 0xa6, 0x22, 0x9e, 0xd8, 0x15, 0xae, + 0x86, 0xf2, 0xf0, 0x9a, 0xf0, 0x5e, 0x7c, 0x04, 0x0f, 0xca, 0xba, 0x2e, 0xd3, 0xc6, 0x69, 0x75, 0xdc, 0x3f, 0x97, + 0xea, 0x69, 0x70, 0x01, 0xae, 0x85, 0x42, 0x9b, 0xe4, 0xb3, 0xf8, 0xff, 0x52, 0xfe, 0xff, 0x6a, 0xb1, 0x2a, 0xdb, + 0x8f, 0x9c, 0x80, 0x44, 0xbb, 0x38, 0x2d, 0x34, 0xea, 0xa6, 0x3d, 0x20, 0xad, 0x0c, 0x26, 0xaa, 0x02, 0x1d, 0x94, + 0xf4, 0xa5, 0x04, 0x20, 0x0d, 0xe2, 0x77, 0xa4, 0x98, 0x61, 0x89, 0x0b, 0x11, 0x62, 0x91, 0xbe, 0x0e, 0xe6, 0x60, + 0xbd, 0x3c, 0x41, 0xfd, 0x41, 0x69, 0x4f, 0x80, 0x36, 0xbe, 0x36, 0xb7, 0xbd, 0xc4, 0xfd, 0x55, 0xbd, 0x96, 0xe8, + 0x18, 0x40, 0xe6, 0xc1, 0x21, 0x44, 0x43, 0x02, 0xad, 0xb2, 0xb9, 0x69, 0x94, 0xf2, 0xad, 0xaa, 0x67, 0x13, 0x03, + 0xc3, 0xee, 0x9a, 0xab, 0x50, 0xdf, 0x42, 0x5b, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0x9f, 0x6d, 0x58, 0x62, 0x75, 0x3f, + 0x7a, 0xb8, 0xe4, 0xb8, 0x7f, 0x6d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0x28, 0x5f, 0xfc, 0x6b, 0xa3, 0x40, 0xef, 0xaa, + 0x24, 0xa1, 0xe3, 0xd6, 0xe2, 0x2d, 0x73, 0xaf, 0xda, 0xf3, 0x20, 0xda, 0xbf, 0xae, 0xbf, 0xda, 0xbb, 0x2e, 0x5c, + 0x18, 0x7b, 0x57, 0x86, 0x1b, 0x87, 0x2c, 0x17, 0xb2, 0xfe, 0x5f, 0x15, 0x81, 0xa2, 0xea, 0x75, 0xac, 0x63, 0x2b, + 0xa2, 0xf2, 0xaf, 0x96, 0x40, 0x7c, 0xee, 0x95, 0xe0, 0x41, 0x13, 0x39, 0xda, 0xf4, 0x63, 0xed, 0x44, 0x3b, 0x6e, + 0x6b, 0x47, 0xae, 0x4e, 0x5c, 0x58, 0x5f, 0xef, 0xb4, 0x0a, 0x6f, 0xc2, 0x43, 0x57, 0x3f, 0x3b, 0x9d, 0x8a, 0x4b, + 0x62, 0x12, 0x84, 0x21, 0xa1, 0x8a, 0x34, 0x4b, 0xe2, 0x4f, 0xac, 0xac, 0x66, 0xa1, 0x32, 0x6e, 0x04, 0xd2, 0x12, + 0x8f, 0x70, 0x76, 0x46, 0xfe, 0xa2, 0x8b, 0x67, 0x43, 0x2d, 0x04, 0x03, 0x4e, 0x2a, 0xc5, 0x4f, 0xc0, 0x1d, 0x3c, + 0xd4, 0xcf, 0x4e, 0x21, 0x84, 0xa1, 0x36, 0xee, 0xeb, 0x3f, 0xb6, 0x8e, 0x35, 0xaf, 0x73, 0x67, 0xb7, 0x47, 0xae, + 0xed, 0x39, 0x87, 0x9a, 0xeb, 0x1c, 0xd9, 0x2d, 0xe7, 0x58, 0x6b, 0x39, 0x1d, 0xf8, 0x77, 0xe4, 0x39, 0xaf, 0x34, + 0x17, 0x9e, 0x34, 0xcf, 0x69, 0xe3, 0xbf, 0x2d, 0xe7, 0xf8, 0xae, 0x4d, 0x37, 0xbd, 0x2f, 0xdd, 0xaa, 0x2a, 0xa3, + 0x00, 0x27, 0x10, 0xfd, 0xe0, 0xec, 0x74, 0x99, 0x32, 0x6d, 0xd5, 0xd7, 0x5f, 0xe9, 0xda, 0x2c, 0x61, 0x93, 0xbe, + 0xfe, 0xd4, 0x57, 0x4a, 0xbd, 0x93, 0xc6, 0xe2, 0xd6, 0x71, 0x63, 0x71, 0xfb, 0xa8, 0xb1, 0xf8, 0xb0, 0x53, 0x2e, + 0x3e, 0x98, 0xd2, 0x2b, 0x25, 0x83, 0xe0, 0xdc, 0xcf, 0x92, 0x60, 0x65, 0x78, 0x1a, 0xa0, 0x6b, 0x1b, 0xfe, 0x39, + 0x6e, 0x99, 0xb2, 0xd5, 0x10, 0x5a, 0x49, 0x68, 0x1c, 0x9f, 0x68, 0xde, 0xd1, 0x5f, 0x5a, 0x47, 0x23, 0xa8, 0x07, + 0xf9, 0x2e, 0xe1, 0xef, 0xae, 0x7d, 0x32, 0x72, 0x35, 0x68, 0xe8, 0xc1, 0x7f, 0xb3, 0x4e, 0x6b, 0x44, 0x0f, 0x2e, + 0xbc, 0xff, 0xe8, 0x1d, 0xa7, 0xae, 0xed, 0xc1, 0x7f, 0xbf, 0x49, 0x95, 0x3b, 0x28, 0xfc, 0xd5, 0x7e, 0x0f, 0x5d, + 0xad, 0x7d, 0x32, 0x6b, 0x39, 0xaf, 0xee, 0x8e, 0x9d, 0x93, 0x99, 0x77, 0xfc, 0x91, 0x9e, 0x42, 0xbb, 0xe5, 0xbc, + 0x82, 0xbf, 0x8f, 0x6d, 0x77, 0x66, 0x7b, 0xce, 0xc9, 0x5d, 0xdb, 0x69, 0x87, 0xf6, 0x91, 0x73, 0x02, 0x7f, 0xbf, + 0x01, 0x78, 0x01, 0xae, 0x3c, 0x41, 0xa9, 0x06, 0x1b, 0xa3, 0x62, 0xbf, 0xa1, 0x7e, 0xa4, 0x75, 0xa8, 0x75, 0x0e, + 0xff, 0x72, 0x72, 0x67, 0x1f, 0xce, 0xbc, 0xd6, 0x9d, 0xbd, 0xf1, 0xe7, 0x47, 0x80, 0xfc, 0xf6, 0x85, 0x03, 0x30, + 0x62, 0x46, 0x92, 0x3f, 0x0d, 0xac, 0xcb, 0x4d, 0x62, 0xf4, 0xf7, 0xbb, 0xc5, 0xe8, 0x3f, 0x2c, 0xf7, 0x11, 0xa3, + 0xbf, 0xff, 0xea, 0x62, 0xf4, 0xcb, 0xaa, 0x15, 0xf7, 0xfb, 0x6a, 0xe4, 0xf4, 0x5f, 0xd6, 0x55, 0x22, 0x39, 0xf0, + 0x8d, 0xeb, 0xab, 0xe5, 0x0d, 0xc4, 0xfe, 0x79, 0x1f, 0xf7, 0x7f, 0x58, 0x96, 0x4c, 0x94, 0x62, 0xc0, 0x00, 0xef, + 0x63, 0xc2, 0x00, 0xbf, 0x2d, 0xfb, 0x60, 0x17, 0xc1, 0x6f, 0xcd, 0x60, 0x6c, 0xcf, 0xfc, 0x70, 0x22, 0x6f, 0x5c, + 0x28, 0xe9, 0x61, 0x31, 0xd8, 0xcc, 0xc3, 0x65, 0x02, 0xca, 0x9a, 0xe5, 0x3c, 0x4a, 0xbb, 0x47, 0x2e, 0xa0, 0xf9, + 0xd6, 0x24, 0xc9, 0x2b, 0x8d, 0x1d, 0x11, 0x2d, 0xe9, 0x96, 0xdb, 0xf4, 0x6f, 0x7c, 0x8f, 0x26, 0x6b, 0xcd, 0xbd, + 0x7b, 0xf5, 0x7e, 0x35, 0xb0, 0x05, 0x11, 0x26, 0x7d, 0x40, 0x6c, 0x34, 0xbd, 0x2f, 0x1b, 0x8e, 0x55, 0x4c, 0x05, + 0x37, 0x8f, 0x14, 0x46, 0x52, 0x6d, 0xef, 0x95, 0x0d, 0xcf, 0x76, 0x4d, 0xb3, 0xe1, 0xf3, 0xa5, 0xe6, 0x5b, 0xac, + 0xde, 0x64, 0xc7, 0x55, 0x50, 0x55, 0xf2, 0x7e, 0x35, 0x02, 0xa4, 0xa0, 0x3d, 0x0b, 0xd3, 0xb8, 0x82, 0xf0, 0x71, + 0x35, 0xbc, 0x8d, 0x5d, 0xe5, 0x5d, 0xa9, 0x4f, 0xd5, 0x9c, 0xee, 0xc5, 0x1a, 0xe9, 0xc1, 0xe0, 0x37, 0x20, 0x6c, + 0xf8, 0x7d, 0x3c, 0x8c, 0x55, 0x38, 0xaf, 0x95, 0x7e, 0x89, 0xd4, 0xce, 0x67, 0xde, 0xba, 0x4e, 0xda, 0x6c, 0x34, + 0xa4, 0xf5, 0xd8, 0x5c, 0xdc, 0xd1, 0xf8, 0x79, 0x32, 0x5b, 0xcd, 0xc9, 0xb4, 0x18, 0x2d, 0x73, 0xb7, 0x75, 0x26, + 0xea, 0x3d, 0x85, 0x4d, 0x6c, 0xf1, 0x07, 0xd5, 0x6b, 0x7d, 0x3d, 0x81, 0x1c, 0xcd, 0x5d, 0x24, 0x22, 0x14, 0x0a, + 0xaa, 0x85, 0x36, 0xb6, 0xbd, 0x2d, 0xe6, 0x1f, 0x6a, 0xc7, 0xbc, 0x13, 0xb4, 0xd5, 0xdd, 0x66, 0x31, 0x22, 0x5d, + 0x1b, 0xd6, 0x25, 0x05, 0xaa, 0xd7, 0x39, 0xb6, 0xbc, 0x23, 0xcb, 0x39, 0xee, 0x98, 0xb9, 0x38, 0x70, 0x6a, 0x97, + 0x25, 0x80, 0x80, 0xc9, 0xae, 0x1c, 0x66, 0x10, 0x05, 0x59, 0xe0, 0x87, 0x39, 0xa0, 0xfa, 0x32, 0xcd, 0xfb, 0xcf, + 0x65, 0x9a, 0xc1, 0x1c, 0x05, 0x49, 0x86, 0xe6, 0xca, 0xf6, 0x90, 0x65, 0xf7, 0x8c, 0x45, 0x1b, 0x54, 0xb9, 0x55, + 0xeb, 0xe7, 0x3f, 0xce, 0x16, 0x34, 0x27, 0x3b, 0x8b, 0x61, 0x16, 0xf1, 0xfd, 0x21, 0x4c, 0x75, 0xf3, 0x81, 0xf5, + 0xd3, 0x26, 0x84, 0xfb, 0xcf, 0xdd, 0x08, 0x37, 0x63, 0xfb, 0x20, 0xdc, 0x7f, 0x7e, 0x75, 0x84, 0xfb, 0x93, 0x8a, + 0x70, 0x4b, 0x9e, 0x2a, 0x85, 0x4c, 0xf4, 0x03, 0x3e, 0x1b, 0x10, 0x72, 0xf8, 0xa5, 0x7e, 0x40, 0xe4, 0xa5, 0xae, + 0xa4, 0x82, 0xfd, 0x58, 0xca, 0x6d, 0x83, 0x2c, 0x3b, 0x86, 0x48, 0xa5, 0x3c, 0x1a, 0x90, 0x26, 0x55, 0x26, 0xfc, + 0x86, 0x3e, 0x2f, 0xa2, 0x2c, 0x74, 0xde, 0x73, 0xb6, 0x04, 0x54, 0x10, 0x3f, 0xc4, 0xc9, 0xdc, 0xc7, 0xf0, 0x70, + 0x3a, 0xe6, 0xc4, 0x83, 0x07, 0x17, 0xbc, 0xa3, 0x46, 0x71, 0x34, 0x96, 0x72, 0x74, 0xd6, 0xbf, 0x26, 0x7a, 0x50, + 0x7f, 0x60, 0x7e, 0xa2, 0x5b, 0xf4, 0x1a, 0x16, 0xf7, 0x45, 0xdb, 0x7d, 0xd1, 0x3a, 0x7c, 0x71, 0xe4, 0xc2, 0xff, + 0x3c, 0xd6, 0xce, 0x2d, 0x5e, 0x71, 0x1e, 0x47, 0x90, 0x96, 0x43, 0xd4, 0xdc, 0x54, 0xed, 0x9e, 0xb1, 0x4f, 0x45, + 0xad, 0xe3, 0xe6, 0x4a, 0x63, 0xff, 0xa1, 0xa8, 0xd3, 0x58, 0x63, 0x16, 0x2f, 0x95, 0x61, 0x35, 0x8c, 0x26, 0x88, + 0x96, 0x20, 0x19, 0x52, 0x6a, 0xa8, 0xaf, 0xf9, 0x74, 0x8b, 0x79, 0xb1, 0x76, 0x7e, 0x53, 0xe4, 0xfe, 0x11, 0x39, + 0x48, 0x76, 0x42, 0x90, 0x0b, 0xd5, 0x5d, 0x8c, 0x1c, 0x8e, 0xd9, 0x6f, 0x34, 0xc8, 0xbc, 0x57, 0x24, 0x78, 0xc7, + 0x05, 0xca, 0x92, 0x65, 0x34, 0xa2, 0x1c, 0xee, 0xfe, 0x30, 0x35, 0x82, 0x03, 0x88, 0x1d, 0x8a, 0x1f, 0x36, 0x71, + 0xd5, 0xfc, 0x33, 0xb7, 0x48, 0x94, 0x90, 0x8a, 0x55, 0xf1, 0x5f, 0x64, 0x56, 0x42, 0xe9, 0x55, 0x71, 0x69, 0xed, + 0xbe, 0xff, 0x42, 0x36, 0x7c, 0x91, 0x59, 0x90, 0xe2, 0x14, 0x96, 0xfb, 0xf9, 0x73, 0xaa, 0x05, 0x49, 0x07, 0x69, + 0x5a, 0xe7, 0xa3, 0x22, 0xf8, 0x98, 0xe6, 0x4f, 0x63, 0x8a, 0x3f, 0xd6, 0x1d, 0x59, 0xf1, 0xcb, 0x97, 0x67, 0x7d, + 0xcf, 0xe4, 0x29, 0x33, 0x4b, 0xf9, 0x9d, 0x2e, 0xf7, 0x53, 0x8d, 0x9b, 0x8d, 0x4e, 0x5b, 0x8b, 0x20, 0x9a, 0x0a, + 0xcd, 0xb4, 0xc4, 0x5e, 0x90, 0x6f, 0x81, 0x54, 0x60, 0xbe, 0x50, 0x51, 0x8b, 0x3a, 0x77, 0x2c, 0x81, 0x74, 0x9f, + 0x7d, 0xbd, 0xed, 0xb8, 0x8e, 0xab, 0xcb, 0x86, 0x93, 0x60, 0xda, 0x5f, 0xc7, 0x99, 0x0f, 0x99, 0x6b, 0xc2, 0x78, + 0x0a, 0x9e, 0x1f, 0x59, 0x90, 0x85, 0x90, 0x06, 0x05, 0x5c, 0x40, 0xe6, 0xc4, 0x35, 0xe6, 0xdc, 0x1e, 0xd7, 0x4f, + 0x3e, 0x61, 0x2a, 0x3c, 0xe1, 0xf4, 0x85, 0xf1, 0x70, 0x7e, 0x84, 0xcb, 0xd0, 0xd0, 0x0d, 0x48, 0xc4, 0xc8, 0x92, + 0xd4, 0x56, 0xed, 0xdb, 0xbb, 0x1a, 0xb4, 0x81, 0x24, 0xe9, 0xd8, 0xc1, 0x24, 0xf1, 0xe7, 0x10, 0x31, 0x7c, 0x9d, + 0x5b, 0x1c, 0xd3, 0xea, 0x1c, 0xd5, 0x6a, 0xde, 0xab, 0x23, 0x4b, 0x6b, 0x79, 0x96, 0xe6, 0x02, 0xba, 0xd5, 0x73, + 0x6b, 0x9d, 0xdf, 0xf4, 0x76, 0xa9, 0xe8, 0x08, 0xbf, 0x3c, 0xa5, 0x79, 0x90, 0x72, 0x8e, 0x0b, 0x3f, 0x33, 0x0a, + 0x6f, 0x68, 0x28, 0xb1, 0xbc, 0x03, 0x12, 0xd3, 0x5f, 0xb1, 0x55, 0x66, 0x62, 0x9a, 0x10, 0x5e, 0x25, 0x30, 0xd7, + 0xe8, 0x9a, 0x16, 0x44, 0x5a, 0xf0, 0xf9, 0xb3, 0x11, 0x80, 0xf9, 0x7d, 0x5f, 0x81, 0x0f, 0x3c, 0x9b, 0x25, 0x80, + 0x05, 0x85, 0x62, 0x09, 0x81, 0x05, 0xbe, 0x31, 0xf0, 0x6f, 0x51, 0x2c, 0x7e, 0x70, 0xc5, 0x9e, 0x13, 0xfa, 0xd1, + 0x14, 0x50, 0x9a, 0x1f, 0x4d, 0x6b, 0x06, 0x04, 0xe4, 0x5d, 0x57, 0x29, 0x2d, 0xba, 0x2a, 0x94, 0xfb, 0xe9, 0xf7, + 0x0f, 0x57, 0x94, 0x06, 0x09, 0x52, 0x6e, 0xfb, 0x63, 0x74, 0x05, 0x2b, 0x74, 0x0f, 0x2f, 0xfb, 0xdf, 0x9c, 0xce, + 0x59, 0xe6, 0x93, 0xe0, 0x12, 0x58, 0x3c, 0x20, 0x07, 0xb4, 0x91, 0x48, 0x61, 0x4a, 0x0c, 0xde, 0x98, 0xdd, 0x05, + 0x23, 0xce, 0xa7, 0x59, 0x1a, 0xbf, 0xa7, 0x6c, 0xb4, 0x51, 0xea, 0x7b, 0x16, 0x99, 0xc8, 0x8e, 0x7c, 0x0c, 0x82, + 0xd8, 0x8f, 0x62, 0xfd, 0xec, 0x1b, 0xe9, 0x4d, 0xb4, 0x69, 0x11, 0x20, 0x17, 0xe1, 0x75, 0xc2, 0xc2, 0x7f, 0xf5, + 0xbf, 0x81, 0x8b, 0xfb, 0x9b, 0x1b, 0xdd, 0xec, 0x65, 0x0e, 0xf2, 0x31, 0xdf, 0x34, 0xe4, 0xe4, 0x43, 0x1e, 0x95, + 0x33, 0x9b, 0x6d, 0x85, 0xd9, 0x84, 0xdf, 0xbb, 0x59, 0xd7, 0xb3, 0x53, 0xbc, 0xd0, 0xce, 0x80, 0xbb, 0x58, 0x97, + 0x78, 0x4e, 0xaf, 0x87, 0x0c, 0xea, 0x30, 0xf4, 0x47, 0x9f, 0x04, 0x87, 0xaa, 0x3e, 0xec, 0xc3, 0x8b, 0x4a, 0xca, + 0xae, 0x71, 0x2f, 0xe3, 0x56, 0x5e, 0xe3, 0x97, 0xf1, 0x53, 0xf7, 0xb3, 0x20, 0x93, 0xcc, 0x30, 0x3e, 0xe4, 0xa0, + 0xcd, 0xc1, 0xf1, 0x15, 0xec, 0x0f, 0x30, 0xa8, 0xde, 0xc9, 0x5f, 0x3a, 0x77, 0x9e, 0x3b, 0x6b, 0x79, 0x0e, 0xb0, + 0x39, 0xb3, 0xb6, 0x73, 0x1c, 0xda, 0x6d, 0xe7, 0x18, 0xfe, 0x3e, 0x02, 0xeb, 0x65, 0xb7, 0x9c, 0xc3, 0x8f, 0x5e, + 0x2b, 0xb4, 0x4f, 0x9c, 0x63, 0xf8, 0xbb, 0xa4, 0x56, 0xbf, 0x20, 0xd3, 0x03, 0x0c, 0xcf, 0x37, 0x25, 0x2c, 0xa0, + 0xfc, 0x96, 0x5a, 0x04, 0xab, 0x74, 0xbd, 0x35, 0x68, 0x22, 0x00, 0x65, 0xe8, 0x96, 0x08, 0x51, 0x18, 0xf5, 0x0c, + 0x48, 0x12, 0x8e, 0xe1, 0xed, 0x85, 0x41, 0x46, 0x54, 0x24, 0xbc, 0xdf, 0x7c, 0x8c, 0x78, 0x9b, 0xe6, 0x70, 0xe0, + 0x22, 0x6f, 0x12, 0xa9, 0x2e, 0xfe, 0xb6, 0xc0, 0x10, 0x3b, 0x22, 0x80, 0xb9, 0x82, 0x95, 0x8a, 0xdc, 0x7d, 0xf9, + 0xee, 0x81, 0xa3, 0xdf, 0x28, 0x93, 0xb9, 0x63, 0xbe, 0x6a, 0xdf, 0x5c, 0x9d, 0x21, 0x7b, 0xff, 0xbd, 0xfd, 0x60, + 0xca, 0x54, 0xea, 0x47, 0xc4, 0x1a, 0x1d, 0x07, 0x89, 0x1c, 0x9e, 0x82, 0xa2, 0xbd, 0xe6, 0x38, 0xea, 0x26, 0x24, + 0xd9, 0xb8, 0x00, 0x2a, 0xf9, 0xce, 0x0f, 0x15, 0xd3, 0x0b, 0xa5, 0xe5, 0x13, 0x89, 0xf9, 0x9f, 0x3f, 0x2f, 0x06, + 0x67, 0x57, 0xc6, 0x7d, 0xea, 0x75, 0xe0, 0xda, 0xed, 0xb0, 0xf6, 0x56, 0x2b, 0xa0, 0xdd, 0xc1, 0x6a, 0x8b, 0x60, + 0x96, 0x42, 0xd3, 0x2f, 0x74, 0x8c, 0x1b, 0x4d, 0x91, 0x6a, 0x1a, 0x46, 0x08, 0xf3, 0x5b, 0x61, 0x75, 0x74, 0xb3, + 0x17, 0x09, 0x85, 0x59, 0xb4, 0x25, 0x40, 0x2f, 0xe7, 0xc5, 0x74, 0x00, 0xcd, 0x96, 0x79, 0xec, 0x70, 0x69, 0xfc, + 0x5f, 0x4f, 0x02, 0xdd, 0x8b, 0x40, 0xc3, 0x57, 0x39, 0xad, 0x25, 0x77, 0x13, 0x79, 0xaf, 0xd2, 0x85, 0xca, 0xd2, + 0x73, 0x1d, 0x8a, 0x20, 0xfb, 0x12, 0x26, 0x5c, 0x93, 0xe6, 0x4d, 0xf2, 0xb6, 0x28, 0x0a, 0xac, 0x00, 0x22, 0x54, + 0x1b, 0xc2, 0xd5, 0xc9, 0x7c, 0xfe, 0x7c, 0xe3, 0x25, 0x44, 0xea, 0x64, 0x35, 0xef, 0xa4, 0xae, 0xe2, 0x37, 0x5d, + 0x45, 0x31, 0xb2, 0x5f, 0xc4, 0x1a, 0xc2, 0x2a, 0x8b, 0xf6, 0x1e, 0xfe, 0x1c, 0x32, 0x3f, 0x73, 0xb8, 0x1e, 0xc4, + 0x50, 0x2e, 0x77, 0xcb, 0x63, 0x6d, 0xb0, 0xc7, 0xe2, 0x91, 0xb8, 0x78, 0xa4, 0xbb, 0x67, 0xeb, 0x8f, 0x4b, 0xee, + 0x87, 0x0c, 0x7d, 0x7c, 0x76, 0x8b, 0xe0, 0x29, 0xef, 0x32, 0x9f, 0x22, 0x6c, 0xa8, 0x57, 0x6e, 0x9c, 0xf9, 0x22, + 0xcb, 0x09, 0xd0, 0xe5, 0xbd, 0x46, 0x85, 0xa1, 0xe2, 0xab, 0x7c, 0xf6, 0xee, 0xea, 0x3b, 0x8d, 0xef, 0x7f, 0xd2, + 0x6f, 0x21, 0x23, 0x43, 0x31, 0xf9, 0xfb, 0x14, 0x93, 0x5f, 0xe3, 0x49, 0x2e, 0x20, 0xb2, 0x7d, 0x7e, 0x40, 0x10, + 0xd4, 0x35, 0x16, 0x8d, 0x48, 0xeb, 0x37, 0x5f, 0x86, 0x59, 0xb0, 0xf0, 0x93, 0xec, 0x00, 0x9a, 0xda, 0x80, 0xe4, + 0xf4, 0x4d, 0x1e, 0xcc, 0xa4, 0x38, 0x14, 0x42, 0xb5, 0x2c, 0x12, 0x9a, 0xc3, 0x49, 0x10, 0x4a, 0xc5, 0xa1, 0xf8, + 0x80, 0x3f, 0x1a, 0xb1, 0x45, 0xd6, 0xd7, 0xfd, 0x05, 0xe4, 0x66, 0xc0, 0x68, 0xcb, 0x07, 0xf1, 0x28, 0x63, 0x99, + 0x9d, 0x66, 0x09, 0xf3, 0xe7, 0xba, 0x0c, 0x34, 0x5a, 0xef, 0x2f, 0x5d, 0x0e, 0xe7, 0x41, 0x26, 0x23, 0xf5, 0xd1, + 0x04, 0x41, 0x85, 0x07, 0x43, 0x3c, 0x1b, 0xe4, 0x1c, 0x84, 0x97, 0xf1, 0xb4, 0xb2, 0xa3, 0x0a, 0xca, 0xe5, 0x1c, + 0xe3, 0xc0, 0xf2, 0x78, 0xfc, 0x63, 0xf4, 0xc8, 0xb9, 0xe5, 0x5e, 0xd7, 0x32, 0xa0, 0xa0, 0x7e, 0x76, 0xca, 0xd9, + 0x5b, 0x0d, 0x03, 0x05, 0xe8, 0x1d, 0x17, 0x22, 0xdd, 0x6e, 0xf2, 0xc7, 0x3e, 0xe0, 0x95, 0xe1, 0x6a, 0xa2, 0x9e, + 0x31, 0x0a, 0x39, 0x8d, 0xe5, 0x0a, 0x08, 0xa1, 0x92, 0x8a, 0x77, 0xe6, 0x9d, 0x49, 0x07, 0x20, 0x1c, 0x15, 0xd2, + 0x4a, 0x9f, 0x3f, 0xbf, 0x1e, 0xfc, 0xe7, 0xdf, 0x10, 0x2a, 0x7d, 0xe6, 0x09, 0x2f, 0xe8, 0x6b, 0xb5, 0x16, 0xa7, + 0x3e, 0xad, 0x01, 0xaa, 0xf7, 0xd9, 0x58, 0x84, 0x05, 0x11, 0x5b, 0x2b, 0x1f, 0xdc, 0x88, 0x50, 0x4f, 0x90, 0x0e, + 0xc1, 0x14, 0xbe, 0xda, 0x03, 0x58, 0xde, 0x81, 0x08, 0x11, 0xa0, 0xfd, 0xba, 0xfa, 0xfe, 0x18, 0x42, 0x01, 0xd7, + 0xb2, 0x14, 0x28, 0x03, 0xc4, 0x3d, 0x74, 0x76, 0xea, 0x73, 0xe1, 0x2b, 0x90, 0x1f, 0x69, 0xf7, 0x00, 0xa6, 0x39, + 0x8b, 0xe7, 0xcc, 0x09, 0xe2, 0x83, 0x7b, 0x36, 0xb4, 0xfd, 0x45, 0x40, 0xf2, 0x65, 0x94, 0xbb, 0x69, 0x44, 0xf9, + 0x49, 0x05, 0x2d, 0xd1, 0xd7, 0x79, 0x01, 0xca, 0xb8, 0x00, 0x14, 0xfc, 0xf4, 0xcf, 0xca, 0xd1, 0x03, 0x1d, 0x11, + 0xbf, 0xbe, 0x8c, 0xe5, 0xcf, 0x29, 0x08, 0xa0, 0x88, 0xf7, 0x57, 0x3c, 0xd8, 0xf1, 0x64, 0xa2, 0x46, 0xfc, 0x73, + 0xca, 0xdf, 0x97, 0x50, 0x29, 0xf6, 0x6c, 0xbc, 0xa0, 0x2f, 0xd5, 0x3f, 0x21, 0x7f, 0x42, 0xee, 0x5e, 0x1e, 0x1c, + 0x12, 0xce, 0x73, 0x2d, 0x72, 0xa0, 0x04, 0xc9, 0x53, 0xaa, 0xc4, 0x11, 0x45, 0x35, 0x4e, 0xf5, 0x06, 0xd2, 0xe4, + 0x49, 0xbf, 0x4f, 0x78, 0xac, 0x8a, 0xce, 0x00, 0x4a, 0x0d, 0xb1, 0xfc, 0x61, 0xb2, 0x19, 0x34, 0xb4, 0xc9, 0x83, + 0x0b, 0x1b, 0x55, 0xa7, 0x53, 0x1f, 0xe3, 0x81, 0x2f, 0xf6, 0x57, 0x69, 0x07, 0xc2, 0xce, 0xe2, 0x0b, 0x0b, 0x08, + 0x5c, 0xf4, 0x53, 0xc1, 0xe3, 0xda, 0xb7, 0x84, 0xb2, 0xed, 0xd0, 0x7f, 0x88, 0x15, 0xcd, 0x3a, 0x77, 0xb2, 0xbf, + 0xc4, 0xd2, 0x2b, 0xe1, 0xdc, 0x56, 0x3b, 0x49, 0x32, 0x1e, 0x7a, 0xfd, 0x34, 0xa9, 0x01, 0xcc, 0x77, 0x1d, 0x26, + 0xb5, 0x6e, 0x79, 0x32, 0x88, 0x1d, 0xf3, 0xe2, 0xa0, 0x95, 0x5e, 0xe2, 0xb9, 0xcf, 0x4f, 0x0f, 0x60, 0x7e, 0x10, + 0x18, 0xa0, 0x44, 0x19, 0x05, 0x26, 0x44, 0x1f, 0xf0, 0x53, 0xb2, 0x0e, 0xb8, 0x18, 0x0b, 0xa2, 0x0e, 0x39, 0x47, + 0x19, 0x9a, 0xb4, 0x54, 0xa5, 0x4e, 0xac, 0xb8, 0xcd, 0x54, 0xde, 0xee, 0xfc, 0x01, 0xbf, 0x2d, 0x31, 0x79, 0x40, + 0xde, 0xcb, 0x98, 0xf0, 0xbb, 0xbd, 0xcc, 0x36, 0xb8, 0xe6, 0x6e, 0xaa, 0x42, 0x04, 0xeb, 0x96, 0x0a, 0xc5, 0x3e, + 0xde, 0x56, 0xab, 0x20, 0x8d, 0x64, 0xb5, 0x85, 0x6f, 0xe8, 0x4f, 0x71, 0xc7, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0xbb, + 0xcc, 0xfa, 0x50, 0x55, 0x08, 0xdb, 0xfd, 0xc5, 0x82, 0x2a, 0x9b, 0xbd, 0xd3, 0x03, 0xe2, 0x3b, 0xcf, 0x68, 0x87, + 0x9d, 0x9d, 0x82, 0x75, 0x21, 0x2d, 0xba, 0xbf, 0x58, 0xf0, 0x25, 0xa5, 0x5f, 0xf4, 0xe6, 0x60, 0x96, 0xcd, 0xc3, + 0xb3, 0xff, 0x03, 0x1c, 0x2a, 0x1a, 0x60, 0x9f, 0x5a, 0x03, 0x00}; } // namespace web_server } // namespace esphome From 618102fe8c6d1fcafa51d2a0e025e08a1a14588d Mon Sep 17 00:00:00 2001 From: Mischa Siekmann <45062894+gnumpi@users.noreply.github.com> Date: Sun, 9 Jun 2024 08:34:21 +0200 Subject: [PATCH 009/151] fix: arduino media player still sets wrong state. (#6875) --- .../i2s_audio/media_player/i2s_audio_media_player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp index ef494fac2e..5140a923b4 100644 --- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp @@ -28,7 +28,7 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) { } } - if (this->state == media_player::MEDIA_PLAYER_STATE_ANNOUNCING) { + if (play_state == media_player::MEDIA_PLAYER_STATE_ANNOUNCING) { this->is_announcement_ = true; } From 7b45498de67ccdf10271e61577c66b5e216bc6db Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 10 Jun 2024 08:15:29 +1200 Subject: [PATCH 010/151] [http_request] Add esp-idf and rp2040 support (#3256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Implement http_request component for esp-idf * Fix ifdefs * Lint * clang * Set else to fail with error message * Use unique_ptr * Fix * Tidy up casting, explicit HttpResponse lifetime (#3265) Co-authored-by: Daniel Cousens * Remove unique_ptr wrapper * Fix * Use reference * Add duration code into new split files * Add config for tx/rx buffer on idf * Fix * Try reserve response data with rx buffer size * Update http_request.h * Move client cleanup to be earlier * Move capture_response to bool on struct and remove global * Fix returns * Change quotes to brackets * Rework http request * Remove http request from old test yamls * Update component tests * Validate md5 length when hardcoded string * Linting * Add duration_ms to container * More lint * const * Remove default arguments and add helper functions for get and post * Add virtual destructor to HttpContainer * Undo const HEADER_KEYS * 🤦 * Update esphome/components/http_request/ota/ota_http_request.cpp Co-authored-by: Keith Burzinski * Update esphome/components/http_request/ota/ota_http_request.cpp Co-authored-by: Keith Burzinski * lint * Move header keys inline * Add missing WatchdogManagers * CAPS * Fix "follow redirects" string in config dump * IDF 5+ fix --------- Co-authored-by: Daniel Cousens <413395+dcousens@users.noreply.github.com> Co-authored-by: Daniel Cousens Co-authored-by: Keith Burzinski --- esphome/codegen.py | 1 + esphome/components/http_request/__init__.py | 137 +++++++++++---- .../components/http_request/http_request.cpp | 132 +------------- .../components/http_request/http_request.h | 141 +++++++++------ .../http_request/http_request_arduino.cpp | 161 ++++++++++++++++++ .../http_request/http_request_arduino.h | 40 +++++ .../http_request/http_request_idf.cpp | 155 +++++++++++++++++ .../http_request/http_request_idf.h | 34 ++++ .../components/http_request/ota/__init__.py | 109 ++---------- .../http_request/ota/ota_http_request.cpp | 110 +++++------- .../http_request/ota/ota_http_request.h | 24 +-- .../ota/ota_http_request_arduino.cpp | 134 --------------- .../ota/ota_http_request_arduino.h | 42 ----- .../http_request/ota/ota_http_request_idf.cpp | 86 ---------- .../http_request/ota/ota_http_request_idf.h | 24 --- .../http_request/{ota => }/watchdog.cpp | 19 ++- .../http_request/{ota => }/watchdog.h | 5 +- esphome/cpp_types.py | 1 + tests/components/http_request/common.yaml | 75 ++++++++ .../http_request/common_http_request.yaml | 33 ---- tests/components/http_request/common_ota.yaml | 36 ---- .../http_request/test-nossl.esp8266.yaml | 40 +---- .../http_request/test.esp32-c3-idf.yaml | 2 +- .../http_request/test.esp32-c3.yaml | 3 +- .../http_request/test.esp32-idf.yaml | 2 +- tests/components/http_request/test.esp32.yaml | 3 +- .../components/http_request/test.esp8266.yaml | 3 +- .../components/http_request/test.rp2040.yaml | 2 +- tests/test1.yaml | 29 ---- tests/test3.1.yaml | 24 --- tests/test7.yaml | 23 +-- 31 files changed, 748 insertions(+), 882 deletions(-) create mode 100644 esphome/components/http_request/http_request_arduino.cpp create mode 100644 esphome/components/http_request/http_request_arduino.h create mode 100644 esphome/components/http_request/http_request_idf.cpp create mode 100644 esphome/components/http_request/http_request_idf.h delete mode 100644 esphome/components/http_request/ota/ota_http_request_arduino.cpp delete mode 100644 esphome/components/http_request/ota/ota_http_request_arduino.h delete mode 100644 esphome/components/http_request/ota/ota_http_request_idf.cpp delete mode 100644 esphome/components/http_request/ota/ota_http_request_idf.h rename esphome/components/http_request/{ota => }/watchdog.cpp (79%) rename esphome/components/http_request/{ota => }/watchdog.h (84%) create mode 100644 tests/components/http_request/common.yaml delete mode 100644 tests/components/http_request/common_http_request.yaml delete mode 100644 tests/components/http_request/common_ota.yaml diff --git a/esphome/codegen.py b/esphome/codegen.py index dc17f28a03..b552490129 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -58,6 +58,7 @@ from esphome.cpp_types import ( # noqa bool_, int_, std_ns, + std_shared_ptr, std_string, std_vector, uint8, diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 0c3e249512..37487ec9a7 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -1,9 +1,8 @@ -import urllib.parse as urlparse - import esphome.codegen as cg import esphome.config_validation as cv from esphome import automation from esphome.const import ( + __version__, CONF_ID, CONF_TIMEOUT, CONF_METHOD, @@ -12,67 +11,91 @@ from esphome.const import ( CONF_ESP8266_DISABLE_SSL_SUPPORT, ) from esphome.core import Lambda, CORE +from esphome.components import esp32 DEPENDENCIES = ["network"] AUTO_LOAD = ["json"] http_request_ns = cg.esphome_ns.namespace("http_request") HttpRequestComponent = http_request_ns.class_("HttpRequestComponent", cg.Component) +HttpRequestArduino = http_request_ns.class_("HttpRequestArduino", HttpRequestComponent) +HttpRequestIDF = http_request_ns.class_("HttpRequestIDF", HttpRequestComponent) + +HttpContainer = http_request_ns.class_("HttpContainer") + HttpRequestSendAction = http_request_ns.class_( "HttpRequestSendAction", automation.Action ) HttpRequestResponseTrigger = http_request_ns.class_( - "HttpRequestResponseTrigger", automation.Trigger + "HttpRequestResponseTrigger", + automation.Trigger.template( + cg.std_shared_ptr.template(HttpContainer), cg.std_string + ), ) -CONF_HEADERS = "headers" +CONF_HTTP_REQUEST_ID = "http_request_id" + CONF_USERAGENT = "useragent" -CONF_BODY = "body" -CONF_JSON = "json" CONF_VERIFY_SSL = "verify_ssl" -CONF_ON_RESPONSE = "on_response" CONF_FOLLOW_REDIRECTS = "follow_redirects" CONF_REDIRECT_LIMIT = "redirect_limit" +CONF_WATCHDOG_TIMEOUT = "watchdog_timeout" + +CONF_MAX_RESPONSE_BUFFER_SIZE = "max_response_buffer_size" +CONF_ON_RESPONSE = "on_response" +CONF_HEADERS = "headers" +CONF_BODY = "body" +CONF_JSON = "json" +CONF_CAPTURE_RESPONSE = "capture_response" def validate_url(value): - value = cv.string(value) - try: - parsed = list(urlparse.urlparse(value)) - except Exception as err: - raise cv.Invalid("Invalid URL") from err - - if not parsed[0] or not parsed[1]: - raise cv.Invalid("URL must have a URL scheme and host") - - if parsed[0] not in ["http", "https"]: - raise cv.Invalid("Scheme must be http or https") - - if not parsed[2]: - parsed[2] = "/" - - return urlparse.urlunparse(parsed) + value = cv.url(value) + if value.startswith("http://") or value.startswith("https://"): + return value + raise cv.Invalid("URL must start with 'http://' or 'https://'") -def validate_secure_url(config): - url_ = config[CONF_URL] +def validate_ssl_verification(config): + error_message = "" + + if CORE.is_esp32: + if not CORE.using_esp_idf and config[CONF_VERIFY_SSL]: + error_message = "ESPHome supports certificate verification only via ESP-IDF" + + if CORE.is_rp2040 and config[CONF_VERIFY_SSL]: + error_message = "ESPHome does not support certificate verification on RP2040" + if ( - config.get(CONF_VERIFY_SSL) - and not isinstance(url_, Lambda) - and url_.lower().startswith("https:") + CORE.is_esp8266 + and not config[CONF_ESP8266_DISABLE_SSL_SUPPORT] + and config[CONF_VERIFY_SSL] ): + error_message = "ESPHome does not support certificate verification on ESP8266" + + if len(error_message) > 0: raise cv.Invalid( - "Currently ESPHome doesn't support SSL verification. " - "Set 'verify_ssl: false' to make insecure HTTPS requests." + f"{error_message}. Set '{CONF_VERIFY_SSL}: false' to skip certificate validation and allow less secure HTTPS connections." ) + return config +def _declare_request_class(value): + if CORE.using_esp_idf: + return cv.declare_id(HttpRequestIDF)(value) + if CORE.is_esp8266 or CORE.is_esp32 or CORE.is_rp2040: + return cv.declare_id(HttpRequestArduino)(value) + return NotImplementedError + + CONFIG_SCHEMA = cv.All( cv.Schema( { - cv.GenerateID(): cv.declare_id(HttpRequestComponent), - cv.Optional(CONF_USERAGENT, "ESPHome"): cv.string, + cv.GenerateID(): _declare_request_class, + cv.Optional( + CONF_USERAGENT, f"ESPHome/{__version__} (https://esphome.io)" + ): cv.string, cv.Optional(CONF_FOLLOW_REDIRECTS, True): cv.boolean, cv.Optional(CONF_REDIRECT_LIMIT, 3): cv.int_, cv.Optional( @@ -81,12 +104,21 @@ CONFIG_SCHEMA = cv.All( cv.SplitDefault(CONF_ESP8266_DISABLE_SSL_SUPPORT, esp8266=False): cv.All( cv.only_on_esp8266, cv.boolean ), + cv.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + cv.Optional(CONF_WATCHDOG_TIMEOUT): cv.All( + cv.Any(cv.only_on_esp32, cv.only_on_rp2040), + cv.positive_not_null_time_period, + cv.positive_time_period_milliseconds, + ), } ).extend(cv.COMPONENT_SCHEMA), cv.require_framework_version( esp8266_arduino=cv.Version(2, 5, 1), esp32_arduino=cv.Version(0, 0, 0), + esp_idf=cv.Version(0, 0, 0), + rp2040_arduino=cv.Version(0, 0, 0), ), + validate_ssl_verification, ) @@ -100,11 +132,30 @@ async def to_code(config): if CORE.is_esp8266 and not config[CONF_ESP8266_DISABLE_SSL_SUPPORT]: cg.add_define("USE_HTTP_REQUEST_ESP8266_HTTPS") + if timeout_ms := config.get(CONF_WATCHDOG_TIMEOUT): + cg.add(var.set_watchdog_timeout(timeout_ms)) + if CORE.is_esp32: - cg.add_library("WiFiClientSecure", None) - cg.add_library("HTTPClient", None) + if CORE.using_esp_idf: + esp32.add_idf_sdkconfig_option( + "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE", + config.get(CONF_VERIFY_SSL), + ) + esp32.add_idf_sdkconfig_option( + "CONFIG_ESP_TLS_INSECURE", + not config.get(CONF_VERIFY_SSL), + ) + esp32.add_idf_sdkconfig_option( + "CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY", + not config.get(CONF_VERIFY_SSL), + ) + else: + cg.add_library("WiFiClientSecure", None) + cg.add_library("HTTPClient", None) if CORE.is_esp8266: cg.add_library("ESP8266HTTPClient", None) + if CORE.is_rp2040 and CORE.using_arduino: + cg.add_library("HTTPClient", None) await cg.register_component(var, config) @@ -116,12 +167,16 @@ HTTP_REQUEST_ACTION_SCHEMA = cv.Schema( cv.Optional(CONF_HEADERS): cv.All( cv.Schema({cv.string: cv.templatable(cv.string)}) ), - cv.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + cv.Optional(CONF_VERIFY_SSL): cv.invalid( + f"{CONF_VERIFY_SSL} has moved to the base component configuration." + ), + cv.Optional(CONF_CAPTURE_RESPONSE, default=False): cv.boolean, cv.Optional(CONF_ON_RESPONSE): automation.validate_automation( {cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(HttpRequestResponseTrigger)} ), + cv.Optional(CONF_MAX_RESPONSE_BUFFER_SIZE, default="1kB"): cv.validate_bytes, } -).add_extra(validate_secure_url) +) HTTP_REQUEST_GET_ACTION_SCHEMA = automation.maybe_conf( CONF_URL, HTTP_REQUEST_ACTION_SCHEMA.extend( @@ -173,6 +228,9 @@ async def http_request_action_to_code(config, action_id, template_arg, args): template_ = await cg.templatable(config[CONF_URL], args, cg.std_string) cg.add(var.set_url(template_)) cg.add(var.set_method(config[CONF_METHOD])) + cg.add(var.set_capture_response(config[CONF_CAPTURE_RESPONSE])) + cg.add(var.set_max_response_buffer_size(config[CONF_MAX_RESPONSE_BUFFER_SIZE])) + if CONF_BODY in config: template_ = await cg.templatable(config[CONF_BODY], args, cg.std_string) cg.add(var.set_body(template_)) @@ -196,7 +254,12 @@ async def http_request_action_to_code(config, action_id, template_arg, args): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID]) cg.add(var.register_response_trigger(trigger)) await automation.build_automation( - trigger, [(int, "status_code"), (cg.uint32, "duration_ms")], conf + trigger, + [ + (cg.std_shared_ptr.template(HttpContainer), "response"), + (cg.std_string, "body"), + ], + conf, ) return var diff --git a/esphome/components/http_request/http_request.cpp b/esphome/components/http_request/http_request.cpp index 46894a9afd..be8bef006e 100644 --- a/esphome/components/http_request/http_request.cpp +++ b/esphome/components/http_request/http_request.cpp @@ -1,9 +1,8 @@ -#ifdef USE_ARDUINO - #include "http_request.h" -#include "esphome/core/defines.h" + #include "esphome/core/log.h" -#include "esphome/components/network/util.h" + +#include namespace esphome { namespace http_request { @@ -14,131 +13,12 @@ void HttpRequestComponent::dump_config() { ESP_LOGCONFIG(TAG, "HTTP Request:"); ESP_LOGCONFIG(TAG, " Timeout: %ums", this->timeout_); ESP_LOGCONFIG(TAG, " User-Agent: %s", this->useragent_); - ESP_LOGCONFIG(TAG, " Follow Redirects: %d", this->follow_redirects_); + ESP_LOGCONFIG(TAG, " Follow redirects: %s", YESNO(this->follow_redirects_)); ESP_LOGCONFIG(TAG, " Redirect limit: %d", this->redirect_limit_); -} - -void HttpRequestComponent::set_url(std::string url) { - this->url_ = std::move(url); - this->secure_ = this->url_.compare(0, 6, "https:") == 0; - - if (!this->last_url_.empty() && this->url_ != this->last_url_) { - // Close connection if url has been changed - this->client_.setReuse(false); - this->client_.end(); + if (this->watchdog_timeout_ > 0) { + ESP_LOGCONFIG(TAG, " Watchdog Timeout: %" PRIu32 "ms", this->watchdog_timeout_); } - this->client_.setReuse(true); -} - -void HttpRequestComponent::send(const std::vector &response_triggers) { - if (!network::is_connected()) { - this->client_.end(); - this->status_set_warning(); - ESP_LOGW(TAG, "HTTP Request failed; Not connected to network"); - return; - } - - bool begin_status = false; - const String url = this->url_.c_str(); -#if defined(USE_ESP32) || (defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 6, 0)) -#if defined(USE_ESP32) || USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 7, 0) - if (this->follow_redirects_) { - this->client_.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); - } else { - this->client_.setFollowRedirects(HTTPC_DISABLE_FOLLOW_REDIRECTS); - } -#else - this->client_.setFollowRedirects(this->follow_redirects_); -#endif - this->client_.setRedirectLimit(this->redirect_limit_); -#endif -#if defined(USE_ESP32) - begin_status = this->client_.begin(url); -#elif defined(USE_ESP8266) - begin_status = this->client_.begin(*this->get_wifi_client_(), url); -#endif - - if (!begin_status) { - this->client_.end(); - this->status_set_warning(); - ESP_LOGW(TAG, "HTTP Request failed at the begin phase. Please check the configuration"); - return; - } - - this->client_.setTimeout(this->timeout_); -#if defined(USE_ESP32) - this->client_.setConnectTimeout(this->timeout_); -#endif - if (this->useragent_ != nullptr) { - this->client_.setUserAgent(this->useragent_); - } - for (const auto &header : this->headers_) { - this->client_.addHeader(header.name, header.value, false, true); - } - - uint32_t start_time = millis(); - int http_code = this->client_.sendRequest(this->method_, this->body_.c_str()); - uint32_t duration = millis() - start_time; - for (auto *trigger : response_triggers) - trigger->process(http_code, duration); - - if (http_code < 0) { - ESP_LOGW(TAG, "HTTP Request failed; URL: %s; Error: %s; Duration: %u ms", this->url_.c_str(), - HTTPClient::errorToString(http_code).c_str(), duration); - this->status_set_warning(); - return; - } - - if (http_code < 200 || http_code >= 300) { - ESP_LOGW(TAG, "HTTP Request failed; URL: %s; Code: %d; Duration: %u ms", this->url_.c_str(), http_code, duration); - this->status_set_warning(); - return; - } - - this->status_clear_warning(); - ESP_LOGD(TAG, "HTTP Request completed; URL: %s; Code: %d; Duration: %u ms", this->url_.c_str(), http_code, duration); -} - -#ifdef USE_ESP8266 -std::shared_ptr HttpRequestComponent::get_wifi_client_() { -#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS - if (this->secure_) { - if (this->wifi_client_secure_ == nullptr) { - this->wifi_client_secure_ = std::make_shared(); - this->wifi_client_secure_->setInsecure(); - this->wifi_client_secure_->setBufferSizes(512, 512); - } - return this->wifi_client_secure_; - } -#endif - - if (this->wifi_client_ == nullptr) { - this->wifi_client_ = std::make_shared(); - } - return this->wifi_client_; -} -#endif - -void HttpRequestComponent::close() { - this->last_url_ = this->url_; - this->client_.end(); -} - -const char *HttpRequestComponent::get_string() { -#if defined(ESP32) - // The static variable is here because HTTPClient::getString() returns a String on ESP32, - // and we need something to keep a buffer alive. - static String str; -#else - // However on ESP8266, HTTPClient::getString() returns a String& to a member variable. - // Leaving this the default so that any new platform either doesn't copy, or encounters a compilation error. - auto & -#endif - str = this->client_.getString(); - return str.c_str(); } } // namespace http_request } // namespace esphome - -#endif // USE_ARDUINO diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index b885de18e6..df6bc7dea7 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -1,27 +1,18 @@ #pragma once -#ifdef USE_ARDUINO - -#include "esphome/components/json/json_util.h" -#include "esphome/core/automation.h" -#include "esphome/core/component.h" -#include "esphome/core/defines.h" - #include #include #include #include #include -#ifdef USE_ESP32 -#include -#endif -#ifdef USE_ESP8266 -#include -#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS -#include -#endif -#endif +#include "esphome/components/json/json_util.h" +#include "esphome/core/application.h" +#include "esphome/core/automation.h" +#include "esphome/core/component.h" +#include "esphome/core/defines.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" namespace esphome { namespace http_request { @@ -31,9 +22,32 @@ struct Header { const char *value; }; -class HttpRequestResponseTrigger : public Trigger { +class HttpRequestComponent; + +class HttpContainer : public Parented { public: - void process(int32_t status_code, uint32_t duration_ms) { this->trigger(status_code, duration_ms); } + virtual ~HttpContainer() = default; + size_t content_length; + int status_code; + uint32_t duration_ms; + + virtual int read(uint8_t *buf, size_t max_len) = 0; + virtual void end() = 0; + + void set_secure(bool secure) { this->secure_ = secure; } + + size_t get_bytes_read() const { return this->bytes_read_; } + + protected: + size_t bytes_read_{0}; + bool secure_{false}; +}; + +class HttpRequestResponseTrigger : public Trigger, std::string> { + public: + void process(std::shared_ptr container, std::string response_body) { + this->trigger(std::move(container), std::move(response_body)); + } }; class HttpRequestComponent : public Component { @@ -41,37 +55,33 @@ class HttpRequestComponent : public Component { void dump_config() override; float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } - void set_url(std::string url); - void set_method(const char *method) { this->method_ = method; } void set_useragent(const char *useragent) { this->useragent_ = useragent; } void set_timeout(uint16_t timeout) { this->timeout_ = timeout; } + void set_watchdog_timeout(uint32_t watchdog_timeout) { this->watchdog_timeout_ = watchdog_timeout; } + uint32_t get_watchdog_timeout() const { return this->watchdog_timeout_; } void set_follow_redirects(bool follow_redirects) { this->follow_redirects_ = follow_redirects; } void set_redirect_limit(uint16_t limit) { this->redirect_limit_ = limit; } - void set_body(const std::string &body) { this->body_ = body; } - void set_headers(std::list
headers) { this->headers_ = std::move(headers); } - void send(const std::vector &response_triggers); - void close(); - const char *get_string(); + + std::shared_ptr get(std::string url) { return this->start(std::move(url), "GET", "", {}); } + std::shared_ptr get(std::string url, std::list
headers) { + return this->start(std::move(url), "GET", "", std::move(headers)); + } + std::shared_ptr post(std::string url, std::string body) { + return this->start(std::move(url), "POST", std::move(body), {}); + } + std::shared_ptr post(std::string url, std::string body, std::list
headers) { + return this->start(std::move(url), "POST", std::move(body), std::move(headers)); + } + + virtual std::shared_ptr start(std::string url, std::string method, std::string body, + std::list
headers) = 0; protected: - HTTPClient client_{}; - std::string url_; - std::string last_url_; - const char *method_; const char *useragent_{nullptr}; - bool secure_; bool follow_redirects_; uint16_t redirect_limit_; uint16_t timeout_{5000}; - std::string body_; - std::list
headers_; -#ifdef USE_ESP8266 - std::shared_ptr wifi_client_; -#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS - std::shared_ptr wifi_client_secure_; -#endif - std::shared_ptr get_wifi_client_(); -#endif + uint32_t watchdog_timeout_{0}; }; template class HttpRequestSendAction : public Action { @@ -80,6 +90,7 @@ template class HttpRequestSendAction : public Action { TEMPLATABLE_VALUE(std::string, url) TEMPLATABLE_VALUE(const char *, method) TEMPLATABLE_VALUE(std::string, body) + TEMPLATABLE_VALUE(bool, capture_response) void add_header(const char *key, TemplatableValue value) { this->headers_.insert({key, value}); } @@ -89,19 +100,22 @@ template class HttpRequestSendAction : public Action { void register_response_trigger(HttpRequestResponseTrigger *trigger) { this->response_triggers_.push_back(trigger); } + void set_max_response_buffer_size(size_t max_response_buffer_size) { + this->max_response_buffer_size_ = max_response_buffer_size; + } + void play(Ts... x) override { - this->parent_->set_url(this->url_.value(x...)); - this->parent_->set_method(this->method_.value(x...)); + std::string body; if (this->body_.has_value()) { - this->parent_->set_body(this->body_.value(x...)); + body = this->body_.value(x...); } if (!this->json_.empty()) { auto f = std::bind(&HttpRequestSendAction::encode_json_, this, x..., std::placeholders::_1); - this->parent_->set_body(json::build_json(f)); + body = json::build_json(f); } if (this->json_func_ != nullptr) { auto f = std::bind(&HttpRequestSendAction::encode_json_func_, this, x..., std::placeholders::_1); - this->parent_->set_body(json::build_json(f)); + body = json::build_json(f); } std::list
headers; for (const auto &item : this->headers_) { @@ -111,10 +125,37 @@ template class HttpRequestSendAction : public Action { header.value = val.value(x...); headers.push_back(header); } - this->parent_->set_headers(headers); - this->parent_->send(this->response_triggers_); - this->parent_->close(); - this->parent_->set_body(""); + + auto container = this->parent_->start(this->url_.value(x...), this->method_.value(x...), body, headers); + + if (container == nullptr) { + return; + } + + size_t content_length = container->content_length; + size_t max_length = std::min(content_length, this->max_response_buffer_size_); + + std::string response_body; + if (this->capture_response_.value(x...)) { + ExternalRAMAllocator allocator(ExternalRAMAllocator::ALLOW_FAILURE); + uint8_t *buf = allocator.allocate(max_length); + if (buf != nullptr) { + size_t read_index = 0; + while (container->get_bytes_read() < max_length) { + int read = container->read(buf + read_index, std::min(max_length - read_index, 512)); + App.feed_wdt(); + yield(); + read_index += read; + } + response_body.reserve(read_index); + response_body.assign((char *) buf, read_index); + } + } + + for (auto *trigger : this->response_triggers_) { + trigger->process(container, response_body); + } + container->end(); } protected: @@ -130,9 +171,9 @@ template class HttpRequestSendAction : public Action { std::map> json_{}; std::function json_func_{nullptr}; std::vector response_triggers_; + + size_t max_response_buffer_size_{SIZE_MAX}; }; } // namespace http_request } // namespace esphome - -#endif // USE_ARDUINO diff --git a/esphome/components/http_request/http_request_arduino.cpp b/esphome/components/http_request/http_request_arduino.cpp new file mode 100644 index 0000000000..248a85a439 --- /dev/null +++ b/esphome/components/http_request/http_request_arduino.cpp @@ -0,0 +1,161 @@ +#include "http_request_arduino.h" + +#ifdef USE_ARDUINO + +#include "esphome/components/network/util.h" +#include "esphome/core/application.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" + +#include "watchdog.h" + +namespace esphome { +namespace http_request { + +static const char *const TAG = "http_request.arduino"; + +std::shared_ptr HttpRequestArduino::start(std::string url, std::string method, std::string body, + std::list
headers) { + if (!network::is_connected()) { + this->status_momentary_error("failed", 1000); + ESP_LOGW(TAG, "HTTP Request failed; Not connected to network"); + return nullptr; + } + + std::shared_ptr container = std::make_shared(); + container->set_parent(this); + + const uint32_t start = millis(); + + bool secure = url.find("https:") != std::string::npos; + container->set_secure(secure); + + watchdog::WatchdogManager wdm(this->get_watchdog_timeout()); + +#if defined(USE_ESP8266) + std::unique_ptr stream_ptr; +#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS + if (secure) { + ESP_LOGV(TAG, "ESP8266 HTTPS connection with WiFiClientSecure"); + stream_ptr = std::make_unique(); + WiFiClientSecure *secure_client = static_cast(stream_ptr.get()); + secure_client->setBufferSizes(512, 512); + secure_client->setInsecure(); + } else { + stream_ptr = std::make_unique(); + } +#else + ESP_LOGV(TAG, "ESP8266 HTTP connection with WiFiClient"); + if (secure) { + ESP_LOGE(TAG, "Can't use HTTPS connection with esp8266_disable_ssl_support"); + return nullptr; + } + stream_ptr = std::make_unique(); +#endif // USE_HTTP_REQUEST_ESP8266_HTTPS + +#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(3, 1, 0) // && USE_ARDUINO_VERSION_CODE < VERSION_CODE(?, ?, ?) + if (!secure) { + ESP_LOGW(TAG, "Using HTTP on Arduino version >= 3.1 is **very** slow. Consider setting framework version to 3.0.2 " + "in your YAML, or use HTTPS"); + } +#endif // USE_ARDUINO_VERSION_CODE + + container->client_.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); + bool status = container->client_.begin(*stream_ptr, url.c_str()); + +#elif defined(USE_RP2040) + if (secure) { + container->client_.setInsecure(); + } + bool status = container->client_.begin(url.c_str()); +#elif defined(USE_ESP32) + bool status = container->client_.begin(url.c_str()); +#endif + + App.feed_wdt(); + + if (!status) { + ESP_LOGW(TAG, "HTTP Request failed; URL: %s", url.c_str()); + container->end(); + this->status_momentary_error("failed", 1000); + return nullptr; + } + + container->client_.setReuse(true); + container->client_.setTimeout(this->timeout_); +#if defined(USE_ESP32) + container->client_.setConnectTimeout(this->timeout_); +#endif + + if (this->useragent_ != nullptr) { + container->client_.setUserAgent(this->useragent_); + } + for (const auto &header : headers) { + container->client_.addHeader(header.name, header.value, false, true); + } + + // returned needed headers must be collected before the requests + static const char *header_keys[] = {"Content-Length", "Content-Type"}; + static const size_t HEADER_COUNT = sizeof(header_keys) / sizeof(header_keys[0]); + container->client_.collectHeaders(header_keys, HEADER_COUNT); + + container->status_code = container->client_.sendRequest(method.c_str(), body.c_str()); + if (container->status_code < 0) { + ESP_LOGW(TAG, "HTTP Request failed; URL: %s; Error: %s", url.c_str(), + HTTPClient::errorToString(container->status_code).c_str()); + this->status_momentary_error("failed", 1000); + container->end(); + return nullptr; + } + + if (container->status_code < 200 || container->status_code >= 300) { + ESP_LOGE(TAG, "HTTP Request failed; URL: %s; Code: %d", url.c_str(), container->status_code); + this->status_momentary_error("failed", 1000); + container->end(); + return nullptr; + } + + int content_length = container->client_.getSize(); + ESP_LOGD(TAG, "Content-Length: %d", content_length); + container->content_length = (size_t) content_length; + container->duration_ms = millis() - start; + + return container; +} + +int HttpContainerArduino::read(uint8_t *buf, size_t max_len) { + const uint32_t start = millis(); + watchdog::WatchdogManager wdm(this->parent_->get_watchdog_timeout()); + + WiFiClient *stream_ptr = this->client_.getStreamPtr(); + if (stream_ptr == nullptr) { + ESP_LOGE(TAG, "Stream pointer vanished!"); + return -1; + } + + int available_data = stream_ptr->available(); + int bufsize = std::min(max_len, std::min(this->content_length - this->bytes_read_, (size_t) available_data)); + + if (bufsize == 0) { + this->duration_ms += (millis() - start); + return 0; + } + + App.feed_wdt(); + int read_len = stream_ptr->readBytes(buf, bufsize); + this->bytes_read_ += read_len; + + this->duration_ms += (millis() - start); + + return read_len; +} + +void HttpContainerArduino::end() { + watchdog::WatchdogManager wdm(this->parent_->get_watchdog_timeout()); + this->client_.end(); +} + +} // namespace http_request +} // namespace esphome + +#endif // USE_ARDUINO diff --git a/esphome/components/http_request/http_request_arduino.h b/esphome/components/http_request/http_request_arduino.h new file mode 100644 index 0000000000..dfdf4a35e2 --- /dev/null +++ b/esphome/components/http_request/http_request_arduino.h @@ -0,0 +1,40 @@ +#pragma once + +#include "http_request.h" + +#ifdef USE_ARDUINO + +#if defined(USE_ESP32) || defined(USE_RP2040) +#include +#endif +#ifdef USE_ESP8266 +#include +#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS +#include +#endif +#endif + +namespace esphome { +namespace http_request { + +class HttpRequestArduino; +class HttpContainerArduino : public HttpContainer { + public: + int read(uint8_t *buf, size_t max_len) override; + void end() override; + + protected: + friend class HttpRequestArduino; + HTTPClient client_{}; +}; + +class HttpRequestArduino : public HttpRequestComponent { + public: + std::shared_ptr start(std::string url, std::string method, std::string body, + std::list
headers) override; +}; + +} // namespace http_request +} // namespace esphome + +#endif // USE_ARDUINO diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp new file mode 100644 index 0000000000..138e0438f4 --- /dev/null +++ b/esphome/components/http_request/http_request_idf.cpp @@ -0,0 +1,155 @@ +#include "http_request_idf.h" + +#ifdef USE_ESP_IDF + +#include "esphome/components/network/util.h" +#include "esphome/core/application.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" + +#if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE +#include "esp_crt_bundle.h" +#endif + +#include "watchdog.h" + +namespace esphome { +namespace http_request { + +static const char *const TAG = "http_request.idf"; + +std::shared_ptr HttpRequestIDF::start(std::string url, std::string method, std::string body, + std::list
headers) { + if (!network::is_connected()) { + this->status_momentary_error("failed", 1000); + ESP_LOGE(TAG, "HTTP Request failed; Not connected to network"); + return nullptr; + } + + esp_http_client_method_t method_idf; + if (method == "GET") { + method_idf = HTTP_METHOD_GET; + } else if (method == "POST") { + method_idf = HTTP_METHOD_POST; + } else if (method == "PUT") { + method_idf = HTTP_METHOD_PUT; + } else if (method == "DELETE") { + method_idf = HTTP_METHOD_DELETE; + } else if (method == "PATCH") { + method_idf = HTTP_METHOD_PATCH; + } else { + this->status_momentary_error("failed", 1000); + ESP_LOGE(TAG, "HTTP Request failed; Unsupported method"); + return nullptr; + } + + bool secure = url.find("https:") != std::string::npos; + + esp_http_client_config_t config = {}; + + config.url = url.c_str(); + config.method = method_idf; + config.timeout_ms = this->timeout_; + config.disable_auto_redirect = !this->follow_redirects_; + config.max_redirection_count = this->redirect_limit_; +#if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE + if (secure) { + config.crt_bundle_attach = esp_crt_bundle_attach; + } +#endif + + if (this->useragent_ != nullptr) { + config.user_agent = this->useragent_; + } + + const uint32_t start = millis(); + watchdog::WatchdogManager wdm(this->get_watchdog_timeout()); + + esp_http_client_handle_t client = esp_http_client_init(&config); + + std::shared_ptr container = std::make_shared(client); + container->set_parent(this); + + container->set_secure(secure); + + for (const auto &header : headers) { + esp_http_client_set_header(client, header.name, header.value); + } + + int body_len = body.length(); + + esp_err_t err = esp_http_client_open(client, body_len); + if (err != ESP_OK) { + this->status_momentary_error("failed", 1000); + ESP_LOGE(TAG, "HTTP Request failed: %s", esp_err_to_name(err)); + esp_http_client_cleanup(client); + return nullptr; + } + + if (body_len > 0) { + int write_left = body_len; + int write_index = 0; + const char *buf = body.c_str(); + while (body_len > 0) { + int written = esp_http_client_write(client, buf + write_index, write_left); + if (written < 0) { + err = ESP_FAIL; + break; + } + write_left -= written; + write_index += written; + } + } + + if (err != ESP_OK) { + this->status_momentary_error("failed", 1000); + ESP_LOGE(TAG, "HTTP Request failed: %s", esp_err_to_name(err)); + esp_http_client_cleanup(client); + return nullptr; + } + + container->content_length = esp_http_client_fetch_headers(client); + const auto status_code = esp_http_client_get_status_code(client); + container->status_code = status_code; + + if (status_code < 200 || status_code >= 300) { + ESP_LOGE(TAG, "HTTP Request failed; URL: %s; Code: %d", url.c_str(), status_code); + this->status_momentary_error("failed", 1000); + esp_http_client_cleanup(client); + return nullptr; + } + container->duration_ms = millis() - start; + return container; +} + +int HttpContainerIDF::read(uint8_t *buf, size_t max_len) { + const uint32_t start = millis(); + watchdog::WatchdogManager wdm(this->parent_->get_watchdog_timeout()); + + int bufsize = std::min(max_len, this->content_length - this->bytes_read_); + + if (bufsize == 0) { + this->duration_ms += (millis() - start); + return 0; + } + + App.feed_wdt(); + int read_len = esp_http_client_read(this->client_, (char *) buf, bufsize); + this->bytes_read_ += read_len; + + this->duration_ms += (millis() - start); + + return read_len; +} + +void HttpContainerIDF::end() { + watchdog::WatchdogManager wdm(this->parent_->get_watchdog_timeout()); + + esp_http_client_close(this->client_); + esp_http_client_cleanup(this->client_); +} + +} // namespace http_request +} // namespace esphome + +#endif // USE_ESP_IDF diff --git a/esphome/components/http_request/http_request_idf.h b/esphome/components/http_request/http_request_idf.h new file mode 100644 index 0000000000..79f850a636 --- /dev/null +++ b/esphome/components/http_request/http_request_idf.h @@ -0,0 +1,34 @@ +#pragma once + +#include "http_request.h" + +#ifdef USE_ESP_IDF + +#include +#include +#include +#include + +namespace esphome { +namespace http_request { + +class HttpContainerIDF : public HttpContainer { + public: + HttpContainerIDF(esp_http_client_handle_t client) : client_(client) {} + int read(uint8_t *buf, size_t max_len) override; + void end() override; + + protected: + esp_http_client_handle_t client_; +}; + +class HttpRequestIDF : public HttpRequestComponent { + public: + std::shared_ptr start(std::string url, std::string method, std::string body, + std::list
headers) override; +}; + +} // namespace http_request +} // namespace esphome + +#endif // USE_ESP_IDF diff --git a/esphome/components/http_request/ota/__init__.py b/esphome/components/http_request/ota/__init__.py index 6a56fac83a..0ef1fc2348 100644 --- a/esphome/components/http_request/ota/__init__.py +++ b/esphome/components/http_request/ota/__init__.py @@ -2,92 +2,35 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome import automation from esphome.const import ( - CONF_ESP8266_DISABLE_SSL_SUPPORT, CONF_ID, CONF_PASSWORD, - CONF_TIMEOUT, CONF_URL, CONF_USERNAME, ) -from esphome.components import esp32 from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent -from esphome.core import CORE, coroutine_with_priority -from .. import http_request_ns +from esphome.core import coroutine_with_priority +from .. import CONF_HTTP_REQUEST_ID, http_request_ns, HttpRequestComponent CODEOWNERS = ["@oarcher"] AUTO_LOAD = ["md5"] -DEPENDENCIES = ["network"] +DEPENDENCIES = ["network", "http_request"] CONF_MD5 = "md5" CONF_MD5_URL = "md5_url" -CONF_VERIFY_SSL = "verify_ssl" -CONF_WATCHDOG_TIMEOUT = "watchdog_timeout" OtaHttpRequestComponent = http_request_ns.class_( "OtaHttpRequestComponent", OTAComponent ) -OtaHttpRequestComponentArduino = http_request_ns.class_( - "OtaHttpRequestComponentArduino", OtaHttpRequestComponent -) -OtaHttpRequestComponentIDF = http_request_ns.class_( - "OtaHttpRequestComponentIDF", OtaHttpRequestComponent -) OtaHttpRequestComponentFlashAction = http_request_ns.class_( "OtaHttpRequestComponentFlashAction", automation.Action ) - -def validate_ssl_verification(config): - error_message = "" - - if CORE.is_esp32: - if not CORE.using_esp_idf and config[CONF_VERIFY_SSL]: - error_message = "ESPHome supports certificate verification only via ESP-IDF" - - if CORE.is_rp2040 and config[CONF_VERIFY_SSL]: - error_message = "ESPHome does not support certificate verification in Arduino" - - if ( - CORE.is_esp8266 - and not config[CONF_ESP8266_DISABLE_SSL_SUPPORT] - and config[CONF_VERIFY_SSL] - ): - error_message = "ESPHome does not support certificate verification in Arduino" - - if len(error_message) > 0: - raise cv.Invalid( - f"{error_message}. Set '{CONF_VERIFY_SSL}: false' to skip certificate validation and allow less secure HTTPS connections." - ) - - return config - - -def _declare_request_class(value): - if CORE.using_esp_idf: - return cv.declare_id(OtaHttpRequestComponentIDF)(value) - - if CORE.is_esp8266 or CORE.is_esp32 or CORE.is_rp2040: - return cv.declare_id(OtaHttpRequestComponentArduino)(value) - return NotImplementedError - - CONFIG_SCHEMA = cv.All( cv.Schema( { - cv.GenerateID(): _declare_request_class, - cv.SplitDefault(CONF_ESP8266_DISABLE_SSL_SUPPORT, esp8266=False): cv.All( - cv.only_on_esp8266, cv.boolean - ), - cv.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - cv.Optional( - CONF_TIMEOUT, default="5min" - ): cv.positive_time_period_milliseconds, - cv.Optional(CONF_WATCHDOG_TIMEOUT): cv.All( - cv.Any(cv.only_on_esp32, cv.only_on_rp2040), - cv.positive_not_null_time_period, - cv.positive_time_period_milliseconds, - ), + cv.GenerateID(): cv.declare_id(OtaHttpRequestComponent), + cv.GenerateID(CONF_HTTP_REQUEST_ID): cv.use_id(HttpRequestComponent), } ) .extend(BASE_OTA_SCHEMA) @@ -98,7 +41,6 @@ CONFIG_SCHEMA = cv.All( esp_idf=cv.Version(0, 0, 0), rp2040_arduino=cv.Version(0, 0, 0), ), - validate_ssl_verification, ) @@ -106,41 +48,8 @@ CONFIG_SCHEMA = cv.All( async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) await ota_to_code(var, config) - - cg.add(var.set_timeout(config[CONF_TIMEOUT])) - - if timeout_ms := config.get(CONF_WATCHDOG_TIMEOUT): - cg.add_define( - "USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT", - timeout_ms, - ) - - if CORE.is_esp8266 and not config[CONF_ESP8266_DISABLE_SSL_SUPPORT]: - cg.add_define("USE_HTTP_REQUEST_ESP8266_HTTPS") - - if CORE.is_esp32: - if CORE.using_esp_idf: - esp32.add_idf_sdkconfig_option( - "CONFIG_MBEDTLS_CERTIFICATE_BUNDLE", - config.get(CONF_VERIFY_SSL), - ) - esp32.add_idf_sdkconfig_option( - "CONFIG_ESP_TLS_INSECURE", - not config.get(CONF_VERIFY_SSL), - ) - esp32.add_idf_sdkconfig_option( - "CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY", - not config.get(CONF_VERIFY_SSL), - ) - else: - cg.add_library("WiFiClientSecure", None) - cg.add_library("HTTPClient", None) - if CORE.is_esp8266: - cg.add_library("ESP8266HTTPClient", None) - if CORE.is_rp2040 and CORE.using_arduino: - cg.add_library("HTTPClient", None) - await cg.register_component(var, config) + await cg.register_parented(var, config[CONF_HTTP_REQUEST_ID]) OTA_HTTP_REQUEST_FLASH_ACTION_SCHEMA = cv.All( @@ -148,7 +57,9 @@ OTA_HTTP_REQUEST_FLASH_ACTION_SCHEMA = cv.All( { cv.GenerateID(): cv.use_id(OtaHttpRequestComponent), cv.Optional(CONF_MD5_URL): cv.templatable(cv.url), - cv.Optional(CONF_MD5): cv.templatable(cv.string), + cv.Optional(CONF_MD5): cv.templatable( + cv.All(cv.string, cv.Length(min=32, max=32)) + ), cv.Optional(CONF_PASSWORD): cv.templatable(cv.string), cv.Optional(CONF_USERNAME): cv.templatable(cv.string), cv.Required(CONF_URL): cv.templatable(cv.url), @@ -159,7 +70,7 @@ OTA_HTTP_REQUEST_FLASH_ACTION_SCHEMA = cv.All( @automation.register_action( - "ota_http_request.flash", + "ota.http_request.flash", OtaHttpRequestComponentFlashAction, OTA_HTTP_REQUEST_FLASH_ACTION_SCHEMA, ) diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index cf0816c858..a41f552baf 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -1,16 +1,16 @@ #include "ota_http_request.h" -#include "watchdog.h" +#include "../watchdog.h" #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/core/log.h" #include "esphome/components/md5/md5.h" +#include "esphome/components/ota/ota_backend.h" #include "esphome/components/ota/ota_backend_arduino_esp32.h" #include "esphome/components/ota/ota_backend_arduino_esp8266.h" #include "esphome/components/ota/ota_backend_arduino_rp2040.h" #include "esphome/components/ota/ota_backend_esp_idf.h" -#include "esphome/components/ota/ota_backend.h" namespace esphome { namespace http_request { @@ -21,25 +21,7 @@ void OtaHttpRequestComponent::setup() { #endif } -void OtaHttpRequestComponent::dump_config() { - ESP_LOGCONFIG(TAG, "Over-The-Air updates via HTTP request:"); - ESP_LOGCONFIG(TAG, " Timeout: %llus", this->timeout_ / 1000); -#ifdef USE_ESP8266 -#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS - ESP_LOGCONFIG(TAG, " ESP8266 SSL support: No"); -#else - ESP_LOGCONFIG(TAG, " ESP8266 SSL support: Yes"); -#endif -#endif -#ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE - ESP_LOGCONFIG(TAG, " TLS server verification: Yes"); -#else - ESP_LOGCONFIG(TAG, " TLS server verification: No"); -#endif -#ifdef USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT - ESP_LOGCONFIG(TAG, " Watchdog timeout: %ds", USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT / 1000); -#endif -}; +void OtaHttpRequestComponent::dump_config() { ESP_LOGCONFIG(TAG, "Over-The-Air updates via HTTP request"); }; void OtaHttpRequestComponent::set_md5_url(const std::string &url) { if (!this->validate_url_(url)) { @@ -58,20 +40,6 @@ void OtaHttpRequestComponent::set_url(const std::string &url) { this->url_ = url; } -bool OtaHttpRequestComponent::check_status() { - // status can be -1, or HTTP status code - if (this->status_ < 100) { - ESP_LOGE(TAG, "HTTP server did not respond (error %d)", this->status_); - return false; - } - if (this->status_ >= 310) { - ESP_LOGE(TAG, "HTTP error %d", this->status_); - return false; - } - ESP_LOGV(TAG, "HTTP status %d", this->status_); - return true; -} - void OtaHttpRequestComponent::flash() { if (this->url_.empty()) { ESP_LOGE(TAG, "URL not set; cannot start update"); @@ -104,17 +72,18 @@ void OtaHttpRequestComponent::flash() { } } -void OtaHttpRequestComponent::cleanup_(std::unique_ptr backend) { +void OtaHttpRequestComponent::cleanup_(std::unique_ptr backend, + const std::shared_ptr &container) { if (this->update_started_) { ESP_LOGV(TAG, "Aborting OTA backend"); backend->abort(); } ESP_LOGV(TAG, "Aborting HTTP connection"); - this->http_end(); + container->end(); }; uint8_t OtaHttpRequestComponent::do_ota_() { - uint8_t buf[this->http_recv_buffer_ + 1]; + uint8_t buf[OtaHttpRequestComponent::HTTP_RECV_BUFFER + 1]; uint32_t last_progress = 0; uint32_t update_start_time = millis(); md5::MD5Digest md5_receive; @@ -132,9 +101,10 @@ uint8_t OtaHttpRequestComponent::do_ota_() { } ESP_LOGVV(TAG, "url_with_auth: %s", url_with_auth.c_str()); ESP_LOGI(TAG, "Connecting to: %s", this->url_.c_str()); - this->http_init(url_with_auth); - if (!this->check_status()) { - this->http_end(); + + auto container = this->parent_->get(url_with_auth); + + if (container == nullptr) { return OTA_CONNECTION_ERROR; } @@ -144,18 +114,18 @@ uint8_t OtaHttpRequestComponent::do_ota_() { ESP_LOGV(TAG, "OTA backend begin"); auto backend = ota::make_ota_backend(); - auto error_code = backend->begin(this->body_length_); + auto error_code = backend->begin(container->content_length); if (error_code != ota::OTA_RESPONSE_OK) { ESP_LOGW(TAG, "backend->begin error: %d", error_code); - this->cleanup_(std::move(backend)); + this->cleanup_(std::move(backend), container); return error_code; } - this->bytes_read_ = 0; - while (this->bytes_read_ < this->body_length_) { + while (container->get_bytes_read() < container->content_length) { // read a maximum of chunk_size bytes into buf. (real read size returned) - int bufsize = this->http_read(buf, this->http_recv_buffer_); - ESP_LOGVV(TAG, "bytes_read_ = %u, body_length_ = %u, bufsize = %i", this->bytes_read_, this->body_length_, bufsize); + int bufsize = container->read(buf, OtaHttpRequestComponent::HTTP_RECV_BUFFER); + ESP_LOGVV(TAG, "bytes_read_ = %u, body_length_ = %u, bufsize = %i", container->get_bytes_read(), + container->content_length, bufsize); // feed watchdog and give other tasks a chance to run App.feed_wdt(); @@ -163,9 +133,9 @@ uint8_t OtaHttpRequestComponent::do_ota_() { if (bufsize < 0) { ESP_LOGE(TAG, "Stream closed"); - this->cleanup_(std::move(backend)); + this->cleanup_(std::move(backend), container); return OTA_CONNECTION_ERROR; - } else if (bufsize > 0 && bufsize <= this->http_recv_buffer_) { + } else if (bufsize > 0 && bufsize <= OtaHttpRequestComponent::HTTP_RECV_BUFFER) { // add read bytes to MD5 md5_receive.add(buf, bufsize); @@ -176,16 +146,16 @@ uint8_t OtaHttpRequestComponent::do_ota_() { // error code explanation available at // https://github.com/esphome/esphome/blob/dev/esphome/components/ota/ota_backend.h ESP_LOGE(TAG, "Error code (%02X) writing binary data to flash at offset %d and size %d", error_code, - this->bytes_read_ - bufsize, this->body_length_); - this->cleanup_(std::move(backend)); + container->get_bytes_read() - bufsize, container->content_length); + this->cleanup_(std::move(backend), container); return error_code; } } uint32_t now = millis(); - if ((now - last_progress > 1000) or (this->bytes_read_ == this->body_length_)) { + if ((now - last_progress > 1000) or (container->get_bytes_read() == container->content_length)) { last_progress = now; - float percentage = this->bytes_read_ * 100.0f / this->body_length_; + float percentage = container->get_bytes_read() * 100.0f / container->content_length; ESP_LOGD(TAG, "Progress: %0.1f%%", percentage); #ifdef USE_OTA_STATE_CALLBACK this->state_callback_.call(ota::OTA_IN_PROGRESS, percentage, 0); @@ -201,13 +171,13 @@ uint8_t OtaHttpRequestComponent::do_ota_() { this->md5_computed_ = md5_receive_str.get(); if (strncmp(this->md5_computed_.c_str(), this->md5_expected_.c_str(), MD5_SIZE) != 0) { ESP_LOGE(TAG, "MD5 computed: %s - Aborting due to MD5 mismatch", this->md5_computed_.c_str()); - this->cleanup_(std::move(backend)); + this->cleanup_(std::move(backend), container); return ota::OTA_RESPONSE_ERROR_MD5_MISMATCH; } else { backend->set_update_md5(md5_receive_str.get()); } - this->http_end(); + container->end(); // feed watchdog and give other tasks a chance to run App.feed_wdt(); @@ -217,7 +187,7 @@ uint8_t OtaHttpRequestComponent::do_ota_() { error_code = backend->end(); if (error_code != ota::OTA_RESPONSE_OK) { ESP_LOGW(TAG, "Error ending update! error_code: %d", error_code); - this->cleanup_(std::move(backend)); + this->cleanup_(std::move(backend), container); return error_code; } @@ -256,28 +226,32 @@ bool OtaHttpRequestComponent::http_get_md5_() { ESP_LOGVV(TAG, "url_with_auth: %s", url_with_auth.c_str()); ESP_LOGI(TAG, "Connecting to: %s", this->md5_url_.c_str()); - this->http_init(url_with_auth); - if (!this->check_status()) { - this->http_end(); + auto container = this->parent_->get(url_with_auth); + if (container == nullptr) { + ESP_LOGE(TAG, "Failed to connect to MD5 URL"); return false; } - int length = this->body_length_; - if (length < 0) { - this->http_end(); + size_t length = container->content_length; + if (length == 0) { + container->end(); return false; } if (length < MD5_SIZE) { - ESP_LOGE(TAG, "MD5 file must be %u bytes; %u bytes reported by HTTP server. Aborting", MD5_SIZE, - this->body_length_); - this->http_end(); + ESP_LOGE(TAG, "MD5 file must be %u bytes; %u bytes reported by HTTP server. Aborting", MD5_SIZE, length); + container->end(); return false; } - this->bytes_read_ = 0; this->md5_expected_.resize(MD5_SIZE); - auto read_len = this->http_read((uint8_t *) this->md5_expected_.data(), MD5_SIZE); - this->http_end(); + int read_len = 0; + while (container->get_bytes_read() < MD5_SIZE) { + read_len = container->read((uint8_t *) this->md5_expected_.data(), MD5_SIZE); + App.feed_wdt(); + yield(); + } + container->end(); + ESP_LOGV(TAG, "Read len: %u, MD5 expected: %u", read_len, MD5_SIZE); return read_len == MD5_SIZE; } diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h index 9fbdf2ec25..91c7085517 100644 --- a/esphome/components/http_request/ota/ota_http_request.h +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -1,13 +1,16 @@ #pragma once +#include "esphome/components/ota/ota_backend.h" #include "esphome/core/component.h" #include "esphome/core/defines.h" -#include "esphome/components/ota/ota_backend.h" +#include "esphome/core/helpers.h" #include #include #include +#include "../http_request.h" + namespace esphome { namespace http_request { @@ -20,7 +23,7 @@ enum OtaHttpRequestError : uint8_t { OTA_CONNECTION_ERROR = 0x12, }; -class OtaHttpRequestComponent : public ota::OTAComponent { +class OtaHttpRequestComponent : public ota::OTAComponent, public Parented { public: void setup() override; void dump_config() override; @@ -29,27 +32,19 @@ class OtaHttpRequestComponent : public ota::OTAComponent { void set_md5_url(const std::string &md5_url); void set_md5(const std::string &md5) { this->md5_expected_ = md5; } void set_password(const std::string &password) { this->password_ = password; } - void set_timeout(const uint64_t timeout) { this->timeout_ = timeout; } void set_url(const std::string &url); void set_username(const std::string &username) { this->username_ = username; } std::string md5_computed() { return this->md5_computed_; } std::string md5_expected() { return this->md5_expected_; } - bool check_status(); - void flash(); - virtual void http_init(const std::string &url){}; - virtual int http_read(uint8_t *buf, size_t len) { return 0; }; - virtual void http_end(){}; - protected: - void cleanup_(std::unique_ptr backend); + void cleanup_(std::unique_ptr backend, const std::shared_ptr &container); uint8_t do_ota_(); std::string get_url_with_auth_(const std::string &url); bool http_get_md5_(); - bool secure_() { return this->url_.find("https:") != std::string::npos; }; bool validate_url_(const std::string &url); std::string md5_computed_{}; @@ -58,14 +53,9 @@ class OtaHttpRequestComponent : public ota::OTAComponent { std::string password_{}; std::string username_{}; std::string url_{}; - size_t body_length_ = 0; - size_t bytes_read_ = 0; int status_ = -1; - uint64_t timeout_ = 0; bool update_started_ = false; - const uint16_t http_recv_buffer_ = 256; // the firmware GET chunk size - const uint16_t max_http_recv_buffer_ = 512; // internal max http buffer size must be > HTTP_RECV_BUFFER_ (TLS - // overhead) and must be a power of two from 512 to 4096 + static const uint16_t HTTP_RECV_BUFFER = 256; // the firmware GET chunk size }; } // namespace http_request diff --git a/esphome/components/http_request/ota/ota_http_request_arduino.cpp b/esphome/components/http_request/ota/ota_http_request_arduino.cpp deleted file mode 100644 index d1dc638d5e..0000000000 --- a/esphome/components/http_request/ota/ota_http_request_arduino.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "ota_http_request.h" -#include "watchdog.h" - -#ifdef USE_ARDUINO -#include "ota_http_request_arduino.h" -#include "esphome/core/defines.h" -#include "esphome/core/log.h" -#include "esphome/core/application.h" -#include "esphome/components/network/util.h" -#include "esphome/components/md5/md5.h" - -namespace esphome { -namespace http_request { - -struct Header { - const char *name; - const char *value; -}; - -void OtaHttpRequestComponentArduino::http_init(const std::string &url) { - const char *header_keys[] = {"Content-Length", "Content-Type"}; - const size_t header_count = sizeof(header_keys) / sizeof(header_keys[0]); - watchdog::WatchdogManager wdts; - -#ifdef USE_ESP8266 - if (this->stream_ptr_ == nullptr && this->set_stream_ptr_()) { - ESP_LOGE(TAG, "Unable to set client"); - return; - } -#endif // USE_ESP8266 - -#ifdef USE_RP2040 - this->client_.setInsecure(); -#endif - - App.feed_wdt(); - -#if defined(USE_ESP32) || defined(USE_RP2040) - this->status_ = this->client_.begin(url.c_str()); -#endif -#ifdef USE_ESP8266 - this->client_.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); - this->status_ = this->client_.begin(*this->stream_ptr_, url.c_str()); -#endif - - if (!this->status_) { - this->client_.end(); - return; - } - - this->client_.setReuse(true); - - // returned needed headers must be collected before the requests - this->client_.collectHeaders(header_keys, header_count); - - // HTTP GET - this->status_ = this->client_.GET(); - - this->body_length_ = (size_t) this->client_.getSize(); - -#if defined(USE_ESP32) || defined(USE_RP2040) - if (this->stream_ptr_ == nullptr) { - this->set_stream_ptr_(); - } -#endif -} - -int OtaHttpRequestComponentArduino::http_read(uint8_t *buf, const size_t max_len) { -#ifdef USE_ESP8266 -#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(3, 1, 0) // && USE_ARDUINO_VERSION_CODE < VERSION_CODE(?, ?, ?) - if (!this->secure_()) { - ESP_LOGW(TAG, "Using HTTP on Arduino version >= 3.1 is **very** slow. Consider setting framework version to 3.0.2 " - "in your YAML, or use HTTPS"); - } -#endif // USE_ARDUINO_VERSION_CODE -#endif // USE_ESP8266 - - watchdog::WatchdogManager wdts; - - // Since arduino8266 >= 3.1 using this->stream_ptr_ is broken (https://github.com/esp8266/Arduino/issues/9035) - WiFiClient *stream_ptr = this->client_.getStreamPtr(); - if (stream_ptr == nullptr) { - ESP_LOGE(TAG, "Stream pointer vanished!"); - return -1; - } - - int available_data = stream_ptr->available(); - int bufsize = std::min((int) max_len, available_data); - if (bufsize > 0) { - stream_ptr->readBytes(buf, bufsize); - this->bytes_read_ += bufsize; - buf[bufsize] = '\0'; // not fed to ota - } - - return bufsize; -} - -void OtaHttpRequestComponentArduino::http_end() { - watchdog::WatchdogManager wdts; - this->client_.end(); -} - -int OtaHttpRequestComponentArduino::set_stream_ptr_() { -#ifdef USE_ESP8266 -#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS - if (this->secure_()) { - ESP_LOGV(TAG, "ESP8266 HTTPS connection with WiFiClientSecure"); - this->stream_ptr_ = std::make_unique(); - WiFiClientSecure *secure_client = static_cast(this->stream_ptr_.get()); - secure_client->setBufferSizes(this->max_http_recv_buffer_, 512); - secure_client->setInsecure(); - } else { - this->stream_ptr_ = std::make_unique(); - } -#else - ESP_LOGV(TAG, "ESP8266 HTTP connection with WiFiClient"); - if (this->secure_()) { - ESP_LOGE(TAG, "Can't use HTTPS connection with esp8266_disable_ssl_support"); - return -1; - } - this->stream_ptr_ = std::make_unique(); -#endif // USE_HTTP_REQUEST_ESP8266_HTTPS -#endif // USE_ESP8266 - -#if defined(USE_ESP32) || defined(USE_RP2040) - this->stream_ptr_ = std::unique_ptr(this->client_.getStreamPtr()); -#endif - return 0; -} - -} // namespace http_request -} // namespace esphome - -#endif // USE_ARDUINO diff --git a/esphome/components/http_request/ota/ota_http_request_arduino.h b/esphome/components/http_request/ota/ota_http_request_arduino.h deleted file mode 100644 index 02bc046520..0000000000 --- a/esphome/components/http_request/ota/ota_http_request_arduino.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "ota_http_request.h" - -#ifdef USE_ARDUINO -#include "esphome/core/automation.h" -#include "esphome/core/component.h" -#include "esphome/core/defines.h" - -#include -#include -#include - -#if defined(USE_ESP32) || defined(USE_RP2040) -#include -#endif -#ifdef USE_ESP8266 -#include -#ifdef USE_HTTP_REQUEST_ESP8266_HTTPS -#include -#endif -#endif - -namespace esphome { -namespace http_request { - -class OtaHttpRequestComponentArduino : public OtaHttpRequestComponent { - public: - void http_init(const std::string &url) override; - int http_read(uint8_t *buf, size_t len) override; - void http_end() override; - - protected: - int set_stream_ptr_(); - HTTPClient client_{}; - std::unique_ptr stream_ptr_; -}; - -} // namespace http_request -} // namespace esphome - -#endif // USE_ARDUINO diff --git a/esphome/components/http_request/ota/ota_http_request_idf.cpp b/esphome/components/http_request/ota/ota_http_request_idf.cpp deleted file mode 100644 index 9fa565d9bb..0000000000 --- a/esphome/components/http_request/ota/ota_http_request_idf.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "ota_http_request_idf.h" -#include "watchdog.h" - -#ifdef USE_ESP_IDF -#include "esphome/core/application.h" -#include "esphome/core/defines.h" -#include "esphome/core/log.h" -#include "esphome/components/md5/md5.h" -#include "esphome/components/network/util.h" - -#include "esp_event.h" -#include "esp_http_client.h" -#include "esp_idf_version.h" -#include "esp_log.h" -#include "esp_netif.h" -#include "esp_system.h" -#include "esp_task_wdt.h" -#include "esp_tls.h" - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "nvs_flash.h" - -#include -#include -#include -#include -#include -#if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE -#include "esp_crt_bundle.h" -#endif - -namespace esphome { -namespace http_request { - -void OtaHttpRequestComponentIDF::http_init(const std::string &url) { - App.feed_wdt(); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - esp_http_client_config_t config = {nullptr}; - config.url = url.c_str(); - config.method = HTTP_METHOD_GET; - config.timeout_ms = (int) this->timeout_; - config.buffer_size = this->max_http_recv_buffer_; - config.auth_type = HTTP_AUTH_TYPE_BASIC; - config.max_authorization_retries = -1; -#if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE - if (this->secure_()) { - config.crt_bundle_attach = esp_crt_bundle_attach; - } -#endif -#pragma GCC diagnostic pop - - watchdog::WatchdogManager wdts; - this->client_ = esp_http_client_init(&config); - if ((this->status_ = esp_http_client_open(this->client_, 0)) == ESP_OK) { - this->body_length_ = esp_http_client_fetch_headers(this->client_); - this->status_ = esp_http_client_get_status_code(this->client_); - } -} - -int OtaHttpRequestComponentIDF::http_read(uint8_t *buf, const size_t max_len) { - watchdog::WatchdogManager wdts; - int bufsize = std::min(max_len, this->body_length_ - this->bytes_read_); - - App.feed_wdt(); - int read_len = esp_http_client_read(this->client_, (char *) buf, bufsize); - if (read_len > 0) { - this->bytes_read_ += bufsize; - buf[bufsize] = '\0'; // not fed to ota - } - - return read_len; -} - -void OtaHttpRequestComponentIDF::http_end() { - watchdog::WatchdogManager wdts; - - esp_http_client_close(this->client_); - esp_http_client_cleanup(this->client_); -} - -} // namespace http_request -} // namespace esphome - -#endif // USE_ESP_IDF diff --git a/esphome/components/http_request/ota/ota_http_request_idf.h b/esphome/components/http_request/ota/ota_http_request_idf.h deleted file mode 100644 index 9783b2a3e1..0000000000 --- a/esphome/components/http_request/ota/ota_http_request_idf.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "ota_http_request.h" - -#ifdef USE_ESP_IDF -#include "esp_http_client.h" - -namespace esphome { -namespace http_request { - -class OtaHttpRequestComponentIDF : public OtaHttpRequestComponent { - public: - void http_init(const std::string &url) override; - int http_read(uint8_t *buf, size_t len) override; - void http_end() override; - - protected: - esp_http_client_handle_t client_{}; -}; - -} // namespace http_request -} // namespace esphome - -#endif // USE_ESP_IDF diff --git a/esphome/components/http_request/ota/watchdog.cpp b/esphome/components/http_request/watchdog.cpp similarity index 79% rename from esphome/components/http_request/ota/watchdog.cpp rename to esphome/components/http_request/watchdog.cpp index 663c9afaac..e609feb4dd 100644 --- a/esphome/components/http_request/ota/watchdog.cpp +++ b/esphome/components/http_request/watchdog.cpp @@ -1,7 +1,5 @@ #include "watchdog.h" -#ifdef USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT - #include "esphome/core/application.h" #include "esphome/core/log.h" @@ -20,14 +18,22 @@ namespace esphome { namespace http_request { namespace watchdog { -static const char *const TAG = "watchdog.http_request.ota"; +static const char *const TAG = "http_request.watchdog"; -WatchdogManager::WatchdogManager() { +WatchdogManager::WatchdogManager(uint32_t timeout_ms) : timeout_ms_(timeout_ms) { + if (timeout_ms == 0) { + return; + } this->saved_timeout_ms_ = this->get_timeout_(); - this->set_timeout_(USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT); + this->set_timeout_(timeout_ms); } -WatchdogManager::~WatchdogManager() { this->set_timeout_(this->saved_timeout_ms_); } +WatchdogManager::~WatchdogManager() { + if (this->timeout_ms_ == 0) { + return; + } + this->set_timeout_(this->saved_timeout_ms_); +} void WatchdogManager::set_timeout_(uint32_t timeout_ms) { ESP_LOGV(TAG, "Adjusting WDT to %" PRIu32 "ms", timeout_ms); @@ -68,4 +74,3 @@ uint32_t WatchdogManager::get_timeout_() { } // namespace watchdog } // namespace http_request } // namespace esphome -#endif diff --git a/esphome/components/http_request/ota/watchdog.h b/esphome/components/http_request/watchdog.h similarity index 84% rename from esphome/components/http_request/ota/watchdog.h rename to esphome/components/http_request/watchdog.h index 0a09dcd6fa..9b54ae6c82 100644 --- a/esphome/components/http_request/ota/watchdog.h +++ b/esphome/components/http_request/watchdog.h @@ -9,9 +9,8 @@ namespace http_request { namespace watchdog { class WatchdogManager { -#ifdef USE_HTTP_REQUEST_OTA_WATCHDOG_TIMEOUT public: - WatchdogManager(); + WatchdogManager(uint32_t timeout_ms); ~WatchdogManager(); private: @@ -19,7 +18,7 @@ class WatchdogManager { void set_timeout_(uint32_t timeout_ms); uint32_t saved_timeout_ms_{0}; -#endif + uint32_t timeout_ms_{0}; }; } // namespace watchdog diff --git a/esphome/cpp_types.py b/esphome/cpp_types.py index 0f1b7f236b..bd79d3b2f9 100644 --- a/esphome/cpp_types.py +++ b/esphome/cpp_types.py @@ -8,6 +8,7 @@ double = global_ns.namespace("double") bool_ = global_ns.namespace("bool") int_ = global_ns.namespace("int") std_ns = global_ns.namespace("std") +std_shared_ptr = std_ns.class_("shared_ptr") std_string = std_ns.class_("string") std_vector = std_ns.class_("vector") uint8 = global_ns.namespace("uint8_t") diff --git a/tests/components/http_request/common.yaml b/tests/components/http_request/common.yaml new file mode 100644 index 0000000000..2b6996c0b9 --- /dev/null +++ b/tests/components/http_request/common.yaml @@ -0,0 +1,75 @@ +substitutions: + verify_ssl: "true" + +wifi: + ssid: MySSID + password: password1 + +esphome: + on_boot: + then: + - http_request.get: + url: https://esphome.io + headers: + Content-Type: application/json + on_response: + then: + - logger.log: + format: "Response status: %d, Duration: %u ms" + args: + - response->status_code + - response->duration_ms + - http_request.post: + url: https://esphome.io + headers: + Content-Type: application/json + json: + key: value + - http_request.send: + method: PUT + url: https://esphome.io + headers: + Content-Type: application/json + body: "Some data" + +http_request: + useragent: esphome/tagreader + timeout: 10s + verify_ssl: ${verify_ssl} + +ota: + - platform: http_request + on_begin: + then: + - logger.log: "OTA start" + on_progress: + then: + - logger.log: + format: "OTA progress %0.1f%%" + args: ["x"] + on_end: + then: + - logger.log: "OTA end" + on_error: + then: + - logger.log: + format: "OTA update error %d" + args: ["x"] + on_state_change: + then: + lambda: 'ESP_LOGD("ota", "State %d", state);' + +button: + - platform: template + name: Firmware update + on_press: + then: + - ota.http_request.flash: + md5_url: http://my.ha.net:8123/local/esphome/firmware.md5 + url: http://my.ha.net:8123/local/esphome/firmware.bin + + - ota.http_request.flash: + md5: 0123456789abcdef0123456789abcdef + url: http://my.ha.net:8123/local/esphome/firmware.bin + + - logger.log: "This message should be not displayed (reboot)" diff --git a/tests/components/http_request/common_http_request.yaml b/tests/components/http_request/common_http_request.yaml deleted file mode 100644 index b00768c736..0000000000 --- a/tests/components/http_request/common_http_request.yaml +++ /dev/null @@ -1,33 +0,0 @@ -esphome: - on_boot: - then: - - http_request.get: - url: https://esphome.io - headers: - Content-Type: application/json - verify_ssl: false - on_response: - then: - - logger.log: - format: 'Response status: %d, Duration: %u ms' - args: - - status_code - - duration_ms - - http_request.post: - url: https://esphome.io - headers: - Content-Type: application/json - json: - key: value - verify_ssl: false - - http_request.send: - method: PUT - url: https://esphome.io - headers: - Content-Type: application/json - body: "Some data" - verify_ssl: false - -http_request: - useragent: esphome/tagreader - timeout: 10s diff --git a/tests/components/http_request/common_ota.yaml b/tests/components/http_request/common_ota.yaml deleted file mode 100644 index 10e7d54c3f..0000000000 --- a/tests/components/http_request/common_ota.yaml +++ /dev/null @@ -1,36 +0,0 @@ -wifi: - ssid: MySSID - password: password1 - -ota: - - platform: http_request - verify_ssl: ${verify_ssl} - on_begin: - then: - - logger.log: "OTA start" - on_progress: - then: - - logger.log: - format: "OTA progress %0.1f%%" - args: ["x"] - on_end: - then: - - logger.log: "OTA end" - on_error: - then: - - logger.log: - format: "OTA update error %d" - args: ["x"] - on_state_change: - then: - lambda: 'ESP_LOGD("ota", "State %d", state);' - -button: - - platform: template - name: Firmware update - on_press: - then: - - ota_http_request.flash: - md5_url: http://my.ha.net:8123/local/esphome/firmware.md5 - url: http://my.ha.net:8123/local/esphome/firmware.bin - - logger.log: "This message should be not displayed (reboot)" diff --git a/tests/components/http_request/test-nossl.esp8266.yaml b/tests/components/http_request/test-nossl.esp8266.yaml index 65116d5550..9fc4706c89 100644 --- a/tests/components/http_request/test-nossl.esp8266.yaml +++ b/tests/components/http_request/test-nossl.esp8266.yaml @@ -1,38 +1,4 @@ -<<: !include common_http_request.yaml +<<: !include common.yaml -wifi: - ssid: MySSID - password: password1 - -ota: - - platform: http_request - esp8266_disable_ssl_support: true - on_begin: - then: - - logger.log: "OTA start" - on_progress: - then: - - logger.log: - format: "OTA progress %0.1f%%" - args: ["x"] - on_end: - then: - - logger.log: "OTA end" - on_error: - then: - - logger.log: - format: "OTA update error %d" - args: ["x"] - on_state_change: - then: - lambda: 'ESP_LOGD("ota", "State %d", state);' - -button: - - platform: template - name: Firmware update - on_press: - then: - - ota_http_request.flash: - md5_url: http://my.ha.net:8123/local/esphome/firmware.md5 - url: http://my.ha.net:8123/local/esphome/firmware.bin - - logger.log: "This message should be not displayed (reboot)" +http_request: + esp8266_disable_ssl_support: true diff --git a/tests/components/http_request/test.esp32-c3-idf.yaml b/tests/components/http_request/test.esp32-c3-idf.yaml index da629e83a9..ee2f5aa59b 100644 --- a/tests/components/http_request/test.esp32-c3-idf.yaml +++ b/tests/components/http_request/test.esp32-c3-idf.yaml @@ -1,4 +1,4 @@ substitutions: verify_ssl: "true" -<<: !include common_ota.yaml +<<: !include common.yaml diff --git a/tests/components/http_request/test.esp32-c3.yaml b/tests/components/http_request/test.esp32-c3.yaml index 1f597bb500..c1937b5a10 100644 --- a/tests/components/http_request/test.esp32-c3.yaml +++ b/tests/components/http_request/test.esp32-c3.yaml @@ -1,5 +1,4 @@ substitutions: verify_ssl: "false" -<<: !include common_http_request.yaml -<<: !include common_ota.yaml +<<: !include common.yaml diff --git a/tests/components/http_request/test.esp32-idf.yaml b/tests/components/http_request/test.esp32-idf.yaml index da629e83a9..ee2f5aa59b 100644 --- a/tests/components/http_request/test.esp32-idf.yaml +++ b/tests/components/http_request/test.esp32-idf.yaml @@ -1,4 +1,4 @@ substitutions: verify_ssl: "true" -<<: !include common_ota.yaml +<<: !include common.yaml diff --git a/tests/components/http_request/test.esp32.yaml b/tests/components/http_request/test.esp32.yaml index 1f597bb500..c1937b5a10 100644 --- a/tests/components/http_request/test.esp32.yaml +++ b/tests/components/http_request/test.esp32.yaml @@ -1,5 +1,4 @@ substitutions: verify_ssl: "false" -<<: !include common_http_request.yaml -<<: !include common_ota.yaml +<<: !include common.yaml diff --git a/tests/components/http_request/test.esp8266.yaml b/tests/components/http_request/test.esp8266.yaml index 1f597bb500..c1937b5a10 100644 --- a/tests/components/http_request/test.esp8266.yaml +++ b/tests/components/http_request/test.esp8266.yaml @@ -1,5 +1,4 @@ substitutions: verify_ssl: "false" -<<: !include common_http_request.yaml -<<: !include common_ota.yaml +<<: !include common.yaml diff --git a/tests/components/http_request/test.rp2040.yaml b/tests/components/http_request/test.rp2040.yaml index 077e4d82da..c1937b5a10 100644 --- a/tests/components/http_request/test.rp2040.yaml +++ b/tests/components/http_request/test.rp2040.yaml @@ -1,4 +1,4 @@ substitutions: verify_ssl: "false" -<<: !include common_ota.yaml +<<: !include common.yaml diff --git a/tests/test1.yaml b/tests/test1.yaml index c49ff307e5..2dacfda536 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -25,31 +25,6 @@ esphome: then: - lambda: >- ESP_LOGV("main", "ON LOOP!"); - - http_request.get: - url: https://esphome.io - headers: - Content-Type: application/json - verify_ssl: false - - http_request.post: - url: https://esphome.io - verify_ssl: false - json: - key: !lambda |- - return id(${textname}_text).state; - greeting: Hello World - - http_request.send: - method: PUT - url: https://esphome.io - headers: - Content-Type: application/json - body: Some data - verify_ssl: false - on_response: - then: - - logger.log: - format: "Response status: %d" - args: - - status_code build_path: build/test1 packages: @@ -84,10 +59,6 @@ network: mdns: disabled: false -http_request: - useragent: esphome/device - timeout: 10s - mqtt: broker: "192.168.178.84" port: 1883 diff --git a/tests/test3.1.yaml b/tests/test3.1.yaml index 018a4d94f3..c3b078fe67 100644 --- a/tests/test3.1.yaml +++ b/tests/test3.1.yaml @@ -447,26 +447,6 @@ switch: switches: - id: custom_switch name: Custom Switch - on_turn_on: - - http_request.get: - url: https://esphome.io - headers: - Content-Type: application/json - verify_ssl: false - - http_request.post: - url: https://esphome.io - verify_ssl: false - json: - key: !lambda |- - return id(custom_text_sensor).state; - greeting: Hello World - - http_request.send: - method: PUT - url: https://esphome.io - headers: - Content-Type: application/json - body: Some data - verify_ssl: false - platform: template name: open_vent id: open_vent @@ -722,10 +702,6 @@ display: lambda: |- it.printdigit("hello"); -http_request: - useragent: esphome/device - timeout: 10s - button: - platform: output id: output_button diff --git a/tests/test7.yaml b/tests/test7.yaml index b22fbfbcb4..ac193eae4e 100644 --- a/tests/test7.yaml +++ b/tests/test7.yaml @@ -1,7 +1,7 @@ # Tests for ESP32-C3 boards which use toolchain-riscv32-esp --- wifi: - ssid: 'ssid' + ssid: "ssid" network: enable_ipv6: true @@ -12,31 +12,12 @@ esp32: type: arduino esphome: - name: 'on-response-test' - on_boot: - then: - - http_request.send: - method: PUT - url: https://esphome.io - headers: - Content-Type: application/json - body: Some data - verify_ssl: false - on_response: - then: - - logger.log: - format: "Response status: %d" - args: - - status_code + name: test7 logger: debug: -http_request: - useragent: esphome/tagreader - timeout: 10s - sensor: - platform: adc id: adc_sensor_p4 From 6de79d6cfbdf42b5fdc9b1f880b86210900dab5a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:22:41 +1200 Subject: [PATCH 011/151] [i2s_speaker] A few fixes (#6872) --- .../i2s_audio/speaker/i2s_audio_speaker.cpp | 40 +++++++++++++++---- .../i2s_audio/speaker/i2s_audio_speaker.h | 2 +- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp b/esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp index 546c2c98f7..6b07ecb1b6 100644 --- a/esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +++ b/esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp @@ -38,15 +38,22 @@ void I2SAudioSpeaker::start() { ESP_LOGE(TAG, "Cannot start audio, speaker failed to setup"); return; } + if (this->task_created_) { + ESP_LOGW(TAG, "Called start while task has been already created."); + return; + } this->state_ = speaker::STATE_STARTING; } void I2SAudioSpeaker::start_() { + if (this->task_created_) { + return; + } if (!this->parent_->try_lock()) { return; // Waiting for another i2s component to return lock } - this->state_ = speaker::STATE_RUNNING; xTaskCreate(I2SAudioSpeaker::player_task, "speaker_task", 8192, (void *) this, 1, &this->player_task_handle_); + this->task_created_ = true; } void I2SAudioSpeaker::player_task(void *params) { @@ -131,7 +138,16 @@ void I2SAudioSpeaker::player_task(void *params) { (10 / portTICK_PERIOD_MS)); if (err != ESP_OK) { event = {.type = TaskEventType::WARNING, .err = err}; - xQueueSend(this_speaker->event_queue_, &event, portMAX_DELAY); + if (xQueueSend(this_speaker->event_queue_, &event, 10 / portTICK_PERIOD_MS) != pdTRUE) { + ESP_LOGW(TAG, "Failed to send WARNING event"); + } + continue; + } + if (bytes_written != sizeof(sample)) { + event = {.type = TaskEventType::WARNING, .err = ESP_FAIL}; + if (xQueueSend(this_speaker->event_queue_, &event, 10 / portTICK_PERIOD_MS) != pdTRUE) { + ESP_LOGW(TAG, "Failed to send WARNING event"); + } continue; } remaining--; @@ -139,18 +155,25 @@ void I2SAudioSpeaker::player_task(void *params) { } event.type = TaskEventType::PLAYING; - xQueueSend(this_speaker->event_queue_, &event, portMAX_DELAY); + event.err = current; + if (xQueueSend(this_speaker->event_queue_, &event, 10 / portTICK_PERIOD_MS) != pdTRUE) { + ESP_LOGW(TAG, "Failed to send PLAYING event"); + } + } + + event.type = TaskEventType::STOPPING; + if (xQueueSend(this_speaker->event_queue_, &event, 10 / portTICK_PERIOD_MS) != pdTRUE) { + ESP_LOGW(TAG, "Failed to send STOPPING event"); } i2s_zero_dma_buffer(this_speaker->parent_->get_port()); - event.type = TaskEventType::STOPPING; - xQueueSend(this_speaker->event_queue_, &event, portMAX_DELAY); - i2s_driver_uninstall(this_speaker->parent_->get_port()); event.type = TaskEventType::STOPPED; - xQueueSend(this_speaker->event_queue_, &event, portMAX_DELAY); + if (xQueueSend(this_speaker->event_queue_, &event, 10 / portTICK_PERIOD_MS) != pdTRUE) { + ESP_LOGW(TAG, "Failed to send STOPPED event"); + } while (true) { delay(10); @@ -181,6 +204,7 @@ void I2SAudioSpeaker::watch_() { break; case TaskEventType::STARTED: ESP_LOGD(TAG, "Started I2S Audio Speaker"); + this->state_ = speaker::STATE_RUNNING; break; case TaskEventType::STOPPING: ESP_LOGD(TAG, "Stopping I2S Audio Speaker"); @@ -191,6 +215,7 @@ void I2SAudioSpeaker::watch_() { case TaskEventType::STOPPED: this->state_ = speaker::STATE_STOPPED; vTaskDelete(this->player_task_handle_); + this->task_created_ = false; this->player_task_handle_ = nullptr; this->parent_->unlock(); xQueueReset(this->buffer_queue_); @@ -208,7 +233,6 @@ void I2SAudioSpeaker::loop() { switch (this->state_) { case speaker::STATE_STARTING: this->start_(); - break; case speaker::STATE_RUNNING: case speaker::STATE_STOPPING: this->watch_(); diff --git a/esphome/components/i2s_audio/speaker/i2s_audio_speaker.h b/esphome/components/i2s_audio/speaker/i2s_audio_speaker.h index 20c36a69d3..1800feaeec 100644 --- a/esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +++ b/esphome/components/i2s_audio/speaker/i2s_audio_speaker.h @@ -60,7 +60,6 @@ class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAud protected: void start_(); - // void stop_(); void watch_(); static void player_task(void *params); @@ -70,6 +69,7 @@ class I2SAudioSpeaker : public Component, public speaker::Speaker, public I2SAud QueueHandle_t event_queue_; uint8_t dout_pin_{0}; + bool task_created_{false}; #if SOC_I2S_SUPPORTS_DAC i2s_dac_mode_t internal_dac_mode_{I2S_DAC_CHANNEL_DISABLE}; From dceab6ce29493e67caaa8cdadf8cf7f4df063635 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:22:55 +1200 Subject: [PATCH 012/151] [voice_assistant] Write less data to speaker each loop (#6877) --- esphome/components/voice_assistant/voice_assistant.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index e4fd2f2e9d..1fa8236cf4 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -428,14 +428,15 @@ void VoiceAssistant::loop() { #ifdef USE_SPEAKER void VoiceAssistant::write_speaker_() { if (this->speaker_buffer_size_ > 0) { - size_t written = this->speaker_->play(this->speaker_buffer_, this->speaker_buffer_size_); + size_t write_chunk = std::min(this->speaker_buffer_size_, 4 * 1024); + size_t written = this->speaker_->play(this->speaker_buffer_, write_chunk); if (written > 0) { memmove(this->speaker_buffer_, this->speaker_buffer_ + written, this->speaker_buffer_size_ - written); this->speaker_buffer_size_ -= written; this->speaker_buffer_index_ -= written; this->set_timeout("speaker-timeout", 5000, [this]() { this->speaker_->stop(); }); } else { - ESP_LOGD(TAG, "Speaker buffer full, trying again next loop"); + ESP_LOGV(TAG, "Speaker buffer full, trying again next loop"); } } } @@ -798,7 +799,7 @@ void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) { this->speaker_buffer_index_ += msg.data.length(); this->speaker_buffer_size_ += msg.data.length(); this->speaker_bytes_received_ += msg.data.length(); - ESP_LOGD(TAG, "Received audio: %d bytes from API", msg.data.length()); + ESP_LOGV(TAG, "Received audio: %" PRId32 " bytes from API", msg.data.length()); } else { ESP_LOGE(TAG, "Cannot receive audio, buffer is full"); } From 51a8a7e875fff4d9687f743a4fc8c02a6f201e9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:17:18 +1200 Subject: [PATCH 013/151] Bump docker/build-push-action from 5.3.0 to 5.4.0 in /.github/actions/build-image (#6883) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d36bd65bb6..d792ab5f4c 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v5.4.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v5.4.0 with: context: . file: ./docker/Dockerfile From 95e45dc12c9e313cbb5787978b3e067f581c76c9 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:40:56 +1200 Subject: [PATCH 014/151] Allow parse_json to return a boolean result (#6884) * Allow parse_json to return a boolean result * Remove pass variable --- esphome/components/json/json_util.cpp | 17 ++++++++--------- esphome/components/json/json_util.h | 4 ++-- esphome/components/mqtt/mqtt_client.cpp | 5 ++++- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/esphome/components/json/json_util.cpp b/esphome/components/json/json_util.cpp index bef494b64d..89ec13fe5b 100644 --- a/esphome/components/json/json_util.cpp +++ b/esphome/components/json/json_util.cpp @@ -62,7 +62,7 @@ std::string build_json(const json_build_t &f) { } } -void parse_json(const std::string &data, const json_parse_t &f) { +bool parse_json(const std::string &data, const json_parse_t &f) { // Here we are allocating 1.5 times the data size, // with the heap size minus 2kb to be safe if less than that // as we can not have a true dynamic sized document. @@ -76,14 +76,13 @@ void parse_json(const std::string &data, const json_parse_t &f) { #elif defined(USE_LIBRETINY) const size_t free_heap = lt_heap_get_free(); #endif - bool pass = false; size_t request_size = std::min(free_heap, (size_t) (data.size() * 1.5)); - do { + while (true) { DynamicJsonDocument json_document(request_size); if (json_document.capacity() == 0) { ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, free heap: %u", request_size, free_heap); - return; + return false; } DeserializationError err = deserializeJson(json_document, data); json_document.shrinkToFit(); @@ -91,21 +90,21 @@ void parse_json(const std::string &data, const json_parse_t &f) { JsonObject root = json_document.as(); if (err == DeserializationError::Ok) { - pass = true; - f(root); + return f(root); } else if (err == DeserializationError::NoMemory) { if (request_size * 2 >= free_heap) { ESP_LOGE(TAG, "Can not allocate more memory for deserialization. Consider making source string smaller"); - return; + return false; } ESP_LOGV(TAG, "Increasing memory allocation."); request_size *= 2; continue; } else { ESP_LOGE(TAG, "JSON parse error: %s", err.c_str()); - return; + return false; } - } while (!pass); + }; + return false; } } // namespace json diff --git a/esphome/components/json/json_util.h b/esphome/components/json/json_util.h index 2299a4cfed..72d31c8afe 100644 --- a/esphome/components/json/json_util.h +++ b/esphome/components/json/json_util.h @@ -14,7 +14,7 @@ namespace esphome { namespace json { /// Callback function typedef for parsing JsonObjects. -using json_parse_t = std::function; +using json_parse_t = std::function; /// Callback function typedef for building JsonObjects. using json_build_t = std::function; @@ -23,7 +23,7 @@ using json_build_t = std::function; std::string build_json(const json_build_t &f); /// Parse a JSON string and run the provided json parse function if it's valid. -void parse_json(const std::string &data, const json_parse_t &f); +bool parse_json(const std::string &data, const json_parse_t &f); } // namespace json } // namespace esphome diff --git a/esphome/components/mqtt/mqtt_client.cpp b/esphome/components/mqtt/mqtt_client.cpp index abcbb414d9..d70b9cbd30 100644 --- a/esphome/components/mqtt/mqtt_client.cpp +++ b/esphome/components/mqtt/mqtt_client.cpp @@ -410,7 +410,10 @@ void MQTTClientComponent::subscribe(const std::string &topic, mqtt_callback_t ca void MQTTClientComponent::subscribe_json(const std::string &topic, const mqtt_json_callback_t &callback, uint8_t qos) { auto f = [callback](const std::string &topic, const std::string &payload) { - json::parse_json(payload, [topic, callback](JsonObject root) { callback(topic, root); }); + json::parse_json(payload, [topic, callback](JsonObject root) -> bool { + callback(topic, root); + return true; + }); }; MQTTSubscription subscription{ .topic = topic, From 7dc07c5632a14986c7050639897eca8a7768d100 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Tue, 11 Jun 2024 11:33:42 +1200 Subject: [PATCH 015/151] Update webserver local assets to 20240610-230854 (#6886) --- .../components/web_server/server_index_v2.h | 1246 +++++++++-------- .../components/web_server/server_index_v3.h | 728 +++++----- 2 files changed, 994 insertions(+), 980 deletions(-) diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index 7417f37015..c942cda592 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -10,625 +10,633 @@ namespace esphome { namespace web_server { const uint8_t INDEX_GZ[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcd, 0x7d, 0xd9, 0x92, 0xdb, 0x46, 0xb6, 0xe0, 0xf3, - 0xdc, 0xaf, 0x40, 0xa5, 0xab, 0x4b, 0xc8, 0x66, 0x12, 0x45, 0xb2, 0xb4, 0x19, 0xac, 0x24, 0xbb, 0x54, 0x92, 0x5b, - 0x76, 0x6b, 0xb1, 0x55, 0x92, 0xdd, 0x36, 0xcd, 0xae, 0x42, 0x11, 0x49, 0x32, 0x2d, 0x10, 0x49, 0x03, 0xc9, 0x5a, - 0x4c, 0xe2, 0xc6, 0x7c, 0xc0, 0x44, 0x4c, 0xc4, 0x3c, 0xcd, 0xcb, 0xc4, 0xdc, 0x87, 0xf9, 0x88, 0x79, 0xbe, 0x9f, - 0x72, 0x7f, 0x60, 0xe6, 0x13, 0x26, 0x4e, 0x2e, 0x40, 0x82, 0x4b, 0xa9, 0xbc, 0xdc, 0x1b, 0x13, 0x0a, 0x49, 0x44, - 0xae, 0x27, 0x4f, 0x9e, 0x3c, 0x7b, 0x02, 0xc7, 0x7b, 0xb1, 0x18, 0xc9, 0xdb, 0x39, 0xf3, 0xa6, 0x72, 0x96, 0xf4, - 0x8e, 0xcd, 0xbf, 0x2c, 0x8a, 0x7b, 0xc7, 0x09, 0x4f, 0x3f, 0x7a, 0x19, 0x4b, 0x28, 0x1f, 0x89, 0xd4, 0x9b, 0x66, - 0x6c, 0x4c, 0xe3, 0x48, 0x46, 0x21, 0x9f, 0x45, 0x13, 0xe6, 0x1d, 0xf6, 0x8e, 0x67, 0x4c, 0x46, 0xde, 0x68, 0x1a, - 0x65, 0x39, 0x93, 0xf4, 0xc3, 0xfb, 0x2f, 0x9a, 0x4f, 0x7b, 0xc7, 0xf9, 0x28, 0xe3, 0x73, 0xe9, 0xc1, 0x90, 0x74, - 0x26, 0xe2, 0x45, 0xc2, 0x7a, 0x87, 0x87, 0xd7, 0xd7, 0xd7, 0xc1, 0x4f, 0xf9, 0x3f, 0x8d, 0x44, 0x9a, 0x4b, 0xef, - 0x15, 0xbd, 0xe6, 0x69, 0x2c, 0xae, 0x09, 0x93, 0xf4, 0x55, 0x70, 0x36, 0x8d, 0x62, 0x71, 0xfd, 0x4e, 0x08, 0x79, - 0x70, 0xe0, 0xeb, 0xc7, 0xdb, 0xd3, 0xb3, 0x33, 0x4a, 0xe9, 0x95, 0xe0, 0xb1, 0xd7, 0x5a, 0xad, 0xaa, 0xc2, 0x20, - 0x8d, 0x24, 0xbf, 0x62, 0xba, 0x0b, 0x3e, 0x38, 0x40, 0x51, 0x2c, 0xe6, 0x92, 0xc5, 0x67, 0xf2, 0x36, 0x61, 0x67, - 0x53, 0xc6, 0x64, 0x8e, 0x78, 0xea, 0x3d, 0x17, 0xa3, 0xc5, 0x8c, 0xa5, 0x32, 0x98, 0x67, 0x42, 0x0a, 0x80, 0xe4, - 0xe0, 0x00, 0x65, 0x6c, 0x9e, 0x44, 0x23, 0x06, 0xf5, 0xa7, 0x67, 0x67, 0x55, 0x8f, 0xaa, 0x11, 0xe1, 0x92, 0x9e, - 0xdd, 0xce, 0x2e, 0x45, 0xe2, 0x63, 0x92, 0x48, 0x9a, 0xb2, 0x6b, 0xef, 0x3b, 0x16, 0x7d, 0x7c, 0x1d, 0xcd, 0xbb, - 0xa3, 0x24, 0xca, 0x73, 0xef, 0x52, 0x2e, 0xd5, 0x12, 0xb2, 0xc5, 0x48, 0x8a, 0xcc, 0x97, 0x84, 0x11, 0x8e, 0x97, - 0x7c, 0xec, 0xcb, 0x29, 0xcf, 0x83, 0xf3, 0xfd, 0x51, 0x9e, 0xbf, 0x63, 0xf9, 0x22, 0x91, 0xfb, 0x74, 0xaf, 0x45, - 0xf8, 0x1e, 0xa5, 0x5c, 0x62, 0x39, 0xcd, 0xc4, 0xb5, 0xf7, 0x22, 0xcb, 0x44, 0xe6, 0xa3, 0xd3, 0xb3, 0x33, 0xdd, - 0xc2, 0xe3, 0xb9, 0x97, 0x0a, 0xe9, 0x95, 0xe3, 0x45, 0x97, 0x09, 0x0b, 0xbc, 0x0f, 0x39, 0xf3, 0x2e, 0x16, 0x69, - 0x1e, 0x8d, 0xd9, 0xe9, 0xd9, 0xd9, 0x85, 0x27, 0x32, 0xef, 0x62, 0x94, 0xe7, 0x17, 0x1e, 0x4f, 0x73, 0xc9, 0xa2, - 0x38, 0x40, 0xb8, 0xab, 0x26, 0x1b, 0xe5, 0xf9, 0x7b, 0x76, 0x23, 0xa9, 0x24, 0xea, 0x51, 0x52, 0x56, 0x4c, 0x98, - 0xf4, 0xf2, 0x72, 0x5d, 0x3e, 0x5e, 0x26, 0x4c, 0x7a, 0x92, 0xaa, 0x7a, 0xd1, 0xd5, 0xb8, 0x67, 0xfa, 0x51, 0x76, - 0xf9, 0xd8, 0x67, 0xf2, 0xe0, 0x40, 0x96, 0x78, 0xc6, 0x7a, 0x69, 0x1e, 0xa7, 0x6c, 0xcf, 0x96, 0x1d, 0x1c, 0xb0, - 0x20, 0x61, 0xe9, 0x44, 0x4e, 0x29, 0xa5, 0xed, 0x2e, 0x3f, 0x38, 0xf0, 0x25, 0x4d, 0x64, 0x30, 0x61, 0xd2, 0x67, - 0x18, 0x93, 0xaa, 0xf7, 0xc1, 0x81, 0xaf, 0x91, 0x20, 0xa8, 0x46, 0x5c, 0x0d, 0xc7, 0x38, 0x30, 0xd8, 0x3f, 0xbb, - 0x4d, 0x47, 0xbe, 0x0b, 0x3f, 0x26, 0xfc, 0xe0, 0x20, 0x91, 0x41, 0x0e, 0x23, 0x12, 0x89, 0x71, 0x91, 0x31, 0xb9, - 0xc8, 0x52, 0x4f, 0x16, 0x52, 0x9c, 0xc9, 0x8c, 0xa7, 0x13, 0x1f, 0x2f, 0x6d, 0x99, 0xd3, 0xb1, 0x28, 0x34, 0xb8, - 0x5f, 0x4b, 0x9a, 0xd1, 0x1e, 0xcc, 0x78, 0x29, 0x7d, 0xd8, 0x45, 0x31, 0xf6, 0x32, 0x4a, 0x51, 0xae, 0xfa, 0xa2, - 0x7e, 0x16, 0x66, 0x0d, 0x84, 0x88, 0x86, 0x92, 0x70, 0x89, 0xc9, 0x47, 0xea, 0x67, 0x24, 0x08, 0x02, 0x89, 0x69, - 0x6f, 0x69, 0xb1, 0x92, 0x39, 0xeb, 0xec, 0x67, 0x83, 0xd6, 0x30, 0x94, 0x41, 0xc6, 0xe2, 0xc5, 0x88, 0xf9, 0x3e, - 0x27, 0x39, 0x49, 0x31, 0xed, 0xf1, 0x86, 0x2f, 0x68, 0x0f, 0xb6, 0x5b, 0xd4, 0xf7, 0x9a, 0xd2, 0xbd, 0x16, 0x36, - 0x30, 0x0a, 0x0b, 0x20, 0x60, 0xd8, 0xc0, 0x23, 0x28, 0x45, 0xe9, 0x62, 0x76, 0xc9, 0x32, 0x54, 0x36, 0xeb, 0xd6, - 0xc8, 0x62, 0x91, 0x33, 0x6f, 0x94, 0xe7, 0xde, 0x78, 0x91, 0x8e, 0x24, 0x17, 0xa9, 0x87, 0x1a, 0xa2, 0x81, 0x34, - 0x39, 0x94, 0xd4, 0x80, 0x70, 0x81, 0xfd, 0x1c, 0x37, 0xb2, 0x41, 0xda, 0x68, 0x0f, 0x09, 0x40, 0x89, 0xbb, 0x66, - 0x3c, 0x83, 0x00, 0x46, 0x32, 0x58, 0x63, 0x41, 0x3e, 0x48, 0x58, 0xa5, 0x5a, 0x22, 0x93, 0xfd, 0x2c, 0xd8, 0x3c, - 0x28, 0x54, 0x06, 0xb3, 0x68, 0xee, 0x33, 0xda, 0x63, 0x8a, 0xb8, 0xa2, 0x74, 0x04, 0xb0, 0xd6, 0xf6, 0xad, 0xcf, - 0x42, 0x16, 0x54, 0x24, 0x85, 0x43, 0x19, 0x8c, 0x45, 0xf6, 0x22, 0x1a, 0x4d, 0xa1, 0x5f, 0x49, 0x30, 0xb1, 0x3d, - 0x6f, 0xa3, 0x8c, 0x45, 0x92, 0xbd, 0x48, 0x18, 0x3c, 0xf9, 0x48, 0xf5, 0x44, 0x98, 0xe4, 0xf4, 0x55, 0x90, 0x70, - 0xf9, 0x46, 0xa4, 0x23, 0xd6, 0xcd, 0x1d, 0xea, 0xe2, 0xb0, 0xef, 0x27, 0x52, 0x66, 0xfc, 0x72, 0x21, 0x99, 0x8f, - 0x52, 0x68, 0x81, 0x48, 0x8e, 0x09, 0x0f, 0x24, 0xbb, 0x91, 0xa7, 0x22, 0x95, 0x2c, 0x95, 0x94, 0x59, 0xa4, 0x92, - 0x2c, 0x88, 0xe6, 0x73, 0x96, 0xc6, 0xa7, 0x53, 0x9e, 0xc4, 0x3e, 0xc7, 0x05, 0x2e, 0x48, 0x24, 0x29, 0xac, 0x91, - 0xf6, 0xb2, 0x10, 0xfe, 0xd9, 0xbd, 0x1a, 0x5f, 0xd2, 0x9e, 0x3a, 0x14, 0x8c, 0x22, 0xd4, 0x1d, 0x8b, 0xcc, 0x37, - 0x2b, 0xf0, 0xc4, 0xd8, 0x93, 0x30, 0xc7, 0xbb, 0x45, 0xc2, 0x72, 0xcc, 0x1a, 0x94, 0x97, 0xdb, 0x68, 0x10, 0xfc, - 0x35, 0x50, 0x7c, 0x81, 0xfd, 0x0c, 0x87, 0x59, 0xf7, 0x2a, 0xca, 0xbc, 0x2f, 0xcc, 0x89, 0xfa, 0xc9, 0x72, 0xb3, - 0xa9, 0xa4, 0x3f, 0x05, 0x32, 0x5b, 0xe4, 0x92, 0xc5, 0xef, 0x6f, 0xe7, 0x2c, 0x27, 0xef, 0x25, 0x9d, 0xca, 0xfe, - 0x54, 0x06, 0x6c, 0x36, 0x97, 0xb7, 0x67, 0x8a, 0x31, 0x86, 0x08, 0x91, 0x11, 0xb4, 0xcc, 0x58, 0x34, 0x02, 0x66, - 0x66, 0xb0, 0xf5, 0xb5, 0x48, 0x6e, 0xc7, 0x3c, 0x49, 0xce, 0x16, 0xf3, 0xb9, 0xc8, 0x24, 0xf9, 0x2b, 0x5d, 0x4a, - 0x51, 0xa1, 0x06, 0xf6, 0x72, 0x99, 0x5f, 0x73, 0x39, 0x9a, 0xfa, 0x12, 0x2f, 0x47, 0x51, 0xce, 0xbc, 0x67, 0x42, - 0x24, 0x2c, 0x4a, 0xc3, 0x8c, 0x66, 0xfd, 0xf7, 0x32, 0x4c, 0x17, 0x49, 0xd2, 0xbd, 0xcc, 0x58, 0xf4, 0xb1, 0xab, - 0xaa, 0xdf, 0x5e, 0xfe, 0xc4, 0x46, 0x32, 0x54, 0xbf, 0x4f, 0xb2, 0x2c, 0xba, 0x85, 0x86, 0x94, 0x42, 0xb3, 0x7e, - 0x16, 0x7e, 0x75, 0xf6, 0xf6, 0x4d, 0xa0, 0x0f, 0x09, 0x1f, 0xdf, 0xfa, 0x59, 0x79, 0xf0, 0xb2, 0x82, 0x8c, 0x33, - 0x31, 0x5b, 0x9b, 0x5a, 0x63, 0x2d, 0xeb, 0xee, 0x00, 0x81, 0xd1, 0x6c, 0x4f, 0x0f, 0xed, 0x42, 0xf0, 0x46, 0xd1, - 0x3c, 0x54, 0x52, 0x33, 0x2f, 0xfc, 0x13, 0xea, 0x62, 0x3f, 0xc3, 0x77, 0x43, 0x2b, 0xb3, 0xdb, 0x25, 0xa3, 0x0a, - 0xce, 0x39, 0x48, 0x18, 0x80, 0x71, 0x14, 0xc9, 0xd1, 0x74, 0xc9, 0xd4, 0x60, 0x85, 0x85, 0x98, 0x15, 0x05, 0xb9, - 0x2e, 0xe9, 0x5d, 0xee, 0x51, 0x9a, 0x29, 0x46, 0x45, 0xe5, 0x6a, 0x95, 0x51, 0x9a, 0x61, 0xf2, 0x1d, 0x5d, 0x46, - 0x76, 0x3d, 0xe1, 0x5e, 0x8b, 0xc0, 0xb9, 0x0c, 0x35, 0x77, 0x21, 0x23, 0x91, 0x5e, 0xb1, 0x4c, 0xb2, 0x2c, 0xfc, - 0x2b, 0xc9, 0xd8, 0x38, 0x01, 0x28, 0xf6, 0xda, 0x64, 0x1a, 0xe5, 0xa7, 0xd3, 0x28, 0x9d, 0xb0, 0x38, 0xbc, 0x96, - 0x05, 0xf9, 0x3b, 0x45, 0x63, 0x9e, 0x46, 0x09, 0xff, 0x85, 0xc5, 0xc8, 0x48, 0x83, 0x13, 0x8f, 0xdd, 0x48, 0x96, - 0xc6, 0xb9, 0xf7, 0xf2, 0xfd, 0xeb, 0x57, 0x66, 0x1f, 0x6b, 0x02, 0x02, 0x2f, 0xf3, 0xc5, 0x9c, 0x65, 0x3e, 0x26, - 0x46, 0x40, 0xbc, 0xe0, 0x8a, 0x39, 0xbe, 0x8e, 0xe6, 0xba, 0x84, 0xe7, 0x1f, 0xe6, 0x71, 0x24, 0xd9, 0xd7, 0x2c, - 0x8d, 0x79, 0x3a, 0xa1, 0x7b, 0x6d, 0x5d, 0x3e, 0x8d, 0x4c, 0x45, 0x5c, 0x16, 0x9d, 0xef, 0xbf, 0x48, 0xd4, 0xba, - 0xcb, 0xc7, 0x85, 0x8f, 0x8b, 0x5c, 0x46, 0x92, 0x8f, 0xbc, 0x28, 0x8e, 0xbf, 0x4c, 0xb9, 0xe4, 0x0a, 0xc0, 0x0c, - 0xb6, 0x07, 0x48, 0x94, 0x69, 0x51, 0x61, 0x01, 0xf7, 0x31, 0xf1, 0x7d, 0x23, 0x00, 0xa6, 0xd8, 0xec, 0xd7, 0xc1, - 0x41, 0xc5, 0xee, 0xfb, 0x2c, 0xd4, 0x95, 0x74, 0x30, 0xc4, 0xc1, 0x7c, 0x91, 0xc3, 0x46, 0xdb, 0x29, 0x40, 0xba, - 0x88, 0xcb, 0x9c, 0x65, 0x57, 0x2c, 0x2e, 0x89, 0x23, 0xf7, 0xf1, 0x72, 0x6d, 0x0e, 0x73, 0x2c, 0x24, 0x1d, 0x0c, - 0xbb, 0x2e, 0xdf, 0x66, 0x86, 0xce, 0x33, 0x31, 0x67, 0x99, 0xe4, 0x2c, 0x2f, 0x59, 0x89, 0x0f, 0x52, 0xb4, 0x64, - 0x27, 0x39, 0xb5, 0xeb, 0x9b, 0xfb, 0x9c, 0x30, 0x5c, 0x63, 0x18, 0x56, 0xd0, 0xbe, 0xb8, 0x52, 0x12, 0x23, 0x27, - 0x1c, 0x13, 0xa9, 0x21, 0xcd, 0x31, 0x2e, 0x30, 0x91, 0x16, 0x5c, 0xcd, 0x8a, 0xcc, 0x6c, 0xb7, 0x20, 0xaa, 0xe9, - 0x77, 0x4a, 0x54, 0x03, 0x43, 0x8b, 0x24, 0x3b, 0x38, 0xf0, 0x59, 0x50, 0x12, 0x05, 0xdd, 0x6b, 0x9b, 0x3d, 0x72, - 0x90, 0xb5, 0x03, 0x6c, 0x98, 0x58, 0x12, 0x86, 0xc9, 0x1e, 0x0b, 0x52, 0x71, 0x32, 0x1a, 0xb1, 0x3c, 0x17, 0xd9, - 0xc1, 0xc1, 0x9e, 0x6a, 0x5f, 0x6a, 0x13, 0xb0, 0x87, 0x6f, 0xaf, 0xd3, 0x0a, 0x02, 0x5c, 0x49, 0x58, 0x23, 0x17, - 0x24, 0xc8, 0x29, 0xa5, 0x70, 0xa0, 0xbe, 0x55, 0x3c, 0x42, 0x74, 0x7e, 0x8e, 0x1a, 0x92, 0x18, 0x34, 0x4c, 0x98, - 0x9d, 0xfa, 0xf6, 0x39, 0xd3, 0xaa, 0x95, 0x52, 0x3c, 0x36, 0x30, 0xa3, 0xcf, 0x4f, 0x10, 0xb3, 0x31, 0x4f, 0x9d, - 0x65, 0xd7, 0x40, 0x22, 0x92, 0xe4, 0xb8, 0x70, 0x36, 0x74, 0xeb, 0xd0, 0x4a, 0xa7, 0xd1, 0x3b, 0xb7, 0x9c, 0x28, - 0x3d, 0xc2, 0xd9, 0xc6, 0x01, 0x1b, 0x16, 0x44, 0xa1, 0xde, 0xae, 0x26, 0x55, 0x80, 0x0e, 0xe4, 0xb0, 0x6b, 0xea, - 0x69, 0xae, 0x31, 0x97, 0xb1, 0x9f, 0x17, 0x2c, 0x97, 0x9a, 0x8e, 0x7d, 0x49, 0x52, 0xc2, 0x71, 0x01, 0xc7, 0x6d, - 0xcc, 0x27, 0x8b, 0x0c, 0xd4, 0x1d, 0x38, 0x8a, 0x2c, 0x5d, 0xcc, 0x98, 0x7d, 0xda, 0x06, 0xdb, 0xdb, 0x39, 0x08, - 0xc4, 0x1c, 0x68, 0xfa, 0x6e, 0x72, 0x02, 0x58, 0x25, 0x5e, 0xad, 0xbe, 0xb3, 0x83, 0x54, 0x5b, 0x59, 0xaa, 0x68, - 0x6b, 0x7b, 0xf2, 0x77, 0x6c, 0xe4, 0xf1, 0x5e, 0x5b, 0x43, 0xff, 0xf7, 0x21, 0xdd, 0x6b, 0x95, 0x14, 0x6c, 0x70, - 0xaa, 0x81, 0xd1, 0x28, 0x7c, 0xab, 0x07, 0xc2, 0x4a, 0xba, 0xd7, 0x88, 0x25, 0x98, 0x6e, 0xd0, 0xe9, 0x94, 0x0e, - 0x40, 0xcf, 0x08, 0xa6, 0xc3, 0x5d, 0xc4, 0x64, 0xb9, 0x81, 0x2f, 0x37, 0xeb, 0x2a, 0xa6, 0x71, 0x55, 0x67, 0x1a, - 0x6b, 0x8b, 0x40, 0xf3, 0xb2, 0x0b, 0x2a, 0x69, 0xcc, 0x1c, 0xf3, 0xaa, 0x8a, 0x70, 0x05, 0x4c, 0xb5, 0x24, 0x67, - 0x88, 0x37, 0xd1, 0x8c, 0xe5, 0x3e, 0xc3, 0x64, 0x57, 0x03, 0x4d, 0x9c, 0xd0, 0x64, 0xe8, 0x88, 0xcd, 0x1c, 0xc4, - 0x26, 0xc7, 0x5a, 0x2b, 0xab, 0x1f, 0xb7, 0x9c, 0xb0, 0x41, 0x3e, 0xac, 0x94, 0x39, 0x67, 0xf1, 0x4a, 0x1e, 0x1b, - 0xea, 0xb6, 0xf8, 0xd3, 0x65, 0x1a, 0x69, 0x4a, 0x69, 0xc8, 0x31, 0xd9, 0x6b, 0xad, 0xef, 0xa3, 0x6d, 0x55, 0xad, - 0x71, 0x30, 0x84, 0x7d, 0x50, 0xe2, 0x22, 0xe0, 0xb9, 0xfa, 0xbf, 0x76, 0xce, 0x00, 0x6d, 0x67, 0x40, 0x16, 0xc1, - 0x38, 0x89, 0xa4, 0xdf, 0x3e, 0x6c, 0x81, 0x26, 0x7a, 0xc5, 0x40, 0x9a, 0x60, 0xbc, 0xb9, 0x14, 0x16, 0x2c, 0xd2, - 0x7c, 0xca, 0xc7, 0xd2, 0x8f, 0xa4, 0x62, 0x28, 0x2c, 0xc9, 0x99, 0x27, 0x6b, 0xfa, 0xb0, 0x62, 0x36, 0x11, 0x90, - 0x5a, 0xa9, 0x7c, 0x31, 0x0b, 0xa9, 0x62, 0x5a, 0xc0, 0x1b, 0x2a, 0x5d, 0xba, 0xe2, 0x31, 0xb6, 0x35, 0x07, 0x7d, - 0xb1, 0xdd, 0xd7, 0x23, 0x86, 0x86, 0x15, 0x70, 0x47, 0x65, 0xe5, 0xa1, 0xcb, 0x1f, 0x4c, 0xa1, 0x0c, 0xa4, 0x78, - 0x25, 0xae, 0x59, 0x76, 0x1a, 0x01, 0xf0, 0xa1, 0xee, 0x5e, 0x68, 0x31, 0xa0, 0xb8, 0xbd, 0xec, 0x5a, 0x7a, 0x39, - 0x57, 0x0b, 0xff, 0x3a, 0x13, 0x33, 0x9e, 0x33, 0xd0, 0xd4, 0x34, 0xfe, 0x53, 0x38, 0x65, 0xea, 0x38, 0x82, 0xa8, - 0x61, 0x25, 0x7d, 0x9d, 0xbc, 0xaa, 0xd3, 0xd7, 0xf9, 0xfe, 0x8b, 0x89, 0x65, 0x7f, 0xf5, 0x43, 0x8c, 0x89, 0x6f, - 0xec, 0x09, 0x47, 0xca, 0x05, 0x53, 0x6c, 0xc4, 0xfb, 0x6a, 0x25, 0x1d, 0xb3, 0xad, 0xa6, 0x2b, 0x32, 0x7d, 0x6c, - 0x70, 0x11, 0xc5, 0x31, 0x68, 0x75, 0x99, 0x48, 0x12, 0x47, 0x50, 0x11, 0xde, 0x2d, 0x45, 0xd3, 0xf9, 0xfe, 0x8b, - 0xb3, 0xbb, 0xa4, 0x13, 0xd4, 0xbb, 0x02, 0xca, 0x02, 0x9a, 0xc6, 0x2c, 0x03, 0x33, 0xd2, 0xd9, 0x2d, 0x23, 0x63, - 0x4f, 0x45, 0x9a, 0xb2, 0x91, 0x64, 0x31, 0x58, 0x29, 0x9c, 0xca, 0x60, 0x2a, 0x72, 0x59, 0x16, 0x56, 0xd0, 0x73, - 0x07, 0x7a, 0x1e, 0x8c, 0xa2, 0x24, 0xf1, 0xb5, 0x45, 0x32, 0x13, 0x57, 0x6c, 0x0b, 0xd4, 0xdd, 0x1a, 0xc8, 0xe5, - 0x30, 0xcc, 0x19, 0x86, 0x05, 0xf9, 0x3c, 0xe1, 0x23, 0x56, 0x0a, 0xae, 0xb3, 0x80, 0xa7, 0x31, 0xbb, 0x01, 0x3e, - 0x82, 0x7b, 0xbd, 0x5e, 0x8b, 0xb4, 0x71, 0xa1, 0x11, 0xbe, 0xdc, 0x40, 0xec, 0x1d, 0x22, 0x13, 0x88, 0x8c, 0xf6, - 0x96, 0xdb, 0xf8, 0x01, 0xc3, 0x8e, 0x9c, 0xe4, 0xd6, 0xb2, 0xd2, 0xbc, 0x19, 0x93, 0x98, 0x25, 0x4c, 0x32, 0xcb, - 0xcb, 0x41, 0x7f, 0xd6, 0x47, 0xf7, 0x5d, 0x89, 0xbf, 0x92, 0x9c, 0xec, 0x29, 0xb3, 0x7b, 0x9e, 0x97, 0x96, 0x7a, - 0xb5, 0x3d, 0x15, 0xb6, 0xfb, 0x52, 0x6f, 0x4f, 0x24, 0x65, 0x34, 0x9a, 0x6a, 0x13, 0xdd, 0xdf, 0x58, 0x52, 0x35, - 0x86, 0xe1, 0xeb, 0xe5, 0x21, 0xfa, 0x60, 0xc1, 0xdc, 0x86, 0x82, 0x33, 0xc3, 0x14, 0x18, 0x58, 0x7d, 0x7a, 0xdb, - 0x4e, 0xa3, 0x24, 0xb9, 0x8c, 0x46, 0x1f, 0xeb, 0xd4, 0x5f, 0x91, 0x01, 0x5d, 0xe7, 0xc6, 0x4e, 0x95, 0xc3, 0xb2, - 0xdc, 0x75, 0x5b, 0x2e, 0x5d, 0x3b, 0x28, 0xfe, 0x5e, 0xab, 0x22, 0xfb, 0xfa, 0x46, 0xef, 0xa4, 0x76, 0x05, 0x11, - 0x37, 0x2b, 0xf3, 0x81, 0x0b, 0x7c, 0x92, 0xe2, 0x2c, 0x3f, 0x30, 0x74, 0x07, 0xb6, 0x46, 0xb1, 0x06, 0x88, 0xc4, - 0xcb, 0x22, 0xe6, 0xf9, 0x6e, 0x0c, 0xfc, 0x21, 0x50, 0x3e, 0x77, 0x66, 0xb8, 0x2f, 0xa0, 0x25, 0x8f, 0x33, 0x2a, - 0x73, 0x09, 0x99, 0xd1, 0x26, 0x2c, 0xa3, 0xf9, 0x1b, 0x68, 0x2e, 0x8a, 0xde, 0xdf, 0xea, 0x2a, 0xd0, 0xc9, 0x00, - 0x8a, 0xbc, 0xeb, 0x2a, 0x13, 0x35, 0x0a, 0x30, 0x3c, 0x95, 0x2b, 0x91, 0x9b, 0xd6, 0x8c, 0x47, 0xa3, 0xae, 0x6b, - 0xfb, 0xdb, 0xb0, 0x5c, 0x41, 0x7d, 0xdf, 0xcf, 0xc1, 0x7e, 0xb3, 0x7a, 0x7d, 0xb5, 0x88, 0x7c, 0x63, 0x11, 0x79, - 0xe0, 0x18, 0x59, 0xb8, 0xa2, 0x65, 0xa7, 0x7b, 0xf8, 0x57, 0xec, 0x36, 0x02, 0x65, 0x35, 0x00, 0xfe, 0x8c, 0x4b, - 0x76, 0x9b, 0x50, 0x49, 0x84, 0x31, 0x70, 0x0c, 0xa5, 0x01, 0xc3, 0xa8, 0xba, 0xa4, 0x58, 0x1f, 0x8d, 0x9a, 0xb1, - 0x9b, 0x12, 0x81, 0xd7, 0x34, 0xfb, 0xa2, 0x30, 0x38, 0x62, 0xd8, 0xec, 0x4d, 0x4d, 0x25, 0x76, 0xb0, 0x42, 0x52, - 0x6a, 0xd4, 0x60, 0xad, 0xf5, 0xac, 0xe3, 0xa6, 0x1c, 0x17, 0x0e, 0x6a, 0x85, 0x9a, 0x9a, 0x3e, 0x69, 0x15, 0xab, - 0x14, 0x93, 0xa9, 0xd5, 0x48, 0x45, 0xb5, 0x6e, 0x4a, 0x91, 0xf5, 0x46, 0xa0, 0xfe, 0xb2, 0x66, 0x12, 0x86, 0x4e, - 0xb3, 0x22, 0x04, 0x96, 0x2a, 0xb6, 0xa1, 0x7b, 0x1b, 0xcd, 0xd4, 0xc6, 0x71, 0x10, 0x2e, 0x5c, 0x84, 0x3b, 0x98, - 0x4d, 0x35, 0xe7, 0x4a, 0x87, 0x74, 0x5a, 0xef, 0xeb, 0x33, 0x22, 0xf4, 0x3e, 0x6c, 0x20, 0x71, 0x5d, 0xf1, 0x54, - 0x24, 0x08, 0x06, 0x6c, 0x0e, 0xca, 0x9d, 0x2b, 0x1f, 0x7c, 0x80, 0x9d, 0xaf, 0x56, 0x1b, 0x44, 0xb7, 0x55, 0xff, - 0xc4, 0x41, 0x65, 0x14, 0xae, 0x56, 0xd7, 0x12, 0xfb, 0x46, 0xf3, 0x25, 0x0c, 0xf7, 0x2d, 0xc7, 0x3d, 0x79, 0x05, - 0xad, 0x94, 0x22, 0x5a, 0x95, 0x94, 0x26, 0x43, 0x9d, 0x66, 0xeb, 0xfb, 0x24, 0x1d, 0xb6, 0x7d, 0xba, 0xc1, 0xbd, - 0x54, 0xa1, 0x11, 0xd3, 0xd5, 0x92, 0x4f, 0xcd, 0xd0, 0x1c, 0x63, 0x1c, 0xe6, 0xca, 0x8a, 0xd9, 0xdb, 0x66, 0x58, - 0x1e, 0x1c, 0xe4, 0xce, 0x40, 0xe7, 0x25, 0x9b, 0xf8, 0xc9, 0x07, 0x91, 0x9c, 0xdf, 0xa6, 0x4a, 0x77, 0xf9, 0xc9, - 0x0a, 0xa1, 0x0d, 0xb3, 0xb4, 0xd5, 0x05, 0x6b, 0x3c, 0xba, 0x8e, 0xb8, 0xf4, 0xca, 0x51, 0xb4, 0x35, 0xee, 0x33, - 0xbc, 0x34, 0xaa, 0x46, 0x90, 0x31, 0x50, 0x1e, 0x81, 0x27, 0x58, 0x15, 0x5a, 0xd3, 0xfd, 0x68, 0xca, 0xc0, 0x11, - 0x6c, 0xb5, 0x88, 0xd2, 0x2e, 0xdc, 0x33, 0x52, 0xc4, 0x0c, 0xbc, 0x1d, 0xf6, 0x62, 0xbd, 0x7b, 0xcd, 0x0e, 0x98, - 0xb3, 0x6c, 0x2c, 0xb2, 0x99, 0xad, 0x2b, 0xd6, 0x9e, 0x0d, 0x67, 0xe4, 0x63, 0x7f, 0xeb, 0xd8, 0x46, 0xfd, 0xef, - 0xae, 0x19, 0xdd, 0x95, 0xb9, 0x5e, 0x13, 0xa5, 0xa5, 0xf4, 0xd5, 0xfe, 0x40, 0x4b, 0x99, 0xb9, 0x6b, 0xde, 0x1b, - 0x67, 0x6a, 0x57, 0x3b, 0x4c, 0xf6, 0xda, 0xdd, 0xd2, 0xe6, 0xb3, 0xd4, 0xd0, 0xd5, 0x8e, 0x0d, 0x23, 0x52, 0xc5, - 0x22, 0x89, 0x0d, 0xb0, 0x1c, 0x13, 0x66, 0xe8, 0xe8, 0x9a, 0x27, 0x49, 0x55, 0xfa, 0x6b, 0xf8, 0x7a, 0x6e, 0xf8, - 0x7a, 0x6a, 0xf9, 0x3a, 0x70, 0x0a, 0xe0, 0xeb, 0x7a, 0xb8, 0xaa, 0x7b, 0xba, 0x71, 0x3a, 0x53, 0xcd, 0xd1, 0x73, - 0x65, 0x47, 0xc3, 0x7c, 0x0b, 0x0b, 0x01, 0x2e, 0x35, 0xaf, 0x8f, 0xbe, 0x71, 0xc2, 0x80, 0x01, 0xa8, 0x5d, 0x98, - 0xcc, 0x75, 0x51, 0x7c, 0xf4, 0x31, 0xc9, 0x0b, 0x56, 0x52, 0xf6, 0xc9, 0x0b, 0x70, 0xd2, 0x39, 0xcb, 0x01, 0x21, - 0xa6, 0x8a, 0x7f, 0x95, 0x12, 0x65, 0x57, 0xc7, 0xcd, 0xea, 0x72, 0xbb, 0x3a, 0xe0, 0xf4, 0xd5, 0xea, 0xe2, 0xbb, - 0x79, 0xbd, 0x5a, 0x1e, 0x2f, 0x97, 0x57, 0xed, 0xf7, 0x6a, 0xe5, 0xaf, 0x95, 0x80, 0xff, 0xde, 0x98, 0x28, 0x59, - 0x39, 0x3a, 0xf0, 0x00, 0x17, 0x33, 0x50, 0x50, 0xe8, 0x45, 0x97, 0x22, 0xee, 0xd5, 0xa7, 0x1c, 0x3c, 0xca, 0x4d, - 0xaf, 0xfb, 0x9f, 0x8a, 0xd9, 0x1c, 0xb4, 0xb1, 0x35, 0x92, 0x9e, 0x30, 0x33, 0x61, 0x55, 0x5f, 0x6c, 0x29, 0xab, - 0xf5, 0x51, 0xe7, 0xb1, 0x46, 0x4d, 0xa5, 0xbd, 0xbc, 0xd7, 0x2a, 0x16, 0x65, 0x51, 0xc9, 0x38, 0xb6, 0x39, 0x55, - 0x4e, 0xd7, 0x5d, 0x32, 0xb6, 0xe2, 0xad, 0xcf, 0x35, 0x1f, 0xe6, 0xc0, 0xeb, 0x1c, 0xf6, 0x63, 0xc9, 0xdd, 0xdd, - 0xff, 0xa2, 0x42, 0xce, 0xb2, 0x58, 0x43, 0xdf, 0xb2, 0x28, 0x4e, 0xb4, 0x91, 0x4d, 0x4e, 0x76, 0x5b, 0xc3, 0x55, - 0x9d, 0x31, 0x16, 0x07, 0x43, 0x72, 0xb2, 0xa9, 0x3a, 0xd2, 0xe5, 0x4c, 0xc4, 0x2c, 0x44, 0x62, 0xce, 0x52, 0x54, - 0x80, 0x57, 0xd5, 0xec, 0xfd, 0x48, 0xfa, 0xcb, 0x77, 0x75, 0xf7, 0x6a, 0x78, 0x52, 0x80, 0xf7, 0xeb, 0x8b, 0x4d, - 0xc7, 0xeb, 0xb7, 0x2c, 0xcb, 0x95, 0x22, 0x5a, 0xea, 0xb4, 0x5f, 0x54, 0x62, 0xe9, 0x8b, 0x70, 0x67, 0xfb, 0xca, - 0x04, 0x41, 0xed, 0xe0, 0x71, 0x70, 0x84, 0xb0, 0x72, 0x0b, 0x7f, 0x65, 0x0e, 0xfc, 0x73, 0xeb, 0x16, 0x7e, 0x41, - 0x9f, 0xd7, 0xbd, 0xc2, 0xb1, 0xa4, 0x2f, 0xfa, 0x2f, 0xac, 0xc5, 0x2c, 0x12, 0x3e, 0xba, 0xf5, 0x51, 0xc2, 0x65, - 0x13, 0x42, 0x6f, 0x88, 0x2c, 0x75, 0x05, 0xb8, 0x14, 0x95, 0x3b, 0xbb, 0xb0, 0xb6, 0x1e, 0x91, 0x92, 0xa2, 0xfd, - 0x84, 0xcb, 0x7d, 0x44, 0x66, 0xf4, 0x02, 0x7e, 0xec, 0x2f, 0xfd, 0xd7, 0x91, 0x9c, 0x06, 0x59, 0x94, 0xc6, 0x62, - 0xe6, 0xe3, 0x06, 0x42, 0x38, 0xc8, 0x95, 0xbd, 0xf1, 0x39, 0x2e, 0xf6, 0x2f, 0xc8, 0x8d, 0xa4, 0xa8, 0x8f, 0x1a, - 0x33, 0xf2, 0x52, 0xd2, 0x8b, 0xe3, 0xfd, 0xe5, 0x8d, 0x2c, 0x7a, 0x17, 0xe4, 0xa6, 0xf4, 0xd8, 0x93, 0xaf, 0xa9, - 0x8f, 0x69, 0xef, 0xc6, 0x40, 0x73, 0x2a, 0x66, 0xda, 0x73, 0x8f, 0x30, 0xf9, 0x00, 0x71, 0x95, 0xac, 0xe2, 0x36, - 0x26, 0xb4, 0xb2, 0x47, 0x91, 0x50, 0x2e, 0x02, 0x74, 0x70, 0xe0, 0x94, 0x95, 0xaa, 0x02, 0x39, 0x91, 0xb4, 0x66, - 0x90, 0x93, 0x37, 0x2a, 0x42, 0x73, 0x22, 0xfd, 0x0c, 0xdb, 0x61, 0x7c, 0xeb, 0x87, 0x36, 0x47, 0x33, 0x1b, 0x68, - 0x0f, 0x43, 0xc0, 0x25, 0xcb, 0x22, 0x29, 0xb2, 0x21, 0x76, 0xd5, 0x0f, 0xf2, 0x37, 0x7a, 0x31, 0xf0, 0xfe, 0xd3, - 0x3f, 0xfd, 0x38, 0xfe, 0x31, 0x1b, 0x5e, 0x90, 0xb7, 0xf4, 0xf0, 0xd8, 0xef, 0x87, 0xfe, 0x5e, 0xb3, 0xb9, 0xfa, - 0xf1, 0x70, 0xf0, 0x8f, 0xa8, 0xf9, 0xcb, 0x49, 0xf3, 0x87, 0x21, 0x5e, 0xf9, 0x3f, 0x1e, 0xf6, 0x07, 0xe6, 0x69, - 0xf0, 0x8f, 0xde, 0x8f, 0xf9, 0xf0, 0xcf, 0xba, 0x70, 0x1f, 0xe3, 0xc3, 0x09, 0x59, 0x48, 0x7a, 0xd8, 0x6c, 0xf6, - 0x0e, 0x27, 0x64, 0x2e, 0xe9, 0x21, 0xfc, 0x7f, 0x49, 0xdf, 0xb1, 0xc9, 0x8b, 0x9b, 0xb9, 0x7f, 0xd1, 0x5b, 0xed, - 0x2f, 0xff, 0x56, 0xc0, 0xa8, 0x83, 0x7f, 0xfc, 0xf8, 0x63, 0x8e, 0x1e, 0xf4, 0xe8, 0xe1, 0xb0, 0x81, 0x7d, 0x28, - 0xfd, 0x33, 0x55, 0xff, 0xfa, 0xfd, 0x70, 0xf0, 0x0f, 0x03, 0x05, 0x7a, 0xf0, 0xe3, 0xc5, 0x71, 0x8f, 0x0e, 0x57, - 0x3e, 0x5a, 0x3d, 0xc0, 0x2b, 0x8c, 0x57, 0xfb, 0xf8, 0x82, 0xa0, 0x09, 0xc2, 0x64, 0x22, 0xe9, 0xe1, 0x83, 0xc3, - 0x09, 0xb9, 0x92, 0xf4, 0x10, 0x1d, 0x4e, 0xc8, 0x0b, 0x49, 0x0f, 0xff, 0xe1, 0xf7, 0x43, 0xed, 0x61, 0x5b, 0x29, - 0xf7, 0xc6, 0x0a, 0x82, 0x1b, 0x51, 0xc6, 0xa2, 0x95, 0xe4, 0x32, 0x61, 0x78, 0xff, 0x90, 0x93, 0x33, 0x85, 0x26, - 0x5f, 0x82, 0x13, 0x06, 0x6c, 0x3b, 0x7f, 0x79, 0x0e, 0x9b, 0x0d, 0x34, 0xb3, 0x1f, 0x66, 0x44, 0xfb, 0x01, 0xf2, - 0x50, 0x92, 0xab, 0x28, 0x59, 0xb0, 0x3c, 0x64, 0x05, 0x26, 0x23, 0x7a, 0x26, 0xfd, 0x36, 0x26, 0xef, 0x24, 0xfc, - 0xe8, 0x60, 0x72, 0x66, 0x02, 0x98, 0x70, 0x90, 0x35, 0x51, 0xa5, 0x42, 0x6b, 0x2c, 0x08, 0x93, 0xf9, 0x96, 0x4a, - 0x39, 0x05, 0xef, 0x02, 0x26, 0xe3, 0x5a, 0xb8, 0x93, 0x5c, 0x53, 0x4b, 0x12, 0xef, 0x33, 0xc6, 0xbe, 0x8b, 0x92, - 0x8f, 0x2c, 0xf3, 0x6f, 0x48, 0xbb, 0xf3, 0x39, 0x51, 0x2e, 0xe8, 0xbd, 0x36, 0xee, 0x96, 0xb1, 0xaa, 0x53, 0xa9, - 0x63, 0x04, 0x20, 0x64, 0xeb, 0xbe, 0x18, 0xd8, 0xf1, 0xbd, 0x6c, 0xc3, 0x61, 0x95, 0x45, 0xd7, 0x08, 0xd7, 0xe3, - 0xa2, 0x3c, 0xbd, 0x8a, 0x12, 0x1e, 0x7b, 0x92, 0xcd, 0xe6, 0x49, 0x24, 0x99, 0x67, 0xd6, 0xeb, 0x45, 0x30, 0x10, - 0x2a, 0x55, 0x86, 0xd8, 0x31, 0x38, 0x63, 0x1b, 0x70, 0x82, 0xb3, 0xe2, 0x43, 0x74, 0xca, 0xa8, 0x1d, 0xaf, 0xab, - 0xe0, 0xd7, 0x7a, 0x7c, 0xaf, 0xd9, 0x06, 0x47, 0xd8, 0x50, 0x89, 0xe7, 0x9c, 0xa4, 0x14, 0x84, 0x68, 0xa7, 0x8f, - 0x8e, 0xf3, 0xab, 0x49, 0x0f, 0x41, 0x6c, 0x46, 0xd0, 0xb7, 0xca, 0x2f, 0x04, 0x0d, 0xa6, 0xb4, 0xd5, 0x9d, 0x1e, - 0xb3, 0xee, 0xb4, 0xd1, 0xb0, 0x3a, 0x74, 0x42, 0xb3, 0xc1, 0x54, 0x77, 0x8f, 0x48, 0x4c, 0x16, 0xb4, 0xd9, 0x26, - 0x13, 0xda, 0x52, 0x5d, 0xba, 0x93, 0xe3, 0xc4, 0x4c, 0x73, 0x70, 0xe0, 0x8b, 0x20, 0x89, 0x72, 0xf9, 0x25, 0x18, - 0xfb, 0x74, 0x42, 0x62, 0x2a, 0x02, 0x76, 0xc3, 0x46, 0x7e, 0x82, 0x49, 0x6c, 0x38, 0x0d, 0xee, 0xe2, 0x09, 0x75, - 0x9a, 0x81, 0x11, 0x41, 0xdf, 0xf6, 0xe3, 0x41, 0x7b, 0x48, 0x29, 0x45, 0x7b, 0xcd, 0x26, 0xea, 0x0b, 0xba, 0x90, - 0x21, 0x94, 0x38, 0xaa, 0x32, 0x9d, 0x43, 0x51, 0xc7, 0x29, 0xf2, 0x5f, 0xc8, 0x40, 0xb2, 0x5c, 0xfa, 0x50, 0x0c, - 0xe6, 0x7f, 0x6e, 0x09, 0x1b, 0x1d, 0x1f, 0xa2, 0x06, 0x94, 0x2a, 0xe2, 0xc4, 0x44, 0xd0, 0x4b, 0x1c, 0xc6, 0x83, - 0xa3, 0xa1, 0xcb, 0xff, 0x55, 0x21, 0x4c, 0x7e, 0xd9, 0x8f, 0x07, 0x2d, 0x35, 0x79, 0x0f, 0xf5, 0x7d, 0x41, 0x73, - 0xad, 0xa0, 0xf5, 0xf3, 0xf0, 0xad, 0x5a, 0x2a, 0x0e, 0x0d, 0x70, 0x66, 0xde, 0x05, 0x6d, 0x76, 0x42, 0x7f, 0xe1, - 0x2e, 0xa2, 0x09, 0x93, 0x19, 0x2c, 0x90, 0x88, 0x42, 0x7b, 0x22, 0x28, 0xcc, 0x58, 0x75, 0xbb, 0x0c, 0xcd, 0xf3, - 0x03, 0xf4, 0xa0, 0x7f, 0x25, 0xc3, 0x89, 0xd4, 0xd3, 0x5f, 0xc9, 0xd5, 0x0a, 0xfe, 0x9f, 0xc8, 0xbe, 0xa0, 0x97, - 0xaa, 0x68, 0x61, 0x8a, 0xe6, 0x50, 0xf4, 0x36, 0x04, 0x50, 0x49, 0x5e, 0x2a, 0x59, 0x7a, 0x4f, 0xae, 0xa8, 0x82, - 0xfd, 0xe0, 0x20, 0x1b, 0x4c, 0x1b, 0xed, 0x21, 0xf8, 0xf7, 0x33, 0x99, 0x7f, 0xc7, 0xe5, 0xd4, 0x47, 0x87, 0x3d, - 0x84, 0xfb, 0xc8, 0x83, 0xad, 0xed, 0xa6, 0x0d, 0xaa, 0x31, 0x9c, 0x34, 0x5e, 0xca, 0x70, 0xd1, 0xa3, 0xad, 0xbe, - 0xcf, 0x8d, 0x3f, 0x0f, 0x93, 0xc4, 0x30, 0xce, 0x16, 0x59, 0xe0, 0x86, 0x94, 0x0d, 0xfb, 0xbc, 0xc0, 0x8d, 0x59, - 0xe3, 0x0a, 0x87, 0x49, 0x63, 0xd6, 0xf0, 0x17, 0x94, 0xd2, 0x66, 0xa7, 0xec, 0x66, 0xa5, 0xdf, 0x14, 0x87, 0x57, - 0xd6, 0xd9, 0x39, 0x50, 0xc7, 0x21, 0x6d, 0xf8, 0xd9, 0x80, 0x0d, 0x57, 0x2b, 0x74, 0xdc, 0xef, 0x21, 0xdc, 0xf0, - 0x2d, 0xa1, 0x1d, 0x5a, 0x4a, 0xc3, 0x98, 0xf0, 0x61, 0x61, 0x42, 0x49, 0xef, 0x6b, 0x61, 0xa3, 0x65, 0x75, 0xd8, - 0x1d, 0x1e, 0xc0, 0x8a, 0xd2, 0x8e, 0xd1, 0xfa, 0xea, 0x1c, 0x96, 0x69, 0x89, 0x39, 0xa5, 0x2d, 0x22, 0xa8, 0xf5, - 0x5d, 0x4f, 0xa9, 0xac, 0x08, 0x3e, 0xa1, 0x55, 0x73, 0x32, 0x88, 0x48, 0x3c, 0xa4, 0xaf, 0xb5, 0x3d, 0xd2, 0xb5, - 0x7e, 0x71, 0x96, 0xd0, 0xf7, 0x6b, 0xd1, 0xdb, 0x08, 0x62, 0x2b, 0xd7, 0xc1, 0x68, 0x91, 0x65, 0x2c, 0x95, 0x6f, - 0x44, 0x6c, 0xd4, 0x34, 0x96, 0x80, 0xa5, 0x04, 0x61, 0x59, 0x02, 0x3a, 0x5a, 0xc7, 0x9e, 0x8c, 0xc5, 0x46, 0xf5, - 0x84, 0x2e, 0xb4, 0xfa, 0xa4, 0x82, 0xb5, 0xdd, 0x89, 0xb1, 0x8b, 0x7d, 0x4c, 0x16, 0x26, 0x8a, 0xeb, 0x07, 0x41, - 0x30, 0x09, 0x46, 0x50, 0x0d, 0x13, 0xe4, 0xb8, 0x50, 0xe7, 0xc8, 0xcf, 0xe9, 0x75, 0x90, 0xb2, 0x1b, 0x35, 0xab, - 0x8f, 0x2b, 0xc9, 0x6c, 0x8f, 0xd7, 0xf1, 0xb4, 0xab, 0xd8, 0x4d, 0x1e, 0xa4, 0x22, 0x66, 0x80, 0x1e, 0x88, 0xdb, - 0x9b, 0xa2, 0x69, 0x94, 0xbb, 0xf1, 0xa9, 0x0a, 0xbe, 0x81, 0xeb, 0xbc, 0x9e, 0x80, 0xc7, 0x57, 0xe9, 0x5a, 0x65, - 0x63, 0xed, 0x06, 0xc7, 0x98, 0x8f, 0xfd, 0x49, 0x00, 0x71, 0x3d, 0x45, 0x42, 0x12, 0x4c, 0xb9, 0x89, 0x4b, 0x54, - 0xb3, 0x72, 0xcc, 0x2b, 0x1a, 0x0f, 0x44, 0xa3, 0xa1, 0xbc, 0xd0, 0x0b, 0x4d, 0x12, 0x13, 0x4c, 0xae, 0xca, 0xb3, - 0x65, 0xdb, 0xbd, 0x95, 0xb4, 0x3e, 0x95, 0x7f, 0x55, 0x77, 0xe7, 0x36, 0xa4, 0xc4, 0xca, 0x53, 0x28, 0xfd, 0x19, - 0x26, 0xcf, 0xe8, 0xa1, 0x3f, 0x08, 0xfa, 0x7f, 0x19, 0xe2, 0xbe, 0x1f, 0xfc, 0x19, 0x1f, 0x6a, 0xce, 0x71, 0x85, - 0xbb, 0x89, 0x9e, 0x63, 0xa9, 0xe2, 0x97, 0x6d, 0xa2, 0x3c, 0x89, 0x61, 0x4a, 0xd2, 0x68, 0xc6, 0xc2, 0x67, 0x70, - 0xc8, 0x2d, 0xe1, 0xbc, 0x95, 0x04, 0x28, 0x29, 0x7c, 0x66, 0x78, 0x49, 0x80, 0xfa, 0xaf, 0x64, 0xf9, 0xd4, 0x47, - 0xfd, 0xe7, 0xd5, 0xd3, 0x5f, 0x50, 0xff, 0x17, 0x19, 0xfe, 0x5c, 0x18, 0x6f, 0x77, 0x6d, 0x8e, 0xc7, 0x76, 0x8e, - 0x42, 0x6f, 0x8d, 0x83, 0xbb, 0x05, 0xde, 0x74, 0x74, 0x4c, 0x70, 0xc1, 0xc7, 0x25, 0x33, 0xca, 0x03, 0x19, 0x4d, - 0x00, 0xa9, 0xce, 0x1e, 0xe4, 0x6e, 0x5c, 0xbf, 0x5a, 0x31, 0x90, 0x8a, 0xa5, 0x57, 0x40, 0xe6, 0xa4, 0xd7, 0xc2, - 0xcb, 0x5a, 0x5b, 0xa5, 0x33, 0xd5, 0xe3, 0xe8, 0x25, 0x9f, 0xbe, 0xa2, 0xad, 0xee, 0xd5, 0xf1, 0xa4, 0x7b, 0xd5, - 0x68, 0xe0, 0xdc, 0x92, 0xd6, 0x62, 0x70, 0x35, 0x24, 0x5f, 0x83, 0x53, 0xcf, 0xa5, 0x25, 0x52, 0x5b, 0x5e, 0xc7, - 0x2c, 0xaf, 0xd1, 0x48, 0x0b, 0xdc, 0x75, 0xba, 0x4e, 0x74, 0xd7, 0xa2, 0xd0, 0x38, 0x59, 0x27, 0xb5, 0xa7, 0x58, - 0x95, 0x40, 0x32, 0x14, 0xa5, 0xf4, 0x46, 0xe2, 0xad, 0xa3, 0xc2, 0x98, 0xd0, 0x5d, 0x9d, 0x59, 0x60, 0x9f, 0x5a, - 0x4a, 0xf8, 0x80, 0x05, 0xe8, 0x5a, 0x7a, 0x82, 0x67, 0x64, 0xd1, 0x68, 0x2b, 0x32, 0x6f, 0xb6, 0xbb, 0xf5, 0xb1, - 0x9e, 0x54, 0x63, 0x91, 0x45, 0x83, 0xce, 0x4a, 0x2c, 0x15, 0x69, 0xa3, 0x51, 0xd4, 0x83, 0x9d, 0xf6, 0xe4, 0xd6, - 0x02, 0x10, 0x37, 0xeb, 0x49, 0x19, 0x56, 0xc2, 0x56, 0x32, 0x95, 0x07, 0x3c, 0x4d, 0x59, 0x06, 0x52, 0x94, 0x4a, - 0xc2, 0x8b, 0xa2, 0x92, 0xec, 0x20, 0x46, 0x09, 0xa3, 0x19, 0x70, 0x1e, 0x65, 0x77, 0x91, 0x94, 0x08, 0x32, 0x55, - 0x7c, 0x83, 0x52, 0x7a, 0x66, 0xd3, 0x59, 0xa4, 0xe2, 0x41, 0x09, 0xe5, 0x8e, 0x4c, 0xca, 0x29, 0x0b, 0xce, 0xf7, - 0x4f, 0xc5, 0x9d, 0x36, 0xd9, 0x80, 0x0f, 0x43, 0xd5, 0x2c, 0x31, 0x9c, 0x2b, 0xa2, 0x1f, 0x7c, 0x89, 0xcb, 0xe8, - 0x48, 0xa0, 0x18, 0xe0, 0x73, 0x9e, 0x31, 0xa5, 0x83, 0xef, 0x5b, 0xbb, 0x2f, 0xa9, 0x2b, 0x90, 0x89, 0xeb, 0xbd, - 0x01, 0x44, 0x46, 0xe0, 0xdc, 0x49, 0xe9, 0x46, 0xb3, 0xf3, 0xfd, 0x93, 0xb7, 0xdb, 0x6c, 0xe0, 0xd5, 0xca, 0x58, - 0xbf, 0x4a, 0xb7, 0x21, 0x51, 0x05, 0x69, 0x62, 0x7e, 0x84, 0x7e, 0xa2, 0x54, 0xa4, 0xc8, 0xcf, 0x80, 0x8a, 0xce, - 0xf7, 0x4f, 0xde, 0xfb, 0x99, 0xf2, 0x2d, 0x61, 0xe2, 0x2e, 0xdb, 0x17, 0xd4, 0x9f, 0x52, 0x86, 0xf5, 0xda, 0x4b, - 0xd6, 0x25, 0x1c, 0x01, 0x1e, 0x4e, 0x55, 0x25, 0x58, 0x10, 0x03, 0x3e, 0xa4, 0x89, 0xc1, 0x00, 0x4d, 0x30, 0x49, - 0x6a, 0x76, 0x19, 0x85, 0x0d, 0x50, 0x73, 0x9d, 0xc1, 0x4e, 0x04, 0x5a, 0xf5, 0xc3, 0x24, 0x51, 0xb3, 0xca, 0x42, - 0x0b, 0x8f, 0x67, 0x1b, 0x59, 0x69, 0x95, 0x39, 0xfa, 0x2d, 0xd8, 0x4e, 0xf6, 0xe1, 0x0d, 0xb5, 0x96, 0x84, 0x29, - 0x78, 0x6e, 0xd3, 0xc7, 0xce, 0xf7, 0x4f, 0x5e, 0x9b, 0x0c, 0xb2, 0x79, 0x64, 0xf9, 0xfd, 0x86, 0x89, 0x79, 0xf2, - 0x3a, 0xa8, 0x6a, 0x55, 0xe3, 0xf3, 0xfd, 0x93, 0x0f, 0xdb, 0x9a, 0x41, 0x79, 0xb1, 0xa8, 0x6c, 0x7c, 0x05, 0xdf, - 0x92, 0x25, 0xe1, 0xd2, 0x08, 0x87, 0x90, 0x17, 0x44, 0x09, 0xa4, 0x30, 0x2f, 0x4a, 0xd7, 0xc8, 0x73, 0x92, 0x52, - 0x15, 0x06, 0xaa, 0xef, 0x9a, 0x51, 0xf3, 0xb8, 0x48, 0xcf, 0x46, 0x62, 0xce, 0x76, 0xc4, 0x86, 0x6e, 0x70, 0xc0, - 0x67, 0x90, 0x3a, 0xa3, 0x40, 0xe7, 0x64, 0xaf, 0x85, 0xbb, 0x75, 0xf1, 0x95, 0x2a, 0x22, 0x15, 0x35, 0xd9, 0x42, - 0xa6, 0xb4, 0x45, 0x12, 0xda, 0x22, 0x11, 0xcd, 0x07, 0x2d, 0x2d, 0x20, 0xba, 0x51, 0x39, 0xae, 0x16, 0x33, 0x90, - 0x15, 0x66, 0x4e, 0xab, 0x16, 0xc0, 0x71, 0x37, 0x52, 0xbe, 0x47, 0x25, 0xd3, 0x63, 0x45, 0x16, 0x6f, 0x7c, 0x41, - 0x84, 0x1a, 0xf8, 0x8c, 0x5f, 0x26, 0x90, 0x58, 0x02, 0xab, 0x22, 0x12, 0x87, 0x65, 0xd3, 0xb6, 0x69, 0x1a, 0x05, - 0x6a, 0x9f, 0x04, 0x89, 0x02, 0xe0, 0xdc, 0x24, 0x32, 0x79, 0x38, 0xf9, 0x66, 0x97, 0xc7, 0x07, 0x07, 0xbe, 0xee, - 0xf4, 0xa5, 0xf4, 0x85, 0xad, 0xaf, 0x22, 0x77, 0xdf, 0x6a, 0x5e, 0x11, 0x63, 0x05, 0x7f, 0xa3, 0x91, 0x0c, 0x0b, - 0x08, 0x43, 0xfb, 0x51, 0x1d, 0x83, 0x16, 0x78, 0xa5, 0xeb, 0xd5, 0x97, 0xdf, 0x68, 0x94, 0x51, 0xda, 0x3a, 0xb6, - 0x6e, 0x48, 0x5a, 0x5c, 0xf9, 0x65, 0xea, 0x4f, 0x6b, 0x23, 0x5f, 0xca, 0x82, 0x80, 0xb9, 0x4b, 0xb3, 0xdc, 0x2e, - 0xc6, 0x39, 0x12, 0x1c, 0xda, 0x7d, 0x69, 0xb2, 0x16, 0x88, 0xca, 0xae, 0x32, 0x8d, 0x2c, 0x3b, 0xeb, 0xe0, 0xd0, - 0x36, 0x82, 0xa8, 0x14, 0x34, 0x6a, 0x14, 0x86, 0xbc, 0xdf, 0x6c, 0xe6, 0x5c, 0x92, 0x1c, 0x1b, 0x27, 0x97, 0x82, - 0x42, 0x21, 0xab, 0x53, 0x22, 0xe5, 0x25, 0x9d, 0xef, 0x26, 0xf9, 0x13, 0x87, 0xe4, 0x9f, 0x51, 0xe6, 0x90, 0xbf, - 0x76, 0x71, 0x04, 0xc2, 0x38, 0x17, 0x72, 0x5b, 0x75, 0x3a, 0xa7, 0xe0, 0x44, 0xab, 0x63, 0xb4, 0x16, 0x56, 0xdc, - 0xc1, 0x50, 0xdc, 0x13, 0xa2, 0xdc, 0x90, 0xc4, 0xc6, 0x80, 0xfd, 0x2a, 0xa8, 0x06, 0x53, 0x6f, 0xf3, 0xe9, 0xb9, - 0x1c, 0xf0, 0xe4, 0xc3, 0xdd, 0xf1, 0xd0, 0xd3, 0xf9, 0xe6, 0xc9, 0x75, 0x72, 0x3f, 0x61, 0xd5, 0xce, 0xc1, 0xad, - 0x67, 0x82, 0xc2, 0xfc, 0x65, 0x1c, 0xbb, 0xce, 0x7c, 0xd6, 0x0e, 0xa1, 0x95, 0x7f, 0x00, 0x6d, 0xbb, 0xad, 0x5a, - 0x30, 0x67, 0x58, 0xe0, 0x47, 0x3a, 0x03, 0x35, 0xca, 0x76, 0xb0, 0x8f, 0x13, 0xd5, 0x80, 0xa5, 0xf1, 0xf6, 0xea, - 0x67, 0x85, 0x21, 0x13, 0x0d, 0x1a, 0x5e, 0x02, 0xff, 0xd3, 0x24, 0x0f, 0x74, 0xa3, 0xe4, 0x02, 0x20, 0x68, 0xae, - 0xf0, 0x54, 0x21, 0x0c, 0xa1, 0xca, 0xfb, 0xfe, 0x72, 0x8f, 0xd2, 0x79, 0xe5, 0x7d, 0x7c, 0x57, 0xa5, 0x5e, 0x01, - 0x59, 0xe0, 0x10, 0xcc, 0xc7, 0xb2, 0x40, 0x87, 0x2f, 0xcf, 0x6c, 0x73, 0x65, 0x42, 0x06, 0x95, 0xc6, 0xed, 0x84, - 0x36, 0x95, 0x5b, 0x4e, 0xd7, 0x5b, 0x34, 0xac, 0xd5, 0xee, 0x43, 0xed, 0x1b, 0xa9, 0x60, 0x84, 0xe7, 0xf7, 0xaa, - 0xb5, 0x1d, 0xb7, 0xf8, 0xb8, 0x9e, 0xbf, 0xb2, 0xb6, 0x29, 0x01, 0x4f, 0x73, 0x96, 0xc9, 0x67, 0x6c, 0x2c, 0x32, - 0x88, 0x59, 0x94, 0x38, 0xc1, 0xc5, 0xbe, 0xe3, 0xb7, 0x53, 0xeb, 0x73, 0x02, 0x05, 0x6b, 0x0b, 0x54, 0xbf, 0x3e, - 0xaa, 0xa0, 0xf5, 0xf9, 0x7a, 0xaf, 0xf9, 0xc1, 0xc1, 0x87, 0x0a, 0x4d, 0x06, 0x4a, 0x05, 0x85, 0xc3, 0xb4, 0xb4, - 0x4a, 0x63, 0x22, 0xb9, 0xfb, 0x7e, 0xe9, 0x04, 0xb0, 0x0c, 0xc3, 0xe5, 0x3d, 0x2f, 0xa9, 0x2c, 0x26, 0xeb, 0x2c, - 0xde, 0x38, 0x27, 0xb8, 0x6b, 0xb8, 0x00, 0x87, 0x07, 0x53, 0x5b, 0x7b, 0x8b, 0xf2, 0x2a, 0x19, 0xb6, 0x84, 0xe1, - 0x14, 0x90, 0xe5, 0x2b, 0x33, 0xc4, 0xa1, 0xc0, 0xad, 0x66, 0xc9, 0x29, 0xe8, 0x95, 0x53, 0x92, 0x07, 0x53, 0x48, - 0x7f, 0xad, 0x1d, 0x59, 0x8c, 0x89, 0x4e, 0xcc, 0x71, 0x52, 0x09, 0x4e, 0x5e, 0x6e, 0x73, 0x29, 0x5b, 0xa2, 0x66, - 0x4a, 0xea, 0xa8, 0x16, 0xb8, 0xec, 0x10, 0x5c, 0xf9, 0xdc, 0x28, 0x6e, 0x36, 0x6e, 0x06, 0x0c, 0xf8, 0x99, 0xf4, - 0x75, 0x30, 0x0a, 0x64, 0x86, 0x08, 0x16, 0x7e, 0x6d, 0xea, 0xae, 0x50, 0xdd, 0x88, 0x41, 0xdc, 0xd4, 0x45, 0x93, - 0x50, 0x71, 0xbd, 0xd3, 0x8a, 0x97, 0x8e, 0x75, 0x06, 0xb5, 0xb4, 0x5c, 0xb0, 0x4a, 0x24, 0x71, 0x96, 0x3f, 0xd6, - 0x49, 0xd1, 0x65, 0x23, 0xc2, 0x14, 0x18, 0xef, 0xd5, 0x1e, 0xb0, 0x02, 0xfe, 0x5f, 0x9e, 0x48, 0x67, 0x47, 0xad, - 0x13, 0x5b, 0xcd, 0xe9, 0x48, 0xfd, 0x77, 0x90, 0xea, 0xb2, 0x7e, 0xe6, 0x5f, 0x2a, 0x59, 0xc8, 0x49, 0x5e, 0x63, - 0xec, 0xa9, 0x62, 0xec, 0x18, 0xf4, 0x34, 0x9b, 0xf8, 0xdd, 0x37, 0x19, 0x2f, 0xdc, 0x48, 0x39, 0x43, 0x62, 0x5f, - 0x97, 0xd1, 0x72, 0xe7, 0xf7, 0xda, 0x6e, 0x84, 0x9c, 0x42, 0x16, 0x10, 0x31, 0x9c, 0x3d, 0xc5, 0x24, 0x6f, 0x34, - 0xba, 0xf9, 0x31, 0xab, 0x9c, 0x24, 0x15, 0x8c, 0x1c, 0x02, 0xba, 0x40, 0xf0, 0x35, 0x19, 0x0a, 0x21, 0x7f, 0x9b, - 0x99, 0x9d, 0x83, 0xaf, 0xfd, 0xe4, 0x9d, 0xef, 0x72, 0x35, 0xb7, 0x6d, 0x19, 0x34, 0x85, 0xf5, 0xf8, 0x55, 0xc0, - 0xe5, 0xeb, 0xbb, 0x13, 0x3c, 0x00, 0xee, 0xbd, 0x36, 0x81, 0x54, 0x34, 0xdc, 0x95, 0x9a, 0x25, 0x94, 0xa7, 0xaf, - 0x8b, 0xab, 0xac, 0x44, 0x77, 0xb2, 0xae, 0xac, 0x8c, 0x59, 0x49, 0xf3, 0xa2, 0xc8, 0x59, 0x15, 0xde, 0x5f, 0x4b, - 0xbf, 0x54, 0xc2, 0x65, 0xd3, 0xdb, 0x7e, 0x3a, 0xa7, 0x92, 0x38, 0x84, 0xfa, 0xf5, 0xae, 0xd8, 0x47, 0x05, 0x26, - 0x9c, 0x6b, 0x23, 0x14, 0x7f, 0xde, 0x26, 0x14, 0x49, 0x6a, 0x8e, 0xbc, 0x12, 0x88, 0xed, 0x7b, 0x08, 0x44, 0xe3, - 0x66, 0xb7, 0x32, 0x11, 0xd4, 0x91, 0x9a, 0x4c, 0xac, 0x6f, 0x29, 0x4d, 0x09, 0x37, 0xbb, 0xd1, 0xeb, 0xac, 0x56, - 0x7c, 0xd0, 0x02, 0x37, 0x12, 0x42, 0xf0, 0xb3, 0xad, 0x7f, 0x3a, 0x9c, 0x58, 0xbb, 0x81, 0x7d, 0x5e, 0x9a, 0x2c, - 0x38, 0x80, 0x04, 0x67, 0x5f, 0x25, 0x65, 0x29, 0x9a, 0x36, 0x14, 0x64, 0x08, 0x9c, 0xf2, 0x32, 0xcc, 0x04, 0x10, - 0x2b, 0x59, 0x61, 0x0c, 0x48, 0x7f, 0x6b, 0xee, 0x9f, 0x35, 0x2f, 0x3f, 0xad, 0x89, 0xd6, 0xe4, 0x8a, 0x56, 0x1f, - 0x6a, 0xf9, 0x06, 0x06, 0x02, 0xa3, 0x1f, 0xee, 0x29, 0x13, 0xb4, 0x12, 0xe5, 0xd8, 0x95, 0x43, 0xa4, 0x05, 0x4e, - 0xb4, 0xbd, 0x0f, 0x3a, 0xc2, 0xbb, 0x45, 0x9a, 0x10, 0xe1, 0xd0, 0xf5, 0x4b, 0x2a, 0x6b, 0xac, 0x64, 0x4a, 0x8d, - 0xa5, 0x44, 0x22, 0x45, 0xa6, 0x92, 0xa6, 0x83, 0xd6, 0x10, 0x14, 0xd0, 0x6e, 0x72, 0x9c, 0x56, 0x26, 0x70, 0xd2, - 0x68, 0xe0, 0xc8, 0xce, 0x3a, 0x1d, 0xf0, 0x46, 0x32, 0x24, 0x8c, 0x24, 0xda, 0x30, 0x39, 0x3b, 0x38, 0xf0, 0xa3, - 0x6a, 0xde, 0x41, 0x32, 0xc4, 0x44, 0xac, 0x56, 0xbe, 0x02, 0x2b, 0xc2, 0xab, 0x55, 0xe4, 0x82, 0xa5, 0xaa, 0xa1, - 0xdb, 0xbc, 0x2f, 0xe9, 0x5c, 0x09, 0xc0, 0x39, 0x40, 0xd8, 0xa0, 0x7e, 0x64, 0xdc, 0x7b, 0x11, 0xb8, 0xa3, 0x1a, - 0xe9, 0x20, 0x69, 0xb4, 0x87, 0x0e, 0xe3, 0x1a, 0x24, 0x43, 0x1a, 0x15, 0xe2, 0xe0, 0x60, 0x2f, 0x37, 0x22, 0xf2, - 0x27, 0x10, 0x65, 0x3f, 0x29, 0xc9, 0xa2, 0x07, 0x74, 0x77, 0x63, 0xdd, 0x19, 0x50, 0x52, 0x94, 0xd9, 0x56, 0xdb, - 0xae, 0x96, 0x05, 0x51, 0x36, 0x22, 0x26, 0x18, 0xdc, 0x07, 0xcb, 0xbe, 0x24, 0xf3, 0x57, 0xb2, 0xcc, 0xb1, 0xfe, - 0x79, 0x6b, 0x66, 0x75, 0x10, 0x04, 0x51, 0x36, 0x51, 0xb1, 0x0c, 0x1b, 0x86, 0x55, 0xc4, 0x7f, 0x64, 0xc0, 0x74, - 0x26, 0x1e, 0x94, 0x73, 0x0d, 0xa9, 0x06, 0xdf, 0xaa, 0x36, 0xf6, 0x2e, 0xc9, 0x4f, 0x5b, 0xbd, 0x0c, 0x1a, 0x92, - 0xe7, 0xbf, 0x15, 0x92, 0x87, 0x06, 0x12, 0x4d, 0x1e, 0x6b, 0x38, 0xdb, 0x81, 0x8b, 0x9f, 0xe4, 0x1a, 0xce, 0x76, - 0xe3, 0xd6, 0x62, 0xea, 0x97, 0x5d, 0xf0, 0x39, 0xbc, 0x41, 0x03, 0x5a, 0x15, 0x38, 0x50, 0x3e, 0x5a, 0xd7, 0xbd, - 0x34, 0x2b, 0x05, 0x61, 0x2a, 0xa9, 0xcf, 0xeb, 0x07, 0xa0, 0xd2, 0x46, 0x1d, 0xc3, 0x97, 0x87, 0x73, 0xec, 0xb8, - 0x04, 0xea, 0xa9, 0x2b, 0x40, 0x4e, 0xc6, 0xdb, 0x3e, 0x3f, 0x38, 0x00, 0xdb, 0x00, 0x94, 0xb8, 0x60, 0x14, 0xcd, - 0xe5, 0x22, 0x03, 0x55, 0x2a, 0xb7, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xa8, 0x32, 0xf8, 0x01, 0x05, 0xf3, 0x28, 0xcf, - 0xf9, 0x95, 0x2e, 0x33, 0xbf, 0x89, 0xa0, 0x96, 0x94, 0x73, 0xad, 0x13, 0xa6, 0xb8, 0x9b, 0x1a, 0x3a, 0xad, 0xa3, - 0xed, 0xc5, 0x15, 0x4b, 0xe5, 0x2b, 0x9e, 0x4b, 0x96, 0xc2, 0xf2, 0x2b, 0x8a, 0x83, 0x15, 0xe5, 0x18, 0x0e, 0x6c, - 0xad, 0x57, 0x14, 0xc7, 0x77, 0x76, 0x91, 0x75, 0x1d, 0x68, 0x1a, 0xa5, 0x71, 0xa2, 0x27, 0x71, 0xf3, 0x19, 0x6d, - 0x0e, 0x67, 0xd9, 0xd2, 0xcd, 0xa7, 0xa9, 0x94, 0x0d, 0xc5, 0xdd, 0x7d, 0x4e, 0xad, 0x24, 0xb0, 0xd2, 0xf3, 0x4e, - 0xad, 0x05, 0x22, 0xde, 0x3b, 0x36, 0xc1, 0x5d, 0x09, 0x91, 0x0e, 0x47, 0x0d, 0xea, 0x70, 0x5a, 0xba, 0xf9, 0x72, - 0xeb, 0x95, 0xb6, 0x6d, 0xc2, 0x41, 0xd1, 0xc9, 0xe3, 0xdd, 0x96, 0xd5, 0x6b, 0x2b, 0x39, 0xac, 0xb4, 0xe0, 0xf7, - 0x65, 0xcc, 0x78, 0x69, 0xc9, 0x0b, 0xdb, 0xa3, 0xb8, 0x2f, 0xe9, 0x73, 0xb8, 0x33, 0xf4, 0x52, 0xce, 0x92, 0xb5, - 0xab, 0x31, 0xdd, 0xfd, 0x52, 0xfb, 0xdf, 0x97, 0xfe, 0x7b, 0xf2, 0x06, 0x02, 0xbb, 0x5f, 0x55, 0xcd, 0x37, 0x03, - 0xba, 0x5f, 0x55, 0x08, 0xfa, 0x2a, 0xdc, 0x68, 0xe7, 0x04, 0x72, 0x3b, 0xc1, 0xd3, 0xa0, 0x85, 0xac, 0xb6, 0xf4, - 0xb3, 0x0e, 0x23, 0xe9, 0x4c, 0x4b, 0x75, 0x1e, 0x48, 0x95, 0xa7, 0x06, 0xf9, 0x72, 0x75, 0x0b, 0x89, 0x99, 0x0c, - 0x43, 0xad, 0xc3, 0xef, 0xda, 0x1e, 0x23, 0x63, 0x52, 0x6d, 0x67, 0x7c, 0x1d, 0x65, 0x72, 0x1f, 0x4e, 0x99, 0xd8, - 0xb8, 0x87, 0x37, 0xa5, 0xe0, 0x41, 0xbb, 0xdf, 0x14, 0x8e, 0xb1, 0x9d, 0xeb, 0x7b, 0x40, 0xee, 0xf8, 0x54, 0x58, - 0xdd, 0xad, 0x6e, 0x65, 0x7c, 0x0d, 0xf6, 0x3f, 0x26, 0x53, 0x7b, 0x39, 0x8e, 0x19, 0x0e, 0xcc, 0xc2, 0x65, 0x51, - 0x3a, 0x05, 0x84, 0x56, 0xde, 0x32, 0x4c, 0x44, 0xa1, 0x02, 0xdc, 0x3f, 0x90, 0x6f, 0x0c, 0x4b, 0x1c, 0x97, 0x1c, - 0xe7, 0xe4, 0xbe, 0x1c, 0x51, 0x83, 0x5f, 0xc6, 0xef, 0x81, 0x8e, 0x15, 0x85, 0x16, 0x96, 0x8a, 0x9e, 0x0b, 0xb3, - 0x90, 0x9d, 0x69, 0xa9, 0x84, 0x95, 0x29, 0x35, 0x6a, 0x9a, 0x2d, 0x79, 0x9c, 0xd6, 0xca, 0x96, 0xe5, 0xa9, 0xaa, - 0xcd, 0x8b, 0x77, 0x60, 0xb1, 0x0a, 0x2d, 0xae, 0x56, 0x7e, 0x1d, 0xd5, 0x94, 0x3b, 0x91, 0x0c, 0x4c, 0xb8, 0x93, - 0x51, 0x51, 0xd3, 0xac, 0x75, 0x1f, 0x1f, 0xaf, 0x27, 0x14, 0x59, 0xdd, 0xbc, 0x06, 0x87, 0xeb, 0x42, 0xd0, 0xdd, - 0x5d, 0x9f, 0x02, 0xd1, 0xab, 0x2b, 0x27, 0x72, 0x30, 0xf4, 0x73, 0x99, 0x2a, 0x5b, 0xe5, 0xb4, 0x6e, 0xc1, 0x2f, - 0xbe, 0x23, 0x59, 0xd6, 0xa0, 0x6e, 0xb3, 0xde, 0x49, 0x36, 0x7a, 0x2e, 0x76, 0x25, 0x1b, 0xd5, 0xb4, 0xdd, 0xbd, - 0x16, 0xbe, 0x3b, 0x2d, 0x55, 0xcf, 0xb5, 0xbd, 0xc9, 0x6f, 0x98, 0xae, 0x0d, 0xb4, 0xa9, 0xd1, 0x6c, 0xb9, 0xca, - 0x59, 0x51, 0x8c, 0xcb, 0xcb, 0x04, 0x2a, 0x77, 0x67, 0xac, 0xe9, 0xdf, 0x58, 0x8d, 0xea, 0x3a, 0xae, 0xff, 0x03, - 0x9d, 0x24, 0xe2, 0x32, 0x4a, 0xde, 0xc3, 0x7c, 0x55, 0xe5, 0xcb, 0xdb, 0x38, 0x8b, 0x24, 0x33, 0xdc, 0xa5, 0x82, - 0xe1, 0x07, 0x07, 0x86, 0x1f, 0x34, 0x9f, 0xae, 0xfa, 0x93, 0xe5, 0xab, 0x72, 0x80, 0x70, 0x5c, 0x58, 0x96, 0x71, - 0x2e, 0xb7, 0xcf, 0xb1, 0xce, 0xc2, 0xce, 0x4b, 0x16, 0x76, 0x2e, 0xfd, 0xf5, 0xa1, 0x7c, 0xff, 0x9b, 0xed, 0xa3, - 0x6c, 0x72, 0xb6, 0x6f, 0xaa, 0x83, 0xff, 0x4d, 0x78, 0x67, 0x1f, 0x87, 0xcb, 0x1d, 0x05, 0x47, 0x2a, 0x5d, 0x45, - 0x83, 0xfc, 0x0e, 0xd2, 0x0e, 0x24, 0xed, 0x39, 0x77, 0x0e, 0x2a, 0x39, 0x65, 0x13, 0x81, 0xfc, 0xd1, 0x22, 0x97, - 0x62, 0x66, 0xc6, 0xcc, 0xcd, 0x35, 0x23, 0x55, 0x09, 0xae, 0x68, 0x15, 0x6d, 0x0f, 0xeb, 0x17, 0xb9, 0x96, 0x1f, - 0x79, 0x1a, 0x87, 0x39, 0x31, 0x52, 0x24, 0x0f, 0xd3, 0x82, 0xda, 0x64, 0xe3, 0xcd, 0x3a, 0x32, 0xe6, 0x29, 0xcf, - 0xa7, 0x2c, 0xf3, 0x05, 0x5e, 0xee, 0x9a, 0x4c, 0x40, 0x40, 0x46, 0x4f, 0x46, 0xbe, 0xad, 0x2e, 0xfc, 0x05, 0x30, - 0x1a, 0xf8, 0x81, 0x66, 0x4c, 0x4e, 0x45, 0x0c, 0x89, 0x29, 0x41, 0x5c, 0xde, 0x68, 0x3a, 0x38, 0xd8, 0xf3, 0x91, - 0x72, 0x4b, 0xc0, 0xd5, 0x6f, 0xb7, 0x06, 0xf7, 0x97, 0x70, 0x3d, 0xa7, 0x9a, 0x9a, 0xe1, 0x25, 0x5b, 0xbf, 0xc9, - 0x22, 0x83, 0x8f, 0xec, 0x96, 0x64, 0xb8, 0x28, 0x42, 0x0d, 0x35, 0x1a, 0x73, 0x96, 0xc4, 0x88, 0x7c, 0x64, 0xb7, - 0x61, 0x79, 0x5b, 0x5c, 0x5d, 0x6e, 0x56, 0x1b, 0x88, 0xc4, 0x75, 0x8a, 0x48, 0x35, 0x49, 0xb8, 0x2c, 0x88, 0xc8, - 0xf8, 0x04, 0x88, 0xf3, 0x6f, 0xec, 0x36, 0xd4, 0xe3, 0x71, 0xe7, 0xb2, 0x1e, 0x5e, 0x5a, 0xd4, 0x07, 0x4e, 0xb1, - 0xbb, 0x0d, 0xc6, 0xa0, 0x18, 0xa8, 0xbe, 0x43, 0x5a, 0x6b, 0x57, 0x99, 0x87, 0x18, 0x17, 0xf7, 0x5d, 0x0a, 0xf9, - 0xc2, 0x15, 0x6d, 0xb2, 0x96, 0xfa, 0xba, 0xd6, 0x89, 0x41, 0x87, 0x2a, 0xd7, 0xe3, 0xdc, 0xcf, 0xec, 0xa9, 0x33, - 0x77, 0x10, 0x1c, 0x47, 0xd8, 0x17, 0xd2, 0x0c, 0x1a, 0x7e, 0xab, 0x53, 0x42, 0xaa, 0x48, 0xd2, 0xeb, 0xaa, 0x9f, - 0x77, 0xee, 0x03, 0xde, 0x21, 0xa5, 0x25, 0x52, 0xd7, 0x31, 0x0b, 0x9b, 0x2e, 0xfa, 0x9d, 0xa4, 0xfe, 0xd2, 0x2e, - 0x21, 0xcc, 0x5c, 0x2c, 0xca, 0x02, 0xa8, 0xd0, 0xd0, 0x97, 0xce, 0x00, 0xe4, 0x63, 0x9f, 0x6f, 0x48, 0xcd, 0x54, - 0x49, 0xcd, 0xc0, 0xc1, 0xf8, 0x0e, 0x29, 0xc9, 0x14, 0x32, 0x94, 0x12, 0xa9, 0x84, 0x9e, 0xd9, 0x5c, 0x43, 0x42, - 0xee, 0x86, 0x96, 0xd7, 0xe7, 0xf4, 0x9e, 0xa7, 0x35, 0xb0, 0x7c, 0x35, 0x0e, 0x2e, 0x42, 0x58, 0x12, 0xd3, 0x0d, - 0x0a, 0xeb, 0xce, 0xc9, 0x6c, 0x7e, 0xab, 0x2f, 0x02, 0xbb, 0x2c, 0x6a, 0x51, 0xe2, 0x4f, 0xf1, 0x32, 0xf3, 0xa7, - 0x24, 0x85, 0x7c, 0x44, 0x51, 0x94, 0xf0, 0x33, 0x77, 0x37, 0x6a, 0xd9, 0xca, 0xdb, 0xaf, 0xf8, 0x81, 0x32, 0x2f, - 0x21, 0x47, 0x93, 0x64, 0x96, 0xa7, 0x64, 0xbe, 0xba, 0x6b, 0xe7, 0x6c, 0xdb, 0x57, 0x26, 0x45, 0xc7, 0x00, 0xf6, - 0x9d, 0xf4, 0x97, 0xce, 0x2a, 0xdc, 0xbb, 0xdc, 0xe6, 0xca, 0x9f, 0x09, 0xf6, 0x55, 0x49, 0xa4, 0x7e, 0x4e, 0xd7, - 0x24, 0xce, 0xdd, 0xb9, 0x96, 0x3f, 0x2f, 0x58, 0x76, 0x7b, 0xc6, 0x20, 0xd7, 0x59, 0xc0, 0x5d, 0xdf, 0x6a, 0x1b, - 0xaa, 0x3c, 0xf5, 0x7e, 0xaa, 0x94, 0x95, 0xa2, 0x7e, 0x09, 0x70, 0xfd, 0x8a, 0x60, 0xa1, 0xa2, 0x8d, 0x8e, 0x23, - 0x46, 0x9f, 0x16, 0xb6, 0xf3, 0xf2, 0x24, 0xeb, 0x72, 0xf0, 0xaf, 0x55, 0x98, 0x36, 0xc1, 0x02, 0x22, 0xdc, 0x0b, - 0xa9, 0x83, 0x7c, 0xb8, 0xee, 0x95, 0x81, 0x22, 0x08, 0xdf, 0xa5, 0xbb, 0x97, 0xba, 0x2d, 0x6b, 0x76, 0xf7, 0x52, - 0x6b, 0x41, 0x3f, 0x95, 0xf2, 0x43, 0xcc, 0x3c, 0xe5, 0xe5, 0x65, 0x5e, 0x14, 0xb8, 0x00, 0xf0, 0xbe, 0xef, 0xfa, - 0xfe, 0xf7, 0x26, 0x69, 0x30, 0x80, 0x58, 0xec, 0x59, 0x22, 0x2c, 0x13, 0xaf, 0xe6, 0xff, 0x7e, 0x63, 0xfe, 0xef, - 0x9d, 0x2b, 0xa7, 0x60, 0x1a, 0x4d, 0x52, 0x16, 0x5b, 0xd6, 0x89, 0x35, 0x01, 0x2a, 0xbd, 0x2d, 0x97, 0xf4, 0xe3, - 0x45, 0x08, 0x1a, 0xd7, 0x72, 0x2c, 0x52, 0xd9, 0x1c, 0x47, 0x33, 0x9e, 0xdc, 0x86, 0x0b, 0xde, 0x9c, 0x89, 0x54, - 0xe4, 0xf3, 0x68, 0xc4, 0x48, 0x7e, 0x9b, 0x4b, 0x36, 0x6b, 0x2e, 0x38, 0x79, 0xc9, 0x92, 0x2b, 0x26, 0xf9, 0x28, - 0x22, 0xe8, 0x24, 0xe3, 0x51, 0xe2, 0xbd, 0x89, 0xb2, 0x4c, 0x5c, 0x23, 0xf2, 0x4e, 0x5c, 0x0a, 0x29, 0xc8, 0xdb, - 0x9b, 0xdb, 0x09, 0x4b, 0xc9, 0x87, 0xcb, 0x45, 0x2a, 0x17, 0x24, 0x8f, 0xd2, 0xbc, 0x99, 0xb3, 0x8c, 0x8f, 0xbb, - 0x23, 0x91, 0x88, 0xac, 0x09, 0x29, 0xdb, 0x33, 0x16, 0x26, 0x7c, 0x32, 0x95, 0x5e, 0x1c, 0x65, 0x1f, 0xbb, 0xcd, - 0xe6, 0x3c, 0xe3, 0xb3, 0x28, 0xbb, 0x6d, 0xaa, 0x16, 0xe1, 0x67, 0xad, 0xa3, 0xe8, 0xf3, 0xf1, 0xc3, 0xae, 0xcc, - 0xa2, 0x34, 0xe7, 0xb0, 0x4d, 0x61, 0x94, 0x24, 0xde, 0xd1, 0xa3, 0xd6, 0x2c, 0xdf, 0xd3, 0x81, 0xbc, 0x28, 0x95, - 0xc5, 0x05, 0xf9, 0x08, 0x70, 0x07, 0x97, 0x32, 0x25, 0x97, 0x0b, 0x29, 0x45, 0xba, 0x1c, 0x2d, 0xb2, 0x5c, 0x64, - 0xe1, 0x5c, 0xf0, 0x54, 0xb2, 0xac, 0x7b, 0x29, 0xb2, 0x98, 0x65, 0xcd, 0x2c, 0x8a, 0xf9, 0x22, 0x0f, 0x1f, 0xce, - 0x6f, 0xba, 0xa0, 0x59, 0x4c, 0x32, 0xb1, 0x48, 0x63, 0x33, 0x17, 0x4f, 0xa7, 0x2c, 0xe3, 0xd2, 0xad, 0x50, 0xaf, - 0x30, 0x09, 0x13, 0x9e, 0xb2, 0x28, 0x6b, 0x4e, 0xa0, 0x33, 0x98, 0x45, 0xad, 0x98, 0x4d, 0x48, 0x36, 0xb9, 0x8c, - 0xfc, 0x76, 0xe7, 0x09, 0xb1, 0x7f, 0x83, 0x47, 0xd8, 0x6b, 0x6d, 0x2f, 0x6e, 0xb7, 0x5a, 0x7f, 0xc2, 0xdd, 0xb5, - 0x59, 0x14, 0x40, 0x61, 0x7b, 0x7e, 0xe3, 0xe5, 0x02, 0x72, 0xda, 0xb6, 0xf5, 0xec, 0xce, 0xa3, 0x18, 0x12, 0x82, - 0xc3, 0xce, 0xfc, 0xa6, 0x80, 0xd5, 0x85, 0x3a, 0xc9, 0xd4, 0x2c, 0xd2, 0x3c, 0x2d, 0x7f, 0x2b, 0xc4, 0x4f, 0xb7, - 0x43, 0xdc, 0xb1, 0x10, 0x57, 0x58, 0x6f, 0xc6, 0x8b, 0x4c, 0xc5, 0x56, 0xc3, 0x76, 0xae, 0x01, 0x99, 0x8a, 0x2b, - 0x96, 0x59, 0x38, 0xd4, 0xc3, 0x6f, 0x06, 0xa3, 0xb3, 0x1d, 0x8c, 0xa7, 0x9f, 0x02, 0x23, 0x4b, 0xe3, 0x65, 0x7d, - 0x5f, 0xdb, 0x19, 0x9b, 0x75, 0xa7, 0x0c, 0xe8, 0x29, 0xec, 0xc0, 0xef, 0x6b, 0x1e, 0xcb, 0xa9, 0xfe, 0xa9, 0xc8, - 0xf9, 0x5a, 0xd7, 0x3d, 0x6a, 0xb5, 0xf4, 0x73, 0xce, 0x7f, 0x61, 0x61, 0x3b, 0x80, 0x06, 0xc5, 0x05, 0xf9, 0x5b, - 0x79, 0x99, 0xb7, 0xce, 0x3d, 0xc9, 0x0f, 0xee, 0x2d, 0x5f, 0x27, 0x49, 0xb1, 0xba, 0x11, 0x4d, 0x32, 0x2b, 0x2b, - 0xb5, 0xf0, 0x01, 0xb7, 0x9d, 0x3a, 0x4f, 0x94, 0xf7, 0xca, 0x5b, 0x9c, 0xbc, 0xff, 0x83, 0xce, 0xbb, 0x08, 0x21, - 0xd2, 0xe1, 0x24, 0x1b, 0x8a, 0x6e, 0xda, 0xa3, 0xad, 0x6e, 0xda, 0x6c, 0x62, 0x5f, 0xd0, 0x6c, 0x90, 0x9a, 0xf4, - 0x3c, 0x9f, 0xf7, 0x85, 0x32, 0xb6, 0x73, 0x1c, 0x0a, 0xb8, 0x6a, 0xba, 0x5a, 0x55, 0x61, 0x00, 0xae, 0xae, 0x6b, - 0xfc, 0x4d, 0x9a, 0x06, 0x24, 0x77, 0x38, 0x79, 0x6a, 0x5f, 0xec, 0x92, 0x59, 0x5e, 0x91, 0x88, 0x91, 0xc2, 0x5c, - 0x30, 0x8f, 0xe4, 0x14, 0xbc, 0x14, 0xa5, 0xf8, 0xa9, 0x92, 0x98, 0xd0, 0x21, 0xc2, 0xfd, 0xac, 0xcc, 0x70, 0x83, - 0x4c, 0xbe, 0xac, 0x80, 0x51, 0xbe, 0x91, 0x14, 0x46, 0x24, 0xbf, 0x50, 0x6d, 0xd3, 0x59, 0x8b, 0x6e, 0x7c, 0x5f, - 0x8b, 0x8e, 0xa5, 0x92, 0xab, 0xdc, 0x6d, 0x1b, 0x71, 0x98, 0x46, 0xf9, 0xf9, 0x48, 0xdf, 0x95, 0xcc, 0xab, 0x9b, - 0x01, 0x91, 0x82, 0x5e, 0x1b, 0x69, 0x2c, 0x53, 0xf6, 0xe8, 0xf7, 0x72, 0xa7, 0x7d, 0x92, 0xdd, 0x65, 0x9f, 0x94, - 0x0b, 0xcf, 0xc5, 0x22, 0x1b, 0x41, 0x38, 0xd2, 0x48, 0xbd, 0x4d, 0xc7, 0x0d, 0x52, 0x2a, 0x06, 0x22, 0xd2, 0xc9, - 0x04, 0x95, 0x84, 0xbb, 0x2f, 0x95, 0x60, 0x2a, 0xe4, 0xa5, 0xef, 0x6b, 0x18, 0x11, 0x67, 0x97, 0x04, 0x32, 0x3b, - 0x56, 0x49, 0x8d, 0x7e, 0x4a, 0x7b, 0x69, 0xb0, 0x48, 0xf9, 0xcf, 0x0b, 0x76, 0xce, 0x41, 0xd7, 0xe4, 0x01, 0x8f, - 0x55, 0xac, 0x09, 0x64, 0x5f, 0xb3, 0x0d, 0xc1, 0x0b, 0x1e, 0xeb, 0x8d, 0x49, 0x55, 0xa5, 0xc9, 0x6d, 0x42, 0x4d, - 0x04, 0xfe, 0x62, 0xd0, 0x0e, 0x38, 0x89, 0xc5, 0x2c, 0xe2, 0x69, 0xa8, 0x5c, 0xbe, 0xe5, 0x60, 0x21, 0xb4, 0x26, - 0x3c, 0x0e, 0x53, 0xb3, 0x3d, 0x6d, 0x1c, 0xfc, 0x24, 0x78, 0xaa, 0xba, 0x16, 0x5d, 0xa1, 0x10, 0xaa, 0xd1, 0x47, - 0x2d, 0x82, 0x4f, 0xb4, 0x5c, 0x13, 0x98, 0xb8, 0xd5, 0xe5, 0xb5, 0xf3, 0xda, 0x0e, 0xb4, 0xd6, 0x36, 0x4a, 0x1b, - 0x01, 0x62, 0xbd, 0x34, 0x17, 0x99, 0xf4, 0xfd, 0x29, 0x49, 0x30, 0xed, 0x4d, 0x95, 0xb3, 0xeb, 0x38, 0x51, 0xff, - 0xf5, 0x9b, 0xed, 0xb0, 0x5d, 0x9a, 0xef, 0xb5, 0xdb, 0xc0, 0x3a, 0x39, 0xca, 0xdc, 0x28, 0x55, 0xcb, 0x28, 0x7f, - 0xeb, 0xa5, 0x56, 0xcf, 0xe5, 0x72, 0x89, 0x39, 0x6e, 0x5a, 0x54, 0xf9, 0x35, 0x20, 0x54, 0xb0, 0x68, 0xc7, 0x54, - 0xb8, 0xa8, 0xd6, 0x5d, 0xaa, 0x92, 0x17, 0x5a, 0x44, 0x9f, 0xef, 0x2f, 0x33, 0x33, 0x63, 0x71, 0xc1, 0xad, 0x93, - 0xa9, 0x4e, 0x72, 0x85, 0xc1, 0x88, 0xa3, 0x87, 0x6e, 0x6b, 0xa6, 0x61, 0xb9, 0xa5, 0xd9, 0x56, 0xba, 0x0d, 0xf4, - 0x23, 0xcb, 0x68, 0x15, 0xee, 0xda, 0x18, 0x00, 0x72, 0xf5, 0xb6, 0x01, 0x06, 0x66, 0x6b, 0x2e, 0xed, 0x12, 0x40, - 0x1b, 0x1b, 0x33, 0xb8, 0x48, 0x73, 0xb1, 0xbf, 0xfc, 0x46, 0x16, 0x87, 0x4e, 0x53, 0xf5, 0x9b, 0xc7, 0xf0, 0x3f, - 0x48, 0xc0, 0xa5, 0x56, 0x4a, 0x43, 0xf4, 0xf5, 0xdb, 0xb3, 0xf7, 0x88, 0x5c, 0x8a, 0xf8, 0x36, 0x44, 0x32, 0x5b, - 0x30, 0x54, 0xe0, 0x40, 0x4e, 0x59, 0x5a, 0xbe, 0x8c, 0x47, 0x24, 0x2c, 0x48, 0xc4, 0x44, 0x5f, 0xca, 0x5c, 0x37, - 0x92, 0x47, 0x17, 0xc7, 0xea, 0x25, 0x53, 0xbd, 0x63, 0xa9, 0x5f, 0xef, 0x25, 0x33, 0xf8, 0xd9, 0x83, 0x10, 0xca, - 0xf1, 0xa1, 0x9c, 0xaa, 0x87, 0x33, 0x38, 0x30, 0xea, 0x69, 0x7f, 0xb9, 0x41, 0x4c, 0x7d, 0x18, 0x62, 0xda, 0xd3, - 0x4b, 0xc8, 0x55, 0xab, 0x8b, 0x70, 0x74, 0x71, 0x51, 0x1c, 0x1f, 0xc2, 0x58, 0x87, 0x76, 0x5c, 0x80, 0xd0, 0xf6, - 0x2f, 0x09, 0x0c, 0x5e, 0x36, 0x94, 0xd1, 0x1e, 0x0c, 0x01, 0xf3, 0xc6, 0x3d, 0x58, 0x24, 0x10, 0x18, 0xf4, 0x8e, - 0xcb, 0x12, 0x75, 0x62, 0x75, 0xd1, 0x2e, 0x08, 0x74, 0xc3, 0x8a, 0xee, 0xb5, 0x37, 0xb5, 0xda, 0x5f, 0x0b, 0x52, - 0xec, 0x42, 0x77, 0x81, 0xe1, 0x7f, 0x05, 0xd9, 0xf1, 0xa1, 0xc6, 0xc3, 0x85, 0xfb, 0x6a, 0x13, 0xfd, 0xda, 0x81, - 0x12, 0x5b, 0x83, 0x5c, 0x92, 0x8f, 0x92, 0x7c, 0xbc, 0x50, 0x4d, 0xad, 0x30, 0x02, 0x2d, 0x09, 0x84, 0x76, 0xcb, - 0x6a, 0x1d, 0x23, 0x91, 0x24, 0xd1, 0x3c, 0x67, 0xa1, 0xfd, 0x61, 0xe4, 0x12, 0x88, 0xb7, 0x4d, 0x45, 0xc0, 0xa4, - 0xd7, 0x9c, 0x82, 0xba, 0xb0, 0xa9, 0xa5, 0x5c, 0x45, 0x99, 0xdf, 0x6c, 0x8e, 0x9a, 0x97, 0x13, 0x5c, 0xc8, 0xe9, - 0xd2, 0x95, 0x6a, 0x8f, 0x5b, 0xad, 0x2e, 0xe4, 0x42, 0x36, 0xa3, 0x84, 0x4f, 0xd2, 0x30, 0x61, 0x63, 0x59, 0x48, - 0xb8, 0xa5, 0xb6, 0xb4, 0x6a, 0x44, 0xd0, 0x79, 0x94, 0xb1, 0x99, 0x17, 0xc0, 0xbf, 0x77, 0x4f, 0x5c, 0xc8, 0x38, - 0x4c, 0xe5, 0xb4, 0xa9, 0xb2, 0x6e, 0xe1, 0xce, 0x80, 0x9c, 0xd6, 0x9e, 0x97, 0xce, 0x44, 0x23, 0x06, 0x2a, 0x56, - 0x21, 0x33, 0x4f, 0x4e, 0x89, 0xcc, 0xdc, 0x76, 0x29, 0x5e, 0x6e, 0xac, 0x60, 0x53, 0xd2, 0x1f, 0xe1, 0x22, 0x57, - 0x8a, 0xf1, 0x66, 0x63, 0xab, 0x2e, 0xd5, 0x9f, 0x36, 0xd0, 0xe7, 0x28, 0x76, 0x85, 0x76, 0x2c, 0x2f, 0x75, 0x8f, - 0xfb, 0x20, 0xb3, 0xa6, 0x72, 0x12, 0xb7, 0x07, 0x2e, 0x78, 0x3a, 0x5f, 0xc8, 0x81, 0x72, 0x6a, 0x67, 0x70, 0x41, - 0x62, 0x48, 0x9c, 0x12, 0xc0, 0xc1, 0x70, 0xa9, 0x81, 0x19, 0x45, 0xc9, 0xc8, 0x07, 0x88, 0xbc, 0xa6, 0xf7, 0x34, - 0x63, 0x33, 0xdc, 0x9d, 0xf1, 0xb4, 0xa9, 0xeb, 0x1e, 0x39, 0x6a, 0x49, 0xf0, 0x04, 0x9e, 0x8a, 0x40, 0x8d, 0x46, - 0x54, 0xee, 0xea, 0x16, 0x5c, 0x5e, 0x0c, 0x8b, 0xa2, 0x9b, 0x49, 0x7f, 0xf0, 0xda, 0xc7, 0x43, 0xf2, 0x8b, 0xf3, - 0x72, 0x16, 0x64, 0x8f, 0x0a, 0x22, 0x1d, 0xbc, 0xa3, 0x89, 0x7b, 0x16, 0x54, 0xb3, 0x5f, 0x28, 0x34, 0x7c, 0xe7, - 0x23, 0x96, 0xcf, 0x9b, 0x9a, 0x77, 0x35, 0x15, 0xc9, 0x22, 0xe8, 0x8a, 0x8d, 0xa7, 0xf6, 0x7b, 0xb9, 0x54, 0x6c, - 0xc9, 0x5c, 0xd2, 0xd0, 0xce, 0x84, 0x61, 0x79, 0xa9, 0xc7, 0x3c, 0xbb, 0xd7, 0x78, 0x70, 0x8d, 0x9f, 0x5c, 0x9c, - 0xd4, 0x79, 0x1c, 0xf0, 0xa5, 0xf2, 0x05, 0x76, 0x51, 0x92, 0xc0, 0x84, 0x17, 0x56, 0x7d, 0x71, 0x5f, 0xfa, 0x31, - 0x90, 0x43, 0x1f, 0x17, 0xe6, 0x9c, 0x3e, 0x53, 0x2a, 0xa5, 0xf3, 0xd6, 0xbc, 0x3d, 0x69, 0x83, 0x45, 0x5a, 0xfa, - 0x72, 0x08, 0x77, 0xd7, 0xf2, 0xa2, 0xbb, 0x15, 0xef, 0xd2, 0x0a, 0xa9, 0xa7, 0x16, 0x44, 0x51, 0x96, 0xc6, 0xc8, - 0xfb, 0xcb, 0x28, 0xe1, 0xa3, 0x8f, 0x14, 0xed, 0x2f, 0x7d, 0xbc, 0x79, 0xed, 0x51, 0x71, 0x05, 0xcb, 0xb0, 0x71, - 0xdd, 0x91, 0x9e, 0x06, 0x0e, 0x2f, 0xd6, 0x6f, 0xc5, 0x41, 0xbd, 0xfd, 0x25, 0x30, 0x1e, 0x3d, 0x4f, 0xef, 0xa2, - 0x38, 0xaf, 0xde, 0x75, 0x55, 0x41, 0x01, 0x68, 0xd6, 0xe5, 0x9e, 0x22, 0x2a, 0x8a, 0x3e, 0x49, 0x69, 0xc8, 0xd3, - 0x4c, 0x0d, 0xe0, 0x94, 0x86, 0xbf, 0x21, 0xef, 0x2f, 0x65, 0x19, 0x2b, 0x3d, 0x1a, 0x2a, 0x25, 0x83, 0x22, 0x98, - 0x0b, 0xcc, 0xd8, 0x20, 0x66, 0x32, 0xe2, 0x89, 0xee, 0xd2, 0xb5, 0x06, 0xf8, 0xda, 0x8a, 0x56, 0xab, 0xbc, 0xbe, - 0x16, 0x5e, 0xc7, 0xa0, 0x5a, 0xd9, 0xf1, 0x61, 0x05, 0xb7, 0x5a, 0x99, 0x3a, 0x93, 0x6e, 0x68, 0xb0, 0x5a, 0xa1, - 0xae, 0xf3, 0xfe, 0x32, 0x52, 0xd7, 0x86, 0x00, 0x40, 0x61, 0x00, 0x84, 0xa0, 0xb5, 0xbe, 0x16, 0xe3, 0x27, 0x54, - 0x04, 0x32, 0xca, 0x26, 0x4c, 0xae, 0x21, 0x36, 0xd1, 0x39, 0xaa, 0x5d, 0x1b, 0xa0, 0xde, 0x80, 0x36, 0xaa, 0x43, - 0x7b, 0x01, 0x48, 0xef, 0xef, 0x2f, 0x79, 0x41, 0xf7, 0x97, 0x2c, 0x1d, 0x89, 0x98, 0x7d, 0x78, 0xf7, 0x25, 0x5c, - 0x72, 0x14, 0x29, 0x18, 0x16, 0x53, 0x0c, 0x82, 0x53, 0x6d, 0x8e, 0x16, 0x21, 0x42, 0x89, 0x10, 0xcd, 0x09, 0x3c, - 0x35, 0x97, 0x02, 0xb1, 0x40, 0x5e, 0x5f, 0x43, 0xce, 0x62, 0x0d, 0x33, 0x4d, 0x55, 0x2f, 0x51, 0x1c, 0x1f, 0xea, - 0xd6, 0x5a, 0x04, 0xe8, 0x46, 0x80, 0x04, 0x75, 0x4e, 0x2b, 0x1c, 0x40, 0x5e, 0xb3, 0x8b, 0x87, 0x98, 0x5f, 0x95, - 0xc4, 0xa6, 0x2e, 0x50, 0xf5, 0x8e, 0x93, 0xe8, 0x92, 0x25, 0xbd, 0xfd, 0x65, 0xba, 0x5a, 0xb5, 0x8a, 0xe3, 0x43, - 0xfd, 0xe8, 0x1d, 0x2b, 0xbe, 0xa1, 0x5f, 0x78, 0xa9, 0xb6, 0x18, 0x6e, 0x25, 0x42, 0xb6, 0xa7, 0x4d, 0x73, 0x0a, - 0xcd, 0x00, 0x05, 0xf2, 0x54, 0x82, 0x85, 0x6a, 0x54, 0x2a, 0x44, 0x05, 0xf2, 0x78, 0xbc, 0x59, 0x96, 0x4b, 0x36, - 0x87, 0xd2, 0xe9, 0x6a, 0xd5, 0x2e, 0x90, 0x37, 0xe3, 0x29, 0x3c, 0xa5, 0xab, 0x95, 0xba, 0xf0, 0x37, 0xe3, 0xa9, - 0xdf, 0x02, 0xb2, 0x45, 0xde, 0x2c, 0xba, 0x51, 0x0b, 0xb6, 0x35, 0xd1, 0x8d, 0xdf, 0x36, 0x55, 0x41, 0x89, 0x9f, - 0x1c, 0x28, 0xae, 0xda, 0xd1, 0xc4, 0xec, 0x68, 0x4c, 0x16, 0xfa, 0x2a, 0x13, 0xf5, 0x63, 0x9a, 0x6c, 0xdf, 0xd1, - 0xd8, 0xee, 0xe8, 0x62, 0xc7, 0x8e, 0x2e, 0xee, 0xd8, 0xd1, 0xc8, 0xec, 0x9e, 0x57, 0xe2, 0x4e, 0xac, 0x56, 0xed, - 0x56, 0x85, 0xbd, 0xe3, 0xc3, 0x98, 0x5f, 0xc1, 0x6e, 0x80, 0x9a, 0x27, 0xf9, 0x8c, 0x6d, 0x27, 0xca, 0x3a, 0x8a, - 0xd9, 0xaf, 0xc2, 0x64, 0x85, 0x85, 0xb4, 0x8e, 0x05, 0x97, 0xae, 0xcb, 0x98, 0xdb, 0x1f, 0x49, 0xd9, 0x1c, 0xf0, - 0x90, 0x03, 0x1e, 0xa6, 0xf6, 0x05, 0x98, 0x3e, 0x7a, 0x8f, 0x08, 0xf2, 0x90, 0x25, 0xeb, 0x8b, 0xe2, 0x1c, 0x64, - 0x84, 0x5a, 0xdf, 0xbd, 0x68, 0x11, 0x5a, 0xa3, 0xde, 0x6e, 0x9a, 0x83, 0xf0, 0xf8, 0xb5, 0xc8, 0x62, 0x14, 0xea, - 0xa6, 0xbf, 0x0a, 0x55, 0x33, 0x9e, 0x9a, 0x64, 0xab, 0x9d, 0xb4, 0x56, 0xd5, 0xbb, 0x14, 0xd7, 0x79, 0xf4, 0x48, - 0xb7, 0x98, 0x47, 0x52, 0xb2, 0x2c, 0x35, 0x94, 0x8b, 0xd0, 0xff, 0x17, 0x54, 0xb8, 0x85, 0xaf, 0x44, 0x76, 0x03, - 0x2c, 0x01, 0x1a, 0x85, 0xdd, 0xf0, 0x7c, 0x2d, 0x9e, 0xf6, 0x2a, 0x0d, 0xf6, 0x16, 0xbb, 0x46, 0x83, 0x2e, 0x02, - 0x1b, 0x66, 0x31, 0x63, 0xf1, 0xb9, 0x62, 0xd0, 0xfd, 0xd1, 0x85, 0x51, 0x58, 0xd7, 0xc4, 0x5d, 0xd5, 0x81, 0xa0, - 0x1f, 0x17, 0x9d, 0x27, 0x0f, 0x4f, 0x11, 0xd1, 0x3c, 0x5e, 0x8c, 0xc7, 0x08, 0x17, 0xde, 0xfd, 0xba, 0xb5, 0x1f, - 0xfe, 0xb8, 0xf8, 0xe2, 0x45, 0xeb, 0x8b, 0xb2, 0x73, 0x0a, 0x44, 0x64, 0xe2, 0xfb, 0x56, 0x54, 0x39, 0xf0, 0xda, - 0x15, 0x8d, 0xa3, 0x74, 0xf7, 0x72, 0x06, 0xee, 0x72, 0xf2, 0x39, 0x63, 0x31, 0x10, 0x27, 0xd9, 0x28, 0x3d, 0x4f, - 0xd8, 0x15, 0xb3, 0x6f, 0x1e, 0xdc, 0x32, 0xd9, 0x96, 0x1e, 0x23, 0xb1, 0x48, 0xa5, 0x49, 0x74, 0x30, 0xac, 0xd6, - 0x59, 0xd2, 0x85, 0x5a, 0x83, 0x6b, 0x23, 0xdc, 0x6a, 0x39, 0x57, 0x97, 0x5e, 0xc5, 0x05, 0x41, 0x0e, 0x00, 0x3b, - 0x21, 0xeb, 0xef, 0x28, 0x0f, 0x5b, 0xa4, 0xb5, 0x0b, 0x36, 0xd2, 0xc6, 0x21, 0x42, 0x43, 0x8b, 0x27, 0xe5, 0xab, - 0xac, 0xbd, 0x30, 0x62, 0x27, 0xbe, 0x3e, 0x89, 0x81, 0xcb, 0x0c, 0x06, 0x4b, 0x59, 0x9e, 0xef, 0x44, 0x40, 0xb9, - 0x89, 0x04, 0x55, 0xad, 0xd1, 0x8e, 0x51, 0x48, 0x8b, 0xc0, 0x09, 0x53, 0x00, 0x97, 0x11, 0x53, 0xd3, 0x8a, 0x8d, - 0xc7, 0x6c, 0x54, 0xba, 0x7a, 0x21, 0xf6, 0x35, 0xe6, 0x89, 0x84, 0x10, 0x90, 0x8a, 0xcd, 0xa0, 0x37, 0x22, 0x65, - 0x08, 0xdb, 0x6c, 0x4e, 0x03, 0xbf, 0x91, 0xff, 0xdb, 0xe1, 0xd1, 0x23, 0xd6, 0x61, 0x31, 0xb3, 0xac, 0x56, 0xd6, - 0xcd, 0x53, 0x2b, 0xaf, 0x23, 0x52, 0x28, 0x3f, 0xce, 0xae, 0x03, 0x74, 0xbf, 0x63, 0xb2, 0x6c, 0x7f, 0xf1, 0xa8, - 0xdd, 0x2a, 0x10, 0x41, 0x30, 0xdc, 0x7d, 0x4f, 0x89, 0xea, 0x75, 0x04, 0xbd, 0x16, 0xe9, 0xaf, 0xe9, 0xd7, 0x69, - 0x7f, 0xde, 0x46, 0x44, 0xbf, 0x48, 0x00, 0x17, 0x25, 0x33, 0x18, 0x81, 0xf3, 0xf3, 0x77, 0x2f, 0xa5, 0x3e, 0xf8, - 0xfd, 0xe0, 0x79, 0xdc, 0x6e, 0x21, 0x82, 0x72, 0x29, 0xe6, 0xbf, 0x62, 0x09, 0x47, 0x88, 0xa0, 0x51, 0x22, 0x72, - 0xe6, 0xae, 0x41, 0xab, 0xb3, 0xbf, 0x7f, 0x11, 0x1a, 0xa2, 0x79, 0xc6, 0xf2, 0xdc, 0x73, 0xc7, 0x37, 0xa4, 0xf4, - 0x09, 0x86, 0xb9, 0x95, 0xe2, 0x72, 0x26, 0x15, 0x5e, 0xf4, 0x1d, 0x7f, 0x97, 0xaa, 0x74, 0xd9, 0x06, 0xb1, 0x29, - 0x11, 0x50, 0x32, 0x36, 0xad, 0x5d, 0x7d, 0x72, 0xe6, 0x2d, 0x47, 0x4f, 0x4f, 0xac, 0x63, 0xc2, 0x9b, 0x13, 0xd4, - 0x4a, 0x66, 0x3c, 0x3d, 0xdf, 0x52, 0x1a, 0xdd, 0x6c, 0x29, 0x05, 0x95, 0xad, 0x84, 0xce, 0xbc, 0x7e, 0xe6, 0xd3, - 0x58, 0xaf, 0x14, 0x1f, 0x17, 0xc4, 0x58, 0xf9, 0x2d, 0x3f, 0x01, 0xa9, 0xb3, 0x0d, 0x6a, 0x84, 0xdf, 0x3e, 0x1d, - 0x94, 0xfc, 0x9a, 0xe9, 0xca, 0x51, 0x7e, 0xdf, 0x0a, 0xa1, 0xb4, 0x09, 0xfe, 0xeb, 0xe4, 0x57, 0xad, 0x95, 0xdd, - 0x7c, 0x9a, 0xe0, 0x1c, 0xad, 0xea, 0x77, 0x6c, 0xbd, 0xb9, 0xc7, 0xbe, 0xbe, 0xf7, 0x5b, 0x8a, 0x8d, 0xe2, 0x53, - 0xee, 0xff, 0x28, 0xe1, 0xb3, 0x8a, 0x04, 0x36, 0xc1, 0x54, 0x1a, 0x0f, 0x24, 0x33, 0xb9, 0x83, 0x68, 0xd5, 0xe7, - 0x1c, 0xae, 0x68, 0xc2, 0x7b, 0x30, 0x16, 0x19, 0x3b, 0x4f, 0xc4, 0xf5, 0xfa, 0x7b, 0xbd, 0x76, 0x37, 0x9e, 0xf2, - 0xc9, 0xd4, 0xb9, 0x77, 0xc5, 0x68, 0xb9, 0x09, 0x77, 0x4e, 0x50, 0xfc, 0xeb, 0xbf, 0x04, 0xc1, 0xbf, 0xfe, 0xcb, - 0x27, 0x9b, 0xc2, 0xf0, 0xc5, 0x05, 0x91, 0xd5, 0xb0, 0xbb, 0x4f, 0xd7, 0xf6, 0x99, 0xea, 0x38, 0xdf, 0xde, 0x66, - 0x63, 0x13, 0xa0, 0x7e, 0x63, 0x0b, 0x36, 0x0a, 0xf5, 0xe9, 0xf3, 0x7e, 0x0b, 0x60, 0xb0, 0xae, 0x4f, 0x42, 0x06, - 0x8d, 0x7e, 0x17, 0x68, 0x17, 0x38, 0xbc, 0xd7, 0x8e, 0xfc, 0x76, 0x0c, 0x7f, 0x6a, 0x0d, 0xbf, 0x13, 0x7c, 0xe3, - 0x9f, 0x18, 0x5d, 0x5c, 0x94, 0x09, 0x76, 0x6e, 0x57, 0xb8, 0xc0, 0xdf, 0xdf, 0x28, 0x31, 0x8a, 0x47, 0xd8, 0xc2, - 0x3d, 0x75, 0x3d, 0x90, 0x8e, 0x2e, 0x5e, 0xc3, 0x5b, 0x7b, 0x8e, 0x2f, 0x33, 0xeb, 0xe0, 0xbd, 0x43, 0x38, 0xc0, - 0x10, 0xf5, 0x55, 0xa9, 0x41, 0x37, 0x24, 0x03, 0x94, 0x82, 0xb9, 0x01, 0x60, 0x92, 0xd1, 0x85, 0xb1, 0x36, 0x4f, - 0xb5, 0x1b, 0x26, 0x5c, 0x27, 0x6d, 0xe3, 0x9e, 0xa9, 0x21, 0x9d, 0x78, 0xef, 0x15, 0xbe, 0x54, 0x63, 0x56, 0x59, - 0xf7, 0xca, 0xd5, 0x05, 0x76, 0xc4, 0x45, 0xa1, 0xc2, 0xf4, 0x7f, 0xdd, 0x15, 0x49, 0xfc, 0xfb, 0xa7, 0x23, 0x89, - 0xe2, 0x5e, 0x91, 0xc4, 0xbf, 0xff, 0xe1, 0x91, 0xc4, 0xbf, 0xba, 0x91, 0x44, 0xd8, 0xc4, 0x2f, 0xef, 0x15, 0xed, - 0xb3, 0x91, 0x18, 0x71, 0x9d, 0xd3, 0xb6, 0x51, 0xa3, 0x13, 0x31, 0x81, 0x50, 0xdf, 0xbf, 0x7f, 0xe4, 0x2e, 0x11, - 0x13, 0x37, 0x6e, 0x07, 0x6f, 0x6d, 0x85, 0x40, 0x5d, 0xd7, 0x46, 0xd8, 0x4c, 0xac, 0xac, 0x55, 0xde, 0x48, 0x69, - 0x3e, 0xb4, 0x6f, 0x50, 0x40, 0x61, 0xf9, 0x16, 0xa4, 0x16, 0xe9, 0xd8, 0x68, 0x5a, 0xa8, 0x02, 0x71, 0x65, 0xc7, - 0x4e, 0xc3, 0x5e, 0xb7, 0x70, 0x47, 0xe8, 0xda, 0xb7, 0xbc, 0xe8, 0xdb, 0xf7, 0x4b, 0xf4, 0xe3, 0x4d, 0xfb, 0xd9, - 0xa0, 0xdd, 0x3d, 0x6a, 0xcf, 0x50, 0x88, 0x40, 0x44, 0xaa, 0x82, 0x56, 0xf7, 0xe8, 0x08, 0x0a, 0xae, 0x9d, 0x82, - 0x0e, 0x14, 0x70, 0xa7, 0xe0, 0x11, 0x14, 0x8c, 0x9c, 0x82, 0xc7, 0x50, 0x10, 0x3b, 0x05, 0x4f, 0xa0, 0xe0, 0x0a, - 0x15, 0x03, 0x5e, 0x82, 0xfb, 0x04, 0x0f, 0x89, 0xb6, 0x5c, 0x6c, 0xd9, 0x13, 0xd2, 0x86, 0x10, 0x5e, 0x34, 0x51, - 0x99, 0x47, 0xe0, 0x10, 0x0c, 0x05, 0xb9, 0x9e, 0xb2, 0x34, 0x84, 0x20, 0xea, 0x73, 0x25, 0x63, 0x02, 0x29, 0xde, - 0xf3, 0x19, 0xb3, 0xdf, 0xcb, 0xb0, 0x78, 0xf0, 0x10, 0x1e, 0xb4, 0x86, 0x45, 0xb7, 0xdc, 0x39, 0x1d, 0xfb, 0x33, - 0x59, 0x28, 0x7a, 0x2f, 0xab, 0x3a, 0x3d, 0x5d, 0xb3, 0xdc, 0xf3, 0x1d, 0x31, 0x24, 0xc7, 0x17, 0x31, 0x4e, 0xc4, - 0x75, 0xf3, 0x06, 0xf5, 0xb6, 0xc7, 0x95, 0x00, 0xa2, 0x32, 0xae, 0xa4, 0xd6, 0x54, 0x3e, 0xbd, 0x8f, 0x26, 0xe5, - 0xef, 0xd7, 0x2c, 0xcf, 0xa3, 0x89, 0x69, 0xb9, 0x3b, 0x8e, 0xa4, 0x40, 0x74, 0x63, 0x48, 0x16, 0x08, 0x88, 0x05, - 0xc1, 0x66, 0x81, 0x2d, 0x6f, 0x42, 0x43, 0x80, 0x9d, 0x7a, 0x54, 0x49, 0x4d, 0x5f, 0x2f, 0x92, 0xd1, 0xa4, 0x2a, - 0x38, 0x9e, 0x67, 0x4c, 0x95, 0x6a, 0x0c, 0x17, 0xc7, 0x87, 0x50, 0xa0, 0xab, 0x77, 0x44, 0x8f, 0xac, 0xe3, 0x60, - 0x77, 0x0c, 0xc9, 0xb3, 0xd1, 0x23, 0x37, 0xdf, 0xa6, 0x4c, 0xb6, 0xd9, 0x8c, 0x59, 0x7c, 0xd6, 0x1e, 0xc1, 0x1f, - 0x13, 0x11, 0xf9, 0x6c, 0x3c, 0x1e, 0xdf, 0x19, 0x4d, 0xfa, 0x2c, 0x1e, 0xb3, 0x0e, 0x7b, 0xd4, 0x85, 0x5c, 0x8c, - 0xa6, 0x89, 0x41, 0xb4, 0x0b, 0x85, 0xbb, 0xe5, 0xfd, 0x1a, 0x43, 0xb8, 0x42, 0x4e, 0x97, 0xf7, 0x8f, 0x2c, 0x15, - 0xf3, 0x8c, 0x2d, 0x67, 0x51, 0x36, 0xe1, 0x69, 0xd8, 0x2a, 0x82, 0x2b, 0x13, 0x8a, 0xf9, 0xec, 0xe9, 0xd3, 0xa7, - 0x45, 0x10, 0xdb, 0xa7, 0x56, 0x1c, 0x17, 0xc1, 0x68, 0x59, 0x2e, 0xa3, 0xd5, 0x1a, 0x8f, 0x8b, 0x80, 0xdb, 0x82, - 0xa3, 0xce, 0x28, 0x3e, 0xea, 0x14, 0xc1, 0xb5, 0xd3, 0xa2, 0x08, 0x98, 0x79, 0xca, 0x58, 0x5c, 0x4b, 0xe8, 0x78, - 0xd2, 0x6a, 0x15, 0x81, 0x26, 0xb4, 0x25, 0x98, 0x63, 0xfa, 0x67, 0x18, 0x2d, 0xa4, 0x00, 0x96, 0xdc, 0x15, 0xd2, - 0x1f, 0x9c, 0x9b, 0x97, 0x65, 0xe8, 0x0f, 0x4b, 0x14, 0x78, 0x48, 0xbe, 0x74, 0x83, 0x26, 0x40, 0xcc, 0x2a, 0x58, - 0x22, 0x6c, 0x4c, 0xa5, 0x56, 0x0d, 0x94, 0xa5, 0xaa, 0xbf, 0xa4, 0xa2, 0x8a, 0xa5, 0x00, 0xff, 0x81, 0x96, 0xfa, - 0xad, 0x6e, 0x92, 0xed, 0xe0, 0xfa, 0x8c, 0x7d, 0x92, 0xeb, 0xdf, 0xde, 0x87, 0xe9, 0x33, 0xf6, 0x47, 0x33, 0x7d, - 0xf3, 0xea, 0x53, 0xcd, 0xf4, 0x35, 0x5b, 0x9b, 0x49, 0x8a, 0x46, 0x53, 0x36, 0xfa, 0x78, 0x29, 0x6e, 0x9a, 0x70, - 0x24, 0x32, 0xa4, 0xf8, 0xe9, 0xfe, 0x6f, 0x4d, 0xfe, 0xb0, 0x83, 0x39, 0xdf, 0xa5, 0x50, 0x62, 0xf3, 0x6d, 0x4a, - 0xd1, 0x5b, 0x6b, 0xd3, 0xe9, 0x92, 0xf1, 0x98, 0xa2, 0xb7, 0xe3, 0x31, 0xb2, 0x57, 0xfe, 0x22, 0xc9, 0x54, 0xab, - 0x37, 0xb5, 0x12, 0xd5, 0xea, 0x8b, 0x2f, 0xdc, 0x32, 0xb7, 0xc0, 0x84, 0x5c, 0xdc, 0xf0, 0x8a, 0xa9, 0x89, 0x79, - 0x0e, 0x47, 0x0d, 0x3e, 0x97, 0x51, 0x7f, 0xe7, 0x60, 0x56, 0x7b, 0x3d, 0x74, 0x09, 0xf0, 0x96, 0x77, 0x5a, 0xaf, - 0xdf, 0x77, 0x9f, 0x30, 0x9b, 0x7e, 0xf7, 0xec, 0xf6, 0xcb, 0xd8, 0x9f, 0x49, 0x5c, 0xf0, 0xfc, 0x6d, 0xba, 0x76, - 0x97, 0x45, 0xc3, 0x48, 0xa9, 0xbb, 0xac, 0x42, 0x8a, 0xc9, 0x24, 0x81, 0x0f, 0x96, 0x2c, 0x6b, 0xef, 0x41, 0xd5, - 0xdd, 0xfb, 0xb5, 0xf5, 0x86, 0x6e, 0x47, 0xf3, 0xd6, 0x50, 0xf5, 0xfd, 0x24, 0x9d, 0x03, 0x7d, 0x65, 0x3e, 0xa4, - 0xa3, 0xcc, 0xc1, 0xa5, 0xe1, 0xff, 0x4b, 0x9d, 0x39, 0x2b, 0x21, 0x6b, 0x44, 0x0f, 0x1c, 0x17, 0x85, 0xb9, 0x73, - 0x10, 0xf3, 0x7c, 0x0e, 0xef, 0xe7, 0xd4, 0x3d, 0xd9, 0xa7, 0x58, 0x78, 0x7e, 0xed, 0xc4, 0x35, 0x6a, 0xdb, 0x55, - 0xd8, 0xc0, 0x86, 0x76, 0x14, 0xcf, 0x64, 0x81, 0x8c, 0xbf, 0xd9, 0x22, 0x11, 0x79, 0x1a, 0x9f, 0x3a, 0xe2, 0xe2, - 0xac, 0x10, 0x9c, 0xbe, 0xe5, 0x86, 0xd8, 0x2a, 0x5b, 0x50, 0xb8, 0x71, 0x3b, 0x55, 0xa3, 0xb1, 0xa5, 0xa2, 0x04, - 0xf9, 0x3c, 0x4a, 0x35, 0x1b, 0xa5, 0x48, 0xf3, 0x83, 0xfd, 0x65, 0xb5, 0xf3, 0x05, 0xb2, 0x60, 0x6b, 0xe2, 0xed, - 0x1d, 0x1f, 0x42, 0x87, 0x9e, 0x57, 0x03, 0x3d, 0xdd, 0x08, 0x2e, 0x7c, 0x22, 0xcc, 0x7f, 0x11, 0xe4, 0xd7, 0x24, - 0xc8, 0xaf, 0xbd, 0x3f, 0x2f, 0x9b, 0xd7, 0xec, 0xf2, 0x23, 0x97, 0x4d, 0x19, 0xcd, 0x9b, 0xa0, 0xf0, 0x2b, 0xa7, - 0xa0, 0x61, 0xcf, 0x2a, 0x59, 0x4d, 0xdf, 0xd8, 0xef, 0x2e, 0x72, 0xc8, 0x06, 0x50, 0x6a, 0x6b, 0x98, 0x8a, 0x94, - 0x75, 0xeb, 0x49, 0x89, 0x6e, 0x70, 0xd9, 0x62, 0x6b, 0xb8, 0x14, 0x90, 0x3d, 0x20, 0x6f, 0xc3, 0x96, 0x61, 0xeb, - 0x2d, 0x1b, 0x39, 0x6e, 0x6d, 0x6d, 0x1f, 0x1a, 0xe4, 0x36, 0x94, 0xf4, 0xca, 0x36, 0x23, 0xe8, 0xbb, 0x22, 0xe0, - 0x9f, 0x4a, 0xd1, 0x03, 0x57, 0xa2, 0xfd, 0xeb, 0xe4, 0x36, 0xae, 0x17, 0xab, 0x14, 0xbd, 0xfb, 0x40, 0x16, 0x46, - 0x63, 0xc9, 0x32, 0x72, 0x9f, 0x96, 0x97, 0xea, 0x36, 0xcd, 0x12, 0xc4, 0x4c, 0xd8, 0x7e, 0x3a, 0xbf, 0xb9, 0xff, - 0xf0, 0x77, 0x2f, 0xbf, 0x30, 0x38, 0xb2, 0x6f, 0x97, 0x41, 0xa8, 0x0b, 0x07, 0x21, 0x89, 0x6e, 0x43, 0x9e, 0x2a, - 0x99, 0x77, 0x09, 0xfe, 0xc0, 0xee, 0x5c, 0x98, 0x5c, 0xd3, 0x8c, 0x25, 0xea, 0x53, 0x72, 0x66, 0x2b, 0x8e, 0x1e, - 0xcf, 0x6f, 0xec, 0x6e, 0xb4, 0xd7, 0x72, 0x48, 0xff, 0xd0, 0x54, 0xd1, 0xdd, 0xb9, 0xa9, 0xf5, 0x74, 0xc7, 0x47, - 0xf3, 0x9b, 0xae, 0x16, 0xb4, 0xcd, 0x4c, 0x43, 0xd5, 0x9a, 0xdf, 0xb8, 0xc9, 0xb2, 0xd5, 0x40, 0x5e, 0x70, 0x94, - 0x7b, 0x2c, 0xca, 0x59, 0x17, 0xde, 0x9f, 0xcd, 0x47, 0x51, 0x62, 0x84, 0xf9, 0x8c, 0xc7, 0x71, 0xc2, 0xba, 0x56, - 0x5e, 0x7b, 0xed, 0xc7, 0x90, 0x6b, 0xea, 0x6e, 0x59, 0x7d, 0x57, 0x1c, 0xe4, 0x95, 0x78, 0x8a, 0x2e, 0x73, 0x91, - 0xc0, 0xc7, 0x2b, 0xb6, 0xa2, 0xd3, 0x24, 0x61, 0xb6, 0x2a, 0xe4, 0xa9, 0xdf, 0xf5, 0xb5, 0x3c, 0x6a, 0xfd, 0xa9, - 0xab, 0x36, 0xbc, 0xd5, 0x95, 0x62, 0x1e, 0x36, 0x8f, 0xea, 0x0b, 0x81, 0xaa, 0x72, 0x09, 0x64, 0xcb, 0xb2, 0x08, - 0x48, 0x2b, 0xcd, 0xa7, 0xbd, 0xa0, 0x6d, 0xca, 0xd4, 0x00, 0xf0, 0xa2, 0xe7, 0xb2, 0xa8, 0xa8, 0x2f, 0xe6, 0xdf, - 0xe7, 0xb4, 0x7c, 0xbe, 0xfd, 0xb4, 0x7c, 0x6e, 0x4f, 0xcb, 0xdd, 0x14, 0xfb, 0xd9, 0xb8, 0x0d, 0x7f, 0xba, 0xd5, - 0x82, 0xc2, 0x96, 0x77, 0x34, 0xbf, 0xf1, 0x40, 0x4f, 0x6b, 0x76, 0xe6, 0x37, 0x3a, 0x55, 0x18, 0x62, 0x16, 0x2d, - 0x48, 0x9e, 0x25, 0x2d, 0x0f, 0x0a, 0xe1, 0x6f, 0xab, 0x56, 0xd5, 0x7e, 0x08, 0x75, 0xd0, 0xeb, 0xd1, 0x66, 0x5d, - 0xe7, 0xee, 0x43, 0x1b, 0xa6, 0x42, 0xfa, 0xa1, 0xe5, 0xc6, 0x38, 0x90, 0xd1, 0xe5, 0x25, 0x8b, 0xc3, 0xb1, 0x18, - 0x2d, 0xf2, 0x7f, 0x36, 0xf0, 0x1b, 0x24, 0xde, 0x79, 0xa4, 0xd7, 0xc6, 0xb1, 0x5d, 0x75, 0xe2, 0xb2, 0x1d, 0x61, - 0x59, 0xee, 0x53, 0x98, 0x8f, 0xa2, 0x84, 0xf9, 0x9d, 0xe0, 0xe1, 0x96, 0x43, 0xf0, 0x1f, 0xb2, 0x37, 0x5b, 0x17, - 0xf3, 0x7b, 0x91, 0x71, 0x27, 0x12, 0x7e, 0x15, 0x0e, 0xdc, 0x3d, 0x6c, 0x3d, 0xdd, 0x0e, 0xee, 0xc0, 0xce, 0x34, - 0xb4, 0x42, 0xc1, 0xc8, 0x9d, 0x98, 0x8d, 0xa3, 0x45, 0x22, 0xef, 0x1e, 0x75, 0x17, 0x65, 0x6c, 0x8c, 0x7a, 0x07, - 0x43, 0xaf, 0xda, 0xde, 0x93, 0x4b, 0x7f, 0xf6, 0xf9, 0x43, 0xf8, 0xa3, 0xf3, 0x9e, 0x6e, 0x2b, 0x5d, 0x5d, 0xdb, - 0xaa, 0xa0, 0xab, 0xef, 0xd7, 0x94, 0x71, 0x2d, 0xc2, 0x95, 0x3e, 0x7e, 0xdf, 0xd6, 0xa0, 0x55, 0xde, 0xab, 0xb9, - 0xd1, 0xb2, 0x7e, 0x55, 0xeb, 0x5f, 0x37, 0xf8, 0x3d, 0xdb, 0x8e, 0xb4, 0xe6, 0x5a, 0x6f, 0x6b, 0xbe, 0xa5, 0xb7, - 0xd1, 0xd8, 0x62, 0x5c, 0xb5, 0xdf, 0xa7, 0xb7, 0xa5, 0x89, 0xa2, 0xa3, 0x90, 0x60, 0xa5, 0xec, 0x6b, 0x2b, 0x85, - 0x33, 0xfa, 0x00, 0xde, 0x64, 0xeb, 0xdd, 0xcc, 0x92, 0x34, 0xa7, 0x68, 0x2a, 0xe5, 0x3c, 0xd4, 0x1f, 0x5f, 0xbd, - 0x3e, 0x0a, 0x44, 0x36, 0x39, 0xec, 0xb4, 0x5a, 0x2d, 0x78, 0x03, 0x29, 0xf2, 0xae, 0x38, 0xbb, 0x7e, 0x26, 0x6e, - 0x28, 0x7a, 0xe2, 0x3d, 0xf5, 0x9e, 0x1c, 0x79, 0x8f, 0x1e, 0x23, 0x4f, 0xb1, 0x73, 0x8a, 0x9e, 0x1c, 0x21, 0x4f, - 0xb3, 0x73, 0x8a, 0x1e, 0x3d, 0x46, 0xbd, 0xe3, 0x89, 0x55, 0xc9, 0xe0, 0x0a, 0xa3, 0xd6, 0x77, 0x72, 0x99, 0x89, - 0x8f, 0xac, 0x7e, 0x70, 0x75, 0x99, 0xc9, 0x8c, 0xeb, 0xd8, 0x47, 0x38, 0xbd, 0xa3, 0x68, 0x1e, 0x2a, 0xa2, 0x70, - 0x0b, 0xc1, 0x2d, 0xa3, 0x4b, 0xd5, 0x14, 0xa0, 0x66, 0x5e, 0xa2, 0xde, 0x31, 0x64, 0xb1, 0x7b, 0x31, 0x45, 0xaf, - 0x3b, 0x4f, 0xbc, 0xf6, 0xe3, 0xab, 0xe6, 0xc3, 0x51, 0xab, 0xd9, 0xf6, 0xda, 0xcd, 0x4e, 0xf0, 0xc4, 0xeb, 0xe8, - 0x7f, 0xbd, 0x96, 0x77, 0xe4, 0xb5, 0x83, 0x27, 0xde, 0x91, 0xd7, 0x09, 0x9e, 0x5c, 0x3d, 0xd4, 0xc9, 0x0c, 0x11, - 0x3a, 0xec, 0x1d, 0xc3, 0x87, 0x34, 0x6f, 0x28, 0xfa, 0x1c, 0xe9, 0xcf, 0xd5, 0xa2, 0xcf, 0xdc, 0xd2, 0xf6, 0xd3, - 0xad, 0xc5, 0x9d, 0x27, 0x5b, 0x8b, 0x8f, 0x1e, 0x6f, 0x2d, 0x7e, 0xf8, 0xa8, 0x5e, 0x7c, 0x38, 0xd1, 0x55, 0xe5, - 0x29, 0xa7, 0x68, 0x16, 0xc9, 0x8c, 0xdf, 0xf8, 0x6d, 0xaf, 0xe5, 0xb5, 0xbc, 0x26, 0xfc, 0xf7, 0xa4, 0x83, 0xcb, - 0x5e, 0x97, 0xd0, 0xab, 0x5c, 0xe5, 0x93, 0xa7, 0x5e, 0xfb, 0xf1, 0xcb, 0xce, 0xe3, 0x11, 0xb4, 0x53, 0x0b, 0x6d, - 0x7b, 0xed, 0xab, 0xa3, 0xa7, 0xa3, 0x96, 0x07, 0x1d, 0xdb, 0xf0, 0x67, 0xfa, 0xa8, 0x33, 0xd2, 0x0f, 0x2d, 0xa8, - 0xff, 0xb6, 0xfd, 0x24, 0x6f, 0x35, 0xdb, 0xf0, 0xe7, 0x97, 0x52, 0x23, 0x06, 0x7d, 0xdc, 0x1d, 0xf7, 0x61, 0xcb, - 0x3b, 0x7a, 0x3a, 0xed, 0x04, 0x9f, 0x5f, 0x3d, 0x09, 0x9e, 0x4e, 0xdb, 0x4f, 0xbe, 0xd5, 0x4f, 0x49, 0xb3, 0x13, - 0x7c, 0x0e, 0x7f, 0xbf, 0x3d, 0x6a, 0x4d, 0x9b, 0xed, 0xe0, 0xe9, 0xd5, 0x51, 0x70, 0x94, 0x34, 0x1f, 0x07, 0x4f, - 0xe1, 0x6f, 0x35, 0xdc, 0x54, 0xcc, 0x18, 0xf2, 0x60, 0xbf, 0xd7, 0xcc, 0x2d, 0x77, 0x8e, 0xce, 0x43, 0xef, 0xd1, - 0xc3, 0x97, 0x4f, 0xaf, 0x9a, 0x0f, 0xa7, 0xed, 0xce, 0x55, 0x73, 0xe7, 0xcf, 0x6f, 0x01, 0xf1, 0x66, 0xe0, 0x88, - 0xc1, 0x75, 0x22, 0x8b, 0x38, 0xf5, 0x36, 0xdc, 0x07, 0x24, 0xdf, 0x65, 0x5e, 0x67, 0x9f, 0x36, 0xaf, 0x53, 0x76, - 0x1f, 0xfb, 0x3a, 0xfb, 0xc3, 0xed, 0xeb, 0x9c, 0xad, 0x39, 0x55, 0x6f, 0xe5, 0x86, 0x19, 0xbd, 0x6e, 0x7b, 0xbd, - 0x93, 0xfe, 0x80, 0xc3, 0x57, 0x97, 0x8a, 0xee, 0x2d, 0xbc, 0x70, 0xdb, 0xf5, 0x36, 0x08, 0x38, 0xc8, 0xb7, 0x52, - 0x9f, 0x64, 0xb1, 0x0b, 0x21, 0xc9, 0xa7, 0x11, 0xf2, 0xed, 0x7d, 0xf0, 0x91, 0xfc, 0xe1, 0xf8, 0x10, 0x2e, 0x3e, - 0x6a, 0x7e, 0x5e, 0x65, 0xcf, 0x2a, 0x7b, 0xf4, 0x4c, 0x3d, 0xfb, 0x70, 0xe3, 0xa4, 0x81, 0x0e, 0x19, 0x14, 0xe5, - 0x48, 0xc7, 0x15, 0x5e, 0xfe, 0x1a, 0x97, 0xb4, 0xbe, 0x5e, 0x46, 0x91, 0x31, 0xfe, 0xe7, 0xf0, 0x65, 0x05, 0xfb, - 0x70, 0xa5, 0x2f, 0x3c, 0x53, 0xd4, 0x09, 0x5a, 0x41, 0xab, 0x74, 0x1c, 0xc0, 0x95, 0x42, 0xba, 0x14, 0x32, 0x82, - 0x8f, 0x7b, 0x26, 0x62, 0xa2, 0x3e, 0x03, 0x0a, 0x2f, 0x5f, 0x57, 0x1f, 0x64, 0xd5, 0xef, 0xbd, 0x0f, 0x11, 0x32, - 0x2f, 0x22, 0x80, 0x2b, 0x6b, 0xdf, 0xc0, 0xb5, 0x3e, 0xeb, 0xb1, 0x9e, 0x81, 0x4d, 0xfd, 0x9a, 0xc5, 0x3c, 0xf2, - 0x91, 0x3f, 0xcf, 0xd8, 0x98, 0x65, 0x79, 0xb3, 0x76, 0xd7, 0x4d, 0x5d, 0x73, 0xc3, 0xc8, 0x7e, 0x46, 0x32, 0x83, - 0x97, 0x09, 0xd3, 0x81, 0xf1, 0x6a, 0x21, 0xa3, 0xe6, 0xa3, 0x82, 0xd8, 0x92, 0x0c, 0x38, 0x7a, 0xa5, 0x1a, 0x20, - 0xad, 0x1b, 0xb4, 0x83, 0xce, 0x23, 0xac, 0x79, 0x09, 0xbc, 0xa4, 0xf5, 0x7b, 0xbf, 0x79, 0xd4, 0xfa, 0x13, 0x76, - 0xba, 0x95, 0x03, 0x0d, 0x8d, 0x53, 0x27, 0xab, 0x3e, 0xbf, 0x5b, 0xbf, 0x88, 0x88, 0x34, 0x45, 0x7c, 0xa6, 0xd7, - 0x0e, 0xaf, 0x7b, 0x35, 0xf1, 0x43, 0x7d, 0x9d, 0x7e, 0xcc, 0x27, 0xbe, 0xfb, 0x71, 0x55, 0xfd, 0x12, 0x58, 0xf5, - 0x4d, 0x66, 0x5c, 0x54, 0x4d, 0x32, 0xbc, 0x54, 0xbe, 0x78, 0x9e, 0x7a, 0xd9, 0x6a, 0xe5, 0x67, 0xe0, 0x88, 0xa5, - 0x0e, 0x4e, 0xe1, 0x19, 0xd7, 0x90, 0x9c, 0x91, 0x12, 0x20, 0x85, 0x60, 0x9a, 0xe9, 0xff, 0xab, 0x62, 0xfb, 0xc3, - 0xb8, 0x57, 0x82, 0x24, 0x4a, 0x27, 0x40, 0x85, 0x51, 0x3a, 0xd9, 0x70, 0xde, 0xe8, 0x70, 0xc2, 0x5a, 0x69, 0x35, - 0x54, 0xe5, 0xa4, 0xc9, 0x9f, 0xdd, 0xbe, 0x37, 0x6f, 0x8b, 0x42, 0xe0, 0x03, 0x55, 0xbe, 0xef, 0xea, 0xcd, 0xb6, - 0x0d, 0xfa, 0x40, 0x7f, 0xae, 0x5c, 0x65, 0xc3, 0x81, 0xf4, 0x83, 0x2b, 0x86, 0x9e, 0xb1, 0x79, 0x28, 0xd2, 0xb2, - 0x2f, 0x66, 0x57, 0x7c, 0x64, 0x44, 0x18, 0xf1, 0xcc, 0x35, 0xeb, 0xa6, 0xda, 0x1a, 0xda, 0x26, 0xda, 0xea, 0x1f, - 0x45, 0x2a, 0xdf, 0x99, 0xa6, 0x02, 0xf5, 0x1e, 0x94, 0xdf, 0x8a, 0xdc, 0xb5, 0x09, 0xf0, 0x0d, 0xf5, 0x41, 0xc6, - 0x92, 0x7f, 0xa6, 0x0f, 0xe0, 0x2b, 0xea, 0x0f, 0x86, 0xf0, 0x01, 0xef, 0x40, 0x89, 0x82, 0x07, 0xd5, 0xc7, 0xd4, - 0x81, 0x0f, 0x36, 0x6e, 0x66, 0x09, 0xb9, 0xaf, 0xf8, 0x36, 0xa2, 0xba, 0xf3, 0xa8, 0x12, 0xd5, 0x9d, 0x47, 0xae, - 0xf4, 0x6c, 0x7b, 0xed, 0x4e, 0xf0, 0xc8, 0x11, 0x00, 0x57, 0x4d, 0xf8, 0xbf, 0x26, 0x02, 0x1e, 0x06, 0x8f, 0x4a, - 0x19, 0xf0, 0xaa, 0xdd, 0x09, 0x8e, 0xb4, 0xb8, 0xe9, 0x04, 0x8f, 0x7e, 0x50, 0x0c, 0x5a, 0x33, 0xe7, 0xfa, 0x81, - 0xd8, 0x12, 0xaa, 0xd1, 0x19, 0x7d, 0x88, 0xf8, 0xe5, 0x17, 0xe9, 0xcc, 0xf9, 0x34, 0x2e, 0xa1, 0xe7, 0x51, 0x06, - 0x9f, 0x05, 0xa9, 0x9f, 0xdd, 0x5a, 0x1d, 0xa9, 0xf1, 0x8b, 0x2d, 0x53, 0xc0, 0x09, 0x47, 0xc4, 0xbd, 0xa7, 0x0c, - 0x97, 0x7c, 0xd5, 0x4b, 0x94, 0xed, 0xbb, 0xe4, 0x76, 0x93, 0xb6, 0x6e, 0x68, 0xdf, 0x57, 0xa7, 0x98, 0x05, 0x57, - 0x2f, 0xac, 0x57, 0x93, 0x7c, 0x19, 0x17, 0xeb, 0xf3, 0x43, 0x62, 0x61, 0x26, 0x9c, 0xab, 0xda, 0xac, 0x4a, 0x87, - 0x8f, 0x39, 0x5c, 0xae, 0x2f, 0x0a, 0x0b, 0x7a, 0xcd, 0x19, 0x58, 0x61, 0x49, 0xf1, 0x0b, 0x96, 0xf7, 0x11, 0x14, - 0xa1, 0x10, 0x29, 0x47, 0x12, 0x2a, 0x3f, 0x8d, 0x52, 0x12, 0x76, 0x55, 0x40, 0xd4, 0x95, 0x16, 0x38, 0xb5, 0x80, - 0x1f, 0x84, 0x0f, 0x0e, 0x76, 0x9e, 0x17, 0xa5, 0x8d, 0xc1, 0x5a, 0xab, 0x4f, 0x2a, 0xb8, 0xac, 0x08, 0xb9, 0x88, - 0x2e, 0xc7, 0x55, 0x28, 0xc4, 0x06, 0x4f, 0x97, 0x2c, 0x92, 0x41, 0x94, 0xea, 0x14, 0x05, 0x87, 0x61, 0x91, 0x36, - 0x3b, 0xc2, 0x85, 0x90, 0x91, 0xf3, 0xcd, 0x54, 0x73, 0xce, 0x85, 0x8c, 0xec, 0xc5, 0xc3, 0x54, 0xd6, 0x32, 0xf3, - 0xa7, 0x9d, 0xde, 0xdb, 0xf7, 0x27, 0x9e, 0x3e, 0x9e, 0xc7, 0x87, 0xd3, 0x4e, 0xef, 0x58, 0x59, 0xe6, 0xfa, 0xda, - 0x12, 0xd5, 0xd7, 0x96, 0x3c, 0x73, 0x85, 0x0d, 0xe2, 0x35, 0xc5, 0xa1, 0x5e, 0x36, 0xf2, 0x58, 0x3a, 0xd2, 0x3e, - 0xc5, 0xd9, 0x22, 0x91, 0x1c, 0x5e, 0x08, 0x7c, 0x08, 0x5d, 0x9b, 0xb0, 0x61, 0x65, 0x96, 0xab, 0xd5, 0x70, 0x64, - 0x6a, 0x3d, 0x90, 0x63, 0x9e, 0x30, 0x9b, 0xd7, 0x6a, 0x86, 0x2a, 0xf3, 0xb0, 0x37, 0x5b, 0xe7, 0x8b, 0xcb, 0x19, - 0x97, 0xc8, 0x66, 0x8b, 0x7f, 0x30, 0x1d, 0x8e, 0xd5, 0x54, 0xbd, 0x8b, 0xc2, 0xb8, 0x48, 0xed, 0xc7, 0x4f, 0xd6, - 0x3e, 0x37, 0xaf, 0x57, 0x6f, 0x24, 0x04, 0xdc, 0x3f, 0x9a, 0x1e, 0xf5, 0x4a, 0xa7, 0xa4, 0x5b, 0x57, 0x1c, 0x1f, - 0x4e, 0x8f, 0x7a, 0x17, 0xe1, 0xdc, 0x8c, 0xf7, 0x4a, 0x6c, 0x7c, 0xba, 0xbe, 0xe4, 0x98, 0x7d, 0x95, 0x68, 0xaf, - 0x6f, 0x74, 0x1a, 0x80, 0x47, 0x22, 0x41, 0xbd, 0x63, 0xa3, 0x0c, 0x78, 0x2a, 0xe8, 0x8a, 0x1e, 0xb5, 0x6c, 0xee, - 0x7e, 0x22, 0x94, 0xb6, 0xa4, 0xbb, 0x38, 0x93, 0xd4, 0xfc, 0xba, 0xd3, 0x76, 0xef, 0x38, 0x32, 0x6a, 0x26, 0x30, - 0x8f, 0x3c, 0x3c, 0x84, 0xce, 0xa0, 0xcb, 0x05, 0x5c, 0x1c, 0x5e, 0xb3, 0xcb, 0x66, 0x34, 0xe7, 0x95, 0x13, 0x15, - 0x94, 0x8e, 0x72, 0x4a, 0x51, 0xcd, 0x04, 0x3f, 0xa3, 0xb5, 0x45, 0x2a, 0x16, 0x5e, 0x18, 0x0f, 0xad, 0xd2, 0xd5, - 0x59, 0x24, 0x91, 0xa7, 0x39, 0xbc, 0xf5, 0xe4, 0x1a, 0xd9, 0x5b, 0xa0, 0xde, 0xbf, 0xfd, 0x8f, 0xff, 0x65, 0x9c, - 0xb3, 0xc7, 0x87, 0xd3, 0xb6, 0x1d, 0x6b, 0x0d, 0xd1, 0xc5, 0x31, 0x5c, 0x77, 0xab, 0xa2, 0x89, 0xec, 0xa6, 0x39, - 0xc9, 0x78, 0xdc, 0x9c, 0x46, 0xc9, 0x18, 0xf5, 0x76, 0x23, 0xc8, 0xbd, 0xe7, 0x62, 0xa0, 0xae, 0x17, 0x01, 0x09, - 0xfe, 0xa6, 0x9b, 0x1a, 0x36, 0xe1, 0x5f, 0x9d, 0x56, 0xf7, 0xde, 0x46, 0x75, 0xa0, 0x6a, 0x77, 0x37, 0x32, 0xf3, - 0x8d, 0x24, 0xc3, 0xd4, 0xb2, 0xda, 0x95, 0x8d, 0x02, 0x79, 0x65, 0x34, 0xe4, 0xff, 0xfe, 0xcf, 0xff, 0xf2, 0xdf, - 0xec, 0x23, 0x04, 0x39, 0xfe, 0xed, 0xbf, 0xff, 0xe7, 0xff, 0xf3, 0xbf, 0xff, 0x2b, 0xa4, 0xf9, 0x9b, 0x40, 0x88, - 0xe2, 0x13, 0x5e, 0x15, 0x05, 0xd1, 0x0c, 0xc3, 0x83, 0x4c, 0xb8, 0x19, 0xcf, 0x25, 0x1f, 0xd5, 0x2f, 0x71, 0x9c, - 0xa9, 0x09, 0xd5, 0x61, 0x33, 0xd0, 0xa9, 0x43, 0x5b, 0x54, 0x34, 0x52, 0x43, 0xb9, 0xa2, 0xc5, 0xe2, 0xf8, 0x10, - 0xf0, 0x7d, 0xbf, 0x7b, 0x6f, 0x41, 0xb9, 0x1d, 0x4b, 0xeb, 0xfa, 0x83, 0x92, 0xa2, 0x2a, 0xf7, 0xc0, 0x29, 0xbf, - 0x84, 0xc7, 0xb0, 0xe3, 0x14, 0xab, 0xdd, 0xab, 0xf5, 0xe9, 0xfe, 0xb4, 0xc8, 0x25, 0x1f, 0x03, 0xca, 0xb5, 0x83, - 0x51, 0xc5, 0x3f, 0x9b, 0xa0, 0xfe, 0x25, 0xb7, 0x85, 0x1a, 0x45, 0xdb, 0x8c, 0x0f, 0x9f, 0xfe, 0xa9, 0xf8, 0xcb, - 0x0c, 0x94, 0x2c, 0xcf, 0x9f, 0x45, 0x37, 0xc6, 0x92, 0x7c, 0xdc, 0x6a, 0xcd, 0x6f, 0xf0, 0xb2, 0x9a, 0x81, 0xec, - 0x9a, 0x4c, 0x39, 0x25, 0xdd, 0x01, 0x55, 0xe0, 0xb4, 0xf4, 0x7f, 0xb6, 0x3c, 0x70, 0xa2, 0x7a, 0xad, 0xa2, 0xf8, - 0xf3, 0x52, 0xb9, 0xe0, 0xf8, 0x2f, 0x10, 0xe0, 0x34, 0xde, 0xca, 0x4b, 0xe1, 0x2e, 0x6e, 0xe9, 0xf4, 0xea, 0xe8, - 0x5e, 0xd3, 0xf6, 0xe6, 0x75, 0x2e, 0x37, 0x40, 0xeb, 0x86, 0x56, 0x1f, 0x42, 0xb0, 0x74, 0xda, 0x26, 0xd3, 0xce, - 0xb2, 0x1c, 0x5e, 0x4a, 0x31, 0x73, 0x23, 0xb2, 0x2c, 0x62, 0x23, 0x36, 0xb6, 0x5e, 0x5e, 0x53, 0xaf, 0xa3, 0xad, - 0xc5, 0xf4, 0x68, 0xcb, 0x5c, 0x06, 0x24, 0x15, 0x89, 0xf5, 0x5a, 0xc5, 0x67, 0x70, 0x02, 0x97, 0xe3, 0x44, 0x44, - 0x32, 0x54, 0x04, 0xdb, 0x75, 0xe3, 0xba, 0x11, 0xb0, 0x19, 0xb1, 0x74, 0xe0, 0xe9, 0xea, 0xa6, 0xe0, 0x6f, 0xad, - 0x5f, 0xba, 0x2b, 0x02, 0xd5, 0xdd, 0x1d, 0x4a, 0xbb, 0x6b, 0xbe, 0x35, 0xe1, 0xd2, 0x97, 0x35, 0x3f, 0x87, 0x91, - 0x31, 0x1d, 0xbc, 0xbd, 0x5e, 0x8b, 0x6a, 0x5d, 0xfb, 0x95, 0xf4, 0x91, 0x02, 0x13, 0xad, 0xb7, 0x52, 0x85, 0xd0, - 0xea, 0x25, 0xfd, 0xb6, 0xb4, 0x82, 0xa2, 0xf9, 0x5c, 0x35, 0xc4, 0xdd, 0xe3, 0x43, 0xad, 0xbc, 0x02, 0xf7, 0x50, - 0xb9, 0x00, 0x3a, 0xf4, 0x6e, 0x1a, 0x99, 0xa3, 0xa0, 0x7f, 0x99, 0xa0, 0x3c, 0x7c, 0x3c, 0xab, 0xf7, 0xff, 0x00, - 0x08, 0x50, 0x84, 0x3d, 0xcd, 0x86, 0x00, 0x00}; + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcd, 0x7d, 0xdb, 0x72, 0xdb, 0xc6, 0xb6, 0xe0, 0xf3, + 0xe4, 0x2b, 0x20, 0x44, 0x5b, 0x41, 0x6f, 0x36, 0x21, 0x92, 0xba, 0x58, 0x06, 0xd5, 0xe4, 0x96, 0x65, 0x67, 0x3b, + 0x3b, 0xbe, 0xc5, 0xb2, 0x93, 0x9d, 0x30, 0xdc, 0x12, 0x44, 0x34, 0xc9, 0xb6, 0x41, 0x34, 0x03, 0x34, 0x29, 0x29, + 0x24, 0x4e, 0xcd, 0x07, 0x4c, 0xd5, 0x54, 0xcd, 0xd3, 0xbc, 0x4c, 0xcd, 0x79, 0x98, 0x8f, 0x98, 0xe7, 0xf3, 0x29, + 0xe7, 0x07, 0x66, 0x3e, 0x61, 0x6a, 0xf5, 0x05, 0x68, 0xf0, 0x22, 0xcb, 0x49, 0xce, 0x39, 0x53, 0xa9, 0x58, 0x44, + 0x5f, 0x57, 0xaf, 0x5e, 0xbd, 0xee, 0x0d, 0x9c, 0xee, 0x44, 0x7c, 0x20, 0xee, 0xa6, 0xd4, 0x19, 0x8b, 0x49, 0xdc, + 0x39, 0xd5, 0xff, 0xd2, 0x30, 0xea, 0x9c, 0xc6, 0x2c, 0xf9, 0xe8, 0xa4, 0x34, 0x26, 0x6c, 0xc0, 0x13, 0x67, 0x9c, + 0xd2, 0x21, 0x89, 0x42, 0x11, 0x06, 0x6c, 0x12, 0x8e, 0xa8, 0xb3, 0xdf, 0x39, 0x9d, 0x50, 0x11, 0x3a, 0x83, 0x71, + 0x98, 0x66, 0x54, 0x90, 0xf7, 0xef, 0xbe, 0xae, 0x9f, 0x74, 0x4e, 0xb3, 0x41, 0xca, 0xa6, 0xc2, 0x81, 0x21, 0xc9, + 0x84, 0x47, 0xb3, 0x98, 0x76, 0xf6, 0xf7, 0x6f, 0x6e, 0x6e, 0xfc, 0x0f, 0xd9, 0x17, 0x03, 0x9e, 0x64, 0xc2, 0x79, + 0x41, 0x6e, 0x58, 0x12, 0xf1, 0x1b, 0x4c, 0x05, 0x79, 0xe1, 0x5f, 0x8c, 0xc3, 0x88, 0xdf, 0xbc, 0xe5, 0x5c, 0xec, + 0xed, 0x79, 0xea, 0xf1, 0xee, 0xfc, 0xe2, 0x82, 0x10, 0x32, 0xe7, 0x2c, 0x72, 0x1a, 0xcb, 0x65, 0x59, 0xe8, 0x27, + 0xa1, 0x60, 0x73, 0xaa, 0xba, 0xa0, 0xbd, 0x3d, 0x37, 0x8c, 0xf8, 0x54, 0xd0, 0xe8, 0x42, 0xdc, 0xc5, 0xf4, 0x62, + 0x4c, 0xa9, 0xc8, 0x5c, 0x96, 0x38, 0x4f, 0xf9, 0x60, 0x36, 0xa1, 0x89, 0xf0, 0xa7, 0x29, 0x17, 0x1c, 0x20, 0xd9, + 0xdb, 0x73, 0x53, 0x3a, 0x8d, 0xc3, 0x01, 0x85, 0xfa, 0xf3, 0x8b, 0x8b, 0xb2, 0x47, 0xd9, 0x08, 0x33, 0x41, 0x2e, + 0xee, 0x26, 0xd7, 0x3c, 0xf6, 0x10, 0x8e, 0x05, 0x49, 0xe8, 0x8d, 0xf3, 0x03, 0x0d, 0x3f, 0xbe, 0x0c, 0xa7, 0xed, + 0x41, 0x1c, 0x66, 0x99, 0x73, 0x2d, 0x16, 0x72, 0x09, 0xe9, 0x6c, 0x20, 0x78, 0xea, 0x09, 0x4c, 0x31, 0x43, 0x0b, + 0x36, 0xf4, 0xc4, 0x98, 0x65, 0xfe, 0xe5, 0xee, 0x20, 0xcb, 0xde, 0xd2, 0x6c, 0x16, 0x8b, 0x5d, 0xb2, 0xd3, 0xc0, + 0x6c, 0x87, 0x10, 0x26, 0x90, 0x18, 0xa7, 0xfc, 0xc6, 0x79, 0x96, 0xa6, 0x3c, 0xf5, 0xdc, 0xf3, 0x8b, 0x0b, 0xd5, + 0xc2, 0x61, 0x99, 0x93, 0x70, 0xe1, 0x14, 0xe3, 0x85, 0xd7, 0x31, 0xf5, 0x9d, 0xf7, 0x19, 0x75, 0xae, 0x66, 0x49, + 0x16, 0x0e, 0xe9, 0xf9, 0xc5, 0xc5, 0x95, 0xc3, 0x53, 0xe7, 0x6a, 0x90, 0x65, 0x57, 0x0e, 0x4b, 0x32, 0x41, 0xc3, + 0xc8, 0x77, 0x51, 0x5b, 0x4e, 0x36, 0xc8, 0xb2, 0x77, 0xf4, 0x56, 0x10, 0x81, 0xe5, 0xa3, 0x20, 0x34, 0x1f, 0x51, + 0xe1, 0x64, 0xc5, 0xba, 0x3c, 0xb4, 0x88, 0xa9, 0x70, 0x04, 0x91, 0xf5, 0xbc, 0xad, 0x70, 0x4f, 0xd5, 0xa3, 0x68, + 0xb3, 0xa1, 0x47, 0xc5, 0xde, 0x9e, 0x28, 0xf0, 0x8c, 0xd4, 0xd2, 0x1c, 0x46, 0xe8, 0x8e, 0x29, 0xdb, 0xdb, 0xa3, + 0x7e, 0x4c, 0x93, 0x91, 0x18, 0x13, 0x42, 0x9a, 0x6d, 0xb6, 0xb7, 0xe7, 0x09, 0x12, 0x0b, 0x7f, 0x44, 0x85, 0x47, + 0x11, 0xc2, 0x65, 0xef, 0xbd, 0x3d, 0x4f, 0x21, 0x81, 0x13, 0x85, 0xb8, 0x0a, 0x8e, 0x91, 0xaf, 0xb1, 0x7f, 0x71, + 0x97, 0x0c, 0x3c, 0x1b, 0x7e, 0x84, 0xd9, 0xde, 0x5e, 0x2c, 0xfc, 0x0c, 0x46, 0xc4, 0x02, 0xa1, 0x3c, 0xa5, 0x62, + 0x96, 0x26, 0x8e, 0xc8, 0x05, 0xbf, 0x10, 0x29, 0x4b, 0x46, 0x1e, 0x5a, 0x98, 0x32, 0xab, 0x63, 0x9e, 0x2b, 0x70, + 0xdf, 0x08, 0x92, 0x92, 0x0e, 0xcc, 0x78, 0x2d, 0x3c, 0xd8, 0x45, 0x3e, 0x74, 0x52, 0x42, 0xdc, 0x4c, 0xf6, 0x75, + 0xbb, 0x69, 0x90, 0xd6, 0x5c, 0x17, 0x2b, 0x28, 0x31, 0x13, 0x08, 0x7f, 0x24, 0x5e, 0x8a, 0x7d, 0xdf, 0x17, 0x88, + 0x74, 0x16, 0x06, 0x2b, 0xa9, 0xb5, 0xce, 0x6e, 0xda, 0x6b, 0xf4, 0x03, 0xe1, 0xa7, 0x34, 0x9a, 0x0d, 0xa8, 0xe7, + 0x31, 0x9c, 0xe1, 0x04, 0x91, 0x0e, 0xab, 0x79, 0x9c, 0x74, 0x60, 0xbb, 0x79, 0x75, 0xaf, 0x09, 0xd9, 0x69, 0x20, + 0x0d, 0x23, 0x37, 0x00, 0x02, 0x86, 0x35, 0x3c, 0x9c, 0x10, 0x37, 0x99, 0x4d, 0xae, 0x69, 0xea, 0x16, 0xcd, 0xda, + 0x15, 0xb2, 0x98, 0x65, 0xd4, 0x19, 0x64, 0x99, 0x33, 0x9c, 0x25, 0x03, 0xc1, 0x78, 0xe2, 0xb8, 0x35, 0x5e, 0x73, + 0x15, 0x39, 0x14, 0xd4, 0xe0, 0xa2, 0x1c, 0x79, 0x19, 0xaa, 0xa5, 0xbd, 0xa4, 0xd6, 0xec, 0x63, 0x80, 0x12, 0xb5, + 0xf5, 0x78, 0x1a, 0x01, 0x14, 0xa7, 0xb0, 0xc6, 0x1c, 0xbf, 0x17, 0xb0, 0x4a, 0xb9, 0x44, 0x2a, 0xba, 0xa9, 0xbf, + 0x7e, 0x50, 0x88, 0xf0, 0x27, 0xe1, 0xd4, 0xa3, 0xa4, 0x43, 0x25, 0x71, 0x85, 0xc9, 0x00, 0x60, 0xad, 0xec, 0x5b, + 0x97, 0x06, 0xd4, 0x2f, 0x49, 0x0a, 0x05, 0xc2, 0x1f, 0xf2, 0xf4, 0x59, 0x38, 0x18, 0x43, 0xbf, 0x82, 0x60, 0x22, + 0x73, 0xde, 0x06, 0x29, 0x0d, 0x05, 0x7d, 0x16, 0x53, 0x78, 0xf2, 0x5c, 0xd9, 0xd3, 0x45, 0x38, 0x23, 0x2f, 0xfc, + 0x98, 0x89, 0x57, 0x3c, 0x19, 0xd0, 0x76, 0x66, 0x51, 0x17, 0x83, 0x7d, 0x3f, 0x13, 0x22, 0x65, 0xd7, 0x33, 0x41, + 0x3d, 0x37, 0x81, 0x16, 0x2e, 0xce, 0x10, 0x66, 0xbe, 0xa0, 0xb7, 0xe2, 0x9c, 0x27, 0x82, 0x26, 0x82, 0x50, 0x83, + 0x54, 0x9c, 0xfa, 0xe1, 0x74, 0x4a, 0x93, 0xe8, 0x7c, 0xcc, 0xe2, 0xc8, 0x63, 0x28, 0x47, 0x39, 0x0e, 0x05, 0x81, + 0x35, 0x92, 0x4e, 0x1a, 0xc0, 0x3f, 0xdb, 0x57, 0xe3, 0x09, 0xd2, 0x91, 0x87, 0x82, 0x12, 0xd7, 0x6d, 0x0f, 0x79, + 0xea, 0xe9, 0x15, 0x38, 0x7c, 0xe8, 0x08, 0x98, 0xe3, 0xed, 0x2c, 0xa6, 0x19, 0xa2, 0x35, 0xc2, 0x8a, 0x6d, 0xd4, + 0x08, 0x7e, 0x03, 0x14, 0x9f, 0x23, 0x2f, 0x45, 0x41, 0xda, 0x9e, 0x87, 0xa9, 0xf3, 0xb5, 0x3e, 0x51, 0x4f, 0x0d, + 0x37, 0x1b, 0x0b, 0xf2, 0xd4, 0x17, 0xe9, 0x2c, 0x13, 0x34, 0x7a, 0x77, 0x37, 0xa5, 0x19, 0x7e, 0x27, 0xc8, 0x58, + 0x74, 0xc7, 0xc2, 0xa7, 0x93, 0xa9, 0xb8, 0xbb, 0x90, 0x8c, 0x31, 0x70, 0x5d, 0x3c, 0x80, 0x96, 0x29, 0x0d, 0x07, + 0xc0, 0xcc, 0x34, 0xb6, 0xde, 0xf0, 0xf8, 0x6e, 0xc8, 0xe2, 0xf8, 0x62, 0x36, 0x9d, 0xf2, 0x54, 0xe0, 0xbf, 0x92, + 0x85, 0xe0, 0x25, 0x6a, 0x60, 0x2f, 0x17, 0xd9, 0x0d, 0x13, 0x83, 0xb1, 0x27, 0xd0, 0x62, 0x10, 0x66, 0xd4, 0x79, + 0xc2, 0x79, 0x4c, 0xc3, 0x24, 0x48, 0x49, 0xda, 0x7d, 0x27, 0x82, 0x64, 0x16, 0xc7, 0xed, 0xeb, 0x94, 0x86, 0x1f, + 0xdb, 0xb2, 0xfa, 0xf5, 0xf5, 0x07, 0x3a, 0x10, 0x81, 0xfc, 0x7d, 0x96, 0xa6, 0xe1, 0x1d, 0x34, 0x24, 0x04, 0x9a, + 0x75, 0xd3, 0xe0, 0x6f, 0x17, 0xaf, 0x5f, 0xf9, 0xea, 0x90, 0xb0, 0xe1, 0x9d, 0x97, 0x16, 0x07, 0x2f, 0xcd, 0xf1, + 0x30, 0xe5, 0x93, 0x95, 0xa9, 0x15, 0xd6, 0xd2, 0xf6, 0x16, 0x10, 0x28, 0x49, 0x77, 0xd4, 0xd0, 0x36, 0x04, 0xaf, + 0x24, 0xcd, 0x43, 0x25, 0xd1, 0xf3, 0xc2, 0x3f, 0x81, 0x2a, 0xf6, 0x52, 0x74, 0x3f, 0xb4, 0x22, 0xbd, 0x5b, 0x50, + 0x22, 0xe1, 0x9c, 0x82, 0x84, 0x01, 0x18, 0x07, 0xa1, 0x18, 0x8c, 0x17, 0x54, 0x0e, 0x96, 0x1b, 0x88, 0x69, 0x9e, + 0xe3, 0x9b, 0x82, 0xde, 0xc5, 0x0e, 0x21, 0xa9, 0x64, 0x54, 0x44, 0x2c, 0x97, 0x29, 0x21, 0x29, 0xc2, 0x3f, 0x90, + 0x45, 0x68, 0xd6, 0x13, 0xec, 0x34, 0x30, 0x9c, 0xcb, 0x40, 0x71, 0x17, 0x3c, 0xe0, 0xc9, 0x9c, 0xa6, 0x82, 0xa6, + 0xc1, 0x5f, 0x71, 0x4a, 0x87, 0x31, 0x40, 0xb1, 0xd3, 0xc4, 0xe3, 0x30, 0x3b, 0x1f, 0x87, 0xc9, 0x88, 0x46, 0xc1, + 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xeb, 0xd0, 0x5b, + 0x41, 0x93, 0x28, 0x73, 0x9e, 0xbf, 0x7b, 0xf9, 0x42, 0xef, 0x63, 0x45, 0x40, 0xa0, 0x45, 0x36, 0x9b, 0xd2, 0xd4, + 0x43, 0x58, 0x0b, 0x88, 0x67, 0x4c, 0x32, 0xc7, 0x97, 0xe1, 0x54, 0x95, 0xb0, 0xec, 0xfd, 0x34, 0x0a, 0x05, 0x7d, + 0x43, 0x93, 0x88, 0x25, 0x23, 0xb2, 0xd3, 0x54, 0xe5, 0xe3, 0x50, 0x57, 0x44, 0x45, 0xd1, 0xe5, 0xee, 0xb3, 0x58, + 0xae, 0xbb, 0x78, 0x9c, 0x79, 0x28, 0xcf, 0x44, 0x28, 0xd8, 0xc0, 0x09, 0xa3, 0xe8, 0x9b, 0x84, 0x09, 0x26, 0x01, + 0x4c, 0x61, 0x7b, 0x80, 0x44, 0xa9, 0x12, 0x15, 0x06, 0x70, 0x0f, 0x61, 0xcf, 0xd3, 0x02, 0x60, 0x8c, 0xf4, 0x7e, + 0xed, 0xed, 0x95, 0xec, 0xbe, 0x4b, 0x03, 0x55, 0x49, 0x7a, 0x7d, 0xe4, 0x4f, 0x67, 0x19, 0x6c, 0xb4, 0x99, 0x02, + 0xa4, 0x0b, 0xbf, 0xce, 0x68, 0x3a, 0xa7, 0x51, 0x41, 0x1c, 0x99, 0x87, 0x16, 0x2b, 0x73, 0xe8, 0x63, 0x21, 0x48, + 0xaf, 0xdf, 0xb6, 0xf9, 0x36, 0xd5, 0x74, 0x9e, 0xf2, 0x29, 0x4d, 0x05, 0xa3, 0x59, 0xc1, 0x4a, 0x3c, 0x90, 0xa2, + 0x05, 0x3b, 0xc9, 0x88, 0x59, 0xdf, 0xd4, 0x63, 0x98, 0xa2, 0x0a, 0xc3, 0x30, 0x82, 0xf6, 0xd9, 0x5c, 0x4a, 0x8c, + 0x0c, 0x33, 0x84, 0x85, 0x82, 0x34, 0x43, 0x28, 0x47, 0x58, 0x18, 0x70, 0x15, 0x2b, 0xd2, 0xb3, 0xdd, 0x81, 0xa8, + 0x26, 0x3f, 0x48, 0x51, 0x0d, 0x0c, 0x2d, 0x14, 0x74, 0x6f, 0xcf, 0xa3, 0x7e, 0x41, 0x14, 0x64, 0xa7, 0xa9, 0xf7, + 0xc8, 0x42, 0xd6, 0x16, 0xb0, 0x61, 0x62, 0x81, 0x29, 0xc2, 0x3b, 0xd4, 0x4f, 0xf8, 0xd9, 0x60, 0x40, 0xb3, 0x8c, + 0xa7, 0x7b, 0x7b, 0x3b, 0xb2, 0x7d, 0xa1, 0x4d, 0xc0, 0x1e, 0xbe, 0xbe, 0x49, 0x4a, 0x08, 0x50, 0x29, 0x61, 0xb5, + 0x5c, 0x10, 0x20, 0xa7, 0xa4, 0xc2, 0xe1, 0x76, 0x8d, 0xe2, 0x11, 0xb8, 0x97, 0x97, 0x6e, 0x4d, 0x60, 0x8d, 0x86, + 0x11, 0x35, 0x53, 0xdf, 0x3d, 0xa5, 0x4a, 0xb5, 0x92, 0x8a, 0xc7, 0x1a, 0x66, 0xd4, 0xf9, 0xf1, 0x23, 0x3a, 0x64, + 0x89, 0xb5, 0xec, 0x0a, 0x48, 0x58, 0xe0, 0x0c, 0xe5, 0xd6, 0x86, 0x6e, 0x1c, 0x5a, 0xea, 0x34, 0x6a, 0xe7, 0x16, + 0x23, 0xa9, 0x47, 0x58, 0xdb, 0xd8, 0xa3, 0xfd, 0x1c, 0x4b, 0xd4, 0x9b, 0xd5, 0x24, 0x12, 0xd0, 0x9e, 0xe8, 0xb7, + 0x75, 0x3d, 0xc9, 0x14, 0xe6, 0x52, 0xfa, 0xcb, 0x8c, 0x66, 0x42, 0xd1, 0xb1, 0x27, 0x70, 0x82, 0x19, 0xca, 0xe1, + 0xb8, 0x0d, 0xd9, 0x68, 0x96, 0x82, 0xba, 0x03, 0x47, 0x91, 0x26, 0xb3, 0x09, 0x35, 0x4f, 0x9b, 0x60, 0x7b, 0x3d, + 0x05, 0x81, 0x98, 0x01, 0x4d, 0xdf, 0x4f, 0x4e, 0x00, 0xab, 0x40, 0xcb, 0xe5, 0x0f, 0x66, 0x90, 0x72, 0x2b, 0x0b, + 0x15, 0x6d, 0x65, 0x4f, 0xfe, 0x8e, 0xb4, 0x3c, 0xde, 0x69, 0x2a, 0xe8, 0xff, 0xde, 0x27, 0x3b, 0x8d, 0x82, 0x82, + 0x35, 0x4e, 0x15, 0x30, 0x0a, 0x85, 0xaf, 0xd5, 0x40, 0x48, 0x4a, 0xf7, 0x0a, 0xb1, 0xf8, 0xe3, 0x35, 0x3a, 0x1d, + 0x93, 0x1e, 0xe8, 0x19, 0xfe, 0xb8, 0xbf, 0x8d, 0x98, 0x0c, 0x37, 0xf0, 0xc4, 0x7a, 0x5d, 0xc9, 0x34, 0xe6, 0x55, + 0xa6, 0xb1, 0xb2, 0x08, 0x77, 0x5a, 0x74, 0x71, 0x0b, 0x1a, 0xd3, 0xc7, 0xbc, 0xac, 0xc2, 0x4c, 0x02, 0x53, 0x2e, + 0xc9, 0x1a, 0xe2, 0x55, 0x38, 0xa1, 0x99, 0x47, 0x11, 0xde, 0xd6, 0x40, 0x11, 0x27, 0x34, 0xe9, 0x5b, 0x62, 0x33, + 0x03, 0xb1, 0xc9, 0x90, 0xd2, 0xca, 0xaa, 0xc7, 0x2d, 0xc3, 0xb4, 0x97, 0xf5, 0x4b, 0x65, 0xce, 0x5a, 0xbc, 0x94, + 0xc7, 0x9a, 0xba, 0x0d, 0xfe, 0x54, 0x99, 0x42, 0x9a, 0x54, 0x1a, 0x32, 0x84, 0x77, 0x1a, 0xab, 0xfb, 0x68, 0x5a, + 0x95, 0x6b, 0xec, 0xf5, 0x61, 0x1f, 0xa4, 0xb8, 0xf0, 0x59, 0x26, 0xff, 0x56, 0xce, 0x19, 0xa0, 0xed, 0x02, 0xc8, + 0xc2, 0x1f, 0xc6, 0xa1, 0xf0, 0x9a, 0xfb, 0x0d, 0xd0, 0x44, 0xe7, 0x14, 0xa4, 0x09, 0x42, 0xeb, 0x4b, 0xa1, 0xfe, + 0x2c, 0xc9, 0xc6, 0x6c, 0x28, 0xbc, 0x50, 0x48, 0x86, 0x42, 0xe3, 0x8c, 0x3a, 0xa2, 0xa2, 0x0f, 0x4b, 0x66, 0x13, + 0x02, 0xa9, 0x15, 0xca, 0x17, 0x35, 0x90, 0x4a, 0xa6, 0x05, 0xbc, 0xa1, 0xd4, 0xa5, 0x4b, 0x1e, 0x63, 0x5a, 0x33, + 0xd0, 0x17, 0x9b, 0x5d, 0x35, 0x62, 0xa0, 0x59, 0x01, 0xb3, 0x54, 0x56, 0x16, 0xd8, 0xfc, 0x41, 0x17, 0x0a, 0x5f, + 0xf0, 0x17, 0xfc, 0x86, 0xa6, 0xe7, 0x21, 0x00, 0x1f, 0xa8, 0xee, 0xb9, 0x12, 0x03, 0x92, 0xdb, 0x8b, 0xb6, 0xa1, + 0x97, 0x4b, 0xb9, 0xf0, 0x37, 0x29, 0x9f, 0xb0, 0x8c, 0x82, 0xa6, 0xa6, 0xf0, 0x9f, 0xc0, 0x29, 0x93, 0xc7, 0x11, + 0x44, 0x0d, 0x2d, 0xe8, 0xeb, 0xec, 0x45, 0x95, 0xbe, 0x2e, 0x77, 0x9f, 0x8d, 0x0c, 0xfb, 0xab, 0x1e, 0x62, 0x84, + 0x3d, 0x6d, 0x4f, 0x58, 0x52, 0xce, 0x1f, 0x23, 0x2d, 0xde, 0x97, 0x4b, 0x61, 0x99, 0x6d, 0x15, 0x5d, 0x91, 0xaa, + 0x63, 0x83, 0xf2, 0x30, 0x8a, 0x40, 0xab, 0x4b, 0x79, 0x1c, 0x5b, 0x82, 0x0a, 0xb3, 0x76, 0x21, 0x9a, 0x2e, 0x77, + 0x9f, 0x5d, 0xdc, 0x27, 0x9d, 0xa0, 0xde, 0x16, 0x50, 0x06, 0xd0, 0x24, 0xa2, 0x29, 0x98, 0x91, 0xd6, 0x6e, 0x69, + 0x19, 0x7b, 0xce, 0x93, 0x84, 0x0e, 0x04, 0x8d, 0xc0, 0x4a, 0x61, 0x44, 0xf8, 0x63, 0x9e, 0x89, 0xa2, 0xb0, 0x84, + 0x9e, 0x59, 0xd0, 0x33, 0x7f, 0x10, 0xc6, 0xb1, 0xa7, 0x2c, 0x92, 0x09, 0x9f, 0xd3, 0x0d, 0x50, 0xb7, 0x2b, 0x20, + 0x17, 0xc3, 0x50, 0x6b, 0x18, 0xea, 0x67, 0xd3, 0x98, 0x0d, 0x68, 0x21, 0xb8, 0x2e, 0x7c, 0x96, 0x44, 0xf4, 0x16, + 0xf8, 0x08, 0xea, 0x74, 0x3a, 0x0d, 0xdc, 0x44, 0xb9, 0x42, 0xf8, 0x62, 0x0d, 0xb1, 0xf7, 0x88, 0x4c, 0x20, 0x32, + 0xd2, 0x59, 0x6c, 0xe2, 0x07, 0x14, 0x59, 0x72, 0x92, 0x19, 0xcb, 0x4a, 0xf1, 0x66, 0x84, 0x23, 0x1a, 0x53, 0x41, + 0x0d, 0x2f, 0x07, 0xfd, 0x59, 0x1d, 0xdd, 0xb7, 0x05, 0xfe, 0x0a, 0x72, 0x32, 0xa7, 0xcc, 0xec, 0x79, 0x56, 0x58, + 0xea, 0xe5, 0xf6, 0x94, 0xd8, 0xee, 0x0a, 0xb5, 0x3d, 0xa1, 0x10, 0xe1, 0x60, 0xac, 0x4c, 0x74, 0x6f, 0x6d, 0x49, + 0xe5, 0x18, 0x9a, 0xaf, 0x17, 0x87, 0xe8, 0xbd, 0x01, 0x73, 0x13, 0x0a, 0x2e, 0x34, 0x53, 0xa0, 0x60, 0xf5, 0xa9, + 0x6d, 0x3b, 0x0f, 0xe3, 0xf8, 0x3a, 0x1c, 0x7c, 0xac, 0x52, 0x7f, 0x49, 0x06, 0x64, 0x95, 0x1b, 0x5b, 0x55, 0x16, + 0xcb, 0xb2, 0xd7, 0x6d, 0xb8, 0x74, 0xe5, 0xa0, 0x78, 0x3b, 0x8d, 0x92, 0xec, 0xab, 0x1b, 0xbd, 0x95, 0xda, 0x25, + 0x44, 0x4c, 0xaf, 0xcc, 0x03, 0x2e, 0xf0, 0x49, 0x8a, 0x33, 0xfc, 0x40, 0xd3, 0x1d, 0xd8, 0x1a, 0xf9, 0x0a, 0x20, + 0x02, 0x2d, 0xf2, 0x88, 0x65, 0xdb, 0x31, 0xf0, 0x87, 0x40, 0xf9, 0xd4, 0x9a, 0xe1, 0xa1, 0x80, 0x16, 0x3c, 0x4e, + 0xab, 0xcc, 0x05, 0x64, 0x5a, 0x9b, 0x30, 0x8c, 0xe6, 0x5b, 0xd0, 0x5c, 0x24, 0xbd, 0xbf, 0x56, 0x55, 0xa0, 0x93, + 0x01, 0x14, 0x59, 0xdb, 0x56, 0x26, 0x2a, 0x14, 0xa0, 0x79, 0x2a, 0x93, 0x22, 0x37, 0xa9, 0x18, 0x8f, 0x5a, 0x5d, + 0x57, 0xf6, 0xb7, 0x66, 0xb9, 0x9c, 0x78, 0x9e, 0x97, 0x81, 0xfd, 0x66, 0xf4, 0xfa, 0x72, 0x11, 0xd9, 0xda, 0x22, + 0x32, 0xdf, 0x32, 0xb2, 0x50, 0x49, 0xcb, 0x56, 0xf7, 0xe0, 0xaf, 0xc8, 0x6e, 0x04, 0xca, 0xaa, 0x0f, 0xfc, 0x19, + 0x15, 0xec, 0x36, 0x26, 0x02, 0x73, 0x6d, 0xe0, 0x68, 0x4a, 0x03, 0x86, 0x51, 0x76, 0x49, 0x90, 0x3a, 0x1a, 0x15, + 0x63, 0x37, 0xc1, 0x1c, 0xad, 0x68, 0xf6, 0x79, 0xae, 0x71, 0x44, 0x91, 0xde, 0x9b, 0x8a, 0x4a, 0x6c, 0x61, 0x05, + 0x27, 0x44, 0xab, 0xc1, 0x4a, 0xeb, 0x59, 0xc5, 0x4d, 0x31, 0x2e, 0x1c, 0xd4, 0x12, 0x35, 0x15, 0x7d, 0xd2, 0x28, + 0x56, 0x09, 0xc2, 0x63, 0xa3, 0x91, 0xf2, 0x72, 0xdd, 0x84, 0xb8, 0xc6, 0x1b, 0xe1, 0x76, 0x17, 0x15, 0x93, 0x30, + 0xb0, 0x9a, 0xe5, 0x01, 0xb0, 0x54, 0xbe, 0x09, 0xdd, 0x9b, 0x68, 0xa6, 0x32, 0x8e, 0x85, 0x70, 0x6e, 0x23, 0xdc, + 0xc2, 0x6c, 0xa2, 0x38, 0x57, 0xd2, 0x27, 0xe3, 0x6a, 0x5f, 0x8f, 0x62, 0xae, 0xf6, 0x61, 0x0d, 0x89, 0xab, 0x8a, + 0xa7, 0x24, 0x41, 0x30, 0x60, 0x33, 0x50, 0xee, 0x6c, 0xf9, 0xe0, 0x01, 0xec, 0x6c, 0xb9, 0x5c, 0x23, 0xba, 0x8d, + 0xfa, 0x27, 0xf2, 0x4b, 0xa3, 0x70, 0xb9, 0xbc, 0x11, 0xc8, 0xd3, 0x9a, 0x2f, 0xa6, 0xa8, 0x6b, 0x38, 0xee, 0xd9, + 0x0b, 0x68, 0x25, 0x15, 0xd1, 0xb2, 0xa4, 0x30, 0x19, 0xaa, 0x34, 0x5b, 0xdd, 0x27, 0x61, 0xb1, 0xed, 0xf3, 0x35, + 0xee, 0x25, 0x0b, 0xb5, 0x98, 0x2e, 0x97, 0x7c, 0xae, 0x87, 0x66, 0x08, 0xa1, 0x20, 0x93, 0x56, 0xcc, 0xce, 0x26, + 0xc3, 0x72, 0x6f, 0x2f, 0xb3, 0x06, 0xba, 0x2c, 0xd8, 0xc4, 0x07, 0x0f, 0x44, 0x72, 0x76, 0x97, 0x48, 0xdd, 0xe5, + 0x83, 0x11, 0x42, 0x6b, 0x66, 0x69, 0xa3, 0x0d, 0xd6, 0x78, 0x78, 0x13, 0x32, 0xe1, 0x14, 0xa3, 0x28, 0x6b, 0xdc, + 0xa3, 0x68, 0xa1, 0x55, 0x0d, 0x3f, 0xa5, 0xa0, 0x3c, 0x02, 0x4f, 0x30, 0x2a, 0xb4, 0xa2, 0xfb, 0xc1, 0x98, 0x82, + 0x23, 0xd8, 0x68, 0x11, 0x85, 0x5d, 0xb8, 0xa3, 0xa5, 0x88, 0x1e, 0x78, 0x33, 0xec, 0xf9, 0x6a, 0xf7, 0x8a, 0x1d, + 0x30, 0xa5, 0xe9, 0x90, 0xa7, 0x13, 0x53, 0x97, 0xaf, 0x3c, 0x6b, 0xce, 0xc8, 0x86, 0xde, 0xc6, 0xb1, 0xb5, 0xfa, + 0xdf, 0x5e, 0x31, 0xba, 0x4b, 0x73, 0xbd, 0x22, 0x4a, 0x0b, 0xe9, 0xab, 0xfc, 0x81, 0x86, 0x32, 0x33, 0xdb, 0xbc, + 0xd7, 0xce, 0xd4, 0xb6, 0x72, 0x98, 0xec, 0x34, 0xdb, 0x85, 0xcd, 0x67, 0xa8, 0xa1, 0xad, 0x1c, 0x1b, 0x5a, 0xa4, + 0xf2, 0x59, 0x1c, 0x69, 0x60, 0x19, 0xc2, 0x54, 0xd3, 0xd1, 0x0d, 0x8b, 0xe3, 0xb2, 0xf4, 0x73, 0xf8, 0x7a, 0xa6, + 0xf9, 0x7a, 0x62, 0xf8, 0x3a, 0x70, 0x0a, 0xe0, 0xeb, 0x6a, 0xb8, 0xb2, 0x7b, 0xb2, 0x76, 0x3a, 0x13, 0xc5, 0xd1, + 0x33, 0x69, 0x47, 0xc3, 0x7c, 0x33, 0x03, 0x01, 0x2a, 0x34, 0xaf, 0x8f, 0x9e, 0x76, 0xc2, 0x80, 0x01, 0xa8, 0x5c, + 0x98, 0xd4, 0x76, 0x51, 0x7c, 0xf4, 0x10, 0xce, 0x72, 0x5a, 0x50, 0xf6, 0xd9, 0x33, 0x70, 0xd2, 0x59, 0xcb, 0x01, + 0x21, 0x26, 0x8b, 0x3f, 0x4b, 0x89, 0x32, 0xab, 0x63, 0x7a, 0x75, 0x99, 0x59, 0x1d, 0x70, 0xfa, 0x72, 0x75, 0xd1, + 0xfd, 0xbc, 0x5e, 0x2e, 0x8f, 0x15, 0xcb, 0x2b, 0xf7, 0x7b, 0xb9, 0xf4, 0x56, 0x4a, 0xc0, 0x7f, 0xaf, 0x4d, 0x94, + 0xb4, 0x18, 0x1d, 0x78, 0x80, 0x8d, 0x19, 0x28, 0xc8, 0xd5, 0xa2, 0x0b, 0x11, 0xf7, 0xe2, 0x53, 0x0e, 0x1e, 0xe9, + 0xa6, 0x57, 0xfd, 0xcf, 0xf9, 0x64, 0x0a, 0xda, 0xd8, 0x0a, 0x49, 0x8f, 0xa8, 0x9e, 0xb0, 0xac, 0xcf, 0x37, 0x94, + 0x55, 0xfa, 0xc8, 0xf3, 0x58, 0xa1, 0xa6, 0xc2, 0x5e, 0xde, 0x69, 0xe4, 0xb3, 0xa2, 0xa8, 0x60, 0x1c, 0x9b, 0x9c, + 0x2a, 0xe7, 0xab, 0x2e, 0x19, 0x53, 0xf1, 0xda, 0x63, 0x8a, 0x0f, 0x33, 0xe0, 0x75, 0x16, 0xfb, 0x31, 0xe4, 0x6e, + 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0xb7, 0xca, 0xc8, 0xc6, 0xb7, 0xdb, 0xad, 0xe1, + 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0xbe, 0x5d, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, + 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x36, 0x07, 0xef, 0xd7, 0xd7, + 0xeb, 0x8e, 0xd7, 0xef, 0x69, 0x9a, 0x49, 0x45, 0xb4, 0xd0, 0x69, 0xbf, 0x2e, 0xc5, 0xd2, 0xd7, 0xc1, 0xd6, 0xf6, + 0xa5, 0x09, 0xe2, 0x36, 0xfd, 0x63, 0xff, 0xc0, 0x45, 0xd2, 0x2d, 0xfc, 0x93, 0x3e, 0xf0, 0x1f, 0x8c, 0x5b, 0xf8, + 0x19, 0xf9, 0x50, 0xf5, 0x0a, 0x47, 0x82, 0x3c, 0xeb, 0x3e, 0x33, 0x16, 0x33, 0x8f, 0xd9, 0xe0, 0xce, 0x73, 0x63, + 0x26, 0xea, 0x10, 0x7a, 0x73, 0xf1, 0x42, 0x55, 0x80, 0x4b, 0x51, 0xba, 0xb3, 0x73, 0x63, 0xeb, 0x61, 0x21, 0x88, + 0xbb, 0x1b, 0x33, 0xb1, 0xeb, 0xe2, 0x09, 0xb9, 0x82, 0x1f, 0xbb, 0x0b, 0xef, 0x65, 0x28, 0xc6, 0x7e, 0x1a, 0x26, + 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x4c, 0x10, 0xb7, + 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x33, 0x91, 0x77, 0xae, 0xf0, 0x59, 0xe1, 0xb1, 0xc7, + 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x4c, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, + 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0xad, + 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x5b, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, + 0x69, 0x4f, 0x79, 0x18, 0x7c, 0x26, 0x68, 0x1a, 0x0a, 0x9e, 0xf6, 0x91, 0xad, 0x7e, 0xe0, 0xbf, 0x91, 0xab, 0x9e, + 0xf3, 0x9f, 0xbe, 0xf8, 0x79, 0xf8, 0x73, 0xda, 0xbf, 0xc2, 0xaf, 0xc9, 0xfe, 0xa9, 0xd7, 0x0d, 0xbc, 0x9d, 0x7a, + 0x7d, 0xf9, 0xf3, 0x7e, 0xef, 0x1f, 0x61, 0xfd, 0xd7, 0xb3, 0xfa, 0x4f, 0x7d, 0xb4, 0xf4, 0x7e, 0xde, 0xef, 0xf6, + 0xf4, 0x53, 0xef, 0x1f, 0x9d, 0x9f, 0xb3, 0xfe, 0x9f, 0x55, 0xe1, 0x2e, 0x42, 0xfb, 0x23, 0x3c, 0x13, 0x64, 0xbf, + 0x5e, 0xef, 0xec, 0x8f, 0xf0, 0x54, 0x90, 0x7d, 0xf8, 0x7b, 0x4d, 0xde, 0xd2, 0xd1, 0xb3, 0xdb, 0xa9, 0x77, 0xd5, + 0x59, 0xee, 0x2e, 0xfe, 0x96, 0xc3, 0xa8, 0xbd, 0x7f, 0xfc, 0xfc, 0x73, 0xe6, 0x7e, 0xd5, 0x21, 0xfb, 0xfd, 0x1a, + 0xf2, 0xa0, 0xf4, 0xcf, 0x44, 0xfe, 0xeb, 0x75, 0x83, 0xde, 0x3f, 0x34, 0x14, 0xee, 0x57, 0x3f, 0x5f, 0x9d, 0x76, + 0x48, 0x7f, 0xe9, 0xb9, 0xcb, 0xaf, 0xd0, 0x12, 0xa1, 0xe5, 0x2e, 0xba, 0xc2, 0xee, 0xc8, 0x45, 0x78, 0x24, 0xc8, + 0xfe, 0x57, 0xfb, 0x23, 0x3c, 0x17, 0x64, 0xdf, 0xdd, 0x1f, 0xe1, 0x67, 0x82, 0xec, 0xff, 0xc3, 0xeb, 0x06, 0xca, + 0xc3, 0xb6, 0x94, 0xee, 0x8d, 0x25, 0x04, 0x37, 0xc2, 0x94, 0x86, 0x4b, 0xc1, 0x44, 0x4c, 0xd1, 0xee, 0x3e, 0xc3, + 0x17, 0x12, 0x4d, 0x9e, 0x00, 0x27, 0x0c, 0xd8, 0x76, 0xde, 0xe2, 0x12, 0x36, 0x1b, 0x68, 0x66, 0x37, 0x48, 0xb1, + 0xf2, 0x03, 0x64, 0x81, 0xc0, 0xf3, 0x30, 0x9e, 0xd1, 0x2c, 0xa0, 0x39, 0xc2, 0x03, 0x72, 0x21, 0xbc, 0x26, 0xc2, + 0xcf, 0x05, 0xfc, 0x68, 0x21, 0x7c, 0xa1, 0x03, 0x98, 0x70, 0x90, 0x15, 0x51, 0x25, 0x5c, 0x69, 0x2c, 0x2e, 0xc2, + 0xd3, 0x0d, 0x95, 0x62, 0x0c, 0xde, 0x05, 0x84, 0x87, 0x95, 0x70, 0x27, 0xbe, 0x21, 0x86, 0x24, 0xde, 0xa5, 0x94, + 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0x9d, 0xe1, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, + 0xaa, 0x73, 0xa1, 0x62, 0x04, 0x20, 0x64, 0xab, 0xbe, 0x18, 0xd8, 0xf1, 0x9d, 0x74, 0xcd, 0x61, 0x95, 0x86, 0x37, + 0x2e, 0xaa, 0xc6, 0x45, 0x59, 0x32, 0x0f, 0x63, 0x16, 0x39, 0x82, 0x4e, 0xa6, 0x71, 0x28, 0xa8, 0xa3, 0xd7, 0xeb, + 0x84, 0x30, 0x90, 0x5b, 0xa8, 0x0c, 0x91, 0x65, 0x70, 0x46, 0x26, 0xe0, 0x04, 0x67, 0xc5, 0x83, 0xe8, 0x94, 0x56, + 0x3b, 0x5e, 0x96, 0xc1, 0xaf, 0xd5, 0xf8, 0x5e, 0xbd, 0x09, 0x8e, 0xb0, 0xbe, 0x14, 0xcf, 0x19, 0x4e, 0x08, 0x08, + 0xd1, 0x56, 0xd7, 0x3d, 0xcd, 0xe6, 0xa3, 0x8e, 0x0b, 0xb1, 0x19, 0x4e, 0x5e, 0x4b, 0xbf, 0x10, 0x34, 0x18, 0x93, + 0x46, 0x7b, 0x7c, 0x4a, 0xdb, 0xe3, 0x5a, 0xcd, 0xe8, 0xd0, 0x31, 0x49, 0x7b, 0x63, 0xd5, 0x3d, 0xc4, 0x11, 0x9e, + 0x91, 0x7a, 0x13, 0x8f, 0x48, 0x43, 0x76, 0x69, 0x8f, 0x4e, 0x63, 0x3d, 0xcd, 0xde, 0x9e, 0xc7, 0xfd, 0x38, 0xcc, + 0xc4, 0x37, 0x60, 0xec, 0x93, 0x11, 0x8e, 0x08, 0xf7, 0xe9, 0x2d, 0x1d, 0x78, 0x31, 0xc2, 0x91, 0xe6, 0x34, 0xa8, + 0x8d, 0x46, 0xc4, 0x6a, 0x06, 0x46, 0x04, 0x79, 0xdd, 0x8d, 0x7a, 0xcd, 0x3e, 0x21, 0xc4, 0xdd, 0xa9, 0xd7, 0xdd, + 0x2e, 0x27, 0x33, 0x11, 0x40, 0x89, 0xa5, 0x2a, 0x93, 0x29, 0x14, 0xb5, 0xac, 0x22, 0xef, 0x99, 0xf0, 0x05, 0xcd, + 0x84, 0x07, 0xc5, 0x60, 0xfe, 0x67, 0x86, 0xb0, 0xdd, 0xd3, 0x7d, 0xb7, 0x06, 0xa5, 0x92, 0x38, 0x11, 0xe6, 0xe4, + 0x1a, 0x05, 0x51, 0xef, 0xa0, 0x6f, 0xf3, 0x7f, 0x59, 0x08, 0x93, 0x5f, 0x77, 0xa3, 0x5e, 0x43, 0x4e, 0xde, 0x71, + 0xbb, 0x1e, 0x27, 0x99, 0x52, 0xd0, 0xba, 0x59, 0xf0, 0x5a, 0x2e, 0x15, 0x05, 0x1a, 0x38, 0x3d, 0xef, 0x8c, 0xd4, + 0x5b, 0x81, 0x37, 0xb3, 0x17, 0x51, 0x87, 0xc9, 0x34, 0x16, 0x70, 0x48, 0xa0, 0x3d, 0xe6, 0x04, 0x66, 0x2c, 0xbb, + 0x5d, 0x07, 0xfa, 0xf9, 0x2b, 0xf7, 0xab, 0xee, 0x5c, 0x04, 0x23, 0xa1, 0xa6, 0x9f, 0x8b, 0xe5, 0x12, 0xfe, 0x8e, + 0x44, 0x97, 0x93, 0x6b, 0x59, 0x34, 0xd3, 0x45, 0x53, 0x28, 0x7a, 0x1d, 0x00, 0xa8, 0x38, 0x2b, 0x94, 0x2c, 0xb5, + 0x27, 0x73, 0x22, 0x61, 0xdf, 0xdb, 0x4b, 0x7b, 0xe3, 0x5a, 0xb3, 0x0f, 0xfe, 0xfd, 0x54, 0x64, 0x3f, 0x30, 0x31, + 0xf6, 0xdc, 0xfd, 0x8e, 0x8b, 0xba, 0xae, 0x03, 0x5b, 0xdb, 0x4e, 0x6a, 0x44, 0x61, 0x38, 0xae, 0xbd, 0x12, 0xc1, + 0xac, 0x43, 0x1a, 0x5d, 0x8f, 0x69, 0x7f, 0x1e, 0xc2, 0xb1, 0x66, 0x9c, 0x0d, 0x3c, 0x43, 0x35, 0x21, 0x6a, 0xe6, + 0x79, 0x86, 0x6a, 0x93, 0xda, 0x1c, 0x05, 0x71, 0x6d, 0x52, 0xf3, 0x66, 0x84, 0x90, 0x7a, 0xab, 0xe8, 0x66, 0xa4, + 0xdf, 0x18, 0x05, 0x73, 0xe3, 0xec, 0xec, 0xc9, 0xe3, 0x90, 0xd4, 0xbc, 0xb4, 0x47, 0xfb, 0xcb, 0xa5, 0x7b, 0xda, + 0xed, 0xb8, 0xa8, 0xe6, 0x19, 0x42, 0xdb, 0x37, 0x94, 0x86, 0x10, 0x66, 0xfd, 0x5c, 0x87, 0x92, 0xde, 0x55, 0xc2, + 0x46, 0x8b, 0xf2, 0xb0, 0x5b, 0x3c, 0x80, 0xe6, 0x85, 0x1d, 0xa3, 0xf4, 0xd5, 0x29, 0x2c, 0xd3, 0x10, 0x73, 0x42, + 0x1a, 0x98, 0x13, 0xe3, 0xbb, 0x1e, 0x13, 0x51, 0x12, 0x7c, 0x4c, 0xca, 0xe6, 0xb8, 0x17, 0xe2, 0xa8, 0x4f, 0x5e, + 0x2a, 0x7b, 0xa4, 0x6d, 0xfc, 0xe2, 0x34, 0x26, 0xef, 0x56, 0xa2, 0xb7, 0x21, 0xc4, 0x56, 0x6e, 0xfc, 0xc1, 0x2c, + 0x4d, 0x69, 0x22, 0x5e, 0xf1, 0x48, 0xab, 0x69, 0x34, 0x06, 0x4b, 0x09, 0xc2, 0xb2, 0x18, 0x74, 0xb4, 0x96, 0x39, + 0x19, 0xb3, 0xb5, 0xea, 0x11, 0x99, 0x29, 0xf5, 0x49, 0x06, 0x6b, 0xdb, 0x23, 0x6d, 0x17, 0x7b, 0x08, 0xcf, 0x74, + 0x14, 0xd7, 0xf3, 0x7d, 0x7f, 0xe4, 0x0f, 0xa0, 0x1a, 0x26, 0xc8, 0x50, 0x2e, 0xcf, 0x91, 0x97, 0x91, 0x1b, 0x3f, + 0xa1, 0xb7, 0x72, 0x56, 0x0f, 0x95, 0x92, 0xd9, 0x1c, 0xaf, 0xd3, 0x71, 0x5b, 0xb2, 0x9b, 0xcc, 0x4f, 0x78, 0x44, + 0x01, 0x3d, 0x10, 0xb7, 0xd7, 0x45, 0xe3, 0x30, 0xb3, 0xe3, 0x53, 0x25, 0x7c, 0x3d, 0xdb, 0x79, 0x3d, 0x02, 0x8f, + 0xaf, 0xd4, 0xb5, 0x8a, 0xc6, 0xca, 0x0d, 0x8e, 0x10, 0x1b, 0x7a, 0x23, 0x1f, 0xe2, 0x7a, 0x92, 0x84, 0x04, 0x98, + 0x72, 0x23, 0x9b, 0xa8, 0x26, 0xc5, 0x98, 0x73, 0x12, 0xf5, 0x78, 0xad, 0x26, 0xbd, 0xd0, 0x33, 0x45, 0x12, 0x23, + 0x84, 0xe7, 0xc5, 0xd9, 0x32, 0xed, 0x5e, 0x0b, 0x52, 0x9d, 0xca, 0x9b, 0x57, 0xdd, 0xb9, 0x35, 0x21, 0x90, 0xf4, + 0x14, 0x0a, 0x6f, 0x82, 0xf0, 0x13, 0xb2, 0xef, 0xf5, 0xfc, 0xee, 0x5f, 0xfa, 0xa8, 0xeb, 0xf9, 0x7f, 0x46, 0xfb, + 0x8a, 0x73, 0xcc, 0x51, 0x3b, 0x56, 0x73, 0x2c, 0x64, 0xfc, 0xb2, 0x89, 0xa5, 0x27, 0x31, 0x48, 0x70, 0x12, 0x4e, + 0x68, 0xf0, 0x04, 0x0e, 0xb9, 0x21, 0x9c, 0xd7, 0x02, 0x03, 0x25, 0x05, 0x4f, 0x34, 0x2f, 0xf1, 0xdd, 0xee, 0x0b, + 0x51, 0x3c, 0x75, 0xdd, 0xee, 0x87, 0xf2, 0xe9, 0x2f, 0x6e, 0xf7, 0x1b, 0x11, 0xfc, 0x9a, 0x6b, 0x6f, 0x77, 0x65, + 0x8e, 0x63, 0x33, 0x47, 0xae, 0xb6, 0xc6, 0xc2, 0xdd, 0x0c, 0xad, 0x3b, 0x3a, 0x46, 0x28, 0x67, 0xc3, 0x82, 0x19, + 0x65, 0xbe, 0x08, 0x47, 0x80, 0x54, 0x6b, 0x0f, 0x32, 0x3b, 0xae, 0x5f, 0xae, 0x18, 0x48, 0xc5, 0xd0, 0x2b, 0x20, + 0x73, 0xd4, 0x69, 0xa0, 0x45, 0xa5, 0xad, 0xd4, 0x99, 0xaa, 0x71, 0xf4, 0x82, 0x4f, 0xcf, 0x49, 0xa3, 0x3d, 0x3f, + 0x1d, 0xb5, 0xe7, 0xb5, 0x1a, 0xca, 0x0c, 0x69, 0xcd, 0x7a, 0xf3, 0x3e, 0x7e, 0x03, 0x4e, 0x3d, 0x9b, 0x96, 0x70, + 0x65, 0x79, 0x2d, 0xbd, 0xbc, 0x5a, 0x2d, 0xc9, 0x51, 0xdb, 0xea, 0x3a, 0x52, 0x5d, 0xf3, 0x5c, 0xe1, 0x64, 0x95, + 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0x99, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, + 0xc0, 0x3e, 0x95, 0x94, 0xf0, 0x00, 0x0b, 0xd0, 0xb5, 0xf0, 0x04, 0x4f, 0xf0, 0xac, 0xd6, 0x94, 0x64, 0x5e, 0x6f, + 0xb6, 0xab, 0x63, 0x3d, 0x2a, 0xc7, 0xc2, 0xb3, 0x1a, 0x99, 0x14, 0x58, 0xca, 0x93, 0x5a, 0x2d, 0xaf, 0x06, 0x3b, + 0xcd, 0xc9, 0xad, 0x04, 0x20, 0xce, 0x56, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, + 0xa4, 0x28, 0x11, 0x98, 0xe5, 0x79, 0x29, 0xd9, 0x41, 0x8c, 0x62, 0x4a, 0x52, 0xe0, 0x3c, 0xd2, 0xee, 0xc2, 0x09, + 0xe6, 0x78, 0x2c, 0xf9, 0x06, 0x21, 0xe4, 0xc2, 0xa4, 0xb3, 0x08, 0xc9, 0x83, 0x62, 0xc2, 0x2c, 0x99, 0x94, 0x11, + 0xea, 0x5f, 0xee, 0x9e, 0xf3, 0x7b, 0x6d, 0xb2, 0x1e, 0xeb, 0x07, 0xb2, 0x59, 0xac, 0x39, 0x57, 0x48, 0xde, 0x7b, + 0x02, 0x15, 0xd1, 0x11, 0x5f, 0x32, 0xc0, 0xa7, 0x2c, 0xa5, 0x52, 0x07, 0xdf, 0x35, 0x76, 0x5f, 0x5c, 0x55, 0x20, + 0x63, 0xdb, 0x7b, 0x03, 0x88, 0x0c, 0xc1, 0xb9, 0x93, 0x90, 0xb5, 0x66, 0x97, 0xbb, 0x67, 0xaf, 0x37, 0xd9, 0xc0, + 0xcb, 0xa5, 0xb6, 0x7e, 0xa5, 0x6e, 0x83, 0xc3, 0x12, 0xd2, 0x58, 0xff, 0x08, 0xbc, 0x58, 0xaa, 0x48, 0xa1, 0x97, + 0x02, 0x15, 0x5d, 0xee, 0x9e, 0xbd, 0xf3, 0x52, 0xe9, 0x5b, 0x42, 0xd8, 0x5e, 0xb6, 0xc7, 0x89, 0x37, 0x26, 0x14, + 0xa9, 0xb5, 0x17, 0xac, 0x8b, 0x5b, 0x02, 0x3c, 0x18, 0xcb, 0x4a, 0xb0, 0x20, 0x7a, 0xac, 0x4f, 0x62, 0x8d, 0x01, + 0x12, 0x23, 0x1c, 0x57, 0xec, 0x32, 0x02, 0x1b, 0x20, 0xe7, 0xba, 0x80, 0x9d, 0xf0, 0x95, 0xea, 0x87, 0x70, 0x2c, + 0x67, 0x15, 0xb9, 0x12, 0x1e, 0x4f, 0xd6, 0xb2, 0xd2, 0x4a, 0x73, 0xf4, 0x7b, 0xb0, 0x9d, 0xcc, 0xc3, 0x2b, 0x62, + 0x2c, 0x09, 0x5d, 0xf0, 0xd4, 0xa4, 0x8f, 0x5d, 0xee, 0x9e, 0xbd, 0xd4, 0x19, 0x64, 0xd3, 0xd0, 0xf0, 0xfb, 0x35, + 0x13, 0xf3, 0xec, 0xa5, 0x5f, 0xd6, 0xca, 0xc6, 0x97, 0xbb, 0x67, 0xef, 0x37, 0x35, 0x83, 0xf2, 0x7c, 0x56, 0xda, + 0xf8, 0x12, 0xbe, 0x05, 0x8d, 0x83, 0x85, 0x16, 0x0e, 0x01, 0xcb, 0xb1, 0x14, 0x48, 0x41, 0x96, 0x17, 0xae, 0x91, + 0xa7, 0x38, 0x21, 0x32, 0x0c, 0x54, 0xdd, 0x35, 0xad, 0xe6, 0x31, 0x9e, 0x5c, 0x0c, 0xf8, 0x94, 0x6e, 0x89, 0x0d, + 0x9d, 0x21, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, + 0x2b, 0xb2, 0x05, 0x8f, 0x49, 0x03, 0xc7, 0xa4, 0x81, 0x43, 0x92, 0xf5, 0x1a, 0x4a, 0x40, 0xb4, 0xc3, 0x62, 0x5c, + 0x25, 0x66, 0x20, 0x2b, 0x4c, 0x9f, 0x56, 0x25, 0x80, 0xa3, 0x76, 0x28, 0x7d, 0x8f, 0x52, 0xa6, 0x47, 0x92, 0x2c, + 0xde, 0x7a, 0x1c, 0x73, 0x39, 0xf0, 0x05, 0xbb, 0x8e, 0x21, 0xb1, 0x04, 0x56, 0x85, 0x05, 0x0a, 0x8a, 0xa6, 0x4d, + 0xdd, 0x34, 0xf4, 0xe5, 0x3e, 0x71, 0x1c, 0xfa, 0xc0, 0xb9, 0x71, 0xa8, 0xf3, 0x70, 0xb2, 0xf5, 0x2e, 0xc7, 0x7b, + 0x7b, 0x9e, 0xea, 0xf4, 0x8b, 0xf0, 0xb8, 0xa9, 0x2f, 0x23, 0x77, 0xdf, 0x2b, 0x5e, 0x11, 0x21, 0x09, 0x7f, 0xad, + 0x16, 0xf7, 0x73, 0x08, 0x43, 0x7b, 0x61, 0x15, 0x83, 0x06, 0x78, 0xa9, 0xeb, 0x55, 0x97, 0x5f, 0xab, 0x15, 0x51, + 0xda, 0x2a, 0xb6, 0xce, 0x70, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, + 0x59, 0x66, 0x16, 0x63, 0x1d, 0x09, 0x06, 0xed, 0xbe, 0xd1, 0x59, 0x0b, 0x58, 0x66, 0x57, 0xe9, 0x46, 0x86, 0x9d, + 0xb5, 0x50, 0x60, 0x1a, 0x41, 0x54, 0x0a, 0x1a, 0xd5, 0x72, 0x4d, 0xde, 0x6f, 0xd7, 0x73, 0x2e, 0x71, 0x86, 0xb4, + 0x93, 0x4b, 0x42, 0x21, 0x91, 0xd5, 0x2a, 0x90, 0xf2, 0x9c, 0x4c, 0xb7, 0x93, 0xfc, 0x99, 0x45, 0xf2, 0x4f, 0x08, + 0xb5, 0xc8, 0x5f, 0xb9, 0x38, 0x7c, 0xae, 0x9d, 0x0b, 0x99, 0xa9, 0x3a, 0x9f, 0x12, 0x70, 0xa2, 0x55, 0x31, 0x5a, + 0x09, 0x2b, 0x6e, 0x61, 0x28, 0xf6, 0x09, 0x91, 0x6e, 0x48, 0x6c, 0x62, 0xc0, 0x5e, 0x19, 0x54, 0x83, 0xa9, 0x37, + 0xf9, 0xf4, 0x6c, 0x0e, 0x78, 0xf6, 0xfe, 0xfe, 0x78, 0xe8, 0xf9, 0x74, 0xfd, 0xe4, 0x5a, 0xb9, 0x9f, 0xb0, 0x6a, + 0xeb, 0xe0, 0x56, 0x33, 0x41, 0x61, 0xfe, 0x22, 0x8e, 0x5d, 0x65, 0x3e, 0x2b, 0x87, 0xd0, 0xc8, 0x3f, 0x80, 0xb6, + 0xd9, 0x94, 0x2d, 0xa8, 0x35, 0x2c, 0xf0, 0x23, 0x95, 0x81, 0x1a, 0xa6, 0x5b, 0xd8, 0xc7, 0x99, 0x6c, 0x40, 0x93, + 0x68, 0x73, 0xf5, 0x93, 0x5c, 0x93, 0x89, 0x02, 0x0d, 0x2d, 0x80, 0xff, 0x29, 0x92, 0x07, 0xba, 0x91, 0x72, 0x01, + 0x10, 0x34, 0x95, 0x78, 0x2a, 0x11, 0xe6, 0xba, 0xa5, 0xf7, 0xfd, 0xf9, 0x0e, 0x21, 0xd3, 0xd2, 0xfb, 0xf8, 0xb6, + 0x4c, 0xbd, 0x02, 0xb2, 0x40, 0x01, 0x98, 0x8f, 0x45, 0x81, 0x0a, 0x5f, 0x5e, 0x98, 0xe6, 0xd2, 0x84, 0xf4, 0x4b, + 0x8d, 0xdb, 0x0a, 0x6d, 0x4a, 0xb7, 0x9c, 0xaa, 0x37, 0x68, 0x58, 0xa9, 0xdd, 0x85, 0xda, 0xb7, 0x42, 0xc2, 0x08, + 0xcf, 0xef, 0x64, 0x6b, 0x33, 0x6e, 0xfe, 0x71, 0x35, 0x7f, 0x65, 0x65, 0x53, 0x7c, 0x96, 0x64, 0x34, 0x15, 0x4f, + 0xe8, 0x90, 0xa7, 0x10, 0xb3, 0x28, 0x70, 0x82, 0xf2, 0x5d, 0xcb, 0x6f, 0x27, 0xd7, 0x67, 0x05, 0x0a, 0x56, 0x16, + 0x28, 0x7f, 0x7d, 0x94, 0x41, 0xeb, 0xcb, 0xd5, 0x5e, 0xd3, 0xbd, 0xbd, 0xf7, 0x25, 0x9a, 0x34, 0x94, 0x12, 0x0a, + 0x8b, 0x69, 0x29, 0x95, 0x46, 0x47, 0x72, 0x77, 0xbd, 0xc2, 0x09, 0x60, 0x18, 0x86, 0xcd, 0x7b, 0x9e, 0x13, 0x91, + 0x8f, 0x56, 0x59, 0xbc, 0x76, 0x4e, 0x30, 0xdb, 0x70, 0x01, 0x0e, 0x0f, 0xa6, 0xb6, 0xf2, 0x16, 0x65, 0x65, 0x32, + 0x6c, 0x01, 0xc3, 0x39, 0x20, 0xcb, 0x93, 0x66, 0x88, 0x45, 0x81, 0x1b, 0xcd, 0x92, 0x73, 0xd0, 0x2b, 0xc7, 0x38, + 0xf3, 0xc7, 0x90, 0xfe, 0x5a, 0x39, 0xb2, 0x08, 0x61, 0x95, 0x98, 0x63, 0xa5, 0x12, 0x9c, 0x3d, 0xdf, 0xe4, 0x52, + 0x36, 0x44, 0x4d, 0xa5, 0xd4, 0x91, 0x2d, 0x50, 0xd1, 0xc1, 0x9f, 0x7b, 0x4c, 0x2b, 0x6e, 0x26, 0x6e, 0x06, 0x0c, + 0xf8, 0x89, 0xf0, 0x54, 0x30, 0x0a, 0x64, 0x06, 0xf7, 0x67, 0x5e, 0x65, 0xea, 0x36, 0x97, 0xdd, 0xb0, 0x46, 0xdc, + 0xd8, 0x46, 0x13, 0x97, 0x71, 0xbd, 0xf3, 0x92, 0x97, 0x0e, 0x55, 0x06, 0xb5, 0x30, 0x5c, 0xb0, 0x4c, 0x24, 0xb1, + 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0x6e, 0x85, + 0xb5, 0xa3, 0xc6, 0x89, 0x2d, 0xe7, 0xb4, 0xa4, 0xfe, 0x5b, 0x48, 0x75, 0x59, 0x3d, 0xf3, 0xcf, 0xa5, 0x2c, 0x64, + 0x38, 0xab, 0x30, 0xf6, 0x44, 0x32, 0x76, 0x04, 0x7a, 0x9a, 0x49, 0xfc, 0xee, 0xea, 0x8c, 0x17, 0xa6, 0xa5, 0x9c, + 0x26, 0xb1, 0x37, 0x45, 0xb4, 0xdc, 0xfa, 0xbd, 0xb2, 0x1b, 0x01, 0x23, 0x90, 0x05, 0x84, 0x35, 0x67, 0x4f, 0x10, + 0xce, 0x6a, 0xb5, 0x76, 0x76, 0x4a, 0x4b, 0x27, 0x49, 0x09, 0x23, 0x83, 0x80, 0x2e, 0x10, 0x7c, 0x45, 0x86, 0x42, + 0xc8, 0xdf, 0x64, 0x66, 0x67, 0xe0, 0x6b, 0x3f, 0x7b, 0xeb, 0xd9, 0x5c, 0xcd, 0x6e, 0x5b, 0x04, 0x4d, 0x61, 0x3d, + 0x5e, 0x19, 0x70, 0x79, 0x73, 0x7f, 0x82, 0x07, 0xc0, 0xbd, 0xd3, 0xc4, 0x90, 0x8a, 0x86, 0xda, 0x42, 0xb1, 0x84, + 0xe2, 0xf4, 0xb5, 0x51, 0x99, 0x95, 0x68, 0x4f, 0xd6, 0x16, 0xa5, 0x31, 0x2b, 0x48, 0x96, 0xe7, 0x19, 0x2d, 0xc3, + 0xfb, 0x2b, 0xe9, 0x97, 0x52, 0xb8, 0xac, 0x7b, 0xdb, 0xcf, 0xa7, 0x44, 0x60, 0x8b, 0x50, 0xdf, 0x6c, 0x8b, 0x7d, + 0x94, 0x60, 0xc2, 0xb9, 0xd6, 0x42, 0xf1, 0xd7, 0x4d, 0x42, 0x11, 0x27, 0xfa, 0xc8, 0x4b, 0x81, 0xd8, 0x7c, 0x80, + 0x40, 0xd4, 0x6e, 0x76, 0x23, 0x13, 0x41, 0x1d, 0xa9, 0xc8, 0xc4, 0xea, 0x96, 0x92, 0x04, 0x33, 0xbd, 0x1b, 0x9d, + 0xd6, 0x72, 0xc9, 0x7a, 0x0d, 0x70, 0x23, 0xb9, 0x2e, 0xfc, 0x6c, 0xaa, 0x9f, 0x16, 0x27, 0x56, 0x6e, 0x60, 0x8f, + 0x15, 0x26, 0x0b, 0xf2, 0x21, 0xc1, 0xd9, 0x93, 0x49, 0x59, 0x92, 0xa6, 0x35, 0x05, 0x69, 0x02, 0x27, 0xac, 0x08, + 0x33, 0x01, 0xc4, 0x52, 0x56, 0x68, 0x03, 0xd2, 0xdb, 0x98, 0xfb, 0x67, 0xcc, 0xcb, 0x4f, 0x6b, 0xa2, 0x15, 0xb9, + 0xa2, 0xd4, 0x87, 0x4a, 0xbe, 0x81, 0x86, 0x40, 0xeb, 0x87, 0x3b, 0xd2, 0x04, 0x2d, 0x45, 0x39, 0xb2, 0xe5, 0x10, + 0x6e, 0x80, 0x13, 0x6d, 0xe7, 0xbd, 0x8a, 0xf0, 0x6e, 0x90, 0x26, 0x98, 0x5b, 0x74, 0xfd, 0x9c, 0x88, 0x0a, 0x2b, + 0x19, 0x13, 0x6d, 0x29, 0xe1, 0x50, 0x92, 0xa9, 0x20, 0x49, 0xaf, 0xd1, 0x07, 0x05, 0xb4, 0x1d, 0x9f, 0x26, 0xa5, + 0x09, 0x1c, 0xd7, 0x6a, 0x28, 0x34, 0xb3, 0x8e, 0x7b, 0xac, 0x16, 0xf7, 0x31, 0xc5, 0xb1, 0x32, 0x4c, 0x2e, 0xf6, + 0xf6, 0xbc, 0xb0, 0x9c, 0xb7, 0x17, 0xf7, 0x11, 0xe6, 0xcb, 0xa5, 0x27, 0xc1, 0x0a, 0xd1, 0x72, 0x19, 0xda, 0x60, + 0xc9, 0x6a, 0xe8, 0x36, 0xed, 0x0a, 0x32, 0x95, 0x02, 0x70, 0x0a, 0x10, 0xd6, 0x88, 0x17, 0x6a, 0xf7, 0x5e, 0x08, + 0xee, 0xa8, 0x5a, 0xd2, 0x8b, 0x6b, 0xcd, 0xbe, 0xc5, 0xb8, 0x7a, 0x71, 0x9f, 0x84, 0x39, 0xdf, 0xdb, 0xdb, 0xc9, + 0xb4, 0x88, 0xfc, 0x00, 0xa2, 0xec, 0x83, 0x94, 0x2c, 0x6a, 0x40, 0x7b, 0x37, 0x56, 0x9d, 0x01, 0x05, 0x45, 0xe9, + 0x6d, 0x35, 0xed, 0x2a, 0x59, 0x10, 0x45, 0x23, 0xac, 0x83, 0xc1, 0x5d, 0xb0, 0xec, 0x0b, 0x32, 0x7f, 0x21, 0x8a, + 0x1c, 0xeb, 0x5f, 0x37, 0x66, 0x56, 0xfb, 0xbe, 0x1f, 0xa6, 0x23, 0x19, 0xcb, 0x30, 0x61, 0x58, 0x49, 0xfc, 0x07, + 0x1a, 0x4c, 0x6b, 0xe2, 0x5e, 0x31, 0x57, 0x9f, 0x28, 0xf0, 0x8d, 0x6a, 0x63, 0xee, 0x92, 0x3c, 0xdd, 0xe8, 0x65, + 0x50, 0x90, 0x7c, 0xf8, 0xad, 0x90, 0x1c, 0x6a, 0x48, 0x14, 0x79, 0xac, 0xe0, 0x6c, 0x0b, 0x2e, 0x9e, 0x8a, 0x15, + 0x9c, 0x6d, 0xc7, 0xad, 0xc1, 0xd4, 0x37, 0xdb, 0xe0, 0xb3, 0x78, 0x83, 0x02, 0xb4, 0x2c, 0xb0, 0xa0, 0x3c, 0x5a, + 0xd5, 0xbd, 0x14, 0x2b, 0x05, 0x61, 0x2a, 0x88, 0xc7, 0xaa, 0x07, 0xa0, 0xd4, 0x46, 0x2d, 0xc3, 0x97, 0x05, 0x53, + 0x64, 0xb9, 0x04, 0xaa, 0xa9, 0x2b, 0x40, 0x4e, 0xda, 0xdb, 0x3e, 0xdd, 0xdb, 0x03, 0xdb, 0x00, 0x94, 0x38, 0x7f, + 0x10, 0x4e, 0xc5, 0x2c, 0x05, 0x55, 0x2a, 0x33, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xc8, 0x32, 0xf8, 0x01, 0x05, 0xd3, + 0x30, 0xcb, 0xd8, 0x5c, 0x95, 0xe9, 0xdf, 0x98, 0x13, 0x43, 0xca, 0x99, 0xd2, 0x09, 0x13, 0xd4, 0x4e, 0x34, 0x9d, + 0x56, 0xd1, 0xf6, 0x6c, 0x4e, 0x13, 0xf1, 0x82, 0x65, 0x82, 0x26, 0xb0, 0xfc, 0x92, 0xe2, 0x60, 0x45, 0x19, 0x82, + 0x03, 0x5b, 0xe9, 0x15, 0x46, 0xd1, 0xbd, 0x5d, 0x44, 0x55, 0x07, 0x1a, 0x87, 0x49, 0x14, 0xab, 0x49, 0xec, 0x7c, + 0x46, 0x93, 0xc3, 0x59, 0xb4, 0xb4, 0xf3, 0x69, 0x4a, 0x65, 0x43, 0x72, 0x77, 0x8f, 0x11, 0x23, 0x09, 0x8c, 0xf4, + 0xbc, 0x57, 0x6b, 0x81, 0x88, 0xf7, 0x96, 0x4d, 0xb0, 0x57, 0x82, 0x85, 0xc5, 0x51, 0xfd, 0x2a, 0x9c, 0x86, 0x6e, + 0x7e, 0xd9, 0x78, 0xa5, 0x6d, 0x93, 0x70, 0x90, 0x74, 0x72, 0xbc, 0xdd, 0xb2, 0x7a, 0x69, 0x24, 0x87, 0x91, 0x16, + 0xec, 0xa1, 0x8c, 0x19, 0x2d, 0x0c, 0x79, 0x21, 0x73, 0x14, 0x77, 0x05, 0xf9, 0x00, 0x77, 0x86, 0x9e, 0x8b, 0x49, + 0xbc, 0x72, 0x35, 0xa6, 0xbd, 0x5b, 0x68, 0xff, 0xbb, 0xc2, 0x7b, 0x87, 0xdf, 0x42, 0x60, 0xf7, 0xa7, 0xb2, 0xf9, + 0x7a, 0x40, 0xf7, 0xa7, 0x12, 0x41, 0x3f, 0x05, 0x6b, 0xed, 0xac, 0x40, 0x6e, 0xcb, 0x3f, 0xf1, 0x1b, 0xae, 0xd1, + 0x96, 0x7e, 0x55, 0x61, 0x24, 0x95, 0x69, 0x29, 0xcf, 0x03, 0x2e, 0xf3, 0xd4, 0x20, 0x5f, 0xae, 0x6a, 0x21, 0x51, + 0x9d, 0x61, 0xa8, 0x74, 0xf8, 0x6d, 0xdb, 0xa3, 0x65, 0x4c, 0xa2, 0xec, 0x8c, 0x37, 0x61, 0x2a, 0x76, 0xe1, 0x94, + 0xf1, 0xb5, 0x7b, 0x78, 0x63, 0x02, 0x1e, 0xb4, 0x87, 0x4d, 0x61, 0x19, 0xdb, 0x99, 0xba, 0x07, 0x64, 0x8f, 0x4f, + 0xb8, 0xd1, 0xdd, 0xaa, 0x56, 0xc6, 0x1b, 0xb0, 0xff, 0x11, 0x1e, 0x9b, 0xcb, 0x71, 0x54, 0x73, 0x60, 0x1a, 0x2c, + 0xf2, 0xc2, 0x29, 0xc0, 0x95, 0xf2, 0x96, 0x22, 0xcc, 0x73, 0x19, 0xe0, 0xfe, 0x16, 0x7f, 0xa7, 0x59, 0xe2, 0xb0, + 0xe0, 0x38, 0xb7, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, + 0xeb, 0x85, 0x6c, 0x4d, 0x4b, 0xc5, 0xb4, 0x48, 0xa9, 0x91, 0xd3, 0x6c, 0xc8, 0xe3, 0x34, 0x56, 0xb6, 0x28, 0x4e, + 0x55, 0x65, 0x5e, 0xb4, 0x05, 0x8b, 0x65, 0x68, 0x71, 0xb9, 0xf4, 0xaa, 0xa8, 0x26, 0xcc, 0x8a, 0x64, 0x20, 0xcc, + 0xac, 0x8c, 0x8a, 0x8a, 0x66, 0xad, 0xfa, 0x78, 0x68, 0x35, 0xa1, 0xc8, 0xe8, 0xe6, 0x15, 0x38, 0x6c, 0x17, 0x82, + 0xea, 0x6e, 0xfb, 0x14, 0xb0, 0x5a, 0x5d, 0x31, 0x91, 0x85, 0xa1, 0x5f, 0x8b, 0x54, 0xd9, 0x32, 0xa7, 0x75, 0x03, + 0x7e, 0xd1, 0x3d, 0xc9, 0xb2, 0x1a, 0x75, 0xeb, 0xf5, 0x56, 0xb2, 0xd1, 0x53, 0xbe, 0x2d, 0xd9, 0xa8, 0xa2, 0xed, + 0xee, 0x34, 0xd0, 0xfd, 0x69, 0xa9, 0x6a, 0xae, 0xcd, 0x4d, 0x7e, 0xc3, 0x74, 0x4d, 0xa0, 0x4d, 0x85, 0x66, 0xc3, + 0x55, 0x2e, 0xf2, 0x7c, 0x58, 0x5c, 0x26, 0x90, 0xb9, 0x3b, 0x43, 0x45, 0xff, 0xda, 0x6a, 0x94, 0xd7, 0x71, 0xbd, + 0x6f, 0xc9, 0x28, 0xe6, 0xd7, 0x61, 0xfc, 0x0e, 0xe6, 0x2b, 0x2b, 0x9f, 0xdf, 0x45, 0x69, 0x28, 0xa8, 0xe6, 0x2e, + 0x25, 0x0c, 0xdf, 0x5a, 0x30, 0x7c, 0xab, 0xf8, 0x74, 0xd9, 0x1f, 0x2f, 0x5e, 0x14, 0x03, 0x04, 0xc3, 0xdc, 0xb0, + 0x8c, 0x4b, 0xb1, 0x79, 0x8e, 0x55, 0x16, 0x76, 0x59, 0xb0, 0xb0, 0x4b, 0xe1, 0xad, 0x0e, 0xe5, 0x79, 0xdf, 0x6d, + 0x1e, 0x65, 0x9d, 0xb3, 0x7d, 0x57, 0x1e, 0xfc, 0xef, 0x82, 0x7b, 0xfb, 0x58, 0x5c, 0xee, 0xc0, 0x3f, 0x90, 0xe9, + 0x2a, 0x0a, 0xe4, 0xe7, 0x90, 0x76, 0x20, 0x48, 0xc7, 0xba, 0x73, 0x50, 0xca, 0x29, 0x93, 0x08, 0xe4, 0x0d, 0x66, + 0x99, 0xe0, 0x13, 0x3d, 0x66, 0xa6, 0xaf, 0x19, 0xc9, 0x4a, 0x70, 0x45, 0xcb, 0x68, 0x7b, 0x50, 0xbd, 0xc8, 0xb5, + 0xf8, 0xc8, 0x92, 0x28, 0xc8, 0xb0, 0x96, 0x22, 0x59, 0x90, 0xe4, 0xc4, 0x24, 0x1b, 0xaf, 0xd7, 0xe1, 0x21, 0x4b, + 0x58, 0x36, 0xa6, 0xa9, 0xc7, 0xd1, 0x62, 0xdb, 0x64, 0x1c, 0x02, 0x32, 0x6a, 0x32, 0xfc, 0x7d, 0x79, 0xe1, 0xcf, + 0x87, 0xd1, 0xc0, 0x0f, 0x34, 0xa1, 0x62, 0xcc, 0x23, 0x48, 0x4c, 0xf1, 0xa3, 0xe2, 0x46, 0xd3, 0xde, 0xde, 0x8e, + 0xe7, 0x4a, 0xb7, 0x04, 0x5c, 0xfd, 0xb6, 0x6b, 0x50, 0x77, 0x01, 0xd7, 0x73, 0xca, 0xa9, 0x29, 0x5a, 0xd0, 0xd5, + 0x9b, 0x2c, 0xc2, 0xff, 0x48, 0xef, 0x70, 0x8a, 0xf2, 0x3c, 0x50, 0x50, 0xbb, 0x43, 0x46, 0xe3, 0xc8, 0xc5, 0x1f, + 0xe9, 0x5d, 0x50, 0xdc, 0x16, 0x97, 0x97, 0x9b, 0xe5, 0x06, 0xba, 0xfc, 0x26, 0x71, 0x71, 0x39, 0x49, 0xb0, 0xc8, + 0x31, 0x4f, 0xd9, 0x08, 0x88, 0xf3, 0x5b, 0x7a, 0x17, 0xa8, 0xf1, 0x98, 0x75, 0x59, 0x0f, 0x2d, 0x0c, 0xea, 0x7d, + 0xab, 0xd8, 0xde, 0x06, 0x6d, 0x50, 0xf4, 0x64, 0xdf, 0x3e, 0xa9, 0xb4, 0x2b, 0xcd, 0x43, 0x84, 0xf2, 0x87, 0x2e, + 0x05, 0x7f, 0x6d, 0x8b, 0x36, 0x51, 0x49, 0x7d, 0x5d, 0xe9, 0x44, 0xa1, 0x43, 0x99, 0xeb, 0x71, 0xe9, 0xa5, 0xe6, + 0xd4, 0xe9, 0x3b, 0x08, 0x96, 0x23, 0xec, 0x6b, 0xa1, 0x07, 0x0d, 0xbe, 0x57, 0x29, 0x21, 0x65, 0x24, 0xe9, 0x65, + 0xd9, 0xcf, 0xb9, 0xf4, 0x00, 0xef, 0x90, 0xd2, 0x12, 0xca, 0xeb, 0x98, 0xb9, 0x49, 0x17, 0xfd, 0x41, 0x10, 0x6f, + 0x61, 0x96, 0x10, 0xa4, 0x36, 0x16, 0x45, 0x0e, 0x54, 0xa8, 0xe9, 0x4b, 0x65, 0x00, 0xb2, 0xa1, 0xc7, 0xd6, 0xa4, + 0x66, 0x22, 0xa5, 0xa6, 0x6f, 0x61, 0x7c, 0x8b, 0x94, 0xa4, 0x12, 0x19, 0x52, 0x89, 0x94, 0x42, 0x4f, 0x6f, 0xae, + 0x26, 0x21, 0x7b, 0x43, 0x8b, 0xeb, 0x73, 0x6a, 0xcf, 0x93, 0x0a, 0x58, 0x9e, 0x1c, 0x07, 0xe5, 0x01, 0x2c, 0x89, + 0xaa, 0x06, 0xb9, 0x71, 0xe7, 0xa4, 0x26, 0xbf, 0xd5, 0xe3, 0xbe, 0x59, 0x16, 0x31, 0x28, 0xf1, 0xc6, 0x68, 0x91, + 0x7a, 0x63, 0x9c, 0x40, 0x3e, 0x22, 0xcf, 0x0b, 0xf8, 0xa9, 0xbd, 0x1b, 0x95, 0x6c, 0xe5, 0xcd, 0x57, 0xfc, 0x40, + 0x99, 0x17, 0x90, 0xa3, 0x89, 0x53, 0xc3, 0x53, 0x52, 0x4f, 0xde, 0xb5, 0xb3, 0xb6, 0xed, 0x27, 0x9d, 0xa2, 0xa3, + 0x01, 0xfb, 0x41, 0x78, 0x0b, 0x6b, 0x15, 0xf6, 0x5d, 0x6e, 0x7d, 0xe5, 0x4f, 0x07, 0xfb, 0xca, 0x24, 0x52, 0x2f, + 0x23, 0x2b, 0x12, 0xe7, 0xfe, 0x5c, 0xcb, 0x5f, 0x66, 0x34, 0xbd, 0xbb, 0xa0, 0x90, 0xeb, 0xcc, 0xe1, 0xae, 0x6f, + 0xb9, 0x0d, 0x65, 0x9e, 0x7a, 0x37, 0x91, 0xca, 0x4a, 0x5e, 0xbd, 0x04, 0xb8, 0x7a, 0x45, 0x30, 0x97, 0xd1, 0x46, + 0xcb, 0x11, 0xa3, 0x4e, 0x0b, 0xdd, 0x7a, 0x79, 0x92, 0xb6, 0x19, 0xf8, 0xd7, 0x4a, 0x4c, 0xeb, 0x60, 0x01, 0xe6, + 0xf6, 0x85, 0xd4, 0x5e, 0xd6, 0x5f, 0xf5, 0xca, 0x40, 0x11, 0x84, 0xef, 0x92, 0xed, 0x4b, 0xdd, 0x94, 0x35, 0xbb, + 0x7d, 0xa9, 0x95, 0xa0, 0x9f, 0x4c, 0xf9, 0xc1, 0x7a, 0x9e, 0xe2, 0xf2, 0x32, 0xcb, 0x73, 0x94, 0x03, 0x78, 0x3f, + 0xb6, 0x3d, 0xef, 0x47, 0x9d, 0x34, 0xe8, 0x43, 0x2c, 0xf6, 0x22, 0xe6, 0x86, 0x89, 0x97, 0xf3, 0xff, 0xb8, 0x36, + 0xff, 0x8f, 0xd6, 0x95, 0x53, 0x30, 0x8d, 0x46, 0x09, 0x8d, 0x0c, 0xeb, 0x44, 0x8a, 0x00, 0xa5, 0xde, 0x96, 0x09, + 0xf2, 0xf1, 0x2a, 0x00, 0x8d, 0x6b, 0x31, 0xe4, 0x89, 0xa8, 0x0f, 0xc3, 0x09, 0x8b, 0xef, 0x82, 0x19, 0xab, 0x4f, + 0x78, 0xc2, 0xb3, 0x69, 0x38, 0xa0, 0x38, 0xbb, 0xcb, 0x04, 0x9d, 0xd4, 0x67, 0x0c, 0x3f, 0xa7, 0xf1, 0x9c, 0x0a, + 0x36, 0x08, 0xb1, 0x7b, 0x96, 0xb2, 0x30, 0x76, 0x5e, 0x85, 0x69, 0xca, 0x6f, 0x5c, 0xfc, 0x96, 0x5f, 0x73, 0xc1, + 0xf1, 0xeb, 0xdb, 0xbb, 0x11, 0x4d, 0xf0, 0xfb, 0xeb, 0x59, 0x22, 0x66, 0x38, 0x0b, 0x93, 0xac, 0x9e, 0xd1, 0x94, + 0x0d, 0xdb, 0x03, 0x1e, 0xf3, 0xb4, 0x0e, 0x29, 0xdb, 0x13, 0x1a, 0xc4, 0x6c, 0x34, 0x16, 0x4e, 0x14, 0xa6, 0x1f, + 0xdb, 0xf5, 0xfa, 0x34, 0x65, 0x93, 0x30, 0xbd, 0xab, 0xcb, 0x16, 0xc1, 0x97, 0x8d, 0x83, 0xf0, 0xf1, 0xf0, 0xb0, + 0x2d, 0xd2, 0x30, 0xc9, 0x18, 0x6c, 0x53, 0x10, 0xc6, 0xb1, 0x73, 0x70, 0xd4, 0x98, 0x64, 0x3b, 0x2a, 0x90, 0x17, + 0x26, 0x22, 0xbf, 0xc2, 0x1f, 0x01, 0x6e, 0xff, 0x5a, 0x24, 0xf8, 0x7a, 0x26, 0x04, 0x4f, 0x16, 0x83, 0x59, 0x9a, + 0xf1, 0x34, 0x98, 0x72, 0x96, 0x08, 0x9a, 0xb6, 0xaf, 0x79, 0x1a, 0xd1, 0xb4, 0x9e, 0x86, 0x11, 0x9b, 0x65, 0xc1, + 0xe1, 0xf4, 0xb6, 0x0d, 0x9a, 0xc5, 0x28, 0xe5, 0xb3, 0x24, 0xd2, 0x73, 0xb1, 0x64, 0x4c, 0x53, 0x26, 0xec, 0x0a, + 0xf9, 0x0a, 0x93, 0x20, 0x66, 0x09, 0x0d, 0xd3, 0xfa, 0x08, 0x3a, 0x83, 0x59, 0xd4, 0x88, 0xe8, 0x08, 0xa7, 0xa3, + 0xeb, 0xd0, 0x6b, 0xb6, 0x1e, 0x61, 0xf3, 0xbf, 0x7f, 0x84, 0x9c, 0xc6, 0xe6, 0xe2, 0x66, 0xa3, 0xf1, 0x27, 0xd4, + 0x5e, 0x99, 0x45, 0x02, 0x14, 0x34, 0xa7, 0xb7, 0x4e, 0xc6, 0x21, 0xa7, 0x6d, 0x53, 0xcf, 0xf6, 0x34, 0x8c, 0x20, + 0x21, 0x38, 0x68, 0x4d, 0x6f, 0x73, 0x58, 0x5d, 0xa0, 0x92, 0x4c, 0xf5, 0x22, 0xf5, 0xd3, 0xe2, 0xb7, 0x42, 0x7c, + 0xb2, 0x19, 0xe2, 0x96, 0x81, 0xb8, 0xc4, 0x7a, 0x3d, 0x9a, 0xa5, 0x32, 0xb6, 0x1a, 0x34, 0x33, 0x05, 0xc8, 0x98, + 0xcf, 0x69, 0x6a, 0xe0, 0x90, 0x0f, 0xbf, 0x19, 0x8c, 0xd6, 0x66, 0x30, 0x4e, 0x3e, 0x05, 0x46, 0x9a, 0x44, 0x8b, + 0xea, 0xbe, 0x36, 0x53, 0x3a, 0x69, 0x8f, 0x29, 0xd0, 0x53, 0xd0, 0x82, 0xdf, 0x37, 0x2c, 0x12, 0x63, 0xf5, 0x53, + 0x92, 0xf3, 0x8d, 0xaa, 0x3b, 0x6a, 0x34, 0xd4, 0x73, 0xc6, 0x7e, 0xa5, 0x41, 0xd3, 0x87, 0x06, 0xf9, 0x15, 0xfe, + 0x5b, 0x71, 0x99, 0xb7, 0xca, 0x3d, 0xf1, 0xb7, 0xf6, 0x2d, 0x5f, 0x2b, 0x49, 0xb1, 0xbc, 0x11, 0x8d, 0x53, 0x23, + 0x2b, 0x95, 0xf0, 0x01, 0xb7, 0x9d, 0x3c, 0x4f, 0x84, 0x75, 0x8a, 0x5b, 0x9c, 0xac, 0xfb, 0xad, 0xca, 0xbb, 0x08, + 0x20, 0xd2, 0x61, 0x25, 0x1b, 0xf2, 0x76, 0xd2, 0x21, 0x8d, 0x76, 0x52, 0xaf, 0x23, 0x8f, 0x93, 0xb4, 0x97, 0xe8, + 0xf4, 0x3c, 0x8f, 0x75, 0xb9, 0x34, 0xb6, 0x33, 0x14, 0x70, 0xb8, 0x6a, 0xba, 0x5c, 0x96, 0x61, 0x00, 0x26, 0xaf, + 0x6b, 0xfc, 0x4d, 0xe8, 0x06, 0x38, 0xb3, 0x38, 0x79, 0x62, 0x5e, 0xec, 0x92, 0x1a, 0x5e, 0x11, 0xf3, 0x81, 0xc4, + 0x9c, 0x3f, 0x0d, 0xc5, 0x18, 0xbc, 0x14, 0x85, 0xf8, 0x29, 0x93, 0x98, 0xdc, 0x7d, 0x17, 0x75, 0xd3, 0x22, 0xc3, + 0x0d, 0x32, 0xf9, 0xd2, 0x1c, 0x46, 0xf9, 0x4e, 0x10, 0x18, 0x11, 0x7f, 0x43, 0x94, 0x4d, 0x67, 0x2c, 0xba, 0xe1, + 0x43, 0x2d, 0x3a, 0x9a, 0x08, 0x26, 0x73, 0xb7, 0x4d, 0xc4, 0x61, 0x1c, 0x66, 0x97, 0x03, 0x75, 0x57, 0x32, 0x2b, + 0x6f, 0x06, 0x84, 0x12, 0x7a, 0x65, 0xa4, 0xd1, 0x54, 0xda, 0xa3, 0x3f, 0x8a, 0xad, 0xf6, 0x49, 0x7a, 0x9f, 0x7d, + 0x52, 0x2c, 0x3c, 0xe3, 0xb3, 0x74, 0x00, 0xe1, 0x48, 0x2d, 0xf5, 0xd6, 0x1d, 0x37, 0xae, 0x54, 0x31, 0x5c, 0x2c, + 0xac, 0x4c, 0x50, 0x81, 0x99, 0xfd, 0x52, 0x09, 0x2a, 0x43, 0x5e, 0xea, 0xbe, 0x86, 0x16, 0x71, 0x66, 0x49, 0x20, + 0xb3, 0x23, 0x99, 0xd4, 0xe8, 0x25, 0xa4, 0x93, 0xf8, 0xb3, 0x84, 0xfd, 0x32, 0xa3, 0x97, 0x0c, 0x74, 0x4d, 0xe6, + 0xb3, 0x48, 0xc6, 0x9a, 0x40, 0xf6, 0xd5, 0x9b, 0x10, 0xbc, 0x60, 0x91, 0xda, 0x98, 0x44, 0x56, 0xea, 0xdc, 0x26, + 0xb7, 0xee, 0x82, 0xbf, 0x18, 0xb4, 0x03, 0x86, 0x23, 0x3e, 0x09, 0x59, 0x12, 0x48, 0x97, 0x6f, 0x31, 0x58, 0x00, + 0xad, 0x31, 0x8b, 0x82, 0x44, 0x6f, 0x4f, 0x13, 0xf9, 0x1f, 0x38, 0x4b, 0x64, 0xd7, 0xbc, 0xcd, 0x25, 0x42, 0x15, + 0xfa, 0x88, 0x41, 0xf0, 0x99, 0x92, 0x6b, 0x1c, 0x61, 0xbb, 0xba, 0xb8, 0x76, 0x5e, 0xd9, 0x81, 0xc6, 0xca, 0x46, + 0x29, 0x23, 0x80, 0xaf, 0x96, 0x66, 0x3c, 0x15, 0x9e, 0x37, 0xc6, 0x31, 0x22, 0x9d, 0xb1, 0x74, 0x76, 0x9d, 0xc6, + 0xf2, 0x4f, 0xb7, 0xde, 0x0c, 0x9a, 0x85, 0xf9, 0x5e, 0xb9, 0x0d, 0xac, 0x92, 0xa3, 0xf4, 0x8d, 0x52, 0xb9, 0x8c, + 0xe2, 0xb7, 0x5a, 0x6a, 0xf9, 0x5c, 0x2c, 0x17, 0xeb, 0xe3, 0xa6, 0x44, 0x95, 0x57, 0x01, 0x42, 0x06, 0x8b, 0xb6, + 0x4c, 0x85, 0xf2, 0x72, 0xdd, 0x85, 0x2a, 0x79, 0xa5, 0x44, 0xf4, 0xe5, 0xee, 0x22, 0xd5, 0x33, 0xe6, 0x57, 0xcc, + 0x38, 0x99, 0xaa, 0x24, 0x97, 0x6b, 0x8c, 0x58, 0x7a, 0xe8, 0xa6, 0x66, 0x0a, 0x96, 0x3b, 0x92, 0x6e, 0xa4, 0x5b, + 0x5f, 0x3d, 0xd2, 0x94, 0x94, 0xe1, 0xae, 0xb5, 0x01, 0x20, 0x57, 0x6f, 0x13, 0x60, 0x60, 0xb6, 0x66, 0xc2, 0x2c, + 0x01, 0xb4, 0xb1, 0x21, 0x85, 0x8b, 0x34, 0x57, 0xbb, 0x8b, 0xef, 0x44, 0xbe, 0x6f, 0x35, 0x95, 0xbf, 0x59, 0x04, + 0x7f, 0x41, 0x02, 0x2e, 0x94, 0x52, 0x1a, 0xb8, 0x6f, 0x5e, 0x5f, 0xbc, 0x73, 0xf1, 0x35, 0x8f, 0xee, 0x02, 0x57, + 0xa4, 0x33, 0xea, 0xe6, 0xc8, 0x17, 0x63, 0x9a, 0x14, 0x2f, 0xe3, 0xe1, 0x31, 0xf5, 0x63, 0x3e, 0x52, 0x97, 0x32, + 0x57, 0x8d, 0xe4, 0xc1, 0xd5, 0xa9, 0x7c, 0xc9, 0x54, 0xe7, 0x54, 0xa8, 0xd7, 0x7b, 0x89, 0x14, 0x7e, 0x76, 0x20, + 0x84, 0x72, 0xba, 0x2f, 0xc6, 0xf2, 0xe1, 0x02, 0x0e, 0x8c, 0x7c, 0xda, 0x5d, 0xac, 0x11, 0x53, 0x17, 0x86, 0x18, + 0x77, 0xd4, 0x12, 0x32, 0xd9, 0xea, 0x2a, 0x18, 0x5c, 0x5d, 0xe5, 0xa7, 0xfb, 0x30, 0xd6, 0xbe, 0x19, 0x17, 0x20, + 0x34, 0xfd, 0x0b, 0x02, 0x83, 0x97, 0x0d, 0xa5, 0xa4, 0x03, 0x43, 0xc0, 0xbc, 0x51, 0x07, 0x16, 0x09, 0x04, 0x06, + 0xbd, 0xa3, 0xa2, 0x44, 0x9e, 0x58, 0x55, 0xb4, 0x0d, 0x02, 0xd5, 0xb0, 0xa4, 0x7b, 0xe5, 0x4d, 0x2d, 0xf7, 0xd7, + 0x80, 0x14, 0xd9, 0xd0, 0x5d, 0x21, 0xf8, 0x2b, 0x21, 0x3b, 0xdd, 0x57, 0x78, 0xb8, 0xb2, 0x5f, 0x6d, 0xa2, 0x5e, + 0x3b, 0x50, 0x60, 0xab, 0x97, 0x09, 0xfc, 0x51, 0xe0, 0x8f, 0x57, 0xb2, 0xa9, 0x11, 0x46, 0xa0, 0x25, 0x81, 0xd0, + 0x6e, 0x18, 0xad, 0x63, 0xc0, 0xe3, 0x38, 0x9c, 0x66, 0x34, 0x30, 0x3f, 0xb4, 0x5c, 0x02, 0xf1, 0xb6, 0xae, 0x08, + 0xe8, 0xf4, 0x9a, 0x73, 0x50, 0x17, 0xd6, 0xb5, 0x94, 0x79, 0x98, 0x7a, 0xf5, 0xfa, 0xa0, 0x7e, 0x3d, 0x42, 0xb9, + 0x18, 0x2f, 0x6c, 0xa9, 0x76, 0xdc, 0x68, 0xb4, 0x21, 0x17, 0xb2, 0x1e, 0xc6, 0x6c, 0x94, 0x04, 0x31, 0x1d, 0x8a, + 0x5c, 0xc0, 0x2d, 0xb5, 0x85, 0x51, 0x23, 0xfc, 0xd6, 0x51, 0x4a, 0x27, 0x8e, 0x0f, 0xff, 0xde, 0x3f, 0x71, 0x2e, + 0xa2, 0x20, 0x11, 0xe3, 0xba, 0xcc, 0xba, 0x85, 0x3b, 0x03, 0x62, 0x5c, 0x79, 0x5e, 0x58, 0x13, 0x0d, 0x28, 0xa8, + 0x58, 0xb9, 0x48, 0x1d, 0x31, 0xc6, 0x22, 0xb5, 0xdb, 0x25, 0x68, 0xb1, 0xb6, 0x82, 0x75, 0x49, 0x7f, 0x80, 0xf2, + 0x4c, 0x2a, 0xc6, 0xeb, 0x8d, 0x8d, 0xba, 0x54, 0x7d, 0x5a, 0x43, 0x9f, 0xa5, 0xd8, 0xe5, 0xca, 0xb1, 0xbc, 0x50, + 0x3d, 0x1e, 0x82, 0xcc, 0x8a, 0xca, 0x89, 0xed, 0x1e, 0x28, 0x67, 0xc9, 0x74, 0x26, 0x7a, 0xd2, 0xa9, 0x9d, 0xc2, + 0x05, 0x89, 0x3e, 0xb6, 0x4a, 0x00, 0x07, 0xfd, 0x85, 0x02, 0x66, 0x10, 0xc6, 0x03, 0x0f, 0x20, 0x72, 0xea, 0xce, + 0x49, 0x4a, 0x27, 0xa8, 0x3d, 0x61, 0x49, 0x5d, 0xd5, 0x1d, 0x59, 0x6a, 0x89, 0xff, 0x08, 0x9e, 0x72, 0x5f, 0x8e, + 0x86, 0x65, 0xee, 0xea, 0x06, 0x5c, 0x5e, 0xf5, 0xf3, 0xbc, 0x9d, 0x0a, 0xaf, 0xf7, 0xd2, 0x43, 0x7d, 0xfc, 0x8d, + 0xf5, 0x72, 0x16, 0xd7, 0x1c, 0x15, 0x17, 0xb7, 0xd0, 0x96, 0x26, 0xf6, 0x59, 0x90, 0xcd, 0xbe, 0x21, 0xd0, 0xf0, + 0xb9, 0xe7, 0xd2, 0x6c, 0x5a, 0x57, 0xbc, 0xab, 0x2e, 0x49, 0xd6, 0x85, 0xae, 0x48, 0x7b, 0x6a, 0x7f, 0x14, 0x0b, + 0xc9, 0x96, 0xf4, 0x25, 0x0d, 0xe5, 0x4c, 0xe8, 0x17, 0x97, 0x7a, 0xf4, 0xb3, 0x7d, 0x8d, 0x07, 0x55, 0xf8, 0xc9, + 0xd5, 0x59, 0x95, 0xc7, 0x01, 0x5f, 0x2a, 0x5e, 0x60, 0x17, 0xc6, 0x31, 0x4c, 0x78, 0x65, 0xd4, 0x17, 0xfb, 0xa5, + 0x1f, 0x3d, 0xd1, 0xf7, 0x50, 0xae, 0xcf, 0xe9, 0x13, 0xa9, 0x52, 0x5a, 0x6f, 0xcd, 0xdb, 0x11, 0x26, 0x58, 0xa4, + 0xa4, 0x2f, 0x83, 0x70, 0x77, 0x25, 0x2f, 0xba, 0x5d, 0xf2, 0x2e, 0xa5, 0x90, 0x3a, 0x72, 0x41, 0xc4, 0x4d, 0x93, + 0xc8, 0x75, 0xfe, 0x32, 0x88, 0xd9, 0xe0, 0x23, 0x71, 0x77, 0x17, 0x1e, 0x5a, 0xbf, 0xf6, 0x28, 0xb9, 0x82, 0x61, + 0xd8, 0xa8, 0xea, 0x48, 0x4f, 0x7c, 0x8b, 0x17, 0xab, 0xb7, 0xe2, 0xb8, 0x9d, 0xdd, 0x05, 0x30, 0x1e, 0x35, 0x4f, + 0xe7, 0x2a, 0xbf, 0x2c, 0xdf, 0x75, 0x55, 0x42, 0x01, 0x68, 0x56, 0xe5, 0x8e, 0x24, 0x2a, 0xe2, 0x7e, 0x92, 0xd2, + 0x5c, 0x47, 0x31, 0x35, 0x80, 0x53, 0x68, 0xfe, 0xe6, 0x3a, 0x7f, 0x29, 0xca, 0x68, 0xe1, 0xd1, 0x90, 0x29, 0x19, + 0xc4, 0x85, 0xb9, 0xc0, 0x8c, 0xf5, 0x23, 0x2a, 0x42, 0x16, 0xab, 0x2e, 0x6d, 0x63, 0x80, 0xaf, 0xac, 0x68, 0xb9, + 0xcc, 0xaa, 0x6b, 0x61, 0x55, 0x0c, 0xca, 0x95, 0x9d, 0xee, 0x97, 0x70, 0xcb, 0x95, 0xc9, 0x33, 0x69, 0x87, 0x06, + 0xcb, 0x15, 0xaa, 0x3a, 0xe7, 0x2f, 0x03, 0x79, 0x6d, 0x08, 0x00, 0xe4, 0x1a, 0x40, 0x08, 0x5a, 0xab, 0x6b, 0x31, + 0x5e, 0x4c, 0xb8, 0x2f, 0xc2, 0x74, 0x44, 0xc5, 0x0a, 0x62, 0x63, 0x95, 0xa3, 0xda, 0x36, 0x01, 0xea, 0x35, 0x68, + 0xc3, 0x2a, 0xb4, 0x57, 0x80, 0xf4, 0xee, 0xee, 0x82, 0xe5, 0x64, 0x77, 0x41, 0x93, 0x01, 0x8f, 0xe8, 0xfb, 0xb7, + 0xdf, 0xc0, 0x25, 0x47, 0x9e, 0x80, 0x61, 0x31, 0x46, 0x20, 0x38, 0xe5, 0xe6, 0x28, 0x11, 0xc2, 0xa5, 0x08, 0x51, + 0x9c, 0xc0, 0x91, 0x73, 0x49, 0x10, 0x73, 0xd7, 0xe9, 0x2a, 0xc8, 0x69, 0xa4, 0x60, 0x26, 0x89, 0xec, 0xc5, 0xf3, + 0xd3, 0x7d, 0xd5, 0x5a, 0x89, 0x00, 0xd5, 0x08, 0x90, 0x20, 0xcf, 0x69, 0x89, 0x03, 0xc8, 0x6b, 0xb6, 0xf1, 0x10, + 0xb1, 0x79, 0x41, 0x6c, 0xf2, 0x02, 0x55, 0xe7, 0x34, 0x0e, 0xaf, 0x69, 0xdc, 0xd9, 0x5d, 0x24, 0xcb, 0x65, 0x23, + 0x3f, 0xdd, 0x57, 0x8f, 0xce, 0xa9, 0xe4, 0x1b, 0xea, 0x85, 0x97, 0x72, 0x8b, 0xe1, 0x56, 0x22, 0x64, 0x7b, 0x9a, + 0x34, 0xa7, 0x40, 0x0f, 0x90, 0xbb, 0x8e, 0x4c, 0xb0, 0x90, 0x8d, 0x0a, 0x85, 0x28, 0x77, 0x1d, 0x16, 0xad, 0x97, + 0x65, 0x82, 0x4e, 0xa1, 0x74, 0xbc, 0x5c, 0x36, 0x73, 0xd7, 0x99, 0xb0, 0x04, 0x9e, 0x92, 0xe5, 0x52, 0x5e, 0xf8, + 0x9b, 0xb0, 0xc4, 0x6b, 0x00, 0xd9, 0xba, 0xce, 0x24, 0xbc, 0x95, 0x0b, 0x36, 0x35, 0xe1, 0xad, 0xd7, 0xd4, 0x55, + 0x7e, 0x81, 0x9f, 0x0c, 0x28, 0xae, 0xdc, 0xd1, 0x58, 0xef, 0x68, 0x84, 0x67, 0xea, 0x2a, 0x13, 0xf1, 0x22, 0x12, + 0x6f, 0xde, 0xd1, 0xc8, 0xec, 0xe8, 0x6c, 0xcb, 0x8e, 0xce, 0xee, 0xd9, 0xd1, 0x50, 0xef, 0x9e, 0x53, 0xe0, 0x8e, + 0x2f, 0x97, 0xcd, 0x46, 0x89, 0xbd, 0xd3, 0xfd, 0x88, 0xcd, 0x61, 0x37, 0x40, 0xcd, 0x13, 0x6c, 0x42, 0x37, 0x13, + 0x65, 0x15, 0xc5, 0xf4, 0xb3, 0x30, 0x59, 0x62, 0x21, 0xa9, 0x62, 0xc1, 0xa6, 0xeb, 0x22, 0xe6, 0xf6, 0x47, 0x52, + 0x36, 0x03, 0x3c, 0x64, 0x80, 0x87, 0xb1, 0x79, 0x01, 0xa6, 0xe7, 0xbe, 0x73, 0xb1, 0xeb, 0xb8, 0x86, 0xac, 0xaf, + 0xf2, 0x4b, 0x90, 0x11, 0x72, 0x7d, 0x0f, 0xa2, 0x45, 0x68, 0xed, 0x76, 0xb6, 0xd3, 0x1c, 0x84, 0xc7, 0x6f, 0x78, + 0x1a, 0xb9, 0x81, 0x6a, 0xfa, 0x59, 0xa8, 0x9a, 0xb0, 0x44, 0x27, 0x5b, 0x6d, 0xa5, 0xb5, 0xb2, 0xde, 0xa6, 0xb8, + 0xd6, 0xd1, 0x91, 0x6a, 0x31, 0x0d, 0x85, 0xa0, 0x69, 0xa2, 0x29, 0xd7, 0x75, 0xff, 0xbf, 0xa0, 0xc2, 0x0d, 0x7c, + 0x25, 0x34, 0x1b, 0x60, 0x08, 0x50, 0x2b, 0xec, 0x9a, 0xe7, 0x2b, 0xf1, 0xb4, 0x53, 0x6a, 0xb0, 0x77, 0xc8, 0x36, + 0x1a, 0x54, 0x11, 0xd8, 0x30, 0xb3, 0x09, 0x8d, 0x2e, 0x25, 0x83, 0xee, 0x0e, 0xae, 0xb4, 0xc2, 0xba, 0x22, 0xee, + 0xca, 0x0e, 0xd8, 0xfd, 0x79, 0xd6, 0x7a, 0x74, 0x78, 0xee, 0x62, 0xc5, 0xe3, 0xf9, 0x70, 0xe8, 0xa2, 0xdc, 0x79, + 0x58, 0xb7, 0xe6, 0xe1, 0xcf, 0xb3, 0xaf, 0x9f, 0x35, 0xbe, 0x2e, 0x3a, 0x27, 0x40, 0x44, 0x3a, 0xbe, 0x6f, 0x44, + 0x95, 0x05, 0xaf, 0x59, 0xd1, 0x30, 0x4c, 0xb6, 0x2f, 0xa7, 0x67, 0x2f, 0x27, 0x9b, 0x52, 0x1a, 0x01, 0x71, 0xe2, + 0xb5, 0xd2, 0xcb, 0x98, 0xce, 0xa9, 0x79, 0xf3, 0xe0, 0x86, 0xc9, 0x36, 0xf4, 0x18, 0xf0, 0x59, 0x22, 0x74, 0xa2, + 0x83, 0x66, 0xb5, 0xd6, 0x92, 0xae, 0xe4, 0x1a, 0x6c, 0x1b, 0xe1, 0x4e, 0xc9, 0xb9, 0xaa, 0xf4, 0xca, 0xaf, 0xb0, + 0x6b, 0x01, 0xb0, 0x15, 0xb2, 0xee, 0x96, 0xf2, 0xa0, 0x81, 0x1b, 0xdb, 0x60, 0xc3, 0x4d, 0x14, 0xb8, 0x6e, 0xdf, + 0xe0, 0x49, 0xfa, 0x2a, 0x2b, 0x2f, 0x8c, 0xd8, 0x8a, 0xaf, 0x4f, 0x62, 0xe0, 0x3a, 0x85, 0xc1, 0x12, 0x9a, 0x65, + 0x5b, 0x11, 0x50, 0x6c, 0x22, 0x76, 0xcb, 0xd6, 0xee, 0x96, 0x51, 0x70, 0x03, 0xc3, 0x09, 0x93, 0x00, 0x17, 0x11, + 0x53, 0xdd, 0x8a, 0x0e, 0x87, 0x74, 0x50, 0xb8, 0x7a, 0x21, 0xf6, 0x35, 0x64, 0xb1, 0x80, 0x10, 0x90, 0x8c, 0xcd, + 0xb8, 0xaf, 0x78, 0x42, 0x5d, 0x64, 0xb2, 0x39, 0x35, 0xfc, 0x5a, 0xfe, 0x6f, 0x86, 0x47, 0x8d, 0x58, 0x85, 0x45, + 0xcf, 0xb2, 0x5c, 0x1a, 0x37, 0x4f, 0xa5, 0xbc, 0x8a, 0x48, 0x2e, 0xfd, 0x38, 0xdb, 0x0e, 0xd0, 0xc3, 0x8e, 0xc9, + 0xa2, 0xf9, 0xf5, 0x51, 0xb3, 0x91, 0xbb, 0xd8, 0x85, 0xe1, 0x1e, 0x7a, 0x4a, 0x64, 0xaf, 0x03, 0xe8, 0x35, 0x4b, + 0x3e, 0xa7, 0x5f, 0xab, 0xf9, 0xb8, 0xe9, 0x62, 0xf5, 0x22, 0x01, 0x94, 0x17, 0xcc, 0x60, 0x00, 0xce, 0xcf, 0xdf, + 0xbd, 0x94, 0xea, 0xe0, 0x0f, 0x83, 0xe7, 0xb8, 0xd9, 0x70, 0xb1, 0x9b, 0x09, 0x3e, 0xfd, 0x8c, 0x25, 0x1c, 0xb8, + 0xd8, 0x1d, 0xc4, 0x3c, 0xa3, 0xf6, 0x1a, 0x94, 0x3a, 0xfb, 0xfb, 0x17, 0xa1, 0x20, 0x9a, 0xa6, 0x34, 0xcb, 0x1c, + 0x7b, 0x7c, 0x4d, 0x4a, 0x9f, 0x60, 0x98, 0x1b, 0x29, 0x2e, 0xa3, 0x42, 0xe2, 0x45, 0xdd, 0xf1, 0xb7, 0xa9, 0x4a, + 0x95, 0xad, 0x11, 0x9b, 0x14, 0x01, 0x05, 0x63, 0x53, 0xda, 0xd5, 0x27, 0x67, 0xde, 0x70, 0xf4, 0xd4, 0xc4, 0x2a, + 0x26, 0xbc, 0x3e, 0x41, 0xa5, 0x64, 0xc2, 0x92, 0xcb, 0x0d, 0xa5, 0xe1, 0xed, 0x86, 0x52, 0x50, 0xd9, 0x0a, 0xe8, + 0xf4, 0xeb, 0x67, 0x3e, 0x8d, 0xf5, 0x52, 0xf1, 0xb1, 0x41, 0x8c, 0xa4, 0xdf, 0xf2, 0x13, 0x90, 0x5a, 0xdb, 0x20, + 0x47, 0xf8, 0xed, 0xd3, 0x41, 0xc9, 0xe7, 0x4c, 0x57, 0x8c, 0xf2, 0xfb, 0x56, 0x08, 0xa5, 0x75, 0xf0, 0x5f, 0xc7, + 0x9f, 0xb5, 0x56, 0x7a, 0xfb, 0x69, 0x82, 0xb3, 0xb4, 0xaa, 0xdf, 0xb1, 0xf5, 0xfa, 0x1e, 0xfb, 0xea, 0xde, 0x6f, + 0x28, 0xd6, 0x8a, 0x4f, 0xb1, 0xff, 0x83, 0x98, 0x4d, 0x4a, 0x12, 0x58, 0x07, 0x53, 0x6a, 0x3c, 0x90, 0xcc, 0x64, + 0x0f, 0xa2, 0x54, 0x9f, 0x4b, 0xb8, 0xa2, 0x09, 0xef, 0xc1, 0x98, 0xa5, 0xf4, 0x32, 0xe6, 0x37, 0xab, 0xef, 0xf5, + 0xda, 0xde, 0x78, 0xcc, 0x46, 0x63, 0xeb, 0xde, 0x15, 0x25, 0xc5, 0x26, 0xdc, 0x3b, 0x41, 0xfe, 0x2f, 0xff, 0xec, + 0xfb, 0xff, 0xf2, 0xcf, 0x9f, 0x6c, 0x0a, 0xc3, 0xe7, 0x57, 0x58, 0x94, 0xc3, 0x6e, 0x3f, 0x5d, 0x9b, 0x67, 0xaa, + 0xe2, 0x7c, 0x73, 0x9b, 0xb5, 0x4d, 0x80, 0xfa, 0xb5, 0x2d, 0x58, 0x2b, 0x54, 0xa7, 0xcf, 0xf9, 0x2d, 0x80, 0xc1, + 0xba, 0x3e, 0x09, 0x19, 0x34, 0xfa, 0x5d, 0xa0, 0x5d, 0xa1, 0xe0, 0x41, 0x3b, 0xf2, 0xdb, 0x31, 0xfc, 0xa9, 0x35, + 0xfc, 0x4e, 0xf0, 0xb5, 0x7f, 0x62, 0x70, 0x75, 0x55, 0x24, 0xd8, 0xd9, 0x5d, 0xe1, 0x02, 0x7f, 0x77, 0xad, 0x44, + 0x2b, 0x1e, 0x41, 0x03, 0x75, 0xe4, 0xf5, 0x40, 0x32, 0xb8, 0x7a, 0x09, 0x6f, 0xed, 0x39, 0xbd, 0x4e, 0x8d, 0x83, + 0xf7, 0x1e, 0xe1, 0x00, 0x43, 0x54, 0x57, 0x25, 0x07, 0x5d, 0x93, 0x0c, 0x50, 0x0a, 0xe6, 0x06, 0x80, 0x89, 0x07, + 0x57, 0xda, 0xda, 0x3c, 0x57, 0x6e, 0x98, 0x60, 0x95, 0xb4, 0xb5, 0x7b, 0xa6, 0x82, 0x74, 0xec, 0xbc, 0x93, 0xf8, + 0x92, 0x8d, 0x69, 0x69, 0xdd, 0x4b, 0x57, 0x17, 0xd8, 0x11, 0x57, 0xb9, 0x0c, 0xd3, 0xff, 0x75, 0x5b, 0x24, 0xf1, + 0xef, 0x9f, 0x8e, 0x24, 0xf2, 0x07, 0x45, 0x12, 0xff, 0xfe, 0x87, 0x47, 0x12, 0xff, 0x6a, 0x47, 0x12, 0x61, 0x13, + 0x7f, 0x79, 0x50, 0xb4, 0xcf, 0x44, 0x62, 0xf8, 0x4d, 0x46, 0x9a, 0x5a, 0x8d, 0x8e, 0xf9, 0x08, 0x42, 0x7d, 0xff, + 0xf6, 0x91, 0xbb, 0x98, 0x8f, 0xec, 0xb8, 0x1d, 0xbc, 0xb5, 0x15, 0x02, 0x75, 0x6d, 0x13, 0x61, 0xd3, 0xb1, 0xb2, + 0x46, 0x71, 0x23, 0xa5, 0x7e, 0x68, 0xde, 0xa0, 0xe0, 0x06, 0xc5, 0x5b, 0x90, 0x1a, 0xb8, 0x65, 0xa2, 0x69, 0x81, + 0x0c, 0xc4, 0x15, 0x1d, 0x5b, 0x35, 0x73, 0xdd, 0xc2, 0x1e, 0xa1, 0x6d, 0xde, 0xf2, 0xa2, 0x6e, 0xdf, 0x2f, 0xdc, + 0x9f, 0x6f, 0x9b, 0x4f, 0x7a, 0xcd, 0xf6, 0x41, 0x73, 0xe2, 0x06, 0x2e, 0x88, 0x48, 0x59, 0xd0, 0x68, 0x1f, 0x1c, + 0x40, 0xc1, 0x8d, 0x55, 0xd0, 0x82, 0x02, 0x66, 0x15, 0x1c, 0x41, 0xc1, 0xc0, 0x2a, 0x38, 0x86, 0x82, 0xc8, 0x2a, + 0x78, 0x04, 0x05, 0x73, 0x37, 0xef, 0xb1, 0x02, 0xdc, 0x47, 0xa8, 0x8f, 0x95, 0xe5, 0x62, 0xca, 0x1e, 0xe1, 0x26, + 0x84, 0xf0, 0xc2, 0x91, 0xcc, 0x3c, 0x02, 0x87, 0x60, 0xc0, 0xf1, 0xcd, 0x98, 0x26, 0x01, 0x04, 0x51, 0x9f, 0x4a, + 0x19, 0xe3, 0x0b, 0xfe, 0x8e, 0x4d, 0xa8, 0xf9, 0x5e, 0x86, 0xc1, 0x83, 0xe3, 0xa2, 0x5e, 0xa3, 0x9f, 0xb7, 0x8b, + 0x9d, 0x53, 0xb1, 0x3f, 0x9d, 0x85, 0xa2, 0xf6, 0xb2, 0xac, 0x53, 0xd3, 0xd5, 0x8b, 0x3d, 0xdf, 0x12, 0x43, 0xb2, + 0x7c, 0x11, 0xc3, 0x98, 0xdf, 0xd4, 0x6f, 0xdd, 0xce, 0xe6, 0xb8, 0x12, 0x40, 0x54, 0xc4, 0x95, 0xe4, 0x9a, 0x8a, + 0xa7, 0x77, 0xe1, 0xa8, 0xf8, 0xfd, 0x92, 0x66, 0x59, 0x38, 0xd2, 0x2d, 0xb7, 0xc7, 0x91, 0x24, 0x88, 0x76, 0x0c, + 0xc9, 0x00, 0x01, 0xb1, 0x20, 0xd8, 0x2c, 0xb0, 0xe5, 0x75, 0x68, 0x08, 0xb0, 0x53, 0x8d, 0x2a, 0xc9, 0xe9, 0xab, + 0x45, 0x22, 0x1c, 0x95, 0x05, 0xa7, 0xd3, 0x94, 0xca, 0x52, 0x85, 0xe1, 0xfc, 0x74, 0x1f, 0x0a, 0x54, 0xf5, 0x96, + 0xe8, 0x91, 0x71, 0x1c, 0x6c, 0x8f, 0x21, 0x39, 0x26, 0x7a, 0x64, 0xe7, 0xdb, 0x14, 0xc9, 0x36, 0xeb, 0x31, 0x8b, + 0x2f, 0x9b, 0x03, 0xf8, 0x4f, 0x47, 0x44, 0xbe, 0x1c, 0x0e, 0x87, 0xf7, 0x46, 0x93, 0xbe, 0x8c, 0x86, 0xb4, 0x45, + 0x8f, 0xda, 0x90, 0x8b, 0x51, 0xd7, 0x31, 0x88, 0x66, 0x2e, 0x71, 0xb7, 0x78, 0x58, 0x63, 0x08, 0x57, 0x88, 0xf1, + 0xe2, 0xe1, 0x91, 0xa5, 0x7c, 0x9a, 0xd2, 0xc5, 0x24, 0x4c, 0x47, 0x2c, 0x09, 0x1a, 0xb9, 0x3f, 0xd7, 0xa1, 0x98, + 0x2f, 0x4f, 0x4e, 0x4e, 0x72, 0x3f, 0x32, 0x4f, 0x8d, 0x28, 0xca, 0xfd, 0xc1, 0xa2, 0x58, 0x46, 0xa3, 0x31, 0x1c, + 0xe6, 0x3e, 0x33, 0x05, 0x07, 0xad, 0x41, 0x74, 0xd0, 0xca, 0xfd, 0x1b, 0xab, 0x45, 0xee, 0x53, 0xfd, 0x94, 0xd2, + 0xa8, 0x92, 0xd0, 0xf1, 0xa8, 0xd1, 0xc8, 0x7d, 0x45, 0x68, 0x0b, 0x30, 0xc7, 0xd4, 0xcf, 0x20, 0x9c, 0x09, 0x0e, + 0x2c, 0xb9, 0xcd, 0x85, 0xd7, 0xbb, 0xd4, 0x2f, 0xcb, 0x50, 0x1f, 0x96, 0xc8, 0x51, 0x1f, 0xff, 0x62, 0x07, 0x4d, + 0x80, 0x98, 0x65, 0xb0, 0x84, 0x9b, 0x98, 0x4a, 0xa5, 0x1a, 0x28, 0x4b, 0x56, 0xff, 0x42, 0x78, 0x19, 0x4b, 0x01, + 0xfe, 0x03, 0x2d, 0xd5, 0x5b, 0xdd, 0x04, 0xdd, 0xc2, 0xf5, 0x29, 0xfd, 0x24, 0xd7, 0xbf, 0x7b, 0x08, 0xd3, 0xa7, + 0xf4, 0x8f, 0x66, 0xfa, 0xfa, 0xd5, 0xa7, 0x8a, 0xe9, 0x2b, 0xb6, 0x36, 0x11, 0xc4, 0x1d, 0x8c, 0xe9, 0xe0, 0xe3, + 0x35, 0xbf, 0xad, 0xc3, 0x91, 0x48, 0x5d, 0xc9, 0x4f, 0x77, 0x7f, 0x6b, 0xf2, 0x87, 0x19, 0xcc, 0xfa, 0x2e, 0x85, + 0x14, 0x9b, 0xaf, 0x13, 0xe2, 0xbe, 0x36, 0x36, 0x9d, 0x2a, 0x19, 0x0e, 0x89, 0xfb, 0x7a, 0x38, 0x74, 0xcd, 0x95, + 0xbf, 0x50, 0x50, 0xd9, 0xea, 0x55, 0xa5, 0x44, 0xb6, 0xfa, 0xfa, 0x6b, 0xbb, 0xcc, 0x2e, 0xd0, 0x21, 0x17, 0x3b, + 0xbc, 0xa2, 0x6b, 0x22, 0x96, 0xc1, 0x51, 0x83, 0xcf, 0x65, 0x54, 0xdf, 0x39, 0x98, 0x56, 0x5e, 0x0f, 0x5d, 0x00, + 0xbc, 0xe1, 0x9d, 0xd6, 0xab, 0xf7, 0xdd, 0x47, 0xd4, 0xa4, 0xdf, 0x3d, 0xb9, 0xfb, 0x26, 0xf2, 0x26, 0x02, 0xe5, + 0x2c, 0x7b, 0x9d, 0xac, 0xdc, 0x65, 0x51, 0x30, 0x12, 0x62, 0x2f, 0x2b, 0x17, 0x7c, 0x34, 0x8a, 0xe1, 0x83, 0x25, + 0x8b, 0xca, 0x7b, 0x50, 0x55, 0xf7, 0x6e, 0x65, 0xbd, 0x81, 0xdd, 0x51, 0xbf, 0x35, 0x54, 0x7e, 0x3f, 0x49, 0xe5, + 0x40, 0xcf, 0xf5, 0x87, 0x74, 0xa4, 0x39, 0xb8, 0xd0, 0xfc, 0x7f, 0xa1, 0x32, 0x67, 0x05, 0x64, 0x8d, 0xa8, 0x81, + 0xa3, 0x3c, 0xd7, 0x77, 0x0e, 0x22, 0x96, 0x4d, 0xe1, 0xfd, 0x9c, 0xaa, 0x27, 0xfd, 0x14, 0x0b, 0xcf, 0x6e, 0xac, + 0xb8, 0x46, 0x65, 0xbb, 0x72, 0x13, 0xd8, 0x50, 0x8e, 0xe2, 0x89, 0xc8, 0x5d, 0xed, 0x6f, 0x36, 0x48, 0x74, 0x1d, + 0x85, 0x4f, 0x15, 0x71, 0xb1, 0x56, 0x08, 0x4e, 0xdf, 0x62, 0x43, 0x4c, 0x95, 0x29, 0xc8, 0xed, 0xb8, 0x9d, 0xac, + 0x51, 0xd8, 0x92, 0x51, 0x82, 0x6c, 0x1a, 0x26, 0x8a, 0x8d, 0x12, 0x57, 0xf1, 0x83, 0xdd, 0x45, 0xb9, 0xf3, 0xb9, + 0x6b, 0xc0, 0x56, 0xc4, 0xdb, 0x39, 0xdd, 0x87, 0x0e, 0x1d, 0xa7, 0x02, 0x7a, 0xb2, 0x16, 0x5c, 0xf8, 0x44, 0x98, + 0xff, 0xca, 0xcf, 0x6e, 0xb0, 0x9f, 0xdd, 0x38, 0x7f, 0x5e, 0xd4, 0x6f, 0xe8, 0xf5, 0x47, 0x26, 0xea, 0x22, 0x9c, + 0xd6, 0x41, 0xe1, 0x97, 0x4e, 0x41, 0xcd, 0x9e, 0x65, 0xb2, 0x9a, 0xba, 0xb1, 0xdf, 0x9e, 0x65, 0x90, 0x0d, 0x20, + 0xd5, 0xd6, 0x20, 0xe1, 0x09, 0x6d, 0x57, 0x93, 0x12, 0xed, 0xe0, 0xb2, 0xc1, 0x56, 0x7f, 0xc1, 0x21, 0x7b, 0x40, + 0xdc, 0x05, 0x0d, 0xcd, 0xd6, 0x1b, 0x26, 0x72, 0xdc, 0xd8, 0xd8, 0x3e, 0xd0, 0xc8, 0xad, 0x49, 0xe9, 0x95, 0xae, + 0x47, 0xd0, 0xb7, 0x45, 0xc0, 0x3f, 0x95, 0xa2, 0x07, 0xae, 0x44, 0xf3, 0xbf, 0x95, 0xdb, 0xb8, 0x5a, 0x2c, 0x53, + 0xf4, 0x1e, 0x02, 0x59, 0x10, 0x0e, 0x05, 0x4d, 0xf1, 0x43, 0x5a, 0x5e, 0xcb, 0xdb, 0x34, 0x0b, 0x10, 0x33, 0x41, + 0xf3, 0x64, 0x7a, 0xfb, 0xf0, 0xe1, 0xef, 0x5f, 0x7e, 0xae, 0x71, 0x64, 0xde, 0x2e, 0xe3, 0xba, 0x6d, 0x38, 0x08, + 0x71, 0x78, 0x17, 0xb0, 0x44, 0xca, 0xbc, 0x6b, 0xf0, 0x07, 0xb6, 0xa7, 0x5c, 0xe7, 0x9a, 0xa6, 0x34, 0x96, 0x9f, + 0x92, 0xd3, 0x5b, 0x71, 0x70, 0x3c, 0xbd, 0x35, 0xbb, 0xd1, 0x5c, 0xc9, 0x21, 0xfd, 0x43, 0x53, 0x45, 0xb7, 0xe7, + 0xa6, 0x56, 0xd3, 0x1d, 0x8f, 0xa6, 0xb7, 0x6d, 0x25, 0x68, 0xeb, 0xa9, 0x82, 0xaa, 0x31, 0xbd, 0xb5, 0x93, 0x65, + 0xcb, 0x81, 0x1c, 0xff, 0x20, 0x73, 0x68, 0x98, 0xd1, 0x36, 0xbc, 0x3f, 0x9b, 0x0d, 0xc2, 0x58, 0x0b, 0xf3, 0x09, + 0x8b, 0xa2, 0x98, 0xb6, 0x8d, 0xbc, 0x76, 0x9a, 0xc7, 0x90, 0x6b, 0x6a, 0x6f, 0x59, 0x75, 0x57, 0x2c, 0xe4, 0x15, + 0x78, 0x0a, 0xaf, 0x33, 0x1e, 0xc3, 0xc7, 0x2b, 0x36, 0xa2, 0x53, 0x27, 0x61, 0x36, 0x4a, 0xe4, 0xc9, 0xdf, 0xd5, + 0xb5, 0x1c, 0x35, 0xfe, 0xd4, 0x96, 0x1b, 0xde, 0x68, 0x0b, 0x3e, 0x0d, 0xea, 0x07, 0xd5, 0x85, 0x40, 0x55, 0xb1, + 0x04, 0xbc, 0x61, 0x59, 0x18, 0xa4, 0x95, 0xe2, 0xd3, 0x8e, 0xdf, 0xd4, 0x65, 0x72, 0x00, 0x78, 0xd1, 0x73, 0x51, + 0x94, 0x57, 0x17, 0xf3, 0x6f, 0x73, 0x5a, 0x1e, 0x6f, 0x3e, 0x2d, 0x8f, 0xcd, 0x69, 0xb9, 0x9f, 0x62, 0xbf, 0x1c, + 0x36, 0xe1, 0xbf, 0x76, 0xb9, 0xa0, 0xa0, 0xe1, 0x1c, 0x4c, 0x6f, 0x1d, 0xd0, 0xd3, 0xea, 0xad, 0xe9, 0xad, 0x4a, + 0x15, 0x86, 0x98, 0x45, 0x03, 0x92, 0x67, 0x71, 0xc3, 0x81, 0x42, 0xf8, 0xbf, 0x51, 0xa9, 0x6a, 0x1e, 0x42, 0x1d, + 0xf4, 0x3a, 0x5a, 0xaf, 0x6b, 0xdd, 0x7f, 0x68, 0x83, 0x84, 0x0b, 0x2f, 0x30, 0xdc, 0x18, 0xf9, 0x22, 0xbc, 0xbe, + 0xa6, 0x51, 0x30, 0xe4, 0x83, 0x59, 0xf6, 0x4f, 0x1a, 0x7e, 0x8d, 0xc4, 0x7b, 0x8f, 0xf4, 0xca, 0x38, 0xa6, 0xab, + 0x4a, 0x5c, 0x36, 0x23, 0x2c, 0x8a, 0x7d, 0x0a, 0xb2, 0x41, 0x18, 0x53, 0xaf, 0xe5, 0x1f, 0x6e, 0x38, 0x04, 0xff, + 0x2e, 0x7b, 0xb3, 0x71, 0x31, 0xbf, 0x17, 0x19, 0xf7, 0x22, 0xe1, 0xb3, 0x70, 0x60, 0xef, 0x61, 0xe3, 0x64, 0x33, + 0xb8, 0x3d, 0x33, 0x53, 0xdf, 0x08, 0x05, 0x2d, 0x77, 0x22, 0x3a, 0x0c, 0x67, 0xb1, 0xb8, 0x7f, 0xd4, 0x6d, 0x94, + 0xb1, 0x36, 0xea, 0x3d, 0x0c, 0xbd, 0x6c, 0xfb, 0x40, 0x2e, 0xfd, 0xe5, 0xe3, 0x43, 0xf8, 0x4f, 0xe5, 0x3d, 0xdd, + 0x95, 0xba, 0xba, 0xb2, 0x55, 0x41, 0x57, 0xdf, 0xad, 0x28, 0xe3, 0x4a, 0x84, 0x4b, 0x7d, 0xfc, 0xa1, 0xad, 0x41, + 0xab, 0x7c, 0x50, 0x73, 0xad, 0x65, 0x7d, 0x56, 0xeb, 0xcf, 0x1b, 0xfc, 0x81, 0x6d, 0x07, 0x4a, 0x73, 0xad, 0xb6, + 0xd5, 0xdf, 0xd2, 0x5b, 0x6b, 0x6c, 0x30, 0x2e, 0xdb, 0xef, 0x92, 0xbb, 0xc2, 0x44, 0x51, 0x51, 0x48, 0xb0, 0x52, + 0x76, 0x95, 0x95, 0xc2, 0x28, 0xb9, 0x3a, 0xed, 0xde, 0x4e, 0x62, 0x67, 0xae, 0x6e, 0xfd, 0x11, 0xb7, 0xe9, 0x37, + 0x5c, 0x47, 0xc6, 0xbf, 0xe1, 0xed, 0xe3, 0xae, 0xfc, 0x46, 0xab, 0xdb, 0x05, 0x4d, 0x6b, 0x3e, 0x92, 0x9a, 0xdd, + 0x8b, 0xf0, 0x8e, 0xa6, 0x97, 0x2d, 0xd7, 0x01, 0xef, 0x4a, 0x5d, 0xa5, 0x0a, 0xc8, 0x32, 0xa7, 0xe5, 0x3a, 0xb7, + 0x93, 0x38, 0xc9, 0x88, 0x3b, 0x16, 0x62, 0x1a, 0xa8, 0x8f, 0xb8, 0xde, 0x1c, 0xf8, 0x3c, 0x1d, 0xed, 0xb7, 0x1a, + 0x8d, 0x06, 0xbc, 0xc9, 0xd4, 0x75, 0xe6, 0x8c, 0xde, 0x3c, 0xe1, 0xb7, 0xc4, 0x6d, 0x38, 0x0d, 0xa7, 0xd9, 0x3a, + 0x71, 0x9a, 0xad, 0x43, 0xff, 0xf8, 0xc4, 0xed, 0x7c, 0xe1, 0x38, 0xa7, 0x11, 0x1d, 0x66, 0xf0, 0xc3, 0x71, 0x4e, + 0xa5, 0xe2, 0xa5, 0x7e, 0x3b, 0x8e, 0x3f, 0x88, 0xb3, 0x7a, 0xd3, 0x59, 0xe8, 0x47, 0xc7, 0x81, 0xbb, 0x91, 0x81, + 0xf3, 0xe5, 0xb0, 0x35, 0x3c, 0x1c, 0x3e, 0x6e, 0xeb, 0xe2, 0xfc, 0x8b, 0x4a, 0x73, 0xac, 0xfe, 0xb6, 0xac, 0x6e, + 0x99, 0x48, 0xf9, 0x47, 0xaa, 0x73, 0xf1, 0x1c, 0x10, 0x3d, 0x1b, 0xbb, 0xb6, 0xd6, 0x67, 0x6a, 0x9e, 0x5c, 0x0f, + 0x86, 0xad, 0xb2, 0xb9, 0x84, 0x71, 0xbf, 0x00, 0xf2, 0x74, 0xdf, 0x80, 0x7e, 0x6a, 0xa3, 0xa9, 0x59, 0xdf, 0x84, + 0xa8, 0xa6, 0xab, 0xd7, 0x38, 0x32, 0xeb, 0x3b, 0x85, 0x54, 0x7c, 0xa3, 0xab, 0x4a, 0x08, 0x5c, 0x27, 0x22, 0xee, + 0xcb, 0x66, 0xeb, 0x04, 0x37, 0x9b, 0xc7, 0xfe, 0xf1, 0xc9, 0xa0, 0x81, 0x0f, 0xfd, 0xc3, 0xfa, 0x81, 0x7f, 0x8c, + 0x4f, 0xea, 0x27, 0xf8, 0xe4, 0xf9, 0xc9, 0xa0, 0x7e, 0xe8, 0x1f, 0xe2, 0x46, 0xfd, 0x04, 0x0a, 0xeb, 0x27, 0xf5, + 0x93, 0x79, 0xfd, 0xf0, 0x64, 0xd0, 0x90, 0xa5, 0x2d, 0xff, 0xe8, 0xa8, 0xde, 0x6c, 0xf8, 0x47, 0x47, 0xf8, 0xc8, + 0x3f, 0x3e, 0xae, 0x37, 0x0f, 0xfc, 0xe3, 0xe3, 0x17, 0x47, 0x27, 0xfe, 0x01, 0xd4, 0x1d, 0x1c, 0x0c, 0x0e, 0xfc, + 0x66, 0xb3, 0x0e, 0xff, 0xe0, 0x13, 0xbf, 0xa5, 0x7e, 0x34, 0x9b, 0xfe, 0x41, 0x13, 0x37, 0xe2, 0xa3, 0x96, 0x7f, + 0xfc, 0x18, 0xcb, 0x7f, 0x65, 0x33, 0x2c, 0xff, 0x81, 0x61, 0xf0, 0x63, 0xbf, 0x75, 0xac, 0x7e, 0xc9, 0x01, 0xe7, + 0x87, 0x27, 0x3f, 0xb9, 0xfb, 0x5b, 0xd7, 0xd0, 0x54, 0x6b, 0x38, 0x39, 0xf2, 0x0f, 0x0e, 0xf0, 0x61, 0xd3, 0x3f, + 0x39, 0x18, 0xd7, 0x0f, 0x5b, 0xfe, 0xf1, 0xa3, 0x41, 0xbd, 0xe9, 0x3f, 0x7a, 0x84, 0x1b, 0xf5, 0x03, 0xbf, 0x85, + 0x9b, 0xfe, 0xe1, 0x81, 0xfc, 0x71, 0xe0, 0xb7, 0xe6, 0x8f, 0x1e, 0xfb, 0xc7, 0x47, 0xe3, 0x63, 0xff, 0xf0, 0xfb, + 0xc3, 0x13, 0xbf, 0x75, 0x30, 0x3e, 0x38, 0xf6, 0x5b, 0x8f, 0xe6, 0xc7, 0xfe, 0xe1, 0xb8, 0xde, 0x3a, 0xbe, 0xb7, + 0x67, 0xb3, 0xe5, 0x03, 0x8e, 0x64, 0x35, 0x54, 0x60, 0x5d, 0x01, 0xff, 0x8f, 0x65, 0xdf, 0x7f, 0xc7, 0x61, 0xb2, + 0xf5, 0xae, 0x8f, 0xfd, 0x93, 0x47, 0x03, 0xd5, 0x1c, 0x0a, 0xea, 0xa6, 0x05, 0x74, 0x99, 0xd7, 0xd5, 0xb4, 0x72, + 0xb8, 0xba, 0x19, 0xc8, 0xfc, 0xaf, 0x27, 0x9b, 0xd7, 0x61, 0x62, 0x35, 0xef, 0x7f, 0xe8, 0x38, 0xc5, 0x96, 0x9f, + 0xee, 0x8f, 0x14, 0xe9, 0x8f, 0x3a, 0x5f, 0xa8, 0xd7, 0x14, 0x7f, 0x71, 0x85, 0xb3, 0x6d, 0x8e, 0x8f, 0xf4, 0xd3, + 0x8e, 0x8f, 0x84, 0x3e, 0xc4, 0xf3, 0x91, 0xfe, 0xe1, 0x9e, 0x8f, 0x8c, 0xae, 0xb8, 0xbb, 0xef, 0xc4, 0x9a, 0x83, + 0x63, 0xd5, 0x2a, 0x7e, 0x2e, 0xbc, 0x1e, 0x83, 0xef, 0x61, 0xe5, 0xed, 0x3b, 0x78, 0x15, 0xba, 0xed, 0x07, 0xe2, + 0xc0, 0x62, 0xef, 0x84, 0xe2, 0xb1, 0x7c, 0x1b, 0x42, 0xe2, 0x4f, 0x23, 0xe4, 0xfb, 0x87, 0xe0, 0x23, 0xfe, 0xc3, + 0xf1, 0xc1, 0x6d, 0x7c, 0x54, 0x3c, 0xf0, 0xd2, 0xd3, 0x20, 0x3d, 0x05, 0x17, 0xf2, 0xd9, 0x83, 0xbb, 0x40, 0x35, + 0x77, 0x9f, 0x42, 0x51, 0xe6, 0xaa, 0x88, 0xcf, 0xab, 0xcf, 0x09, 0x16, 0xa8, 0x8b, 0x7f, 0xc4, 0xd5, 0x6e, 0x99, + 0xa9, 0x94, 0x3a, 0xfa, 0xa1, 0x10, 0x4a, 0x2d, 0xbf, 0xe1, 0x37, 0x0a, 0x97, 0x0e, 0x5c, 0xf6, 0x24, 0x0b, 0x2e, + 0x42, 0xf8, 0xec, 0x6a, 0xcc, 0x47, 0xf2, 0x03, 0xad, 0xf0, 0x5a, 0x7c, 0xf9, 0xa9, 0x5c, 0xf5, 0x45, 0x82, 0xc0, + 0x75, 0xf5, 0x2b, 0x22, 0xe0, 0x32, 0xe1, 0x77, 0x70, 0xe1, 0xd2, 0xc4, 0x12, 0x26, 0xe0, 0xed, 0x78, 0x49, 0x23, + 0x16, 0x7a, 0xae, 0x37, 0x4d, 0xe9, 0x90, 0xa6, 0x59, 0xbd, 0x72, 0x0b, 0x51, 0x5e, 0x40, 0x44, 0xae, 0xf9, 0xc0, + 0x67, 0x0a, 0xaf, 0x79, 0x26, 0x3d, 0xed, 0x6f, 0x74, 0xb5, 0x01, 0xe6, 0xe6, 0xd8, 0x94, 0xa4, 0x20, 0x6b, 0x4b, + 0xa5, 0xcd, 0x55, 0x5a, 0x5b, 0xd3, 0x6f, 0x1d, 0x21, 0x47, 0x16, 0xc3, 0xeb, 0x73, 0x7f, 0xf4, 0xea, 0x07, 0x8d, + 0x3f, 0x21, 0xab, 0x5b, 0x31, 0x50, 0x5f, 0xbb, 0xdb, 0xd2, 0xf2, 0xc3, 0xc8, 0xd5, 0x2b, 0xa2, 0xae, 0xa2, 0x88, + 0x2f, 0xd5, 0xda, 0xe1, 0x45, 0xbc, 0x3a, 0xb2, 0xab, 0x5e, 0x74, 0x30, 0x64, 0x23, 0xcf, 0xfe, 0xec, 0xad, 0x7a, + 0x3d, 0xaf, 0xfc, 0x5a, 0x36, 0xca, 0xcb, 0x26, 0x29, 0x5a, 0xc8, 0x28, 0x09, 0x4b, 0x9c, 0x74, 0xb9, 0xf4, 0x52, + 0x70, 0x91, 0x13, 0x0b, 0xa7, 0xf0, 0x8c, 0x2a, 0x48, 0x4e, 0x71, 0x01, 0x90, 0x44, 0x30, 0x49, 0xd5, 0xdf, 0xb2, + 0xd8, 0xfc, 0xd0, 0x8e, 0x2f, 0x3f, 0x0e, 0x93, 0x11, 0x50, 0x61, 0x98, 0x8c, 0xd6, 0xdc, 0x6a, 0x2a, 0xd0, 0xb3, + 0x52, 0x5a, 0x0e, 0x55, 0xba, 0xcf, 0xb2, 0x27, 0x77, 0xef, 0xf4, 0x7b, 0xbc, 0x5c, 0xf0, 0x4e, 0xcb, 0xa8, 0x44, + 0xf9, 0xce, 0xe1, 0x1a, 0xf9, 0x4a, 0x7d, 0x48, 0x5e, 0xca, 0x54, 0xd0, 0x27, 0xe0, 0xf2, 0xa7, 0xa3, 0xad, 0x51, + 0xe2, 0x4a, 0xe9, 0x4e, 0x22, 0x3a, 0x67, 0x03, 0x2d, 0xea, 0xb1, 0xa3, 0x2f, 0xc0, 0xd7, 0xe5, 0xd6, 0x90, 0x26, + 0x56, 0xfe, 0x98, 0x41, 0x28, 0x33, 0xd1, 0x49, 0xc2, 0xdd, 0xce, 0x57, 0xc5, 0x57, 0x3c, 0xb7, 0x6d, 0x02, 0x7c, + 0xdd, 0xbe, 0x97, 0xd2, 0xf8, 0x9f, 0xc8, 0x57, 0xf0, 0x7d, 0xfb, 0xaf, 0xfa, 0xf0, 0x69, 0x75, 0x5f, 0x7e, 0xe5, + 0xfe, 0xab, 0xf2, 0x33, 0xf7, 0xc0, 0x08, 0x6b, 0xb7, 0x93, 0x18, 0x4b, 0x8d, 0xe9, 0x01, 0x0a, 0x91, 0x02, 0xd7, + 0x6d, 0x1d, 0xb9, 0x8e, 0xb2, 0x89, 0xe5, 0xef, 0x8e, 0x12, 0xa7, 0x52, 0x09, 0x70, 0x9a, 0x2d, 0xff, 0x68, 0xdc, + 0xf2, 0x1f, 0xcf, 0x1f, 0xf9, 0x27, 0xe3, 0xe6, 0xa3, 0x79, 0x1d, 0xfe, 0xb6, 0xfc, 0xc7, 0x71, 0xbd, 0xe5, 0x3f, + 0x86, 0xff, 0xbf, 0x3f, 0xf4, 0x8f, 0xc6, 0xf5, 0xa6, 0x7f, 0x32, 0x3f, 0xf0, 0x0f, 0x5e, 0x34, 0x5b, 0xfe, 0x81, + 0xd3, 0x74, 0x54, 0x3f, 0x60, 0xd7, 0x8a, 0x3b, 0x7f, 0xb5, 0x72, 0x20, 0x36, 0x04, 0xd1, 0x54, 0xae, 0xa5, 0x8b, + 0xbd, 0xe2, 0x5b, 0x81, 0xfa, 0x7c, 0x6a, 0x67, 0xdd, 0xd3, 0x30, 0x85, 0x0f, 0xb6, 0x54, 0xcf, 0x6e, 0xa5, 0x0e, + 0x57, 0xf8, 0xc5, 0x86, 0x29, 0xe0, 0x84, 0xbb, 0xd8, 0xbe, 0x41, 0x0e, 0xd7, 0xaf, 0xe5, 0xeb, 0xad, 0xcd, 0x5b, + 0xfe, 0xb6, 0x93, 0xb6, 0x6a, 0x68, 0xde, 0x24, 0x28, 0x99, 0x05, 0x93, 0x9f, 0x12, 0x90, 0x93, 0x7c, 0x13, 0xe5, + 0xab, 0xf3, 0x43, 0xca, 0x67, 0xca, 0xad, 0x4b, 0xf4, 0xb4, 0xbc, 0xa8, 0x10, 0x31, 0x78, 0xed, 0x41, 0x9e, 0x1b, + 0xd0, 0x2b, 0x6e, 0xda, 0x12, 0x4b, 0x92, 0x5f, 0xd0, 0xac, 0xeb, 0x42, 0x91, 0x1b, 0xb8, 0xd2, 0xc5, 0xe7, 0x16, + 0x1f, 0xad, 0x29, 0x08, 0xbb, 0x2c, 0xc0, 0xf2, 0xb2, 0x11, 0x9c, 0x5a, 0xc0, 0x8f, 0x8b, 0xf6, 0xf6, 0xb6, 0x9e, + 0x17, 0xa9, 0x40, 0xc2, 0x5a, 0xcb, 0x8f, 0x5d, 0xd8, 0xac, 0xc8, 0xb5, 0x11, 0x5d, 0x8c, 0x2b, 0x51, 0x88, 0x34, + 0x9e, 0xae, 0x69, 0x28, 0xfc, 0x30, 0x51, 0xc9, 0x23, 0x16, 0xc3, 0xc2, 0x4d, 0x7a, 0x80, 0x72, 0x2e, 0x42, 0xeb, + 0x6b, 0xb6, 0xfa, 0x9c, 0x73, 0x11, 0x9a, 0x2b, 0xa1, 0x89, 0xa8, 0xdc, 0x99, 0x18, 0xb7, 0x3a, 0xaf, 0xdf, 0x9d, + 0x39, 0xea, 0x78, 0x9e, 0xee, 0x8f, 0x5b, 0x9d, 0x53, 0xe9, 0x33, 0x51, 0x17, 0xca, 0x88, 0xba, 0x50, 0xe6, 0xe8, + 0xcb, 0x85, 0x10, 0x49, 0xcb, 0xf7, 0xd5, 0xb2, 0xa5, 0xcd, 0xa0, 0xbc, 0xbd, 0x93, 0x59, 0x2c, 0x18, 0xbc, 0xaa, + 0x79, 0x1f, 0xba, 0xd6, 0x61, 0xc3, 0x8a, 0xfc, 0x63, 0xad, 0x1d, 0x5e, 0x8b, 0xc4, 0xf8, 0x86, 0x87, 0x2c, 0xa6, + 0x26, 0xe3, 0x58, 0x0f, 0x55, 0x64, 0xc8, 0xaf, 0xb7, 0xce, 0x66, 0xd7, 0x13, 0x26, 0x5c, 0x93, 0xc7, 0xff, 0x5e, + 0x77, 0x38, 0x95, 0x53, 0x75, 0xae, 0x72, 0xed, 0xbc, 0x36, 0x9f, 0xa5, 0xa9, 0x6e, 0xa9, 0x5e, 0xbd, 0x96, 0x10, + 0x70, 0x33, 0x6c, 0x7c, 0xd0, 0x29, 0xdc, 0xc5, 0x76, 0x5d, 0x7e, 0xba, 0x3f, 0x3e, 0xe8, 0x5c, 0x05, 0x53, 0x3d, + 0xde, 0x0b, 0x3e, 0xda, 0x3c, 0x56, 0xcc, 0x47, 0x5d, 0x79, 0x05, 0x42, 0xdd, 0xb5, 0x35, 0xca, 0x2f, 0x8f, 0xdd, + 0xce, 0xa9, 0x56, 0x06, 0x1c, 0x19, 0x0e, 0x77, 0x8f, 0x1a, 0xe6, 0x56, 0x45, 0xcc, 0x47, 0x70, 0x20, 0x55, 0x17, + 0x6b, 0x92, 0x8a, 0xc7, 0x7d, 0xdc, 0xec, 0x9c, 0x86, 0x8e, 0xe4, 0x2d, 0x92, 0x79, 0x64, 0xc1, 0x3e, 0x74, 0x1e, + 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xbc, + 0x9c, 0x09, 0x7e, 0x86, 0x2b, 0x8b, 0x94, 0x2c, 0x3c, 0xd7, 0xbe, 0x73, 0xb0, 0x55, 0x80, 0x84, 0x5c, 0x47, 0x71, + 0x78, 0xe3, 0x63, 0xd7, 0xb2, 0x37, 0x77, 0x3b, 0xff, 0xfa, 0x3f, 0xfe, 0x97, 0x76, 0x9b, 0x9f, 0xee, 0x8f, 0x9b, + 0x66, 0xac, 0x15, 0x44, 0xe7, 0xa7, 0x70, 0x11, 0xb1, 0x8c, 0xf3, 0xd2, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, + 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x41, 0xf6, 0x0d, 0x24, 0x0d, 0x75, 0xb5, 0x08, 0x48, 0xf0, 0x37, 0xdd, 0xa1, 0x31, + 0x57, 0x31, 0xe4, 0x69, 0xb5, 0x6f, 0xd4, 0x94, 0x07, 0xaa, 0x72, 0xab, 0x26, 0xd5, 0x5f, 0xaf, 0xd2, 0x4c, 0x2d, + 0xad, 0x5c, 0xa6, 0xc9, 0x5d, 0xa7, 0x88, 0x53, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0xf0, 0xd3, + 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0x0b, 0x18, 0x3a, 0x44, 0x25, 0xf9, 0x84, 0x53, 0xc6, + 0xa7, 0x14, 0xc3, 0x70, 0x20, 0x47, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xeb, 0x35, 0x17, 0x72, 0x42, 0x79, 0xd8, + 0x34, 0x74, 0xf2, 0xd0, 0xe6, 0x25, 0x8d, 0x54, 0x50, 0x2e, 0x69, 0x31, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0x46, + 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x38, 0x65, 0xa1, 0x24, 0x2f, 0xcb, 0x1d, 0x08, 0x97, 0x2c, 0xe0, 0x31, 0x68, 0x59, + 0xc5, 0x72, 0xf7, 0x2a, 0x7d, 0xda, 0x1f, 0x66, 0x99, 0x60, 0x43, 0x40, 0xb9, 0x72, 0xfd, 0xca, 0xc8, 0x74, 0x1d, + 0xd4, 0xbf, 0xf8, 0x2e, 0x97, 0xa3, 0x28, 0xdb, 0xfa, 0xf0, 0xe4, 0x4f, 0xf9, 0x5f, 0x26, 0xa0, 0x64, 0x39, 0xde, + 0x24, 0xbc, 0xd5, 0x16, 0xf7, 0x71, 0xa3, 0x31, 0xbd, 0x45, 0x8b, 0x72, 0x06, 0xbc, 0x6d, 0x32, 0xe9, 0x2e, 0xb6, + 0x07, 0x94, 0x21, 0xed, 0xc2, 0x33, 0xdd, 0x70, 0xc0, 0xbd, 0xed, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x1c, 0x65, + 0xbf, 0x42, 0xe8, 0x59, 0xfb, 0x91, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0x17, + 0xed, 0xec, 0xd0, 0xb9, 0x1d, 0xf4, 0x3e, 0x84, 0x30, 0xf6, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, + 0x62, 0xc7, 0xca, 0x69, 0x48, 0x07, 0x74, 0x68, 0xfc, 0xef, 0xba, 0x5e, 0xc5, 0xc1, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, + 0x34, 0x48, 0x32, 0x46, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, + 0x47, 0xdc, 0x43, 0x60, 0x33, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x13, 0x5e, 0xbd, 0x0e, 0x99, 0xfb, 0xb2, + 0xbb, 0x3d, 0x94, 0x72, 0xa4, 0x7d, 0xaf, 0x03, 0xd9, 0xaf, 0x2a, 0x1e, 0x28, 0x2d, 0x63, 0x5a, 0x68, 0x73, 0xbd, + 0x12, 0xd5, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, + 0x15, 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0xe5, 0x15, 0xb8, 0x87, 0xcc, 0xd2, 0x50, 0x49, 0x11, + 0xba, 0x91, 0x3e, 0x0a, 0xea, 0x97, 0x4e, 0x97, 0x80, 0xcf, 0x9a, 0x75, 0xfe, 0x1f, 0xd6, 0xb2, 0x30, 0xa4, 0x67, + 0x88, 0x00, 0x00}; } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index f649a9385e..bde1ce1fb5 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -3632,367 +3632,373 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0xd3, 0x2f, 0xb7, 0x8d, 0x1b, 0xff, 0x7f, 0x9f, 0x82, 0x61, 0xd2, 0x1c, 0x99, 0x90, 0x34, 0x29, 0x59, 0xb6, - 0x23, 0x59, 0xf6, 0xdd, 0x25, 0xb9, 0xa9, 0x3b, 0xbe, 0xcb, 0x4d, 0xe2, 0x66, 0xda, 0xf3, 0x79, 0x2c, 0x4a, 0x82, - 0x24, 0x36, 0x14, 0xa9, 0x21, 0x29, 0x5b, 0x3e, 0x85, 0x7d, 0x96, 0x3e, 0x4b, 0x9f, 0xec, 0x37, 0xbb, 0x0b, 0x80, - 0xe0, 0x87, 0x3e, 0x7c, 0xc9, 0xb5, 0xbf, 0xb9, 0xba, 0x11, 0x41, 0x00, 0x04, 0x16, 0xc0, 0x62, 0xbf, 0xd7, 0x9f, - 0x72, 0xd9, 0x8b, 0x65, 0xb0, 0xfd, 0x3e, 0xf7, 0xf9, 0x33, 0x73, 0x70, 0x4b, 0x02, 0xc1, 0xe7, 0x64, 0xf1, 0x74, - 0x1a, 0x32, 0x43, 0x17, 0xc9, 0x43, 0x74, 0x4b, 0x7e, 0xe6, 0xfc, 0x89, 0x2b, 0x22, 0x76, 0x9a, 0xf9, 0xa6, 0xa3, - 0x25, 0x66, 0xcc, 0x64, 0x48, 0x3b, 0xa2, 0x5c, 0x51, 0x36, 0x7b, 0x87, 0xea, 0x0d, 0xbe, 0x2e, 0xc5, 0xd1, 0xb5, - 0xc7, 0xf1, 0x72, 0x18, 0x32, 0x1b, 0xb7, 0x3b, 0x7c, 0x72, 0x3d, 0x5c, 0x0e, 0x87, 0x90, 0xa5, 0xe5, 0x89, 0x6b, - 0x41, 0xdc, 0x99, 0x38, 0x45, 0x7e, 0x30, 0x37, 0x7b, 0x30, 0x29, 0x27, 0xab, 0x0e, 0x1f, 0x6c, 0x45, 0x40, 0xd4, - 0x43, 0x1f, 0xc8, 0x80, 0xf7, 0x6b, 0x38, 0xb5, 0x7d, 0xfd, 0x03, 0xec, 0xbe, 0x54, 0xef, 0x35, 0x1d, 0xfd, 0xfe, - 0xb5, 0xfe, 0x01, 0x61, 0x8c, 0xd9, 0x8b, 0x5f, 0xd3, 0xee, 0xd5, 0x2d, 0x9d, 0x94, 0xde, 0x4b, 0xcc, 0x63, 0x00, - 0x42, 0xdf, 0x37, 0x81, 0x3f, 0x8d, 0xe2, 0x34, 0x0b, 0x46, 0xfa, 0x4d, 0xef, 0x22, 0x30, 0xae, 0xe7, 0x99, 0x61, - 0xde, 0x58, 0xa3, 0x4c, 0x4d, 0x81, 0x22, 0x10, 0x26, 0x66, 0x40, 0xd9, 0x54, 0x49, 0x3d, 0x41, 0x5b, 0x2b, 0x0a, - 0xd4, 0x8c, 0x95, 0x46, 0x59, 0x1f, 0xea, 0x55, 0xf2, 0xa9, 0x60, 0x62, 0x28, 0x1d, 0x5b, 0x9a, 0x3d, 0xe2, 0x54, - 0x5e, 0x2f, 0xd7, 0x78, 0x95, 0x67, 0xc5, 0x6d, 0x89, 0x31, 0x80, 0x85, 0xe3, 0x0c, 0x3d, 0x3f, 0x51, 0x8d, 0x3e, - 0x4b, 0xf7, 0xee, 0xe0, 0xbb, 0x32, 0x5d, 0x00, 0xf7, 0x37, 0x58, 0x5c, 0x44, 0x71, 0xa6, 0x41, 0x60, 0x1b, 0xf8, - 0xe2, 0xa0, 0x6a, 0x24, 0xc6, 0x7b, 0x35, 0xcc, 0x9c, 0x23, 0x83, 0xef, 0xf1, 0xf2, 0x33, 0x78, 0x78, 0xb3, 0x52, - 0x04, 0x0b, 0x62, 0x16, 0x22, 0x58, 0xc0, 0x2c, 0xbe, 0x8c, 0xef, 0xab, 0x7a, 0x90, 0xd7, 0x83, 0xdd, 0x77, 0xaf, - 0x21, 0xc8, 0x64, 0x91, 0xd5, 0xcf, 0xe0, 0x89, 0x49, 0x05, 0xa1, 0x53, 0x39, 0x53, 0x68, 0xf8, 0x21, 0x68, 0x98, - 0x0c, 0xec, 0xc4, 0xf0, 0x2e, 0x00, 0x94, 0xc4, 0xaf, 0xe9, 0x41, 0x7e, 0x2b, 0x52, 0x27, 0x8b, 0xc4, 0xc5, 0xca, - 0xe5, 0x0c, 0xd8, 0x35, 0x5a, 0x2c, 0x33, 0x0c, 0xb5, 0x0b, 0x03, 0x60, 0xb9, 0xae, 0x61, 0xe8, 0x4e, 0xc0, 0xd2, - 0x05, 0x99, 0x98, 0xeb, 0x5a, 0x30, 0xae, 0x97, 0x71, 0xa2, 0x17, 0x90, 0x17, 0xe2, 0x77, 0x14, 0x54, 0xc1, 0x63, - 0xc2, 0xa7, 0x31, 0xb2, 0x8a, 0x38, 0xf5, 0xc6, 0x08, 0x15, 0x3a, 0x0d, 0x98, 0x61, 0x44, 0xfd, 0xf4, 0x8c, 0xb0, - 0x71, 0xb2, 0x10, 0x7e, 0xb3, 0x34, 0xcd, 0xc1, 0xb3, 0x75, 0x94, 0x9f, 0x3f, 0x5b, 0xa7, 0x79, 0xff, 0xd9, 0xda, - 0x97, 0xb6, 0x02, 0xfa, 0x95, 0x4e, 0x86, 0x02, 0x03, 0x04, 0xc3, 0x20, 0xbf, 0x2d, 0x3c, 0x77, 0x8a, 0xf9, 0xc2, - 0x2e, 0xa3, 0x72, 0x0d, 0x55, 0xf7, 0x7d, 0xae, 0xa0, 0x5f, 0x24, 0xc1, 0xdc, 0x4f, 0x1e, 0x48, 0x9f, 0x6f, 0xa9, - 0x4a, 0x7f, 0x53, 0xd7, 0x08, 0xd1, 0x13, 0x00, 0x08, 0xe7, 0xeb, 0xda, 0xb7, 0xb2, 0x8c, 0xf1, 0xd9, 0x4a, 0xa5, - 0x26, 0x7c, 0xeb, 0x56, 0x7f, 0xc9, 0x9c, 0x31, 0xcb, 0xfc, 0x20, 0xa4, 0x26, 0x3d, 0x91, 0xad, 0xbe, 0x36, 0xbd, - 0xb4, 0x3c, 0xbd, 0xa8, 0xbc, 0x7f, 0x70, 0x32, 0x74, 0x05, 0xd0, 0xb8, 0x71, 0x66, 0x98, 0xc5, 0xaa, 0x79, 0x45, - 0xe9, 0xdd, 0x7f, 0x75, 0x39, 0x18, 0x2c, 0x47, 0x04, 0xcb, 0xc1, 0xa2, 0x51, 0x3c, 0x66, 0x7f, 0x7b, 0x7f, 0x21, - 0xd3, 0x66, 0x81, 0x04, 0x68, 0xc0, 0x37, 0x66, 0x8a, 0xf4, 0x43, 0x82, 0xb4, 0x03, 0x25, 0xb8, 0xd2, 0xe4, 0x16, - 0x4a, 0x72, 0x5d, 0x3b, 0xa7, 0xb1, 0xb3, 0x31, 0x8d, 0xba, 0x1f, 0x63, 0xab, 0x24, 0x3f, 0x3d, 0xa0, 0xda, 0x74, - 0xdb, 0x51, 0x25, 0x00, 0x43, 0x02, 0x33, 0x2c, 0xa0, 0x00, 0x19, 0x3e, 0xfb, 0x5e, 0xc1, 0x50, 0x38, 0x73, 0x94, - 0xb3, 0x7b, 0xe7, 0x65, 0x52, 0x05, 0x5b, 0xe9, 0x67, 0xa7, 0x98, 0xb3, 0x0b, 0xee, 0x6b, 0x88, 0xf2, 0x71, 0x7a, - 0x40, 0x8f, 0x5a, 0xe5, 0x44, 0x14, 0x9d, 0x08, 0xd6, 0xae, 0xcb, 0x3b, 0x78, 0xd4, 0x51, 0x81, 0x14, 0xf1, 0x50, - 0xea, 0xe7, 0xba, 0x36, 0xe7, 0xa4, 0x11, 0x0f, 0x27, 0x04, 0xb1, 0x06, 0x5c, 0x38, 0xbb, 0xba, 0x36, 0xf7, 0x57, - 0x38, 0x73, 0xf1, 0xc6, 0x5f, 0x19, 0x1e, 0x7f, 0x55, 0x9c, 0xb5, 0xb4, 0x7c, 0xd6, 0x46, 0x7c, 0x71, 0xc1, 0x91, - 0x40, 0x72, 0xd6, 0x33, 0x54, 0xd0, 0x36, 0x2c, 0xee, 0x4c, 0x2c, 0xee, 0x78, 0xc3, 0xe2, 0x8e, 0xb7, 0x2c, 0x6e, - 0xc8, 0x17, 0x52, 0x93, 0xa0, 0x4b, 0xd0, 0x39, 0x4c, 0x02, 0x8f, 0x13, 0x1a, 0x5d, 0x7e, 0xce, 0x10, 0x4e, 0x76, - 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x58, 0x35, 0xc1, 0x45, 0x01, 0x44, 0x7d, 0xe2, 0xf2, 0xd4, 0x89, 0x79, 0x43, 0x0e, - 0x4e, 0x23, 0xac, 0xce, 0x17, 0x76, 0x29, 0xe5, 0x17, 0x37, 0x66, 0x1b, 0x66, 0x3a, 0xdb, 0x32, 0xd3, 0x51, 0xe9, - 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x0c, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, - 0xab, 0xec, 0xa8, 0x85, 0x9f, 0xa6, 0xf7, 0x71, 0x02, 0x1a, 0x17, 0xe8, 0xe6, 0x71, 0x5b, 0x6a, 0x1e, 0x44, 0x3c, - 0x98, 0xcb, 0xc6, 0xcd, 0x54, 0xbc, 0x57, 0xb7, 0x54, 0xab, 0xd3, 0xa1, 0x1a, 0x0b, 0x3f, 0xcb, 0x58, 0x82, 0x40, - 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x6d, 0xd6, 0x80, 0x43, 0x42, 0x05, 0xab, 0x23, 0x86, 0x5e, 0x00, 0x6d, 0x95, - 0x88, 0x8b, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc0, 0xff, 0x84, 0xc7, 0xd5, 0x48, 0x14, 0xd7, 0x25, 0xef, 0xc8, 0x74, - 0x16, 0xfe, 0xf8, 0x03, 0x28, 0xf6, 0x8c, 0x96, 0x05, 0x46, 0xba, 0x6a, 0x18, 0xb8, 0x84, 0x88, 0xbd, 0x51, 0x81, - 0x24, 0x11, 0x4b, 0x72, 0x13, 0x28, 0xf0, 0x9e, 0xf4, 0xed, 0xc9, 0xcd, 0xba, 0x95, 0x1f, 0x4c, 0x03, 0xb3, 0x86, - 0x35, 0x01, 0xb5, 0x85, 0xfd, 0x33, 0xc9, 0x73, 0x85, 0x96, 0x77, 0x64, 0x82, 0xe4, 0xf7, 0x1a, 0xf2, 0x99, 0xba, - 0x82, 0xa1, 0x1d, 0x24, 0x70, 0x6b, 0x5d, 0xbb, 0x37, 0xf9, 0xf3, 0x29, 0xfe, 0xf2, 0x6e, 0xf2, 0xe7, 0x43, 0xfc, - 0xd5, 0xba, 0xc1, 0xcc, 0x75, 0x0d, 0x8c, 0xbc, 0x32, 0x67, 0xfd, 0xac, 0xb4, 0x9f, 0xc8, 0xfe, 0xec, 0x11, 0xdb, - 0x86, 0x2f, 0xf0, 0xd3, 0x67, 0xeb, 0x14, 0x3c, 0x2e, 0xd5, 0x39, 0x44, 0x4e, 0x62, 0xe6, 0x8d, 0xe5, 0xd3, 0x0d, - 0xe5, 0x43, 0xf3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0x2c, 0x86, 0xb8, 0x1d, 0x06, 0x91, 0x9f, - 0x3c, 0xdc, 0x12, 0x7b, 0x61, 0x08, 0xda, 0x5d, 0x8a, 0x57, 0x88, 0xbc, 0x2c, 0xab, 0xbb, 0x32, 0x45, 0xc0, 0xfb, - 0xc0, 0x2f, 0xfa, 0xfe, 0xdf, 0x13, 0x85, 0x6c, 0x2b, 0x31, 0xa0, 0x7c, 0x41, 0x4a, 0x1f, 0xba, 0x7d, 0xb6, 0x36, - 0x58, 0xbd, 0x9b, 0xca, 0x6c, 0x2b, 0x74, 0x21, 0x2c, 0x0f, 0x32, 0xb3, 0xf3, 0x71, 0xd0, 0x45, 0x7d, 0xd6, 0x30, - 0x5e, 0xd9, 0xcf, 0xd6, 0xd9, 0xb9, 0x3e, 0xf7, 0x93, 0x4f, 0x6c, 0x6c, 0x8f, 0x82, 0x64, 0x14, 0x32, 0xbd, 0xab, - 0x0f, 0x43, 0x3f, 0xfa, 0xc4, 0x1f, 0xed, 0x78, 0x99, 0xa1, 0x86, 0x7a, 0x27, 0xef, 0x2b, 0x60, 0x42, 0x22, 0x3b, - 0x24, 0x56, 0x1b, 0xa0, 0xa0, 0xbd, 0x96, 0x02, 0xaf, 0x82, 0x50, 0x2c, 0x6a, 0x59, 0x60, 0x60, 0x09, 0x4a, 0x73, - 0xf0, 0x58, 0xb5, 0x74, 0x5c, 0x2f, 0xdd, 0x52, 0xa7, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x16, 0x7b, 0xf8, 0xfd, - 0x9f, 0xa3, 0x64, 0xd8, 0xfb, 0x7f, 0x4e, 0xf6, 0xf2, 0x65, 0x33, 0x84, 0x52, 0x9b, 0x3c, 0x25, 0x1e, 0xf1, 0x71, - 0x4e, 0x60, 0x6e, 0xfe, 0xb4, 0xda, 0xd8, 0x4f, 0xd3, 0xe5, 0x9c, 0x8d, 0x49, 0x33, 0x78, 0x5e, 0x0c, 0xaa, 0xcc, - 0x59, 0xa8, 0x03, 0xfb, 0x75, 0xd9, 0x3a, 0x3e, 0x7c, 0x0d, 0x16, 0x0b, 0x40, 0x50, 0xc6, 0x93, 0x89, 0x5e, 0xf0, - 0xf8, 0x3b, 0x9a, 0x79, 0x87, 0xbf, 0x2e, 0x7f, 0x78, 0xeb, 0xfe, 0x20, 0x1b, 0x47, 0x40, 0x18, 0x0b, 0xf5, 0x2b, - 0xa7, 0x8b, 0x95, 0xf1, 0x8a, 0x19, 0x4d, 0xfc, 0x68, 0xf3, 0x74, 0xae, 0x4b, 0x5b, 0x7c, 0xc1, 0xd8, 0x18, 0x08, - 0x6e, 0xab, 0x56, 0x7a, 0x1b, 0xb2, 0x3b, 0x26, 0x55, 0xbb, 0xf5, 0x8f, 0x35, 0xb4, 0xc0, 0xd8, 0x73, 0x5c, 0x65, - 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x03, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x60, 0xe9, 0xca, 0x00, - 0x36, 0x8e, 0xec, 0x7c, 0x43, 0x79, 0x17, 0x13, 0x4f, 0x37, 0x8f, 0xcd, 0xf2, 0xcc, 0x2e, 0xc4, 0xea, 0xe6, 0x70, - 0x0a, 0xe1, 0xe4, 0x19, 0x85, 0x38, 0x64, 0x13, 0xc4, 0x9a, 0x84, 0x64, 0x3a, 0x49, 0x5f, 0x84, 0xb5, 0x23, 0x9a, - 0xfd, 0x0a, 0x39, 0x54, 0xe3, 0xda, 0x68, 0xe5, 0x99, 0x0f, 0x31, 0xa1, 0x6b, 0xc4, 0xd2, 0x74, 0x23, 0xc0, 0xe4, - 0xa2, 0x5b, 0x7a, 0x51, 0xbb, 0x0c, 0x8f, 0xa2, 0xdc, 0x72, 0x2d, 0x20, 0x09, 0x70, 0x82, 0xd5, 0x6f, 0xe1, 0xf5, - 0x72, 0x3b, 0xe7, 0xf6, 0x2a, 0xc9, 0x74, 0xa8, 0x73, 0x5b, 0x82, 0x4d, 0xef, 0xef, 0x75, 0x3e, 0xa8, 0xd2, 0x35, - 0xdd, 0x38, 0x34, 0xa3, 0x84, 0x7a, 0x6b, 0xe2, 0x22, 0xec, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x64, 0xc2, 0x46, - 0x59, 0x6a, 0x0a, 0xe1, 0x91, 0x8c, 0x1e, 0x0b, 0x5e, 0x43, 0x4f, 0xfa, 0xfa, 0x4f, 0xe0, 0x43, 0x2f, 0x82, 0x2c, - 0xf1, 0x01, 0x09, 0x9e, 0xa9, 0x19, 0x4c, 0xd4, 0x63, 0x19, 0x44, 0xfc, 0x2b, 0x90, 0x1c, 0xbc, 0xa1, 0x1c, 0x87, - 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0xd2, 0xaa, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xde, 0x0f, 0x1d, 0xcf, - 0xcd, 0x75, 0x0b, 0x7c, 0xb7, 0x3e, 0xed, 0x7b, 0xe8, 0xb1, 0x55, 0x1b, 0x5a, 0x2d, 0xa3, 0xc7, 0xb4, 0x6b, 0x79, - 0xaf, 0x3c, 0xdd, 0x22, 0x93, 0x39, 0x05, 0xb7, 0x8d, 0xe2, 0x3b, 0x96, 0x7c, 0xf1, 0x54, 0xca, 0x9d, 0xef, 0x37, - 0x9e, 0x23, 0xcf, 0x05, 0x24, 0x9c, 0xc5, 0x8b, 0x47, 0x4c, 0xa1, 0xad, 0x5b, 0xfa, 0x28, 0x8c, 0x53, 0xa6, 0xce, - 0x81, 0x84, 0x20, 0x5f, 0x38, 0x89, 0x9f, 0xdf, 0xbf, 0xfd, 0xf0, 0x41, 0xb7, 0x30, 0x13, 0x68, 0xaa, 0xf6, 0xce, - 0x37, 0xd4, 0x0e, 0xec, 0xdf, 0xb8, 0xef, 0xe8, 0x86, 0x21, 0xa6, 0xb6, 0xbc, 0xe7, 0xa8, 0xac, 0xb6, 0xe5, 0xf8, - 0xcd, 0xc3, 0xbf, 0x4c, 0x9c, 0xe8, 0x5e, 0xf3, 0x6a, 0xc0, 0x0d, 0xdb, 0xaf, 0xb7, 0x52, 0xc9, 0x3c, 0x88, 0x6e, - 0x1b, 0x4a, 0xfd, 0x55, 0x43, 0x29, 0xb0, 0x72, 0x35, 0x5c, 0xb5, 0x8c, 0xe7, 0x0a, 0x69, 0x00, 0x89, 0x9c, 0x77, - 0x81, 0x4b, 0xe1, 0xa7, 0xbe, 0x60, 0xd0, 0x3c, 0x92, 0x7b, 0x75, 0xd4, 0x0d, 0xc5, 0x9c, 0x09, 0x92, 0xb0, 0x1d, - 0x85, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6c, 0x94, 0xe6, 0xba, 0x4a, 0x27, 0x44, 0xde, 0xde, 0x66, 0x6c, - 0xbe, 0x60, 0x89, 0x9f, 0x2d, 0x13, 0x76, 0x1b, 0xc6, 0xf7, 0x4f, 0x0a, 0x73, 0xfa, 0x1d, 0x95, 0x67, 0xc1, 0x74, - 0x26, 0x6b, 0x9f, 0x1b, 0xac, 0x2f, 0x17, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0x71, 0xfe, 0xf3, 0xef, 0x9d, - 0x55, 0xa1, 0xfb, 0x7c, 0x60, 0x65, 0xfd, 0x3d, 0xf6, 0x45, 0xf3, 0x97, 0xca, 0x30, 0x6f, 0xae, 0x53, 0x5b, 0x04, - 0x78, 0x5f, 0x5b, 0x82, 0x5a, 0x61, 0x79, 0xdf, 0x3c, 0x6a, 0x60, 0x30, 0xaf, 0x9d, 0x23, 0x83, 0x4a, 0x5f, 0x34, - 0xb4, 0x81, 0xd9, 0xdd, 0x6b, 0x45, 0x7e, 0x3f, 0x84, 0x77, 0xcd, 0xe1, 0x0b, 0x87, 0xcf, 0xe5, 0x92, 0xaf, 0x07, - 0x03, 0x99, 0x5b, 0x4e, 0x6d, 0x0a, 0x26, 0xfe, 0xe7, 0xb5, 0x12, 0x7e, 0x79, 0x76, 0x5d, 0x93, 0x7c, 0xef, 0xfb, - 0xaf, 0x07, 0x68, 0x8c, 0x76, 0x3a, 0x4c, 0x0a, 0x62, 0x65, 0x23, 0x6a, 0x23, 0x63, 0xf2, 0x5a, 0xa7, 0x35, 0xbc, - 0x06, 0xa5, 0x98, 0x70, 0x2c, 0x1f, 0x98, 0xd6, 0xeb, 0x01, 0x17, 0x2c, 0x71, 0xfb, 0xd7, 0x6e, 0x75, 0x6b, 0x73, - 0xb1, 0x6c, 0x09, 0xe8, 0x96, 0x46, 0xfa, 0x1f, 0xac, 0xcc, 0x0a, 0x39, 0x1e, 0x0a, 0xf8, 0x41, 0xa2, 0x30, 0xc8, - 0x31, 0xdf, 0xc9, 0xbb, 0x4d, 0x36, 0x62, 0x3f, 0xef, 0xb6, 0x11, 0xbb, 0xda, 0xcb, 0x46, 0xec, 0xe7, 0xaf, 0x6e, - 0x23, 0xf6, 0x4e, 0xb5, 0x11, 0x83, 0x45, 0x7c, 0xcb, 0xf6, 0x32, 0xdc, 0x12, 0x56, 0x1b, 0xf1, 0x7d, 0xda, 0xf7, - 0x38, 0x49, 0x9b, 0x8e, 0x66, 0x0c, 0x64, 0x04, 0x7c, 0x55, 0xc2, 0x78, 0x0a, 0x46, 0x5c, 0x7f, 0xbc, 0xb9, 0x55, - 0x18, 0x4f, 0x55, 0x63, 0xab, 0x88, 0x47, 0x7c, 0x2d, 0xa2, 0x38, 0x91, 0x81, 0x93, 0x6b, 0x89, 0x98, 0x4f, 0xf6, - 0xa1, 0xa9, 0x64, 0xb5, 0x96, 0xd6, 0x6b, 0x2d, 0x61, 0x02, 0xd5, 0x45, 0xeb, 0x29, 0xd9, 0xb0, 0xf5, 0x52, 0xc4, - 0xb6, 0x50, 0x7b, 0x90, 0x56, 0xc2, 0x14, 0x27, 0x62, 0xad, 0xff, 0xba, 0xf2, 0xbe, 0xbf, 0xf6, 0x7a, 0x6d, 0x0f, - 0x9c, 0xb3, 0x81, 0xc3, 0xc4, 0x02, 0xb7, 0xd7, 0x6e, 0x43, 0xc1, 0xbd, 0x52, 0xd0, 0x82, 0x82, 0x40, 0x29, 0xe8, - 0x40, 0xc1, 0x48, 0x29, 0x38, 0x82, 0x82, 0xb1, 0x52, 0x70, 0x0c, 0x05, 0x77, 0x7a, 0x7e, 0x1d, 0xc9, 0xe1, 0x1e, - 0x9b, 0x37, 0x16, 0x31, 0x15, 0xa2, 0xec, 0xd8, 0xf2, 0xc0, 0x6a, 0xca, 0x9f, 0x76, 0x63, 0x8b, 0xa4, 0x8b, 0xdd, - 0xc4, 0xba, 0x9f, 0x31, 0x0a, 0x14, 0xfd, 0x06, 0xef, 0x1c, 0x27, 0x8b, 0xc1, 0x6e, 0x5a, 0x04, 0x60, 0x10, 0x70, - 0xd0, 0x74, 0x13, 0x04, 0x46, 0x3d, 0xb9, 0x72, 0x22, 0x88, 0x85, 0xb2, 0x96, 0xc5, 0x3b, 0xfa, 0x9c, 0x2d, 0xb7, - 0x40, 0x61, 0x71, 0x62, 0xa8, 0x52, 0xc9, 0xaf, 0x61, 0x77, 0xf0, 0x86, 0x0d, 0x97, 0x53, 0xed, 0x32, 0x9e, 0xee, - 0x34, 0x21, 0x50, 0x5f, 0xc1, 0x28, 0x75, 0x52, 0xbf, 0xd8, 0x62, 0x5b, 0xf2, 0x6f, 0xd1, 0x63, 0x5e, 0xae, 0x9f, - 0xc1, 0xd8, 0xb4, 0x8c, 0x0c, 0x58, 0xe0, 0x3b, 0x00, 0x23, 0x45, 0x87, 0x7f, 0x09, 0x70, 0x56, 0x9e, 0xaf, 0x7c, - 0x65, 0x3c, 0x67, 0x3f, 0xb2, 0x34, 0xf5, 0xa7, 0xa2, 0x7e, 0x7d, 0x9c, 0x60, 0xb4, 0x23, 0xf9, 0x2f, 0x04, 0x20, - 0x48, 0xf2, 0x82, 0x9a, 0x6d, 0x46, 0x12, 0xdf, 0x6b, 0x60, 0xfd, 0x03, 0x1b, 0xaa, 0xb0, 0x53, 0x08, 0x1c, 0x58, - 0xc2, 0xb2, 0x45, 0x01, 0x1c, 0xfe, 0x3b, 0x16, 0x56, 0x0b, 0x33, 0x7f, 0x5a, 0x2d, 0xa2, 0x7d, 0x90, 0xab, 0x63, - 0x93, 0x0a, 0xfd, 0x52, 0xe1, 0x97, 0x68, 0xa8, 0xc3, 0x78, 0xfa, 0x87, 0xaa, 0xa7, 0xb7, 0x98, 0x15, 0x7c, 0x88, - 0xac, 0x20, 0x1b, 0x38, 0x08, 0x63, 0xcd, 0x01, 0x10, 0x76, 0xa3, 0x6c, 0x66, 0xa3, 0x6b, 0x99, 0xd1, 0x8a, 0x4c, - 0xcb, 0xc1, 0xb5, 0x5d, 0x57, 0x1d, 0x6a, 0xbb, 0xc9, 0x74, 0xe8, 0x1b, 0x5e, 0xeb, 0xd8, 0x12, 0x7f, 0x8e, 0xdb, - 0x31, 0x73, 0xec, 0x41, 0x1b, 0x07, 0x77, 0xeb, 0x49, 0x1c, 0x65, 0xf6, 0xc4, 0x9f, 0x07, 0xe1, 0x43, 0x77, 0x1e, - 0x47, 0x71, 0xba, 0xf0, 0x47, 0xac, 0x57, 0x30, 0xd4, 0x3d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x3d, 0xa7, 0x95, 0xb0, - 0x39, 0xb5, 0x96, 0x91, 0x18, 0x26, 0x21, 0x5b, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0xb7, 0x1c, 0xb5, 0x00, - 0x8a, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xbd, 0x85, 0x3f, 0xc6, 0xc8, 0x84, 0x4e, 0xab, 0x93, 0xb0, 0xb9, 0xe6, - 0x74, 0x36, 0x76, 0x9e, 0xc4, 0xf7, 0x67, 0x30, 0x5a, 0x6c, 0x6c, 0xa7, 0x2c, 0x9c, 0xe0, 0x1b, 0x1b, 0x3d, 0x4b, - 0x44, 0x3f, 0x36, 0x32, 0xe2, 0xd0, 0x1b, 0x9b, 0xf7, 0xe0, 0x75, 0xb7, 0xa5, 0xb9, 0xbd, 0x79, 0x10, 0xd9, 0x34, - 0x9d, 0x63, 0x77, 0xa1, 0xf4, 0xa5, 0xc2, 0xcf, 0x5c, 0x63, 0x75, 0x4f, 0x73, 0x7b, 0xc0, 0xac, 0x4d, 0xc2, 0xf8, - 0xbe, 0x3b, 0x0b, 0xc6, 0x63, 0x16, 0xf5, 0x70, 0xcc, 0xb2, 0x90, 0x85, 0x61, 0xb0, 0x48, 0x83, 0xb4, 0x37, 0xf7, - 0x57, 0xbc, 0xd7, 0xc3, 0x4d, 0xbd, 0xb6, 0x79, 0xaf, 0xed, 0xbd, 0x7b, 0x55, 0xba, 0x01, 0x2f, 0x16, 0xea, 0x87, - 0x0f, 0xad, 0xa3, 0xb9, 0x95, 0x79, 0xee, 0xdd, 0xeb, 0x22, 0x61, 0xeb, 0xb9, 0x9f, 0x4c, 0x83, 0xa8, 0xeb, 0xe6, - 0xce, 0xdd, 0x9a, 0x36, 0xc6, 0xd3, 0x93, 0x93, 0x93, 0xdc, 0x19, 0x8b, 0x27, 0x77, 0x3c, 0xce, 0x9d, 0x91, 0x78, - 0x9a, 0x4c, 0x5c, 0x77, 0x32, 0xc9, 0x9d, 0x40, 0x14, 0xb4, 0x5b, 0xa3, 0x71, 0xbb, 0x95, 0x3b, 0xf7, 0x4a, 0x8d, - 0xdc, 0x61, 0xfc, 0x29, 0x61, 0xe3, 0x1e, 0x6e, 0x24, 0x32, 0x2b, 0xed, 0x1e, 0xbb, 0x6e, 0x8e, 0x18, 0xe0, 0xba, - 0x84, 0x9b, 0x50, 0xd6, 0x73, 0xb3, 0xde, 0xbb, 0xa6, 0x56, 0x7c, 0x6e, 0x34, 0x6a, 0xac, 0x37, 0xf6, 0x93, 0x4f, - 0x37, 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x6a, 0x6b, 0x01, 0x06, 0x7b, 0xd5, 0x85, 0x90, 0x5d, 0xbd, 0x61, 0x9c, 0xc0, - 0x99, 0x4d, 0xfc, 0x71, 0xb0, 0x4c, 0xbb, 0x5e, 0x6b, 0xb1, 0x12, 0x45, 0x7c, 0xaf, 0x17, 0x05, 0x78, 0xf6, 0xba, - 0x69, 0x1c, 0x06, 0x63, 0x51, 0xb4, 0xe9, 0x2c, 0x79, 0x2d, 0xb3, 0x87, 0x0e, 0xeb, 0x01, 0x86, 0x5d, 0xf0, 0xc3, - 0x50, 0x73, 0xda, 0xa9, 0xc6, 0xfc, 0x14, 0xe5, 0xcb, 0x9a, 0x9b, 0x12, 0x5c, 0xd0, 0x39, 0xdd, 0x3b, 0x5c, 0xac, - 0xe4, 0x9e, 0xf7, 0x8e, 0x16, 0xab, 0xfc, 0xdb, 0x39, 0x1b, 0x07, 0xbe, 0x66, 0x14, 0xbb, 0xc9, 0x73, 0x41, 0x06, - 0x6d, 0xae, 0x37, 0x6c, 0x53, 0x71, 0x2c, 0x20, 0xb4, 0xe1, 0x93, 0x60, 0xbe, 0x88, 0x93, 0xcc, 0x8f, 0xb2, 0x3c, - 0x1f, 0xdc, 0xe4, 0x79, 0xef, 0x2a, 0x30, 0xae, 0xff, 0x61, 0xd0, 0x3d, 0x4d, 0x3a, 0x9b, 0xdc, 0xbc, 0xb1, 0xde, - 0x32, 0xd5, 0x66, 0x04, 0xae, 0x31, 0xb4, 0x17, 0x51, 0x2b, 0xd3, 0x2d, 0x59, 0xaf, 0x4c, 0x40, 0x96, 0xd5, 0xc9, - 0x06, 0xa5, 0x5c, 0x05, 0x6f, 0x20, 0xa8, 0xf0, 0x96, 0xf5, 0xaf, 0x14, 0xfb, 0x13, 0x20, 0x56, 0xb0, 0x32, 0xf9, - 0x15, 0x3c, 0xdb, 0x44, 0x33, 0x7e, 0xb7, 0x9b, 0x66, 0xfc, 0x25, 0xdb, 0x87, 0x66, 0xfc, 0xee, 0xab, 0xd3, 0x8c, - 0xcf, 0xea, 0x7e, 0x05, 0x17, 0x71, 0x5f, 0x97, 0x1a, 0x06, 0xb8, 0x9a, 0x12, 0x8a, 0xd8, 0x73, 0xf1, 0xbb, 0xdd, - 0x00, 0x44, 0x6f, 0x94, 0x83, 0x8e, 0x6e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0xfa, 0x7f, 0x4f, 0xd4, 0xe7, 0xc9, 0xa4, - 0xff, 0x26, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, 0x4f, 0x80, - 0x73, 0x36, 0x59, 0x1d, 0x8f, 0xa5, 0xf5, 0x59, 0xaf, 0x3c, 0x04, 0x43, 0x9a, 0x7c, 0x0a, 0x17, 0x9c, 0x9a, 0x28, - 0x71, 0xca, 0x32, 0xee, 0x33, 0xfb, 0xfd, 0xc3, 0xc5, 0xd8, 0xb8, 0x88, 0xcd, 0x3c, 0x48, 0xdf, 0x55, 0x1d, 0x60, - 0xb8, 0xee, 0xa7, 0xaf, 0x4e, 0x27, 0xe7, 0x16, 0x64, 0x6a, 0x82, 0x69, 0x78, 0x4d, 0xcd, 0xcf, 0x4b, 0x33, 0xed, - 0xaa, 0x0d, 0x79, 0xa2, 0xab, 0xda, 0x65, 0xcc, 0xbd, 0x0f, 0xd6, 0x9c, 0x02, 0xc4, 0xdc, 0x5d, 0xe8, 0x37, 0x3c, - 0xa6, 0xe6, 0xc1, 0x38, 0xcf, 0xcd, 0x9e, 0x00, 0x84, 0x72, 0xd1, 0xb2, 0x5d, 0x44, 0x5c, 0x7a, 0x2f, 0x6d, 0x1a, - 0xb8, 0x86, 0x90, 0xd4, 0x7f, 0x17, 0xa0, 0x50, 0xe7, 0xca, 0x42, 0x0e, 0x33, 0x5d, 0x23, 0xf0, 0x91, 0xa1, 0x85, - 0x32, 0x21, 0xd0, 0x00, 0x4b, 0xf8, 0x8b, 0x57, 0xa2, 0xa0, 0x6e, 0xc3, 0x49, 0xc0, 0x41, 0x8b, 0x00, 0xf0, 0xf2, - 0x17, 0x72, 0x6d, 0x42, 0x3b, 0xbc, 0x0e, 0x3e, 0xe4, 0xba, 0xa4, 0xfd, 0x70, 0xfb, 0x9d, 0x9d, 0x1e, 0x40, 0x83, - 0xb3, 0x8a, 0xe1, 0xc0, 0x0e, 0x0b, 0x45, 0x20, 0x25, 0xd2, 0x7b, 0xcb, 0x49, 0xef, 0xb5, 0x17, 0x6b, 0x11, 0x21, - 0x23, 0xf3, 0x17, 0x36, 0xb0, 0xf8, 0x88, 0x7b, 0x39, 0xc6, 0x53, 0x82, 0x71, 0xf4, 0x96, 0x29, 0xe0, 0x46, 0x64, - 0x54, 0x11, 0xff, 0xf4, 0x46, 0xcb, 0x24, 0x8d, 0x93, 0xee, 0x22, 0x0e, 0xa2, 0x8c, 0x25, 0x39, 0x82, 0xea, 0x1a, - 0xe1, 0x23, 0xc0, 0x73, 0xb3, 0x8e, 0x17, 0xfe, 0x28, 0xc8, 0x1e, 0xba, 0x2e, 0x27, 0x29, 0xdc, 0x1e, 0xa7, 0x0e, - 0xdc, 0xc6, 0xfa, 0x5d, 0x0e, 0xcd, 0x97, 0x48, 0xf8, 0x25, 0x75, 0x72, 0x46, 0xdd, 0xe6, 0x3d, 0xe5, 0x2d, 0xc5, - 0x08, 0x01, 0xf2, 0xc3, 0x4f, 0xec, 0x29, 0x60, 0x79, 0x58, 0x6a, 0x77, 0xcc, 0xa6, 0x16, 0x62, 0x6d, 0x90, 0xcb, - 0x8b, 0x3f, 0xa7, 0x63, 0x6a, 0x6e, 0x73, 0x31, 0x50, 0x3c, 0xe6, 0x3e, 0x23, 0xeb, 0xfa, 0x90, 0x51, 0xcb, 0xda, - 0xa7, 0xe6, 0x90, 0x4d, 0xe2, 0x84, 0x51, 0x3c, 0x59, 0xef, 0x64, 0xb1, 0xda, 0xbf, 0xfb, 0xed, 0xd3, 0x6f, 0xee, - 0x27, 0x8a, 0x33, 0x43, 0x74, 0x66, 0xee, 0xe8, 0xad, 0x7e, 0x9f, 0x01, 0x69, 0x48, 0x90, 0x1f, 0x51, 0xe8, 0xae, - 0xae, 0xae, 0xf7, 0x1a, 0xc3, 0x76, 0x2d, 0x62, 0x7e, 0xe7, 0x25, 0x2c, 0xf4, 0xb3, 0xe0, 0x4e, 0xd0, 0x8c, 0xed, - 0xa3, 0xc5, 0x4a, 0xac, 0x31, 0x5e, 0x78, 0x8f, 0x58, 0xa4, 0xca, 0x50, 0xc4, 0x22, 0x55, 0x8b, 0x71, 0x91, 0x7a, - 0xb5, 0xd9, 0x88, 0x48, 0x16, 0x95, 0x9b, 0xbe, 0xb3, 0x58, 0xa9, 0x57, 0x74, 0xd1, 0x4c, 0xde, 0xd4, 0xd5, 0x10, - 0x64, 0xf3, 0x60, 0x3c, 0x0e, 0x59, 0x5e, 0x5a, 0xe8, 0xf2, 0x5a, 0x2a, 0xc0, 0x91, 0x70, 0xf0, 0x87, 0x69, 0x1c, - 0x2e, 0x33, 0xd6, 0x0c, 0x2e, 0x02, 0x4e, 0xcb, 0x2d, 0x80, 0x83, 0xbf, 0xcb, 0x63, 0xed, 0x00, 0xb9, 0x0d, 0xdb, - 0xc4, 0xed, 0x41, 0xc4, 0x61, 0xbb, 0x5d, 0x1e, 0x3a, 0xbc, 0x92, 0x83, 0xb6, 0x1a, 0x26, 0x62, 0xc1, 0xb5, 0x44, - 0xd8, 0x5b, 0x73, 0x3c, 0x5e, 0x26, 0xa3, 0xae, 0xca, 0xa2, 0xbc, 0x3c, 0x99, 0x3f, 0xe6, 0x8c, 0xbd, 0x6a, 0x3e, - 0x63, 0xaf, 0xc4, 0x19, 0xdb, 0xbe, 0x33, 0x9f, 0x4e, 0x3c, 0xf8, 0xaf, 0x57, 0x4c, 0xa8, 0xeb, 0x6a, 0xed, 0xc5, - 0x4a, 0xf3, 0x16, 0x2b, 0xcd, 0x6e, 0x2d, 0x56, 0x1a, 0x76, 0x8d, 0xf6, 0x20, 0x96, 0xd3, 0x32, 0x2d, 0x57, 0x83, - 0x42, 0xf8, 0x73, 0x4b, 0xaf, 0xbc, 0x43, 0x78, 0x07, 0xad, 0x3a, 0xf5, 0x77, 0xad, 0xed, 0x47, 0x9d, 0xce, 0x92, - 0x40, 0xda, 0xa6, 0x93, 0xf9, 0xc3, 0x21, 0x1b, 0x77, 0x27, 0xf1, 0x68, 0x99, 0xfe, 0x8b, 0x8f, 0x9f, 0x03, 0x71, - 0x2b, 0x22, 0xa8, 0xf4, 0x23, 0x9a, 0x82, 0xa2, 0xe4, 0x8e, 0x89, 0x1e, 0xd6, 0x72, 0x9d, 0xba, 0x14, 0x1e, 0xb9, - 0xe5, 0x1c, 0x36, 0x6c, 0xf2, 0x66, 0x40, 0xff, 0x61, 0xab, 0xb4, 0x19, 0xc5, 0x7c, 0x01, 0x58, 0xb6, 0x82, 0xe3, - 0xf1, 0xd0, 0xe0, 0xab, 0xe9, 0x9e, 0x34, 0x0f, 0xf7, 0x5a, 0x7c, 0xe9, 0x46, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x8e, - 0x29, 0xdb, 0x7b, 0xdd, 0xb4, 0x47, 0x6a, 0xbd, 0x6e, 0xb9, 0x10, 0x8a, 0xba, 0x7b, 0x62, 0xf9, 0xa7, 0xaf, 0x0e, - 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xc9, 0x9a, 0x08, 0xf5, 0x8b, 0xb2, 0x25, 0x38, 0x91, 0x4a, 0x48, 0x88, 0xef, 0x5f, - 0x7f, 0x32, 0x79, 0x5c, 0x83, 0xbd, 0x6b, 0x93, 0x29, 0x55, 0xb5, 0xf6, 0xf7, 0x71, 0x0c, 0xa9, 0x3b, 0xeb, 0xd5, - 0x05, 0x78, 0xc8, 0xd8, 0x3d, 0xeb, 0x43, 0x23, 0xc1, 0x47, 0x90, 0x16, 0x5f, 0xc7, 0x36, 0xc4, 0x4a, 0xbc, 0xdd, - 0xc4, 0x4a, 0xbc, 0xd9, 0xcd, 0x4a, 0xfc, 0x75, 0x2f, 0x56, 0xe2, 0xcd, 0x57, 0x67, 0x25, 0xde, 0xd6, 0x59, 0x89, - 0xab, 0x58, 0xd8, 0xcf, 0x5a, 0x17, 0x4b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0x2e, 0xe3, 0x7e, 0xc7, 0xa5, 0x90, 0xc7, - 0x57, 0xbf, 0x9b, 0xb1, 0xc0, 0x8d, 0xf8, 0x1e, 0xcd, 0xc9, 0x0a, 0xd6, 0x82, 0x63, 0x76, 0xfc, 0x8e, 0x52, 0x1c, - 0xc6, 0xd1, 0xf4, 0x67, 0x50, 0xca, 0x82, 0x38, 0x30, 0x51, 0x5e, 0x04, 0xe9, 0xcf, 0xf1, 0x62, 0xb9, 0xb8, 0x80, - 0xbe, 0x3e, 0x06, 0x69, 0x30, 0x0c, 0x99, 0xf4, 0x44, 0x26, 0xf3, 0x37, 0x2e, 0x13, 0x07, 0x8b, 0x53, 0xf1, 0xd3, - 0x5f, 0x89, 0x9f, 0x68, 0x93, 0xca, 0x7f, 0x93, 0x5d, 0x9d, 0xde, 0xcc, 0x88, 0x08, 0x25, 0xa0, 0x32, 0xe8, 0xc7, - 0x33, 0x23, 0x57, 0xb1, 0xd9, 0x30, 0x4b, 0x61, 0xef, 0xb0, 0xb1, 0x1f, 0x56, 0x63, 0x6a, 0x96, 0xa6, 0x25, 0x43, - 0x70, 0xd5, 0xc5, 0xf0, 0xf3, 0x78, 0x99, 0xb2, 0x71, 0x7c, 0x1f, 0xe9, 0x56, 0x24, 0x9d, 0x0c, 0x40, 0xc3, 0x29, - 0xdb, 0x60, 0xf2, 0xc8, 0x0f, 0x48, 0x28, 0xc7, 0x89, 0xa1, 0x43, 0xee, 0xd2, 0xe5, 0xc2, 0x26, 0x55, 0xb3, 0x8d, - 0x53, 0xd4, 0x65, 0x96, 0xa3, 0x27, 0x86, 0x11, 0xf7, 0x1f, 0xd7, 0x52, 0x98, 0x6a, 0xc4, 0x0e, 0x97, 0x0a, 0xa7, - 0x46, 0x24, 0x84, 0x8b, 0x22, 0x0e, 0x46, 0xc3, 0xc2, 0xf1, 0x37, 0xe4, 0xba, 0x5a, 0xbc, 0x85, 0x28, 0x22, 0xf9, - 0x92, 0xaf, 0x07, 0x8f, 0x0a, 0x41, 0x8f, 0xaf, 0x15, 0x30, 0xbe, 0xbb, 0x63, 0x49, 0xe8, 0x3f, 0x18, 0x66, 0x1e, - 0x47, 0x3f, 0x02, 0x00, 0xde, 0xc4, 0xf7, 0x91, 0x5a, 0x01, 0x93, 0xb5, 0x34, 0xec, 0xa5, 0xc6, 0xf8, 0x25, 0xe0, - 0xb8, 0xa2, 0x8c, 0x00, 0xd2, 0xe4, 0x4e, 0xd9, 0xdf, 0x2d, 0xfa, 0xf7, 0x1f, 0x66, 0x6e, 0x5d, 0xc6, 0xf2, 0x43, - 0x7f, 0x5b, 0xec, 0xf1, 0x99, 0xe7, 0xcf, 0x9f, 0x6c, 0x9e, 0x76, 0x39, 0x3d, 0x7b, 0x43, 0x6b, 0x73, 0xe3, 0x29, - 0x80, 0x51, 0x5c, 0xc5, 0xcb, 0xd1, 0x0c, 0x0d, 0x5d, 0xbf, 0xde, 0x7c, 0x33, 0xe8, 0x13, 0xb3, 0x94, 0xca, 0xa9, - 0x57, 0x8a, 0x0a, 0x28, 0xe0, 0xf7, 0xdf, 0x42, 0x00, 0xce, 0xff, 0x21, 0x18, 0xea, 0xbb, 0x86, 0x73, 0xf1, 0xc1, - 0xe3, 0x36, 0x6f, 0x0f, 0x92, 0x69, 0xf2, 0xd0, 0x16, 0x42, 0xb9, 0xd6, 0x8c, 0x64, 0xf2, 0x2a, 0xd0, 0xd4, 0x30, - 0x72, 0x9b, 0x22, 0xe4, 0x89, 0xaf, 0x30, 0x87, 0xd8, 0x74, 0xee, 0x68, 0x60, 0x31, 0x8e, 0xad, 0x2a, 0x48, 0x86, - 0x9b, 0x3c, 0x30, 0x44, 0x5f, 0xd5, 0x77, 0xf3, 0x20, 0xb2, 0x30, 0x0a, 0x7c, 0xfd, 0x8d, 0xbf, 0x82, 0x38, 0xc8, - 0x80, 0xdc, 0xaa, 0xaf, 0xa0, 0xd0, 0x52, 0xfd, 0xe6, 0x20, 0xd5, 0x93, 0xde, 0x08, 0x09, 0xa1, 0xc5, 0x1b, 0xfc, - 0x49, 0xd3, 0x34, 0x4d, 0xb2, 0x11, 0x9a, 0xe4, 0x23, 0xb0, 0x1c, 0xd9, 0x01, 0xd0, 0x96, 0xe4, 0x8b, 0x15, 0x95, - 0x00, 0x67, 0x80, 0x3a, 0x59, 0x51, 0xc0, 0x43, 0xfd, 0x75, 0x5c, 0x51, 0x20, 0x18, 0x7a, 0x08, 0xd3, 0xe6, 0x27, - 0x10, 0x11, 0xb8, 0xab, 0x21, 0xc3, 0x8e, 0x6f, 0xb9, 0x24, 0x58, 0x73, 0xe9, 0x71, 0xd0, 0x63, 0xcd, 0x31, 0xe1, - 0x22, 0x05, 0x0b, 0x82, 0xd6, 0xa1, 0x12, 0xe2, 0xd9, 0x62, 0x0d, 0xb8, 0x11, 0xf9, 0xa2, 0x55, 0x36, 0x67, 0xd1, - 0x52, 0xc7, 0x9c, 0x50, 0x18, 0xa3, 0x0f, 0xea, 0xbc, 0x21, 0x62, 0x0b, 0xb0, 0x4d, 0x73, 0xcb, 0x19, 0xdd, 0x85, - 0x29, 0x47, 0xa9, 0xbe, 0x35, 0xe2, 0x8a, 0xcd, 0x94, 0xe3, 0xb6, 0xea, 0x0d, 0xc1, 0x97, 0x34, 0xae, 0x3a, 0x72, - 0x91, 0x25, 0x34, 0xf4, 0x41, 0xd1, 0x31, 0xb8, 0xb8, 0x48, 0x80, 0xdd, 0xf0, 0xab, 0x8b, 0x26, 0x35, 0x32, 0x7e, - 0x45, 0x50, 0x94, 0x98, 0xf5, 0x6e, 0xf8, 0x38, 0x21, 0x30, 0xd1, 0xc6, 0x7e, 0x46, 0xb5, 0x7e, 0x36, 0x4c, 0xfa, - 0x13, 0x7b, 0xa0, 0x8b, 0x84, 0x40, 0xf5, 0x89, 0x3d, 0x80, 0xed, 0xdf, 0x5b, 0x90, 0xa6, 0xe8, 0x5b, 0xd0, 0xb5, - 0x05, 0xa1, 0xfe, 0x47, 0x10, 0xac, 0x6a, 0xcb, 0x01, 0x72, 0xf3, 0x2d, 0x58, 0x1c, 0x41, 0x0c, 0x59, 0x9d, 0xc5, - 0x21, 0xe6, 0x26, 0xfe, 0x46, 0x23, 0x8c, 0xed, 0x86, 0xa3, 0x61, 0xbe, 0xf0, 0x5c, 0xf7, 0xa0, 0x56, 0x1f, 0x04, - 0xd9, 0x4d, 0xb5, 0x4d, 0x2b, 0xeb, 0x7b, 0xae, 0x1d, 0xbc, 0x70, 0x5a, 0xbd, 0xda, 0x1d, 0xad, 0xc4, 0x92, 0x1c, - 0xa0, 0xf8, 0xeb, 0xec, 0xd9, 0xda, 0xa8, 0x1d, 0x48, 0xb3, 0x6a, 0x32, 0x8f, 0x63, 0xcb, 0xb9, 0xfc, 0x6b, 0x50, - 0xbf, 0xfa, 0x29, 0x92, 0x25, 0xe5, 0x35, 0x19, 0x40, 0x34, 0x64, 0x03, 0x8e, 0xd1, 0x9f, 0xb5, 0x97, 0x9a, 0x41, - 0xc7, 0xc7, 0x34, 0x07, 0x32, 0x5d, 0xb6, 0xf0, 0x29, 0x53, 0x3b, 0xa8, 0x7c, 0x31, 0xad, 0x62, 0x38, 0x1e, 0x77, - 0x95, 0x15, 0x1a, 0xbd, 0xad, 0xd4, 0x02, 0xf6, 0xbf, 0xe1, 0xfa, 0x74, 0x86, 0x10, 0x97, 0x00, 0x6a, 0x40, 0xec, - 0xf4, 0x9d, 0x1d, 0x2e, 0x17, 0xe5, 0xee, 0xca, 0x97, 0xe4, 0xfe, 0x9d, 0xe1, 0xa5, 0x83, 0x3a, 0x34, 0xd9, 0x5f, - 0xf3, 0x75, 0xf7, 0xc8, 0x2e, 0x59, 0x34, 0x2e, 0x77, 0x58, 0xb9, 0xbf, 0xf6, 0xef, 0xae, 0x84, 0x51, 0x20, 0xa9, - 0x40, 0xdc, 0x80, 0x51, 0xf2, 0x38, 0xc2, 0xcd, 0x4f, 0xc7, 0x2d, 0xd8, 0x8b, 0x8a, 0xc1, 0x06, 0x14, 0x11, 0x4c, - 0x36, 0x53, 0x84, 0xe2, 0x10, 0xb9, 0x1a, 0xdd, 0x82, 0x0d, 0x41, 0x88, 0x6e, 0xdc, 0x89, 0x99, 0xb0, 0x29, 0x2c, - 0xda, 0x04, 0x3c, 0x16, 0xe5, 0xbe, 0x52, 0xeb, 0x60, 0xb7, 0xd4, 0x3a, 0xdb, 0x25, 0xb5, 0x26, 0x77, 0xaa, 0xfb, - 0xc4, 0x5f, 0x28, 0x1e, 0x79, 0x82, 0x38, 0x57, 0x1d, 0xf3, 0x4a, 0xa2, 0x6e, 0xf4, 0xbe, 0x12, 0xad, 0x6a, 0xbd, - 0x91, 0x95, 0x20, 0x8a, 0xbf, 0x15, 0x06, 0x45, 0x28, 0xd4, 0x55, 0xd9, 0xf8, 0x55, 0x21, 0x1b, 0x27, 0xae, 0xa6, - 0x70, 0xa4, 0x11, 0xd4, 0xbf, 0xe2, 0xa4, 0x26, 0xb9, 0x83, 0xc2, 0x59, 0xad, 0x18, 0xa9, 0xe2, 0x7e, 0x55, 0x30, - 0x1a, 0x8a, 0x53, 0x9f, 0xe0, 0x32, 0xca, 0xbe, 0x7d, 0xe5, 0xaa, 0x85, 0xf7, 0x55, 0x51, 0x0e, 0x52, 0x77, 0x1c, - 0xb2, 0x2c, 0x56, 0xb7, 0x4d, 0xd9, 0xfd, 0x46, 0x7d, 0xad, 0x6c, 0x12, 0xe9, 0x27, 0x43, 0x00, 0x16, 0x62, 0xfa, - 0x8a, 0x5e, 0x5b, 0xda, 0x40, 0xe0, 0x20, 0x1b, 0xdc, 0xfa, 0x76, 0x4b, 0xe7, 0x29, 0x5f, 0x42, 0xa1, 0x85, 0x57, - 0x65, 0x10, 0x08, 0xdf, 0x9b, 0x75, 0xc3, 0x2d, 0x8f, 0x97, 0x3c, 0xbf, 0xdf, 0x41, 0xbc, 0xa8, 0xb9, 0xaa, 0x22, - 0x1f, 0x4f, 0xa6, 0x4d, 0xe6, 0xb9, 0x58, 0xb5, 0xde, 0x29, 0x09, 0x71, 0xd6, 0xdc, 0x33, 0xa6, 0x2c, 0xa3, 0xe7, - 0x35, 0xba, 0xe2, 0xbb, 0x7c, 0xeb, 0x24, 0xcb, 0x08, 0x63, 0xdb, 0xdb, 0x59, 0xe2, 0x8f, 0x3e, 0x29, 0x43, 0x16, - 0x72, 0x4e, 0x90, 0x01, 0x97, 0x35, 0x05, 0x3d, 0x1f, 0x43, 0x41, 0xb2, 0xae, 0xd3, 0x4a, 0x15, 0xe9, 0x4b, 0xf7, - 0xa9, 0xdb, 0xf6, 0x5f, 0x4d, 0x0e, 0x2b, 0x42, 0xd1, 0x56, 0xa7, 0x2c, 0x32, 0xdf, 0x30, 0x8e, 0x6c, 0xb6, 0x9c, - 0x0f, 0xd7, 0xaa, 0x6c, 0x55, 0x11, 0xb9, 0xd6, 0xc5, 0xac, 0xea, 0x67, 0x27, 0x93, 0x49, 0x59, 0xd0, 0xe8, 0x6a, - 0x87, 0x28, 0x2c, 0x7c, 0xea, 0xba, 0x6e, 0x75, 0xec, 0xdb, 0xc1, 0x6e, 0xa3, 0xdc, 0xf6, 0xa4, 0x71, 0xc4, 0x08, - 0xdb, 0x5d, 0xf0, 0xab, 0x83, 0x23, 0x77, 0x8a, 0x93, 0x5d, 0x32, 0x8b, 0xe8, 0x91, 0x31, 0x44, 0x90, 0xb1, 0x79, - 0xda, 0x1d, 0x31, 0xd4, 0xc1, 0x38, 0xca, 0x81, 0x46, 0xc3, 0x01, 0x7b, 0x0a, 0xa6, 0x22, 0x9e, 0xd8, 0x15, 0xae, - 0x86, 0xf2, 0xf0, 0x9a, 0xf0, 0x5e, 0x7c, 0x04, 0x0f, 0xca, 0xba, 0x2e, 0xd3, 0xc6, 0x69, 0x75, 0xdc, 0x3f, 0x97, - 0xea, 0x69, 0x70, 0x01, 0xae, 0x85, 0x42, 0x9b, 0xe4, 0xb3, 0xf8, 0xff, 0x52, 0xfe, 0xff, 0x6a, 0xb1, 0x2a, 0xdb, - 0x8f, 0x9c, 0x80, 0x44, 0xbb, 0x38, 0x2d, 0x34, 0xea, 0xa6, 0x3d, 0x20, 0xad, 0x0c, 0x26, 0xaa, 0x02, 0x1d, 0x94, - 0xf4, 0xa5, 0x04, 0x20, 0x0d, 0xe2, 0x77, 0xa4, 0x98, 0x61, 0x89, 0x0b, 0x11, 0x62, 0x91, 0xbe, 0x0e, 0xe6, 0x60, - 0xbd, 0x3c, 0x41, 0xfd, 0x41, 0x69, 0x4f, 0x80, 0x36, 0xbe, 0x36, 0xb7, 0xbd, 0xc4, 0xfd, 0x55, 0xbd, 0x96, 0xe8, - 0x18, 0x40, 0xe6, 0xc1, 0x21, 0x44, 0x43, 0x02, 0xad, 0xb2, 0xb9, 0x69, 0x94, 0xf2, 0xad, 0xaa, 0x67, 0x13, 0x03, - 0xc3, 0xee, 0x9a, 0xab, 0x50, 0xdf, 0x42, 0x5b, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0x9f, 0x6d, 0x58, 0x62, 0x75, 0x3f, - 0x7a, 0xb8, 0xe4, 0xb8, 0x7f, 0x6d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0x28, 0x5f, 0xfc, 0x6b, 0xa3, 0x40, 0xef, 0xaa, - 0x24, 0xa1, 0xe3, 0xd6, 0xe2, 0x2d, 0x73, 0xaf, 0xda, 0xf3, 0x20, 0xda, 0xbf, 0xae, 0xbf, 0xda, 0xbb, 0x2e, 0x5c, - 0x18, 0x7b, 0x57, 0x86, 0x1b, 0x87, 0x2c, 0x17, 0xb2, 0xfe, 0x5f, 0x15, 0x81, 0xa2, 0xea, 0x75, 0xac, 0x63, 0x2b, - 0xa2, 0xf2, 0xaf, 0x96, 0x40, 0x7c, 0xee, 0x95, 0xe0, 0x41, 0x13, 0x39, 0xda, 0xf4, 0x63, 0xed, 0x44, 0x3b, 0x6e, - 0x6b, 0x47, 0xae, 0x4e, 0x5c, 0x58, 0x5f, 0xef, 0xb4, 0x0a, 0x6f, 0xc2, 0x43, 0x57, 0x3f, 0x3b, 0x9d, 0x8a, 0x4b, - 0x62, 0x12, 0x84, 0x21, 0xa1, 0x8a, 0x34, 0x4b, 0xe2, 0x4f, 0xac, 0xac, 0x66, 0xa1, 0x32, 0x6e, 0x04, 0xd2, 0x12, - 0x8f, 0x70, 0x76, 0x46, 0xfe, 0xa2, 0x8b, 0x67, 0x43, 0x2d, 0x04, 0x03, 0x4e, 0x2a, 0xc5, 0x4f, 0xc0, 0x1d, 0x3c, - 0xd4, 0xcf, 0x4e, 0x21, 0x84, 0xa1, 0x36, 0xee, 0xeb, 0x3f, 0xb6, 0x8e, 0x35, 0xaf, 0x73, 0x67, 0xb7, 0x47, 0xae, - 0xed, 0x39, 0x87, 0x9a, 0xeb, 0x1c, 0xd9, 0x2d, 0xe7, 0x58, 0x6b, 0x39, 0x1d, 0xf8, 0x77, 0xe4, 0x39, 0xaf, 0x34, - 0x17, 0x9e, 0x34, 0xcf, 0x69, 0xe3, 0xbf, 0x2d, 0xe7, 0xf8, 0xae, 0x4d, 0x37, 0xbd, 0x2f, 0xdd, 0xaa, 0x2a, 0xa3, - 0x00, 0x27, 0x10, 0xfd, 0xe0, 0xec, 0x74, 0x99, 0x32, 0x6d, 0xd5, 0xd7, 0x5f, 0xe9, 0xda, 0x2c, 0x61, 0x93, 0xbe, - 0xfe, 0xd4, 0x57, 0x4a, 0xbd, 0x93, 0xc6, 0xe2, 0xd6, 0x71, 0x63, 0x71, 0xfb, 0xa8, 0xb1, 0xf8, 0xb0, 0x53, 0x2e, - 0x3e, 0x98, 0xd2, 0x2b, 0x25, 0x83, 0xe0, 0xdc, 0xcf, 0x92, 0x60, 0x65, 0x78, 0x1a, 0xa0, 0x6b, 0x1b, 0xfe, 0x39, - 0x6e, 0x99, 0xb2, 0xd5, 0x10, 0x5a, 0x49, 0x68, 0x1c, 0x9f, 0x68, 0xde, 0xd1, 0x5f, 0x5a, 0x47, 0x23, 0xa8, 0x07, - 0xf9, 0x2e, 0xe1, 0xef, 0xae, 0x7d, 0x32, 0x72, 0x35, 0x68, 0xe8, 0xc1, 0x7f, 0xb3, 0x4e, 0x6b, 0x44, 0x0f, 0x2e, - 0xbc, 0xff, 0xe8, 0x1d, 0xa7, 0xae, 0xed, 0xc1, 0x7f, 0xbf, 0x49, 0x95, 0x3b, 0x28, 0xfc, 0xd5, 0x7e, 0x0f, 0x5d, - 0xad, 0x7d, 0x32, 0x6b, 0x39, 0xaf, 0xee, 0x8e, 0x9d, 0x93, 0x99, 0x77, 0xfc, 0x91, 0x9e, 0x42, 0xbb, 0xe5, 0xbc, - 0x82, 0xbf, 0x8f, 0x6d, 0x77, 0x66, 0x7b, 0xce, 0xc9, 0x5d, 0xdb, 0x69, 0x87, 0xf6, 0x91, 0x73, 0x02, 0x7f, 0xbf, - 0x01, 0x78, 0x01, 0xae, 0x3c, 0x41, 0xa9, 0x06, 0x1b, 0xa3, 0x62, 0xbf, 0xa1, 0x7e, 0xa4, 0x75, 0xa8, 0x75, 0x0e, - 0xff, 0x72, 0x72, 0x67, 0x1f, 0xce, 0xbc, 0xd6, 0x9d, 0xbd, 0xf1, 0xe7, 0x47, 0x80, 0xfc, 0xf6, 0x85, 0x03, 0x30, - 0x62, 0x46, 0x92, 0x3f, 0x0d, 0xac, 0xcb, 0x4d, 0x62, 0xf4, 0xf7, 0xbb, 0xc5, 0xe8, 0x3f, 0x2c, 0xf7, 0x11, 0xa3, - 0xbf, 0xff, 0xea, 0x62, 0xf4, 0xcb, 0xaa, 0x15, 0xf7, 0xfb, 0x6a, 0xe4, 0xf4, 0x5f, 0xd6, 0x55, 0x22, 0x39, 0xf0, - 0x8d, 0xeb, 0xab, 0xe5, 0x0d, 0xc4, 0xfe, 0x79, 0x1f, 0xf7, 0x7f, 0x58, 0x96, 0x4c, 0x94, 0x62, 0xc0, 0x00, 0xef, - 0x63, 0xc2, 0x00, 0xbf, 0x2d, 0xfb, 0x60, 0x17, 0xc1, 0x6f, 0xcd, 0x60, 0x6c, 0xcf, 0xfc, 0x70, 0x22, 0x6f, 0x5c, - 0x28, 0xe9, 0x61, 0x31, 0xd8, 0xcc, 0xc3, 0x65, 0x02, 0xca, 0x9a, 0xe5, 0x3c, 0x4a, 0xbb, 0x47, 0x2e, 0xa0, 0xf9, - 0xd6, 0x24, 0xc9, 0x2b, 0x8d, 0x1d, 0x11, 0x2d, 0xe9, 0x96, 0xdb, 0xf4, 0x6f, 0x7c, 0x8f, 0x26, 0x6b, 0xcd, 0xbd, - 0x7b, 0xf5, 0x7e, 0x35, 0xb0, 0x05, 0x11, 0x26, 0x7d, 0x40, 0x6c, 0x34, 0xbd, 0x2f, 0x1b, 0x8e, 0x55, 0x4c, 0x05, - 0x37, 0x8f, 0x14, 0x46, 0x52, 0x6d, 0xef, 0x95, 0x0d, 0xcf, 0x76, 0x4d, 0xb3, 0xe1, 0xf3, 0xa5, 0xe6, 0x5b, 0xac, - 0xde, 0x64, 0xc7, 0x55, 0x50, 0x55, 0xf2, 0x7e, 0x35, 0x02, 0xa4, 0xa0, 0x3d, 0x0b, 0xd3, 0xb8, 0x82, 0xf0, 0x71, - 0x35, 0xbc, 0x8d, 0x5d, 0xe5, 0x5d, 0xa9, 0x4f, 0xd5, 0x9c, 0xee, 0xc5, 0x1a, 0xe9, 0xc1, 0xe0, 0x37, 0x20, 0x6c, - 0xf8, 0x7d, 0x3c, 0x8c, 0x55, 0x38, 0xaf, 0x95, 0x7e, 0x89, 0xd4, 0xce, 0x67, 0xde, 0xba, 0x4e, 0xda, 0x6c, 0x34, - 0xa4, 0xf5, 0xd8, 0x5c, 0xdc, 0xd1, 0xf8, 0x79, 0x32, 0x5b, 0xcd, 0xc9, 0xb4, 0x18, 0x2d, 0x73, 0xb7, 0x75, 0x26, - 0xea, 0x3d, 0x85, 0x4d, 0x6c, 0xf1, 0x07, 0xd5, 0x6b, 0x7d, 0x3d, 0x81, 0x1c, 0xcd, 0x5d, 0x24, 0x22, 0x14, 0x0a, - 0xaa, 0x85, 0x36, 0xb6, 0xbd, 0x2d, 0xe6, 0x1f, 0x6a, 0xc7, 0xbc, 0x13, 0xb4, 0xd5, 0xdd, 0x66, 0x31, 0x22, 0x5d, - 0x1b, 0xd6, 0x25, 0x05, 0xaa, 0xd7, 0x39, 0xb6, 0xbc, 0x23, 0xcb, 0x39, 0xee, 0x98, 0xb9, 0x38, 0x70, 0x6a, 0x97, - 0x25, 0x80, 0x80, 0xc9, 0xae, 0x1c, 0x66, 0x10, 0x05, 0x59, 0xe0, 0x87, 0x39, 0xa0, 0xfa, 0x32, 0xcd, 0xfb, 0xcf, - 0x65, 0x9a, 0xc1, 0x1c, 0x05, 0x49, 0x86, 0xe6, 0xca, 0xf6, 0x90, 0x65, 0xf7, 0x8c, 0x45, 0x1b, 0x54, 0xb9, 0x55, - 0xeb, 0xe7, 0x3f, 0xce, 0x16, 0x34, 0x27, 0x3b, 0x8b, 0x61, 0x16, 0xf1, 0xfd, 0x21, 0x4c, 0x75, 0xf3, 0x81, 0xf5, - 0xd3, 0x26, 0x84, 0xfb, 0xcf, 0xdd, 0x08, 0x37, 0x63, 0xfb, 0x20, 0xdc, 0x7f, 0x7e, 0x75, 0x84, 0xfb, 0x93, 0x8a, - 0x70, 0x4b, 0x9e, 0x2a, 0x85, 0x4c, 0xf4, 0x03, 0x3e, 0x1b, 0x10, 0x72, 0xf8, 0xa5, 0x7e, 0x40, 0xe4, 0xa5, 0xae, - 0xa4, 0x82, 0xfd, 0x58, 0xca, 0x6d, 0x83, 0x2c, 0x3b, 0x86, 0x48, 0xa5, 0x3c, 0x1a, 0x90, 0x26, 0x55, 0x26, 0xfc, - 0x86, 0x3e, 0x2f, 0xa2, 0x2c, 0x74, 0xde, 0x73, 0xb6, 0x04, 0x54, 0x10, 0x3f, 0xc4, 0xc9, 0xdc, 0xc7, 0xf0, 0x70, - 0x3a, 0xe6, 0xc4, 0x83, 0x07, 0x17, 0xbc, 0xa3, 0x46, 0x71, 0x34, 0x96, 0x72, 0x74, 0xd6, 0xbf, 0x26, 0x7a, 0x50, - 0x7f, 0x60, 0x7e, 0xa2, 0x5b, 0xf4, 0x1a, 0x16, 0xf7, 0x45, 0xdb, 0x7d, 0xd1, 0x3a, 0x7c, 0x71, 0xe4, 0xc2, 0xff, - 0x3c, 0xd6, 0xce, 0x2d, 0x5e, 0x71, 0x1e, 0x47, 0x90, 0x96, 0x43, 0xd4, 0xdc, 0x54, 0xed, 0x9e, 0xb1, 0x4f, 0x45, - 0xad, 0xe3, 0xe6, 0x4a, 0x63, 0xff, 0xa1, 0xa8, 0xd3, 0x58, 0x63, 0x16, 0x2f, 0x95, 0x61, 0x35, 0x8c, 0x26, 0x88, - 0x96, 0x20, 0x19, 0x52, 0x6a, 0xa8, 0xaf, 0xf9, 0x74, 0x8b, 0x79, 0xb1, 0x76, 0x7e, 0x53, 0xe4, 0xfe, 0x11, 0x39, - 0x48, 0x76, 0x42, 0x90, 0x0b, 0xd5, 0x5d, 0x8c, 0x1c, 0x8e, 0xd9, 0x6f, 0x34, 0xc8, 0xbc, 0x57, 0x24, 0x78, 0xc7, - 0x05, 0xca, 0x92, 0x65, 0x34, 0xa2, 0x1c, 0xee, 0xfe, 0x30, 0x35, 0x82, 0x03, 0x88, 0x1d, 0x8a, 0x1f, 0x36, 0x71, - 0xd5, 0xfc, 0x33, 0xb7, 0x48, 0x94, 0x90, 0x8a, 0x55, 0xf1, 0x5f, 0x64, 0x56, 0x42, 0xe9, 0x55, 0x71, 0x69, 0xed, - 0xbe, 0xff, 0x42, 0x36, 0x7c, 0x91, 0x59, 0x90, 0xe2, 0x14, 0x96, 0xfb, 0xf9, 0x73, 0xaa, 0x05, 0x49, 0x07, 0x69, - 0x5a, 0xe7, 0xa3, 0x22, 0xf8, 0x98, 0xe6, 0x4f, 0x63, 0x8a, 0x3f, 0xd6, 0x1d, 0x59, 0xf1, 0xcb, 0x97, 0x67, 0x7d, - 0xcf, 0xe4, 0x29, 0x33, 0x4b, 0xf9, 0x9d, 0x2e, 0xf7, 0x53, 0x8d, 0x9b, 0x8d, 0x4e, 0x5b, 0x8b, 0x20, 0x9a, 0x0a, - 0xcd, 0xb4, 0xc4, 0x5e, 0x90, 0x6f, 0x81, 0x54, 0x60, 0xbe, 0x50, 0x51, 0x8b, 0x3a, 0x77, 0x2c, 0x81, 0x74, 0x9f, - 0x7d, 0xbd, 0xed, 0xb8, 0x8e, 0xab, 0xcb, 0x86, 0x93, 0x60, 0xda, 0x5f, 0xc7, 0x99, 0x0f, 0x99, 0x6b, 0xc2, 0x78, - 0x0a, 0x9e, 0x1f, 0x59, 0x90, 0x85, 0x90, 0x06, 0x05, 0x5c, 0x40, 0xe6, 0xc4, 0x35, 0xe6, 0xdc, 0x1e, 0xd7, 0x4f, - 0x3e, 0x61, 0x2a, 0x3c, 0xe1, 0xf4, 0x85, 0xf1, 0x70, 0x7e, 0x84, 0xcb, 0xd0, 0xd0, 0x0d, 0x48, 0xc4, 0xc8, 0x92, - 0xd4, 0x56, 0xed, 0xdb, 0xbb, 0x1a, 0xb4, 0x81, 0x24, 0xe9, 0xd8, 0xc1, 0x24, 0xf1, 0xe7, 0x10, 0x31, 0x7c, 0x9d, - 0x5b, 0x1c, 0xd3, 0xea, 0x1c, 0xd5, 0x6a, 0xde, 0xab, 0x23, 0x4b, 0x6b, 0x79, 0x96, 0xe6, 0x02, 0xba, 0xd5, 0x73, - 0x6b, 0x9d, 0xdf, 0xf4, 0x76, 0xa9, 0xe8, 0x08, 0xbf, 0x3c, 0xa5, 0x79, 0x90, 0x72, 0x8e, 0x0b, 0x3f, 0x33, 0x0a, - 0x6f, 0x68, 0x28, 0xb1, 0xbc, 0x03, 0x12, 0xd3, 0x5f, 0xb1, 0x55, 0x66, 0x62, 0x9a, 0x10, 0x5e, 0x25, 0x30, 0xd7, - 0xe8, 0x9a, 0x16, 0x44, 0x5a, 0xf0, 0xf9, 0xb3, 0x11, 0x80, 0xf9, 0x7d, 0x5f, 0x81, 0x0f, 0x3c, 0x9b, 0x25, 0x80, - 0x05, 0x85, 0x62, 0x09, 0x81, 0x05, 0xbe, 0x31, 0xf0, 0x6f, 0x51, 0x2c, 0x7e, 0x70, 0xc5, 0x9e, 0x13, 0xfa, 0xd1, - 0x14, 0x50, 0x9a, 0x1f, 0x4d, 0x6b, 0x06, 0x04, 0xe4, 0x5d, 0x57, 0x29, 0x2d, 0xba, 0x2a, 0x94, 0xfb, 0xe9, 0xf7, - 0x0f, 0x57, 0x94, 0x06, 0x09, 0x52, 0x6e, 0xfb, 0x63, 0x74, 0x05, 0x2b, 0x74, 0x0f, 0x2f, 0xfb, 0xdf, 0x9c, 0xce, - 0x59, 0xe6, 0x93, 0xe0, 0x12, 0x58, 0x3c, 0x20, 0x07, 0xb4, 0x91, 0x48, 0x61, 0x4a, 0x0c, 0xde, 0x98, 0xdd, 0x05, - 0x23, 0xce, 0xa7, 0x59, 0x1a, 0xbf, 0xa7, 0x6c, 0xb4, 0x51, 0xea, 0x7b, 0x16, 0x99, 0xc8, 0x8e, 0x7c, 0x0c, 0x82, - 0xd8, 0x8f, 0x62, 0xfd, 0xec, 0x1b, 0xe9, 0x4d, 0xb4, 0x69, 0x11, 0x20, 0x17, 0xe1, 0x75, 0xc2, 0xc2, 0x7f, 0xf5, - 0xbf, 0x81, 0x8b, 0xfb, 0x9b, 0x1b, 0xdd, 0xec, 0x65, 0x0e, 0xf2, 0x31, 0xdf, 0x34, 0xe4, 0xe4, 0x43, 0x1e, 0x95, - 0x33, 0x9b, 0x6d, 0x85, 0xd9, 0x84, 0xdf, 0xbb, 0x59, 0xd7, 0xb3, 0x53, 0xbc, 0xd0, 0xce, 0x80, 0xbb, 0x58, 0x97, - 0x78, 0x4e, 0xaf, 0x87, 0x0c, 0xea, 0x30, 0xf4, 0x47, 0x9f, 0x04, 0x87, 0xaa, 0x3e, 0xec, 0xc3, 0x8b, 0x4a, 0xca, - 0xae, 0x71, 0x2f, 0xe3, 0x56, 0x5e, 0xe3, 0x97, 0xf1, 0x53, 0xf7, 0xb3, 0x20, 0x93, 0xcc, 0x30, 0x3e, 0xe4, 0xa0, - 0xcd, 0xc1, 0xf1, 0x15, 0xec, 0x0f, 0x30, 0xa8, 0xde, 0xc9, 0x5f, 0x3a, 0x77, 0x9e, 0x3b, 0x6b, 0x79, 0x0e, 0xb0, - 0x39, 0xb3, 0xb6, 0x73, 0x1c, 0xda, 0x6d, 0xe7, 0x18, 0xfe, 0x3e, 0x02, 0xeb, 0x65, 0xb7, 0x9c, 0xc3, 0x8f, 0x5e, - 0x2b, 0xb4, 0x4f, 0x9c, 0x63, 0xf8, 0xbb, 0xa4, 0x56, 0xbf, 0x20, 0xd3, 0x03, 0x0c, 0xcf, 0x37, 0x25, 0x2c, 0xa0, - 0xfc, 0x96, 0x5a, 0x04, 0xab, 0x74, 0xbd, 0x35, 0x68, 0x22, 0x00, 0x65, 0xe8, 0x96, 0x08, 0x51, 0x18, 0xf5, 0x0c, - 0x48, 0x12, 0x8e, 0xe1, 0xed, 0x85, 0x41, 0x46, 0x54, 0x24, 0xbc, 0xdf, 0x7c, 0x8c, 0x78, 0x9b, 0xe6, 0x70, 0xe0, - 0x22, 0x6f, 0x12, 0xa9, 0x2e, 0xfe, 0xb6, 0xc0, 0x10, 0x3b, 0x22, 0x80, 0xb9, 0x82, 0x95, 0x8a, 0xdc, 0x7d, 0xf9, - 0xee, 0x81, 0xa3, 0xdf, 0x28, 0x93, 0xb9, 0x63, 0xbe, 0x6a, 0xdf, 0x5c, 0x9d, 0x21, 0x7b, 0xff, 0xbd, 0xfd, 0x60, - 0xca, 0x54, 0xea, 0x47, 0xc4, 0x1a, 0x1d, 0x07, 0x89, 0x1c, 0x9e, 0x82, 0xa2, 0xbd, 0xe6, 0x38, 0xea, 0x26, 0x24, - 0xd9, 0xb8, 0x00, 0x2a, 0xf9, 0xce, 0x0f, 0x15, 0xd3, 0x0b, 0xa5, 0xe5, 0x13, 0x89, 0xf9, 0x9f, 0x3f, 0x2f, 0x06, - 0x67, 0x57, 0xc6, 0x7d, 0xea, 0x75, 0xe0, 0xda, 0xed, 0xb0, 0xf6, 0x56, 0x2b, 0xa0, 0xdd, 0xc1, 0x6a, 0x8b, 0x60, - 0x96, 0x42, 0xd3, 0x2f, 0x74, 0x8c, 0x1b, 0x4d, 0x91, 0x6a, 0x1a, 0x46, 0x08, 0xf3, 0x5b, 0x61, 0x75, 0x74, 0xb3, - 0x17, 0x09, 0x85, 0x59, 0xb4, 0x25, 0x40, 0x2f, 0xe7, 0xc5, 0x74, 0x00, 0xcd, 0x96, 0x79, 0xec, 0x70, 0x69, 0xfc, - 0x5f, 0x4f, 0x02, 0xdd, 0x8b, 0x40, 0xc3, 0x57, 0x39, 0xad, 0x25, 0x77, 0x13, 0x79, 0xaf, 0xd2, 0x85, 0xca, 0xd2, - 0x73, 0x1d, 0x8a, 0x20, 0xfb, 0x12, 0x26, 0x5c, 0x93, 0xe6, 0x4d, 0xf2, 0xb6, 0x28, 0x0a, 0xac, 0x00, 0x22, 0x54, - 0x1b, 0xc2, 0xd5, 0xc9, 0x7c, 0xfe, 0x7c, 0xe3, 0x25, 0x44, 0xea, 0x64, 0x35, 0xef, 0xa4, 0xae, 0xe2, 0x37, 0x5d, - 0x45, 0x31, 0xb2, 0x5f, 0xc4, 0x1a, 0xc2, 0x2a, 0x8b, 0xf6, 0x1e, 0xfe, 0x1c, 0x32, 0x3f, 0x73, 0xb8, 0x1e, 0xc4, - 0x50, 0x2e, 0x77, 0xcb, 0x63, 0x6d, 0xb0, 0xc7, 0xe2, 0x91, 0xb8, 0x78, 0xa4, 0xbb, 0x67, 0xeb, 0x8f, 0x4b, 0xee, - 0x87, 0x0c, 0x7d, 0x7c, 0x76, 0x8b, 0xe0, 0x29, 0xef, 0x32, 0x9f, 0x22, 0x6c, 0xa8, 0x57, 0x6e, 0x9c, 0xf9, 0x22, - 0xcb, 0x09, 0xd0, 0xe5, 0xbd, 0x46, 0x85, 0xa1, 0xe2, 0xab, 0x7c, 0xf6, 0xee, 0xea, 0x3b, 0x8d, 0xef, 0x7f, 0xd2, - 0x6f, 0x21, 0x23, 0x43, 0x31, 0xf9, 0xfb, 0x14, 0x93, 0x5f, 0xe3, 0x49, 0x2e, 0x20, 0xb2, 0x7d, 0x7e, 0x40, 0x10, - 0xd4, 0x35, 0x16, 0x8d, 0x48, 0xeb, 0x37, 0x5f, 0x86, 0x59, 0xb0, 0xf0, 0x93, 0xec, 0x00, 0x9a, 0xda, 0x80, 0xe4, - 0xf4, 0x4d, 0x1e, 0xcc, 0xa4, 0x38, 0x14, 0x42, 0xb5, 0x2c, 0x12, 0x9a, 0xc3, 0x49, 0x10, 0x4a, 0xc5, 0xa1, 0xf8, - 0x80, 0x3f, 0x1a, 0xb1, 0x45, 0xd6, 0xd7, 0xfd, 0x05, 0xe4, 0x66, 0xc0, 0x68, 0xcb, 0x07, 0xf1, 0x28, 0x63, 0x99, - 0x9d, 0x66, 0x09, 0xf3, 0xe7, 0xba, 0x0c, 0x34, 0x5a, 0xef, 0x2f, 0x5d, 0x0e, 0xe7, 0x41, 0x26, 0x23, 0xf5, 0xd1, - 0x04, 0x41, 0x85, 0x07, 0x43, 0x3c, 0x1b, 0xe4, 0x1c, 0x84, 0x97, 0xf1, 0xb4, 0xb2, 0xa3, 0x0a, 0xca, 0xe5, 0x1c, - 0xe3, 0xc0, 0xf2, 0x78, 0xfc, 0x63, 0xf4, 0xc8, 0xb9, 0xe5, 0x5e, 0xd7, 0x32, 0xa0, 0xa0, 0x7e, 0x76, 0xca, 0xd9, - 0x5b, 0x0d, 0x03, 0x05, 0xe8, 0x1d, 0x17, 0x22, 0xdd, 0x6e, 0xf2, 0xc7, 0x3e, 0xe0, 0x95, 0xe1, 0x6a, 0xa2, 0x9e, - 0x31, 0x0a, 0x39, 0x8d, 0xe5, 0x0a, 0x08, 0xa1, 0x92, 0x8a, 0x77, 0xe6, 0x9d, 0x49, 0x07, 0x20, 0x1c, 0x15, 0xd2, - 0x4a, 0x9f, 0x3f, 0xbf, 0x1e, 0xfc, 0xe7, 0xdf, 0x10, 0x2a, 0x7d, 0xe6, 0x09, 0x2f, 0xe8, 0x6b, 0xb5, 0x16, 0xa7, - 0x3e, 0xad, 0x01, 0xaa, 0xf7, 0xd9, 0x58, 0x84, 0x05, 0x11, 0x5b, 0x2b, 0x1f, 0xdc, 0x88, 0x50, 0x4f, 0x90, 0x0e, - 0xc1, 0x14, 0xbe, 0xda, 0x03, 0x58, 0xde, 0x81, 0x08, 0x11, 0xa0, 0xfd, 0xba, 0xfa, 0xfe, 0x18, 0x42, 0x01, 0xd7, - 0xb2, 0x14, 0x28, 0x03, 0xc4, 0x3d, 0x74, 0x76, 0xea, 0x73, 0xe1, 0x2b, 0x90, 0x1f, 0x69, 0xf7, 0x00, 0xa6, 0x39, - 0x8b, 0xe7, 0xcc, 0x09, 0xe2, 0x83, 0x7b, 0x36, 0xb4, 0xfd, 0x45, 0x40, 0xf2, 0x65, 0x94, 0xbb, 0x69, 0x44, 0xf9, - 0x49, 0x05, 0x2d, 0xd1, 0xd7, 0x79, 0x01, 0xca, 0xb8, 0x00, 0x14, 0xfc, 0xf4, 0xcf, 0xca, 0xd1, 0x03, 0x1d, 0x11, - 0xbf, 0xbe, 0x8c, 0xe5, 0xcf, 0x29, 0x08, 0xa0, 0x88, 0xf7, 0x57, 0x3c, 0xd8, 0xf1, 0x64, 0xa2, 0x46, 0xfc, 0x73, - 0xca, 0xdf, 0x97, 0x50, 0x29, 0xf6, 0x6c, 0xbc, 0xa0, 0x2f, 0xd5, 0x3f, 0x21, 0x7f, 0x42, 0xee, 0x5e, 0x1e, 0x1c, - 0x12, 0xce, 0x73, 0x2d, 0x72, 0xa0, 0x04, 0xc9, 0x53, 0xaa, 0xc4, 0x11, 0x45, 0x35, 0x4e, 0xf5, 0x06, 0xd2, 0xe4, - 0x49, 0xbf, 0x4f, 0x78, 0xac, 0x8a, 0xce, 0x00, 0x4a, 0x0d, 0xb1, 0xfc, 0x61, 0xb2, 0x19, 0x34, 0xb4, 0xc9, 0x83, - 0x0b, 0x1b, 0x55, 0xa7, 0x53, 0x1f, 0xe3, 0x81, 0x2f, 0xf6, 0x57, 0x69, 0x07, 0xc2, 0xce, 0xe2, 0x0b, 0x0b, 0x08, - 0x5c, 0xf4, 0x53, 0xc1, 0xe3, 0xda, 0xb7, 0x84, 0xb2, 0xed, 0xd0, 0x7f, 0x88, 0x15, 0xcd, 0x3a, 0x77, 0xb2, 0xbf, - 0xc4, 0xd2, 0x2b, 0xe1, 0xdc, 0x56, 0x3b, 0x49, 0x32, 0x1e, 0x7a, 0xfd, 0x34, 0xa9, 0x01, 0xcc, 0x77, 0x1d, 0x26, - 0xb5, 0x6e, 0x79, 0x32, 0x88, 0x1d, 0xf3, 0xe2, 0xa0, 0x95, 0x5e, 0xe2, 0xb9, 0xcf, 0x4f, 0x0f, 0x60, 0x7e, 0x10, - 0x18, 0xa0, 0x44, 0x19, 0x05, 0x26, 0x44, 0x1f, 0xf0, 0x53, 0xb2, 0x0e, 0xb8, 0x18, 0x0b, 0xa2, 0x0e, 0x39, 0x47, - 0x19, 0x9a, 0xb4, 0x54, 0xa5, 0x4e, 0xac, 0xb8, 0xcd, 0x54, 0xde, 0xee, 0xfc, 0x01, 0xbf, 0x2d, 0x31, 0x79, 0x40, - 0xde, 0xcb, 0x98, 0xf0, 0xbb, 0xbd, 0xcc, 0x36, 0xb8, 0xe6, 0x6e, 0xaa, 0x42, 0x04, 0xeb, 0x96, 0x0a, 0xc5, 0x3e, - 0xde, 0x56, 0xab, 0x20, 0x8d, 0x64, 0xb5, 0x85, 0x6f, 0xe8, 0x4f, 0x71, 0xc7, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0xbb, - 0xcc, 0xfa, 0x50, 0x55, 0x08, 0xdb, 0xfd, 0xc5, 0x82, 0x2a, 0x9b, 0xbd, 0xd3, 0x03, 0xe2, 0x3b, 0xcf, 0x68, 0x87, - 0x9d, 0x9d, 0x82, 0x75, 0x21, 0x2d, 0xba, 0xbf, 0x58, 0xf0, 0x25, 0xa5, 0x5f, 0xf4, 0xe6, 0x60, 0x96, 0xcd, 0xc3, - 0xb3, 0xff, 0x03, 0x1c, 0x2a, 0x1a, 0x60, 0x9f, 0x5a, 0x03, 0x00}; + 0xdc, 0x93, 0x2e, 0xb7, 0x6d, 0x24, 0xfd, 0x3f, 0x4f, 0x01, 0xc3, 0x5e, 0x87, 0xb0, 0x01, 0x08, 0x00, 0x45, 0x89, + 0x26, 0x45, 0x69, 0x13, 0x1f, 0xb5, 0x4e, 0x29, 0x71, 0xca, 0x56, 0x5c, 0xbb, 0x51, 0x54, 0x22, 0x48, 0x0e, 0x49, + 0xac, 0x41, 0x80, 0x05, 0x80, 0x3a, 0x42, 0x63, 0x9f, 0x65, 0x9f, 0x65, 0x9f, 0xec, 0xab, 0xee, 0x9e, 0x19, 0x0c, + 0x0e, 0x1e, 0x8a, 0x9d, 0xdd, 0xaf, 0x12, 0xdb, 0xc4, 0xdc, 0xd3, 0x33, 0xd3, 0xd3, 0xd3, 0xa7, 0x3f, 0xe3, 0xbc, + 0x17, 0xb3, 0xc5, 0xf6, 0xeb, 0xee, 0xf3, 0x67, 0x66, 0xe3, 0x96, 0x04, 0x82, 0xcf, 0xce, 0xe2, 0xd9, 0x2c, 0x64, + 0x2d, 0x5d, 0x04, 0x0f, 0xd1, 0x4d, 0xd9, 0xcd, 0xd9, 0x23, 0x47, 0x78, 0xec, 0x34, 0xf2, 0x4d, 0x47, 0x4b, 0xcc, + 0x98, 0x49, 0x97, 0x76, 0x44, 0xb9, 0x22, 0x6f, 0xf6, 0x06, 0xc5, 0x1b, 0x7c, 0x5d, 0x8a, 0xa3, 0x6b, 0x4d, 0xe2, + 0xd5, 0x28, 0x64, 0x16, 0x6e, 0x77, 0xe8, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x10, 0xa5, 0xe5, 0x91, 0x63, 0x82, 0xdf, + 0x99, 0x38, 0xc5, 0xf7, 0x60, 0x6e, 0xf4, 0x61, 0x52, 0x76, 0x56, 0x1d, 0x3e, 0xe8, 0x8a, 0x00, 0xab, 0x87, 0x3a, + 0xc8, 0xe0, 0xed, 0xd7, 0x70, 0x6a, 0x07, 0xfa, 0x07, 0xd8, 0x7d, 0xa9, 0xde, 0x6f, 0x3a, 0xfa, 0x83, 0x4b, 0xfd, + 0x03, 0xc2, 0x18, 0xa3, 0x17, 0xbf, 0xa4, 0xdd, 0xab, 0x9b, 0x3a, 0x09, 0xbd, 0x57, 0x18, 0xc7, 0x00, 0x98, 0xbe, + 0xaf, 0x02, 0x7f, 0x16, 0xc5, 0x69, 0x16, 0x8c, 0xf5, 0xab, 0xfe, 0xdb, 0xa0, 0x75, 0xb9, 0xc8, 0x5a, 0xc6, 0x95, + 0x39, 0xce, 0xd4, 0x10, 0x28, 0x02, 0x61, 0x62, 0x04, 0x94, 0x4d, 0x85, 0xd4, 0x13, 0xb4, 0xb5, 0xa0, 0x40, 0xcd, + 0x58, 0x68, 0x9c, 0x0d, 0xa0, 0x5c, 0x25, 0x9e, 0x0a, 0x06, 0x86, 0xd2, 0xb1, 0xa6, 0xd1, 0xa7, 0x97, 0xca, 0xcb, + 0xd5, 0x1a, 0xaf, 0xf2, 0xac, 0xb8, 0x2d, 0xd1, 0x07, 0xb0, 0x30, 0x9c, 0xa1, 0xef, 0x47, 0xaa, 0xd2, 0x67, 0xe9, + 0xde, 0x1d, 0x7e, 0x57, 0xa6, 0x0b, 0xe0, 0xfe, 0x06, 0x8d, 0x8b, 0x28, 0xce, 0x34, 0x70, 0x6c, 0x03, 0x3d, 0x0e, + 0xab, 0x4a, 0x62, 0xbc, 0xd5, 0x96, 0x91, 0x73, 0x64, 0xf0, 0x3d, 0x5e, 0x7e, 0x2d, 0xee, 0xde, 0xac, 0xe4, 0xc1, + 0x82, 0x1e, 0x0b, 0x11, 0x2c, 0x60, 0x16, 0x9f, 0xc7, 0xb7, 0x55, 0x39, 0xc8, 0xcb, 0xe1, 0xee, 0xbb, 0xb7, 0x25, + 0xc8, 0x64, 0x11, 0xd5, 0xaf, 0xc5, 0x03, 0x93, 0x0a, 0x42, 0xa7, 0x72, 0xa6, 0x50, 0xf1, 0x43, 0xd0, 0x30, 0x19, + 0xe8, 0x89, 0xe1, 0x5d, 0x00, 0x28, 0x89, 0x5f, 0xd3, 0xc3, 0xfc, 0x5a, 0x84, 0x4e, 0x16, 0x81, 0x8b, 0x95, 0xcb, + 0x19, 0xb0, 0x6b, 0xb4, 0x5c, 0x65, 0xe8, 0x6a, 0x17, 0x06, 0xc0, 0x72, 0x5d, 0x43, 0xd7, 0x9d, 0x80, 0xa5, 0x0b, + 0x32, 0x31, 0xd7, 0xb5, 0x60, 0x52, 0x4f, 0xe3, 0x44, 0x2f, 0x20, 0x2f, 0xc4, 0xef, 0xc8, 0xa8, 0x82, 0xcf, 0x84, + 0x4f, 0x63, 0x6c, 0x16, 0x7e, 0xea, 0x5b, 0x63, 0x14, 0xe8, 0x34, 0x60, 0x86, 0x31, 0xb5, 0xd3, 0x6f, 0x85, 0x8d, + 0x93, 0x05, 0xf7, 0x9b, 0xa5, 0x69, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, 0xd6, 0xbe, + 0xd4, 0x15, 0xd0, 0x2f, 0x74, 0x52, 0x14, 0x18, 0x22, 0x18, 0x86, 0xf9, 0x75, 0x61, 0xb9, 0x53, 0xcc, 0x17, 0x76, + 0x19, 0xa5, 0x6b, 0x28, 0xba, 0x1f, 0x70, 0x01, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xf2, 0x7c, 0x53, 0x15, + 0xfa, 0x1b, 0xba, 0x46, 0x88, 0x9e, 0x00, 0x40, 0x38, 0x5f, 0xd7, 0xfe, 0x2a, 0xd3, 0x18, 0x9f, 0xad, 0x14, 0x6a, + 0x42, 0x5f, 0xd7, 0xfa, 0x73, 0x66, 0x4f, 0x58, 0xe6, 0x07, 0x21, 0x55, 0xe9, 0x8b, 0x68, 0xf5, 0xb5, 0xe9, 0xa5, + 0xe5, 0xe9, 0x45, 0xe5, 0xfd, 0x83, 0x93, 0xa1, 0x2b, 0x80, 0xc6, 0x8d, 0x33, 0xc3, 0x28, 0x56, 0xcd, 0x2b, 0x4a, + 0x79, 0xff, 0xd5, 0xe5, 0x60, 0xb0, 0x1c, 0x11, 0x2c, 0x07, 0x8b, 0xc6, 0xf1, 0x84, 0xfd, 0xf2, 0xfe, 0xad, 0x0c, + 0x9b, 0x05, 0x1c, 0xa0, 0x21, 0xdf, 0x98, 0x29, 0xd2, 0x0f, 0x09, 0xd2, 0x0e, 0x14, 0xe0, 0x4a, 0x93, 0x5b, 0x28, + 0xc9, 0x75, 0xed, 0x8c, 0xc6, 0xce, 0x26, 0x34, 0xea, 0x41, 0x8c, 0xb5, 0x92, 0xfc, 0xe4, 0x80, 0x4a, 0xd3, 0x6d, + 0x47, 0x85, 0x00, 0x0c, 0x09, 0xcc, 0xb0, 0x80, 0x02, 0x44, 0xf8, 0x1c, 0xb8, 0xc5, 0x83, 0xc2, 0x5e, 0x20, 0x9f, + 0xdd, 0x3d, 0x2b, 0x93, 0x2a, 0x58, 0x4b, 0x3f, 0x3d, 0xc1, 0x98, 0x5d, 0x70, 0x5f, 0x83, 0x97, 0x8f, 0x93, 0x03, + 0xfa, 0xd4, 0x2a, 0x27, 0xa2, 0x68, 0x44, 0x3c, 0xed, 0x7a, 0xbc, 0x81, 0x07, 0x1d, 0x15, 0x08, 0x11, 0x0f, 0xa9, + 0x7e, 0xae, 0x6b, 0x0b, 0x4e, 0x1a, 0x71, 0x77, 0x42, 0xe0, 0x6b, 0xc0, 0x81, 0xb3, 0xab, 0x6b, 0x0b, 0xff, 0x0e, + 0x67, 0x2e, 0x72, 0xfc, 0xbb, 0x96, 0xcb, 0xb3, 0x8a, 0xb3, 0x96, 0x96, 0xcf, 0xda, 0x98, 0x2f, 0x2e, 0x18, 0x12, + 0xc8, 0x97, 0xf5, 0x1c, 0x05, 0xb4, 0x0d, 0x8b, 0x3b, 0x17, 0x8b, 0x3b, 0xd9, 0xb0, 0xb8, 0x93, 0x2d, 0x8b, 0x1b, + 0xf2, 0x85, 0xd4, 0x24, 0xe8, 0x12, 0x34, 0x0e, 0x93, 0xc0, 0xe3, 0x84, 0x46, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, + 0x86, 0xa0, 0x1c, 0xb5, 0x01, 0x56, 0x4d, 0x70, 0x51, 0x00, 0x51, 0x9f, 0xb8, 0x3c, 0x75, 0x62, 0xde, 0x10, 0x83, + 0xb3, 0x15, 0x56, 0xe7, 0x0b, 0xbb, 0x94, 0xe2, 0x8b, 0xb7, 0xe6, 0x1b, 0x66, 0x3a, 0xdf, 0x32, 0xd3, 0x71, 0xe9, + 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x14, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, + 0xab, 0xec, 0xa8, 0xa5, 0x9f, 0xa6, 0xb7, 0x71, 0x02, 0x12, 0x17, 0x68, 0xe6, 0x61, 0x5b, 0x6a, 0x11, 0x44, 0xdc, + 0x99, 0xcb, 0xc6, 0xcd, 0x54, 0xe4, 0xab, 0x5b, 0xca, 0xeb, 0x74, 0xa8, 0xc4, 0xd2, 0xcf, 0x32, 0x96, 0x20, 0xd0, + 0x7d, 0xf0, 0xfa, 0xfd, 0xff, 0x64, 0x9b, 0x35, 0xe0, 0x90, 0x50, 0xc1, 0xea, 0x88, 0xa1, 0x97, 0x40, 0x5b, 0x25, + 0xe2, 0x22, 0x56, 0x1c, 0xc3, 0x25, 0x12, 0xf0, 0x3f, 0xe1, 0x71, 0x6d, 0x25, 0x8a, 0xe9, 0x92, 0x7b, 0x64, 0xd8, + 0x4b, 0x7f, 0xf2, 0x01, 0x04, 0x7b, 0x2d, 0xcf, 0x04, 0x25, 0x5d, 0xd5, 0x0d, 0x5c, 0x42, 0xc4, 0xde, 0xb8, 0x40, + 0x92, 0x88, 0x25, 0xb9, 0x0a, 0x14, 0x58, 0x4f, 0xfa, 0xd6, 0xf4, 0x6a, 0xed, 0xe5, 0x07, 0xb3, 0xc0, 0xa8, 0x61, + 0x4d, 0x40, 0x6d, 0xe1, 0xe0, 0x54, 0xbe, 0xb9, 0x42, 0xd3, 0x3d, 0x32, 0x80, 0xf3, 0x7b, 0x09, 0xf1, 0x4c, 0x1d, + 0xf1, 0xa0, 0x1d, 0x26, 0x70, 0x6b, 0x5d, 0x3a, 0x57, 0xf9, 0xd3, 0x19, 0xfe, 0x72, 0xaf, 0xf2, 0xa7, 0x23, 0xfc, + 0xe5, 0x5d, 0x61, 0xe4, 0xba, 0x86, 0x87, 0xbc, 0x32, 0x67, 0xfd, 0xb4, 0xb4, 0x9f, 0x48, 0xff, 0xec, 0x01, 0xdb, + 0x86, 0x2f, 0xf0, 0xe3, 0x27, 0xeb, 0x14, 0x2c, 0x2e, 0xd5, 0x39, 0x44, 0x76, 0x62, 0xe4, 0x8d, 0xe9, 0xb3, 0x0d, + 0xe9, 0x23, 0xe3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0xcc, 0x86, 0xb8, 0x1e, 0x05, 0x91, 0x9f, + 0xdc, 0x5f, 0xd3, 0xf3, 0xa2, 0x25, 0x68, 0x77, 0xc9, 0x5e, 0x21, 0xf2, 0xb2, 0x2c, 0xee, 0xca, 0x14, 0x06, 0xef, + 0x3d, 0xbf, 0xe8, 0x07, 0x7f, 0x4f, 0x14, 0xb2, 0xad, 0xf4, 0x00, 0xe5, 0x0b, 0x52, 0xea, 0xe8, 0xfa, 0xc9, 0xba, + 0xc5, 0xea, 0xcd, 0x54, 0x66, 0x5b, 0xa1, 0x0b, 0x61, 0x79, 0xf0, 0x31, 0xbb, 0x98, 0x04, 0x3d, 0x94, 0x67, 0x8d, + 0xe2, 0x3b, 0xeb, 0xc9, 0x3a, 0x3b, 0xd3, 0x17, 0x7e, 0xf2, 0x89, 0x4d, 0xac, 0x71, 0x90, 0x8c, 0x43, 0xa6, 0xf7, + 0xf4, 0x51, 0xe8, 0x47, 0x9f, 0xf8, 0xa7, 0x15, 0xaf, 0x32, 0x94, 0x50, 0xef, 0x7c, 0xfb, 0x0a, 0x98, 0x10, 0xcb, + 0x0e, 0x89, 0xd5, 0x06, 0x28, 0x68, 0x2f, 0x25, 0xc3, 0xab, 0x20, 0x14, 0x8b, 0x52, 0x26, 0x28, 0x58, 0x82, 0xd0, + 0x1c, 0x2c, 0x56, 0x4d, 0x1d, 0xd7, 0x4b, 0x37, 0xd5, 0xa9, 0x12, 0xb3, 0x52, 0x86, 0x5c, 0xbc, 0xc6, 0x16, 0xfe, + 0x78, 0x77, 0x14, 0x0c, 0x7b, 0xff, 0xee, 0x64, 0x2b, 0x5f, 0x36, 0x43, 0x48, 0xb5, 0xc8, 0x52, 0xe2, 0x01, 0x9d, + 0x73, 0x02, 0x73, 0x73, 0xd7, 0x6a, 0x65, 0x3f, 0x4d, 0x57, 0x0b, 0x36, 0x21, 0xc9, 0xe0, 0x59, 0x31, 0xa8, 0xf2, + 0xcb, 0x42, 0x1d, 0xd8, 0x6f, 0x2b, 0xef, 0xf8, 0xf0, 0x25, 0x68, 0x2c, 0x00, 0x41, 0x19, 0x4f, 0xa7, 0x7a, 0xf1, + 0xc6, 0xdf, 0x51, 0xcd, 0x3d, 0xfc, 0x6d, 0xf5, 0xe6, 0xb5, 0xf3, 0x46, 0x56, 0x8e, 0x80, 0x30, 0x16, 0xe2, 0x57, + 0x4e, 0x17, 0x2b, 0xe3, 0x15, 0x33, 0x9a, 0xfa, 0xd1, 0xe6, 0xe9, 0x5c, 0x96, 0xb6, 0xf8, 0x92, 0xb1, 0x09, 0x10, + 0xdc, 0x66, 0x2d, 0xf5, 0x3a, 0x64, 0x37, 0x4c, 0x8a, 0x76, 0xeb, 0x9d, 0x35, 0xd4, 0x40, 0xdf, 0x73, 0x5c, 0x64, + 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x43, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x68, 0xea, 0xca, 0x00, + 0x36, 0x8e, 0xec, 0x6c, 0x43, 0x7a, 0x0f, 0x03, 0x4f, 0x37, 0x8f, 0xcd, 0x74, 0x8d, 0x1e, 0xf8, 0xea, 0xe6, 0x70, + 0x0a, 0xe1, 0xe4, 0xb5, 0x0a, 0x76, 0xc8, 0x26, 0x88, 0x35, 0x31, 0xc9, 0x74, 0xe2, 0xbe, 0x08, 0x6d, 0x47, 0x54, + 0xfb, 0x15, 0x7c, 0xa8, 0xc6, 0xb5, 0xd1, 0xca, 0x33, 0x1f, 0x61, 0x40, 0xd7, 0x88, 0xa5, 0xe9, 0x46, 0x80, 0xc9, + 0x45, 0x37, 0xf5, 0xa2, 0x74, 0x19, 0x1e, 0x45, 0xba, 0xe9, 0x98, 0x40, 0x12, 0xe0, 0x04, 0xab, 0x7d, 0xe1, 0xf5, + 0x72, 0xbd, 0xe0, 0xfa, 0x2a, 0xc9, 0x6c, 0xa4, 0x73, 0x5d, 0x82, 0x4d, 0xf9, 0xb7, 0x3a, 0x1f, 0x54, 0xe9, 0x9a, + 0x6e, 0x1c, 0x5a, 0xab, 0x84, 0x7a, 0x6b, 0xec, 0x22, 0x6c, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x74, 0xca, 0xc6, + 0x59, 0x6a, 0x08, 0xe6, 0x91, 0xf4, 0x1e, 0x0b, 0x56, 0x43, 0x8f, 0x06, 0xfa, 0x4f, 0x60, 0x43, 0x2f, 0x9c, 0x2c, + 0xf1, 0x01, 0x89, 0x37, 0x53, 0x33, 0x98, 0xa8, 0xc5, 0x32, 0x88, 0x78, 0x2f, 0x10, 0x1c, 0xbc, 0x21, 0x1d, 0x87, + 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0x52, 0xab, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xee, 0x9b, 0x8e, 0xeb, + 0xe4, 0xba, 0x09, 0xb6, 0x5b, 0x9f, 0xf6, 0x3d, 0xf4, 0x58, 0xab, 0x0d, 0xb5, 0x56, 0xd1, 0x43, 0xea, 0x79, 0xee, + 0x0b, 0x57, 0x37, 0x49, 0x65, 0x4e, 0xc1, 0x6d, 0xe3, 0xf8, 0x86, 0x25, 0x5f, 0x3c, 0x95, 0x72, 0xe3, 0xfb, 0x8d, + 0xe7, 0xc8, 0x75, 0x00, 0x09, 0x67, 0xf1, 0xf2, 0x01, 0x53, 0x68, 0xeb, 0xa6, 0x3e, 0x0e, 0xe3, 0x94, 0xa9, 0x73, + 0x20, 0x26, 0xc8, 0x17, 0x4e, 0xe2, 0xe7, 0xf7, 0xaf, 0x3f, 0x7c, 0xd0, 0x4d, 0x8c, 0x04, 0x9a, 0xaa, 0xad, 0xf3, + 0x0d, 0xb5, 0x03, 0xfb, 0x37, 0xee, 0x3b, 0xba, 0x61, 0xe8, 0x51, 0x5b, 0xde, 0x73, 0x94, 0x56, 0xdb, 0x72, 0xfc, + 0xe6, 0xe1, 0x3d, 0xd3, 0x4b, 0x74, 0xaf, 0x79, 0x35, 0xe0, 0x86, 0xed, 0xd7, 0x5b, 0x29, 0x65, 0x11, 0x44, 0xd7, + 0x0d, 0xa9, 0xfe, 0x5d, 0x43, 0x2a, 0x3c, 0xe5, 0x6a, 0xb8, 0x6a, 0x15, 0x2f, 0x14, 0xd2, 0x00, 0x02, 0x39, 0xef, + 0x02, 0x97, 0xf2, 0x9e, 0xfa, 0x82, 0x41, 0x73, 0x4f, 0xee, 0xd5, 0x51, 0x37, 0x24, 0xf3, 0x47, 0x90, 0x84, 0xed, + 0x38, 0x04, 0x85, 0x3f, 0xa6, 0x4a, 0xe5, 0xca, 0x64, 0xa3, 0x54, 0xd7, 0x55, 0x1a, 0x21, 0xf2, 0xf6, 0x3a, 0x63, + 0x8b, 0x25, 0x4b, 0xfc, 0x6c, 0x95, 0xb0, 0xeb, 0x30, 0xbe, 0x7d, 0x54, 0xa8, 0xd3, 0xef, 0x28, 0x3c, 0x0f, 0x66, + 0x73, 0x59, 0xfa, 0xac, 0xc5, 0x06, 0x72, 0x01, 0xb7, 0x76, 0x90, 0xff, 0xe7, 0xdf, 0xb6, 0xfd, 0x9f, 0x7f, 0xef, + 0x2c, 0x0a, 0xcd, 0xe7, 0x43, 0x33, 0x1b, 0xec, 0xb1, 0x2f, 0x9a, 0x7b, 0x2a, 0xc3, 0xbc, 0xb9, 0x4c, 0x6d, 0x11, + 0x20, 0xbf, 0xb6, 0x04, 0xb5, 0xc4, 0xf2, 0xbe, 0x79, 0xd0, 0xc0, 0x60, 0x5e, 0x3b, 0x47, 0x06, 0x85, 0xbe, 0x68, + 0x68, 0x43, 0xa3, 0xb7, 0xd7, 0x8a, 0xfc, 0x71, 0x08, 0xef, 0x9a, 0xc3, 0x17, 0x0e, 0x9f, 0xf3, 0x25, 0x5f, 0x0e, + 0x87, 0x32, 0xb6, 0x9c, 0x5a, 0x15, 0x54, 0xfc, 0xcf, 0x6a, 0x29, 0xfc, 0xf2, 0xec, 0x39, 0x06, 0xd9, 0xde, 0x0f, + 0x5e, 0x0e, 0x51, 0x19, 0xed, 0x64, 0x94, 0x14, 0xc4, 0xca, 0x46, 0xd4, 0x46, 0xca, 0xe4, 0xb5, 0x46, 0x6b, 0x78, + 0x0d, 0x52, 0x31, 0xe0, 0x58, 0x3e, 0x34, 0xcc, 0x97, 0x43, 0xce, 0x58, 0xe2, 0xfa, 0xaf, 0xbd, 0xea, 0xd6, 0xe6, + 0x6c, 0xd9, 0x12, 0xd0, 0x4d, 0x8d, 0xe4, 0x3f, 0x58, 0x98, 0x15, 0x7c, 0x3c, 0x64, 0xf0, 0x03, 0x47, 0x61, 0x98, + 0x63, 0xbc, 0x93, 0x77, 0x9b, 0x74, 0xc4, 0x7e, 0xde, 0xad, 0x23, 0x76, 0xb1, 0x97, 0x8e, 0xd8, 0xcf, 0x5f, 0x5d, + 0x47, 0xec, 0x9d, 0xaa, 0x23, 0x06, 0x8b, 0xf8, 0x9a, 0xed, 0xa5, 0xb8, 0x25, 0xb4, 0x36, 0xe2, 0xdb, 0x74, 0xe0, + 0x72, 0x92, 0x36, 0x1d, 0xcf, 0x19, 0xf0, 0x08, 0xf8, 0xaa, 0x84, 0xf1, 0x0c, 0x94, 0xb8, 0xfe, 0x7c, 0x75, 0xab, + 0x30, 0x9e, 0xa9, 0xca, 0x56, 0x11, 0xf7, 0xf8, 0x5a, 0x78, 0x71, 0x22, 0x05, 0x27, 0xc7, 0x14, 0x3e, 0x9f, 0xac, + 0x43, 0x43, 0x89, 0x6a, 0x2d, 0xb5, 0xd7, 0x3c, 0xa1, 0x02, 0xd5, 0x43, 0xed, 0x29, 0x59, 0xd1, 0x7b, 0x2e, 0x7c, + 0x5b, 0xa8, 0x2d, 0x48, 0x2d, 0x61, 0xf2, 0x13, 0xb1, 0xd6, 0x7f, 0xbb, 0x73, 0xbf, 0xbf, 0x74, 0xfb, 0x6d, 0x17, + 0x8c, 0xb3, 0xe1, 0x85, 0x89, 0x09, 0x4e, 0xbf, 0xdd, 0x86, 0x84, 0x5b, 0x25, 0xc1, 0x83, 0x84, 0x40, 0x49, 0xe8, + 0x40, 0xc2, 0x58, 0x49, 0x38, 0x82, 0x84, 0x89, 0x92, 0x70, 0x0c, 0x09, 0x37, 0x7a, 0x7e, 0x19, 0xc9, 0xe1, 0x1e, + 0x1b, 0x57, 0x26, 0x3d, 0x2a, 0x44, 0xda, 0xb1, 0xe9, 0x82, 0xd6, 0x94, 0x3f, 0xeb, 0xc5, 0x26, 0x71, 0x17, 0x7b, + 0x89, 0x79, 0x3b, 0x67, 0xe4, 0x28, 0xfa, 0x15, 0xde, 0x39, 0x76, 0x16, 0x83, 0xde, 0xb4, 0x70, 0xc0, 0x20, 0xe0, + 0xa0, 0xe9, 0x06, 0x30, 0x8c, 0xfa, 0x72, 0xe5, 0x84, 0x13, 0x0b, 0x65, 0x2d, 0x8b, 0x3c, 0xea, 0xce, 0x92, 0x5b, + 0xa0, 0xd0, 0x38, 0x69, 0xa9, 0x5c, 0xc9, 0xaf, 0xa1, 0x77, 0xf0, 0x8a, 0x8d, 0x56, 0x33, 0xed, 0x3c, 0x9e, 0xed, + 0x54, 0x21, 0x50, 0xb3, 0x60, 0x94, 0x3a, 0x89, 0x5f, 0x2c, 0xb1, 0x2d, 0x79, 0x5f, 0xf4, 0x99, 0x97, 0xcb, 0x67, + 0x30, 0x36, 0x2d, 0x23, 0x05, 0x16, 0xe8, 0x07, 0x60, 0xa4, 0xc8, 0xf0, 0xcf, 0x01, 0xce, 0xca, 0xf7, 0x85, 0xaf, + 0x8c, 0xe7, 0xf4, 0x47, 0x96, 0xa6, 0xfe, 0x4c, 0x94, 0xaf, 0x8f, 0x13, 0x94, 0x76, 0xe4, 0xfb, 0x0b, 0x01, 0x08, + 0x9c, 0xbc, 0xa0, 0xa6, 0x9b, 0x91, 0xc4, 0xb7, 0x1a, 0x68, 0xff, 0xc0, 0x86, 0x2a, 0xf4, 0x14, 0x02, 0x1b, 0x96, + 0xb0, 0xac, 0x51, 0x00, 0x87, 0xff, 0x86, 0x85, 0xd5, 0xc4, 0xcc, 0x9f, 0x55, 0x93, 0x68, 0x1f, 0xe4, 0xea, 0xd8, + 0xa4, 0x40, 0xbf, 0x94, 0xf8, 0x25, 0x12, 0xea, 0x30, 0x9e, 0xfd, 0xa9, 0xe2, 0xe9, 0x2d, 0x6a, 0x05, 0x1f, 0x22, + 0x33, 0xc8, 0x86, 0x36, 0xc2, 0x58, 0xb3, 0x01, 0x84, 0xbd, 0x28, 0x9b, 0x5b, 0x68, 0x5a, 0xd6, 0xf2, 0x22, 0xc3, + 0xb4, 0x71, 0x6d, 0xd7, 0x55, 0x83, 0xda, 0x5e, 0x32, 0x1b, 0xf9, 0x2d, 0xd7, 0x3b, 0x36, 0xc5, 0x1f, 0xdb, 0xe9, + 0x18, 0x39, 0xb6, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, 0xbe, 0xb7, 0x88, + 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x1e, 0xd4, 0x7d, 0x74, 0xd5, 0xc0, 0xad, 0x05, 0x5d, 0xdb, 0x4b, 0xd8, + 0x82, 0x6a, 0x4b, 0x4f, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xbc, 0xfb, 0x52, 0x61, 0x2a, 0x8a, 0x5b, 0x8e, 0x6a, 0x00, + 0x45, 0xca, 0xdd, 0x3c, 0x80, 0x73, 0xa3, 0xfe, 0xd2, 0x9f, 0xa0, 0x67, 0x42, 0xdb, 0xeb, 0x24, 0x6c, 0xa1, 0xd9, + 0x9d, 0x8d, 0x8d, 0x27, 0xf1, 0xed, 0x29, 0x8c, 0x16, 0x2b, 0x5b, 0x29, 0x0b, 0xa7, 0x98, 0x63, 0xa1, 0x65, 0x89, + 0x68, 0xc7, 0xc2, 0x87, 0x38, 0xb4, 0xc6, 0x16, 0x7d, 0xc8, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, 0x91, 0x45, 0xd3, + 0x39, 0x76, 0x96, 0x4a, 0x5b, 0x2a, 0xfc, 0x8c, 0x35, 0x16, 0x77, 0x35, 0xa7, 0x0f, 0x8f, 0xb5, 0x69, 0x18, 0xdf, + 0xf6, 0xe6, 0xc1, 0x64, 0xc2, 0xa2, 0x3e, 0x8e, 0x59, 0x26, 0xb2, 0x30, 0x0c, 0x96, 0x69, 0x90, 0xf6, 0x17, 0xfe, + 0x1d, 0x6f, 0xf5, 0x70, 0x53, 0xab, 0x6d, 0xde, 0x6a, 0x7b, 0xef, 0x56, 0x95, 0x66, 0xc0, 0x8a, 0x85, 0xda, 0xe1, + 0x43, 0xeb, 0x68, 0x4e, 0x65, 0x9e, 0x7b, 0xb7, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, 0x39, 0xb9, + 0x7d, 0xb3, 0xa6, 0x8d, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x7c, 0x39, 0x93, 0x49, 0x6e, 0x8f, 0xc5, 0xd7, + 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0x22, 0xa1, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, 0x12, 0xb9, + 0xcd, 0xf8, 0x57, 0xc2, 0x26, 0x7d, 0xdc, 0x48, 0xa4, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x31, 0xc0, 0x65, 0x09, + 0x37, 0x21, 0xaf, 0xe7, 0x6a, 0xbd, 0x77, 0x49, 0xad, 0xe8, 0x6e, 0x3c, 0x6e, 0x2c, 0x37, 0xf1, 0x93, 0x4f, 0x57, + 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x62, 0x6b, 0x01, 0x06, 0xeb, 0xae, 0x07, 0x2e, 0xbb, 0xfa, 0xa3, 0x38, 0x81, 0x33, + 0x9b, 0xf8, 0x93, 0x60, 0x95, 0xf6, 0x5c, 0x6f, 0x79, 0x27, 0x92, 0xf8, 0x5e, 0x2f, 0x12, 0xf0, 0xec, 0xf5, 0xd2, + 0x38, 0x0c, 0x26, 0x22, 0x69, 0xd3, 0x59, 0x72, 0x3d, 0xa3, 0x8f, 0x06, 0xeb, 0x01, 0xba, 0x5d, 0xf0, 0xc3, 0x50, + 0xb3, 0xdb, 0xa9, 0xc6, 0xfc, 0x14, 0xf9, 0xcb, 0x9a, 0x93, 0x12, 0x5c, 0xd0, 0x38, 0xdd, 0x3d, 0x5c, 0xde, 0xc9, + 0x3d, 0xef, 0x1e, 0x2d, 0xef, 0xf2, 0xbf, 0x2e, 0xd8, 0x24, 0xf0, 0xb5, 0x56, 0xb1, 0x9b, 0x5c, 0x07, 0x78, 0xd0, + 0xc6, 0x7a, 0xc3, 0x36, 0x15, 0xc7, 0x02, 0x5c, 0x1b, 0x3e, 0x0a, 0x16, 0xcb, 0x38, 0xc9, 0xfc, 0x28, 0xcb, 0xf3, + 0xe1, 0x55, 0x9e, 0xf7, 0x2f, 0x82, 0xd6, 0xe5, 0x3f, 0x5a, 0x74, 0x4f, 0x93, 0xcc, 0x26, 0x37, 0xae, 0xcc, 0xd7, + 0x4c, 0xd5, 0x19, 0x81, 0x6b, 0x0c, 0xf5, 0x45, 0xd4, 0xc2, 0x74, 0x4b, 0xd6, 0x0b, 0x13, 0x90, 0x65, 0x71, 0xd2, + 0x41, 0x29, 0x17, 0xc1, 0x1b, 0x08, 0x0a, 0xbc, 0x66, 0x83, 0x0b, 0x45, 0xff, 0x04, 0x88, 0x15, 0x2c, 0x4c, 0x76, + 0x05, 0x4f, 0x36, 0xd1, 0x8c, 0xdf, 0xed, 0xa6, 0x19, 0x7f, 0xcd, 0xf6, 0xa1, 0x19, 0xbf, 0xfb, 0xea, 0x34, 0xe3, + 0x93, 0xba, 0x5d, 0xc1, 0xdb, 0x78, 0xa0, 0x4b, 0x09, 0x03, 0x5c, 0x4d, 0x09, 0x79, 0xec, 0x79, 0xfb, 0x87, 0xcd, + 0x00, 0x44, 0x6b, 0x14, 0x83, 0x8e, 0x6e, 0x6e, 0xe0, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xef, 0xe9, 0x74, + 0xf0, 0x2a, 0x56, 0x12, 0xe4, 0x17, 0x57, 0xbe, 0x28, 0x79, 0x57, 0xa0, 0x1c, 0xa1, 0x85, 0x89, 0xf1, 0x27, 0xc0, + 0x38, 0x9b, 0xb4, 0x8e, 0x27, 0x52, 0xfb, 0xac, 0x5f, 0x1e, 0x42, 0x4b, 0xaa, 0x7c, 0x0a, 0x13, 0x9c, 0x1a, 0x2b, + 0x71, 0xc6, 0x32, 0x6e, 0x33, 0xfb, 0xfd, 0xfd, 0xdb, 0x49, 0xeb, 0x6d, 0x6c, 0xe4, 0x41, 0xfa, 0xae, 0x6a, 0x00, + 0xc3, 0x65, 0x3f, 0x03, 0x75, 0x3a, 0x39, 0xd7, 0x20, 0x53, 0x03, 0x4c, 0x43, 0x36, 0x55, 0x3f, 0x2b, 0xcd, 0xb4, + 0xa7, 0x56, 0xe4, 0x81, 0xae, 0x6a, 0x97, 0x31, 0xb7, 0x3e, 0x58, 0x73, 0x0a, 0x10, 0x63, 0x77, 0xa1, 0xdd, 0xf0, + 0x84, 0xaa, 0x07, 0x93, 0x3c, 0x37, 0xfa, 0x02, 0x10, 0xca, 0x45, 0xcb, 0x76, 0x11, 0x71, 0xe9, 0xad, 0xd4, 0x69, + 0xe0, 0x12, 0x42, 0x12, 0xff, 0xbd, 0x05, 0x81, 0x3a, 0x17, 0x16, 0x72, 0x98, 0xe9, 0x1a, 0x81, 0x8f, 0x14, 0x2d, + 0x94, 0x09, 0x81, 0x04, 0x58, 0xc2, 0x5f, 0x64, 0x89, 0x84, 0xba, 0x0e, 0x27, 0x01, 0x07, 0x35, 0x02, 0xc0, 0xca, + 0x5f, 0xf0, 0xb5, 0x09, 0xed, 0xf0, 0x32, 0xf8, 0x91, 0xeb, 0x92, 0xf6, 0xc3, 0xed, 0x77, 0x7a, 0x72, 0x00, 0x15, + 0x4e, 0x2b, 0x8a, 0x03, 0x3b, 0x34, 0x14, 0x81, 0x94, 0x48, 0x6f, 0x4d, 0x3b, 0xbd, 0xd5, 0x9e, 0xad, 0x85, 0x87, + 0x8c, 0xcc, 0x5f, 0x5a, 0xf0, 0xc4, 0x47, 0xdc, 0xcb, 0x31, 0x9e, 0xe2, 0x8c, 0xa3, 0xbf, 0x4a, 0x01, 0x37, 0xe2, + 0x43, 0x15, 0xf1, 0x4f, 0x7f, 0xbc, 0x4a, 0xd2, 0x38, 0xe9, 0x2d, 0xe3, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0x2e, + 0x11, 0x3e, 0x02, 0x3c, 0x57, 0xeb, 0x78, 0xe9, 0x8f, 0x83, 0xec, 0xbe, 0xe7, 0x70, 0x92, 0xc2, 0xe9, 0x73, 0xea, + 0xc0, 0x69, 0x2c, 0xdf, 0xe3, 0xd0, 0x7c, 0x8e, 0x84, 0x5f, 0x52, 0x27, 0x67, 0xd4, 0x6d, 0xde, 0x57, 0x72, 0xc9, + 0x47, 0x08, 0x90, 0x1f, 0x7e, 0x62, 0xcd, 0x00, 0xcb, 0xc3, 0x52, 0x3b, 0x13, 0x36, 0x33, 0x11, 0x6b, 0x03, 0x5f, + 0x5e, 0xfc, 0xb1, 0x3b, 0x86, 0xe6, 0x34, 0x27, 0x03, 0xc5, 0x63, 0xec, 0x33, 0xb2, 0x9e, 0x0f, 0x11, 0xb5, 0xcc, + 0x7d, 0x4a, 0x8e, 0xd8, 0x34, 0x4e, 0x18, 0xf9, 0x93, 0x75, 0xbb, 0xcb, 0xbb, 0xfd, 0x9b, 0xdf, 0x3e, 0xfd, 0xe6, + 0x76, 0xa2, 0x38, 0x6b, 0x89, 0xc6, 0x8c, 0x1d, 0xad, 0xd5, 0xef, 0x33, 0x20, 0x0d, 0x09, 0xf2, 0x63, 0x72, 0xdd, + 0xd5, 0xd3, 0xf5, 0x7e, 0xa3, 0xdb, 0xae, 0x65, 0xcc, 0xef, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, 0x9a, 0xb1, + 0x7d, 0xb4, 0xbc, 0x13, 0x6b, 0x8c, 0x17, 0xde, 0x03, 0x16, 0xa9, 0x32, 0x14, 0xb1, 0x48, 0xd5, 0x64, 0x5c, 0xa4, + 0x7e, 0x6d, 0x36, 0xc2, 0x93, 0x45, 0xe5, 0xa6, 0xef, 0x2c, 0xef, 0xd4, 0x2b, 0xba, 0xa8, 0x26, 0x6f, 0xea, 0xaa, + 0x0b, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x2d, 0x74, 0x79, 0x2d, 0x15, 0xe0, 0x48, 0x38, 0xf8, 0xa3, 0x34, + 0x0e, 0x57, 0x19, 0x6b, 0x06, 0x17, 0x01, 0xc7, 0x73, 0x0a, 0xe0, 0xe0, 0xef, 0xf2, 0x58, 0x3b, 0x40, 0x6e, 0xc3, + 0x36, 0x71, 0xfa, 0xe0, 0x71, 0xd8, 0x6a, 0x97, 0x87, 0x0e, 0x59, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0xb8, 0x96, + 0x08, 0x7b, 0x6b, 0xb6, 0xcb, 0xd3, 0xa4, 0xd7, 0x55, 0x99, 0x94, 0x97, 0x27, 0xf3, 0xe7, 0x9c, 0xb1, 0x17, 0xcd, + 0x67, 0xec, 0x85, 0x38, 0x63, 0xdb, 0x77, 0xe6, 0xe3, 0xa9, 0x0b, 0xff, 0xf5, 0x8b, 0x09, 0xf5, 0x1c, 0xad, 0xbd, + 0xbc, 0xd3, 0xdc, 0xe5, 0x9d, 0x66, 0x79, 0xcb, 0x3b, 0x0d, 0x9b, 0x46, 0x7d, 0x10, 0xd3, 0xf6, 0x0c, 0xd3, 0xd1, + 0x20, 0x11, 0xfe, 0x38, 0xa5, 0x2c, 0xf7, 0x10, 0xf2, 0xa0, 0x56, 0xa7, 0x9e, 0xe7, 0x6d, 0x3f, 0xea, 0x74, 0x96, + 0x04, 0xd2, 0x36, 0xec, 0xcc, 0x1f, 0x8d, 0xd8, 0xa4, 0x37, 0x8d, 0xc7, 0xab, 0xf4, 0x5f, 0x7c, 0xfc, 0x1c, 0x88, + 0x5b, 0x11, 0x41, 0xa5, 0x1d, 0x51, 0x15, 0x04, 0x25, 0x37, 0x4c, 0xb4, 0xb0, 0x96, 0xeb, 0xd4, 0x23, 0xf7, 0xc8, + 0x9e, 0x7d, 0xd8, 0xb0, 0xc9, 0x9b, 0x01, 0xfd, 0xa7, 0xad, 0xd2, 0x66, 0x14, 0xf3, 0x05, 0x60, 0xd9, 0x0a, 0x8e, + 0x87, 0x43, 0x83, 0xaf, 0xa6, 0xd3, 0x6d, 0x1e, 0xee, 0xa5, 0xe8, 0xe9, 0x4a, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x86, + 0x29, 0xdb, 0x5b, 0xdd, 0xb4, 0x47, 0x6a, 0xad, 0x6e, 0xb9, 0x10, 0x8a, 0xb2, 0x7b, 0x62, 0xf9, 0xc7, 0x2f, 0x0e, + 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xcd, 0x9a, 0x08, 0xf5, 0xb7, 0x65, 0x4d, 0x70, 0x22, 0x95, 0x90, 0x10, 0xdf, 0xbf, + 0xfc, 0x74, 0xfa, 0xb0, 0x0a, 0x7b, 0x97, 0x26, 0x55, 0xaa, 0x6a, 0xe9, 0xef, 0xe3, 0x18, 0x42, 0x77, 0xd6, 0x8b, + 0x0b, 0xf0, 0x90, 0xb2, 0x7b, 0x36, 0x80, 0x4a, 0xe2, 0x1d, 0x41, 0x52, 0x7c, 0x1d, 0xeb, 0xd0, 0x53, 0xe2, 0xf5, + 0xa6, 0xa7, 0xc4, 0xab, 0xdd, 0x4f, 0x89, 0x1f, 0xf6, 0x7a, 0x4a, 0xbc, 0xfa, 0xea, 0x4f, 0x89, 0xd7, 0xf5, 0xa7, + 0xc4, 0x45, 0x2c, 0xf4, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x09, 0xe5, 0xce, 0xe3, 0x41, 0xc7, 0x21, 0x97, + 0xc7, 0x17, 0x7f, 0xf8, 0x61, 0x81, 0x1b, 0xf1, 0x3d, 0xaa, 0x93, 0x15, 0x4f, 0x0b, 0x8e, 0xd9, 0xb1, 0x1f, 0x25, + 0x39, 0x8c, 0xa3, 0xd9, 0xcf, 0x20, 0x94, 0x05, 0x76, 0x60, 0xa2, 0x64, 0x04, 0xe9, 0xcf, 0xf1, 0x72, 0xb5, 0x7c, + 0x0b, 0x6d, 0x7d, 0x0c, 0xd2, 0x60, 0x14, 0x32, 0x69, 0x89, 0x4c, 0xea, 0x6f, 0x9c, 0x27, 0x0e, 0x1a, 0xa7, 0xe2, + 0xa7, 0x7f, 0x27, 0x7e, 0xa2, 0x4e, 0x2a, 0xff, 0x4d, 0x7a, 0x75, 0x7a, 0xf3, 0x43, 0x44, 0x08, 0x01, 0x95, 0x41, + 0x3f, 0xfc, 0x31, 0x72, 0x11, 0x1b, 0x0d, 0xb3, 0x14, 0xfa, 0x0e, 0x1b, 0xdb, 0x61, 0xb5, 0x47, 0xcd, 0xca, 0x30, + 0xa5, 0x0b, 0xae, 0x3a, 0x1b, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x91, 0x01, 0x48, + 0x38, 0x65, 0x1d, 0x0c, 0x1e, 0xf9, 0x01, 0x09, 0xe5, 0x38, 0x69, 0xe9, 0x10, 0xbb, 0x74, 0xb5, 0xb4, 0x48, 0xd4, + 0x6c, 0xe1, 0x14, 0x75, 0x19, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0x56, 0x53, 0xa8, 0x6a, 0xc4, 0x36, 0xe7, + 0x0a, 0xa7, 0xad, 0x48, 0x30, 0x17, 0x85, 0x1f, 0x8c, 0x86, 0x85, 0xe3, 0x39, 0x64, 0xba, 0x5a, 0xe4, 0x82, 0x17, + 0x91, 0x7c, 0xc5, 0xd7, 0x83, 0x7b, 0x85, 0xa0, 0xcf, 0x97, 0x0a, 0x18, 0xdf, 0xdd, 0xb0, 0x24, 0xf4, 0xef, 0x5b, + 0x46, 0x1e, 0x47, 0x3f, 0x02, 0x00, 0x5e, 0xc5, 0xb7, 0x91, 0x5a, 0x00, 0x83, 0xb5, 0x34, 0xec, 0xa5, 0x46, 0xff, + 0x25, 0x60, 0xb8, 0xa2, 0x8c, 0x00, 0xc2, 0xe4, 0xce, 0xd8, 0xdf, 0x4d, 0xfa, 0xf7, 0x1f, 0x46, 0x6e, 0x9e, 0xc7, + 0xb2, 0xa3, 0x5f, 0x96, 0x7b, 0x74, 0xf3, 0xf4, 0xe9, 0xa3, 0xcd, 0xd3, 0x2e, 0x87, 0x67, 0x6f, 0xa8, 0x6d, 0x6c, + 0x3c, 0x05, 0x30, 0x8a, 0x8b, 0x78, 0x35, 0x9e, 0xa3, 0xa2, 0xeb, 0xd7, 0x9b, 0x6f, 0x06, 0x6d, 0x62, 0x94, 0x52, + 0x39, 0xf5, 0x4a, 0x52, 0x01, 0x05, 0xec, 0xff, 0x35, 0x38, 0xe0, 0xfc, 0x1f, 0x82, 0xa1, 0xbe, 0x6b, 0xf8, 0x2b, + 0x3e, 0x78, 0xd8, 0xe6, 0xed, 0x43, 0x30, 0x4d, 0xee, 0xda, 0x42, 0x08, 0xd7, 0x9a, 0x91, 0x4c, 0x5e, 0x05, 0x9a, + 0xea, 0x46, 0x6e, 0x93, 0x87, 0x3c, 0xd1, 0x0b, 0xb3, 0xe9, 0x99, 0xce, 0x0d, 0x0d, 0x4c, 0xc6, 0xb1, 0x55, 0x05, + 0xc9, 0x70, 0x95, 0x07, 0x86, 0xe8, 0xab, 0x9a, 0xb7, 0x08, 0x22, 0x13, 0xbd, 0xc0, 0xd7, 0x73, 0xfc, 0x3b, 0xf0, + 0x83, 0x0c, 0xc8, 0xad, 0x9a, 0x05, 0x89, 0xa6, 0x6a, 0x37, 0x07, 0xa1, 0x9e, 0xf4, 0x46, 0x48, 0x08, 0x29, 0xde, + 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0xf9, 0x8c, 0xd0, 0xe4, 0x3b, 0x02, 0xd3, 0xf1, 0x39, 0x00, 0xd2, 0x92, 0x7c, 0x79, + 0x47, 0x29, 0xf0, 0x32, 0x40, 0x99, 0xac, 0x48, 0xe0, 0xae, 0xfe, 0x3a, 0x8e, 0x48, 0x10, 0x0f, 0x7a, 0x70, 0xd3, + 0xe6, 0x27, 0xe0, 0x11, 0xb8, 0xa7, 0xe1, 0x83, 0x1d, 0x73, 0x39, 0x27, 0x58, 0x73, 0xe8, 0x73, 0xd8, 0x67, 0xcd, + 0x3e, 0xe1, 0x22, 0x05, 0x0b, 0x82, 0xd4, 0xa1, 0xe2, 0xe2, 0xd9, 0x64, 0x0d, 0xb8, 0x11, 0xdf, 0x45, 0x77, 0xd9, + 0x82, 0x45, 0x2b, 0x1d, 0x63, 0x42, 0xa1, 0x8f, 0x3e, 0x28, 0xf3, 0x8a, 0x88, 0x2d, 0xc0, 0x36, 0xcd, 0x35, 0xe7, + 0x74, 0x17, 0xa6, 0x1c, 0xa5, 0xfa, 0xe6, 0x98, 0x0b, 0x36, 0x53, 0x8e, 0xdb, 0xaa, 0x37, 0x04, 0x5f, 0xd2, 0xb8, + 0x6a, 0xc8, 0x45, 0x9a, 0xd0, 0xd0, 0x06, 0x79, 0xc7, 0xe0, 0xec, 0x22, 0x01, 0xf6, 0x96, 0x5f, 0x5d, 0x34, 0x29, + 0x91, 0xf1, 0x2b, 0x8c, 0xa2, 0xc4, 0xa8, 0x37, 0xc3, 0xc7, 0x09, 0x8e, 0x89, 0x36, 0xb6, 0x33, 0xae, 0xb5, 0xb3, + 0x61, 0xd2, 0x9f, 0xd8, 0x3d, 0x5d, 0x24, 0x04, 0xaa, 0x4f, 0xec, 0x1e, 0x74, 0xff, 0x5e, 0x03, 0x37, 0x45, 0xdf, + 0x82, 0xae, 0x4d, 0x70, 0xf5, 0x3f, 0x06, 0x67, 0x55, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x88, + 0xea, 0x2c, 0x0e, 0x31, 0x57, 0xf1, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x33, 0xd7, 0x71, 0x0e, 0x6a, + 0xe5, 0x81, 0x91, 0xdd, 0x54, 0xda, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x33, 0xdb, 0xeb, 0xd7, 0xee, 0x68, 0xc5, + 0x97, 0xe4, 0x10, 0xd9, 0x5f, 0xa7, 0x4f, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x2a, 0xf3, 0x38, 0xb6, 0x9c, 0xf3, + 0xbf, 0x86, 0xf5, 0xab, 0x9f, 0x3c, 0x59, 0x52, 0x5c, 0x93, 0x21, 0x78, 0x43, 0x6e, 0xc1, 0x31, 0xfa, 0x8b, 0xf6, + 0x5c, 0x6b, 0xd1, 0xf1, 0x31, 0x8c, 0xa1, 0x0c, 0x97, 0x2d, 0x6c, 0xca, 0xd4, 0x06, 0x2a, 0x3d, 0xa6, 0x55, 0x0c, + 0xc7, 0xfd, 0xae, 0xb2, 0x42, 0xa2, 0xb7, 0x95, 0x5a, 0xc0, 0xf6, 0x37, 0x5c, 0x9f, 0xf6, 0x08, 0xfc, 0x12, 0x40, + 0x09, 0xf0, 0x9d, 0xbe, 0xb3, 0xc1, 0xd5, 0xb2, 0xdc, 0x5c, 0xf9, 0x92, 0xdc, 0xbf, 0x31, 0xbc, 0x74, 0x50, 0x86, + 0x26, 0xdb, 0x6b, 0xbe, 0xee, 0x1e, 0xd8, 0x24, 0x8b, 0x26, 0xe5, 0x06, 0x2b, 0xf7, 0xd7, 0xfe, 0xcd, 0x95, 0x30, + 0x0a, 0x04, 0x15, 0x88, 0x1b, 0x30, 0x4a, 0x1e, 0x47, 0xb8, 0xf9, 0xe9, 0xb8, 0x05, 0x7b, 0x51, 0x31, 0x58, 0x81, + 0x3c, 0x82, 0xc9, 0x6a, 0x0a, 0x53, 0x1c, 0x3c, 0x57, 0xa3, 0x59, 0x70, 0x4b, 0x10, 0xa2, 0x1b, 0x77, 0x62, 0x26, + 0x74, 0x0a, 0x8b, 0x3a, 0x01, 0xf7, 0x45, 0xb9, 0x2f, 0xd7, 0x3a, 0xd8, 0xcd, 0xb5, 0xce, 0x76, 0x71, 0xad, 0xc9, + 0x9c, 0xea, 0x36, 0xf1, 0x97, 0x8a, 0x45, 0x9e, 0x20, 0xce, 0x55, 0xc3, 0xbc, 0x12, 0xab, 0x1b, 0xad, 0xaf, 0x44, + 0xad, 0x5a, 0x6b, 0xa4, 0x25, 0x88, 0xec, 0x6f, 0xe5, 0x81, 0x22, 0x04, 0xea, 0x2a, 0x6f, 0xfc, 0xa2, 0xe0, 0x8d, + 0xd3, 0xab, 0xa6, 0x30, 0xa4, 0x11, 0xd4, 0xbf, 0x62, 0xa4, 0x26, 0x5f, 0x07, 0x85, 0xb1, 0x5a, 0x31, 0x52, 0xc5, + 0xfc, 0xaa, 0x78, 0x68, 0x28, 0x46, 0x7d, 0xe2, 0x95, 0x51, 0xb6, 0xed, 0x2b, 0x17, 0x2d, 0xac, 0xaf, 0x8a, 0x74, + 0xe0, 0xba, 0xe3, 0x90, 0x65, 0xb2, 0xba, 0x6d, 0xca, 0xe6, 0x37, 0x6a, 0xb6, 0xb2, 0x49, 0xa4, 0x9d, 0x0c, 0x01, + 0x58, 0xb0, 0xe9, 0x2b, 0x72, 0x6d, 0xa9, 0x03, 0x81, 0x83, 0x6c, 0x30, 0xeb, 0xdb, 0xcd, 0x9d, 0xa7, 0x78, 0x09, + 0x85, 0x14, 0x5e, 0xe5, 0x41, 0x20, 0x7c, 0xaf, 0xd6, 0x0d, 0xb7, 0x3c, 0x5e, 0xf2, 0xfc, 0x7e, 0x07, 0xf6, 0xa2, + 0xe6, 0xa8, 0x82, 0x7c, 0x3c, 0x99, 0x16, 0xa9, 0xe7, 0x62, 0xd1, 0x7a, 0xa3, 0xc4, 0xc4, 0x59, 0x73, 0xcb, 0x98, + 0x32, 0x8f, 0x9e, 0x97, 0xe8, 0x89, 0x7e, 0xf9, 0xd6, 0x49, 0x56, 0x11, 0xfa, 0xb6, 0xb7, 0xb2, 0xc4, 0x1f, 0x7f, + 0x52, 0x86, 0x2c, 0xf8, 0x9c, 0xc0, 0x03, 0x2e, 0x4b, 0x0a, 0xfa, 0x3e, 0xba, 0x82, 0x64, 0x3d, 0xdb, 0x4b, 0x15, + 0xee, 0x4b, 0xef, 0xb1, 0xd3, 0xf6, 0x5f, 0x4c, 0x0f, 0x2b, 0x4c, 0x51, 0xaf, 0x53, 0x66, 0x99, 0x6f, 0x18, 0x47, + 0x36, 0x5f, 0x2d, 0x46, 0x6b, 0x95, 0xb7, 0xaa, 0xb0, 0x5c, 0xeb, 0x6c, 0x56, 0xb5, 0xdb, 0xe9, 0x74, 0x5a, 0x66, + 0x34, 0x3a, 0xda, 0x21, 0x32, 0x0b, 0x1f, 0x3b, 0x8e, 0x53, 0x1d, 0xfb, 0x76, 0xb0, 0x5b, 0xc8, 0xb7, 0xed, 0x36, + 0x8e, 0x18, 0x61, 0xbb, 0x0b, 0x7e, 0x75, 0x70, 0xe4, 0x76, 0x71, 0xb2, 0x4b, 0x6a, 0x11, 0x7d, 0x52, 0x86, 0x08, + 0x32, 0xb6, 0x48, 0x7b, 0x63, 0x86, 0x32, 0x18, 0x5b, 0x39, 0xd0, 0xa8, 0x38, 0x60, 0xcd, 0x40, 0x55, 0xc4, 0x15, + 0xbb, 0xc2, 0xd1, 0x90, 0x1f, 0x5e, 0x63, 0xde, 0x8b, 0x4e, 0xf0, 0xa0, 0xac, 0xeb, 0x3c, 0x6d, 0x9c, 0x56, 0xc7, + 0xf9, 0x4b, 0xa9, 0x9c, 0x06, 0x17, 0xe0, 0x5a, 0x08, 0xb4, 0x89, 0x3f, 0x8b, 0x7f, 0x4b, 0xfe, 0xff, 0x8b, 0xe5, + 0x5d, 0x59, 0x7f, 0xa4, 0x0b, 0x1c, 0xed, 0xe2, 0xb4, 0xd0, 0xa8, 0x9b, 0xf6, 0x80, 0xd4, 0x32, 0x98, 0xaa, 0x02, + 0x74, 0x10, 0xd2, 0x97, 0x02, 0x80, 0x34, 0xb0, 0xdf, 0x91, 0x62, 0x86, 0x25, 0x2e, 0x58, 0x88, 0x45, 0xf8, 0x3a, + 0x98, 0x83, 0xf9, 0xbc, 0x8b, 0xf2, 0x83, 0xd2, 0x9e, 0x00, 0x69, 0x7c, 0x6d, 0x6e, 0x7b, 0xb1, 0xfb, 0xab, 0x72, + 0x2d, 0xd1, 0x30, 0x80, 0xcc, 0x85, 0x43, 0x88, 0x8a, 0x04, 0x5a, 0x65, 0x73, 0xd3, 0x28, 0x65, 0xae, 0x2a, 0x67, + 0x13, 0x03, 0xc3, 0xe6, 0x9a, 0x8b, 0x50, 0xdb, 0x42, 0x5a, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0xbf, 0x2d, 0x58, 0x62, + 0x75, 0x3f, 0xba, 0xb8, 0xe4, 0xb8, 0x7f, 0x2d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0xc8, 0x5f, 0xfc, 0xa1, 0x91, 0xa1, + 0x77, 0x51, 0xe2, 0xd0, 0x71, 0x6d, 0x71, 0xcf, 0xd8, 0xab, 0xf4, 0x22, 0x88, 0xf6, 0x2f, 0xeb, 0xdf, 0xed, 0x5d, + 0x16, 0x2e, 0x8c, 0xbd, 0x0b, 0xc3, 0x8d, 0x43, 0x9a, 0x0b, 0xd9, 0xe0, 0x07, 0x85, 0xa1, 0xa8, 0x5a, 0x1d, 0xeb, + 0x58, 0x8b, 0xa8, 0xfc, 0x8b, 0xd5, 0x60, 0x78, 0x72, 0x76, 0xb7, 0x08, 0xb5, 0x1b, 0x96, 0x40, 0x68, 0x9f, 0x81, + 0xee, 0xda, 0x8e, 0xae, 0xa1, 0x0d, 0x6d, 0x10, 0xcd, 0x06, 0xfa, 0x2f, 0x17, 0x6f, 0xac, 0xae, 0x7e, 0x06, 0x22, + 0xda, 0x9b, 0x19, 0x5e, 0x7b, 0xe7, 0xfe, 0x3d, 0x4b, 0xae, 0x3d, 0x5d, 0xc3, 0x08, 0x3e, 0x74, 0xe1, 0x61, 0x9a, + 0xe6, 0xe9, 0x7b, 0x04, 0x8a, 0xd0, 0x44, 0xac, 0x37, 0x1d, 0x50, 0x8e, 0xeb, 0x75, 0x35, 0xd7, 0x3b, 0xb4, 0x8f, + 0xba, 0xfa, 0xe9, 0x37, 0x9a, 0x76, 0x32, 0x61, 0xd3, 0xf4, 0x14, 0x9f, 0x68, 0x27, 0x78, 0x47, 0xd0, 0x6f, 0x4d, + 0xb3, 0xc7, 0x61, 0x6a, 0xb9, 0xda, 0x9a, 0x7f, 0x6a, 0xda, 0x34, 0x08, 0xc3, 0x9e, 0xf6, 0x78, 0xea, 0x4d, 0x0f, + 0xa7, 0x2f, 0xfa, 0x3c, 0x39, 0xff, 0xa6, 0x54, 0xdc, 0xa4, 0x7f, 0x3d, 0xa5, 0x5a, 0x9a, 0x25, 0xf1, 0x27, 0xc6, + 0xd5, 0x4e, 0x34, 0xf9, 0x78, 0xac, 0x56, 0xf5, 0xea, 0x3d, 0xb9, 0xdd, 0xd1, 0x78, 0xea, 0x15, 0xc5, 0x71, 0x8c, + 0x07, 0x72, 0x90, 0x27, 0x07, 0x62, 0xe8, 0x27, 0x2a, 0x98, 0x5c, 0xab, 0x09, 0x50, 0xae, 0xce, 0xe7, 0x38, 0x13, + 0xf3, 0x3b, 0x01, 0x3f, 0x8c, 0xd2, 0x5c, 0x17, 0x46, 0xa0, 0x6b, 0x93, 0x81, 0xfe, 0xa3, 0xeb, 0x75, 0x4d, 0xd7, + 0x3d, 0xb2, 0x8f, 0xba, 0x63, 0xc7, 0x3c, 0xb4, 0x0f, 0xad, 0xb6, 0x7d, 0x64, 0x76, 0xad, 0xae, 0xd9, 0xfd, 0x5b, + 0x77, 0x6c, 0x1d, 0xda, 0x87, 0xa6, 0x63, 0x75, 0x21, 0xd1, 0xea, 0x5a, 0xdd, 0x1b, 0xeb, 0xb0, 0x3b, 0x76, 0x30, + 0xd5, 0xb3, 0x3b, 0x1d, 0xcb, 0x75, 0xec, 0x4e, 0xc7, 0xec, 0xd8, 0x47, 0x47, 0x96, 0xdb, 0xb6, 0x8f, 0x8e, 0xce, + 0x3b, 0x5d, 0xbb, 0x0d, 0x79, 0xed, 0xf6, 0xb8, 0x6d, 0xbb, 0xae, 0x05, 0x7f, 0x99, 0x5d, 0xdb, 0xa3, 0x1f, 0xae, + 0x6b, 0xb7, 0x5d, 0xd3, 0x09, 0x3b, 0x9e, 0x7d, 0xf4, 0xc2, 0xc4, 0xbf, 0xb1, 0x98, 0x89, 0x7f, 0x41, 0x33, 0xe6, + 0x0b, 0xdb, 0x3b, 0xa2, 0x5f, 0xd8, 0xe0, 0xcd, 0x61, 0xf7, 0x57, 0xfd, 0x60, 0xe3, 0x1c, 0x5c, 0x9a, 0x43, 0xb7, + 0x63, 0xb7, 0xdb, 0xe6, 0xa1, 0x6b, 0x77, 0xdb, 0x73, 0xeb, 0xd0, 0xb3, 0x8f, 0x8e, 0xc7, 0x96, 0x6b, 0x1f, 0x1f, + 0x9b, 0x8e, 0xd5, 0xb6, 0x3d, 0xd3, 0xb5, 0x0f, 0xdb, 0xf8, 0xa3, 0x6d, 0x7b, 0x37, 0xc7, 0x2f, 0xec, 0xa3, 0xce, + 0xfc, 0xc8, 0x3e, 0xfc, 0x78, 0xd8, 0xb5, 0xbd, 0xf6, 0xbc, 0x7d, 0x64, 0x7b, 0xc7, 0x37, 0x47, 0xf6, 0xe1, 0xdc, + 0xf2, 0x8e, 0xb6, 0xd6, 0x74, 0x3d, 0x1b, 0x60, 0x84, 0xd9, 0x90, 0x61, 0xf2, 0x0c, 0xf8, 0x33, 0xc7, 0xba, 0xff, + 0xc5, 0x66, 0xd2, 0x7a, 0xd5, 0x17, 0x76, 0xf7, 0x78, 0x4c, 0xc5, 0x21, 0xc1, 0x12, 0x25, 0xa0, 0xca, 0x8d, 0x45, + 0xdd, 0x62, 0x73, 0x96, 0x68, 0x48, 0xfc, 0xe1, 0x9d, 0xdd, 0x58, 0xd0, 0x31, 0xf5, 0xfb, 0x3f, 0x6d, 0x47, 0x2e, + 0x39, 0x44, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x41, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x41, 0xc5, 0xfb, 0xdd, 0x82, 0x8a, + 0x37, 0xab, 0x7d, 0x04, 0x15, 0xef, 0xbf, 0xba, 0xa0, 0xe2, 0xbc, 0xaa, 0x27, 0xff, 0xbe, 0xea, 0x9b, 0xfe, 0xd7, + 0x75, 0xf5, 0x19, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x78, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, 0x4a, 0x4a, + 0x60, 0x31, 0xe0, 0xd8, 0xf7, 0x31, 0xe1, 0xd8, 0xdf, 0x57, 0x03, 0xd0, 0x3c, 0xe1, 0x74, 0x49, 0x30, 0xb1, 0xe6, + 0x7e, 0x38, 0x95, 0x34, 0x0d, 0xa4, 0xf4, 0x31, 0x19, 0xac, 0x12, 0xe0, 0xba, 0x06, 0x71, 0xd8, 0x6a, 0x11, 0xa5, + 0xbd, 0x23, 0x07, 0x2e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xca, 0xb6, 0xf0, 0x47, 0x75, 0xcd, 0xad, 0x26, 0x36, 0xe6, + 0xa3, 0x52, 0x60, 0x73, 0xeb, 0x6e, 0xbd, 0x5d, 0x0d, 0xb4, 0x6d, 0x84, 0xd2, 0x24, 0x90, 0x73, 0x4d, 0xf9, 0x65, + 0xd5, 0xbc, 0x8a, 0x32, 0xe6, 0xe6, 0x91, 0xc2, 0x48, 0xaa, 0xf5, 0xdd, 0xb2, 0x6a, 0xdf, 0xae, 0x69, 0x36, 0x74, + 0x5f, 0xaa, 0xbe, 0x45, 0xaf, 0x50, 0x36, 0x5c, 0x05, 0x55, 0x25, 0xb2, 0x5a, 0x23, 0x40, 0x0a, 0xea, 0xbe, 0x50, + 0x3e, 0x2c, 0x48, 0x4b, 0x47, 0x43, 0x7a, 0xc7, 0x51, 0xf2, 0x4a, 0x6d, 0xaa, 0x0a, 0x8b, 0xcf, 0xd6, 0x48, 0x71, + 0x07, 0xbf, 0x03, 0xe9, 0xc8, 0x29, 0x9e, 0x51, 0xac, 0xc2, 0x79, 0xad, 0xb4, 0x4b, 0x8f, 0x99, 0x7c, 0xee, 0xae, + 0xeb, 0xc4, 0xe3, 0x46, 0x55, 0x65, 0x97, 0x2d, 0x04, 0x15, 0x84, 0xdd, 0x93, 0x62, 0x70, 0x4e, 0xca, 0xdb, 0xa8, + 0xfb, 0xbc, 0xad, 0x31, 0x51, 0xee, 0x31, 0x6c, 0x62, 0x93, 0x7f, 0xa8, 0x7e, 0x01, 0xd6, 0x53, 0x88, 0x82, 0xdd, + 0x43, 0x32, 0x4d, 0xa1, 0x51, 0x3d, 0xd4, 0x62, 0xee, 0x6f, 0x51, 0xb0, 0x51, 0x1b, 0xe6, 0x8d, 0xa0, 0x36, 0xf4, + 0x36, 0x9d, 0x1c, 0x69, 0x3c, 0xb2, 0x2e, 0x89, 0xa8, 0xdd, 0xce, 0xb1, 0xe9, 0x1e, 0x99, 0xf6, 0x71, 0xc7, 0xc8, + 0xc5, 0x81, 0x53, 0x9b, 0x2c, 0x01, 0x04, 0x94, 0xa2, 0xe5, 0x30, 0x83, 0x28, 0xc8, 0x02, 0x3f, 0xcc, 0x81, 0x3e, + 0x2e, 0xbf, 0x2a, 0xfe, 0xb9, 0x4a, 0x33, 0x98, 0xa3, 0x20, 0x7a, 0x51, 0x21, 0xdc, 0x1a, 0xb1, 0xec, 0x96, 0xb1, + 0x68, 0x83, 0xb0, 0xbc, 0xaa, 0x5f, 0xfe, 0xe7, 0x69, 0xdb, 0xe6, 0xa4, 0xc9, 0x32, 0xca, 0x22, 0xbe, 0x3f, 0x84, + 0x32, 0x74, 0x3e, 0x34, 0x7f, 0xda, 0x84, 0x70, 0xff, 0xb9, 0x1b, 0xe1, 0x66, 0x6c, 0x1f, 0x84, 0xfb, 0xcf, 0xaf, + 0x8e, 0x70, 0x7f, 0x52, 0x11, 0x6e, 0xc9, 0x16, 0xa8, 0xe0, 0x3a, 0x7f, 0xc0, 0xef, 0x16, 0x38, 0x75, 0x7e, 0xae, + 0x1f, 0x10, 0x01, 0xaf, 0x2b, 0xc1, 0x76, 0x3f, 0x96, 0xa2, 0x07, 0x21, 0x53, 0x04, 0x9d, 0xd0, 0x52, 0xa4, 0x12, + 0x08, 0x44, 0x2b, 0x43, 0xaa, 0x43, 0x9b, 0x6f, 0xa3, 0x2c, 0xb4, 0xdf, 0xf3, 0x87, 0x1f, 0x08, 0x79, 0xde, 0xc4, + 0xc9, 0xc2, 0x47, 0x07, 0x7c, 0x3a, 0x46, 0x1d, 0x84, 0x0f, 0x07, 0xec, 0xcf, 0xc6, 0x71, 0x34, 0x91, 0x92, 0x0a, + 0x36, 0xb8, 0x24, 0x8a, 0x5b, 0xbf, 0x67, 0x7e, 0xa2, 0x9b, 0x94, 0x0d, 0x8b, 0xfb, 0xac, 0xed, 0x3c, 0xf3, 0x0e, + 0x9f, 0x1d, 0x39, 0xf0, 0xbf, 0xcb, 0xda, 0xb9, 0xc9, 0x0b, 0x2e, 0xe2, 0x08, 0x02, 0x9f, 0x88, 0x92, 0x9b, 0x8a, + 0xdd, 0x32, 0xf6, 0xa9, 0x28, 0x75, 0xdc, 0x5c, 0x68, 0xe2, 0xdf, 0x17, 0x65, 0x1a, 0x4b, 0xcc, 0xe3, 0x95, 0x32, + 0xac, 0x86, 0xd1, 0x04, 0xd1, 0x0a, 0x78, 0x6f, 0x4a, 0x09, 0x35, 0x9b, 0x4f, 0xb7, 0x98, 0x17, 0x6b, 0xe7, 0x57, + 0x45, 0x74, 0x25, 0x11, 0xe5, 0x65, 0x27, 0x04, 0xb9, 0xd8, 0xc2, 0x41, 0xdf, 0xec, 0x18, 0x5f, 0x48, 0x83, 0xd8, + 0x86, 0x62, 0x81, 0x7c, 0x5a, 0xa0, 0x2c, 0x59, 0x45, 0xe3, 0x16, 0xfe, 0xf4, 0x47, 0x69, 0x2b, 0x38, 0x00, 0xef, + 0xac, 0xd8, 0xb1, 0x81, 0xab, 0xe6, 0x9f, 0x3a, 0x45, 0x28, 0x8a, 0x54, 0xac, 0x8a, 0xff, 0x2c, 0x33, 0x13, 0x0a, + 0x60, 0x8b, 0x4b, 0x6b, 0x0d, 0xfc, 0x67, 0xb2, 0xe2, 0xb3, 0xcc, 0x84, 0x20, 0xb2, 0xb0, 0xdc, 0x4f, 0x9f, 0x52, + 0x29, 0x08, 0xeb, 0x48, 0xd3, 0x3a, 0x1b, 0x17, 0xee, 0xdd, 0x34, 0x7f, 0x16, 0x93, 0x87, 0xb7, 0xde, 0xd8, 0x8c, + 0x9f, 0x3f, 0x3f, 0x1d, 0xb8, 0x06, 0x0f, 0x4a, 0x5a, 0x8a, 0xa0, 0x75, 0xbe, 0x9f, 0xf2, 0x81, 0xd1, 0x68, 0x16, + 0xb7, 0x84, 0x37, 0x93, 0x23, 0x54, 0x94, 0x39, 0xf6, 0x82, 0x88, 0x16, 0x24, 0x64, 0xf4, 0x85, 0x12, 0x80, 0x28, + 0x23, 0x5f, 0x5d, 0x6d, 0xdb, 0xb1, 0x1d, 0x5d, 0x56, 0x9c, 0x06, 0xb3, 0xc1, 0x3a, 0xce, 0x7c, 0x88, 0x0d, 0x14, + 0xc6, 0x33, 0xb0, 0xad, 0xc9, 0x82, 0x2c, 0x84, 0x40, 0x33, 0x60, 0x64, 0xb3, 0xa0, 0x77, 0x79, 0xce, 0x35, 0x9e, + 0xfd, 0xe4, 0x13, 0x06, 0x1b, 0x14, 0x66, 0x75, 0xe8, 0x71, 0xe8, 0x47, 0xb8, 0x0c, 0x5b, 0x7a, 0x0b, 0x42, 0x5d, + 0xb2, 0x24, 0xb5, 0x54, 0x0b, 0x82, 0x9e, 0x06, 0x75, 0x20, 0x0c, 0x3d, 0x36, 0x30, 0x4d, 0xfc, 0x05, 0xf8, 0x64, + 0x5f, 0xe7, 0x26, 0xc7, 0xb4, 0x3a, 0x47, 0xb5, 0x9a, 0xfb, 0xe2, 0xc8, 0xd4, 0x3c, 0xd7, 0xd4, 0x1c, 0x40, 0xb7, + 0x7a, 0x6e, 0xae, 0xf3, 0xab, 0xfe, 0x2e, 0x21, 0x28, 0xe1, 0x97, 0xc7, 0x34, 0x0f, 0x12, 0x7f, 0x72, 0xf6, 0x72, + 0x46, 0x0e, 0x24, 0x5b, 0x8a, 0xb7, 0xf4, 0x80, 0x04, 0x21, 0x17, 0xec, 0x2e, 0x33, 0x30, 0x10, 0x0b, 0x2f, 0x12, + 0x18, 0x6b, 0x34, 0xfe, 0x0b, 0x22, 0x2d, 0xf8, 0xfc, 0xb9, 0x15, 0x80, 0x81, 0xc3, 0x40, 0x81, 0x0f, 0x7c, 0x1b, + 0x25, 0x80, 0x05, 0x85, 0xe8, 0x0e, 0x81, 0x05, 0xd6, 0x47, 0xf0, 0x6f, 0x91, 0x2c, 0x7e, 0x70, 0xd1, 0xa9, 0x1d, + 0xfa, 0xd1, 0x0c, 0x50, 0x9a, 0x1f, 0xcd, 0x6a, 0x2a, 0x1a, 0x64, 0xbf, 0x58, 0x49, 0x2d, 0x9a, 0x2a, 0xd4, 0x27, + 0xd2, 0xef, 0xef, 0x2f, 0x28, 0xd0, 0x14, 0x04, 0x35, 0xf7, 0x27, 0x68, 0x6c, 0x57, 0x48, 0x77, 0x9e, 0x0f, 0xbe, + 0x3d, 0x59, 0xb0, 0xcc, 0x27, 0xd6, 0x30, 0x3c, 0x7e, 0x81, 0x1c, 0xd0, 0xc6, 0x22, 0x48, 0x2c, 0x05, 0x93, 0x9f, + 0xb0, 0x9b, 0x60, 0xcc, 0xdf, 0xa5, 0xa6, 0xc6, 0xef, 0x29, 0x0b, 0xb5, 0xc0, 0x06, 0xae, 0x49, 0x4a, 0xc8, 0x63, + 0x1f, 0xdd, 0x4c, 0x0e, 0xa2, 0x58, 0x3f, 0xfd, 0x56, 0xda, 0x6b, 0x6d, 0x5a, 0x04, 0x88, 0xf6, 0x78, 0x99, 0xb0, + 0xf0, 0x5f, 0x83, 0x6f, 0xe1, 0xe2, 0xfe, 0xf6, 0x4a, 0x37, 0xfa, 0x99, 0x3d, 0x4f, 0xd8, 0x74, 0xf0, 0x6d, 0x43, + 0xd4, 0x43, 0x7c, 0xde, 0xd3, 0x58, 0xf4, 0xb6, 0x57, 0x38, 0x07, 0x6a, 0xef, 0xf5, 0xa8, 0x3f, 0xe5, 0xaf, 0x75, + 0x78, 0x01, 0xae, 0x4b, 0x6f, 0x6c, 0xb7, 0x8f, 0xef, 0xe7, 0x51, 0xe8, 0x8f, 0x3f, 0xf5, 0x29, 0xa7, 0xf4, 0x61, + 0xc1, 0x6d, 0x3d, 0xf6, 0x97, 0x3d, 0xbc, 0x5e, 0xd5, 0x44, 0x30, 0xd7, 0xa4, 0x54, 0x49, 0xd9, 0x35, 0xee, 0x65, + 0xdc, 0xca, 0x6b, 0xec, 0x19, 0xbb, 0xba, 0x9d, 0x07, 0x19, 0x13, 0x5d, 0xe1, 0x47, 0x9e, 0x8b, 0x87, 0x3a, 0x3d, + 0x51, 0xf1, 0x61, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, 0x74, 0xbb, + 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, 0x3f, 0xba, + 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xb5, 0xe0, 0x01, 0x44, 0xef, 0x9d, 0x6f, 0x4b, 0x58, 0x40, 0xf9, + 0x2d, 0xe5, 0x34, 0x66, 0xe9, 0x7a, 0x6b, 0x90, 0xf5, 0x00, 0xca, 0xd0, 0x4d, 0xe1, 0x04, 0x32, 0xea, 0xb7, 0x20, + 0x0c, 0x3b, 0x06, 0x10, 0x10, 0x2a, 0x2f, 0xc2, 0x2e, 0x55, 0xb8, 0xd2, 0x6f, 0x3c, 0x46, 0xbc, 0x4e, 0xb3, 0xc3, + 0x75, 0x11, 0x99, 0x8a, 0x84, 0x43, 0xbf, 0x2c, 0xd1, 0x89, 0x91, 0x70, 0x11, 0xaf, 0x60, 0xa5, 0x22, 0x3a, 0x62, + 0xbe, 0x7b, 0xe0, 0x68, 0x99, 0xcb, 0x64, 0x74, 0x9e, 0xaf, 0xda, 0x36, 0x17, 0x18, 0xc9, 0xd6, 0xff, 0x68, 0x3b, + 0x18, 0x94, 0x96, 0xda, 0x11, 0xde, 0x5c, 0x27, 0x41, 0x22, 0x87, 0xa7, 0xa0, 0x68, 0xb7, 0xd9, 0x53, 0xbd, 0x01, + 0x61, 0x4c, 0xde, 0x02, 0x95, 0x7c, 0xe3, 0x87, 0x8a, 0x72, 0x8b, 0x52, 0xf3, 0x91, 0xc4, 0xfc, 0x4f, 0x9f, 0x16, + 0x83, 0xb3, 0x2a, 0xe3, 0x3e, 0x71, 0x3b, 0x70, 0xed, 0x76, 0x58, 0x7b, 0xab, 0x9e, 0xd5, 0x6e, 0x77, 0xc0, 0x85, + 0xbb, 0x50, 0xa1, 0x4b, 0x21, 0xa4, 0xb8, 0x1b, 0x95, 0xbd, 0x6a, 0x32, 0x5c, 0x70, 0xa4, 0x5c, 0x79, 0xea, 0xe8, + 0x46, 0x3f, 0x12, 0x22, 0xc9, 0x68, 0x8b, 0x0b, 0x64, 0xfe, 0x16, 0xd3, 0x01, 0x34, 0x5b, 0xe6, 0xb1, 0xc3, 0x68, + 0xf4, 0x7f, 0x3d, 0x09, 0x34, 0xe0, 0x02, 0x19, 0x6a, 0xe5, 0xb4, 0x96, 0x0c, 0x7a, 0xe4, 0xbd, 0x4a, 0x17, 0x2a, + 0x4b, 0xcf, 0x74, 0x48, 0x82, 0xf8, 0x56, 0x18, 0xd2, 0x4e, 0x2a, 0x90, 0xc9, 0xdb, 0xa2, 0x48, 0x30, 0x03, 0xf0, + 0x01, 0xde, 0x12, 0xc6, 0x64, 0xc6, 0xd3, 0xa7, 0x1b, 0x2f, 0x21, 0x12, 0xd8, 0xab, 0x91, 0x3d, 0x75, 0x15, 0xbf, + 0xe9, 0x2a, 0x8a, 0x91, 0xed, 0x22, 0xd6, 0x10, 0x7a, 0x6f, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0xf9, 0x99, 0xcd, 0x25, + 0x4d, 0x2d, 0xe5, 0x72, 0x37, 0x5d, 0xd6, 0x06, 0x8d, 0x37, 0xee, 0xeb, 0x8c, 0xfb, 0x12, 0x7c, 0xb2, 0xfe, 0xb8, + 0xe2, 0x96, 0xde, 0xd0, 0xc6, 0x67, 0xa7, 0x70, 0x4f, 0xf3, 0x2e, 0xf3, 0xc9, 0x87, 0x89, 0x7a, 0xe5, 0xc6, 0x99, + 0x2f, 0xe2, 0xc8, 0x00, 0x5d, 0xde, 0x6f, 0x14, 0xc9, 0x2a, 0xd6, 0xe0, 0xa7, 0xef, 0x2e, 0xbe, 0xd3, 0xf8, 0xfe, + 0x27, 0x09, 0x22, 0x3e, 0x64, 0x28, 0xea, 0xc1, 0x80, 0xa2, 0x1e, 0x68, 0x3c, 0x8c, 0x08, 0xc4, 0x0e, 0xc8, 0x0f, + 0x08, 0x82, 0xc8, 0x80, 0x26, 0xb9, 0xea, 0x62, 0x15, 0x66, 0xc1, 0xd2, 0x4f, 0xb2, 0x03, 0xa8, 0x6a, 0x01, 0x92, + 0xd3, 0x37, 0xd9, 0x88, 0x93, 0x68, 0x56, 0xb8, 0xd8, 0xcb, 0x22, 0x21, 0x9b, 0x9d, 0x06, 0xa1, 0x14, 0xcd, 0x8a, + 0x0e, 0xfc, 0xf1, 0x98, 0x2d, 0xb3, 0x81, 0xee, 0x2f, 0x21, 0xfa, 0x05, 0xfa, 0xb3, 0x3e, 0x88, 0xc7, 0x19, 0xcb, + 0xac, 0x34, 0x4b, 0x98, 0xbf, 0xd0, 0xa5, 0x2b, 0xd7, 0x7a, 0x7b, 0xe9, 0x6a, 0xb4, 0x08, 0x32, 0xe9, 0x0b, 0x91, + 0x26, 0x08, 0x42, 0x52, 0x18, 0xe2, 0xe9, 0x30, 0xe7, 0x20, 0x3c, 0x8f, 0x67, 0x95, 0x1d, 0x55, 0x50, 0x2e, 0x67, + 0xe8, 0x69, 0x97, 0x47, 0x3c, 0x98, 0xa0, 0xcd, 0xd3, 0x35, 0xb7, 0x6b, 0x97, 0x2e, 0x1b, 0xf5, 0xd3, 0x13, 0xfe, + 0xbc, 0xd5, 0xd0, 0x15, 0x83, 0xde, 0x71, 0xc0, 0x97, 0xf0, 0x26, 0x8b, 0xf7, 0x03, 0x5e, 0x18, 0xae, 0x26, 0x6a, + 0x19, 0xfd, 0xbc, 0xd3, 0x58, 0x2e, 0x80, 0x10, 0x2a, 0x09, 0xd1, 0xe7, 0xee, 0xa9, 0x34, 0xb1, 0xc2, 0x51, 0x21, + 0xad, 0xf4, 0xf9, 0xf3, 0xcb, 0xe1, 0x7f, 0xfe, 0x0d, 0xce, 0xe8, 0xe7, 0xae, 0xb0, 0x33, 0xbf, 0x54, 0x4b, 0x71, + 0xea, 0xd3, 0x1c, 0xa2, 0x02, 0x05, 0x9b, 0x08, 0xc7, 0x2b, 0x62, 0x6b, 0xe5, 0xc3, 0x2b, 0xe1, 0x4c, 0x0b, 0x02, + 0x4e, 0x18, 0xc2, 0x1a, 0x7e, 0x08, 0xcb, 0x3b, 0x14, 0x4e, 0x18, 0xb4, 0xdf, 0xee, 0xbe, 0x3f, 0x06, 0x67, 0xcb, + 0xb5, 0x38, 0x10, 0xca, 0x00, 0x71, 0x0f, 0x9d, 0x9e, 0xf8, 0x1a, 0x12, 0x2d, 0x48, 0x7e, 0xa4, 0xbd, 0x03, 0x98, + 0xe6, 0x3c, 0x5e, 0x30, 0x3b, 0x88, 0x0f, 0x6e, 0xd9, 0xc8, 0xf2, 0x97, 0x01, 0xc9, 0xea, 0x91, 0xef, 0xa6, 0x11, + 0xe5, 0x27, 0x45, 0xe0, 0x44, 0x5f, 0xe7, 0x05, 0x28, 0xe3, 0x02, 0x50, 0xf0, 0xd3, 0x3f, 0x2d, 0xfb, 0x67, 0xb4, + 0x45, 0x84, 0x80, 0x32, 0x96, 0x3f, 0x23, 0x37, 0x8b, 0xc2, 0xa3, 0x62, 0xf1, 0x61, 0xc5, 0xd3, 0xa9, 0xea, 0x53, + 0xd1, 0x2e, 0xf7, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x49, 0x3d, 0xd5, 0xbb, 0x90, 0x3f, 0x21, 0x3a, 0x32, 0x77, + 0xbf, 0x09, 0xe7, 0xb9, 0xe6, 0x9b, 0x51, 0x82, 0xe4, 0x31, 0x15, 0xe2, 0x88, 0xa2, 0xea, 0x09, 0x7c, 0x03, 0x69, + 0xf2, 0x68, 0x30, 0x20, 0x3c, 0x56, 0x45, 0x67, 0x00, 0xa5, 0x86, 0x68, 0x09, 0x30, 0xd9, 0x0c, 0x2a, 0x5a, 0x64, + 0x23, 0x87, 0x95, 0xaa, 0xd3, 0xa9, 0x8f, 0xf1, 0xc0, 0x17, 0xfb, 0xab, 0xb4, 0x03, 0x61, 0x67, 0xf1, 0x85, 0x05, + 0x04, 0x2e, 0xda, 0xa9, 0xe0, 0x71, 0xed, 0xaf, 0x84, 0xb2, 0xad, 0xd0, 0xbf, 0x8f, 0x15, 0xdd, 0x05, 0xee, 0xc6, + 0xe0, 0x1c, 0x53, 0x2f, 0x84, 0xf9, 0x60, 0xed, 0x24, 0x49, 0x8f, 0xf3, 0xf5, 0xd3, 0xa4, 0xba, 0x88, 0xdf, 0x75, + 0x98, 0xd4, 0xb2, 0xe5, 0xc9, 0x20, 0x76, 0xcc, 0x8b, 0x83, 0x56, 0xca, 0xc4, 0x73, 0x9f, 0x9f, 0x1c, 0xc0, 0xfc, + 0xc0, 0xf5, 0x42, 0x89, 0x32, 0x0a, 0x0c, 0xf0, 0xef, 0xe0, 0xa7, 0xa4, 0x7f, 0xf1, 0x76, 0x22, 0x88, 0x3a, 0x7c, + 0x39, 0x4a, 0xe7, 0xaf, 0xa5, 0x22, 0x75, 0x62, 0xc5, 0x69, 0xa6, 0xf2, 0x76, 0x47, 0x68, 0xf8, 0x7d, 0x85, 0xe1, + 0x19, 0xf2, 0x7e, 0xc6, 0x84, 0x65, 0xf3, 0x79, 0xb6, 0xc1, 0xf8, 0x79, 0x53, 0x11, 0x22, 0x58, 0xb7, 0x14, 0x28, + 0xf6, 0xf1, 0xb6, 0x52, 0x05, 0x69, 0x24, 0x8b, 0x2d, 0xfd, 0x96, 0xfe, 0x18, 0x77, 0x7c, 0xad, 0x34, 0xa6, 0x42, + 0xb9, 0xf3, 0x6c, 0x00, 0x45, 0x05, 0xb3, 0xdd, 0x5f, 0x2e, 0xa9, 0xb0, 0xd1, 0x3f, 0x39, 0xa0, 0x77, 0xe7, 0x29, + 0xed, 0xb0, 0xd3, 0x13, 0xd0, 0xdf, 0xa4, 0x45, 0xf7, 0x97, 0x4b, 0xbe, 0xa4, 0xf4, 0x8b, 0x72, 0x0e, 0xe6, 0xd9, + 0x22, 0x3c, 0xfd, 0x3f, 0x1d, 0xdb, 0x6f, 0x83, 0x01, 0x5c, 0x03, 0x00}; } // namespace web_server } // namespace esphome From 3cd2fb08431f170d5c853cfaf87476ae0997e24a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 09:57:36 +1200 Subject: [PATCH 016/151] [core] Update Entities (#6885) --- CODEOWNERS | 2 + esphome/components/api/api.proto | 44 +++ esphome/components/api/api_connection.cpp | 45 +++ esphome/components/api/api_connection.h | 6 + esphome/components/api/api_pb2.cpp | 256 ++++++++++++++++++ esphome/components/api/api_pb2.h | 55 ++++ esphome/components/api/api_pb2_service.cpp | 42 +++ esphome/components/api/api_pb2_service.h | 15 + esphome/components/api/api_server.cpp | 7 + esphome/components/api/api_server.h | 3 + esphome/components/api/list_entities.cpp | 3 + esphome/components/api/list_entities.h | 3 + esphome/components/api/subscribe_state.cpp | 3 + esphome/components/api/subscribe_state.h | 3 + .../http_request/ota/ota_http_request.cpp | 2 + .../http_request/ota/ota_http_request.h | 1 - .../http_request/update/__init__.py | 44 +++ .../update/http_request_update.cpp | 157 +++++++++++ .../http_request/update/http_request_update.h | 37 +++ esphome/components/mqtt/__init__.py | 1 + esphome/components/mqtt/mqtt_const.h | 2 + esphome/components/mqtt/mqtt_update.cpp | 62 +++++ esphome/components/mqtt/mqtt_update.h | 41 +++ esphome/components/update/__init__.py | 108 ++++++++ esphome/components/update/update_entity.cpp | 12 + esphome/components/update/update_entity.h | 51 ++++ .../components/web_server/list_entities.cpp | 9 + esphome/components/web_server/list_entities.h | 3 + esphome/components/web_server/web_server.cpp | 71 +++++ esphome/components/web_server/web_server.h | 12 +- esphome/const.py | 1 + esphome/core/application.h | 20 ++ esphome/core/component_iterator.cpp | 15 + esphome/core/component_iterator.h | 6 + esphome/core/controller.cpp | 6 + esphome/core/controller.h | 6 + esphome/core/defines.h | 1 + tests/components/http_request/common.yaml | 6 + tests/components/mqtt/common-update.yaml | 13 + tests/components/mqtt/test.esp32-c3-idf.yaml | 1 + tests/components/mqtt/test.esp32-c3.yaml | 4 + tests/components/mqtt/test.esp32-idf.yaml | 1 + tests/components/mqtt/test.esp32.yaml | 4 + tests/components/mqtt/test.esp8266.yaml | 4 + tests/components/update/common.yaml | 1 + tests/components/update/test.esp32-ard.yaml | 1 + tests/components/update/test.esp32-idf.yaml | 1 + tests/components/update/test.esp8266.yaml | 1 + tests/components/update/test.rp2040.yaml | 1 + 49 files changed, 1191 insertions(+), 2 deletions(-) create mode 100644 esphome/components/http_request/update/__init__.py create mode 100644 esphome/components/http_request/update/http_request_update.cpp create mode 100644 esphome/components/http_request/update/http_request_update.h create mode 100644 esphome/components/mqtt/mqtt_update.cpp create mode 100644 esphome/components/mqtt/mqtt_update.h create mode 100644 esphome/components/update/__init__.py create mode 100644 esphome/components/update/update_entity.cpp create mode 100644 esphome/components/update/update_entity.h create mode 100644 tests/components/mqtt/common-update.yaml create mode 100644 tests/components/update/common.yaml create mode 100644 tests/components/update/test.esp32-ard.yaml create mode 100644 tests/components/update/test.esp32-idf.yaml create mode 100644 tests/components/update/test.esp8266.yaml create mode 100644 tests/components/update/test.rp2040.yaml diff --git a/CODEOWNERS b/CODEOWNERS index 90574ca9ba..bbb39c26ad 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -172,6 +172,7 @@ esphome/components/host/time/* @clydebarrow esphome/components/hrxl_maxsonar_wr/* @netmikey esphome/components/hte501/* @Stock-M esphome/components/http_request/ota/* @oarcher +esphome/components/http_request/update/* @jesserockz esphome/components/htu31d/* @betterengineering esphome/components/hydreon_rgxx/* @functionpointer esphome/components/hyt271/* @Philippe12 @@ -410,6 +411,7 @@ esphome/components/uart/button/* @ssieb esphome/components/ufire_ec/* @pvizeli esphome/components/ufire_ise/* @pvizeli esphome/components/ultrasonic/* @OttoWinter +esphome/components/update/* @jesserockz esphome/components/uponor_smatrix/* @kroimon esphome/components/valve/* @esphome/core esphome/components/vbus/* @ssieb diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto index 0becec2348..812a1d74ae 100644 --- a/esphome/components/api/api.proto +++ b/esphome/components/api/api.proto @@ -48,6 +48,7 @@ service APIConnection { rpc date_command (DateCommandRequest) returns (void) {} rpc time_command (TimeCommandRequest) returns (void) {} rpc datetime_command (DateTimeCommandRequest) returns (void) {} + rpc update_command (UpdateCommandRequest) returns (void) {} rpc subscribe_bluetooth_le_advertisements(SubscribeBluetoothLEAdvertisementsRequest) returns (void) {} rpc bluetooth_device_request(BluetoothDeviceRequest) returns (void) {} @@ -1837,3 +1838,46 @@ message DateTimeCommandRequest { fixed32 key = 1; fixed32 epoch_seconds = 2; } + +// ==================== UPDATE ==================== +message ListEntitiesUpdateResponse { + option (id) = 116; + option (source) = SOURCE_SERVER; + option (ifdef) = "USE_UPDATE"; + + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + string icon = 5; + bool disabled_by_default = 6; + EntityCategory entity_category = 7; + string device_class = 8; +} +message UpdateStateResponse { + option (id) = 117; + option (source) = SOURCE_SERVER; + option (ifdef) = "USE_UPDATE"; + option (no_delay) = true; + + fixed32 key = 1; + bool missing_state = 2; + bool in_progress = 3; + bool has_progress = 4; + float progress = 5; + string current_version = 6; + string latest_version = 7; + string title = 8; + string release_summary = 9; + string release_url = 10; +} +message UpdateCommandRequest { + option (id) = 118; + option (source) = SOURCE_CLIENT; + option (ifdef) = "USE_UPDATE"; + option (no_delay) = true; + + fixed32 key = 1; + bool install = 2; +} diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 253f04aa39..2e73a8336e 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1287,6 +1287,51 @@ bool APIConnection::send_event_info(event::Event *event) { } #endif +#ifdef USE_UPDATE +bool APIConnection::send_update_state(update::UpdateEntity *update) { + if (!this->state_subscription_) + return false; + + UpdateStateResponse resp{}; + resp.key = update->get_object_id_hash(); + resp.missing_state = !update->has_state(); + if (update->has_state()) { + resp.in_progress = update->state == update::UpdateState::UPDATE_STATE_INSTALLING; + if (update->update_info.has_progress) { + resp.has_progress = true; + resp.progress = update->update_info.progress; + } + resp.current_version = update->update_info.current_version; + resp.latest_version = update->update_info.latest_version; + resp.title = update->update_info.title; + resp.release_summary = update->update_info.summary; + resp.release_url = update->update_info.release_url; + } + + return this->send_update_state_response(resp); +} +bool APIConnection::send_update_info(update::UpdateEntity *update) { + ListEntitiesUpdateResponse msg; + msg.key = update->get_object_id_hash(); + msg.object_id = update->get_object_id(); + if (update->has_own_name()) + msg.name = update->get_name(); + msg.unique_id = get_default_unique_id("update", update); + msg.icon = update->get_icon(); + msg.disabled_by_default = update->is_disabled_by_default(); + msg.entity_category = static_cast(update->get_entity_category()); + msg.device_class = update->get_device_class(); + return this->send_list_entities_update_response(msg); +} +void APIConnection::update_command(const UpdateCommandRequest &msg) { + update::UpdateEntity *update = App.get_update_by_key(msg.key); + if (update == nullptr) + return; + + update->perform(); +} +#endif + bool APIConnection::send_log_message(int level, const char *tag, const char *line) { if (this->log_subscription_ < level) return false; diff --git a/esphome/components/api/api_connection.h b/esphome/components/api/api_connection.h index 293da17fa4..714e806470 100644 --- a/esphome/components/api/api_connection.h +++ b/esphome/components/api/api_connection.h @@ -164,6 +164,12 @@ class APIConnection : public APIServerConnection { bool send_event_info(event::Event *event); #endif +#ifdef USE_UPDATE + bool send_update_state(update::UpdateEntity *update); + bool send_update_info(update::UpdateEntity *update); + void update_command(const UpdateCommandRequest &msg) override; +#endif + void on_disconnect_response(const DisconnectResponse &value) override; void on_ping_response(const PingResponse &value) override { // we initiated ping diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp index 9db6482c49..e6e905c6d1 100644 --- a/esphome/components/api/api_pb2.cpp +++ b/esphome/components/api/api_pb2.cpp @@ -8376,6 +8376,262 @@ void DateTimeCommandRequest::dump_to(std::string &out) const { out.append("}"); } #endif +bool ListEntitiesUpdateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 6: { + this->disabled_by_default = value.as_bool(); + return true; + } + case 7: { + this->entity_category = value.as_enum(); + return true; + } + default: + return false; + } +} +bool ListEntitiesUpdateResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { + switch (field_id) { + case 1: { + this->object_id = value.as_string(); + return true; + } + case 3: { + this->name = value.as_string(); + return true; + } + case 4: { + this->unique_id = value.as_string(); + return true; + } + case 5: { + this->icon = value.as_string(); + return true; + } + case 8: { + this->device_class = value.as_string(); + return true; + } + default: + return false; + } +} +bool ListEntitiesUpdateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { + switch (field_id) { + case 2: { + this->key = value.as_fixed32(); + return true; + } + default: + return false; + } +} +void ListEntitiesUpdateResponse::encode(ProtoWriteBuffer buffer) const { + buffer.encode_string(1, this->object_id); + buffer.encode_fixed32(2, this->key); + buffer.encode_string(3, this->name); + buffer.encode_string(4, this->unique_id); + buffer.encode_string(5, this->icon); + buffer.encode_bool(6, this->disabled_by_default); + buffer.encode_enum(7, this->entity_category); + buffer.encode_string(8, this->device_class); +} +#ifdef HAS_PROTO_MESSAGE_DUMP +void ListEntitiesUpdateResponse::dump_to(std::string &out) const { + __attribute__((unused)) char buffer[64]; + out.append("ListEntitiesUpdateResponse {\n"); + out.append(" object_id: "); + out.append("'").append(this->object_id).append("'"); + out.append("\n"); + + out.append(" key: "); + sprintf(buffer, "%" PRIu32, this->key); + out.append(buffer); + out.append("\n"); + + out.append(" name: "); + out.append("'").append(this->name).append("'"); + out.append("\n"); + + out.append(" unique_id: "); + out.append("'").append(this->unique_id).append("'"); + out.append("\n"); + + out.append(" icon: "); + out.append("'").append(this->icon).append("'"); + out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); + + out.append(" entity_category: "); + out.append(proto_enum_to_string(this->entity_category)); + out.append("\n"); + + out.append(" device_class: "); + out.append("'").append(this->device_class).append("'"); + out.append("\n"); + out.append("}"); +} +#endif +bool UpdateStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 2: { + this->missing_state = value.as_bool(); + return true; + } + case 3: { + this->in_progress = value.as_bool(); + return true; + } + case 4: { + this->has_progress = value.as_bool(); + return true; + } + default: + return false; + } +} +bool UpdateStateResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { + switch (field_id) { + case 6: { + this->current_version = value.as_string(); + return true; + } + case 7: { + this->latest_version = value.as_string(); + return true; + } + case 8: { + this->title = value.as_string(); + return true; + } + case 9: { + this->release_summary = value.as_string(); + return true; + } + case 10: { + this->release_url = value.as_string(); + return true; + } + default: + return false; + } +} +bool UpdateStateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { + switch (field_id) { + case 1: { + this->key = value.as_fixed32(); + return true; + } + case 5: { + this->progress = value.as_float(); + return true; + } + default: + return false; + } +} +void UpdateStateResponse::encode(ProtoWriteBuffer buffer) const { + buffer.encode_fixed32(1, this->key); + buffer.encode_bool(2, this->missing_state); + buffer.encode_bool(3, this->in_progress); + buffer.encode_bool(4, this->has_progress); + buffer.encode_float(5, this->progress); + buffer.encode_string(6, this->current_version); + buffer.encode_string(7, this->latest_version); + buffer.encode_string(8, this->title); + buffer.encode_string(9, this->release_summary); + buffer.encode_string(10, this->release_url); +} +#ifdef HAS_PROTO_MESSAGE_DUMP +void UpdateStateResponse::dump_to(std::string &out) const { + __attribute__((unused)) char buffer[64]; + out.append("UpdateStateResponse {\n"); + out.append(" key: "); + sprintf(buffer, "%" PRIu32, this->key); + out.append(buffer); + out.append("\n"); + + out.append(" missing_state: "); + out.append(YESNO(this->missing_state)); + out.append("\n"); + + out.append(" in_progress: "); + out.append(YESNO(this->in_progress)); + out.append("\n"); + + out.append(" has_progress: "); + out.append(YESNO(this->has_progress)); + out.append("\n"); + + out.append(" progress: "); + sprintf(buffer, "%g", this->progress); + out.append(buffer); + out.append("\n"); + + out.append(" current_version: "); + out.append("'").append(this->current_version).append("'"); + out.append("\n"); + + out.append(" latest_version: "); + out.append("'").append(this->latest_version).append("'"); + out.append("\n"); + + out.append(" title: "); + out.append("'").append(this->title).append("'"); + out.append("\n"); + + out.append(" release_summary: "); + out.append("'").append(this->release_summary).append("'"); + out.append("\n"); + + out.append(" release_url: "); + out.append("'").append(this->release_url).append("'"); + out.append("\n"); + out.append("}"); +} +#endif +bool UpdateCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 2: { + this->install = value.as_bool(); + return true; + } + default: + return false; + } +} +bool UpdateCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) { + switch (field_id) { + case 1: { + this->key = value.as_fixed32(); + return true; + } + default: + return false; + } +} +void UpdateCommandRequest::encode(ProtoWriteBuffer buffer) const { + buffer.encode_fixed32(1, this->key); + buffer.encode_bool(2, this->install); +} +#ifdef HAS_PROTO_MESSAGE_DUMP +void UpdateCommandRequest::dump_to(std::string &out) const { + __attribute__((unused)) char buffer[64]; + out.append("UpdateCommandRequest {\n"); + out.append(" key: "); + sprintf(buffer, "%" PRIu32, this->key); + out.append(buffer); + out.append("\n"); + + out.append(" install: "); + out.append(YESNO(this->install)); + out.append("\n"); + out.append("}"); +} +#endif } // namespace api } // namespace esphome diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index 54cbd20559..ef051eecf1 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -2130,6 +2130,61 @@ class DateTimeCommandRequest : public ProtoMessage { protected: bool decode_32bit(uint32_t field_id, Proto32Bit value) override; }; +class ListEntitiesUpdateResponse : public ProtoMessage { + public: + std::string object_id{}; + uint32_t key{0}; + std::string name{}; + std::string unique_id{}; + std::string icon{}; + bool disabled_by_default{false}; + enums::EntityCategory entity_category{}; + std::string device_class{}; + void encode(ProtoWriteBuffer buffer) const override; +#ifdef HAS_PROTO_MESSAGE_DUMP + void dump_to(std::string &out) const override; +#endif + + protected: + bool decode_32bit(uint32_t field_id, Proto32Bit value) override; + bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; +}; +class UpdateStateResponse : public ProtoMessage { + public: + uint32_t key{0}; + bool missing_state{false}; + bool in_progress{false}; + bool has_progress{false}; + float progress{0.0f}; + std::string current_version{}; + std::string latest_version{}; + std::string title{}; + std::string release_summary{}; + std::string release_url{}; + void encode(ProtoWriteBuffer buffer) const override; +#ifdef HAS_PROTO_MESSAGE_DUMP + void dump_to(std::string &out) const override; +#endif + + protected: + bool decode_32bit(uint32_t field_id, Proto32Bit value) override; + bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; +}; +class UpdateCommandRequest : public ProtoMessage { + public: + uint32_t key{0}; + bool install{false}; + void encode(ProtoWriteBuffer buffer) const override; +#ifdef HAS_PROTO_MESSAGE_DUMP + void dump_to(std::string &out) const override; +#endif + + protected: + bool decode_32bit(uint32_t field_id, Proto32Bit value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; +}; } // namespace api } // namespace esphome diff --git a/esphome/components/api/api_pb2_service.cpp b/esphome/components/api/api_pb2_service.cpp index 7c95bb03ad..269a755e9e 100644 --- a/esphome/components/api/api_pb2_service.cpp +++ b/esphome/components/api/api_pb2_service.cpp @@ -611,6 +611,24 @@ bool APIServerConnectionBase::send_date_time_state_response(const DateTimeStateR #endif #ifdef USE_DATETIME_DATETIME #endif +#ifdef USE_UPDATE +bool APIServerConnectionBase::send_list_entities_update_response(const ListEntitiesUpdateResponse &msg) { +#ifdef HAS_PROTO_MESSAGE_DUMP + ESP_LOGVV(TAG, "send_list_entities_update_response: %s", msg.dump().c_str()); +#endif + return this->send_message_(msg, 116); +} +#endif +#ifdef USE_UPDATE +bool APIServerConnectionBase::send_update_state_response(const UpdateStateResponse &msg) { +#ifdef HAS_PROTO_MESSAGE_DUMP + ESP_LOGVV(TAG, "send_update_state_response: %s", msg.dump().c_str()); +#endif + return this->send_message_(msg, 117); +} +#endif +#ifdef USE_UPDATE +#endif bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) { switch (msg_type) { case 1: { @@ -1106,6 +1124,17 @@ bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ESP_LOGVV(TAG, "on_voice_assistant_timer_event_response: %s", msg.dump().c_str()); #endif this->on_voice_assistant_timer_event_response(msg); +#endif + break; + } + case 118: { +#ifdef USE_UPDATE + UpdateCommandRequest msg; + msg.decode(msg_data, msg_size); +#ifdef HAS_PROTO_MESSAGE_DUMP + ESP_LOGVV(TAG, "on_update_command_request: %s", msg.dump().c_str()); +#endif + this->on_update_command_request(msg); #endif break; } @@ -1434,6 +1463,19 @@ void APIServerConnection::on_date_time_command_request(const DateTimeCommandRequ this->datetime_command(msg); } #endif +#ifdef USE_UPDATE +void APIServerConnection::on_update_command_request(const UpdateCommandRequest &msg) { + if (!this->is_connection_setup()) { + this->on_no_setup_connection(); + return; + } + if (!this->is_authenticated()) { + this->on_unauthenticated_access(); + return; + } + this->update_command(msg); +} +#endif #ifdef USE_BLUETOOTH_PROXY void APIServerConnection::on_subscribe_bluetooth_le_advertisements_request( const SubscribeBluetoothLEAdvertisementsRequest &msg) { diff --git a/esphome/components/api/api_pb2_service.h b/esphome/components/api/api_pb2_service.h index 2f8a2b3def..83bfc2ed98 100644 --- a/esphome/components/api/api_pb2_service.h +++ b/esphome/components/api/api_pb2_service.h @@ -306,6 +306,15 @@ class APIServerConnectionBase : public ProtoService { #endif #ifdef USE_DATETIME_DATETIME virtual void on_date_time_command_request(const DateTimeCommandRequest &value){}; +#endif +#ifdef USE_UPDATE + bool send_list_entities_update_response(const ListEntitiesUpdateResponse &msg); +#endif +#ifdef USE_UPDATE + bool send_update_state_response(const UpdateStateResponse &msg); +#endif +#ifdef USE_UPDATE + virtual void on_update_command_request(const UpdateCommandRequest &value){}; #endif protected: bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) override; @@ -373,6 +382,9 @@ class APIServerConnection : public APIServerConnectionBase { #ifdef USE_DATETIME_DATETIME virtual void datetime_command(const DateTimeCommandRequest &msg) = 0; #endif +#ifdef USE_UPDATE + virtual void update_command(const UpdateCommandRequest &msg) = 0; +#endif #ifdef USE_BLUETOOTH_PROXY virtual void subscribe_bluetooth_le_advertisements(const SubscribeBluetoothLEAdvertisementsRequest &msg) = 0; #endif @@ -471,6 +483,9 @@ class APIServerConnection : public APIServerConnectionBase { #ifdef USE_DATETIME_DATETIME void on_date_time_command_request(const DateTimeCommandRequest &msg) override; #endif +#ifdef USE_UPDATE + void on_update_command_request(const UpdateCommandRequest &msg) override; +#endif #ifdef USE_BLUETOOTH_PROXY void on_subscribe_bluetooth_le_advertisements_request(const SubscribeBluetoothLEAdvertisementsRequest &msg) override; #endif diff --git a/esphome/components/api/api_server.cpp b/esphome/components/api/api_server.cpp index 0725547771..a61ae89243 100644 --- a/esphome/components/api/api_server.cpp +++ b/esphome/components/api/api_server.cpp @@ -334,6 +334,13 @@ void APIServer::on_event(event::Event *obj, const std::string &event_type) { } #endif +#ifdef USE_UPDATE +void APIServer::on_update(update::UpdateEntity *obj) { + for (auto &c : this->clients_) + c->send_update_state(obj); +} +#endif + float APIServer::get_setup_priority() const { return setup_priority::AFTER_WIFI; } void APIServer::set_port(uint16_t port) { this->port_ = port; } APIServer *global_api_server = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/components/api/api_server.h b/esphome/components/api/api_server.h index 2e1fbdf67c..43bc8a7348 100644 --- a/esphome/components/api/api_server.h +++ b/esphome/components/api/api_server.h @@ -102,6 +102,9 @@ class APIServer : public Component, public Controller { #ifdef USE_EVENT void on_event(event::Event *obj, const std::string &event_type) override; #endif +#ifdef USE_UPDATE + void on_update(update::UpdateEntity *obj) override; +#endif bool is_connected() const; diff --git a/esphome/components/api/list_entities.cpp b/esphome/components/api/list_entities.cpp index a7dbf9a6e7..5fa360d170 100644 --- a/esphome/components/api/list_entities.cpp +++ b/esphome/components/api/list_entities.cpp @@ -98,6 +98,9 @@ bool ListEntitiesIterator::on_alarm_control_panel(alarm_control_panel::AlarmCont #ifdef USE_EVENT bool ListEntitiesIterator::on_event(event::Event *event) { return this->client_->send_event_info(event); } #endif +#ifdef USE_UPDATE +bool ListEntitiesIterator::on_update(update::UpdateEntity *update) { return this->client_->send_update_info(update); } +#endif } // namespace api } // namespace esphome diff --git a/esphome/components/api/list_entities.h b/esphome/components/api/list_entities.h index c1fd8b82c4..a37586de0f 100644 --- a/esphome/components/api/list_entities.h +++ b/esphome/components/api/list_entities.h @@ -75,6 +75,9 @@ class ListEntitiesIterator : public ComponentIterator { #endif #ifdef USE_EVENT bool on_event(event::Event *event) override; +#endif +#ifdef USE_UPDATE + bool on_update(update::UpdateEntity *update) override; #endif bool on_end() override; diff --git a/esphome/components/api/subscribe_state.cpp b/esphome/components/api/subscribe_state.cpp index 005ab0e6da..5861b1f465 100644 --- a/esphome/components/api/subscribe_state.cpp +++ b/esphome/components/api/subscribe_state.cpp @@ -77,6 +77,9 @@ bool InitialStateIterator::on_alarm_control_panel(alarm_control_panel::AlarmCont return this->client_->send_alarm_control_panel_state(a_alarm_control_panel); } #endif +#ifdef USE_UPDATE +bool InitialStateIterator::on_update(update::UpdateEntity *update) { return this->client_->send_update_state(update); } +#endif InitialStateIterator::InitialStateIterator(APIConnection *client) : client_(client) {} } // namespace api diff --git a/esphome/components/api/subscribe_state.h b/esphome/components/api/subscribe_state.h index 8c725e422e..67c4346210 100644 --- a/esphome/components/api/subscribe_state.h +++ b/esphome/components/api/subscribe_state.h @@ -72,6 +72,9 @@ class InitialStateIterator : public ComponentIterator { #endif #ifdef USE_EVENT bool on_event(event::Event *event) override { return true; }; +#endif +#ifdef USE_UPDATE + bool on_update(update::UpdateEntity *update) override; #endif protected: APIConnection *client_; diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index a41f552baf..dcc783ea47 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -15,6 +15,8 @@ namespace esphome { namespace http_request { +static const char *const TAG = "http_request.ota"; + void OtaHttpRequestComponent::setup() { #ifdef USE_OTA_STATE_CALLBACK ota::register_ota_platform(this); diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h index 91c7085517..6a86b4ab43 100644 --- a/esphome/components/http_request/ota/ota_http_request.h +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -14,7 +14,6 @@ namespace esphome { namespace http_request { -static const char *const TAG = "http_request.ota"; static const uint8_t MD5_SIZE = 32; enum OtaHttpRequestError : uint8_t { diff --git a/esphome/components/http_request/update/__init__.py b/esphome/components/http_request/update/__init__.py new file mode 100644 index 0000000000..356afa1432 --- /dev/null +++ b/esphome/components/http_request/update/__init__.py @@ -0,0 +1,44 @@ +import esphome.config_validation as cv +import esphome.codegen as cg + +from esphome.components import update +from esphome.const import ( + CONF_SOURCE, +) + +from .. import http_request_ns, CONF_HTTP_REQUEST_ID, HttpRequestComponent +from ..ota import OtaHttpRequestComponent + + +AUTO_LOAD = ["json"] +CODEOWNERS = ["@jesserockz"] +DEPENDENCIES = ["ota.http_request"] + +HttpRequestUpdate = http_request_ns.class_( + "HttpRequestUpdate", update.UpdateEntity, cg.PollingComponent +) + +CONF_OTA_ID = "ota_id" + +CONFIG_SCHEMA = update.UPDATE_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(HttpRequestUpdate), + cv.GenerateID(CONF_OTA_ID): cv.use_id(OtaHttpRequestComponent), + cv.GenerateID(CONF_HTTP_REQUEST_ID): cv.use_id(HttpRequestComponent), + cv.Required(CONF_SOURCE): cv.url, + } +).extend(cv.polling_component_schema("6h")) + + +async def to_code(config): + var = await update.new_update(config) + ota_parent = await cg.get_variable(config[CONF_OTA_ID]) + cg.add(var.set_ota_parent(ota_parent)) + request_parent = await cg.get_variable(config[CONF_HTTP_REQUEST_ID]) + cg.add(var.set_request_parent(request_parent)) + + cg.add(var.set_source_url(config[CONF_SOURCE])) + + cg.add_define("USE_OTA_STATE_CALLBACK") + + await cg.register_component(var, config) diff --git a/esphome/components/http_request/update/http_request_update.cpp b/esphome/components/http_request/update/http_request_update.cpp new file mode 100644 index 0000000000..98129e59dc --- /dev/null +++ b/esphome/components/http_request/update/http_request_update.cpp @@ -0,0 +1,157 @@ +#include "http_request_update.h" + +#include "esphome/core/application.h" +#include "esphome/core/version.h" + +#include "esphome/components/json/json_util.h" +#include "esphome/components/network/util.h" + +namespace esphome { +namespace http_request { + +static const char *const TAG = "http_request.update"; + +static const size_t MAX_READ_SIZE = 256; + +void HttpRequestUpdate::setup() { + this->ota_parent_->add_on_state_callback([this](ota::OTAState state, float progress, uint8_t err) { + if (state == ota::OTAState::OTA_IN_PROGRESS) { + this->state_ = update::UPDATE_STATE_INSTALLING; + this->update_info_.has_progress = true; + this->update_info_.progress = progress; + this->publish_state(); + } else if (state == ota::OTAState::OTA_ABORT || state == ota::OTAState::OTA_ERROR) { + this->state_ = update::UPDATE_STATE_AVAILABLE; + this->status_set_error("Failed to install firmware"); + this->publish_state(); + } + }); +} + +void HttpRequestUpdate::update() { + auto container = this->request_parent_->get(this->source_url_); + + if (container == nullptr) { + std::string msg = str_sprintf("Failed to fetch manifest from %s", this->source_url_.c_str()); + this->status_set_error(msg.c_str()); + return; + } + + ExternalRAMAllocator allocator(ExternalRAMAllocator::ALLOW_FAILURE); + uint8_t *data = allocator.allocate(container->content_length); + if (data == nullptr) { + std::string msg = str_sprintf("Failed to allocate %d bytes for manifest", container->content_length); + this->status_set_error(msg.c_str()); + container->end(); + return; + } + + size_t read_index = 0; + while (container->get_bytes_read() < container->content_length) { + int read_bytes = container->read(data + read_index, MAX_READ_SIZE); + + App.feed_wdt(); + yield(); + + read_index += read_bytes; + } + + std::string response((char *) data, read_index); + allocator.deallocate(data, container->content_length); + + container->end(); + + bool valid = json::parse_json(response, [this](JsonObject root) -> bool { + if (!root.containsKey("name") || !root.containsKey("version") || !root.containsKey("builds")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + this->update_info_.title = root["name"].as(); + this->update_info_.latest_version = root["version"].as(); + + for (auto build : root["builds"].as()) { + if (!build.containsKey("chipFamily")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + if (build["chipFamily"] == ESPHOME_VARIANT) { + if (!build.containsKey("ota")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + auto ota = build["ota"]; + if (!ota.containsKey("path") || !ota.containsKey("md5")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + this->update_info_.firmware_url = ota["path"].as(); + this->update_info_.md5 = ota["md5"].as(); + + if (ota.containsKey("summary")) + this->update_info_.summary = ota["summary"].as(); + if (ota.containsKey("release_url")) + this->update_info_.release_url = ota["release_url"].as(); + + return true; + } + } + return false; + }); + + if (!valid) { + std::string msg = str_sprintf("Failed to parse JSON from %s", this->source_url_.c_str()); + this->status_set_error(msg.c_str()); + return; + } + + // Merge source_url_ and this->update_info_.firmware_url + if (this->update_info_.firmware_url.find("http") == std::string::npos) { + std::string path = this->update_info_.firmware_url; + if (path[0] == '/') { + std::string domain = this->source_url_.substr(0, this->source_url_.find('/', 8)); + this->update_info_.firmware_url = domain + path; + } else { + std::string domain = this->source_url_.substr(0, this->source_url_.rfind('/') + 1); + this->update_info_.firmware_url = domain + path; + } + } + + std::string current_version = this->current_version_; + if (current_version.empty()) { +#ifdef ESPHOME_PROJECT_VERSION + current_version = ESPHOME_PROJECT_VERSION; +#else + current_version = ESPHOME_VERSION; +#endif + } + this->update_info_.current_version = current_version; + + if (this->update_info_.latest_version.empty()) { + this->state_ = update::UPDATE_STATE_NO_UPDATE; + } else if (this->update_info_.latest_version != this->current_version_) { + this->state_ = update::UPDATE_STATE_AVAILABLE; + } + + this->update_info_.has_progress = false; + this->update_info_.progress = 0.0f; + + this->status_clear_error(); + this->publish_state(); +} + +void HttpRequestUpdate::perform() { + if (this->state_ != update::UPDATE_STATE_AVAILABLE) { + return; + } + + this->state_ = update::UPDATE_STATE_INSTALLING; + this->publish_state(); + + this->ota_parent_->set_md5(this->update_info.md5); + this->ota_parent_->set_url(this->update_info.firmware_url); + // Flash in the next loop + this->defer([this]() { this->ota_parent_->flash(); }); +} + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/http_request/update/http_request_update.h b/esphome/components/http_request/update/http_request_update.h new file mode 100644 index 0000000000..1337822ecc --- /dev/null +++ b/esphome/components/http_request/update/http_request_update.h @@ -0,0 +1,37 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/helpers.h" + +#include "esphome/components/http_request/http_request.h" +#include "esphome/components/http_request/ota/ota_http_request.h" +#include "esphome/components/update/update_entity.h" + +namespace esphome { +namespace http_request { + +class HttpRequestUpdate : public update::UpdateEntity, public PollingComponent { + public: + void setup() override; + void update() override; + + void perform() override; + + void set_source_url(const std::string &source_url) { this->source_url_ = source_url; } + + void set_request_parent(HttpRequestComponent *request_parent) { this->request_parent_ = request_parent; } + void set_ota_parent(OtaHttpRequestComponent *ota_parent) { this->ota_parent_ = ota_parent; } + + void set_current_version(const std::string ¤t_version) { this->current_version_ = current_version; } + + float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } + + protected: + HttpRequestComponent *request_parent_; + OtaHttpRequestComponent *ota_parent_; + std::string source_url_; + std::string current_version_{""}; +}; + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py index 31cbb2cf97..96a02cb60e 100644 --- a/esphome/components/mqtt/__init__.py +++ b/esphome/components/mqtt/__init__.py @@ -126,6 +126,7 @@ MQTTSelectComponent = mqtt_ns.class_("MQTTSelectComponent", MQTTComponent) MQTTButtonComponent = mqtt_ns.class_("MQTTButtonComponent", MQTTComponent) MQTTLockComponent = mqtt_ns.class_("MQTTLockComponent", MQTTComponent) MQTTEventComponent = mqtt_ns.class_("MQTTEventComponent", MQTTComponent) +MQTTUpdateComponent = mqtt_ns.class_("MQTTUpdateComponent", MQTTComponent) MQTTValveComponent = mqtt_ns.class_("MQTTValveComponent", MQTTComponent) MQTTDiscoveryUniqueIdGenerator = mqtt_ns.enum("MQTTDiscoveryUniqueIdGenerator") diff --git a/esphome/components/mqtt/mqtt_const.h b/esphome/components/mqtt/mqtt_const.h index 66872680bb..0e063c66d2 100644 --- a/esphome/components/mqtt/mqtt_const.h +++ b/esphome/components/mqtt/mqtt_const.h @@ -137,6 +137,7 @@ constexpr const char *const MQTT_PAYLOAD_CLOSE = "pl_cls"; constexpr const char *const MQTT_PAYLOAD_DISARM = "pl_disarm"; constexpr const char *const MQTT_PAYLOAD_HIGH_SPEED = "pl_hi_spd"; constexpr const char *const MQTT_PAYLOAD_HOME = "pl_home"; +constexpr const char *const MQTT_PAYLOAD_INSTALL = "pl_inst"; constexpr const char *const MQTT_PAYLOAD_LOCATE = "pl_loc"; constexpr const char *const MQTT_PAYLOAD_LOCK = "pl_lock"; constexpr const char *const MQTT_PAYLOAD_LOW_SPEED = "pl_lo_spd"; @@ -396,6 +397,7 @@ constexpr const char *const MQTT_PAYLOAD_CLOSE = "payload_close"; constexpr const char *const MQTT_PAYLOAD_DISARM = "payload_disarm"; constexpr const char *const MQTT_PAYLOAD_HIGH_SPEED = "payload_high_speed"; constexpr const char *const MQTT_PAYLOAD_HOME = "payload_home"; +constexpr const char *const MQTT_PAYLOAD_INSTALL = "payload_install"; constexpr const char *const MQTT_PAYLOAD_LOCATE = "payload_locate"; constexpr const char *const MQTT_PAYLOAD_LOCK = "payload_lock"; constexpr const char *const MQTT_PAYLOAD_LOW_SPEED = "payload_low_speed"; diff --git a/esphome/components/mqtt/mqtt_update.cpp b/esphome/components/mqtt/mqtt_update.cpp new file mode 100644 index 0000000000..2ed8faf074 --- /dev/null +++ b/esphome/components/mqtt/mqtt_update.cpp @@ -0,0 +1,62 @@ +#include "mqtt_update.h" +#include "esphome/core/log.h" + +#include "mqtt_const.h" + +#ifdef USE_MQTT +#ifdef USE_UPDATE + +namespace esphome { +namespace mqtt { + +static const char *const TAG = "mqtt.update"; + +using namespace esphome::update; + +MQTTUpdateComponent::MQTTUpdateComponent(UpdateEntity *update) : update_(update) {} + +void MQTTUpdateComponent::setup() { + this->subscribe(this->get_command_topic_(), [this](const std::string &topic, const std::string &payload) { + if (payload == "INSTALL") { + this->update_->perform(); + } else { + ESP_LOGW(TAG, "'%s': Received unknown update payload: %s", this->friendly_name().c_str(), payload.c_str()); + this->status_momentary_warning("state", 5000); + } + }); + + this->update_->add_on_state_callback([this]() { this->defer("send", [this]() { this->publish_state(); }); }); +} + +bool MQTTUpdateComponent::publish_state() { + return this->publish_json(this->get_state_topic_(), [this](JsonObject root) { + root["installed_version"] = this->update_->update_info.current_version; + root["latest_version"] = this->update_->update_info.latest_version; + root["title"] = this->update_->update_info.title; + if (!this->update_->update_info.summary.empty()) + root["release_summary"] = this->update_->update_info.summary; + if (!this->update_->update_info.release_url.empty()) + root["release_url"] = this->update_->update_info.release_url; + }); +} + +void MQTTUpdateComponent::send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) { + root["schema"] = "json"; + root[MQTT_PAYLOAD_INSTALL] = "INSTALL"; +} + +bool MQTTUpdateComponent::send_initial_state() { return this->publish_state(); } + +void MQTTUpdateComponent::dump_config() { + ESP_LOGCONFIG(TAG, "MQTT Update '%s': ", this->update_->get_name().c_str()); + LOG_MQTT_COMPONENT(true, true); +} + +std::string MQTTUpdateComponent::component_type() const { return "update"; } +const EntityBase *MQTTUpdateComponent::get_entity() const { return this->update_; } + +} // namespace mqtt +} // namespace esphome + +#endif // USE_UPDATE +#endif // USE_MQTT diff --git a/esphome/components/mqtt/mqtt_update.h b/esphome/components/mqtt/mqtt_update.h new file mode 100644 index 0000000000..6fe04c4ea7 --- /dev/null +++ b/esphome/components/mqtt/mqtt_update.h @@ -0,0 +1,41 @@ +#pragma once + +#include "esphome/core/defines.h" + +#ifdef USE_MQTT +#ifdef USE_UPDATE + +#include "esphome/components/update/update_entity.h" +#include "mqtt_component.h" + +namespace esphome { +namespace mqtt { + +class MQTTUpdateComponent : public mqtt::MQTTComponent { + public: + explicit MQTTUpdateComponent(update::UpdateEntity *update); + + // ========== INTERNAL METHODS ========== + // (In most use cases you won't need these) + void setup() override; + void dump_config() override; + + void send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) override; + + bool send_initial_state() override; + + bool publish_state(); + + protected: + /// "update" component type. + std::string component_type() const override; + const EntityBase *get_entity() const override; + + update::UpdateEntity *update_; +}; + +} // namespace mqtt +} // namespace esphome + +#endif // USE_UPDATE +#endif // USE_MQTT diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py new file mode 100644 index 0000000000..ae3d5062ab --- /dev/null +++ b/esphome/components/update/__init__.py @@ -0,0 +1,108 @@ +from esphome import automation +from esphome.components import mqtt, web_server +import esphome.config_validation as cv +import esphome.codegen as cg +from esphome.const import ( + CONF_DEVICE_CLASS, + CONF_ID, + CONF_MQTT_ID, + CONF_WEB_SERVER_ID, + DEVICE_CLASS_FIRMWARE, +) +from esphome.core import CORE, coroutine_with_priority +from esphome.cpp_helpers import setup_entity + +CODEOWNERS = ["@jesserockz"] +IS_PLATFORM_COMPONENT = True + +update_ns = cg.esphome_ns.namespace("update") +UpdateEntity = update_ns.class_("UpdateEntity", cg.EntityBase) + +UpdateInfo = update_ns.struct("UpdateInfo") + +PerformAction = update_ns.class_("PerformAction", automation.Action) +IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) + +DEVICE_CLASSES = [ + DEVICE_CLASS_FIRMWARE, +] + +CONF_ON_UPDATE_AVAILABLE = "on_update_available" + +UPDATE_SCHEMA = ( + cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) + .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) + .extend( + { + cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTUpdateComponent), + cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True), + cv.Optional(CONF_ON_UPDATE_AVAILABLE): automation.validate_automation( + single=True + ), + } + ) +) + + +async def setup_update_core_(var, config): + await setup_entity(var, config) + + if device_class_config := config.get(CONF_DEVICE_CLASS): + cg.add(var.set_device_class(device_class_config)) + + if on_update_available := config.get(CONF_ON_UPDATE_AVAILABLE): + await automation.build_automation( + var.get_update_available_trigger(), + [(UpdateInfo.operator("ref").operator("const"), "x")], + on_update_available, + ) + + if mqtt_id_config := config.get(CONF_MQTT_ID): + mqtt_ = cg.new_Pvariable(mqtt_id_config, var) + await mqtt.register_mqtt_component(mqtt_, config) + + if web_server_id_config := config.get(CONF_WEB_SERVER_ID): + web_server_ = cg.get_variable(web_server_id_config) + web_server.add_entity_to_sorting_list(web_server_, var, config) + + +async def register_update(var, config): + if not CORE.has_id(config[CONF_ID]): + var = cg.Pvariable(config[CONF_ID], var) + cg.add(cg.App.register_update(var)) + await setup_update_core_(var, config) + + +async def new_update(config): + var = cg.new_Pvariable(config[CONF_ID]) + await register_update(var, config) + return var + + +@coroutine_with_priority(100.0) +async def to_code(config): + cg.add_define("USE_UPDATE") + cg.add_global(update_ns.using) + + +UPDATE_AUTOMATION_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.use_id(UpdateEntity), + } +) + + +@automation.register_action("update.perform", PerformAction, UPDATE_AUTOMATION_SCHEMA) +async def update_perform_action_to_code(config, action_id, template_arg, args): + paren = await cg.get_variable(config[CONF_ID]) + return cg.new_Pvariable(action_id, paren, paren) + + +@automation.register_condition( + "update.is_available", IsAvailableCondition, UPDATE_AUTOMATION_SCHEMA +) +async def update_is_available_condition_to_code( + config, condition_id, template_arg, args +): + paren = await cg.get_variable(config[CONF_ID]) + return cg.new_Pvariable(condition_id, paren, paren) diff --git a/esphome/components/update/update_entity.cpp b/esphome/components/update/update_entity.cpp new file mode 100644 index 0000000000..501cb6635f --- /dev/null +++ b/esphome/components/update/update_entity.cpp @@ -0,0 +1,12 @@ +#include "update_entity.h" + +namespace esphome { +namespace update { + +void UpdateEntity::publish_state() { + this->has_state_ = true; + this->state_callback_.call(); +} + +} // namespace update +} // namespace esphome diff --git a/esphome/components/update/update_entity.h b/esphome/components/update/update_entity.h new file mode 100644 index 0000000000..5984c8e35b --- /dev/null +++ b/esphome/components/update/update_entity.h @@ -0,0 +1,51 @@ +#pragma once + +#include "esphome/core/automation.h" +#include "esphome/core/component.h" +#include "esphome/core/entity_base.h" + +namespace esphome { +namespace update { + +struct UpdateInfo { + std::string latest_version; + std::string current_version; + std::string title; + std::string summary; + std::string release_url; + std::string firmware_url; + std::string md5; + bool has_progress{false}; + float progress; +}; + +enum UpdateState : uint8_t { + UPDATE_STATE_UNKNOWN, + UPDATE_STATE_NO_UPDATE, + UPDATE_STATE_AVAILABLE, + UPDATE_STATE_INSTALLING, +}; + +class UpdateEntity : public EntityBase, public EntityBase_DeviceClass { + public: + bool has_state() const { return this->has_state_; } + + void publish_state(); + + virtual void perform() = 0; + + const UpdateInfo &update_info = update_info_; + const UpdateState &state = state_; + + void add_on_state_callback(std::function &&callback) { this->state_callback_.add(std::move(callback)); } + + protected: + UpdateState state_{UPDATE_STATE_UNKNOWN}; + UpdateInfo update_info_; + bool has_state_{false}; + + CallbackManager state_callback_{}; +}; + +} // namespace update +} // namespace esphome diff --git a/esphome/components/web_server/list_entities.cpp b/esphome/components/web_server/list_entities.cpp index 42af72e872..332f358352 100644 --- a/esphome/components/web_server/list_entities.cpp +++ b/esphome/components/web_server/list_entities.cpp @@ -177,5 +177,14 @@ bool ListEntitiesIterator::on_event(event::Event *event) { } #endif +#ifdef USE_UPDATE +bool ListEntitiesIterator::on_update(update::UpdateEntity *update) { + if (this->web_server_->events_.count() == 0) + return true; + this->web_server_->events_.send(this->web_server_->update_json(update, DETAIL_ALL).c_str(), "state"); + return true; +} +#endif + } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/list_entities.h b/esphome/components/web_server/list_entities.h index 47d427d9b5..5ff6ec0412 100644 --- a/esphome/components/web_server/list_entities.h +++ b/esphome/components/web_server/list_entities.h @@ -68,6 +68,9 @@ class ListEntitiesIterator : public ComponentIterator { #ifdef USE_EVENT bool on_event(event::Event *event) override; #endif +#ifdef USE_UPDATE + bool on_update(update::UpdateEntity *update) override; +#endif protected: WebServer *web_server_; diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 5bb36f9600..9a1641e86f 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -1501,6 +1501,65 @@ std::string WebServer::event_json(event::Event *obj, const std::string &event_ty } #endif +#ifdef USE_UPDATE +void WebServer::on_update(update::UpdateEntity *obj) { + if (this->events_.count() == 0) + return; + this->events_.send(this->update_json(obj, DETAIL_STATE).c_str(), "state"); +} +void WebServer::handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match) { + for (update::UpdateEntity *obj : App.get_updates()) { + if (obj->get_object_id() != match.id) + continue; + + if (request->method() == HTTP_GET && match.method.empty()) { + std::string data = this->update_json(obj, DETAIL_STATE); + request->send(200, "application/json", data.c_str()); + return; + } + + if (match.method != "install") { + request->send(404); + return; + } + + this->schedule_([obj]() mutable { obj->perform(); }); + request->send(200); + return; + } + request->send(404); +} +std::string WebServer::update_json(update::UpdateEntity *obj, JsonDetail start_config) { + return json::build_json([this, obj, start_config](JsonObject root) { + set_json_id(root, obj, "update-" + obj->get_object_id(), start_config); + root["value"] = obj->update_info.latest_version; + switch (obj->state) { + case update::UPDATE_STATE_NO_UPDATE: + root["state"] = "NO UPDATE"; + break; + case update::UPDATE_STATE_AVAILABLE: + root["state"] = "UPDATE AVAILABLE"; + break; + case update::UPDATE_STATE_INSTALLING: + root["state"] = "INSTALLING"; + break; + default: + root["state"] = "UNKNOWN"; + break; + } + if (start_config == DETAIL_ALL) { + root["current_version"] = obj->update_info.current_version; + root["title"] = obj->update_info.title; + root["summary"] = obj->update_info.summary; + root["release_url"] = obj->update_info.release_url; + if (this->sorting_entitys_.find(obj) != this->sorting_entitys_.end()) { + root["sorting_weight"] = this->sorting_entitys_[obj].weight; + } + } + }); +} +#endif + bool WebServer::canHandle(AsyncWebServerRequest *request) { if (request->url() == "/") return true; @@ -1620,6 +1679,11 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) { return true; #endif +#ifdef USE_UPDATE + if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "update") + return true; +#endif + return false; } void WebServer::handleRequest(AsyncWebServerRequest *request) { @@ -1777,6 +1841,13 @@ void WebServer::handleRequest(AsyncWebServerRequest *request) { return; } #endif + +#ifdef USE_UPDATE + if (match.domain == "update") { + this->handle_update_request(request, match); + return; + } +#endif } bool WebServer::isRequestHandlerTrivial() { return false; } diff --git a/esphome/components/web_server/web_server.h b/esphome/components/web_server/web_server.h index 0fb40e2c33..5b98806af1 100644 --- a/esphome/components/web_server/web_server.h +++ b/esphome/components/web_server/web_server.h @@ -7,8 +7,8 @@ #include "esphome/core/controller.h" #include "esphome/core/entity_base.h" -#include #include +#include #ifdef USE_ESP32 #include #include @@ -319,6 +319,16 @@ class WebServer : public Controller, public Component, public AsyncWebHandler { std::string event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config); #endif +#ifdef USE_UPDATE + void on_update(update::UpdateEntity *obj) override; + + /// Handle a update request under '/update/'. + void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match); + + /// Dump the update state with its value as a JSON string. + std::string update_json(update::UpdateEntity *obj, JsonDetail start_config); +#endif + /// Override the web handler's canHandle method. bool canHandle(AsyncWebServerRequest *request) override; /// Override the web handler's handleRequest method. diff --git a/esphome/const.py b/esphome/const.py index dcb353ab1c..cbd932e3cc 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1083,6 +1083,7 @@ DEVICE_CLASS_DURATION = "duration" DEVICE_CLASS_EMPTY = "" DEVICE_CLASS_ENERGY = "energy" DEVICE_CLASS_ENERGY_STORAGE = "energy_storage" +DEVICE_CLASS_FIRMWARE = "firmware" DEVICE_CLASS_FREQUENCY = "frequency" DEVICE_CLASS_GARAGE = "garage" DEVICE_CLASS_GARAGE_DOOR = "garage_door" diff --git a/esphome/core/application.h b/esphome/core/application.h index c4c745b687..2697357456 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -69,6 +69,9 @@ #ifdef USE_EVENT #include "esphome/components/event/event.h" #endif +#ifdef USE_UPDATE +#include "esphome/components/update/update_entity.h" +#endif namespace esphome { @@ -178,6 +181,10 @@ class Application { void register_event(event::Event *event) { this->events_.push_back(event); } #endif +#ifdef USE_UPDATE + void register_update(update::UpdateEntity *update) { this->updates_.push_back(update); } +#endif + /// Register the component in this Application instance. template C *register_component(C *c) { static_assert(std::is_base_of::value, "Only Component subclasses can be registered"); @@ -421,6 +428,16 @@ class Application { } #endif +#ifdef USE_UPDATE + const std::vector &get_updates() { return this->updates_; } + update::UpdateEntity *get_update_by_key(uint32_t key, bool include_internal = false) { + for (auto *obj : this->updates_) + if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal())) + return obj; + return nullptr; + } +#endif + Scheduler scheduler; protected: @@ -495,6 +512,9 @@ class Application { #ifdef USE_ALARM_CONTROL_PANEL std::vector alarm_control_panels_{}; #endif +#ifdef USE_UPDATE + std::vector updates_{}; +#endif std::string name_; std::string friendly_name_; diff --git a/esphome/core/component_iterator.cpp b/esphome/core/component_iterator.cpp index 9b02bf527b..da593340c1 100644 --- a/esphome/core/component_iterator.cpp +++ b/esphome/core/component_iterator.cpp @@ -351,6 +351,21 @@ void ComponentIterator::advance() { } } break; +#endif +#ifdef USE_UPDATE + case IteratorState::UPDATE: + if (this->at_ >= App.get_updates().size()) { + advance_platform = true; + } else { + auto *update = App.get_updates()[this->at_]; + if (update->is_internal() && !this->include_internal_) { + success = true; + break; + } else { + success = this->on_update(update); + } + } + break; #endif case IteratorState::MAX: if (this->on_end()) { diff --git a/esphome/core/component_iterator.h b/esphome/core/component_iterator.h index 2b847bc088..9e187f6c57 100644 --- a/esphome/core/component_iterator.h +++ b/esphome/core/component_iterator.h @@ -86,6 +86,9 @@ class ComponentIterator { #endif #ifdef USE_EVENT virtual bool on_event(event::Event *event) = 0; +#endif +#ifdef USE_UPDATE + virtual bool on_update(update::UpdateEntity *update) = 0; #endif virtual bool on_end(); @@ -158,6 +161,9 @@ class ComponentIterator { #endif #ifdef USE_EVENT EVENT, +#endif +#ifdef USE_UPDATE + UPDATE, #endif MAX, } state_{IteratorState::NONE}; diff --git a/esphome/core/controller.cpp b/esphome/core/controller.cpp index 0957329500..d6d98a4316 100644 --- a/esphome/core/controller.cpp +++ b/esphome/core/controller.cpp @@ -121,6 +121,12 @@ void Controller::setup_controller(bool include_internal) { obj->add_on_event_callback([this, obj](const std::string &event_type) { this->on_event(obj, event_type); }); } #endif +#ifdef USE_UPDATE + for (auto *obj : App.get_updates()) { + if (include_internal || !obj->is_internal()) + obj->add_on_state_callback([this, obj]() { this->on_update(obj); }); + } +#endif } } // namespace esphome diff --git a/esphome/core/controller.h b/esphome/core/controller.h index e1bf93193a..39e0b2ba26 100644 --- a/esphome/core/controller.h +++ b/esphome/core/controller.h @@ -61,6 +61,9 @@ #ifdef USE_EVENT #include "esphome/components/event/event.h" #endif +#ifdef USE_UPDATE +#include "esphome/components/update/update_entity.h" +#endif namespace esphome { @@ -124,6 +127,9 @@ class Controller { #ifdef USE_EVENT virtual void on_event(event::Event *obj, const std::string &event_type){}; #endif +#ifdef USE_UPDATE + virtual void on_update(update::UpdateEntity *obj){}; +#endif }; } // namespace esphome diff --git a/esphome/core/defines.h b/esphome/core/defines.h index affcd78089..1e6f3517db 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -59,6 +59,7 @@ #define USE_TIME #define USE_TOUCHSCREEN #define USE_UART_DEBUGGER +#define USE_UPDATE #define USE_VALVE #define USE_WIFI #define USE_WIFI_AP diff --git a/tests/components/http_request/common.yaml b/tests/components/http_request/common.yaml index 2b6996c0b9..83b334ca2d 100644 --- a/tests/components/http_request/common.yaml +++ b/tests/components/http_request/common.yaml @@ -73,3 +73,9 @@ button: url: http://my.ha.net:8123/local/esphome/firmware.bin - logger.log: "This message should be not displayed (reboot)" + +update: + - platform: http_request + name: OTA Update + id: ota_update + source: http://my.ha.net:8123/local/esphome/manifest.json diff --git a/tests/components/mqtt/common-update.yaml b/tests/components/mqtt/common-update.yaml new file mode 100644 index 0000000000..25f57cfef2 --- /dev/null +++ b/tests/components/mqtt/common-update.yaml @@ -0,0 +1,13 @@ +substitutions: + verify_ssl: "true" + +http_request: + verify_ssl: ${verify_ssl} + +ota: + - platform: http_request + +update: + - platform: http_request + name: "OTA Update" + source: https://example.com/ota.json diff --git a/tests/components/mqtt/test.esp32-c3-idf.yaml b/tests/components/mqtt/test.esp32-c3-idf.yaml index 25cb37a0b4..d19609b55e 100644 --- a/tests/components/mqtt/test.esp32-c3-idf.yaml +++ b/tests/components/mqtt/test.esp32-c3-idf.yaml @@ -1,2 +1,3 @@ packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp32-c3.yaml b/tests/components/mqtt/test.esp32-c3.yaml index 25cb37a0b4..4c70fb37d9 100644 --- a/tests/components/mqtt/test.esp32-c3.yaml +++ b/tests/components/mqtt/test.esp32-c3.yaml @@ -1,2 +1,6 @@ +substitutions: + verify_ssl: "false" + packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp32-idf.yaml b/tests/components/mqtt/test.esp32-idf.yaml index 25cb37a0b4..d19609b55e 100644 --- a/tests/components/mqtt/test.esp32-idf.yaml +++ b/tests/components/mqtt/test.esp32-idf.yaml @@ -1,2 +1,3 @@ packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp32.yaml b/tests/components/mqtt/test.esp32.yaml index 25cb37a0b4..4c70fb37d9 100644 --- a/tests/components/mqtt/test.esp32.yaml +++ b/tests/components/mqtt/test.esp32.yaml @@ -1,2 +1,6 @@ +substitutions: + verify_ssl: "false" + packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp8266.yaml b/tests/components/mqtt/test.esp8266.yaml index 25cb37a0b4..4c70fb37d9 100644 --- a/tests/components/mqtt/test.esp8266.yaml +++ b/tests/components/mqtt/test.esp8266.yaml @@ -1,2 +1,6 @@ +substitutions: + verify_ssl: "false" + packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/update/common.yaml b/tests/components/update/common.yaml new file mode 100644 index 0000000000..91b8669505 --- /dev/null +++ b/tests/components/update/common.yaml @@ -0,0 +1 @@ +update: diff --git a/tests/components/update/test.esp32-ard.yaml b/tests/components/update/test.esp32-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/update/test.esp32-idf.yaml b/tests/components/update/test.esp32-idf.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/update/test.esp8266.yaml b/tests/components/update/test.esp8266.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.esp8266.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/update/test.rp2040.yaml b/tests/components/update/test.rp2040.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.rp2040.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From 1f8449ec0e56d7fe7f0cca999f7d87843403d76b Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 11 Jun 2024 15:38:26 -0700 Subject: [PATCH 017/151] [Dockerfile] Sync platformio version with requirements.txt (#6888) --- docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 36be700f55..fcb5a5e7ae 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -81,7 +81,8 @@ RUN \ fi; \ pip3 install \ --break-system-packages --no-cache-dir \ - platformio==6.1.13 \ + # Keep platformio version in sync with requirements.txt + platformio==6.1.15 \ # Change some platformio settings && platformio settings set enable_telemetry No \ && platformio settings set check_platformio_interval 1000000 \ From 3a97244b8346bc4e1ca5eebcdccbfbde10f66a32 Mon Sep 17 00:00:00 2001 From: Anton Sergunov Date: Wed, 12 Jun 2024 04:42:20 +0600 Subject: [PATCH 018/151] [Deep sleep] Compilation error with IDF >= 5.* (#6879) --- esphome/components/deep_sleep/deep_sleep_component.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/esphome/components/deep_sleep/deep_sleep_component.h b/esphome/components/deep_sleep/deep_sleep_component.h index be56b529ba..7a640b9ea5 100644 --- a/esphome/components/deep_sleep/deep_sleep_component.h +++ b/esphome/components/deep_sleep/deep_sleep_component.h @@ -34,10 +34,12 @@ enum WakeupPinMode { WAKEUP_PIN_MODE_INVERT_WAKEUP, }; +#if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3) struct Ext1Wakeup { uint64_t mask; esp_sleep_ext1_wakeup_mode_t wakeup_mode; }; +#endif struct WakeupCauseToRunDuration { // Run duration if woken up by timer or any other reason besides those below. @@ -114,7 +116,11 @@ class DeepSleepComponent : public Component { #ifdef USE_ESP32 InternalGPIOPin *wakeup_pin_; WakeupPinMode wakeup_pin_mode_{WAKEUP_PIN_MODE_IGNORE}; + +#if !defined(USE_ESP32_VARIANT_ESP32C3) optional ext1_wakeup_; +#endif + optional touch_wakeup_; optional wakeup_cause_to_run_duration_; #endif From c723fd1f8077b1d113b1d166c6bd43c35bc648a8 Mon Sep 17 00:00:00 2001 From: Landon Rohatensky Date: Tue, 11 Jun 2024 15:56:27 -0700 Subject: [PATCH 019/151] [animation] Allow loading external url at build time (#6876) --- esphome/components/animation/__init__.py | 53 ++++++++++++++++++++++-- esphome/components/image/__init__.py | 6 +-- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/esphome/components/animation/__init__.py b/esphome/components/animation/__init__.py index a7a955bead..dbfc82c891 100644 --- a/esphome/components/animation/__init__.py +++ b/esphome/components/animation/__init__.py @@ -3,7 +3,13 @@ import logging from esphome import automation, core from esphome.components import font import esphome.components.image as espImage -from esphome.components.image import CONF_USE_TRANSPARENCY +from esphome.components.image import ( + CONF_USE_TRANSPARENCY, + LOCAL_SCHEMA, + WEB_SCHEMA, + SOURCE_WEB, + SOURCE_LOCAL, +) import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( @@ -13,6 +19,9 @@ from esphome.const import ( CONF_REPEAT, CONF_RESIZE, CONF_TYPE, + CONF_SOURCE, + CONF_PATH, + CONF_URL, ) from esphome.core import CORE, HexInt @@ -43,6 +52,40 @@ SetFrameAction = animation_ns.class_( "AnimationSetFrameAction", automation.Action, cg.Parented.template(Animation_) ) +TYPED_FILE_SCHEMA = cv.typed_schema( + { + SOURCE_LOCAL: LOCAL_SCHEMA, + SOURCE_WEB: WEB_SCHEMA, + }, + key=CONF_SOURCE, +) + + +def _file_schema(value): + if isinstance(value, str): + return validate_file_shorthand(value) + return TYPED_FILE_SCHEMA(value) + + +FILE_SCHEMA = cv.Schema(_file_schema) + + +def validate_file_shorthand(value): + value = cv.string_strict(value) + if value.startswith("http://") or value.startswith("https://"): + return FILE_SCHEMA( + { + CONF_SOURCE: SOURCE_WEB, + CONF_URL: value, + } + ) + return FILE_SCHEMA( + { + CONF_SOURCE: SOURCE_LOCAL, + CONF_PATH: value, + } + ) + def validate_cross_dependencies(config): """ @@ -67,7 +110,7 @@ ANIMATION_SCHEMA = cv.Schema( cv.All( { cv.Required(CONF_ID): cv.declare_id(Animation_), - cv.Required(CONF_FILE): cv.file_, + cv.Required(CONF_FILE): FILE_SCHEMA, cv.Optional(CONF_RESIZE): cv.dimensions, cv.Optional(CONF_TYPE, default="BINARY"): cv.enum( espImage.IMAGE_TYPE, upper=True @@ -124,7 +167,11 @@ async def animation_action_to_code(config, action_id, template_arg, args): async def to_code(config): from PIL import Image - path = CORE.relative_config_path(config[CONF_FILE]) + conf_file = config[CONF_FILE] + if conf_file[CONF_SOURCE] == SOURCE_LOCAL: + path = CORE.relative_config_path(conf_file[CONF_PATH]) + elif conf_file[CONF_SOURCE] == SOURCE_WEB: + path = espImage.compute_local_image_path(conf_file).as_posix() try: image = Image.open(path) except Exception as e: diff --git a/esphome/components/image/__init__.py b/esphome/components/image/__init__.py index 73dc73aa45..b23ed3445a 100644 --- a/esphome/components/image/__init__.py +++ b/esphome/components/image/__init__.py @@ -68,7 +68,7 @@ def _compute_local_icon_path(value: dict) -> Path: return base_dir / f"{value[CONF_ICON]}.svg" -def _compute_local_image_path(value: dict) -> Path: +def compute_local_image_path(value: dict) -> Path: url = value[CONF_URL] h = hashlib.new("sha256") h.update(url.encode()) @@ -117,7 +117,7 @@ def download_mdi(value): def download_image(value): url = value[CONF_URL] - path = _compute_local_image_path(value) + path = compute_local_image_path(value) download_content(url, path) @@ -295,7 +295,7 @@ async def to_code(config): path = _compute_local_icon_path(conf_file).as_posix() elif conf_file[CONF_SOURCE] == SOURCE_WEB: - path = _compute_local_image_path(conf_file).as_posix() + path = compute_local_image_path(conf_file).as_posix() try: with open(path, "rb") as f: From a64106e48c47098999b7a52a683765cc18224ddd Mon Sep 17 00:00:00 2001 From: Peter Ericson Date: Wed, 12 Jun 2024 01:51:04 +0200 Subject: [PATCH 020/151] [waveshare_epaper] Add support for 13.3in-k (#6443) --- .../components/waveshare_epaper/display.py | 4 + .../waveshare_epaper/waveshare_epaper.cpp | 83 +++++++++++++++++++ .../waveshare_epaper/waveshare_epaper.h | 24 ++++++ 3 files changed, 111 insertions(+) diff --git a/esphome/components/waveshare_epaper/display.py b/esphome/components/waveshare_epaper/display.py index 9ad948e915..4d3965449f 100644 --- a/esphome/components/waveshare_epaper/display.py +++ b/esphome/components/waveshare_epaper/display.py @@ -94,6 +94,9 @@ WaveshareEPaper2P13InV2 = waveshare_epaper_ns.class_( WaveshareEPaper2P13InV3 = waveshare_epaper_ns.class_( "WaveshareEPaper2P13InV3", WaveshareEPaper ) +WaveshareEPaper13P3InK = waveshare_epaper_ns.class_( + "WaveshareEPaper13P3InK", WaveshareEPaper +) GDEW0154M09 = waveshare_epaper_ns.class_("GDEW0154M09", WaveshareEPaper) WaveshareEPaperTypeAModel = waveshare_epaper_ns.enum("WaveshareEPaperTypeAModel") @@ -133,6 +136,7 @@ MODELS = { "2.13in-ttgo-dke": ("c", WaveshareEPaper2P13InDKE), "2.13inv3": ("c", WaveshareEPaper2P13InV3), "1.54in-m5coreink-m09": ("c", GDEW0154M09), + "13.3in-k": ("b", WaveshareEPaper13P3InK), } RESET_PIN_REQUIRED_MODELS = ("2.13inv2", "2.13in-ttgo-b74") diff --git a/esphome/components/waveshare_epaper/waveshare_epaper.cpp b/esphome/components/waveshare_epaper/waveshare_epaper.cpp index 5428f4ec80..24df428e6f 100644 --- a/esphome/components/waveshare_epaper/waveshare_epaper.cpp +++ b/esphome/components/waveshare_epaper/waveshare_epaper.cpp @@ -2963,5 +2963,88 @@ void WaveshareEPaper2P13InDKE::set_full_update_every(uint32_t full_update_every) this->full_update_every_ = full_update_every; } +// ======================================================== +// 13.3in (K version) +// Datasheet/Specification/Reference: +// - https://files.waveshare.com/wiki/13.3inch-e-Paper-HAT-(K)/13.3-inch-e-Paper-(K)-user-manual.pdf +// - https://github.com/waveshareteam/e-Paper/tree/master/Arduino/epd13in3k +// ======================================================== + +// using default wait_until_idle_() function +void WaveshareEPaper13P3InK::initialize() { + this->wait_until_idle_(); + this->command(0x12); // SWRESET + this->wait_until_idle_(); + + this->command(0x0c); // set soft start + this->data(0xae); + this->data(0xc7); + this->data(0xc3); + this->data(0xc0); + this->data(0x80); + + this->command(0x01); // driver output control + this->data((get_height_internal() - 1) % 256); // Y + this->data((get_height_internal() - 1) / 256); // Y + this->data(0x00); + + this->command(0x11); // data entry mode + this->data(0x03); + + // SET WINDOWS + // XRAM_START_AND_END_POSITION + this->command(0x44); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); + this->data((get_width_internal() - 1) & 0xFF); + this->data(((get_width_internal() - 1) >> 8) & 0x03); + // YRAM_START_AND_END_POSITION + this->command(0x45); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); + this->data((get_height_internal() - 1) & 0xFF); + this->data(((get_height_internal() - 1) >> 8) & 0x03); + + this->command(0x3C); // Border setting + this->data(0x01); + + this->command(0x18); // use the internal temperature sensor + this->data(0x80); + + // SET CURSOR + // XRAM_ADDRESS + this->command(0x4E); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); + // YRAM_ADDRESS + this->command(0x4F); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); +} +void HOT WaveshareEPaper13P3InK::display() { + // do single full update + this->command(0x24); + this->start_data_(); + this->write_array(this->buffer_, this->get_buffer_length_()); + this->end_data_(); + + // COMMAND DISPLAY REFRESH + this->command(0x22); + this->data(0xF7); + this->command(0x20); +} + +int WaveshareEPaper13P3InK::get_width_internal() { return 960; } +int WaveshareEPaper13P3InK::get_height_internal() { return 680; } +uint32_t WaveshareEPaper13P3InK::idle_timeout_() { return 10000; } +void WaveshareEPaper13P3InK::dump_config() { + LOG_DISPLAY("", "Waveshare E-Paper", this); + ESP_LOGCONFIG(TAG, " Model: 13.3inK"); + LOG_PIN(" Reset Pin: ", this->reset_pin_); + LOG_PIN(" DC Pin: ", this->dc_pin_); + LOG_PIN(" Busy Pin: ", this->busy_pin_); + LOG_UPDATE_INTERVAL(this); +} + } // namespace waveshare_epaper } // namespace esphome diff --git a/esphome/components/waveshare_epaper/waveshare_epaper.h b/esphome/components/waveshare_epaper/waveshare_epaper.h index 4a5844ae88..7572982a20 100644 --- a/esphome/components/waveshare_epaper/waveshare_epaper.h +++ b/esphome/components/waveshare_epaper/waveshare_epaper.h @@ -163,6 +163,7 @@ enum WaveshareEPaperTypeBModel { WAVESHARE_EPAPER_7_5_IN, WAVESHARE_EPAPER_7_5_INV2, WAVESHARE_EPAPER_7_5_IN_B_V2, + WAVESHARE_EPAPER_13_3_IN_K, }; class WaveshareEPaper2P7In : public WaveshareEPaper { @@ -769,5 +770,28 @@ class WaveshareEPaper2P13InV3 : public WaveshareEPaper { bool is_busy_{false}; void write_lut_(const uint8_t *lut); }; + +class WaveshareEPaper13P3InK : public WaveshareEPaper { + public: + void initialize() override; + + void display() override; + + void dump_config() override; + + void deep_sleep() override { + // COMMAND DEEP SLEEP + this->command(0x10); + this->data(0x01); + } + + protected: + int get_width_internal() override; + + int get_height_internal() override; + + uint32_t idle_timeout_() override; +}; + } // namespace waveshare_epaper } // namespace esphome From 562700bd2c4014d8caf224cdeb45ae3969dcc7a4 Mon Sep 17 00:00:00 2001 From: Daniel D'Abate Date: Wed, 12 Jun 2024 02:04:25 +0200 Subject: [PATCH 021/151] Climate IR LG - Support fan only mode and all "on" commands (#3712) --- .../climate_ir_lg/climate_ir_lg.cpp | 187 ++++++++++-------- .../components/climate_ir_lg/climate_ir_lg.h | 2 +- 2 files changed, 102 insertions(+), 87 deletions(-) diff --git a/esphome/components/climate_ir_lg/climate_ir_lg.cpp b/esphome/components/climate_ir_lg/climate_ir_lg.cpp index d2199c1cbe..c65f24ebc0 100644 --- a/esphome/components/climate_ir_lg/climate_ir_lg.cpp +++ b/esphome/components/climate_ir_lg/climate_ir_lg.cpp @@ -6,18 +6,24 @@ namespace climate_ir_lg { static const char *const TAG = "climate.climate_ir_lg"; -const uint32_t COMMAND_ON = 0x00000; -const uint32_t COMMAND_ON_AI = 0x03000; -const uint32_t COMMAND_COOL = 0x08000; -const uint32_t COMMAND_HEAT = 0x0C000; +// Commands +const uint32_t COMMAND_MASK = 0xFF000; const uint32_t COMMAND_OFF = 0xC0000; const uint32_t COMMAND_SWING = 0x10000; -// On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore. -const uint32_t COMMAND_AUTO = 0x0B000; -const uint32_t COMMAND_DRY_FAN = 0x09000; -const uint32_t COMMAND_MASK = 0xFF000; +const uint32_t COMMAND_ON_COOL = 0x00000; +const uint32_t COMMAND_ON_DRY = 0x01000; +const uint32_t COMMAND_ON_FAN_ONLY = 0x02000; +const uint32_t COMMAND_ON_AI = 0x03000; +const uint32_t COMMAND_ON_HEAT = 0x04000; +const uint32_t COMMAND_COOL = 0x08000; +const uint32_t COMMAND_DRY = 0x09000; +const uint32_t COMMAND_FAN_ONLY = 0x0A000; +const uint32_t COMMAND_AI = 0x0B000; +const uint32_t COMMAND_HEAT = 0x0C000; + +// Fan speed const uint32_t FAN_MASK = 0xF0; const uint32_t FAN_AUTO = 0x50; const uint32_t FAN_MIN = 0x00; @@ -35,69 +41,67 @@ void LgIrClimate::transmit_state() { uint32_t remote_state = 0x8800000; // ESP_LOGD(TAG, "climate_lg_ir mode_before_ code: 0x%02X", modeBefore_); + + // Set command if (send_swing_cmd_) { send_swing_cmd_ = false; remote_state |= COMMAND_SWING; } else { - if (mode_before_ == climate::CLIMATE_MODE_OFF && this->mode == climate::CLIMATE_MODE_HEAT_COOL) { - remote_state |= COMMAND_ON_AI; - } else if (mode_before_ == climate::CLIMATE_MODE_OFF && this->mode != climate::CLIMATE_MODE_OFF) { - remote_state |= COMMAND_ON; - this->mode = climate::CLIMATE_MODE_COOL; - } else { - switch (this->mode) { - case climate::CLIMATE_MODE_COOL: - remote_state |= COMMAND_COOL; - break; - case climate::CLIMATE_MODE_HEAT: - remote_state |= COMMAND_HEAT; - break; - case climate::CLIMATE_MODE_HEAT_COOL: - remote_state |= COMMAND_AUTO; - break; - case climate::CLIMATE_MODE_DRY: - remote_state |= COMMAND_DRY_FAN; - break; - case climate::CLIMATE_MODE_OFF: - default: - remote_state |= COMMAND_OFF; - break; - } - } - mode_before_ = this->mode; - - ESP_LOGD(TAG, "climate_lg_ir mode code: 0x%02X", this->mode); - - if (this->mode == climate::CLIMATE_MODE_OFF) { - remote_state |= FAN_AUTO; - } else if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_DRY || - this->mode == climate::CLIMATE_MODE_HEAT) { - switch (this->fan_mode.value()) { - case climate::CLIMATE_FAN_HIGH: - remote_state |= FAN_MAX; - break; - case climate::CLIMATE_FAN_MEDIUM: - remote_state |= FAN_MED; - break; - case climate::CLIMATE_FAN_LOW: - remote_state |= FAN_MIN; - break; - case climate::CLIMATE_FAN_AUTO: - default: - remote_state |= FAN_AUTO; - break; - } - } - - if (this->mode == climate::CLIMATE_MODE_HEAT_COOL) { - this->fan_mode = climate::CLIMATE_FAN_AUTO; - // remote_state |= FAN_MODE_AUTO_DRY; - } - if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) { - auto temp = (uint8_t) roundf(clamp(this->target_temperature, TEMP_MIN, TEMP_MAX)); - remote_state |= ((temp - 15) << TEMP_SHIFT); + bool climate_is_off = (mode_before_ == climate::CLIMATE_MODE_OFF); + switch (this->mode) { + case climate::CLIMATE_MODE_COOL: + remote_state |= climate_is_off ? COMMAND_ON_COOL : COMMAND_COOL; + break; + case climate::CLIMATE_MODE_DRY: + remote_state |= climate_is_off ? COMMAND_ON_DRY : COMMAND_DRY; + break; + case climate::CLIMATE_MODE_FAN_ONLY: + remote_state |= climate_is_off ? COMMAND_ON_FAN_ONLY : COMMAND_FAN_ONLY; + break; + case climate::CLIMATE_MODE_HEAT_COOL: + remote_state |= climate_is_off ? COMMAND_ON_AI : COMMAND_AI; + break; + case climate::CLIMATE_MODE_HEAT: + remote_state |= climate_is_off ? COMMAND_ON_HEAT : COMMAND_HEAT; + break; + case climate::CLIMATE_MODE_OFF: + default: + remote_state |= COMMAND_OFF; + break; } } + + mode_before_ = this->mode; + + ESP_LOGD(TAG, "climate_lg_ir mode code: 0x%02X", this->mode); + + // Set fan speed + if (this->mode == climate::CLIMATE_MODE_OFF) { + remote_state |= FAN_AUTO; + } else { + switch (this->fan_mode.value()) { + case climate::CLIMATE_FAN_HIGH: + remote_state |= FAN_MAX; + break; + case climate::CLIMATE_FAN_MEDIUM: + remote_state |= FAN_MED; + break; + case climate::CLIMATE_FAN_LOW: + remote_state |= FAN_MIN; + break; + case climate::CLIMATE_FAN_AUTO: + default: + remote_state |= FAN_AUTO; + break; + } + } + + // Set temperature + if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) { + auto temp = (uint8_t) roundf(clamp(this->target_temperature, TEMP_MIN, TEMP_MAX)); + remote_state |= ((temp - 15) << TEMP_SHIFT); + } + transmit_(remote_state); this->publish_state(); } @@ -125,37 +129,42 @@ bool LgIrClimate::on_receive(remote_base::RemoteReceiveData data) { if ((remote_state & 0xFF00000) != 0x8800000) return false; - if ((remote_state & COMMAND_MASK) == COMMAND_ON) { - this->mode = climate::CLIMATE_MODE_COOL; - } else if ((remote_state & COMMAND_MASK) == COMMAND_ON_AI) { - this->mode = climate::CLIMATE_MODE_HEAT_COOL; - } - + // Get command if ((remote_state & COMMAND_MASK) == COMMAND_OFF) { this->mode = climate::CLIMATE_MODE_OFF; } else if ((remote_state & COMMAND_MASK) == COMMAND_SWING) { this->swing_mode = this->swing_mode == climate::CLIMATE_SWING_OFF ? climate::CLIMATE_SWING_VERTICAL : climate::CLIMATE_SWING_OFF; } else { - if ((remote_state & COMMAND_MASK) == COMMAND_AUTO) { - this->mode = climate::CLIMATE_MODE_HEAT_COOL; - } else if ((remote_state & COMMAND_MASK) == COMMAND_DRY_FAN) { - this->mode = climate::CLIMATE_MODE_DRY; - } else if ((remote_state & COMMAND_MASK) == COMMAND_HEAT) { - this->mode = climate::CLIMATE_MODE_HEAT; - } else { - this->mode = climate::CLIMATE_MODE_COOL; + switch (remote_state & COMMAND_MASK) { + case COMMAND_DRY: + case COMMAND_ON_DRY: + this->mode = climate::CLIMATE_MODE_DRY; + break; + case COMMAND_FAN_ONLY: + case COMMAND_ON_FAN_ONLY: + this->mode = climate::CLIMATE_MODE_FAN_ONLY; + break; + case COMMAND_AI: + case COMMAND_ON_AI: + this->mode = climate::CLIMATE_MODE_HEAT_COOL; + break; + case COMMAND_HEAT: + case COMMAND_ON_HEAT: + this->mode = climate::CLIMATE_MODE_HEAT; + break; + case COMMAND_COOL: + case COMMAND_ON_COOL: + default: + this->mode = climate::CLIMATE_MODE_COOL; + break; } - // Temperature - if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) - this->target_temperature = ((remote_state & TEMP_MASK) >> TEMP_SHIFT) + 15; - - // Fan Speed + // Get fan speed if (this->mode == climate::CLIMATE_MODE_HEAT_COOL) { this->fan_mode = climate::CLIMATE_FAN_AUTO; - } else if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT || - this->mode == climate::CLIMATE_MODE_DRY) { + } else if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_DRY || + this->mode == climate::CLIMATE_MODE_FAN_ONLY || this->mode == climate::CLIMATE_MODE_HEAT) { if ((remote_state & FAN_MASK) == FAN_AUTO) { this->fan_mode = climate::CLIMATE_FAN_AUTO; } else if ((remote_state & FAN_MASK) == FAN_MIN) { @@ -166,11 +175,17 @@ bool LgIrClimate::on_receive(remote_base::RemoteReceiveData data) { this->fan_mode = climate::CLIMATE_FAN_HIGH; } } + + // Get temperature + if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) { + this->target_temperature = ((remote_state & TEMP_MASK) >> TEMP_SHIFT) + 15; + } } this->publish_state(); return true; } + void LgIrClimate::transmit_(uint32_t value) { calc_checksum_(value); ESP_LOGD(TAG, "Sending climate_lg_ir code: 0x%02" PRIX32, value); diff --git a/esphome/components/climate_ir_lg/climate_ir_lg.h b/esphome/components/climate_ir_lg/climate_ir_lg.h index 34f50744ef..7ee041b86f 100644 --- a/esphome/components/climate_ir_lg/climate_ir_lg.h +++ b/esphome/components/climate_ir_lg/climate_ir_lg.h @@ -14,7 +14,7 @@ const uint8_t TEMP_MAX = 30; // Celsius class LgIrClimate : public climate_ir::ClimateIR { public: LgIrClimate() - : climate_ir::ClimateIR(TEMP_MIN, TEMP_MAX, 1.0f, true, false, + : climate_ir::ClimateIR(TEMP_MIN, TEMP_MAX, 1.0f, true, true, {climate::CLIMATE_FAN_AUTO, climate::CLIMATE_FAN_LOW, climate::CLIMATE_FAN_MEDIUM, climate::CLIMATE_FAN_HIGH}, {climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL}) {} From 7b60543afd02960058e2cff58c70acebf68acc57 Mon Sep 17 00:00:00 2001 From: NMartin354 Date: Tue, 11 Jun 2024 19:38:20 -0500 Subject: [PATCH 022/151] [safe_mode] Allow user-defined interval for successful boot (#6882) Co-authored-by: Keith Burzinski --- esphome/components/safe_mode/__init__.py | 8 +++++++- esphome/components/safe_mode/safe_mode.cpp | 8 ++++++-- esphome/components/safe_mode/safe_mode.h | 13 +++++++------ tests/components/safe_mode/common.yaml | 1 + 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index 92b285e279..881937890d 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -16,6 +16,7 @@ from esphome import automation CODEOWNERS = ["@paulmonigatti", "@jsuanet", "@kbx81"] +CONF_BOOT_IS_GOOD_AFTER = "boot_is_good_after" CONF_ON_SAFE_MODE = "on_safe_mode" safe_mode_ns = cg.esphome_ns.namespace("safe_mode") @@ -34,6 +35,9 @@ CONFIG_SCHEMA = cv.All( cv.Schema( { cv.GenerateID(): cv.declare_id(SafeModeComponent), + cv.Optional( + CONF_BOOT_IS_GOOD_AFTER, default="1min" + ): cv.positive_time_period_milliseconds, cv.Optional(CONF_DISABLED, default=False): cv.boolean, cv.Optional(CONF_NUM_ATTEMPTS, default="10"): cv.positive_not_null_int, cv.Optional( @@ -63,7 +67,9 @@ async def to_code(config): await automation.build_automation(trigger, [], conf) condition = var.should_enter_safe_mode( - config[CONF_NUM_ATTEMPTS], config[CONF_REBOOT_TIMEOUT] + config[CONF_NUM_ATTEMPTS], + config[CONF_REBOOT_TIMEOUT], + config[CONF_BOOT_IS_GOOD_AFTER], ) cg.add(RawExpression(f"if ({condition}) return")) CORE.data[CONF_SAFE_MODE] = {} diff --git a/esphome/components/safe_mode/safe_mode.cpp b/esphome/components/safe_mode/safe_mode.cpp index 6934dcb9d9..aa1a4b6822 100644 --- a/esphome/components/safe_mode/safe_mode.cpp +++ b/esphome/components/safe_mode/safe_mode.cpp @@ -16,6 +16,8 @@ static const char *const TAG = "safe_mode"; void SafeModeComponent::dump_config() { ESP_LOGCONFIG(TAG, "Safe Mode:"); + ESP_LOGCONFIG(TAG, " Boot considered successful after %" PRIu32 " seconds", + this->safe_mode_boot_is_good_after_ / 1000); // because milliseconds ESP_LOGCONFIG(TAG, " Invoke after %u boot attempts", this->safe_mode_num_attempts_); ESP_LOGCONFIG(TAG, " Remain in safe mode for %" PRIu32 " seconds", this->safe_mode_enable_time_ / 1000); // because milliseconds @@ -34,7 +36,7 @@ void SafeModeComponent::dump_config() { float SafeModeComponent::get_setup_priority() const { return setup_priority::AFTER_WIFI; } void SafeModeComponent::loop() { - if (!this->boot_successful_ && (millis() - this->safe_mode_start_time_) > this->safe_mode_enable_time_) { + if (!this->boot_successful_ && (millis() - this->safe_mode_start_time_) > this->safe_mode_boot_is_good_after_) { // successful boot, reset counter ESP_LOGI(TAG, "Boot seems successful; resetting boot loop counter"); this->clean_rtc(); @@ -60,9 +62,11 @@ bool SafeModeComponent::get_safe_mode_pending() { return this->read_rtc_() == SafeModeComponent::ENTER_SAFE_MODE_MAGIC; } -bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time) { +bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time, + uint32_t boot_is_good_after) { this->safe_mode_start_time_ = millis(); this->safe_mode_enable_time_ = enable_time; + this->safe_mode_boot_is_good_after_ = boot_is_good_after; this->safe_mode_num_attempts_ = num_attempts; this->rtc_ = global_preferences->make_preference(233825507UL, false); this->safe_mode_rtc_value_ = this->read_rtc_(); diff --git a/esphome/components/safe_mode/safe_mode.h b/esphome/components/safe_mode/safe_mode.h index 0ec3c29529..37e2c3a3d6 100644 --- a/esphome/components/safe_mode/safe_mode.h +++ b/esphome/components/safe_mode/safe_mode.h @@ -11,7 +11,7 @@ namespace safe_mode { /// SafeModeComponent provides a safe way to recover from repeated boot failures class SafeModeComponent : public Component { public: - bool should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time); + bool should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time, uint32_t boot_is_good_after); /// Set to true if the next startup will enter safe mode void set_safe_mode_pending(const bool &pending); @@ -33,11 +33,12 @@ class SafeModeComponent : public Component { void write_rtc_(uint32_t val); uint32_t read_rtc_(); - bool boot_successful_{false}; ///< set to true after boot is considered successful - uint32_t safe_mode_start_time_; ///< stores when safe mode was enabled - uint32_t safe_mode_enable_time_{60000}; ///< The time safe mode should remain active for - uint32_t safe_mode_rtc_value_; - uint8_t safe_mode_num_attempts_; + bool boot_successful_{false}; ///< set to true after boot is considered successful + uint32_t safe_mode_boot_is_good_after_{60000}; ///< The amount of time after which the boot is considered successful + uint32_t safe_mode_enable_time_{60000}; ///< The time safe mode should remain active for + uint32_t safe_mode_rtc_value_{0}; + uint32_t safe_mode_start_time_{0}; ///< stores when safe mode was enabled + uint8_t safe_mode_num_attempts_{0}; ESPPreferenceObject rtc_; CallbackManager safe_mode_callback_{}; diff --git a/tests/components/safe_mode/common.yaml b/tests/components/safe_mode/common.yaml index ce8bf2f0cf..c24f49e6b6 100644 --- a/tests/components/safe_mode/common.yaml +++ b/tests/components/safe_mode/common.yaml @@ -3,6 +3,7 @@ wifi: password: password1 safe_mode: + boot_is_good_after: 2min num_attempts: 3 reboot_timeout: 2min on_safe_mode: From 13fabf1cd8eae9fe783a9a83b5d4665b66c5b180 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Tue, 11 Jun 2024 18:05:44 -0700 Subject: [PATCH 023/151] change to new 1-wire platform (#6860) Co-authored-by: Samuel Sieb Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 3 + esphome/components/dallas/__init__.py | 24 +- .../components/dallas/dallas_component.cpp | 287 ------------------ esphome/components/dallas/dallas_component.h | 79 ----- esphome/components/dallas/esp_one_wire.cpp | 252 --------------- esphome/components/dallas/esp_one_wire.h | 68 ----- esphome/components/dallas/sensor.py | 51 +--- esphome/components/dallas_temp/__init__.py | 1 + .../components/dallas_temp/dallas_temp.cpp | 172 +++++++++++ esphome/components/dallas_temp/dallas_temp.h | 32 ++ esphome/components/dallas_temp/sensor.py | 43 +++ esphome/components/gpio/one_wire/__init__.py | 25 ++ .../gpio/one_wire/gpio_one_wire.cpp | 199 ++++++++++++ .../components/gpio/one_wire/gpio_one_wire.h | 41 +++ esphome/components/one_wire/__init__.py | 40 +++ esphome/components/one_wire/one_wire.cpp | 40 +++ esphome/components/one_wire/one_wire.h | 44 +++ esphome/components/one_wire/one_wire_bus.cpp | 88 ++++++ esphome/components/one_wire/one_wire_bus.h | 61 ++++ script/ci-custom.py | 3 +- .../{dallas => dallas_temp}/common.yaml | 10 +- .../test.esp32-c3-idf.yaml | 0 .../test.esp32-c3.yaml | 0 .../test.esp32-idf.yaml | 0 .../{dallas => dallas_temp}/test.esp32.yaml | 0 .../{dallas => dallas_temp}/test.esp8266.yaml | 0 .../{dallas => dallas_temp}/test.rp2040.yaml | 0 tests/test1.yaml | 12 - 28 files changed, 802 insertions(+), 773 deletions(-) delete mode 100644 esphome/components/dallas/dallas_component.cpp delete mode 100644 esphome/components/dallas/dallas_component.h delete mode 100644 esphome/components/dallas/esp_one_wire.cpp delete mode 100644 esphome/components/dallas/esp_one_wire.h create mode 100644 esphome/components/dallas_temp/__init__.py create mode 100644 esphome/components/dallas_temp/dallas_temp.cpp create mode 100644 esphome/components/dallas_temp/dallas_temp.h create mode 100644 esphome/components/dallas_temp/sensor.py create mode 100644 esphome/components/gpio/one_wire/__init__.py create mode 100644 esphome/components/gpio/one_wire/gpio_one_wire.cpp create mode 100644 esphome/components/gpio/one_wire/gpio_one_wire.h create mode 100644 esphome/components/one_wire/__init__.py create mode 100644 esphome/components/one_wire/one_wire.cpp create mode 100644 esphome/components/one_wire/one_wire.h create mode 100644 esphome/components/one_wire/one_wire_bus.cpp create mode 100644 esphome/components/one_wire/one_wire_bus.h rename tests/components/{dallas => dallas_temp}/common.yaml (55%) rename tests/components/{dallas => dallas_temp}/test.esp32-c3-idf.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp32-c3.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp32-idf.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp32.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp8266.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.rp2040.yaml (100%) diff --git a/CODEOWNERS b/CODEOWNERS index bbb39c26ad..75ea4fe523 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -94,6 +94,7 @@ esphome/components/current_based/* @djwmarcx esphome/components/dac7678/* @NickB1 esphome/components/daikin_arc/* @MagicBear esphome/components/daikin_brc/* @hagak +esphome/components/dallas_temp/* @ssieb esphome/components/daly_bms/* @s1lvi0 esphome/components/dashboard_import/* @esphome/core esphome/components/datetime/* @jesserockz @rfdarter @@ -144,6 +145,7 @@ esphome/components/gdk101/* @Szewcson esphome/components/globals/* @esphome/core esphome/components/gp8403/* @jesserockz esphome/components/gpio/* @esphome/core +esphome/components/gpio/one_wire/* @ssieb esphome/components/gps/* @coogle esphome/components/graph/* @synco esphome/components/graphical_display_menu/* @MrMDavidson @@ -270,6 +272,7 @@ esphome/components/nextion/text_sensor/* @senexcrenshaw esphome/components/nfc/* @jesserockz @kbx81 esphome/components/noblex/* @AGalfra esphome/components/number/* @esphome/core +esphome/components/one_wire/* @ssieb esphome/components/ota/* @esphome/core esphome/components/output/* @esphome/core esphome/components/pca6416a/* @Mat931 diff --git a/esphome/components/dallas/__init__.py b/esphome/components/dallas/__init__.py index 0f71399a7c..6c2a9d830e 100644 --- a/esphome/components/dallas/__init__.py +++ b/esphome/components/dallas/__init__.py @@ -1,25 +1,7 @@ -import esphome.codegen as cg import esphome.config_validation as cv -from esphome import pins -from esphome.const import CONF_ID, CONF_PIN MULTI_CONF = True -AUTO_LOAD = ["sensor"] -dallas_ns = cg.esphome_ns.namespace("dallas") -DallasComponent = dallas_ns.class_("DallasComponent", cg.PollingComponent) - -CONFIG_SCHEMA = cv.Schema( - { - cv.GenerateID(): cv.declare_id(DallasComponent), - cv.Required(CONF_PIN): pins.internal_gpio_output_pin_schema, - } -).extend(cv.polling_component_schema("60s")) - - -async def to_code(config): - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) - - pin = await cg.gpio_pin_expression(config[CONF_PIN]) - cg.add(var.set_pin(pin)) +CONFIG_SCHEMA = cv.invalid( + 'The "dallas" component has been replaced by the "one_wire" component.\nhttps://esphome.io/components/one_wire' +) diff --git a/esphome/components/dallas/dallas_component.cpp b/esphome/components/dallas/dallas_component.cpp deleted file mode 100644 index a51bc369a1..0000000000 --- a/esphome/components/dallas/dallas_component.cpp +++ /dev/null @@ -1,287 +0,0 @@ -#include "dallas_component.h" -#include "esphome/core/log.h" - -namespace esphome { -namespace dallas { - -static const char *const TAG = "dallas.sensor"; - -static const uint8_t DALLAS_MODEL_DS18S20 = 0x10; -static const uint8_t DALLAS_MODEL_DS1822 = 0x22; -static const uint8_t DALLAS_MODEL_DS18B20 = 0x28; -static const uint8_t DALLAS_MODEL_DS1825 = 0x3B; -static const uint8_t DALLAS_MODEL_DS28EA00 = 0x42; -static const uint8_t DALLAS_COMMAND_START_CONVERSION = 0x44; -static const uint8_t DALLAS_COMMAND_READ_SCRATCH_PAD = 0xBE; -static const uint8_t DALLAS_COMMAND_WRITE_SCRATCH_PAD = 0x4E; - -uint16_t DallasTemperatureSensor::millis_to_wait_for_conversion() const { - switch (this->resolution_) { - case 9: - return 94; - case 10: - return 188; - case 11: - return 375; - default: - return 750; - } -} - -void DallasComponent::setup() { - ESP_LOGCONFIG(TAG, "Setting up DallasComponent..."); - - pin_->setup(); - - // clear bus with 480µs high, otherwise initial reset in search_vec() fails - pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - delayMicroseconds(480); - - one_wire_ = new ESPOneWire(pin_); // NOLINT(cppcoreguidelines-owning-memory) - - std::vector raw_sensors; - raw_sensors = this->one_wire_->search_vec(); - - for (auto &address : raw_sensors) { - auto *address8 = reinterpret_cast(&address); - if (crc8(address8, 7) != address8[7]) { - ESP_LOGW(TAG, "Dallas device 0x%s has invalid CRC.", format_hex(address).c_str()); - continue; - } - if (address8[0] != DALLAS_MODEL_DS18S20 && address8[0] != DALLAS_MODEL_DS1822 && - address8[0] != DALLAS_MODEL_DS18B20 && address8[0] != DALLAS_MODEL_DS1825 && - address8[0] != DALLAS_MODEL_DS28EA00) { - ESP_LOGW(TAG, "Unknown device type 0x%02X.", address8[0]); - continue; - } - this->found_sensors_.push_back(address); - } - - for (auto *sensor : this->sensors_) { - if (sensor->get_index().has_value()) { - if (*sensor->get_index() >= this->found_sensors_.size()) { - this->status_set_error("Sensor configured by index but not found"); - continue; - } - sensor->set_address(this->found_sensors_[*sensor->get_index()]); - } - - if (!sensor->setup_sensor()) { - this->status_set_error(); - } - } -} -void DallasComponent::dump_config() { - ESP_LOGCONFIG(TAG, "DallasComponent:"); - LOG_PIN(" Pin: ", this->pin_); - LOG_UPDATE_INTERVAL(this); - - if (this->found_sensors_.empty()) { - ESP_LOGW(TAG, " Found no sensors!"); - } else { - ESP_LOGD(TAG, " Found sensors:"); - for (auto &address : this->found_sensors_) { - ESP_LOGD(TAG, " 0x%s", format_hex(address).c_str()); - } - } - - for (auto *sensor : this->sensors_) { - LOG_SENSOR(" ", "Device", sensor); - if (sensor->get_index().has_value()) { - ESP_LOGCONFIG(TAG, " Index %u", *sensor->get_index()); - if (*sensor->get_index() >= this->found_sensors_.size()) { - ESP_LOGE(TAG, "Couldn't find sensor by index - not connected. Proceeding without it."); - continue; - } - } - ESP_LOGCONFIG(TAG, " Address: %s", sensor->get_address_name().c_str()); - ESP_LOGCONFIG(TAG, " Resolution: %u", sensor->get_resolution()); - } -} - -void DallasComponent::register_sensor(DallasTemperatureSensor *sensor) { this->sensors_.push_back(sensor); } -void DallasComponent::update() { - this->status_clear_warning(); - - bool result; - { - InterruptLock lock; - result = this->one_wire_->reset(); - } - if (!result) { - if (!this->found_sensors_.empty()) { - // Only log error if at the start sensors were found (and thus are disconnected during uptime) - ESP_LOGE(TAG, "Requesting conversion failed"); - this->status_set_warning(); - } - - for (auto *sensor : this->sensors_) { - sensor->publish_state(NAN); - } - return; - } - - { - InterruptLock lock; - this->one_wire_->skip(); - this->one_wire_->write8(DALLAS_COMMAND_START_CONVERSION); - } - - for (auto *sensor : this->sensors_) { - if (sensor->get_address() == 0) { - ESP_LOGV(TAG, "'%s' - Indexed sensor not found at startup, skipping update", sensor->get_name().c_str()); - sensor->publish_state(NAN); - continue; - } - - this->set_timeout(sensor->get_address_name(), sensor->millis_to_wait_for_conversion(), [this, sensor] { - bool res = sensor->read_scratch_pad(); - - if (!res) { - ESP_LOGW(TAG, "'%s' - Resetting bus for read failed!", sensor->get_name().c_str()); - sensor->publish_state(NAN); - this->status_set_warning(); - return; - } - if (!sensor->check_scratch_pad()) { - sensor->publish_state(NAN); - this->status_set_warning(); - return; - } - - float tempc = sensor->get_temp_c(); - ESP_LOGD(TAG, "'%s': Got Temperature=%.1f°C", sensor->get_name().c_str(), tempc); - sensor->publish_state(tempc); - }); - } -} - -void DallasTemperatureSensor::set_address(uint64_t address) { this->address_ = address; } -uint8_t DallasTemperatureSensor::get_resolution() const { return this->resolution_; } -void DallasTemperatureSensor::set_resolution(uint8_t resolution) { this->resolution_ = resolution; } -optional DallasTemperatureSensor::get_index() const { return this->index_; } -void DallasTemperatureSensor::set_index(uint8_t index) { this->index_ = index; } -uint8_t *DallasTemperatureSensor::get_address8() { return reinterpret_cast(&this->address_); } -uint64_t DallasTemperatureSensor::get_address() { return this->address_; } - -const std::string &DallasTemperatureSensor::get_address_name() { - if (this->address_name_.empty()) { - this->address_name_ = std::string("0x") + format_hex(this->address_); - } - - return this->address_name_; -} -bool IRAM_ATTR DallasTemperatureSensor::read_scratch_pad() { - auto *wire = this->parent_->one_wire_; - - { - InterruptLock lock; - - if (!wire->reset()) { - return false; - } - - wire->select(this->address_); - wire->write8(DALLAS_COMMAND_READ_SCRATCH_PAD); - - for (unsigned char &i : this->scratch_pad_) { - i = wire->read8(); - } - } - - return true; -} -bool DallasTemperatureSensor::setup_sensor() { - bool r = this->read_scratch_pad(); - - if (!r) { - ESP_LOGE(TAG, "Reading scratchpad failed: reset"); - return false; - } - if (!this->check_scratch_pad()) - return false; - - if (this->scratch_pad_[4] == this->resolution_) - return false; - - if (this->get_address8()[0] == DALLAS_MODEL_DS18S20) { - // DS18S20 doesn't support resolution. - ESP_LOGW(TAG, "DS18S20 doesn't support setting resolution."); - return false; - } - - switch (this->resolution_) { - case 12: - this->scratch_pad_[4] = 0x7F; - break; - case 11: - this->scratch_pad_[4] = 0x5F; - break; - case 10: - this->scratch_pad_[4] = 0x3F; - break; - case 9: - default: - this->scratch_pad_[4] = 0x1F; - break; - } - - auto *wire = this->parent_->one_wire_; - { - InterruptLock lock; - if (wire->reset()) { - wire->select(this->address_); - wire->write8(DALLAS_COMMAND_WRITE_SCRATCH_PAD); - wire->write8(this->scratch_pad_[2]); // high alarm temp - wire->write8(this->scratch_pad_[3]); // low alarm temp - wire->write8(this->scratch_pad_[4]); // resolution - wire->reset(); - - // write value to EEPROM - wire->select(this->address_); - wire->write8(0x48); - } - } - - delay(20); // allow it to finish operation - wire->reset(); - return true; -} -bool DallasTemperatureSensor::check_scratch_pad() { - bool chksum_validity = (crc8(this->scratch_pad_, 8) == this->scratch_pad_[8]); - bool config_validity = false; - - switch (this->get_address8()[0]) { - case DALLAS_MODEL_DS18B20: - config_validity = ((this->scratch_pad_[4] & 0x9F) == 0x1F); - break; - default: - config_validity = ((this->scratch_pad_[4] & 0x10) == 0x10); - } - -#ifdef ESPHOME_LOG_LEVEL_VERY_VERBOSE - ESP_LOGVV(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0], - this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4], - this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8], - crc8(this->scratch_pad_, 8)); -#endif - if (!chksum_validity) { - ESP_LOGW(TAG, "'%s' - Scratch pad checksum invalid!", this->get_name().c_str()); - } else if (!config_validity) { - ESP_LOGW(TAG, "'%s' - Scratch pad config register invalid!", this->get_name().c_str()); - } - return chksum_validity && config_validity; -} -float DallasTemperatureSensor::get_temp_c() { - int16_t temp = (int16_t(this->scratch_pad_[1]) << 11) | (int16_t(this->scratch_pad_[0]) << 3); - if (this->get_address8()[0] == DALLAS_MODEL_DS18S20) { - int diff = (this->scratch_pad_[7] - this->scratch_pad_[6]) << 7; - temp = ((temp & 0xFFF0) << 3) - 16 + (diff / this->scratch_pad_[7]); - } - - return temp / 128.0f; -} -std::string DallasTemperatureSensor::unique_id() { return "dallas-" + str_lower_case(format_hex(this->address_)); } - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/dallas_component.h b/esphome/components/dallas/dallas_component.h deleted file mode 100644 index 10bde7338b..0000000000 --- a/esphome/components/dallas/dallas_component.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include "esphome/core/component.h" -#include "esphome/components/sensor/sensor.h" -#include "esp_one_wire.h" - -#include - -namespace esphome { -namespace dallas { - -class DallasTemperatureSensor; - -class DallasComponent : public PollingComponent { - public: - void set_pin(InternalGPIOPin *pin) { pin_ = pin; } - void register_sensor(DallasTemperatureSensor *sensor); - - void setup() override; - void dump_config() override; - float get_setup_priority() const override { return setup_priority::DATA; } - - void update() override; - - protected: - friend DallasTemperatureSensor; - - InternalGPIOPin *pin_; - ESPOneWire *one_wire_; - std::vector sensors_; - std::vector found_sensors_; -}; - -/// Internal class that helps us create multiple sensors for one Dallas hub. -class DallasTemperatureSensor : public sensor::Sensor { - public: - void set_parent(DallasComponent *parent) { parent_ = parent; } - /// Helper to get a pointer to the address as uint8_t. - uint8_t *get_address8(); - uint64_t get_address(); - /// Helper to create (and cache) the name for this sensor. For example "0xfe0000031f1eaf29". - const std::string &get_address_name(); - - /// Set the 64-bit unsigned address for this sensor. - void set_address(uint64_t address); - /// Get the index of this sensor. (0 if using address.) - optional get_index() const; - /// Set the index of this sensor. If using index, address will be set after setup. - void set_index(uint8_t index); - /// Get the set resolution for this sensor. - uint8_t get_resolution() const; - /// Set the resolution for this sensor. - void set_resolution(uint8_t resolution); - /// Get the number of milliseconds we have to wait for the conversion phase. - uint16_t millis_to_wait_for_conversion() const; - - bool setup_sensor(); - bool read_scratch_pad(); - - bool check_scratch_pad(); - - float get_temp_c(); - - std::string unique_id() override; - - protected: - DallasComponent *parent_; - uint64_t address_; - optional index_; - - uint8_t resolution_; - std::string address_name_; - uint8_t scratch_pad_[9] = { - 0, - }; -}; - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/esp_one_wire.cpp b/esphome/components/dallas/esp_one_wire.cpp deleted file mode 100644 index 32ddf07fb6..0000000000 --- a/esphome/components/dallas/esp_one_wire.cpp +++ /dev/null @@ -1,252 +0,0 @@ -#include "esp_one_wire.h" -#include "esphome/core/log.h" -#include "esphome/core/helpers.h" - -namespace esphome { -namespace dallas { - -static const char *const TAG = "dallas.one_wire"; - -const uint8_t ONE_WIRE_ROM_SELECT = 0x55; -const int ONE_WIRE_ROM_SEARCH = 0xF0; - -ESPOneWire::ESPOneWire(InternalGPIOPin *pin) { pin_ = pin->to_isr(); } - -bool HOT IRAM_ATTR ESPOneWire::reset() { - // See reset here: - // https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/126.html - // Wait for communication to clear (delay G) - pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - uint8_t retries = 125; - do { - if (--retries == 0) - return false; - delayMicroseconds(2); - } while (!pin_.digital_read()); - - // Send 480µs LOW TX reset pulse (drive bus low, delay H) - pin_.pin_mode(gpio::FLAG_OUTPUT); - pin_.digital_write(false); - delayMicroseconds(480); - - // Release the bus, delay I - pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - delayMicroseconds(70); - - // sample bus, 0=device(s) present, 1=no device present - bool r = !pin_.digital_read(); - // delay J - delayMicroseconds(410); - return r; -} - -void HOT IRAM_ATTR ESPOneWire::write_bit(bool bit) { - // drive bus low - pin_.pin_mode(gpio::FLAG_OUTPUT); - pin_.digital_write(false); - - // from datasheet: - // write 0 low time: t_low0: min=60µs, max=120µs - // write 1 low time: t_low1: min=1µs, max=15µs - // time slot: t_slot: min=60µs, max=120µs - // recovery time: t_rec: min=1µs - // ds18b20 appears to read the bus after roughly 14µs - uint32_t delay0 = bit ? 6 : 60; - uint32_t delay1 = bit ? 54 : 5; - - // delay A/C - delayMicroseconds(delay0); - // release bus - pin_.digital_write(true); - // delay B/D - delayMicroseconds(delay1); -} - -bool HOT IRAM_ATTR ESPOneWire::read_bit() { - // drive bus low - pin_.pin_mode(gpio::FLAG_OUTPUT); - pin_.digital_write(false); - - // note: for reading we'll need very accurate timing, as the - // timing for the digital_read() is tight; according to the datasheet, - // we should read at the end of 16µs starting from the bus low - // typically, the ds18b20 pulls the line high after 11µs for a logical 1 - // and 29µs for a logical 0 - - uint32_t start = micros(); - // datasheet says >1µs - delayMicroseconds(3); - - // release bus, delay E - pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - - // Unfortunately some frameworks have different characteristics than others - // esp32 arduino appears to pull the bus low only after the digital_write(false), - // whereas on esp-idf it already happens during the pin_mode(OUTPUT) - // manually correct for this with these constants. - -#ifdef USE_ESP32 - uint32_t timing_constant = 12; -#else - uint32_t timing_constant = 14; -#endif - - // measure from start value directly, to get best accurate timing no matter - // how long pin_mode/delayMicroseconds took - while (micros() - start < timing_constant) - ; - - // sample bus to read bit from peer - bool r = pin_.digital_read(); - - // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked - uint32_t now = micros(); - if (now - start < 60) - delayMicroseconds(60 - (now - start)); - - return r; -} - -void IRAM_ATTR ESPOneWire::write8(uint8_t val) { - for (uint8_t i = 0; i < 8; i++) { - this->write_bit(bool((1u << i) & val)); - } -} - -void IRAM_ATTR ESPOneWire::write64(uint64_t val) { - for (uint8_t i = 0; i < 64; i++) { - this->write_bit(bool((1ULL << i) & val)); - } -} - -uint8_t IRAM_ATTR ESPOneWire::read8() { - uint8_t ret = 0; - for (uint8_t i = 0; i < 8; i++) { - ret |= (uint8_t(this->read_bit()) << i); - } - return ret; -} -uint64_t IRAM_ATTR ESPOneWire::read64() { - uint64_t ret = 0; - for (uint8_t i = 0; i < 8; i++) { - ret |= (uint64_t(this->read_bit()) << i); - } - return ret; -} -void IRAM_ATTR ESPOneWire::select(uint64_t address) { - this->write8(ONE_WIRE_ROM_SELECT); - this->write64(address); -} -void IRAM_ATTR ESPOneWire::reset_search() { - this->last_discrepancy_ = 0; - this->last_device_flag_ = false; - this->rom_number_ = 0; -} -uint64_t IRAM_ATTR ESPOneWire::search() { - if (this->last_device_flag_) { - return 0u; - } - - { - InterruptLock lock; - if (!this->reset()) { - // Reset failed or no devices present - this->reset_search(); - return 0u; - } - } - - uint8_t id_bit_number = 1; - uint8_t last_zero = 0; - uint8_t rom_byte_number = 0; - bool search_result = false; - uint8_t rom_byte_mask = 1; - - { - InterruptLock lock; - // Initiate search - this->write8(ONE_WIRE_ROM_SEARCH); - do { - // read bit - bool id_bit = this->read_bit(); - // read its complement - bool cmp_id_bit = this->read_bit(); - - if (id_bit && cmp_id_bit) { - // No devices participating in search - break; - } - - bool branch; - - if (id_bit != cmp_id_bit) { - // only chose one branch, the other one doesn't have any devices. - branch = id_bit; - } else { - // there are devices with both 0s and 1s at this bit - if (id_bit_number < this->last_discrepancy_) { - branch = (this->rom_number8_()[rom_byte_number] & rom_byte_mask) > 0; - } else { - branch = id_bit_number == this->last_discrepancy_; - } - - if (!branch) { - last_zero = id_bit_number; - } - } - - if (branch) { - // set bit - this->rom_number8_()[rom_byte_number] |= rom_byte_mask; - } else { - // clear bit - this->rom_number8_()[rom_byte_number] &= ~rom_byte_mask; - } - - // choose/announce branch - this->write_bit(branch); - id_bit_number++; - rom_byte_mask <<= 1; - if (rom_byte_mask == 0u) { - // go to next byte - rom_byte_number++; - rom_byte_mask = 1; - } - } while (rom_byte_number < 8); // loop through all bytes - } - - if (id_bit_number >= 65) { - this->last_discrepancy_ = last_zero; - if (this->last_discrepancy_ == 0) { - // we're at root and have no choices left, so this was the last one. - this->last_device_flag_ = true; - } - search_result = true; - } - - search_result = search_result && (this->rom_number8_()[0] != 0); - if (!search_result) { - this->reset_search(); - return 0u; - } - - return this->rom_number_; -} -std::vector ESPOneWire::search_vec() { - std::vector res; - - this->reset_search(); - uint64_t address; - while ((address = this->search()) != 0u) - res.push_back(address); - - return res; -} -void IRAM_ATTR ESPOneWire::skip() { - this->write8(0xCC); // skip ROM -} - -uint8_t IRAM_ATTR *ESPOneWire::rom_number8_() { return reinterpret_cast(&this->rom_number_); } - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/esp_one_wire.h b/esphome/components/dallas/esp_one_wire.h deleted file mode 100644 index 7544a6fe98..0000000000 --- a/esphome/components/dallas/esp_one_wire.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include "esphome/core/hal.h" -#include - -namespace esphome { -namespace dallas { - -extern const uint8_t ONE_WIRE_ROM_SELECT; -extern const int ONE_WIRE_ROM_SEARCH; - -class ESPOneWire { - public: - explicit ESPOneWire(InternalGPIOPin *pin); - - /** Reset the bus, should be done before all write operations. - * - * Takes approximately 1ms. - * - * @return Whether the operation was successful. - */ - bool reset(); - - /// Write a single bit to the bus, takes about 70µs. - void write_bit(bool bit); - - /// Read a single bit from the bus, takes about 70µs - bool read_bit(); - - /// Write a word to the bus. LSB first. - void write8(uint8_t val); - - /// Write a 64 bit unsigned integer to the bus. LSB first. - void write64(uint64_t val); - - /// Write a command to the bus that addresses all devices by skipping the ROM. - void skip(); - - /// Read an 8 bit word from the bus. - uint8_t read8(); - - /// Read an 64-bit unsigned integer from the bus. - uint64_t read64(); - - /// Select a specific address on the bus for the following command. - void select(uint64_t address); - - /// Reset the device search. - void reset_search(); - - /// Search for a 1-Wire device on the bus. Returns 0 if all devices have been found. - uint64_t search(); - - /// Helper that wraps search in a std::vector. - std::vector search_vec(); - - protected: - /// Helper to get the internal 64-bit unsigned rom number as a 8-bit integer pointer. - inline uint8_t *rom_number8_(); - - ISRInternalGPIOPin pin_; - uint8_t last_discrepancy_{0}; - bool last_device_flag_{false}; - uint64_t rom_number_{0}; -}; - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/sensor.py b/esphome/components/dallas/sensor.py index c6ebda62c8..69f8fc3b9e 100644 --- a/esphome/components/dallas/sensor.py +++ b/esphome/components/dallas/sensor.py @@ -1,50 +1,5 @@ -import esphome.codegen as cg import esphome.config_validation as cv -from esphome.components import sensor -from esphome.const import ( - CONF_ADDRESS, - CONF_DALLAS_ID, - CONF_INDEX, - CONF_RESOLUTION, - DEVICE_CLASS_TEMPERATURE, - STATE_CLASS_MEASUREMENT, - UNIT_CELSIUS, + +CONFIG_SCHEMA = cv.invalid( + 'The "dallas" sensor is now "dallas_temp"\nhttps://esphome.io/components/sensor/dallas_temp' ) -from . import DallasComponent, dallas_ns - -DallasTemperatureSensor = dallas_ns.class_("DallasTemperatureSensor", sensor.Sensor) - -CONFIG_SCHEMA = cv.All( - sensor.sensor_schema( - DallasTemperatureSensor, - unit_of_measurement=UNIT_CELSIUS, - accuracy_decimals=1, - device_class=DEVICE_CLASS_TEMPERATURE, - state_class=STATE_CLASS_MEASUREMENT, - ).extend( - { - cv.GenerateID(CONF_DALLAS_ID): cv.use_id(DallasComponent), - cv.Optional(CONF_ADDRESS): cv.hex_uint64_t, - cv.Optional(CONF_INDEX): cv.positive_int, - cv.Optional(CONF_RESOLUTION, default=12): cv.int_range(min=9, max=12), - } - ), - cv.has_exactly_one_key(CONF_ADDRESS, CONF_INDEX), -) - - -async def to_code(config): - hub = await cg.get_variable(config[CONF_DALLAS_ID]) - var = await sensor.new_sensor(config) - - if CONF_ADDRESS in config: - cg.add(var.set_address(config[CONF_ADDRESS])) - else: - cg.add(var.set_index(config[CONF_INDEX])) - - if CONF_RESOLUTION in config: - cg.add(var.set_resolution(config[CONF_RESOLUTION])) - - cg.add(var.set_parent(hub)) - - cg.add(hub.register_sensor(var)) diff --git a/esphome/components/dallas_temp/__init__.py b/esphome/components/dallas_temp/__init__.py new file mode 100644 index 0000000000..3f73044ca8 --- /dev/null +++ b/esphome/components/dallas_temp/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@ssieb"] diff --git a/esphome/components/dallas_temp/dallas_temp.cpp b/esphome/components/dallas_temp/dallas_temp.cpp new file mode 100644 index 0000000000..fe7c9a95ea --- /dev/null +++ b/esphome/components/dallas_temp/dallas_temp.cpp @@ -0,0 +1,172 @@ +#include "dallas_temp.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace dallas_temp { + +static const char *const TAG = "dallas.temp.sensor"; + +static const uint8_t DALLAS_MODEL_DS18S20 = 0x10; +static const uint8_t DALLAS_COMMAND_START_CONVERSION = 0x44; +static const uint8_t DALLAS_COMMAND_READ_SCRATCH_PAD = 0xBE; +static const uint8_t DALLAS_COMMAND_WRITE_SCRATCH_PAD = 0x4E; +static const uint8_t DALLAS_COMMAND_COPY_SCRATCH_PAD = 0x48; + +uint16_t DallasTemperatureSensor::millis_to_wait_for_conversion_() const { + switch (this->resolution_) { + case 9: + return 94; + case 10: + return 188; + case 11: + return 375; + default: + return 750; + } +} + +void DallasTemperatureSensor::dump_config() { + ESP_LOGCONFIG(TAG, "Dallas Temperature Sensor:"); + if (this->address_ == 0) { + ESP_LOGW(TAG, " Unable to select an address"); + return; + } + LOG_ONE_WIRE_DEVICE(this); + ESP_LOGCONFIG(TAG, " Resolution: %u bits", this->resolution_); + LOG_UPDATE_INTERVAL(this); +} + +void DallasTemperatureSensor::update() { + if (this->address_ == 0) + return; + + this->status_clear_warning(); + + this->send_command_(DALLAS_COMMAND_START_CONVERSION); + + this->set_timeout(this->get_address_name(), this->millis_to_wait_for_conversion_(), [this] { + if (!this->read_scratch_pad_() || !this->check_scratch_pad_()) { + this->publish_state(NAN); + return; + } + + float tempc = this->get_temp_c_(); + ESP_LOGD(TAG, "'%s': Got Temperature=%.1f°C", this->get_name().c_str(), tempc); + this->publish_state(tempc); + }); +} + +void IRAM_ATTR DallasTemperatureSensor::read_scratch_pad_int_() { + for (uint8_t &i : this->scratch_pad_) { + i = this->bus_->read8(); + } +} + +bool DallasTemperatureSensor::read_scratch_pad_() { + bool success; + { + InterruptLock lock; + success = this->send_command_(DALLAS_COMMAND_READ_SCRATCH_PAD); + if (success) + this->read_scratch_pad_int_(); + } + if (!success) { + ESP_LOGW(TAG, "'%s' - reading scratch pad failed bus reset", this->get_name().c_str()); + this->status_set_warning("bus reset failed"); + } + return success; +} + +void DallasTemperatureSensor::setup() { + ESP_LOGCONFIG(TAG, "setting up Dallas temperature sensor..."); + if (!this->check_address_()) + return; + if (!this->read_scratch_pad_()) + return; + if (!this->check_scratch_pad_()) + return; + + if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { + // DS18S20 doesn't support resolution. + ESP_LOGW(TAG, "DS18S20 doesn't support setting resolution."); + return; + } + + uint8_t res; + switch (this->resolution_) { + case 12: + res = 0x7F; + break; + case 11: + res = 0x5F; + break; + case 10: + res = 0x3F; + break; + case 9: + default: + res = 0x1F; + break; + } + + if (this->scratch_pad_[4] == res) + return; + this->scratch_pad_[4] = res; + + { + InterruptLock lock; + if (this->send_command_(DALLAS_COMMAND_WRITE_SCRATCH_PAD)) { + this->bus_->write8(this->scratch_pad_[2]); // high alarm temp + this->bus_->write8(this->scratch_pad_[3]); // low alarm temp + this->bus_->write8(this->scratch_pad_[4]); // resolution + } + + // write value to EEPROM + this->send_command_(DALLAS_COMMAND_COPY_SCRATCH_PAD); + } +} + +bool DallasTemperatureSensor::check_scratch_pad_() { + bool chksum_validity = (crc8(this->scratch_pad_, 8) == this->scratch_pad_[8]); + +#ifdef ESPHOME_LOG_LEVEL_VERY_VERBOSE + ESP_LOGVV(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0], + this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4], + this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8], + crc8(this->scratch_pad_, 8)); +#endif + if (!chksum_validity) { + ESP_LOGW(TAG, "'%s' - Scratch pad checksum invalid!", this->get_name().c_str()); + this->status_set_warning("scratch pad checksum invalid"); + } + return chksum_validity; +} + +float DallasTemperatureSensor::get_temp_c_() { + int16_t temp = (this->scratch_pad_[1] << 8) | this->scratch_pad_[0]; + if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { + if (this->scratch_pad_[7] != 0x10) + ESP_LOGE(TAG, "unexpected COUNT_PER_C value: %u", this->scratch_pad_[7]); + temp = ((temp & 0xfff7) << 3) + (0x10 - this->scratch_pad_[6]) - 4; + } else { + switch (this->resolution_) { + case 9: + temp &= 0xfff8; + break; + case 10: + temp &= 0xfffc; + break; + case 11: + temp &= 0xfffe; + break; + case 12: + default: + break; + } + } + + return temp / 16.0f; +} + +} // namespace dallas_temp +} // namespace esphome diff --git a/esphome/components/dallas_temp/dallas_temp.h b/esphome/components/dallas_temp/dallas_temp.h new file mode 100644 index 0000000000..604c9d0cd7 --- /dev/null +++ b/esphome/components/dallas_temp/dallas_temp.h @@ -0,0 +1,32 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/one_wire/one_wire.h" + +namespace esphome { +namespace dallas_temp { + +class DallasTemperatureSensor : public PollingComponent, public sensor::Sensor, public one_wire::OneWireDevice { + public: + void setup() override; + void update() override; + void dump_config() override; + + /// Set the resolution for this sensor. + void set_resolution(uint8_t resolution) { this->resolution_ = resolution; } + + protected: + uint8_t resolution_; + uint8_t scratch_pad_[9] = {0}; + + /// Get the number of milliseconds we have to wait for the conversion phase. + uint16_t millis_to_wait_for_conversion_() const; + bool read_scratch_pad_(); + void read_scratch_pad_int_(); + bool check_scratch_pad_(); + float get_temp_c_(); +}; + +} // namespace dallas_temp +} // namespace esphome diff --git a/esphome/components/dallas_temp/sensor.py b/esphome/components/dallas_temp/sensor.py new file mode 100644 index 0000000000..ab14a9afd5 --- /dev/null +++ b/esphome/components/dallas_temp/sensor.py @@ -0,0 +1,43 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import one_wire, sensor +from esphome.const import ( + CONF_RESOLUTION, + DEVICE_CLASS_TEMPERATURE, + STATE_CLASS_MEASUREMENT, + UNIT_CELSIUS, +) + +dallas_temp_ns = cg.esphome_ns.namespace("dallas_temp") + +DallasTemperatureSensor = dallas_temp_ns.class_( + "DallasTemperatureSensor", + cg.PollingComponent, + sensor.Sensor, + one_wire.OneWireDevice, +) + +CONFIG_SCHEMA = ( + sensor.sensor_schema( + DallasTemperatureSensor, + unit_of_measurement=UNIT_CELSIUS, + accuracy_decimals=1, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + ) + .extend( + { + cv.Optional(CONF_RESOLUTION, default=12): cv.int_range(min=9, max=12), + } + ) + .extend(one_wire.one_wire_device_schema()) + .extend(cv.polling_component_schema("60s")) +) + + +async def to_code(config): + var = await sensor.new_sensor(config) + await cg.register_component(var, config) + await one_wire.register_one_wire_device(var, config) + + cg.add(var.set_resolution(config[CONF_RESOLUTION])) diff --git a/esphome/components/gpio/one_wire/__init__.py b/esphome/components/gpio/one_wire/__init__.py new file mode 100644 index 0000000000..2166e92083 --- /dev/null +++ b/esphome/components/gpio/one_wire/__init__.py @@ -0,0 +1,25 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome import pins +from esphome.const import CONF_ID, CONF_PIN +from esphome.components.one_wire import OneWireBus +from .. import gpio_ns + +CODEOWNERS = ["@ssieb"] + +GPIOOneWireBus = gpio_ns.class_("GPIOOneWireBus", OneWireBus, cg.Component) + +CONFIG_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.declare_id(GPIOOneWireBus), + cv.Required(CONF_PIN): pins.internal_gpio_output_pin_schema, + } +).extend(cv.COMPONENT_SCHEMA) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) + + pin = await cg.gpio_pin_expression(config[CONF_PIN]) + cg.add(var.set_pin(pin)) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp new file mode 100644 index 0000000000..f47e8d58e3 --- /dev/null +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -0,0 +1,199 @@ +#include "gpio_one_wire.h" +#include "esphome/core/log.h" +#include "esphome/core/helpers.h" + +namespace esphome { +namespace gpio { + +static const char *const TAG = "gpio.one_wire"; + +void GPIOOneWireBus::setup() { + ESP_LOGCONFIG(TAG, "Setting up 1-wire bus..."); + this->search(); +} + +void GPIOOneWireBus::dump_config() { + ESP_LOGCONFIG(TAG, "GPIO 1-wire bus:"); + LOG_PIN(" Pin: ", this->t_pin_); + this->dump_devices_(TAG); +} + +bool HOT IRAM_ATTR GPIOOneWireBus::reset() { + // See reset here: + // https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/126.html + // Wait for communication to clear (delay G) + pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + uint8_t retries = 125; + do { + if (--retries == 0) + return false; + delayMicroseconds(2); + } while (!pin_.digital_read()); + + bool r; + + // Send 480µs LOW TX reset pulse (drive bus low, delay H) + pin_.pin_mode(gpio::FLAG_OUTPUT); + pin_.digital_write(false); + delayMicroseconds(480); + + // Release the bus, delay I + pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + delayMicroseconds(70); + + // sample bus, 0=device(s) present, 1=no device present + r = !pin_.digital_read(); + // delay J + delayMicroseconds(410); + return r; +} + +void HOT IRAM_ATTR GPIOOneWireBus::write_bit_(bool bit) { + // drive bus low + pin_.pin_mode(gpio::FLAG_OUTPUT); + pin_.digital_write(false); + + // from datasheet: + // write 0 low time: t_low0: min=60µs, max=120µs + // write 1 low time: t_low1: min=1µs, max=15µs + // time slot: t_slot: min=60µs, max=120µs + // recovery time: t_rec: min=1µs + // ds18b20 appears to read the bus after roughly 14µs + uint32_t delay0 = bit ? 6 : 60; + uint32_t delay1 = bit ? 54 : 5; + + // delay A/C + delayMicroseconds(delay0); + // release bus + pin_.digital_write(true); + // delay B/D + delayMicroseconds(delay1); +} + +bool HOT IRAM_ATTR GPIOOneWireBus::read_bit_() { + // drive bus low + pin_.pin_mode(gpio::FLAG_OUTPUT); + pin_.digital_write(false); + + // note: for reading we'll need very accurate timing, as the + // timing for the digital_read() is tight; according to the datasheet, + // we should read at the end of 16µs starting from the bus low + // typically, the ds18b20 pulls the line high after 11µs for a logical 1 + // and 29µs for a logical 0 + + uint32_t start = micros(); + // datasheet says >1µs + delayMicroseconds(2); + + // release bus, delay E + pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + + // measure from start value directly, to get best accurate timing no matter + // how long pin_mode/delayMicroseconds took + delayMicroseconds(12 - (micros() - start)); + + // sample bus to read bit from peer + bool r = pin_.digital_read(); + + // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked + uint32_t now = micros(); + if (now - start < 60) + delayMicroseconds(60 - (now - start)); + + return r; +} + +void IRAM_ATTR GPIOOneWireBus::write8(uint8_t val) { + for (uint8_t i = 0; i < 8; i++) { + this->write_bit_(bool((1u << i) & val)); + } +} + +void IRAM_ATTR GPIOOneWireBus::write64(uint64_t val) { + for (uint8_t i = 0; i < 64; i++) { + this->write_bit_(bool((1ULL << i) & val)); + } +} + +uint8_t IRAM_ATTR GPIOOneWireBus::read8() { + uint8_t ret = 0; + for (uint8_t i = 0; i < 8; i++) { + ret |= (uint8_t(this->read_bit_()) << i); + } + return ret; +} + +uint64_t IRAM_ATTR GPIOOneWireBus::read64() { + uint64_t ret = 0; + for (uint8_t i = 0; i < 8; i++) { + ret |= (uint64_t(this->read_bit_()) << i); + } + return ret; +} + +void GPIOOneWireBus::reset_search() { + this->last_discrepancy_ = 0; + this->last_device_flag_ = false; + this->address_ = 0; +} + +uint64_t IRAM_ATTR GPIOOneWireBus::search_int() { + if (this->last_device_flag_) + return 0u; + + uint8_t last_zero = 0; + uint64_t bit_mask = 1; + uint64_t address = this->address_; + + // Initiate search + for (int bit_number = 1; bit_number <= 64; bit_number++, bit_mask <<= 1) { + // read bit + bool id_bit = this->read_bit_(); + // read its complement + bool cmp_id_bit = this->read_bit_(); + + if (id_bit && cmp_id_bit) { + // No devices participating in search + return 0; + } + + bool branch; + + if (id_bit != cmp_id_bit) { + // only chose one branch, the other one doesn't have any devices. + branch = id_bit; + } else { + // there are devices with both 0s and 1s at this bit + if (bit_number < this->last_discrepancy_) { + branch = (address & bit_mask) > 0; + } else { + branch = bit_number == this->last_discrepancy_; + } + + if (!branch) { + last_zero = bit_number; + } + } + + if (branch) { + address |= bit_mask; + } else { + address &= ~bit_mask; + } + + // choose/announce branch + this->write_bit_(branch); + } + + this->last_discrepancy_ = last_zero; + if (this->last_discrepancy_ == 0) { + // we're at root and have no choices left, so this was the last one. + this->last_device_flag_ = true; + } + + this->address_ = address; + return address; +} + +} // namespace gpio +} // namespace esphome diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.h b/esphome/components/gpio/one_wire/gpio_one_wire.h new file mode 100644 index 0000000000..fe949baec3 --- /dev/null +++ b/esphome/components/gpio/one_wire/gpio_one_wire.h @@ -0,0 +1,41 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/hal.h" +#include "esphome/components/one_wire/one_wire.h" + +namespace esphome { +namespace gpio { + +class GPIOOneWireBus : public one_wire::OneWireBus, public Component { + public: + void setup() override; + void dump_config() override; + float get_setup_priority() const override { return setup_priority::BUS; } + + void set_pin(InternalGPIOPin *pin) { + this->t_pin_ = pin; + this->pin_ = pin->to_isr(); + } + + bool reset() override; + void write8(uint8_t val) override; + void write64(uint64_t val) override; + uint8_t read8() override; + uint64_t read64() override; + + protected: + InternalGPIOPin *t_pin_; + ISRInternalGPIOPin pin_; + uint8_t last_discrepancy_{0}; + bool last_device_flag_{false}; + uint64_t address_; + + void reset_search() override; + uint64_t search_int() override; + void write_bit_(bool bit); + bool read_bit_(); +}; + +} // namespace gpio +} // namespace esphome diff --git a/esphome/components/one_wire/__init__.py b/esphome/components/one_wire/__init__.py new file mode 100644 index 0000000000..99a1ccd1eb --- /dev/null +++ b/esphome/components/one_wire/__init__.py @@ -0,0 +1,40 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS + +CODEOWNERS = ["@ssieb"] + +IS_PLATFORM_COMPONENT = True + +CONF_ONE_WIRE_ID = "one_wire_id" + +one_wire_ns = cg.esphome_ns.namespace("one_wire") +OneWireBus = one_wire_ns.class_("OneWireBus") +OneWireDevice = one_wire_ns.class_("OneWireDevice") + + +def one_wire_device_schema(): + """Create a schema for a 1-wire device. + + :return: The 1-wire device schema, `extend` this in your config schema. + """ + schema = cv.Schema( + { + cv.GenerateID(CONF_ONE_WIRE_ID): cv.use_id(OneWireBus), + cv.Optional(CONF_ADDRESS): cv.hex_uint64_t, + } + ) + return schema + + +async def register_one_wire_device(var, config): + """Register an 1-wire device with the given config. + + Sets the 1-wire bus to use and the 1-wire address. + + This is a coroutine, you need to await it with a 'yield' expression! + """ + parent = await cg.get_variable(config[CONF_ONE_WIRE_ID]) + cg.add(var.set_one_wire_bus(parent)) + if (address := config.get(CONF_ADDRESS)) is not None: + cg.add(var.set_address(address)) diff --git a/esphome/components/one_wire/one_wire.cpp b/esphome/components/one_wire/one_wire.cpp new file mode 100644 index 0000000000..131bc4fbfe --- /dev/null +++ b/esphome/components/one_wire/one_wire.cpp @@ -0,0 +1,40 @@ +#include "one_wire.h" + +namespace esphome { +namespace one_wire { + +static const char *const TAG = "one_wire"; + +const std::string &OneWireDevice::get_address_name() { + if (this->address_name_.empty()) + this->address_name_ = std::string("0x") + format_hex(this->address_); + return this->address_name_; +} + +std::string OneWireDevice::unique_id() { return "dallas-" + str_lower_case(format_hex(this->address_)); } + +bool OneWireDevice::send_command_(uint8_t cmd) { + if (!this->bus_->select(this->address_)) + return false; + this->bus_->write8(cmd); + return true; +} + +bool OneWireDevice::check_address_() { + if (this->address_ != 0) + return true; + auto devices = this->bus_->get_devices(); + if (devices.empty()) { + ESP_LOGE(TAG, "No devices, can't auto-select address"); + return false; + } + if (devices.size() > 1) { + ESP_LOGE(TAG, "More than one device, can't auto-select address"); + return false; + } + this->address_ = devices[0]; + return true; +} + +} // namespace one_wire +} // namespace esphome diff --git a/esphome/components/one_wire/one_wire.h b/esphome/components/one_wire/one_wire.h new file mode 100644 index 0000000000..bf10e4f82e --- /dev/null +++ b/esphome/components/one_wire/one_wire.h @@ -0,0 +1,44 @@ +#pragma once + +#include "one_wire_bus.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace one_wire { + +#define LOG_ONE_WIRE_DEVICE(this) \ + ESP_LOGCONFIG(TAG, " Address: %s (%s)", this->get_address_name().c_str(), \ + LOG_STR_ARG(this->bus_->get_model_str(this->address_ & 0xff))); + +class OneWireDevice { + public: + /// @brief store the address of the device + /// @param address of the device + void set_address(uint64_t address) { this->address_ = address; } + + /// @brief store the pointer to the OneWireBus to use + /// @param bus pointer to the OneWireBus object + void set_one_wire_bus(OneWireBus *bus) { this->bus_ = bus; } + + /// Helper to create (and cache) the name for this sensor. For example "0xfe0000031f1eaf29". + const std::string &get_address_name(); + + std::string unique_id(); + + protected: + uint64_t address_{0}; + OneWireBus *bus_{nullptr}; ///< pointer to OneWireBus instance + std::string address_name_; + + /// @brief find an address if necessary + /// should be called from setup + bool check_address_(); + + /// @brief send command on the bus + /// @param cmd command to send + bool send_command_(uint8_t cmd); +}; + +} // namespace one_wire +} // namespace esphome diff --git a/esphome/components/one_wire/one_wire_bus.cpp b/esphome/components/one_wire/one_wire_bus.cpp new file mode 100644 index 0000000000..a8d29428d3 --- /dev/null +++ b/esphome/components/one_wire/one_wire_bus.cpp @@ -0,0 +1,88 @@ +#include "one_wire_bus.h" +#include "esphome/core/helpers.h" + +namespace esphome { +namespace one_wire { + +static const char *const TAG = "one_wire"; + +static const uint8_t DALLAS_MODEL_DS18S20 = 0x10; +static const uint8_t DALLAS_MODEL_DS1822 = 0x22; +static const uint8_t DALLAS_MODEL_DS18B20 = 0x28; +static const uint8_t DALLAS_MODEL_DS1825 = 0x3B; +static const uint8_t DALLAS_MODEL_DS28EA00 = 0x42; + +const uint8_t ONE_WIRE_ROM_SELECT = 0x55; +const uint8_t ONE_WIRE_ROM_SEARCH = 0xF0; + +const std::vector &OneWireBus::get_devices() { return this->devices_; } + +bool IRAM_ATTR OneWireBus::select(uint64_t address) { + if (!this->reset()) + return false; + this->write8(ONE_WIRE_ROM_SELECT); + this->write64(address); + return true; +} + +void OneWireBus::search() { + this->devices_.clear(); + + this->reset_search(); + uint64_t address; + while (true) { + { + InterruptLock lock; + if (!this->reset()) { + // Reset failed or no devices present + return; + } + + this->write8(ONE_WIRE_ROM_SEARCH); + address = this->search_int(); + } + if (address == 0) + break; + auto *address8 = reinterpret_cast(&address); + if (crc8(address8, 7) != address8[7]) { + ESP_LOGW(TAG, "Dallas device 0x%s has invalid CRC.", format_hex(address).c_str()); + } else { + this->devices_.push_back(address); + } + } +} + +void OneWireBus::skip() { + this->write8(0xCC); // skip ROM +} + +const LogString *OneWireBus::get_model_str(uint8_t model) { + switch (model) { + case DALLAS_MODEL_DS18S20: + return LOG_STR("DS18S20"); + case DALLAS_MODEL_DS1822: + return LOG_STR("DS1822"); + case DALLAS_MODEL_DS18B20: + return LOG_STR("DS18B20"); + case DALLAS_MODEL_DS1825: + return LOG_STR("DS1825"); + case DALLAS_MODEL_DS28EA00: + return LOG_STR("DS28EA00"); + default: + return LOG_STR("Unknown"); + } +} + +void OneWireBus::dump_devices_(const char *tag) { + if (this->devices_.empty()) { + ESP_LOGW(tag, " Found no devices!"); + } else { + ESP_LOGCONFIG(tag, " Found devices:"); + for (auto &address : this->devices_) { + ESP_LOGCONFIG(tag, " 0x%s (%s)", format_hex(address).c_str(), LOG_STR_ARG(get_model_str(address & 0xff))); + } + } +} + +} // namespace one_wire +} // namespace esphome diff --git a/esphome/components/one_wire/one_wire_bus.h b/esphome/components/one_wire/one_wire_bus.h new file mode 100644 index 0000000000..6818b17499 --- /dev/null +++ b/esphome/components/one_wire/one_wire_bus.h @@ -0,0 +1,61 @@ +#pragma once + +#include "esphome/core/hal.h" +#include "esphome/core/log.h" +#include + +namespace esphome { +namespace one_wire { + +class OneWireBus { + public: + /** Reset the bus, should be done before all write operations. + * + * Takes approximately 1ms. + * + * @return Whether the operation was successful. + */ + virtual bool reset() = 0; + + /// Write a word to the bus. LSB first. + virtual void write8(uint8_t val) = 0; + + /// Write a 64 bit unsigned integer to the bus. LSB first. + virtual void write64(uint64_t val) = 0; + + /// Write a command to the bus that addresses all devices by skipping the ROM. + void skip(); + + /// Read an 8 bit word from the bus. + virtual uint8_t read8() = 0; + + /// Read an 64-bit unsigned integer from the bus. + virtual uint64_t read64() = 0; + + /// Select a specific address on the bus for the following command. + bool select(uint64_t address); + + /// Return the list of found devices. + const std::vector &get_devices(); + + /// Search for 1-Wire devices on the bus. + void search(); + + /// Get the description string for this model. + const LogString *get_model_str(uint8_t model); + + protected: + std::vector devices_; + + /// log the found devices + void dump_devices_(const char *tag); + + /// Reset the device search. + virtual void reset_search() = 0; + + /// Search for a 1-Wire device on the bus. Returns 0 if all devices have been found. + virtual uint64_t search_int() = 0; +}; + +} // namespace one_wire +} // namespace esphome diff --git a/script/ci-custom.py b/script/ci-custom.py index e2ee81f742..9a97d3e4a8 100755 --- a/script/ci-custom.py +++ b/script/ci-custom.py @@ -630,7 +630,7 @@ def lint_trailing_whitespace(fname, match): "esphome/components/lock/lock.h", "esphome/components/mqtt/mqtt_component.h", "esphome/components/number/number.h", - "esphome/components/text/text.h", + "esphome/components/one_wire/one_wire.h", "esphome/components/output/binary_output.h", "esphome/components/output/float_output.h", "esphome/components/nextion/nextion_base.h", @@ -638,6 +638,7 @@ def lint_trailing_whitespace(fname, match): "esphome/components/sensor/sensor.h", "esphome/components/stepper/stepper.h", "esphome/components/switch/switch.h", + "esphome/components/text/text.h", "esphome/components/text_sensor/text_sensor.h", "esphome/components/valve/valve.h", "esphome/core/component.h", diff --git a/tests/components/dallas/common.yaml b/tests/components/dallas_temp/common.yaml similarity index 55% rename from tests/components/dallas/common.yaml rename to tests/components/dallas_temp/common.yaml index 7975977107..2f846ca278 100644 --- a/tests/components/dallas/common.yaml +++ b/tests/components/dallas_temp/common.yaml @@ -1,11 +1,11 @@ -dallas: - pin: 4 +one_wire: + - platform: gpio + pin: 4 sensor: - - platform: dallas + - platform: dallas_temp address: 0x1C0000031EDD2A28 name: Dallas Temperature resolution: 9 - - platform: dallas - index: 1 + - platform: dallas_temp name: Dallas Temperature diff --git a/tests/components/dallas/test.esp32-c3-idf.yaml b/tests/components/dallas_temp/test.esp32-c3-idf.yaml similarity index 100% rename from tests/components/dallas/test.esp32-c3-idf.yaml rename to tests/components/dallas_temp/test.esp32-c3-idf.yaml diff --git a/tests/components/dallas/test.esp32-c3.yaml b/tests/components/dallas_temp/test.esp32-c3.yaml similarity index 100% rename from tests/components/dallas/test.esp32-c3.yaml rename to tests/components/dallas_temp/test.esp32-c3.yaml diff --git a/tests/components/dallas/test.esp32-idf.yaml b/tests/components/dallas_temp/test.esp32-idf.yaml similarity index 100% rename from tests/components/dallas/test.esp32-idf.yaml rename to tests/components/dallas_temp/test.esp32-idf.yaml diff --git a/tests/components/dallas/test.esp32.yaml b/tests/components/dallas_temp/test.esp32.yaml similarity index 100% rename from tests/components/dallas/test.esp32.yaml rename to tests/components/dallas_temp/test.esp32.yaml diff --git a/tests/components/dallas/test.esp8266.yaml b/tests/components/dallas_temp/test.esp8266.yaml similarity index 100% rename from tests/components/dallas/test.esp8266.yaml rename to tests/components/dallas_temp/test.esp8266.yaml diff --git a/tests/components/dallas/test.rp2040.yaml b/tests/components/dallas_temp/test.rp2040.yaml similarity index 100% rename from tests/components/dallas/test.rp2040.yaml rename to tests/components/dallas_temp/test.rp2040.yaml diff --git a/tests/test1.yaml b/tests/test1.yaml index 2dacfda536..79cb1bba2b 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -315,11 +315,6 @@ as5600: slow_filter: 8x fast_filter: lsb6 -dallas: - pin: - allow_other_uses: true - number: GPIO23 - as3935_spi: cs_pin: ignore_strapping_warning: true @@ -714,13 +709,6 @@ sensor: update_interval: 15s iir_filter: 16x i2c_id: i2c_bus - - platform: dallas - address: 0x1C0000031EDD2A28 - name: Living Room Temperature - resolution: 9 - - platform: dallas - index: 1 - name: Living Room Temperature 2 - platform: dht pin: allow_other_uses: true From e2784d077dea978ba449759be6449f8d9fdde47e Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:20 +1000 Subject: [PATCH 024/151] [he60r] Don't publish state unless it has changed. [BUGFIX] (#6869) --- esphome/components/he60r/he60r.cpp | 46 ++++++++++++++---------------- esphome/components/he60r/he60r.h | 7 ++--- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/esphome/components/he60r/he60r.cpp b/esphome/components/he60r/he60r.cpp index 05f3f528a5..83e895543d 100644 --- a/esphome/components/he60r/he60r.cpp +++ b/esphome/components/he60r/he60r.cpp @@ -56,7 +56,7 @@ void HE60rCover::endstop_reached_(CoverOperation operation) { this->position = new_position; this->current_operation = COVER_OPERATION_IDLE; if (this->last_command_ == operation) { - float dur = (now - this->start_dir_time_) / 1e3f; + float dur = (float) (now - this->start_dir_time_) / 1e3f; ESP_LOGD(TAG, "'%s' - %s endstop reached. Took %.1fs.", this->name_.c_str(), operation == COVER_OPERATION_OPENING ? "Open" : "Close", dur); } @@ -69,7 +69,6 @@ void HE60rCover::set_current_operation_(cover::CoverOperation operation) { this->current_operation = operation; if (operation != COVER_OPERATION_IDLE) this->last_recompute_time_ = millis(); - this->publish_state(); } } @@ -129,7 +128,7 @@ void HE60rCover::update_() { if (this->toggles_needed_ != 0) { if ((this->counter_++ & 0x3) == 0) { this->toggles_needed_--; - ESP_LOGD(TAG, "Writing byte 0x30, still needed=%" PRIu32, this->toggles_needed_); + ESP_LOGD(TAG, "Writing byte 0x30, still needed=%u", this->toggles_needed_); this->write_byte(TOGGLE_BYTE); } else { this->write_byte(QUERY_BYTE); @@ -235,31 +234,28 @@ void HE60rCover::recompute_position_() { return; const uint32_t now = millis(); - float dir; - float action_dur; - - switch (this->current_operation) { - case COVER_OPERATION_OPENING: - dir = 1.0f; - action_dur = this->open_duration_; - break; - case COVER_OPERATION_CLOSING: - dir = -1.0f; - action_dur = this->close_duration_; - break; - default: - return; - } - if (now > this->last_recompute_time_) { - auto diff = now - last_recompute_time_; - auto delta = dir * diff / action_dur; + auto diff = (unsigned) (now - last_recompute_time_); + float delta; + switch (this->current_operation) { + case COVER_OPERATION_OPENING: + delta = (float) diff / (float) this->open_duration_; + break; + case COVER_OPERATION_CLOSING: + delta = -(float) diff / (float) this->close_duration_; + break; + default: + return; + } + // make sure our guesstimate never reaches full open or close. - this->position = clamp(delta + this->position, COVER_CLOSED + 0.01f, COVER_OPEN - 0.01f); - ESP_LOGD(TAG, "Recompute %dms, dir=%f, action_dur=%f, delta=%f, pos=%f", (int) diff, dir, action_dur, delta, - this->position); + auto new_position = clamp(delta + this->position, COVER_CLOSED + 0.01f, COVER_OPEN - 0.01f); + ESP_LOGD(TAG, "Recompute %ums, dir=%u, delta=%f, pos=%f", diff, this->current_operation, delta, new_position); this->last_recompute_time_ = now; - this->publish_state(); + if (this->position != new_position) { + this->position = new_position; + this->publish_state(); + } } } diff --git a/esphome/components/he60r/he60r.h b/esphome/components/he60r/he60r.h index 624b61fc65..e41e2203c1 100644 --- a/esphome/components/he60r/he60r.h +++ b/esphome/components/he60r/he60r.h @@ -25,15 +25,14 @@ class HE60rCover : public cover::Cover, public Component, public uart::UARTDevic void control(const cover::CoverCall &call) override; bool is_at_target_() const; void start_direction_(cover::CoverOperation dir); - void update_operation_(cover::CoverOperation dir); void endstop_reached_(cover::CoverOperation operation); void recompute_position_(); void set_current_operation_(cover::CoverOperation operation); void process_rx_(uint8_t data); - uint32_t open_duration_{0}; - uint32_t close_duration_{0}; - uint32_t toggles_needed_{0}; + unsigned open_duration_{0}; + unsigned close_duration_{0}; + unsigned toggles_needed_{0}; cover::CoverOperation next_direction_{cover::COVER_OPERATION_IDLE}; cover::CoverOperation last_command_{cover::COVER_OPERATION_IDLE}; uint32_t last_recompute_time_{0}; From 699d00e21850c813e3f995c7d4fec0411cd58ef7 Mon Sep 17 00:00:00 2001 From: guillempages Date: Wed, 12 Jun 2024 03:11:00 +0200 Subject: [PATCH 025/151] [image] Make PIL import local (#6864) --- esphome/components/image/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/image/__init__.py b/esphome/components/image/__init__.py index b23ed3445a..c275136427 100644 --- a/esphome/components/image/__init__.py +++ b/esphome/components/image/__init__.py @@ -9,8 +9,6 @@ import re import requests from magic import Magic -from PIL import Image - from esphome import core from esphome.components import font from esphome import external_files @@ -267,6 +265,9 @@ CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, IMAGE_SCHEMA) def load_svg_image(file: bytes, resize: tuple[int, int]): + # Local import only to allow "validate_pillow_installed" to run *before* importing it + from PIL import Image + # This import is only needed in case of SVG images; adding it # to the top would force configurations not using SVG to also have it # installed for no reason. @@ -286,6 +287,9 @@ def load_svg_image(file: bytes, resize: tuple[int, int]): async def to_code(config): + # Local import only to allow "validate_pillow_installed" to run *before* importing it + from PIL import Image + conf_file = config[CONF_FILE] if conf_file[CONF_SOURCE] == SOURCE_LOCAL: From 7b9fb57bb22a86a15ae4f637b886ef3e415c75f4 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:15:57 +1000 Subject: [PATCH 026/151] [config] Retain path information in validated configuration (#6785) --- esphome/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/config.py b/esphome/config.py index 2b231fc402..afb7207edb 100644 --- a/esphome/config.py +++ b/esphome/config.py @@ -23,7 +23,7 @@ from esphome.const import ( CONF_EXTERNAL_COMPONENTS, TARGET_PLATFORMS, ) -from esphome.core import CORE, EsphomeError +from esphome.core import CORE, EsphomeError, DocumentRange from esphome.helpers import indent from esphome.util import safe_print, OrderedDict @@ -184,7 +184,7 @@ class Config(OrderedDict, fv.FinalValidateConfig): def get_deepest_document_range_for_path( self, path: ConfigPath, get_key: bool = False - ) -> ESPHomeDataBase | None: + ) -> DocumentRange | None: data = self doc_range = None for index, path_item in enumerate(path): @@ -1123,4 +1123,4 @@ def read_config(command_line_substitutions): safe_print("") return None - return OrderedDict(res) + return res From 4bf7c9708852758237b8da13c77c5bd568b7cdc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Wed, 12 Jun 2024 03:19:18 +0200 Subject: [PATCH 027/151] WebSocket overrides check_origin for reverse proxy configuration (#6845) --- esphome/dashboard/web_server.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/esphome/dashboard/web_server.py b/esphome/dashboard/web_server.py index 9ee2312781..33c83ffb1a 100644 --- a/esphome/dashboard/web_server.py +++ b/esphome/dashboard/web_server.py @@ -17,6 +17,7 @@ import time from collections.abc import Iterable from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, TypeVar +from urllib.parse import urlparse import tornado import tornado.concurrent @@ -166,6 +167,18 @@ class EsphomeCommandWebSocket(tornado.websocket.WebSocketHandler): # use Popen() with a reading thread instead self._use_popen = os.name == "nt" + def check_origin(self, origin): + if "ESPHOME_TRUSTED_DOMAINS" not in os.environ: + return super().check_origin(origin) + trusted_domains = [ + s.strip() for s in os.environ["ESPHOME_TRUSTED_DOMAINS"].split(",") + ] + url = urlparse(origin) + if url.hostname in trusted_domains: + return True + _LOGGER.info("check_origin %s, domain is not trusted", origin) + return False + def open(self, *args: str, **kwargs: str) -> None: """Handle new WebSocket connection.""" # Ensure messages from the subprocess are sent immediately From 7c843437a70f825d71e2198bf17fd8e5d1d48db5 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:26:43 +1000 Subject: [PATCH 028/151] [config] Early termination of validation steps on error (#6837) --- esphome/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/config.py b/esphome/config.py index afb7207edb..925a31fed0 100644 --- a/esphome/config.py +++ b/esphome/config.py @@ -139,7 +139,7 @@ class Config(OrderedDict, fv.FinalValidateConfig): ) def run_validation_steps(self): - while self._validation_tasks: + while self._validation_tasks and not self.errors: task = heapq.heappop(self._validation_tasks) task.step.run(self) From e2c1af199c4b6504350fb0a133ea450a470165b1 Mon Sep 17 00:00:00 2001 From: Tudor Sandu Date: Tue, 11 Jun 2024 18:39:01 -0700 Subject: [PATCH 029/151] Fix media_player.volume_set when media player is not started (#6859) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- .../media_player/i2s_audio_media_player.cpp | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp index 5140a923b4..34ed5b02a0 100644 --- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp @@ -37,38 +37,14 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) { this->set_volume_(volume); this->unmute_(); } - if (this->i2s_state_ != I2S_STATE_RUNNING) { - return; - } if (call.get_command().has_value()) { switch (call.get_command().value()) { - case media_player::MEDIA_PLAYER_COMMAND_PLAY: - if (!this->audio_->isRunning()) - this->audio_->pauseResume(); - this->state = play_state; - break; - case media_player::MEDIA_PLAYER_COMMAND_PAUSE: - if (this->audio_->isRunning()) - this->audio_->pauseResume(); - this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; - break; - case media_player::MEDIA_PLAYER_COMMAND_STOP: - this->stop(); - break; case media_player::MEDIA_PLAYER_COMMAND_MUTE: this->mute_(); break; case media_player::MEDIA_PLAYER_COMMAND_UNMUTE: this->unmute_(); break; - case media_player::MEDIA_PLAYER_COMMAND_TOGGLE: - this->audio_->pauseResume(); - if (this->audio_->isRunning()) { - this->state = media_player::MEDIA_PLAYER_STATE_PLAYING; - } else { - this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; - } - break; case media_player::MEDIA_PLAYER_COMMAND_VOLUME_UP: { float new_volume = this->volume + 0.1f; if (new_volume > 1.0f) @@ -85,6 +61,36 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) { this->unmute_(); break; } + default: + break; + } + if (this->i2s_state_ != I2S_STATE_RUNNING) { + return; + } + switch (call.get_command().value()) { + case media_player::MEDIA_PLAYER_COMMAND_PLAY: + if (!this->audio_->isRunning()) + this->audio_->pauseResume(); + this->state = play_state; + break; + case media_player::MEDIA_PLAYER_COMMAND_PAUSE: + if (this->audio_->isRunning()) + this->audio_->pauseResume(); + this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; + break; + case media_player::MEDIA_PLAYER_COMMAND_STOP: + this->stop(); + break; + case media_player::MEDIA_PLAYER_COMMAND_TOGGLE: + this->audio_->pauseResume(); + if (this->audio_->isRunning()) { + this->state = media_player::MEDIA_PLAYER_STATE_PLAYING; + } else { + this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; + } + break; + default: + break; } } this->publish_state(); From bc408ad08cc8ba8e8ce90f2cabb7b647377e75e9 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:42:01 +1000 Subject: [PATCH 030/151] [display] SDL2 display driver for host platform (#6825) --- .github/workflows/ci.yml | 2 +- CODEOWNERS | 1 + esphome/components/sdl/__init__.py | 1 + esphome/components/sdl/display.py | 72 ++++++++++++++ esphome/components/sdl/sdl_esphome.cpp | 96 +++++++++++++++++++ esphome/components/sdl/sdl_esphome.h | 54 +++++++++++ .../components/sdl/touchscreen/__init__.py | 22 +++++ .../sdl/touchscreen/sdl_touchscreen.h | 26 +++++ tests/components/sdl/common.yaml | 12 +++ tests/components/sdl/test.host.yaml | 1 + 10 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 esphome/components/sdl/__init__.py create mode 100644 esphome/components/sdl/display.py create mode 100644 esphome/components/sdl/sdl_esphome.cpp create mode 100644 esphome/components/sdl/sdl_esphome.h create mode 100644 esphome/components/sdl/touchscreen/__init__.py create mode 100644 esphome/components/sdl/touchscreen/sdl_touchscreen.h create mode 100644 tests/components/sdl/common.yaml create mode 100644 tests/components/sdl/test.host.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b3c80cb35..5a1887c33c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -455,7 +455,7 @@ jobs: file: ${{ fromJson(needs.list-components.outputs.components) }} steps: - name: Install libsodium - run: sudo apt-get install libsodium-dev + run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub uses: actions/checkout@v4.1.6 diff --git a/CODEOWNERS b/CODEOWNERS index 75ea4fe523..5c14d30371 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -320,6 +320,7 @@ esphome/components/rtttl/* @glmnet esphome/components/safe_mode/* @jsuanet @kbx81 @paulmonigatti esphome/components/scd4x/* @martgras @sjtrny esphome/components/script/* @esphome/core +esphome/components/sdl/* @clydebarrow esphome/components/sdm_meter/* @jesserockz @polyfaces esphome/components/sdp3x/* @Azimath esphome/components/seeed_mr24hpc1/* @limengdu diff --git a/esphome/components/sdl/__init__.py b/esphome/components/sdl/__init__.py new file mode 100644 index 0000000000..c58ce8a01e --- /dev/null +++ b/esphome/components/sdl/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@clydebarrow"] diff --git a/esphome/components/sdl/display.py b/esphome/components/sdl/display.py new file mode 100644 index 0000000000..18dc570f88 --- /dev/null +++ b/esphome/components/sdl/display.py @@ -0,0 +1,72 @@ +import subprocess + +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import display +from esphome.const import ( + CONF_ID, + CONF_DIMENSIONS, + CONF_WIDTH, + CONF_HEIGHT, + CONF_LAMBDA, + PLATFORM_HOST, +) + +sdl_ns = cg.esphome_ns.namespace("sdl") +Sdl = sdl_ns.class_("Sdl", display.Display, cg.Component) + + +CONF_SDL_OPTIONS = "sdl_options" +CONF_SDL_ID = "sdl_id" + + +def get_sdl_options(value): + if value != "": + return value + try: + return subprocess.check_output(["sdl2-config", "--cflags", "--libs"]).decode() + except Exception as e: + raise cv.Invalid("Unable to run sdl2-config - have you installed sdl2?") from e + + +CONFIG_SCHEMA = cv.All( + display.FULL_DISPLAY_SCHEMA.extend( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(Sdl), + cv.Optional(CONF_SDL_OPTIONS, default=""): get_sdl_options, + cv.Required(CONF_DIMENSIONS): cv.Any( + cv.dimensions, + cv.Schema( + { + cv.Required(CONF_WIDTH): cv.int_, + cv.Required(CONF_HEIGHT): cv.int_, + } + ), + ), + } + ) + ), + cv.only_on(PLATFORM_HOST), +) + + +async def to_code(config): + for option in config[CONF_SDL_OPTIONS].split(): + cg.add_build_flag(option) + cg.add_build_flag("-DSDL_BYTEORDER=4321") + var = cg.new_Pvariable(config[CONF_ID]) + await display.register_display(var, config) + + dimensions = config[CONF_DIMENSIONS] + if isinstance(dimensions, dict): + cg.add(var.set_dimensions(dimensions[CONF_WIDTH], dimensions[CONF_HEIGHT])) + else: + (width, height) = dimensions + cg.add(var.set_dimensions(width, height)) + + if lamb := config.get(CONF_LAMBDA): + lambda_ = await cg.process_lambda( + lamb, [(display.DisplayRef, "it")], return_type=cg.void + ) + cg.add(var.set_writer(lambda_)) diff --git a/esphome/components/sdl/sdl_esphome.cpp b/esphome/components/sdl/sdl_esphome.cpp new file mode 100644 index 0000000000..5e17ca5650 --- /dev/null +++ b/esphome/components/sdl/sdl_esphome.cpp @@ -0,0 +1,96 @@ +#ifdef USE_HOST +#include "sdl_esphome.h" +#include "esphome/components/display/display_color_utils.h" + +namespace esphome { +namespace sdl { + +void Sdl::setup() { + ESP_LOGD(TAG, "Starting setup"); + SDL_Init(SDL_INIT_VIDEO); + this->window_ = SDL_CreateWindow(App.get_name().c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + this->width_, this->height_, 0); + this->renderer_ = SDL_CreateRenderer(this->window_, -1, SDL_RENDERER_SOFTWARE); + this->texture_ = + SDL_CreateTexture(this->renderer_, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STATIC, this->width_, this->height_); + SDL_SetTextureBlendMode(this->texture_, SDL_BLENDMODE_BLEND); + ESP_LOGD(TAG, "Setup Complete"); +} +void Sdl::update() { + this->do_update_(); + if ((this->x_high_ < this->x_low_) || (this->y_high_ < this->y_low_)) + return; + SDL_Rect rect{this->x_low_, this->y_low_, this->x_high_ + 1 - this->x_low_, this->y_high_ + 1 - this->y_low_}; + this->x_low_ = this->width_; + this->y_low_ = this->height_; + this->x_high_ = 0; + this->y_high_ = 0; + SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); + SDL_RenderPresent(this->renderer_); +} + +void Sdl::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order, + display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) { + SDL_Rect rect{x_start, y_start, w, h}; + if (this->rotation_ != display::DISPLAY_ROTATION_0_DEGREES || bitness != display::COLOR_BITNESS_565 || big_endian) { + display::Display::draw_pixels_at(x_start, y_start, w, h, ptr, order, bitness, big_endian, x_offset, y_offset, + x_pad); + } else { + auto stride = x_offset + w + x_pad; + auto data = ptr + (stride * y_offset + x_offset) * 2; + SDL_UpdateTexture(this->texture_, &rect, data, stride * 2); + } + SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); + SDL_RenderPresent(this->renderer_); +} + +void Sdl::draw_pixel_at(int x, int y, Color color) { + SDL_Rect rect{x, y, 1, 1}; + auto data = (display::ColorUtil::color_to_565(color, display::COLOR_ORDER_RGB)); + SDL_UpdateTexture(this->texture_, &rect, &data, 2); + if (x < this->x_low_) + this->x_low_ = x; + if (y < this->y_low_) + this->y_low_ = y; + if (x > this->x_high_) + this->x_high_ = x; + if (y > this->y_high_) + this->y_high_ = y; +} + +void Sdl::loop() { + SDL_Event e; + if (SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_QUIT: + exit(0); + + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + if (e.button.button == 1) { + this->mouse_x = e.button.x; + this->mouse_y = e.button.y; + this->mouse_down = e.button.state != 0; + } + break; + + case SDL_MOUSEMOTION: + if (e.motion.state & 1) { + this->mouse_x = e.button.x; + this->mouse_y = e.button.y; + this->mouse_down = true; + } else { + this->mouse_down = false; + } + break; + + default: + ESP_LOGV(TAG, "Event %d", e.type); + break; + } + } +} + +} // namespace sdl +} // namespace esphome +#endif diff --git a/esphome/components/sdl/sdl_esphome.h b/esphome/components/sdl/sdl_esphome.h new file mode 100644 index 0000000000..e4b2d9dd9f --- /dev/null +++ b/esphome/components/sdl/sdl_esphome.h @@ -0,0 +1,54 @@ +#pragma once + +#ifdef USE_HOST +#include "esphome/core/component.h" +#include "esphome/core/log.h" +#include "esphome/core/application.h" +#include "esphome/components/display/display.h" +#define SDL_MAIN_HANDLED +#include "SDL.h" + +namespace esphome { +namespace sdl { + +constexpr static const char *const TAG = "sdl"; + +class Sdl : public display::Display { + public: + display::DisplayType get_display_type() override { return display::DISPLAY_TYPE_COLOR; } + void update() override; + void loop() override; + void setup() override; + void draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order, + display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override; + void draw_pixel_at(int x, int y, Color color) override; + void set_dimensions(uint16_t width, uint16_t height) { + this->width_ = width; + this->height_ = height; + } + int get_width() override { return this->width_; } + int get_height() override { return this->height_; } + float get_setup_priority() const override { return setup_priority::HARDWARE; } + void dump_config() override { LOG_DISPLAY("", "SDL", this); } + + int mouse_x{}; + int mouse_y{}; + bool mouse_down{}; + + protected: + int get_width_internal() override { return this->width_; } + int get_height_internal() override { return this->height_; } + int width_{}; + int height_{}; + SDL_Renderer *renderer_{}; + SDL_Window *window_{}; + SDL_Texture *texture_{}; + uint16_t x_low_{0}; + uint16_t y_low_{0}; + uint16_t x_high_{0}; + uint16_t y_high_{0}; +}; +} // namespace sdl +} // namespace esphome + +#endif diff --git a/esphome/components/sdl/touchscreen/__init__.py b/esphome/components/sdl/touchscreen/__init__.py new file mode 100644 index 0000000000..d6c0ed1c03 --- /dev/null +++ b/esphome/components/sdl/touchscreen/__init__.py @@ -0,0 +1,22 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID + +from esphome.components import touchscreen +from ..display import Sdl, sdl_ns, CONF_SDL_ID + +SdlTouchscreen = sdl_ns.class_("SdlTouchscreen", touchscreen.Touchscreen) + + +CONFIG_SCHEMA = touchscreen.TOUCHSCREEN_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(SdlTouchscreen), + cv.GenerateID(CONF_SDL_ID): cv.use_id(Sdl), + } +) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_parented(var, config[CONF_SDL_ID]) + await touchscreen.register_touchscreen(var, config) diff --git a/esphome/components/sdl/touchscreen/sdl_touchscreen.h b/esphome/components/sdl/touchscreen/sdl_touchscreen.h new file mode 100644 index 0000000000..a1f0fb15e3 --- /dev/null +++ b/esphome/components/sdl/touchscreen/sdl_touchscreen.h @@ -0,0 +1,26 @@ +#pragma once + +#ifdef USE_HOST +#include "../sdl_esphome.h" +#include "esphome/components/touchscreen/touchscreen.h" + +namespace esphome { +namespace sdl { + +class SdlTouchscreen : public touchscreen::Touchscreen, public Parented { + public: + void setup() override { + this->x_raw_max_ = this->display_->get_width(); + this->y_raw_max_ = this->display_->get_height(); + } + + void update_touches() override { + if (this->parent_->mouse_down) { + add_raw_touch_position_(0, this->parent_->mouse_x, this->parent_->mouse_y); + } + } +}; + +} // namespace sdl +} // namespace esphome +#endif diff --git a/tests/components/sdl/common.yaml b/tests/components/sdl/common.yaml new file mode 100644 index 0000000000..0192f054b5 --- /dev/null +++ b/tests/components/sdl/common.yaml @@ -0,0 +1,12 @@ +host: + mac_address: "62:23:45:AF:B3:DD" + +display: + - platform: sdl + id: sdl_display + update_interval: 1s + auto_clear_enabled: false + show_test_card: true + dimensions: + width: 450 + height: 600 diff --git a/tests/components/sdl/test.host.yaml b/tests/components/sdl/test.host.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/sdl/test.host.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From f25c2963037a7d165e11eac1a874c9da2674e7c6 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:47:52 +1000 Subject: [PATCH 031/151] [ili9xxx] Implement st7735 support (#6838) --- esphome/components/ili9xxx/display.py | 2 + esphome/components/ili9xxx/ili9xxx_defines.h | 2 + .../components/ili9xxx/ili9xxx_display.cpp | 18 +++++-- esphome/components/ili9xxx/ili9xxx_display.h | 10 +++- esphome/components/ili9xxx/ili9xxx_init.h | 51 +++++++++++++++++++ 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/esphome/components/ili9xxx/display.py b/esphome/components/ili9xxx/display.py index f0ac5ba9ef..483f2b886c 100644 --- a/esphome/components/ili9xxx/display.py +++ b/esphome/components/ili9xxx/display.py @@ -69,6 +69,7 @@ MODELS = { "ILI9486": ili9xxx_ns.class_("ILI9XXXILI9486", ILI9XXXDisplay), "ILI9488": ili9xxx_ns.class_("ILI9XXXILI9488", ILI9XXXDisplay), "ILI9488_A": ili9xxx_ns.class_("ILI9XXXILI9488A", ILI9XXXDisplay), + "ST7735": ili9xxx_ns.class_("ILI9XXXST7735", ILI9XXXDisplay), "ST7796": ili9xxx_ns.class_("ILI9XXXST7796", ILI9XXXDisplay), "ST7789V": ili9xxx_ns.class_("ILI9XXXST7789V", ILI9XXXDisplay), "S3BOX": ili9xxx_ns.class_("ILI9XXXS3Box", ILI9XXXDisplay), @@ -134,6 +135,7 @@ def _validate(config): "ILI9341", "ILI9342", "ST7789V", + "ST7735", ]: raise cv.Invalid("Selected model can't run on ESP8266.") diff --git a/esphome/components/ili9xxx/ili9xxx_defines.h b/esphome/components/ili9xxx/ili9xxx_defines.h index 29483ee15e..744013db3d 100644 --- a/esphome/components/ili9xxx/ili9xxx_defines.h +++ b/esphome/components/ili9xxx/ili9xxx_defines.h @@ -70,6 +70,7 @@ static const uint8_t ILI9XXX_PWCTR2 = 0xC1; static const uint8_t ILI9XXX_PWCTR3 = 0xC2; static const uint8_t ILI9XXX_PWCTR4 = 0xC3; static const uint8_t ILI9XXX_PWCTR5 = 0xC4; +static const uint8_t ILI9XXX_PWCTR6 = 0xF6; static const uint8_t ILI9XXX_VMCTR1 = 0xC5; static const uint8_t ILI9XXX_IFCTR = 0xC6; static const uint8_t ILI9XXX_VMCTR2 = 0xC7; @@ -91,6 +92,7 @@ static const uint8_t ILI9XXX_GMCTRN1 = 0xE1; static const uint8_t ILI9XXX_CSCON = 0xF0; static const uint8_t ILI9XXX_ADJCTL3 = 0xF7; +static const uint8_t ILI9XXX_DELAY = 0xFF; // followed by one byte of delay time in ms } // namespace ili9xxx } // namespace esphome diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index 463e3dd851..21d46ea825 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -411,11 +411,19 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { uint8_t cmd, x, num_args; while ((cmd = *addr++) != 0) { x = *addr++; - num_args = x & 0x7F; - this->send_command(cmd, addr, num_args); - addr += num_args; - if (x & 0x80) - delay(150); // NOLINT + if (cmd == ILI9XXX_DELAY) { + ESP_LOGD(TAG, "Delay %dms", x); + delay(x); + } else { + num_args = x & 0x7F; + ESP_LOGD(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, *addr); + this->send_command(cmd, addr, num_args); + addr += num_args; + if (x & 0x80) { + ESP_LOGD(TAG, "Delay 150ms"); + delay(150); // NOLINT + } + } } } diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index 4446686e7b..7a320dac7b 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -35,7 +35,6 @@ class ILI9XXXDisplay : public display::DisplayBuffer, while ((cmd = *addr++) != 0) { num_args = *addr++ & 0x7F; bits = *addr; - esph_log_d(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, bits); switch (cmd) { case ILI9XXX_MADCTL: { this->swap_xy_ = (bits & MADCTL_MV) != 0; @@ -51,6 +50,9 @@ class ILI9XXXDisplay : public display::DisplayBuffer, break; } + case ILI9XXX_DELAY: + continue; // no args to skip + default: break; } @@ -269,5 +271,11 @@ class ILI9XXXGC9A01A : public ILI9XXXDisplay { ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} }; +//----------- ILI9XXX_24_TFT display -------------- +class ILI9XXXST7735 : public ILI9XXXDisplay { + public: + ILI9XXXST7735() : ILI9XXXDisplay(INITCMD_ST7735, 128, 160, false) {} +}; + } // namespace ili9xxx } // namespace esphome diff --git a/esphome/components/ili9xxx/ili9xxx_init.h b/esphome/components/ili9xxx/ili9xxx_init.h index ea90f83f30..260bde4c80 100644 --- a/esphome/components/ili9xxx/ili9xxx_init.h +++ b/esphome/components/ili9xxx/ili9xxx_init.h @@ -370,6 +370,57 @@ static const uint8_t PROGMEM INITCMD_GC9A01A[] = { 0x00 // End of list }; +static const uint8_t PROGMEM INITCMD_ST7735[] = { + ILI9XXX_SWRESET, 0, // Soft reset, then delay 10ms + ILI9XXX_DELAY, 10, + ILI9XXX_SLPOUT , 0, // Exit Sleep, delay + ILI9XXX_DELAY, 10, + ILI9XXX_PIXFMT , 1, 0x05, + ILI9XXX_FRMCTR1, 3, // 4: Frame rate control, 3 args + delay: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ILI9XXX_FRMCTR2, 3, // 4: Framerate ctrl - idle mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ILI9XXX_FRMCTR3, 6, // 5: Framerate - partial mode, 6 args: + 0x01, 0x2C, 0x2D, // Dot inversion mode + 0x01, 0x2C, 0x2D, // Line inversion mode + + ILI9XXX_INVCTR, 1, // 7: Display inversion control, 1 arg: + 0x7, // Line inversion + ILI9XXX_PWCTR1, 3, // 7: Power control, 3 args, no delay: + 0xA2, + 0x02, // -4.6V + 0x84, // AUTO mode + ILI9XXX_PWCTR2, 1, // 8: Power control, 1 arg, no delay: + 0xC5, // VGH25=2.4C VGSEL=-10 VGH=3 * AVDD + ILI9XXX_PWCTR3, 2, // 9: Power control, 2 args, no delay: + 0x0A, // Opamp current small + 0x00, // Boost frequency + ILI9XXX_PWCTR4, 2, // 10: Power control, 2 args, no delay: + 0x8A, // BCLK/2, + 0x2A, // opamp current small & medium low + ILI9XXX_PWCTR5, 2, // 11: Power control, 2 args, no delay: + 0x8A, 0xEE, + + ILI9XXX_VMCTR1, 1, // 11: Power control, 2 args + delay: + 0x0E, + ILI9XXX_GMCTRP1, 16, // 13: Gamma Adjustments (pos. polarity), 16 args + delay: + 0x02, 0x1c, 0x07, 0x12, // (Not entirely necessary, but provides + 0x37, 0x32, 0x29, 0x2d, // accurate colors) + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + ILI9XXX_GMCTRN1, 16, // 14: Gamma Adjustments (neg. polarity), 16 args + delay: + 0x03, 0x1d, 0x07, 0x06, // (Not entirely necessary, but provides + 0x2E, 0x2C, 0x29, 0x2D, // accurate colors) + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + ILI9XXX_MADCTL , 1, 0x00, // Memory Access Control, BGR + ILI9XXX_NORON , 0, + ILI9XXX_DELAY, 10, + ILI9XXX_DISPON , 0, // Display on + ILI9XXX_DELAY, 10, + 00, // endo of list +}; + // clang-format on } // namespace ili9xxx } // namespace esphome From f9f98fa6c6d2d120efd39721133a7b44c5fd4ee3 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:16:43 +1200 Subject: [PATCH 032/151] Bump version to 2024.6.0b1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index cbd932e3cc..0117e8a238 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0-dev" +__version__ = "2024.6.0b1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From bd7e8fbf86b086d2b1211173d2b20efc0efafb7e Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:16:43 +1200 Subject: [PATCH 033/151] Bump version to 2024.7.0-dev --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index cbd932e3cc..dff14d7cf0 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0-dev" +__version__ = "2024.7.0-dev" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From b401b5eca83b69fc5027deb154cbb2571cfde9c7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:36:57 +1200 Subject: [PATCH 034/151] [CI] Update device class sync script for update entities (#6895) --- script/sync-device_class.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/sync-device_class.py b/script/sync-device_class.py index 12e1bb6a9f..121c89b8f9 100755 --- a/script/sync-device_class.py +++ b/script/sync-device_class.py @@ -10,6 +10,7 @@ from homeassistant.components.event import EventDeviceClass from homeassistant.components.number import NumberDeviceClass from homeassistant.components.sensor import SensorDeviceClass from homeassistant.components.switch import SwitchDeviceClass +from homeassistant.components.update import UpdateDeviceClass from homeassistant.components.valve import ValveDeviceClass # pylint: enable=import-error @@ -27,6 +28,7 @@ DOMAINS = { "number": NumberDeviceClass, "sensor": SensorDeviceClass, "switch": SwitchDeviceClass, + "update": UpdateDeviceClass, "valve": ValveDeviceClass, } From 2044c7e4d4506b840dd2978d2fce5e455d304627 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:58:56 +1200 Subject: [PATCH 035/151] [CI] Fix for sdl (#6892) --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a1887c33c..b49237db26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -454,7 +454,7 @@ jobs: matrix: file: ${{ fromJson(needs.list-components.outputs.components) }} steps: - - name: Install libsodium + - name: Install dependencies run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub @@ -508,8 +508,8 @@ jobs: - name: List components run: echo ${{ matrix.components }} - - name: Install libsodium - run: sudo apt-get install libsodium-dev + - name: Install dependencies + run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub uses: actions/checkout@v4.1.6 From df52bc3493c9834e2fc327e433c0368c58733c51 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:26 +0200 Subject: [PATCH 036/151] Add step_delay option to X9C component (#6890) --- esphome/components/x9c/output.py | 3 +++ esphome/components/x9c/x9c.cpp | 5 +++-- esphome/components/x9c/x9c.h | 2 ++ esphome/const.py | 1 + tests/components/x9c/test.esp32-c3-idf.yaml | 1 + tests/components/x9c/test.esp32-c3.yaml | 1 + tests/components/x9c/test.esp32-idf.yaml | 1 + tests/components/x9c/test.esp32.yaml | 1 + tests/components/x9c/test.esp8266.yaml | 1 + tests/components/x9c/test.rp2040.yaml | 1 + 10 files changed, 15 insertions(+), 2 deletions(-) diff --git a/esphome/components/x9c/output.py b/esphome/components/x9c/output.py index 44e9d729b3..56820efdfa 100644 --- a/esphome/components/x9c/output.py +++ b/esphome/components/x9c/output.py @@ -8,6 +8,7 @@ from esphome.const import ( CONF_INC_PIN, CONF_UD_PIN, CONF_INITIAL_VALUE, + CONF_STEP_DELAY, ) CODEOWNERS = ["@EtienneMD"] @@ -26,6 +27,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_INITIAL_VALUE, default=1.0): cv.float_range( min=0.01, max=1.0 ), + cv.Optional(CONF_STEP_DELAY, default=1): cv.int_range(min=1, max=100), } ) ) @@ -44,3 +46,4 @@ async def to_code(config): cg.add(var.set_ud_pin(ud_pin)) cg.add(var.set_initial_value(config[CONF_INITIAL_VALUE])) + cg.add(var.set_step_delay(config[CONF_STEP_DELAY])) diff --git a/esphome/components/x9c/x9c.cpp b/esphome/components/x9c/x9c.cpp index 32a1375f02..4e7a94266e 100644 --- a/esphome/components/x9c/x9c.cpp +++ b/esphome/components/x9c/x9c.cpp @@ -22,9 +22,9 @@ void X9cOutput::trim_value(int change_amount) { for (int i = 0; i < abs(change_amount); i++) { // Move wiper this->inc_pin_->digital_write(true); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); this->inc_pin_->digital_write(false); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); } delayMicroseconds(100); // Let value settle @@ -69,6 +69,7 @@ void X9cOutput::dump_config() { LOG_PIN(" Increment Pin: ", this->inc_pin_); LOG_PIN(" Up/Down Pin: ", this->ud_pin_); ESP_LOGCONFIG(TAG, " Initial Value: %f", this->initial_value_); + ESP_LOGCONFIG(TAG, " Step Delay: %d", this->step_delay_); LOG_FLOAT_OUTPUT(this); } diff --git a/esphome/components/x9c/x9c.h b/esphome/components/x9c/x9c.h index 924460c841..e7cc29a6cc 100644 --- a/esphome/components/x9c/x9c.h +++ b/esphome/components/x9c/x9c.h @@ -13,6 +13,7 @@ class X9cOutput : public output::FloatOutput, public Component { void set_inc_pin(InternalGPIOPin *pin) { inc_pin_ = pin; } void set_ud_pin(InternalGPIOPin *pin) { ud_pin_ = pin; } void set_initial_value(float initial_value) { initial_value_ = initial_value; } + void set_step_delay(int step_delay) { step_delay_ = step_delay; } void setup() override; void dump_config() override; @@ -26,6 +27,7 @@ class X9cOutput : public output::FloatOutput, public Component { InternalGPIOPin *ud_pin_; float initial_value_; float pot_value_; + int step_delay_; }; } // namespace x9c diff --git a/esphome/const.py b/esphome/const.py index dff14d7cf0..9c4e451029 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -784,6 +784,7 @@ CONF_STATIC_IP = "static_ip" CONF_STATUS = "status" CONF_STB_PIN = "stb_pin" CONF_STEP = "step" +CONF_STEP_DELAY = "step_delay" CONF_STEP_MODE = "step_mode" CONF_STEP_PIN = "step_pin" CONF_STOP = "stop" diff --git a/tests/components/x9c/test.esp32-c3-idf.yaml b/tests/components/x9c/test.esp32-c3-idf.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3-idf.yaml +++ b/tests/components/x9c/test.esp32-c3-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3.yaml +++ b/tests/components/x9c/test.esp32-c3.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-idf.yaml b/tests/components/x9c/test.esp32-idf.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32-idf.yaml +++ b/tests/components/x9c/test.esp32-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32.yaml +++ b/tests/components/x9c/test.esp32.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp8266.yaml +++ b/tests/components/x9c/test.esp8266.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.rp2040.yaml +++ b/tests/components/x9c/test.rp2040.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 From 1a242f94db4923b099496497ba6e98b5f72e745d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:20:46 +1200 Subject: [PATCH 037/151] [host] Execute host program when using run command (#6897) --- esphome/__main__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/__main__.py b/esphome/__main__.py index f3c4ff3e23..5ff1a28ec7 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -488,6 +488,15 @@ def command_run(args, config): if exit_code != 0: return exit_code _LOGGER.info("Successfully compiled program.") + if CORE.is_host: + from esphome.platformio_api import get_idedata + + idedata = get_idedata(config) + if idedata is None: + return 1 + program_path = idedata.raw["prog_path"] + return run_external_process(program_path) + port = choose_upload_log_host( default=args.device, check_default=None, From 68dbf35b096be83e46e3fc7e82ae3100d2866ac2 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Wed, 12 Jun 2024 20:14:03 +0200 Subject: [PATCH 038/151] X9C step delay with units (#6898) --- esphome/components/x9c/output.py | 8 +++++++- tests/components/x9c/test.esp32-c3-idf.yaml | 2 +- tests/components/x9c/test.esp32-c3.yaml | 2 +- tests/components/x9c/test.esp32-idf.yaml | 2 +- tests/components/x9c/test.esp32.yaml | 2 +- tests/components/x9c/test.esp8266.yaml | 2 +- tests/components/x9c/test.rp2040.yaml | 2 +- 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/esphome/components/x9c/output.py b/esphome/components/x9c/output.py index 56820efdfa..4497994982 100644 --- a/esphome/components/x9c/output.py +++ b/esphome/components/x9c/output.py @@ -27,7 +27,13 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_INITIAL_VALUE, default=1.0): cv.float_range( min=0.01, max=1.0 ), - cv.Optional(CONF_STEP_DELAY, default=1): cv.int_range(min=1, max=100), + cv.Optional(CONF_STEP_DELAY, default="1us"): cv.All( + cv.positive_time_period_microseconds, + cv.Range( + min=cv.TimePeriod(microseconds=1), + max=cv.TimePeriod(microseconds=100), + ), + ), } ) ) diff --git a/tests/components/x9c/test.esp32-c3-idf.yaml b/tests/components/x9c/test.esp32-c3-idf.yaml index 1234581329..972c743fcd 100644 --- a/tests/components/x9c/test.esp32-c3-idf.yaml +++ b/tests/components/x9c/test.esp32-c3-idf.yaml @@ -5,4 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3.yaml index 1234581329..972c743fcd 100644 --- a/tests/components/x9c/test.esp32-c3.yaml +++ b/tests/components/x9c/test.esp32-c3.yaml @@ -5,4 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp32-idf.yaml b/tests/components/x9c/test.esp32-idf.yaml index 5f1468e94b..f587b69b4f 100644 --- a/tests/components/x9c/test.esp32-idf.yaml +++ b/tests/components/x9c/test.esp32-idf.yaml @@ -5,4 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32.yaml index 5f1468e94b..f587b69b4f 100644 --- a/tests/components/x9c/test.esp32.yaml +++ b/tests/components/x9c/test.esp32.yaml @@ -5,4 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266.yaml index 5f1468e94b..f587b69b4f 100644 --- a/tests/components/x9c/test.esp8266.yaml +++ b/tests/components/x9c/test.esp8266.yaml @@ -5,4 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040.yaml index 1234581329..972c743fcd 100644 --- a/tests/components/x9c/test.rp2040.yaml +++ b/tests/components/x9c/test.rp2040.yaml @@ -5,4 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 - step_delay: 50 + step_delay: 50us From 8453d9a70da397baac09a1b3a158b6d88f27e2ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 09:27:15 +1200 Subject: [PATCH 039/151] Bump actions/checkout from 4.1.6 to 4.1.7 (#6900) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-api-proto.yml | 2 +- .github/workflows/ci-docker.yml | 2 +- .github/workflows/ci.yml | 32 +++++++++++------------ .github/workflows/release.yml | 8 +++--- .github/workflows/sync-device-classes.yml | 4 +-- .github/workflows/yaml-lint.yml | 2 +- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci-api-proto.yml b/.github/workflows/ci-api-proto.yml index 1628464061..ee08a0246d 100644 --- a/.github/workflows/ci-api-proto.yml +++ b/.github/workflows/ci-api-proto.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index dd5c051cfb..421a885f74 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -40,7 +40,7 @@ jobs: arch: [amd64, armv7, aarch64] build_type: ["ha-addon", "docker", "lint"] steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b49237db26..3c10e5dac7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: cache-key: ${{ steps.cache-key.outputs.key }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Generate cache-key id: cache-key run: echo key="${{ hashFiles('requirements.txt', 'requirements_optional.txt', 'requirements_test.txt') }}" >> $GITHUB_OUTPUT @@ -66,7 +66,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -87,7 +87,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -108,7 +108,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -129,7 +129,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -150,7 +150,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -199,7 +199,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -229,7 +229,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -254,7 +254,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Find all YAML test files id: set-matrix run: echo "matrix=$(ls tests/test*.yaml | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT @@ -271,7 +271,7 @@ jobs: file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -303,7 +303,7 @@ jobs: file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -358,7 +358,7 @@ jobs: steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -410,7 +410,7 @@ jobs: count: ${{ steps.list-components.outputs.count }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 with: # Fetch enough history so `git merge-base refs/remotes/origin/dev HEAD` works. fetch-depth: 500 @@ -458,7 +458,7 @@ jobs: run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -484,7 +484,7 @@ jobs: matrix: ${{ steps.split.outputs.components }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Split components into 20 groups id: split run: | @@ -512,7 +512,7 @@ jobs: run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 563d485b6a..9c07335104 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: tag: ${{ steps.tag.outputs.tag }} branch_build: ${{ steps.tag.outputs.branch_build }} steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Get tag id: tag # yamllint disable rule:line-length @@ -51,7 +51,7 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: @@ -83,7 +83,7 @@ jobs: - linux/arm/v7 - linux/arm64 steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: @@ -174,7 +174,7 @@ jobs: - ghcr - dockerhub steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Download digests uses: actions/download-artifact@v4.1.7 diff --git a/.github/workflows/sync-device-classes.yml b/.github/workflows/sync-device-classes.yml index e65e851f3c..45f6b27127 100644 --- a/.github/workflows/sync-device-classes.yml +++ b/.github/workflows/sync-device-classes.yml @@ -13,10 +13,10 @@ jobs: if: github.repository == 'esphome/esphome' steps: - name: Checkout - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Checkout Home Assistant - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 with: repository: home-assistant/core path: lib/home-assistant diff --git a/.github/workflows/yaml-lint.yml b/.github/workflows/yaml-lint.yml index f009643629..1c0b5f58ad 100644 --- a/.github/workflows/yaml-lint.yml +++ b/.github/workflows/yaml-lint.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Run yamllint uses: frenck/action-yamllint@v1.5.0 with: From c4c46c206fd5d8edfab0a2769821db0beaae5908 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:12:36 +1200 Subject: [PATCH 040/151] Bump esphome-dashboard to 20240613.0 (#6901) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 05e46ca31e..a7b08f8a14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240429.1 +esphome-dashboard==20240613.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From fdefc825bb473fedc4fb2b8001ba6ce3f4fe2c7f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:58:56 +1200 Subject: [PATCH 041/151] [CI] Fix for sdl (#6892) --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a1887c33c..b49237db26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -454,7 +454,7 @@ jobs: matrix: file: ${{ fromJson(needs.list-components.outputs.components) }} steps: - - name: Install libsodium + - name: Install dependencies run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub @@ -508,8 +508,8 @@ jobs: - name: List components run: echo ${{ matrix.components }} - - name: Install libsodium - run: sudo apt-get install libsodium-dev + - name: Install dependencies + run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub uses: actions/checkout@v4.1.6 From be486e0ca65bad647289c3a4cfd4d09a09b02e64 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:26 +0200 Subject: [PATCH 042/151] Add step_delay option to X9C component (#6890) --- esphome/components/x9c/output.py | 3 +++ esphome/components/x9c/x9c.cpp | 5 +++-- esphome/components/x9c/x9c.h | 2 ++ esphome/const.py | 1 + tests/components/x9c/test.esp32-c3-idf.yaml | 1 + tests/components/x9c/test.esp32-c3.yaml | 1 + tests/components/x9c/test.esp32-idf.yaml | 1 + tests/components/x9c/test.esp32.yaml | 1 + tests/components/x9c/test.esp8266.yaml | 1 + tests/components/x9c/test.rp2040.yaml | 1 + 10 files changed, 15 insertions(+), 2 deletions(-) diff --git a/esphome/components/x9c/output.py b/esphome/components/x9c/output.py index 44e9d729b3..56820efdfa 100644 --- a/esphome/components/x9c/output.py +++ b/esphome/components/x9c/output.py @@ -8,6 +8,7 @@ from esphome.const import ( CONF_INC_PIN, CONF_UD_PIN, CONF_INITIAL_VALUE, + CONF_STEP_DELAY, ) CODEOWNERS = ["@EtienneMD"] @@ -26,6 +27,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_INITIAL_VALUE, default=1.0): cv.float_range( min=0.01, max=1.0 ), + cv.Optional(CONF_STEP_DELAY, default=1): cv.int_range(min=1, max=100), } ) ) @@ -44,3 +46,4 @@ async def to_code(config): cg.add(var.set_ud_pin(ud_pin)) cg.add(var.set_initial_value(config[CONF_INITIAL_VALUE])) + cg.add(var.set_step_delay(config[CONF_STEP_DELAY])) diff --git a/esphome/components/x9c/x9c.cpp b/esphome/components/x9c/x9c.cpp index 32a1375f02..4e7a94266e 100644 --- a/esphome/components/x9c/x9c.cpp +++ b/esphome/components/x9c/x9c.cpp @@ -22,9 +22,9 @@ void X9cOutput::trim_value(int change_amount) { for (int i = 0; i < abs(change_amount); i++) { // Move wiper this->inc_pin_->digital_write(true); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); this->inc_pin_->digital_write(false); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); } delayMicroseconds(100); // Let value settle @@ -69,6 +69,7 @@ void X9cOutput::dump_config() { LOG_PIN(" Increment Pin: ", this->inc_pin_); LOG_PIN(" Up/Down Pin: ", this->ud_pin_); ESP_LOGCONFIG(TAG, " Initial Value: %f", this->initial_value_); + ESP_LOGCONFIG(TAG, " Step Delay: %d", this->step_delay_); LOG_FLOAT_OUTPUT(this); } diff --git a/esphome/components/x9c/x9c.h b/esphome/components/x9c/x9c.h index 924460c841..e7cc29a6cc 100644 --- a/esphome/components/x9c/x9c.h +++ b/esphome/components/x9c/x9c.h @@ -13,6 +13,7 @@ class X9cOutput : public output::FloatOutput, public Component { void set_inc_pin(InternalGPIOPin *pin) { inc_pin_ = pin; } void set_ud_pin(InternalGPIOPin *pin) { ud_pin_ = pin; } void set_initial_value(float initial_value) { initial_value_ = initial_value; } + void set_step_delay(int step_delay) { step_delay_ = step_delay; } void setup() override; void dump_config() override; @@ -26,6 +27,7 @@ class X9cOutput : public output::FloatOutput, public Component { InternalGPIOPin *ud_pin_; float initial_value_; float pot_value_; + int step_delay_; }; } // namespace x9c diff --git a/esphome/const.py b/esphome/const.py index 0117e8a238..4d0223fa22 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -784,6 +784,7 @@ CONF_STATIC_IP = "static_ip" CONF_STATUS = "status" CONF_STB_PIN = "stb_pin" CONF_STEP = "step" +CONF_STEP_DELAY = "step_delay" CONF_STEP_MODE = "step_mode" CONF_STEP_PIN = "step_pin" CONF_STOP = "stop" diff --git a/tests/components/x9c/test.esp32-c3-idf.yaml b/tests/components/x9c/test.esp32-c3-idf.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3-idf.yaml +++ b/tests/components/x9c/test.esp32-c3-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3.yaml +++ b/tests/components/x9c/test.esp32-c3.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-idf.yaml b/tests/components/x9c/test.esp32-idf.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32-idf.yaml +++ b/tests/components/x9c/test.esp32-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32.yaml +++ b/tests/components/x9c/test.esp32.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp8266.yaml +++ b/tests/components/x9c/test.esp8266.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.rp2040.yaml +++ b/tests/components/x9c/test.rp2040.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 From 91e72fe121acf4d0994bfd084f05e149ce2de92b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:20:46 +1200 Subject: [PATCH 043/151] [host] Execute host program when using run command (#6897) --- esphome/__main__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/__main__.py b/esphome/__main__.py index f3c4ff3e23..5ff1a28ec7 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -488,6 +488,15 @@ def command_run(args, config): if exit_code != 0: return exit_code _LOGGER.info("Successfully compiled program.") + if CORE.is_host: + from esphome.platformio_api import get_idedata + + idedata = get_idedata(config) + if idedata is None: + return 1 + program_path = idedata.raw["prog_path"] + return run_external_process(program_path) + port = choose_upload_log_host( default=args.device, check_default=None, From 73cb3ec852a3bbdca1430578d4bc3cba114eb115 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:12:36 +1200 Subject: [PATCH 044/151] Bump esphome-dashboard to 20240613.0 (#6901) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 05e46ca31e..a7b08f8a14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240429.1 +esphome-dashboard==20240613.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From 3db71b98ae4278fa5f54112e7eb885794c258d6b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:31:08 +1200 Subject: [PATCH 045/151] Bump version to 2024.6.0b2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 4d0223fa22..e2dc5c259a 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b1" +__version__ = "2024.6.0b2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From b29e1acab81ddc3bfef041c1cdba0048be2b8c86 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 13 Jun 2024 19:24:36 +1200 Subject: [PATCH 046/151] Synchronise Device Classes from Home Assistant (#6904) --- esphome/components/update/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ae3d5062ab..ea1cf778b6 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -7,6 +7,7 @@ from esphome.const import ( CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ) from esphome.core import CORE, coroutine_with_priority @@ -24,6 +25,7 @@ PerformAction = update_ns.class_("PerformAction", automation.Action) IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) DEVICE_CLASSES = [ + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ] From 761aae6f892edc3d447e4478e4d20c3d124a66a1 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 13 Jun 2024 05:15:38 -0500 Subject: [PATCH 047/151] [CI] Allow clang-tidy to see IDF components (#6903) * Allow clang-tidy to see IDF components * Remove camera, add tflite-micro --- .github/workflows/ci.yml | 7 +++++++ esphome/idf_component.yml | 9 +++++++++ script/clang-tidy | 6 ++++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 esphome/idf_component.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c10e5dac7..df7a9178e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -387,6 +387,13 @@ jobs: echo "::add-matcher::.github/workflows/matchers/gcc.json" echo "::add-matcher::.github/workflows/matchers/clang-tidy.json" + - name: Run 'pio run --list-targets -e esp32-idf-tidy' + if: matrix.name == 'Run script/clang-tidy for ESP32 IDF' + run: | + . venv/bin/activate + mkdir -p .temp + pio run --list-targets -e esp32-idf-tidy + - name: Run clang-tidy run: | . venv/bin/activate diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml new file mode 100644 index 0000000000..ba1a6312e2 --- /dev/null +++ b/esphome/idf_component.yml @@ -0,0 +1,9 @@ +dependencies: + esp-tflite-micro: + git: https://github.com/espressif/esp-tflite-micro.git + mdns: + git: https://github.com/espressif/esp-protocols.git + version: mdns-v1.2.5 + path: components/mdns + rules: + - if: "idf_version >=5.0" diff --git a/script/clang-tidy b/script/clang-tidy index 84b02306d5..bd919825fd 100755 --- a/script/clang-tidy +++ b/script/clang-tidy @@ -101,8 +101,10 @@ def clang_options(idedata): # add library include directories using -isystem to suppress their errors for directory in sorted(set(idedata["includes"]["build"])): # skip our own directories, we add those later - if not directory.startswith(f"{root_path}/") or directory.startswith( - f"{root_path}/.pio/" + if ( + not directory.startswith(f"{root_path}/") + or directory.startswith(f"{root_path}/.pio/") + or directory.startswith(f"{root_path}/managed_components/") ): cmd.extend(["-isystem", directory]) From 5adadeaa07939f593a761cd2a044db8f8d4385d3 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 13 Jun 2024 05:42:08 -0500 Subject: [PATCH 048/151] [esp32_camera] Use newer library version (for #6802) (#6809) --- esphome/components/esp32_camera/__init__.py | 9 ++++++--- esphome/idf_component.yml | 3 +++ platformio.ini | 1 - 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/esphome/components/esp32_camera/__init__.py b/esphome/components/esp32_camera/__init__.py index 462900d401..4187429412 100644 --- a/esphome/components/esp32_camera/__init__.py +++ b/esphome/components/esp32_camera/__init__.py @@ -17,7 +17,7 @@ from esphome.const import ( CONF_VSYNC_PIN, ) from esphome.core import CORE -from esphome.components.esp32 import add_idf_sdkconfig_option +from esphome.components.esp32 import add_idf_component from esphome.cpp_helpers import setup_entity DEPENDENCIES = ["esp32"] @@ -290,8 +290,11 @@ async def to_code(config): cg.add_define("USE_ESP32_CAMERA") if CORE.using_esp_idf: - cg.add_library("espressif/esp32-camera", "1.0.0") - add_idf_sdkconfig_option("CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC", True) + add_idf_component( + name="esp32-camera", + repo="https://github.com/espressif/esp32-camera.git", + ref="v2.0.9", + ) for conf in config.get(CONF_ON_STREAM_START, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml index ba1a6312e2..c031b2192f 100644 --- a/esphome/idf_component.yml +++ b/esphome/idf_component.yml @@ -1,6 +1,9 @@ dependencies: esp-tflite-micro: git: https://github.com/espressif/esp-tflite-micro.git + esp32_camera: + git: https://github.com/espressif/esp32-camera.git + version: v2.0.9 mdns: git: https://github.com/espressif/esp-protocols.git version: mdns-v1.2.5 diff --git a/platformio.ini b/platformio.ini index 6b34b2f05d..ee82dee243 100644 --- a/platformio.ini +++ b/platformio.ini @@ -142,7 +142,6 @@ platform_packages = framework = espidf lib_deps = ${common:idf.lib_deps} - espressif/esp32-camera@1.0.0 ; esp32_camera droscy/esp_wireguard@0.4.1 ; wireguard build_flags = ${common:idf.build_flags} From 2fc43fa9c71e7f1a5785efffee787033366ca188 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 13 Jun 2024 19:38:35 -0500 Subject: [PATCH 049/151] [micro_wake_word] Pin to esp-tflite-micro v1.3.1 (#6906) --- esphome/components/micro_wake_word/__init__.py | 1 + esphome/idf_component.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/esphome/components/micro_wake_word/__init__.py b/esphome/components/micro_wake_word/__init__.py index def2808e54..35ee3cfedc 100644 --- a/esphome/components/micro_wake_word/__init__.py +++ b/esphome/components/micro_wake_word/__init__.py @@ -312,6 +312,7 @@ async def to_code(config): esp32.add_idf_component( name="esp-tflite-micro", repo="https://github.com/espressif/esp-tflite-micro", + ref="v1.3.1", ) cg.add_build_flag("-DTF_LITE_STATIC_MEMORY") diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml index c031b2192f..5f4701b5a3 100644 --- a/esphome/idf_component.yml +++ b/esphome/idf_component.yml @@ -1,6 +1,7 @@ dependencies: esp-tflite-micro: git: https://github.com/espressif/esp-tflite-micro.git + version: v1.3.1 esp32_camera: git: https://github.com/espressif/esp32-camera.git version: v2.0.9 From 290816be11016699c9413d2c62fb92149f201bb4 Mon Sep 17 00:00:00 2001 From: Anton Viktorov Date: Sun, 16 Jun 2024 09:50:00 +0200 Subject: [PATCH 050/151] VEML7700 Fix GCC build warnings (#6881) --- esphome/components/veml7700/veml7700.cpp | 2 +- esphome/components/veml7700/veml7700.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/veml7700/veml7700.cpp b/esphome/components/veml7700/veml7700.cpp index 68550811a1..a8c1411c68 100644 --- a/esphome/components/veml7700/veml7700.cpp +++ b/esphome/components/veml7700/veml7700.cpp @@ -243,7 +243,7 @@ ErrorCode VEML7700Component::configure_() { } PSMRegister psm{0}; - psm.PSM = PSM::PSM_MODE_1; + psm.PSM = PSMMode::PSM_MODE_1; psm.PSM_EN = false; ESP_LOGV(TAG, "Setting PSM to 0x%04X", psm.raw); err = this->write_register((uint8_t) CommandRegisters::PWR_SAVING, psm.raw_bytes, VEML_REG_SIZE); diff --git a/esphome/components/veml7700/veml7700.h b/esphome/components/veml7700/veml7700.h index fe5e1158e3..17fee6b851 100644 --- a/esphome/components/veml7700/veml7700.h +++ b/esphome/components/veml7700/veml7700.h @@ -24,7 +24,7 @@ enum class CommandRegisters : uint8_t { ALS_INT = 0x06 // R: ALS INT trigger event }; -enum Gain : uint8_t { +enum Gain : uint16_t { X_1 = 0, X_2 = 1, X_1_8 = 2, @@ -32,7 +32,7 @@ enum Gain : uint8_t { }; const uint8_t GAINS_COUNT = 4; -enum IntegrationTime : uint8_t { +enum IntegrationTime : uint16_t { INTEGRATION_TIME_25MS = 0b1100, INTEGRATION_TIME_50MS = 0b1000, INTEGRATION_TIME_100MS = 0b0000, @@ -42,14 +42,14 @@ enum IntegrationTime : uint8_t { }; const uint8_t INTEGRATION_TIMES_COUNT = 6; -enum Persistence : uint8_t { +enum Persistence : uint16_t { PERSISTENCE_1 = 0, PERSISTENCE_2 = 1, PERSISTENCE_4 = 2, PERSISTENCE_8 = 3, }; -enum PSM : uint8_t { +enum PSMMode : uint16_t { PSM_MODE_1 = 0, PSM_MODE_2 = 1, PSM_MODE_3 = 2, @@ -92,7 +92,7 @@ union PSMRegister { uint8_t raw_bytes[2]; struct { bool PSM_EN : 1; - uint8_t PSM : 2; + PSMMode PSM : 2; uint16_t reserved : 13; } __attribute__((packed)); }; From d49f2cbec80355694f046088ac0c35ef6483f77a Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 16 Jun 2024 03:02:15 -0500 Subject: [PATCH 051/151] IDF 5 fixes for #6802 (#6911) --- esphome/components/ethernet/ethernet_component.cpp | 2 +- esphome/components/voice_assistant/voice_assistant.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index 75bdd29be7..7370cb4b44 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -631,7 +631,7 @@ void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister regi ESPHL_ERROR_CHECK(err, "Writing PHY Register failed"); if (this->type_ == ETHERNET_TYPE_RTL8201 && register_data.page) { - ESP_LOGD(TAG, "Select PHY Register Page 0x%02" PRIX32, 0x0); + ESP_LOGD(TAG, "Select PHY Register Page 0x00"); err = mac->write_phy_reg(mac, this->phy_addr_, eth_phy_psr_reg_addr, 0x0); ESPHL_ERROR_CHECK(err, "Select PHY Register Page 0 failed"); } diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index 1fa8236cf4..8a8a9e92aa 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -799,7 +799,7 @@ void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) { this->speaker_buffer_index_ += msg.data.length(); this->speaker_buffer_size_ += msg.data.length(); this->speaker_bytes_received_ += msg.data.length(); - ESP_LOGV(TAG, "Received audio: %" PRId32 " bytes from API", msg.data.length()); + ESP_LOGV(TAG, "Received audio: %u bytes from API", msg.data.length()); } else { ESP_LOGE(TAG, "Cannot receive audio, buffer is full"); } From 253303f3a9f27012660e30b7745ddccd5a713715 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:01:07 +1200 Subject: [PATCH 052/151] [ili9xxx] Fix init for GC9A01A (#6913) --- .../components/ili9xxx/ili9xxx_display.cpp | 20 ++++++++++++++++--- esphome/components/ili9xxx/ili9xxx_display.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index 21d46ea825..de03df5d41 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -34,8 +34,8 @@ void ILI9XXXDisplay::setup() { ESP_LOGD(TAG, "Setting up ILI9xxx"); this->setup_pins_(); - this->init_lcd_(this->init_sequence_); - this->init_lcd_(this->extra_init_sequence_.data()); + this->init_lcd(this->init_sequence_); + this->init_lcd(this->extra_init_sequence_.data()); switch (this->pixel_mode_) { case PIXEL_MODE_16: if (this->is_18bitdisplay_) { @@ -405,7 +405,7 @@ void ILI9XXXDisplay::reset_() { } } -void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { +void ILI9XXXDisplay::init_lcd(const uint8_t *addr) { if (addr == nullptr) return; uint8_t cmd, x, num_args; @@ -427,6 +427,20 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { } } +void ILI9XXXGC9A01A::init_lcd(const uint8_t *addr) { + if (addr == nullptr) + return; + uint8_t cmd, x, num_args; + while ((cmd = *addr++) != 0) { + x = *addr++; + num_args = x & 0x7F; + this->send_command(cmd, addr, num_args); + addr += num_args; + if (x & 0x80) + delay(150); // NOLINT + } +} + // Tell the display controller where we want to draw pixels. void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { x1 += this->offset_x_; diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index 7a320dac7b..b60047a8c3 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -109,7 +109,7 @@ class ILI9XXXDisplay : public display::DisplayBuffer, virtual void set_madctl(); void display_(); - void init_lcd_(const uint8_t *addr); + virtual void init_lcd(const uint8_t *addr); void set_addr_window_(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2); void reset_(); @@ -269,6 +269,7 @@ class ILI9XXXS3BoxLite : public ILI9XXXDisplay { class ILI9XXXGC9A01A : public ILI9XXXDisplay { public: ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} + void init_lcd(const uint8_t *addr) override; }; //----------- ILI9XXX_24_TFT display -------------- From 6b89763ad61f4bd0ab5cb8d6417dd678972b6ed6 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:20:04 +1200 Subject: [PATCH 053/151] [mqtt] Fix datetime copy pasta (#6914) --- esphome/components/mqtt/mqtt_datetime.cpp | 6 +++--- esphome/components/mqtt/mqtt_datetime.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/mqtt/mqtt_datetime.cpp b/esphome/components/mqtt/mqtt_datetime.cpp index 4fa44aafb8..4ae6d0d416 100644 --- a/esphome/components/mqtt/mqtt_datetime.cpp +++ b/esphome/components/mqtt/mqtt_datetime.cpp @@ -6,12 +6,12 @@ #include "mqtt_const.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME namespace esphome { namespace mqtt { -static const char *const TAG = "mqtt.datetime.time"; +static const char *const TAG = "mqtt.datetime.datetime"; using namespace esphome::datetime; @@ -80,5 +80,5 @@ bool MQTTDateTimeComponent::publish_state(uint16_t year, uint8_t month, uint8_t } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_TIME +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT diff --git a/esphome/components/mqtt/mqtt_datetime.h b/esphome/components/mqtt/mqtt_datetime.h index f0d68ad2e1..ba81c06cb3 100644 --- a/esphome/components/mqtt/mqtt_datetime.h +++ b/esphome/components/mqtt/mqtt_datetime.h @@ -3,7 +3,7 @@ #include "esphome/core/defines.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME #include "esphome/components/datetime/datetime_entity.h" #include "mqtt_component.h" @@ -17,7 +17,7 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { * * @param time The time entity. */ - explicit MQTTDateTimeComponent(datetime::DateTimeEntity *time); + explicit MQTTDateTimeComponent(datetime::DateTimeEntity *datetime); // ========== INTERNAL METHODS ========== // (In most use cases you won't need these) @@ -41,5 +41,5 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_DATE +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT From eb50f0eafd7e920c7405ae476a6878e3c53ee6ba Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 13 Jun 2024 19:24:36 +1200 Subject: [PATCH 054/151] Synchronise Device Classes from Home Assistant (#6904) --- esphome/components/update/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ae3d5062ab..ea1cf778b6 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -7,6 +7,7 @@ from esphome.const import ( CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ) from esphome.core import CORE, coroutine_with_priority @@ -24,6 +25,7 @@ PerformAction = update_ns.class_("PerformAction", automation.Action) IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) DEVICE_CLASSES = [ + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ] From 1e66241b2696c80f222dd853db76bd10acb48ac4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:01:07 +1200 Subject: [PATCH 055/151] [ili9xxx] Fix init for GC9A01A (#6913) --- .../components/ili9xxx/ili9xxx_display.cpp | 20 ++++++++++++++++--- esphome/components/ili9xxx/ili9xxx_display.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index 21d46ea825..de03df5d41 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -34,8 +34,8 @@ void ILI9XXXDisplay::setup() { ESP_LOGD(TAG, "Setting up ILI9xxx"); this->setup_pins_(); - this->init_lcd_(this->init_sequence_); - this->init_lcd_(this->extra_init_sequence_.data()); + this->init_lcd(this->init_sequence_); + this->init_lcd(this->extra_init_sequence_.data()); switch (this->pixel_mode_) { case PIXEL_MODE_16: if (this->is_18bitdisplay_) { @@ -405,7 +405,7 @@ void ILI9XXXDisplay::reset_() { } } -void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { +void ILI9XXXDisplay::init_lcd(const uint8_t *addr) { if (addr == nullptr) return; uint8_t cmd, x, num_args; @@ -427,6 +427,20 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { } } +void ILI9XXXGC9A01A::init_lcd(const uint8_t *addr) { + if (addr == nullptr) + return; + uint8_t cmd, x, num_args; + while ((cmd = *addr++) != 0) { + x = *addr++; + num_args = x & 0x7F; + this->send_command(cmd, addr, num_args); + addr += num_args; + if (x & 0x80) + delay(150); // NOLINT + } +} + // Tell the display controller where we want to draw pixels. void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { x1 += this->offset_x_; diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index 7a320dac7b..b60047a8c3 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -109,7 +109,7 @@ class ILI9XXXDisplay : public display::DisplayBuffer, virtual void set_madctl(); void display_(); - void init_lcd_(const uint8_t *addr); + virtual void init_lcd(const uint8_t *addr); void set_addr_window_(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2); void reset_(); @@ -269,6 +269,7 @@ class ILI9XXXS3BoxLite : public ILI9XXXDisplay { class ILI9XXXGC9A01A : public ILI9XXXDisplay { public: ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} + void init_lcd(const uint8_t *addr) override; }; //----------- ILI9XXX_24_TFT display -------------- From 65638bf61420b2278b5043fc98f713475be2b749 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:20:04 +1200 Subject: [PATCH 056/151] [mqtt] Fix datetime copy pasta (#6914) --- esphome/components/mqtt/mqtt_datetime.cpp | 6 +++--- esphome/components/mqtt/mqtt_datetime.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/mqtt/mqtt_datetime.cpp b/esphome/components/mqtt/mqtt_datetime.cpp index 4fa44aafb8..4ae6d0d416 100644 --- a/esphome/components/mqtt/mqtt_datetime.cpp +++ b/esphome/components/mqtt/mqtt_datetime.cpp @@ -6,12 +6,12 @@ #include "mqtt_const.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME namespace esphome { namespace mqtt { -static const char *const TAG = "mqtt.datetime.time"; +static const char *const TAG = "mqtt.datetime.datetime"; using namespace esphome::datetime; @@ -80,5 +80,5 @@ bool MQTTDateTimeComponent::publish_state(uint16_t year, uint8_t month, uint8_t } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_TIME +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT diff --git a/esphome/components/mqtt/mqtt_datetime.h b/esphome/components/mqtt/mqtt_datetime.h index f0d68ad2e1..ba81c06cb3 100644 --- a/esphome/components/mqtt/mqtt_datetime.h +++ b/esphome/components/mqtt/mqtt_datetime.h @@ -3,7 +3,7 @@ #include "esphome/core/defines.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME #include "esphome/components/datetime/datetime_entity.h" #include "mqtt_component.h" @@ -17,7 +17,7 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { * * @param time The time entity. */ - explicit MQTTDateTimeComponent(datetime::DateTimeEntity *time); + explicit MQTTDateTimeComponent(datetime::DateTimeEntity *datetime); // ========== INTERNAL METHODS ========== // (In most use cases you won't need these) @@ -41,5 +41,5 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_DATE +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT From 25a3db1637d82fbc36a45c0e1d68f0bee7748718 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:35:53 +1200 Subject: [PATCH 057/151] Bump version to 2024.6.0b3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index e2dc5c259a..a0fe325282 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b2" +__version__ = "2024.6.0b3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 51c5d1714cb8ee434b1c64d50280e328a11f4abf Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Mon, 17 Jun 2024 07:48:56 +0200 Subject: [PATCH 058/151] fix(dallas): make recovery time for 1-bit equal to that of 0-bit (#6763) --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index f47e8d58e3..34c2cf3c29 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -60,7 +60,7 @@ void HOT IRAM_ATTR GPIOOneWireBus::write_bit_(bool bit) { // recovery time: t_rec: min=1µs // ds18b20 appears to read the bus after roughly 14µs uint32_t delay0 = bit ? 6 : 60; - uint32_t delay1 = bit ? 54 : 5; + uint32_t delay1 = bit ? 59 : 5; // delay A/C delayMicroseconds(delay0); From 015cd42a2ed8197e189cc851aea0207bb0fd2b6e Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:06:25 -0500 Subject: [PATCH 059/151] [CI-ethernet] Add/fix/organize/clean up ethernet component tests (#6916) --- ...{lan8720.esp32-idf.yaml => common-dp83848.yaml} | 2 +- .../{lan8720.esp32.yaml => common-ip101.yaml} | 2 +- tests/components/ethernet/common-jl1101.yaml | 12 ++++++++++++ tests/components/ethernet/common-ksz8081.yaml | 12 ++++++++++++ tests/components/ethernet/common-ksz8081rna.yaml | 12 ++++++++++++ .../ethernet/{common.yaml => common-lan8720.yaml} | 0 tests/components/ethernet/common-rtl8201.yaml | 12 ++++++++++++ .../{w5500.esp32.yaml => common-w5500.yaml} | 12 ++++++------ .../ethernet/test-dp83848.esp32-idf.yaml | 1 + tests/components/ethernet/test-dp83848.esp32.yaml | 1 + .../components/ethernet/test-ip101.esp32-idf.yaml | 1 + tests/components/ethernet/test-ip101.esp32.yaml | 1 + .../components/ethernet/test-jl1101.esp32-idf.yaml | 1 + tests/components/ethernet/test-jl1101.esp32.yaml | 1 + .../ethernet/test-ksz8081.esp32-idf.yaml | 1 + tests/components/ethernet/test-ksz8081.esp32.yaml | 1 + .../ethernet/test-ksz8081rna.esp32-idf.yaml | 1 + .../components/ethernet/test-ksz8081rna.esp32.yaml | 1 + .../ethernet/test-lan8720.esp32-idf.yaml | 1 + tests/components/ethernet/test-lan8720.esp32.yaml | 1 + .../ethernet/test-rtl8201.esp32-idf.yaml | 1 + tests/components/ethernet/test-rtl8201.esp32.yaml | 1 + .../components/ethernet/test-w5500.esp32-idf.yaml | 1 + tests/components/ethernet/test-w5500.esp32.yaml | 1 + tests/components/ethernet/test.esp32-idf.yaml | 1 - tests/components/ethernet/test.esp32.yaml | 1 - tests/components/ethernet/w5500.esp32-idf.yaml | 14 -------------- 27 files changed, 72 insertions(+), 24 deletions(-) rename tests/components/ethernet/{lan8720.esp32-idf.yaml => common-dp83848.yaml} (92%) rename tests/components/ethernet/{lan8720.esp32.yaml => common-ip101.yaml} (92%) create mode 100644 tests/components/ethernet/common-jl1101.yaml create mode 100644 tests/components/ethernet/common-ksz8081.yaml create mode 100644 tests/components/ethernet/common-ksz8081rna.yaml rename tests/components/ethernet/{common.yaml => common-lan8720.yaml} (100%) create mode 100644 tests/components/ethernet/common-rtl8201.yaml rename tests/components/ethernet/{w5500.esp32.yaml => common-w5500.yaml} (57%) create mode 100644 tests/components/ethernet/test-dp83848.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-dp83848.esp32.yaml create mode 100644 tests/components/ethernet/test-ip101.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-ip101.esp32.yaml create mode 100644 tests/components/ethernet/test-jl1101.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-jl1101.esp32.yaml create mode 100644 tests/components/ethernet/test-ksz8081.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-ksz8081.esp32.yaml create mode 100644 tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-ksz8081rna.esp32.yaml create mode 100644 tests/components/ethernet/test-lan8720.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-lan8720.esp32.yaml create mode 100644 tests/components/ethernet/test-rtl8201.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-rtl8201.esp32.yaml create mode 100644 tests/components/ethernet/test-w5500.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-w5500.esp32.yaml delete mode 100644 tests/components/ethernet/test.esp32-idf.yaml delete mode 100644 tests/components/ethernet/test.esp32.yaml delete mode 100644 tests/components/ethernet/w5500.esp32-idf.yaml diff --git a/tests/components/ethernet/lan8720.esp32-idf.yaml b/tests/components/ethernet/common-dp83848.yaml similarity index 92% rename from tests/components/ethernet/lan8720.esp32-idf.yaml rename to tests/components/ethernet/common-dp83848.yaml index b9ed9cb036..5b6ed3e8d0 100644 --- a/tests/components/ethernet/lan8720.esp32-idf.yaml +++ b/tests/components/ethernet/common-dp83848.yaml @@ -1,5 +1,5 @@ ethernet: - type: LAN8720 + type: DP83848 mdc_pin: 23 mdio_pin: 25 clk_mode: GPIO0_IN diff --git a/tests/components/ethernet/lan8720.esp32.yaml b/tests/components/ethernet/common-ip101.yaml similarity index 92% rename from tests/components/ethernet/lan8720.esp32.yaml rename to tests/components/ethernet/common-ip101.yaml index b9ed9cb036..5ca369cce1 100644 --- a/tests/components/ethernet/lan8720.esp32.yaml +++ b/tests/components/ethernet/common-ip101.yaml @@ -1,5 +1,5 @@ ethernet: - type: LAN8720 + type: IP101 mdc_pin: 23 mdio_pin: 25 clk_mode: GPIO0_IN diff --git a/tests/components/ethernet/common-jl1101.yaml b/tests/components/ethernet/common-jl1101.yaml new file mode 100644 index 0000000000..639542d807 --- /dev/null +++ b/tests/components/ethernet/common-jl1101.yaml @@ -0,0 +1,12 @@ +ethernet: + type: JL1101 + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/common-ksz8081.yaml b/tests/components/ethernet/common-ksz8081.yaml new file mode 100644 index 0000000000..167606a1eb --- /dev/null +++ b/tests/components/ethernet/common-ksz8081.yaml @@ -0,0 +1,12 @@ +ethernet: + type: KSZ8081 + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/common-ksz8081rna.yaml b/tests/components/ethernet/common-ksz8081rna.yaml new file mode 100644 index 0000000000..f506906b1b --- /dev/null +++ b/tests/components/ethernet/common-ksz8081rna.yaml @@ -0,0 +1,12 @@ +ethernet: + type: KSZ8081RNA + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/common.yaml b/tests/components/ethernet/common-lan8720.yaml similarity index 100% rename from tests/components/ethernet/common.yaml rename to tests/components/ethernet/common-lan8720.yaml diff --git a/tests/components/ethernet/common-rtl8201.yaml b/tests/components/ethernet/common-rtl8201.yaml new file mode 100644 index 0000000000..43842e7c9f --- /dev/null +++ b/tests/components/ethernet/common-rtl8201.yaml @@ -0,0 +1,12 @@ +ethernet: + type: RTL8201 + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/w5500.esp32.yaml b/tests/components/ethernet/common-w5500.yaml similarity index 57% rename from tests/components/ethernet/w5500.esp32.yaml rename to tests/components/ethernet/common-w5500.yaml index 6fdccb36e3..76661a75c3 100644 --- a/tests/components/ethernet/w5500.esp32.yaml +++ b/tests/components/ethernet/common-w5500.yaml @@ -1,11 +1,11 @@ ethernet: type: W5500 - clk_pin: GPIO19 - mosi_pin: GPIO21 - miso_pin: GPIO23 - cs_pin: GPIO18 - interrupt_pin: GPIO36 - reset_pin: GPIO22 + clk_pin: 19 + mosi_pin: 21 + miso_pin: 23 + cs_pin: 18 + interrupt_pin: 36 + reset_pin: 22 clock_speed: 10Mhz manual_ip: static_ip: 192.168.178.56 diff --git a/tests/components/ethernet/test-dp83848.esp32-idf.yaml b/tests/components/ethernet/test-dp83848.esp32-idf.yaml new file mode 100644 index 0000000000..906bfba17c --- /dev/null +++ b/tests/components/ethernet/test-dp83848.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-dp83848.yaml diff --git a/tests/components/ethernet/test-dp83848.esp32.yaml b/tests/components/ethernet/test-dp83848.esp32.yaml new file mode 100644 index 0000000000..906bfba17c --- /dev/null +++ b/tests/components/ethernet/test-dp83848.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-dp83848.yaml diff --git a/tests/components/ethernet/test-ip101.esp32-idf.yaml b/tests/components/ethernet/test-ip101.esp32-idf.yaml new file mode 100644 index 0000000000..e52329d7ea --- /dev/null +++ b/tests/components/ethernet/test-ip101.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-ip101.yaml diff --git a/tests/components/ethernet/test-ip101.esp32.yaml b/tests/components/ethernet/test-ip101.esp32.yaml new file mode 100644 index 0000000000..e52329d7ea --- /dev/null +++ b/tests/components/ethernet/test-ip101.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-ip101.yaml diff --git a/tests/components/ethernet/test-jl1101.esp32-idf.yaml b/tests/components/ethernet/test-jl1101.esp32-idf.yaml new file mode 100644 index 0000000000..95d8cd1f21 --- /dev/null +++ b/tests/components/ethernet/test-jl1101.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-jl1101.yaml diff --git a/tests/components/ethernet/test-jl1101.esp32.yaml b/tests/components/ethernet/test-jl1101.esp32.yaml new file mode 100644 index 0000000000..95d8cd1f21 --- /dev/null +++ b/tests/components/ethernet/test-jl1101.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-jl1101.yaml diff --git a/tests/components/ethernet/test-ksz8081.esp32-idf.yaml b/tests/components/ethernet/test-ksz8081.esp32-idf.yaml new file mode 100644 index 0000000000..8f3c750c77 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081.yaml diff --git a/tests/components/ethernet/test-ksz8081.esp32.yaml b/tests/components/ethernet/test-ksz8081.esp32.yaml new file mode 100644 index 0000000000..8f3c750c77 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081.yaml diff --git a/tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml b/tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml new file mode 100644 index 0000000000..a48e591996 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081rna.yaml diff --git a/tests/components/ethernet/test-ksz8081rna.esp32.yaml b/tests/components/ethernet/test-ksz8081rna.esp32.yaml new file mode 100644 index 0000000000..a48e591996 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081rna.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081rna.yaml diff --git a/tests/components/ethernet/test-lan8720.esp32-idf.yaml b/tests/components/ethernet/test-lan8720.esp32-idf.yaml new file mode 100644 index 0000000000..3df9ac874a --- /dev/null +++ b/tests/components/ethernet/test-lan8720.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-lan8720.yaml diff --git a/tests/components/ethernet/test-lan8720.esp32.yaml b/tests/components/ethernet/test-lan8720.esp32.yaml new file mode 100644 index 0000000000..3df9ac874a --- /dev/null +++ b/tests/components/ethernet/test-lan8720.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-lan8720.yaml diff --git a/tests/components/ethernet/test-rtl8201.esp32-idf.yaml b/tests/components/ethernet/test-rtl8201.esp32-idf.yaml new file mode 100644 index 0000000000..e69f88dc94 --- /dev/null +++ b/tests/components/ethernet/test-rtl8201.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-rtl8201.yaml diff --git a/tests/components/ethernet/test-rtl8201.esp32.yaml b/tests/components/ethernet/test-rtl8201.esp32.yaml new file mode 100644 index 0000000000..e69f88dc94 --- /dev/null +++ b/tests/components/ethernet/test-rtl8201.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-rtl8201.yaml diff --git a/tests/components/ethernet/test-w5500.esp32-idf.yaml b/tests/components/ethernet/test-w5500.esp32-idf.yaml new file mode 100644 index 0000000000..36f1b5365f --- /dev/null +++ b/tests/components/ethernet/test-w5500.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-w5500.yaml diff --git a/tests/components/ethernet/test-w5500.esp32.yaml b/tests/components/ethernet/test-w5500.esp32.yaml new file mode 100644 index 0000000000..36f1b5365f --- /dev/null +++ b/tests/components/ethernet/test-w5500.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-w5500.yaml diff --git a/tests/components/ethernet/test.esp32-idf.yaml b/tests/components/ethernet/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/ethernet/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/ethernet/test.esp32.yaml b/tests/components/ethernet/test.esp32.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/ethernet/test.esp32.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/ethernet/w5500.esp32-idf.yaml b/tests/components/ethernet/w5500.esp32-idf.yaml deleted file mode 100644 index 6fdccb36e3..0000000000 --- a/tests/components/ethernet/w5500.esp32-idf.yaml +++ /dev/null @@ -1,14 +0,0 @@ -ethernet: - type: W5500 - clk_pin: GPIO19 - mosi_pin: GPIO21 - miso_pin: GPIO23 - cs_pin: GPIO18 - interrupt_pin: GPIO36 - reset_pin: GPIO22 - clock_speed: 10Mhz - manual_ip: - static_ip: 192.168.178.56 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - domain: .local From 67d8c7c69164c48debffff6868c2dc9282ffc37b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:14:19 -0500 Subject: [PATCH 060/151] [CI-a01nyub] Consolidate test files (#6917) --- tests/components/a01nyub/common.yaml | 11 +++++++++++ tests/components/a01nyub/test.esp32-c3-idf.yaml | 16 ++++------------ tests/components/a01nyub/test.esp32-c3.yaml | 16 ++++------------ tests/components/a01nyub/test.esp32-idf.yaml | 16 ++++------------ tests/components/a01nyub/test.esp32.yaml | 16 ++++------------ tests/components/a01nyub/test.esp8266.yaml | 16 ++++------------ tests/components/a01nyub/test.rp2040.yaml | 16 ++++------------ 7 files changed, 35 insertions(+), 72 deletions(-) create mode 100644 tests/components/a01nyub/common.yaml diff --git a/tests/components/a01nyub/common.yaml b/tests/components/a01nyub/common.yaml new file mode 100644 index 0000000000..0717acfff7 --- /dev/null +++ b/tests/components/a01nyub/common.yaml @@ -0,0 +1,11 @@ +uart: + - id: uart_a01nyub + tx_pin: ${tx_pin} + rx_pin: ${rx_pin} + baud_rate: 9600 + +sensor: + - platform: a01nyub + id: a01nyub_sensor + name: a01nyub Distance + uart_id: uart_a01nyub diff --git a/tests/components/a01nyub/test.esp32-c3-idf.yaml b/tests/components/a01nyub/test.esp32-c3-idf.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.esp32-c3-idf.yaml +++ b/tests/components/a01nyub/test.esp32-c3-idf.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp32-c3.yaml b/tests/components/a01nyub/test.esp32-c3.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.esp32-c3.yaml +++ b/tests/components/a01nyub/test.esp32-c3.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp32-idf.yaml b/tests/components/a01nyub/test.esp32-idf.yaml index 79fc9c5fbf..f486544afa 100644 --- a/tests/components/a01nyub/test.esp32-idf.yaml +++ b/tests/components/a01nyub/test.esp32-idf.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 17 - rx_pin: - number: 16 - baud_rate: 9600 +substitutions: + tx_pin: GPIO17 + rx_pin: GPIO16 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp32.yaml b/tests/components/a01nyub/test.esp32.yaml index 79fc9c5fbf..f486544afa 100644 --- a/tests/components/a01nyub/test.esp32.yaml +++ b/tests/components/a01nyub/test.esp32.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 17 - rx_pin: - number: 16 - baud_rate: 9600 +substitutions: + tx_pin: GPIO17 + rx_pin: GPIO16 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp8266.yaml b/tests/components/a01nyub/test.esp8266.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.esp8266.yaml +++ b/tests/components/a01nyub/test.esp8266.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.rp2040.yaml b/tests/components/a01nyub/test.rp2040.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.rp2040.yaml +++ b/tests/components/a01nyub/test.rp2040.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml From d604c8ae644ee91c714c1ae887b7fcbf400a759b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:18:04 -0500 Subject: [PATCH 061/151] [CI-api] Test fix for IDF 5+ (#6918) --- tests/components/api/common.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/api/common.yaml b/tests/components/api/common.yaml index 3c56811b95..e0b900f92d 100644 --- a/tests/components/api/common.yaml +++ b/tests/components/api/common.yaml @@ -50,12 +50,12 @@ api: then: - logger.log: # yamllint disable rule:line-length - format: "Bool: %s (%u), Int: %d (%u), Float: %f (%u), String: %s (%u)" + format: "Bool: %s (%u), Int: %ld (%u), Float: %f (%u), String: %s (%u)" # yamllint enable rule:line-length args: - YESNO(bool_arr[0]) - bool_arr.size() - - int_arr[0] + - (long) int_arr[0] - int_arr.size() - float_arr[0] - float_arr.size() From 41f810f8285c7f94d0f629e30828848d13cb734b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:21:15 -0500 Subject: [PATCH 062/151] [CI-http_request] Test fix for IDF 5+ (#6919) --- tests/components/http_request/common.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/http_request/common.yaml b/tests/components/http_request/common.yaml index 83b334ca2d..589b7fb4b4 100644 --- a/tests/components/http_request/common.yaml +++ b/tests/components/http_request/common.yaml @@ -15,10 +15,10 @@ esphome: on_response: then: - logger.log: - format: "Response status: %d, Duration: %u ms" + format: "Response status: %d, Duration: %lu ms" args: - response->status_code - - response->duration_ms + - (long) response->duration_ms - http_request.post: url: https://esphome.io headers: From c30913ccdeebb4627a864132e8cd37c5264e88a5 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:23:24 -0500 Subject: [PATCH 063/151] [CI-wireguard] Test file consolidation (#6920) --- tests/components/wireguard/common.yaml | 59 ++++++++++++++++++ tests/components/wireguard/test.bk72xx.yaml | 60 +----------------- .../wireguard/test.esp32-c3-idf.yaml | 61 +------------------ tests/components/wireguard/test.esp32-c3.yaml | 61 +------------------ .../components/wireguard/test.esp32-idf.yaml | 60 +----------------- tests/components/wireguard/test.esp32.yaml | 60 +----------------- tests/components/wireguard/test.esp8266.yaml | 60 +----------------- 7 files changed, 65 insertions(+), 356 deletions(-) create mode 100644 tests/components/wireguard/common.yaml diff --git a/tests/components/wireguard/common.yaml b/tests/components/wireguard/common.yaml new file mode 100644 index 0000000000..cd7ab1075e --- /dev/null +++ b/tests/components/wireguard/common.yaml @@ -0,0 +1,59 @@ +wifi: + ssid: "MySSID1" + password: "password1" + +time: + - platform: sntp + +wireguard: + address: 172.16.34.100 + netmask: 255.255.255.0 + # NEVER use the following keys for your VPN -- they are now public! + private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= + peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= + peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= + peer_endpoint: wg.server.example + peer_persistent_keepalive: 25s + peer_allowed_ips: + - 172.16.34.0/24 + - 192.168.4.0/24 + +binary_sensor: + - platform: wireguard + status: + name: 'WireGuard Status' + enabled: + name: 'WireGuard Enabled' + +sensor: + - platform: wireguard + latest_handshake: + name: 'WireGuard Latest Handshake' + +text_sensor: + - platform: wireguard + address: + name: 'WireGuard Address' + +button: + - platform: template + name: 'Toggle WireGuard' + entity_category: config + on_press: + - if: + condition: wireguard.enabled + then: + - wireguard.disable: + else: + - wireguard.enable: + + - platform: template + name: 'Log WireGuard status' + entity_category: config + on_press: + - if: + condition: wireguard.peer_online + then: + - logger.log: 'wireguard remote peer is online' + else: + - logger.log: 'wireguard remote peer is offline' diff --git a/tests/components/wireguard/test.bk72xx.yaml b/tests/components/wireguard/test.bk72xx.yaml index 85325139a9..dade44d145 100644 --- a/tests/components/wireguard/test.bk72xx.yaml +++ b/tests/components/wireguard/test.bk72xx.yaml @@ -1,59 +1 @@ -wifi: - ssid: "MySSID1" - password: "password1" - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' +<<: !include common.yaml diff --git a/tests/components/wireguard/test.esp32-c3-idf.yaml b/tests/components/wireguard/test.esp32-c3-idf.yaml index 37d1727842..dade44d145 100644 --- a/tests/components/wireguard/test.esp32-c3-idf.yaml +++ b/tests/components/wireguard/test.esp32-c3-idf.yaml @@ -1,60 +1 @@ -wifi: - ssid: MySSID - password: password1 - -time: - - platform: sntp - -wireguard: - id: vpn - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' +<<: !include common.yaml diff --git a/tests/components/wireguard/test.esp32-c3.yaml b/tests/components/wireguard/test.esp32-c3.yaml index 37d1727842..dade44d145 100644 --- a/tests/components/wireguard/test.esp32-c3.yaml +++ b/tests/components/wireguard/test.esp32-c3.yaml @@ -1,60 +1 @@ -wifi: - ssid: MySSID - password: password1 - -time: - - platform: sntp - -wireguard: - id: vpn - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' +<<: !include common.yaml diff --git a/tests/components/wireguard/test.esp32-idf.yaml b/tests/components/wireguard/test.esp32-idf.yaml index 9ea7f00bdb..2798f8e566 100644 --- a/tests/components/wireguard/test.esp32-idf.yaml +++ b/tests/components/wireguard/test.esp32-idf.yaml @@ -1,62 +1,4 @@ -wifi: - ssid: "MySSID1" - password: "password1" +<<: !include common.yaml network: enable_ipv6: true - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' diff --git a/tests/components/wireguard/test.esp32.yaml b/tests/components/wireguard/test.esp32.yaml index 9ea7f00bdb..2798f8e566 100644 --- a/tests/components/wireguard/test.esp32.yaml +++ b/tests/components/wireguard/test.esp32.yaml @@ -1,62 +1,4 @@ -wifi: - ssid: "MySSID1" - password: "password1" +<<: !include common.yaml network: enable_ipv6: true - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' diff --git a/tests/components/wireguard/test.esp8266.yaml b/tests/components/wireguard/test.esp8266.yaml index 9ea7f00bdb..2798f8e566 100644 --- a/tests/components/wireguard/test.esp8266.yaml +++ b/tests/components/wireguard/test.esp8266.yaml @@ -1,62 +1,4 @@ -wifi: - ssid: "MySSID1" - password: "password1" +<<: !include common.yaml network: enable_ipv6: true - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' From a59c9b4f771f6d6a65af6caa33b0c0edae6af087 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:30:54 -0500 Subject: [PATCH 064/151] [CI-esp32_hall] Remove IDF test (#6921) --- tests/components/esp32_hall/common.yaml | 3 --- tests/components/esp32_hall/test.esp32-idf.yaml | 1 - tests/components/esp32_hall/test.esp32.yaml | 4 +++- 3 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 tests/components/esp32_hall/common.yaml delete mode 100644 tests/components/esp32_hall/test.esp32-idf.yaml diff --git a/tests/components/esp32_hall/common.yaml b/tests/components/esp32_hall/common.yaml deleted file mode 100644 index f8429f5aa0..0000000000 --- a/tests/components/esp32_hall/common.yaml +++ /dev/null @@ -1,3 +0,0 @@ -sensor: - - platform: esp32_hall - name: ESP32 Hall Sensor diff --git a/tests/components/esp32_hall/test.esp32-idf.yaml b/tests/components/esp32_hall/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/esp32_hall/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/esp32_hall/test.esp32.yaml b/tests/components/esp32_hall/test.esp32.yaml index dade44d145..f8429f5aa0 100644 --- a/tests/components/esp32_hall/test.esp32.yaml +++ b/tests/components/esp32_hall/test.esp32.yaml @@ -1 +1,3 @@ -<<: !include common.yaml +sensor: + - platform: esp32_hall + name: ESP32 Hall Sensor From f6848fe24d58ac7bcb1bc79e210a41a2f09bf571 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 16:32:11 -0500 Subject: [PATCH 065/151] [CI] Introduce testing for IDF 5 (and other arbitrary framework versions) (#6802) * Initial changes to support testing of additional framework versions * Rename Arduino test files --- script/test_build_components | 25 ++++++++++--------- .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...esp32.yaml => test-dp83848.esp32-ard.yaml} | 0 ...1.esp32.yaml => test-ip101.esp32-ard.yaml} | 0 ....esp32.yaml => test-jl1101.esp32-ard.yaml} | 0 ...esp32.yaml => test-ksz8081.esp32-ard.yaml} | 0 ...32.yaml => test-ksz8081rna.esp32-ard.yaml} | 0 ...esp32.yaml => test-lan8720.esp32-ard.yaml} | 0 ...esp32.yaml => test-rtl8201.esp32-ard.yaml} | 0 ...0.esp32.yaml => test-w5500.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...p8266.yaml => test-nossl.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ... => build_components_base.bk72xx-ard.yaml} | 0 ...build_components_base.esp32-c3-idf-50.yaml | 19 ++++++++++++++ .../build_components_base.esp32-idf-50.yaml | 19 ++++++++++++++ ...build_components_base.esp32-s2-idf-50.yaml | 20 +++++++++++++++ .../build_components_base.esp32-s2-idf.yaml | 2 +- ...build_components_base.esp32-s3-idf-50.yaml | 20 +++++++++++++++ .../build_components_base.esp32-s3-idf.yaml | 2 +- ...=> build_components_base.esp8266-ard.yaml} | 2 +- ... => build_components_base.rp2040-ard.yaml} | 2 +- 1689 files changed, 95 insertions(+), 16 deletions(-) rename tests/components/a01nyub/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/a01nyub/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/a01nyub/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/a01nyub/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/a02yyuw/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/a02yyuw/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/a02yyuw/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/a02yyuw/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/a4988/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/a4988/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/a4988/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/a4988/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/adc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/adc/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/adc/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/adc/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/adc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/adc/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/adc128s102/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/adc128s102/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/adc128s102/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/adc128s102/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/addressable_light/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/addressable_light/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7880/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ade7880/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7880/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ade7880/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ads1115/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ads1115/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ads1115/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ads1115/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ags10/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ags10/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ags10/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/aht10/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/aht10/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/aht10/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/aht10/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/airthings_wave_mini/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/airthings_wave_mini/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/airthings_wave_plus/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/airthings_wave_plus/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/alpha3/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/alpha3/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/am2315c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/am2315c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/am2315c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/am2315c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/am2320/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/am2320/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/am2320/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/am2320/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/am43/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/am43/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/analog_threshold/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/analog_threshold/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/analog_threshold/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/analog_threshold/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/animation/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/animation/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/animation/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/animation/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/anova/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/anova/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/apds9960/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/apds9960/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/apds9960/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/apds9960/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/api/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/api/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/api/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/api/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as3935_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as3935_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as3935_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as3935_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as5600/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as5600/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as5600/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as5600/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as7341/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as7341/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as7341/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as7341/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/at581x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/at581x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/at581x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/at581x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/atc_mithermometer/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/atc_mithermometer/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/atm90e26/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/atm90e26/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/atm90e26/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/atm90e26/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/atm90e32/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/atm90e32/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/atm90e32/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/atm90e32/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/b_parasite/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/b_parasite/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ballu/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ballu/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bang_bang/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bang_bang/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bang_bang/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bang_bang/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bedjet/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bedjet/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/beken_spi_led_strip/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/bh1750/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bh1750/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bh1750/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bh1750/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bl0939/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bl0939/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bl0939/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bl0939/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bl0940/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bl0940/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bl0940/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bl0940/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bl0942/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bl0942/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bl0942/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bl0942/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ble_client/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_client/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ble_presence/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_presence/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ble_rssi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_rssi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ble_scanner/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_scanner/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bme280_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme280_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme280_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bme280_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bme680/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme680/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme680/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bme680/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bme680_bsec/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme680_bsec/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmi160/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmi160/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmi160/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmi160/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp085/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp085/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp085/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp085/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp280/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp280/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp280/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp280/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp581/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp581/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp581/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp581/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bp1658cj/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bp1658cj/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bp1658cj/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bp1658cj/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bp5758d/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bp5758d/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bp5758d/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bp5758d/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/button/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/button/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/button/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/button/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/canbus/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/canbus/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cap1188/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cap1188/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cap1188/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cap1188/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/captive_portal/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/captive_portal/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/captive_portal/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ccs811/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ccs811/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ccs811/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ccs811/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/climate_ir_lg/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/climate_ir_lg/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/climate_ir_lg/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/color/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/color/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/color/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/color/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/color_temperature/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/color_temperature/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/color_temperature/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/color_temperature/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/combination/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/combination/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/combination/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/combination/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/coolix/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/coolix/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/coolix/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/copy/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/copy/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/copy/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/copy/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cs5460a/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cs5460a/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cs5460a/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cs5460a/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cse7761/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cse7761/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cse7761/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cse7761/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cse7766/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cse7766/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cse7766/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cse7766/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cst226/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cst816/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ct_clamp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ct_clamp/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ct_clamp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ct_clamp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/current_based/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/current_based/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/current_based/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/current_based/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cwww/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cwww/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cwww/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cwww/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dac7678/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dac7678/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dac7678/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dac7678/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/daikin/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daikin/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/daikin_arc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daikin_arc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/daikin_brc/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daikin_brc/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/daikin_brc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dallas_temp/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dallas_temp/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dallas_temp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dallas_temp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/daly_bms/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daly_bms/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/daly_bms/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/daly_bms/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/debug/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/debug/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/debug/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/debug/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/deep_sleep/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/deep_sleep/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/deep_sleep/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/delonghi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/delonghi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/delonghi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dfplayer/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dfplayer/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dfplayer/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dfplayer/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dht/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dht/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dht/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dht/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dht12/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dht12/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dht12/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dht12/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/display/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dps310/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dps310/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dps310/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dps310/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ds1307/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ds1307/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ds1307/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ds1307/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dsmr/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dsmr/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dsmr/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dsmr/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/duty_cycle/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/duty_cycle/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/duty_cycle/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/duty_cycle/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/duty_time/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/duty_time/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/duty_time/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/duty_time/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/e131/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/e131/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/e131/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/e131/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ee895/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ee895/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ee895/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ee895/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ektf2232/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ektf2232/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ektf2232/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ektf2232/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/emc2101/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/emc2101/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/emc2101/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/emc2101/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/emmeti/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/emmeti/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/endstop/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/endstop/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/endstop/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/endstop/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ens160_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ens160_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ens160_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ens160_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ens210/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ens210/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ens210/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ens210/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/esp32_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_beacon/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_beacon/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_client/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_client/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_server/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_server/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_tracker/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_tracker/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_camera/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_camera_web_server/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_can/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_can/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_dac/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_hall/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_improv/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_improv/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_rmt_led_strip/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_rmt_led_strip/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_touch/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp8266_pwm/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ethernet/{test-dp83848.esp32.yaml => test-dp83848.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-ip101.esp32.yaml => test-ip101.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-jl1101.esp32.yaml => test-jl1101.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-ksz8081.esp32.yaml => test-ksz8081.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-ksz8081rna.esp32.yaml => test-ksz8081rna.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-lan8720.esp32.yaml => test-lan8720.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-rtl8201.esp32.yaml => test-rtl8201.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-w5500.esp32.yaml => test-w5500.esp32-ard.yaml} (100%) rename tests/components/ethernet_info/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/event/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/event/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/event/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/event/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/exposure_notifications/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/exposure_notifications/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/external_components/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/external_components/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/external_components/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/external_components/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ezo/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ezo/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ezo/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ezo/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/factory_reset/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/factory_reset/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/factory_reset/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/factory_reset/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fastled_clockless/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fastled_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/feedback/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/feedback/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/feedback/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/feedback/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/font/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/font/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/font/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/font/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fs3000/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fs3000/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/fs3000/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/fs3000/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ft5x06/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ft5x06/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ft5x06/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ft5x06/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ft63x6/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ft63x6/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ft63x6/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ft63x6/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fujitsu_general/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fujitsu_general/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/fujitsu_general/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gcja5/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gcja5/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gcja5/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gcja5/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gdk101/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gdk101/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gdk101/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/globals/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/globals/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/globals/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/globals/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gp8403/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gp8403/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gp8403/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gp8403/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gpio/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gpio/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gpio/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gpio/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gps/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gps/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gps/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gps/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/graph/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/graph/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/graph/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/graph/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gree/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gree/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gree/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/growatt_solar/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/growatt_solar/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/growatt_solar/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/growatt_solar/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gt911/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gt911/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gt911/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gt911/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/haier/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/haier/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/haier/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/haier/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/havells_solar/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/havells_solar/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/havells_solar/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/havells_solar/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hbridge/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hbridge/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hbridge/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hbridge/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hdc1080/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hdc1080/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hdc1080/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hdc1080/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/he60r/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/he60r/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/he60r/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/he60r/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/heatpumpir/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/heatpumpir/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hitachi_ac344/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hitachi_ac344/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hitachi_ac344/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hitachi_ac424/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hitachi_ac424/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hitachi_ac424/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hlw8012/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hlw8012/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hlw8012/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hlw8012/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hm3301/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hm3301/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hm3301/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hm3301/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hmc5883l/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hmc5883l/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hmc5883l/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hmc5883l/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/homeassistant/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/homeassistant/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/homeassistant/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/homeassistant/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/homeassistant/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/honeywellabp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/honeywellabp/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/honeywellabp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/honeywellabp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hte501/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hte501/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hte501/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hte501/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/http_request/{test-nossl.esp8266.yaml => test-nossl.esp8266-ard.yaml} (100%) rename tests/components/http_request/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/http_request/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/http_request/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/http_request/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/htu21d/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/htu21d/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/htu21d/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/htu21d/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/htu31d/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/htu31d/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hx711/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hx711/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hx711/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hx711/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hyt271/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hyt271/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hyt271/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hyt271/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/i2s_audio/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/i2s_audio/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/iaqcore/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/iaqcore/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/iaqcore/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/iaqcore/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ili9xxx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ili9xxx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ili9xxx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ili9xxx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/image/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/image/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/image/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/image/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/improv_serial/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/improv_serial/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/improv_serial/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/improv_serial/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina219/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina219/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina219/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina219/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina226/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina226/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina226/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina226/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina260/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina260/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina260/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina260/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina3221/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina3221/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina3221/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina3221/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/inkbird_ibsth1_mini/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/inkbird_ibsth1_mini/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/inkplate6/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/integration/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/integration/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/integration/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/integration/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/integration/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/integration/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/internal_temperature/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32-s2.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/internal_temperature/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/interval/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/interval/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/interval/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/interval/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/kamstrup_kmp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/kamstrup_kmp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/key_collector/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/key_collector/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/key_collector/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/key_collector/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/kmeteriso/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/kmeteriso/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/kmeteriso/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/kmeteriso/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/kuntze/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/kuntze/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/kuntze/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/kuntze/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lcd_menu/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lcd_menu/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lcd_menu/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lcd_menu/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ld2410/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ld2410/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ld2410/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ld2410/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ld2420/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ld2420/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ld2420/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ld2420/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ledc/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ledc/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/light/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/light/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/light/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/light/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lightwaverf/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lock/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lock/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lock/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lock/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/logger/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/logger/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/logger/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/logger/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ltr390/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ltr390/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ltr390/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ltr390/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max31855/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max31855/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max31855/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max31855/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max31856/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max31856/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max31856/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max31856/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max31865/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max31865/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max31865/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max31865/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max44009/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max44009/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max44009/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max44009/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max6675/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max6675/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max6675/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max6675/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max6956/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max6956/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max6956/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max6956/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max7219/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max7219/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max7219/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max7219/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max7219digit/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max7219digit/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max7219digit/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max7219digit/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max9611/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max9611/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max9611/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max9611/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23008/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23008/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23008/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23008/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23016/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23016/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23016/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23016/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23017/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23017/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23017/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23017/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23s08/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23s08/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23s08/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23s08/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23s17/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23s17/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23s17/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23s17/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp2515/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp2515/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp2515/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp2515/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp3008/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp3008/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp3008/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp3008/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp3204/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp3204/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp3204/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp3204/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp4725/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp4725/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp4725/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp4725/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp4728/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp4728/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp4728/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp4728/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp47a1/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp47a1/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp47a1/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp47a1/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp9600/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp9600/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp9600/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp9600/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp9808/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp9808/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp9808/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp9808/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mdns/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mdns/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mdns/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mdns/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/media_player/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mhz19/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mhz19/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mhz19/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mhz19/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/micronova/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/micronova/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/micronova/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/micronova/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/microphone/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/microphone/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mics_4514/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mics_4514/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mics_4514/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mics_4514/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/midea/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/midea/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/midea/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/midea_ir/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/midea_ir/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/midea_ir/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mitsubishi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mitsubishi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mitsubishi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mlx90393/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mlx90393/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mlx90393/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mlx90393/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mlx90614/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mlx90614/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mlx90614/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mlx90614/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mmc5603/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mmc5603/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mmc5603/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mmc5603/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mmc5983/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mmc5983/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mmc5983/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mmc5983/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/modbus/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/modbus/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/modbus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/modbus/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/modbus_controller/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/modbus_controller/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/modbus_controller/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/modbus_controller/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/monochromatic/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/monochromatic/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/monochromatic/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/monochromatic/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mopeka_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mopeka_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mopeka_pro_check/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mopeka_pro_check/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mopeka_std_check/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mopeka_std_check/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mpr121/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpr121/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpr121/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpr121/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mpu6050/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpu6050/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpu6050/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpu6050/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mpu6886/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpu6886/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpu6886/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpu6886/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mqtt/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/mqtt/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mqtt/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mqtt/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mqtt_subscribe/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mqtt_subscribe/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mqtt_subscribe/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ms5611/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ms5611/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ms5611/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ms5611/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/my9231/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/my9231/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/my9231/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/my9231/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/neopixelbus/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/neopixelbus/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/neopixelbus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/network/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/network/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/network/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/network/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/nextion/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/nextion/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/nextion/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/nextion/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/noblex/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/noblex/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/noblex/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ntc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ntc/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ntc/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/ntc/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/ntc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ntc/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ota/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ota/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ota/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ota/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/output/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/output/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/output/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/output/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/partition/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/partition/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca6416a/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pca6416a/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca6416a/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pca6416a/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pca9554/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pca9554/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca9554/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pca9554/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pca9685/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pca9685/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca9685/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pca9685/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcd8544/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcd8544/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcd8544/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcd8544/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcf85063/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcf85063/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcf85063/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcf85063/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcf8563/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcf8563/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcf8563/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcf8563/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcf8574/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcf8574/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcf8574/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcf8574/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pid/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pid/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pid/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pid/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pipsolar/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pipsolar/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pipsolar/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pipsolar/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pm1006/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pm1006/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pm1006/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pm1006/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pmsa003i/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pmsa003i/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pmsa003i/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pmsa003i/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pmsx003/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pmsx003/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pmsx003/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pmsx003/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pmwcs3/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pmwcs3/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pmwcs3/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pmwcs3/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn532_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn532_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn532_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn532_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/power_supply/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/power_supply/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/power_supply/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/power_supply/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/prometheus/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/prometheus/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/prometheus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/psram/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/psram/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_counter/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pulse_counter/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_counter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pulse_counter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pulse_meter/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pulse_meter/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_meter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pulse_meter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pulse_width/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pulse_width/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_width/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pulse_width/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pvvx_mithermometer/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pvvx_mithermometer/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pylontech/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pylontech/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pylontech/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pylontech/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pzem004t/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pzem004t/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pzem004t/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pzem004t/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pzemac/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pzemac/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pzemac/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pzemac/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pzemdc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pzemdc/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pzemdc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pzemdc/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qmc5883l/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qmc5883l/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qmc5883l/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qmc5883l/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qmp6988/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qmp6988/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qmp6988/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qmp6988/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qr_code/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qr_code/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qr_code/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qr_code/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/radon_eye_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/radon_eye_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/radon_eye_rd200/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/radon_eye_rd200/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rc522_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rc522_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rc522_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rc522_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rdm6300/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rdm6300/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rdm6300/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rdm6300/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/remote_receiver/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/remote_receiver/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/remote_receiver/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/remote_transmitter/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/remote_transmitter/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/remote_transmitter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/resistance/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/resistance/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/resistance/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/resistance/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/resistance/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/resistance/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/restart/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/restart/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/restart/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/restart/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rf_bridge/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rf_bridge/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rf_bridge/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rf_bridge/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgb/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgb/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgb/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgb/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgbct/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgbct/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgbct/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgbct/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgbw/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgbw/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgbw/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgbw/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgbww/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgbww/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgbww/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgbww/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rp2040_pio_led_strip/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rp2040_pwm/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rtttl/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rtttl/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rtttl/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rtttl/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ruuvi_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ruuvi_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ruuvitag/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ruuvitag/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/safe_mode/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/safe_mode/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/safe_mode/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/safe_mode/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/scd30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/scd30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/scd30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/scd30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/scd4x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/scd4x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/scd4x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/scd4x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/script/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/script/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/script/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/script/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/script/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sdm_meter/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sdm_meter/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sdm_meter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sdm_meter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sdp3x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sdp3x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sdp3x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sdp3x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sds011/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sds011/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sds011/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sds011/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/seeed_mr24hpc1/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/selec_meter/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/selec_meter/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/selec_meter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/selec_meter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sen0321/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sen0321/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sen0321/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sen0321/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sen21231/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sen21231/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sen21231/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sen21231/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sen5x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sen5x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sen5x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sen5x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/senseair/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/senseair/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/senseair/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/senseair/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/servo/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/servo/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/servo/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/servo/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sfa30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sfa30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sfa30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sfa30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sgp30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sgp30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sgp30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sgp30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sgp4x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sgp4x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sgp4x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sgp4x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/shelly_dimmer/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sht3xd/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sht3xd/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sht3xd/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sht3xd/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sht4x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sht4x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sht4x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sht4x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/shtcx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/shtcx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/shtcx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/shtcx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/shutdown/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/shutdown/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/shutdown/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/shutdown/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sim800l/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sim800l/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sim800l/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sim800l/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/slow_pwm/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/slow_pwm/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/slow_pwm/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/slow_pwm/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm16716/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm16716/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm16716/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm16716/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm2135/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm2135/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm2135/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm2135/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm2235/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm2235/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm2235/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm2235/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm2335/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm2335/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm2335/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm2335/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm300d2/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm300d2/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm300d2/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm300d2/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sml/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sml/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sml/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sml/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/smt100/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/smt100/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/smt100/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/smt100/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sn74hc165/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sn74hc165/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sn74hc165/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sn74hc165/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sn74hc595/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sn74hc595/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sn74hc595/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sn74hc595/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sntp/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/sntp/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sntp/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sntp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sntp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sonoff_d1/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sonoff_d1/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/speaker/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/speaker/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/speed/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/speed/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/speed/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/speed/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/spi_device/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/spi_device/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/spi_device/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/spi_device/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sprinkler/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sprinkler/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sprinkler/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sprinkler/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sps30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sps30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sps30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sps30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7567_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7567_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7567_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7567_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7735/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7735/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7735/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7735/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7789v/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7789v/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7789v/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7789v/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7920/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7920/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7920/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7920/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/status/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/status/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/status/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/status/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/status_led/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/status_led/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/status_led/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/status_led/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/stepper/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/stepper/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/stepper/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/stepper/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sts3x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sts3x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sts3x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sts3x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sun/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sun/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sun/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sun/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sx1509/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sx1509/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sx1509/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sx1509/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/t6615/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/t6615/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/t6615/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/t6615/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tca9548a/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tca9548a/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tca9548a/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tca9548a/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tcl112/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tcl112/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tcl112/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tcs34725/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tcs34725/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tcs34725/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tcs34725/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tee501/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tee501/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tee501/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tee501/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/teleinfo/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/teleinfo/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/teleinfo/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/teleinfo/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/template/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/template/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/template/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/template/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/template/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/thermostat/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/thermostat/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/thermostat/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/thermostat/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/time/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/time/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/time/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/time/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/time_based/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/time_based/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/time_based/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/time_based/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tlc59208f/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tlc59208f/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tlc59208f/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tlc59208f/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tlc5947/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tlc5947/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tlc5947/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tlc5947/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tlc5971/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1621/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1621/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1621/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1621/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1637/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1637/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1637/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1637/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1638/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1638/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1638/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1638/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1651/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1651/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1651/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1651/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tmp102/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tmp102/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tmp102/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tmp102/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tmp1075/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tmp1075/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tmp1075/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tmp1075/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tmp117/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tmp117/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tmp117/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tmp117/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tof10120/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tof10120/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tof10120/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tof10120/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/toshiba/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/toshiba/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/toshiba/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tsl2561/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tsl2561/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tsl2561/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tsl2561/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tsl2591/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tsl2591/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tsl2591/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tsl2591/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tt21100/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tt21100/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tt21100/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/tt21100/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tt21100/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tuya/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tuya/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tuya/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tuya/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tx20/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tx20/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tx20/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tx20/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uart/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uart/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uart/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uart/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ufire_ec/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ufire_ec/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ufire_ec/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ufire_ec/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ufire_ise/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ufire_ise/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ufire_ise/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ufire_ise/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uln2003/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uln2003/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uln2003/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uln2003/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ultrasonic/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ultrasonic/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ultrasonic/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ultrasonic/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/update/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/update/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uptime/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uptime/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uptime/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uptime/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/vbus/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/vbus/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/vbus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/vbus/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/veml3235/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/veml3235/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/veml3235/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/veml3235/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/veml7700/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/veml7700/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/veml7700/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/veml7700/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/version/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/version/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/version/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/version/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/vl53l0x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/vl53l0x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/vl53l0x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/vl53l0x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/voice_assistant/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/voice_assistant/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/web_server/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/web_server/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/web_server/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/whirlpool/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/whirlpool/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/whirlpool/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/whynter/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/whynter/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/whynter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wiegand/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wiegand/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wiegand/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wiegand/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wifi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wifi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wifi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wifi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wifi_info/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wifi_info/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wifi_info/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wifi_info/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wifi_signal/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wifi_signal/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wifi_signal/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wifi_signal/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wireguard/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/wireguard/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wireguard/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wireguard/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wk2132_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2132_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2132_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2132_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2168_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2168_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2168_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2168_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2204_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2204_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2204_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2204_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2212_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2212_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2212_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2212_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wl_134/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wl_134/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wl_134/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wl_134/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wled/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wled/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wled/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/x9c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/x9c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/x9c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/x9c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/xiaomi_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgd1/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgd1/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgdk2/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgdk2/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgg1/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgg1/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgpr1/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgpr1/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_gcls002/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_gcls002/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_hhccjcy01/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_hhccjcy01/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_hhccpot002/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_hhccpot002/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_jqjcy01ym/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_jqjcy01ym/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_lywsd02/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_lywsd02/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_lywsd03mmc/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_lywsd03mmc/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_lywsdcgq/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_lywsdcgq/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mhoc303/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mhoc303/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mhoc401/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mhoc401/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_miscale copy/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_miscale copy/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_miscale/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_miscale/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mjyd02yla/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mjyd02yla/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mue4094rt/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mue4094rt/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_rtcgq02lm/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_rtcgq02lm/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_wx08zm/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_wx08zm/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xl9535/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xl9535/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xl9535/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/xl9535/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/xpt2046/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/yashima/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/yashima/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/yashima/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zhlt01/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/zhlt01/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/zhlt01/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/zyaura/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/zyaura/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/zyaura/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zyaura/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/test_build_components/{build_components_base.bk72xx.yaml => build_components_base.bk72xx-ard.yaml} (100%) create mode 100644 tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml create mode 100644 tests/test_build_components/build_components_base.esp32-idf-50.yaml create mode 100644 tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml create mode 100644 tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml rename tests/test_build_components/{build_components_base.esp8266.yaml => build_components_base.esp8266-ard.yaml} (87%) rename tests/test_build_components/{build_components_base.rp2040.yaml => build_components_base.rp2040-ard.yaml} (92%) diff --git a/script/test_build_components b/script/test_build_components index f82dd5c3b6..9bbb694dcc 100755 --- a/script/test_build_components +++ b/script/test_build_components @@ -24,8 +24,8 @@ fi start_esphome() { # create dynamic yaml file in `build` folder. - # `./tests/test_build_components/build/[target_component].[test_name].[target_platform].yaml` - component_test_file="./tests/test_build_components/build/$target_component.$test_name.$target_platform.yaml" + # `./tests/test_build_components/build/[target_component].[test_name].[target_platform_with_version].yaml` + component_test_file="./tests/test_build_components/build/$target_component.$test_name.$target_platform_with_version.yaml" cp $target_platform_file $component_test_file if [[ "$OSTYPE" == "darwin"* ]]; then @@ -36,7 +36,7 @@ start_esphome() { fi # Start esphome process - echo "> [$target_component] [$test_name] [$target_platform]" + echo "> [$target_component] [$test_name] [$target_platform_with_version]" set -x # TODO: Validate escape of Command line substitution value python -m esphome -s component_name $target_component -s component_dir ../../components/$target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file @@ -76,16 +76,17 @@ for f in ./tests/components/$target_component/*.*.yaml; do # 2. `./tests/test_build_components/build_components_base.[target_platform]-ard.yaml` target_platform_file="./tests/test_build_components/build_components_base.$target_platform.yaml" if ! [ -f "$target_platform_file" ]; then - # Try find arduino test framework as platform. - target_platform_ard="$target_platform-ard" - target_platform_file="./tests/test_build_components/build_components_base.$target_platform_ard.yaml" - if ! [ -f "$target_platform_file" ]; then - echo "No base test file [./tests/test_build_components/build_components_base.$target_platform.yaml, ./tests/build_components_base.$target_platform_ard.yaml] for component test [$f] found." - exit 1 - fi - target_platform=$target_platform_ard + echo "No base test file [./tests/test_build_components/build_components_base.$target_platform.yaml] for component test [$f] found." + exit 1 fi - start_esphome + for target_platform_file in ./tests/test_build_components/build_components_base.$target_platform*.yaml; do + # trim off "./tests/test_build_components/build_components_base." prefix + target_platform_with_version=${target_platform_file:52} + # ...now remove suffix starting with "." leaving just the test target hardware and software platform (possibly with version) + # For example: "esp32-s3-idf-50" + target_platform_with_version=${target_platform_with_version%.*} + start_esphome + done fi done diff --git a/tests/components/a01nyub/test.esp32.yaml b/tests/components/a01nyub/test.esp32-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.esp32.yaml rename to tests/components/a01nyub/test.esp32-ard.yaml diff --git a/tests/components/a01nyub/test.esp32-c3.yaml b/tests/components/a01nyub/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.esp32-c3.yaml rename to tests/components/a01nyub/test.esp32-c3-ard.yaml diff --git a/tests/components/a01nyub/test.esp8266.yaml b/tests/components/a01nyub/test.esp8266-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.esp8266.yaml rename to tests/components/a01nyub/test.esp8266-ard.yaml diff --git a/tests/components/a01nyub/test.rp2040.yaml b/tests/components/a01nyub/test.rp2040-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.rp2040.yaml rename to tests/components/a01nyub/test.rp2040-ard.yaml diff --git a/tests/components/a02yyuw/test.esp32.yaml b/tests/components/a02yyuw/test.esp32-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.esp32.yaml rename to tests/components/a02yyuw/test.esp32-ard.yaml diff --git a/tests/components/a02yyuw/test.esp32-c3.yaml b/tests/components/a02yyuw/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.esp32-c3.yaml rename to tests/components/a02yyuw/test.esp32-c3-ard.yaml diff --git a/tests/components/a02yyuw/test.esp8266.yaml b/tests/components/a02yyuw/test.esp8266-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.esp8266.yaml rename to tests/components/a02yyuw/test.esp8266-ard.yaml diff --git a/tests/components/a02yyuw/test.rp2040.yaml b/tests/components/a02yyuw/test.rp2040-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.rp2040.yaml rename to tests/components/a02yyuw/test.rp2040-ard.yaml diff --git a/tests/components/a4988/test.esp32.yaml b/tests/components/a4988/test.esp32-ard.yaml similarity index 100% rename from tests/components/a4988/test.esp32.yaml rename to tests/components/a4988/test.esp32-ard.yaml diff --git a/tests/components/a4988/test.esp32-c3.yaml b/tests/components/a4988/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/a4988/test.esp32-c3.yaml rename to tests/components/a4988/test.esp32-c3-ard.yaml diff --git a/tests/components/a4988/test.esp8266.yaml b/tests/components/a4988/test.esp8266-ard.yaml similarity index 100% rename from tests/components/a4988/test.esp8266.yaml rename to tests/components/a4988/test.esp8266-ard.yaml diff --git a/tests/components/a4988/test.rp2040.yaml b/tests/components/a4988/test.rp2040-ard.yaml similarity index 100% rename from tests/components/a4988/test.rp2040.yaml rename to tests/components/a4988/test.rp2040-ard.yaml diff --git a/tests/components/absolute_humidity/test.esp32-c3.yaml b/tests/components/absolute_humidity/test.esp32-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.esp32-c3.yaml rename to tests/components/absolute_humidity/test.esp32-ard.yaml diff --git a/tests/components/absolute_humidity/test.esp32.yaml b/tests/components/absolute_humidity/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.esp32.yaml rename to tests/components/absolute_humidity/test.esp32-c3-ard.yaml diff --git a/tests/components/absolute_humidity/test.esp8266.yaml b/tests/components/absolute_humidity/test.esp8266-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.esp8266.yaml rename to tests/components/absolute_humidity/test.esp8266-ard.yaml diff --git a/tests/components/absolute_humidity/test.rp2040.yaml b/tests/components/absolute_humidity/test.rp2040-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.rp2040.yaml rename to tests/components/absolute_humidity/test.rp2040-ard.yaml diff --git a/tests/components/ac_dimmer/test.esp32.yaml b/tests/components/ac_dimmer/test.esp32-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.esp32.yaml rename to tests/components/ac_dimmer/test.esp32-ard.yaml diff --git a/tests/components/ac_dimmer/test.esp32-c3.yaml b/tests/components/ac_dimmer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.esp32-c3.yaml rename to tests/components/ac_dimmer/test.esp32-c3-ard.yaml diff --git a/tests/components/ac_dimmer/test.esp8266.yaml b/tests/components/ac_dimmer/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.esp8266.yaml rename to tests/components/ac_dimmer/test.esp8266-ard.yaml diff --git a/tests/components/ac_dimmer/test.rp2040.yaml b/tests/components/ac_dimmer/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.rp2040.yaml rename to tests/components/ac_dimmer/test.rp2040-ard.yaml diff --git a/tests/components/adc/test.esp32.yaml b/tests/components/adc/test.esp32-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32.yaml rename to tests/components/adc/test.esp32-ard.yaml diff --git a/tests/components/adc/test.esp32-c3.yaml b/tests/components/adc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32-c3.yaml rename to tests/components/adc/test.esp32-c3-ard.yaml diff --git a/tests/components/adc/test.esp32-s2.yaml b/tests/components/adc/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32-s2.yaml rename to tests/components/adc/test.esp32-s2-ard.yaml diff --git a/tests/components/adc/test.esp32-s3.yaml b/tests/components/adc/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32-s3.yaml rename to tests/components/adc/test.esp32-s3-ard.yaml diff --git a/tests/components/adc/test.esp8266.yaml b/tests/components/adc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/adc/test.esp8266.yaml rename to tests/components/adc/test.esp8266-ard.yaml diff --git a/tests/components/adc/test.rp2040.yaml b/tests/components/adc/test.rp2040-ard.yaml similarity index 100% rename from tests/components/adc/test.rp2040.yaml rename to tests/components/adc/test.rp2040-ard.yaml diff --git a/tests/components/adc128s102/test.esp32.yaml b/tests/components/adc128s102/test.esp32-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.esp32.yaml rename to tests/components/adc128s102/test.esp32-ard.yaml diff --git a/tests/components/adc128s102/test.esp32-c3.yaml b/tests/components/adc128s102/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.esp32-c3.yaml rename to tests/components/adc128s102/test.esp32-c3-ard.yaml diff --git a/tests/components/adc128s102/test.esp8266.yaml b/tests/components/adc128s102/test.esp8266-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.esp8266.yaml rename to tests/components/adc128s102/test.esp8266-ard.yaml diff --git a/tests/components/adc128s102/test.rp2040.yaml b/tests/components/adc128s102/test.rp2040-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.rp2040.yaml rename to tests/components/adc128s102/test.rp2040-ard.yaml diff --git a/tests/components/addressable_light/test.esp32.yaml b/tests/components/addressable_light/test.esp32-ard.yaml similarity index 100% rename from tests/components/addressable_light/test.esp32.yaml rename to tests/components/addressable_light/test.esp32-ard.yaml diff --git a/tests/components/addressable_light/test.esp32-c3.yaml b/tests/components/addressable_light/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/addressable_light/test.esp32-c3.yaml rename to tests/components/addressable_light/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7880/test.esp32.yaml b/tests/components/ade7880/test.esp32-ard.yaml similarity index 100% rename from tests/components/ade7880/test.esp32.yaml rename to tests/components/ade7880/test.esp32-ard.yaml diff --git a/tests/components/ade7880/test.esp32-c3.yaml b/tests/components/ade7880/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ade7880/test.esp32-c3.yaml rename to tests/components/ade7880/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7880/test.esp8266.yaml b/tests/components/ade7880/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ade7880/test.esp8266.yaml rename to tests/components/ade7880/test.esp8266-ard.yaml diff --git a/tests/components/ade7880/test.rp2040.yaml b/tests/components/ade7880/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ade7880/test.rp2040.yaml rename to tests/components/ade7880/test.rp2040-ard.yaml diff --git a/tests/components/ade7953_i2c/test.esp32.yaml b/tests/components/ade7953_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.esp32.yaml rename to tests/components/ade7953_i2c/test.esp32-ard.yaml diff --git a/tests/components/ade7953_i2c/test.esp32-c3.yaml b/tests/components/ade7953_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.esp32-c3.yaml rename to tests/components/ade7953_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7953_i2c/test.esp8266.yaml b/tests/components/ade7953_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.esp8266.yaml rename to tests/components/ade7953_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ade7953_i2c/test.rp2040.yaml b/tests/components/ade7953_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.rp2040.yaml rename to tests/components/ade7953_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ade7953_spi/test.esp32.yaml b/tests/components/ade7953_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.esp32.yaml rename to tests/components/ade7953_spi/test.esp32-ard.yaml diff --git a/tests/components/ade7953_spi/test.esp32-c3.yaml b/tests/components/ade7953_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.esp32-c3.yaml rename to tests/components/ade7953_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7953_spi/test.esp8266.yaml b/tests/components/ade7953_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.esp8266.yaml rename to tests/components/ade7953_spi/test.esp8266-ard.yaml diff --git a/tests/components/ade7953_spi/test.rp2040.yaml b/tests/components/ade7953_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.rp2040.yaml rename to tests/components/ade7953_spi/test.rp2040-ard.yaml diff --git a/tests/components/ads1115/test.esp32.yaml b/tests/components/ads1115/test.esp32-ard.yaml similarity index 100% rename from tests/components/ads1115/test.esp32.yaml rename to tests/components/ads1115/test.esp32-ard.yaml diff --git a/tests/components/ads1115/test.esp32-c3.yaml b/tests/components/ads1115/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ads1115/test.esp32-c3.yaml rename to tests/components/ads1115/test.esp32-c3-ard.yaml diff --git a/tests/components/ads1115/test.esp8266.yaml b/tests/components/ads1115/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ads1115/test.esp8266.yaml rename to tests/components/ads1115/test.esp8266-ard.yaml diff --git a/tests/components/ads1115/test.rp2040.yaml b/tests/components/ads1115/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ads1115/test.rp2040.yaml rename to tests/components/ads1115/test.rp2040-ard.yaml diff --git a/tests/components/ags10/test.esp32.yaml b/tests/components/ags10/test.esp32-ard.yaml similarity index 100% rename from tests/components/ags10/test.esp32.yaml rename to tests/components/ags10/test.esp32-ard.yaml diff --git a/tests/components/ags10/test.esp32-c3.yaml b/tests/components/ags10/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ags10/test.esp32-c3.yaml rename to tests/components/ags10/test.esp32-c3-ard.yaml diff --git a/tests/components/ags10/test.esp8266.yaml b/tests/components/ags10/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ags10/test.esp8266.yaml rename to tests/components/ags10/test.esp8266-ard.yaml diff --git a/tests/components/aht10/test.esp32.yaml b/tests/components/aht10/test.esp32-ard.yaml similarity index 100% rename from tests/components/aht10/test.esp32.yaml rename to tests/components/aht10/test.esp32-ard.yaml diff --git a/tests/components/aht10/test.esp32-c3.yaml b/tests/components/aht10/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/aht10/test.esp32-c3.yaml rename to tests/components/aht10/test.esp32-c3-ard.yaml diff --git a/tests/components/aht10/test.esp8266.yaml b/tests/components/aht10/test.esp8266-ard.yaml similarity index 100% rename from tests/components/aht10/test.esp8266.yaml rename to tests/components/aht10/test.esp8266-ard.yaml diff --git a/tests/components/aht10/test.rp2040.yaml b/tests/components/aht10/test.rp2040-ard.yaml similarity index 100% rename from tests/components/aht10/test.rp2040.yaml rename to tests/components/aht10/test.rp2040-ard.yaml diff --git a/tests/components/airthings_wave_mini/test.esp32-c3.yaml b/tests/components/airthings_wave_mini/test.esp32-ard.yaml similarity index 100% rename from tests/components/airthings_wave_mini/test.esp32-c3.yaml rename to tests/components/airthings_wave_mini/test.esp32-ard.yaml diff --git a/tests/components/airthings_wave_mini/test.esp32.yaml b/tests/components/airthings_wave_mini/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/airthings_wave_mini/test.esp32.yaml rename to tests/components/airthings_wave_mini/test.esp32-c3-ard.yaml diff --git a/tests/components/airthings_wave_plus/test.esp32-c3.yaml b/tests/components/airthings_wave_plus/test.esp32-ard.yaml similarity index 100% rename from tests/components/airthings_wave_plus/test.esp32-c3.yaml rename to tests/components/airthings_wave_plus/test.esp32-ard.yaml diff --git a/tests/components/airthings_wave_plus/test.esp32.yaml b/tests/components/airthings_wave_plus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/airthings_wave_plus/test.esp32.yaml rename to tests/components/airthings_wave_plus/test.esp32-c3-ard.yaml diff --git a/tests/components/alarm_control_panel/test.esp32-c3.yaml b/tests/components/alarm_control_panel/test.esp32-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.esp32-c3.yaml rename to tests/components/alarm_control_panel/test.esp32-ard.yaml diff --git a/tests/components/alarm_control_panel/test.esp32.yaml b/tests/components/alarm_control_panel/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.esp32.yaml rename to tests/components/alarm_control_panel/test.esp32-c3-ard.yaml diff --git a/tests/components/alarm_control_panel/test.esp8266.yaml b/tests/components/alarm_control_panel/test.esp8266-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.esp8266.yaml rename to tests/components/alarm_control_panel/test.esp8266-ard.yaml diff --git a/tests/components/alarm_control_panel/test.rp2040.yaml b/tests/components/alarm_control_panel/test.rp2040-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.rp2040.yaml rename to tests/components/alarm_control_panel/test.rp2040-ard.yaml diff --git a/tests/components/alpha3/test.esp32-c3.yaml b/tests/components/alpha3/test.esp32-ard.yaml similarity index 100% rename from tests/components/alpha3/test.esp32-c3.yaml rename to tests/components/alpha3/test.esp32-ard.yaml diff --git a/tests/components/alpha3/test.esp32.yaml b/tests/components/alpha3/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/alpha3/test.esp32.yaml rename to tests/components/alpha3/test.esp32-c3-ard.yaml diff --git a/tests/components/am2315c/test.esp32.yaml b/tests/components/am2315c/test.esp32-ard.yaml similarity index 100% rename from tests/components/am2315c/test.esp32.yaml rename to tests/components/am2315c/test.esp32-ard.yaml diff --git a/tests/components/am2315c/test.esp32-c3.yaml b/tests/components/am2315c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/am2315c/test.esp32-c3.yaml rename to tests/components/am2315c/test.esp32-c3-ard.yaml diff --git a/tests/components/am2315c/test.esp8266.yaml b/tests/components/am2315c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/am2315c/test.esp8266.yaml rename to tests/components/am2315c/test.esp8266-ard.yaml diff --git a/tests/components/am2315c/test.rp2040.yaml b/tests/components/am2315c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/am2315c/test.rp2040.yaml rename to tests/components/am2315c/test.rp2040-ard.yaml diff --git a/tests/components/am2320/test.esp32.yaml b/tests/components/am2320/test.esp32-ard.yaml similarity index 100% rename from tests/components/am2320/test.esp32.yaml rename to tests/components/am2320/test.esp32-ard.yaml diff --git a/tests/components/am2320/test.esp32-c3.yaml b/tests/components/am2320/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/am2320/test.esp32-c3.yaml rename to tests/components/am2320/test.esp32-c3-ard.yaml diff --git a/tests/components/am2320/test.esp8266.yaml b/tests/components/am2320/test.esp8266-ard.yaml similarity index 100% rename from tests/components/am2320/test.esp8266.yaml rename to tests/components/am2320/test.esp8266-ard.yaml diff --git a/tests/components/am2320/test.rp2040.yaml b/tests/components/am2320/test.rp2040-ard.yaml similarity index 100% rename from tests/components/am2320/test.rp2040.yaml rename to tests/components/am2320/test.rp2040-ard.yaml diff --git a/tests/components/am43/test.esp32-c3.yaml b/tests/components/am43/test.esp32-ard.yaml similarity index 100% rename from tests/components/am43/test.esp32-c3.yaml rename to tests/components/am43/test.esp32-ard.yaml diff --git a/tests/components/am43/test.esp32.yaml b/tests/components/am43/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/am43/test.esp32.yaml rename to tests/components/am43/test.esp32-c3-ard.yaml diff --git a/tests/components/analog_threshold/test.esp32-c3.yaml b/tests/components/analog_threshold/test.esp32-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.esp32-c3.yaml rename to tests/components/analog_threshold/test.esp32-ard.yaml diff --git a/tests/components/analog_threshold/test.esp32.yaml b/tests/components/analog_threshold/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.esp32.yaml rename to tests/components/analog_threshold/test.esp32-c3-ard.yaml diff --git a/tests/components/analog_threshold/test.esp8266.yaml b/tests/components/analog_threshold/test.esp8266-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.esp8266.yaml rename to tests/components/analog_threshold/test.esp8266-ard.yaml diff --git a/tests/components/analog_threshold/test.rp2040.yaml b/tests/components/analog_threshold/test.rp2040-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.rp2040.yaml rename to tests/components/analog_threshold/test.rp2040-ard.yaml diff --git a/tests/components/animation/test.esp32.yaml b/tests/components/animation/test.esp32-ard.yaml similarity index 100% rename from tests/components/animation/test.esp32.yaml rename to tests/components/animation/test.esp32-ard.yaml diff --git a/tests/components/animation/test.esp32-c3.yaml b/tests/components/animation/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/animation/test.esp32-c3.yaml rename to tests/components/animation/test.esp32-c3-ard.yaml diff --git a/tests/components/animation/test.esp8266.yaml b/tests/components/animation/test.esp8266-ard.yaml similarity index 100% rename from tests/components/animation/test.esp8266.yaml rename to tests/components/animation/test.esp8266-ard.yaml diff --git a/tests/components/animation/test.rp2040.yaml b/tests/components/animation/test.rp2040-ard.yaml similarity index 100% rename from tests/components/animation/test.rp2040.yaml rename to tests/components/animation/test.rp2040-ard.yaml diff --git a/tests/components/anova/test.esp32-c3.yaml b/tests/components/anova/test.esp32-ard.yaml similarity index 100% rename from tests/components/anova/test.esp32-c3.yaml rename to tests/components/anova/test.esp32-ard.yaml diff --git a/tests/components/anova/test.esp32.yaml b/tests/components/anova/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/anova/test.esp32.yaml rename to tests/components/anova/test.esp32-c3-ard.yaml diff --git a/tests/components/apds9960/test.esp32.yaml b/tests/components/apds9960/test.esp32-ard.yaml similarity index 100% rename from tests/components/apds9960/test.esp32.yaml rename to tests/components/apds9960/test.esp32-ard.yaml diff --git a/tests/components/apds9960/test.esp32-c3.yaml b/tests/components/apds9960/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/apds9960/test.esp32-c3.yaml rename to tests/components/apds9960/test.esp32-c3-ard.yaml diff --git a/tests/components/apds9960/test.esp8266.yaml b/tests/components/apds9960/test.esp8266-ard.yaml similarity index 100% rename from tests/components/apds9960/test.esp8266.yaml rename to tests/components/apds9960/test.esp8266-ard.yaml diff --git a/tests/components/apds9960/test.rp2040.yaml b/tests/components/apds9960/test.rp2040-ard.yaml similarity index 100% rename from tests/components/apds9960/test.rp2040.yaml rename to tests/components/apds9960/test.rp2040-ard.yaml diff --git a/tests/components/api/test.esp32-c3.yaml b/tests/components/api/test.esp32-ard.yaml similarity index 100% rename from tests/components/api/test.esp32-c3.yaml rename to tests/components/api/test.esp32-ard.yaml diff --git a/tests/components/api/test.esp32.yaml b/tests/components/api/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/api/test.esp32.yaml rename to tests/components/api/test.esp32-c3-ard.yaml diff --git a/tests/components/api/test.esp8266.yaml b/tests/components/api/test.esp8266-ard.yaml similarity index 100% rename from tests/components/api/test.esp8266.yaml rename to tests/components/api/test.esp8266-ard.yaml diff --git a/tests/components/api/test.rp2040.yaml b/tests/components/api/test.rp2040-ard.yaml similarity index 100% rename from tests/components/api/test.rp2040.yaml rename to tests/components/api/test.rp2040-ard.yaml diff --git a/tests/components/as3935_i2c/test.esp32.yaml b/tests/components/as3935_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.esp32.yaml rename to tests/components/as3935_i2c/test.esp32-ard.yaml diff --git a/tests/components/as3935_i2c/test.esp32-c3.yaml b/tests/components/as3935_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.esp32-c3.yaml rename to tests/components/as3935_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/as3935_i2c/test.esp8266.yaml b/tests/components/as3935_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.esp8266.yaml rename to tests/components/as3935_i2c/test.esp8266-ard.yaml diff --git a/tests/components/as3935_i2c/test.rp2040.yaml b/tests/components/as3935_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.rp2040.yaml rename to tests/components/as3935_i2c/test.rp2040-ard.yaml diff --git a/tests/components/as3935_spi/test.esp32.yaml b/tests/components/as3935_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.esp32.yaml rename to tests/components/as3935_spi/test.esp32-ard.yaml diff --git a/tests/components/as3935_spi/test.esp32-c3.yaml b/tests/components/as3935_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.esp32-c3.yaml rename to tests/components/as3935_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/as3935_spi/test.esp8266.yaml b/tests/components/as3935_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.esp8266.yaml rename to tests/components/as3935_spi/test.esp8266-ard.yaml diff --git a/tests/components/as3935_spi/test.rp2040.yaml b/tests/components/as3935_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.rp2040.yaml rename to tests/components/as3935_spi/test.rp2040-ard.yaml diff --git a/tests/components/as5600/test.esp32.yaml b/tests/components/as5600/test.esp32-ard.yaml similarity index 100% rename from tests/components/as5600/test.esp32.yaml rename to tests/components/as5600/test.esp32-ard.yaml diff --git a/tests/components/as5600/test.esp32-c3.yaml b/tests/components/as5600/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as5600/test.esp32-c3.yaml rename to tests/components/as5600/test.esp32-c3-ard.yaml diff --git a/tests/components/as5600/test.esp8266.yaml b/tests/components/as5600/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as5600/test.esp8266.yaml rename to tests/components/as5600/test.esp8266-ard.yaml diff --git a/tests/components/as5600/test.rp2040.yaml b/tests/components/as5600/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as5600/test.rp2040.yaml rename to tests/components/as5600/test.rp2040-ard.yaml diff --git a/tests/components/as7341/test.esp32.yaml b/tests/components/as7341/test.esp32-ard.yaml similarity index 100% rename from tests/components/as7341/test.esp32.yaml rename to tests/components/as7341/test.esp32-ard.yaml diff --git a/tests/components/as7341/test.esp32-c3.yaml b/tests/components/as7341/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as7341/test.esp32-c3.yaml rename to tests/components/as7341/test.esp32-c3-ard.yaml diff --git a/tests/components/as7341/test.esp8266.yaml b/tests/components/as7341/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as7341/test.esp8266.yaml rename to tests/components/as7341/test.esp8266-ard.yaml diff --git a/tests/components/as7341/test.rp2040.yaml b/tests/components/as7341/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as7341/test.rp2040.yaml rename to tests/components/as7341/test.rp2040-ard.yaml diff --git a/tests/components/at581x/test.esp32.yaml b/tests/components/at581x/test.esp32-ard.yaml similarity index 100% rename from tests/components/at581x/test.esp32.yaml rename to tests/components/at581x/test.esp32-ard.yaml diff --git a/tests/components/at581x/test.esp32-c3.yaml b/tests/components/at581x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/at581x/test.esp32-c3.yaml rename to tests/components/at581x/test.esp32-c3-ard.yaml diff --git a/tests/components/at581x/test.esp8266.yaml b/tests/components/at581x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/at581x/test.esp8266.yaml rename to tests/components/at581x/test.esp8266-ard.yaml diff --git a/tests/components/at581x/test.rp2040.yaml b/tests/components/at581x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/at581x/test.rp2040.yaml rename to tests/components/at581x/test.rp2040-ard.yaml diff --git a/tests/components/atc_mithermometer/test.esp32-c3.yaml b/tests/components/atc_mithermometer/test.esp32-ard.yaml similarity index 100% rename from tests/components/atc_mithermometer/test.esp32-c3.yaml rename to tests/components/atc_mithermometer/test.esp32-ard.yaml diff --git a/tests/components/atc_mithermometer/test.esp32.yaml b/tests/components/atc_mithermometer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/atc_mithermometer/test.esp32.yaml rename to tests/components/atc_mithermometer/test.esp32-c3-ard.yaml diff --git a/tests/components/atm90e26/test.esp32.yaml b/tests/components/atm90e26/test.esp32-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.esp32.yaml rename to tests/components/atm90e26/test.esp32-ard.yaml diff --git a/tests/components/atm90e26/test.esp32-c3.yaml b/tests/components/atm90e26/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.esp32-c3.yaml rename to tests/components/atm90e26/test.esp32-c3-ard.yaml diff --git a/tests/components/atm90e26/test.esp8266.yaml b/tests/components/atm90e26/test.esp8266-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.esp8266.yaml rename to tests/components/atm90e26/test.esp8266-ard.yaml diff --git a/tests/components/atm90e26/test.rp2040.yaml b/tests/components/atm90e26/test.rp2040-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.rp2040.yaml rename to tests/components/atm90e26/test.rp2040-ard.yaml diff --git a/tests/components/atm90e32/test.esp32.yaml b/tests/components/atm90e32/test.esp32-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.esp32.yaml rename to tests/components/atm90e32/test.esp32-ard.yaml diff --git a/tests/components/atm90e32/test.esp32-c3.yaml b/tests/components/atm90e32/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.esp32-c3.yaml rename to tests/components/atm90e32/test.esp32-c3-ard.yaml diff --git a/tests/components/atm90e32/test.esp8266.yaml b/tests/components/atm90e32/test.esp8266-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.esp8266.yaml rename to tests/components/atm90e32/test.esp8266-ard.yaml diff --git a/tests/components/atm90e32/test.rp2040.yaml b/tests/components/atm90e32/test.rp2040-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.rp2040.yaml rename to tests/components/atm90e32/test.rp2040-ard.yaml diff --git a/tests/components/b_parasite/test.esp32-c3.yaml b/tests/components/b_parasite/test.esp32-ard.yaml similarity index 100% rename from tests/components/b_parasite/test.esp32-c3.yaml rename to tests/components/b_parasite/test.esp32-ard.yaml diff --git a/tests/components/b_parasite/test.esp32.yaml b/tests/components/b_parasite/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/b_parasite/test.esp32.yaml rename to tests/components/b_parasite/test.esp32-c3-ard.yaml diff --git a/tests/components/ballu/test.esp32.yaml b/tests/components/ballu/test.esp32-ard.yaml similarity index 100% rename from tests/components/ballu/test.esp32.yaml rename to tests/components/ballu/test.esp32-ard.yaml diff --git a/tests/components/ballu/test.esp8266.yaml b/tests/components/ballu/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ballu/test.esp8266.yaml rename to tests/components/ballu/test.esp8266-ard.yaml diff --git a/tests/components/bang_bang/test.esp32-c3.yaml b/tests/components/bang_bang/test.esp32-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.esp32-c3.yaml rename to tests/components/bang_bang/test.esp32-ard.yaml diff --git a/tests/components/bang_bang/test.esp32.yaml b/tests/components/bang_bang/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.esp32.yaml rename to tests/components/bang_bang/test.esp32-c3-ard.yaml diff --git a/tests/components/bang_bang/test.esp8266.yaml b/tests/components/bang_bang/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.esp8266.yaml rename to tests/components/bang_bang/test.esp8266-ard.yaml diff --git a/tests/components/bang_bang/test.rp2040.yaml b/tests/components/bang_bang/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.rp2040.yaml rename to tests/components/bang_bang/test.rp2040-ard.yaml diff --git a/tests/components/bedjet/test.esp32-c3.yaml b/tests/components/bedjet/test.esp32-ard.yaml similarity index 100% rename from tests/components/bedjet/test.esp32-c3.yaml rename to tests/components/bedjet/test.esp32-ard.yaml diff --git a/tests/components/bedjet/test.esp32.yaml b/tests/components/bedjet/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bedjet/test.esp32.yaml rename to tests/components/bedjet/test.esp32-c3-ard.yaml diff --git a/tests/components/beken_spi_led_strip/test.bk72xx.yaml b/tests/components/beken_spi_led_strip/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/beken_spi_led_strip/test.bk72xx.yaml rename to tests/components/beken_spi_led_strip/test.bk72xx-ard.yaml diff --git a/tests/components/bh1750/test.esp32.yaml b/tests/components/bh1750/test.esp32-ard.yaml similarity index 100% rename from tests/components/bh1750/test.esp32.yaml rename to tests/components/bh1750/test.esp32-ard.yaml diff --git a/tests/components/bh1750/test.esp32-c3.yaml b/tests/components/bh1750/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bh1750/test.esp32-c3.yaml rename to tests/components/bh1750/test.esp32-c3-ard.yaml diff --git a/tests/components/bh1750/test.esp8266.yaml b/tests/components/bh1750/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bh1750/test.esp8266.yaml rename to tests/components/bh1750/test.esp8266-ard.yaml diff --git a/tests/components/bh1750/test.rp2040.yaml b/tests/components/bh1750/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bh1750/test.rp2040.yaml rename to tests/components/bh1750/test.rp2040-ard.yaml diff --git a/tests/components/binary_sensor_map/test.esp32-c3.yaml b/tests/components/binary_sensor_map/test.esp32-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.esp32-c3.yaml rename to tests/components/binary_sensor_map/test.esp32-ard.yaml diff --git a/tests/components/binary_sensor_map/test.esp32.yaml b/tests/components/binary_sensor_map/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.esp32.yaml rename to tests/components/binary_sensor_map/test.esp32-c3-ard.yaml diff --git a/tests/components/binary_sensor_map/test.esp8266.yaml b/tests/components/binary_sensor_map/test.esp8266-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.esp8266.yaml rename to tests/components/binary_sensor_map/test.esp8266-ard.yaml diff --git a/tests/components/binary_sensor_map/test.rp2040.yaml b/tests/components/binary_sensor_map/test.rp2040-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.rp2040.yaml rename to tests/components/binary_sensor_map/test.rp2040-ard.yaml diff --git a/tests/components/bl0939/test.esp32.yaml b/tests/components/bl0939/test.esp32-ard.yaml similarity index 100% rename from tests/components/bl0939/test.esp32.yaml rename to tests/components/bl0939/test.esp32-ard.yaml diff --git a/tests/components/bl0939/test.esp32-c3.yaml b/tests/components/bl0939/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bl0939/test.esp32-c3.yaml rename to tests/components/bl0939/test.esp32-c3-ard.yaml diff --git a/tests/components/bl0939/test.esp8266.yaml b/tests/components/bl0939/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bl0939/test.esp8266.yaml rename to tests/components/bl0939/test.esp8266-ard.yaml diff --git a/tests/components/bl0939/test.rp2040.yaml b/tests/components/bl0939/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bl0939/test.rp2040.yaml rename to tests/components/bl0939/test.rp2040-ard.yaml diff --git a/tests/components/bl0940/test.esp32.yaml b/tests/components/bl0940/test.esp32-ard.yaml similarity index 100% rename from tests/components/bl0940/test.esp32.yaml rename to tests/components/bl0940/test.esp32-ard.yaml diff --git a/tests/components/bl0940/test.esp32-c3.yaml b/tests/components/bl0940/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bl0940/test.esp32-c3.yaml rename to tests/components/bl0940/test.esp32-c3-ard.yaml diff --git a/tests/components/bl0940/test.esp8266.yaml b/tests/components/bl0940/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bl0940/test.esp8266.yaml rename to tests/components/bl0940/test.esp8266-ard.yaml diff --git a/tests/components/bl0940/test.rp2040.yaml b/tests/components/bl0940/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bl0940/test.rp2040.yaml rename to tests/components/bl0940/test.rp2040-ard.yaml diff --git a/tests/components/bl0942/test.esp32.yaml b/tests/components/bl0942/test.esp32-ard.yaml similarity index 100% rename from tests/components/bl0942/test.esp32.yaml rename to tests/components/bl0942/test.esp32-ard.yaml diff --git a/tests/components/bl0942/test.esp32-c3.yaml b/tests/components/bl0942/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bl0942/test.esp32-c3.yaml rename to tests/components/bl0942/test.esp32-c3-ard.yaml diff --git a/tests/components/bl0942/test.esp8266.yaml b/tests/components/bl0942/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bl0942/test.esp8266.yaml rename to tests/components/bl0942/test.esp8266-ard.yaml diff --git a/tests/components/bl0942/test.rp2040.yaml b/tests/components/bl0942/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bl0942/test.rp2040.yaml rename to tests/components/bl0942/test.rp2040-ard.yaml diff --git a/tests/components/ble_client/test.esp32-c3.yaml b/tests/components/ble_client/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_client/test.esp32-c3.yaml rename to tests/components/ble_client/test.esp32-ard.yaml diff --git a/tests/components/ble_client/test.esp32.yaml b/tests/components/ble_client/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_client/test.esp32.yaml rename to tests/components/ble_client/test.esp32-c3-ard.yaml diff --git a/tests/components/ble_presence/test.esp32-c3.yaml b/tests/components/ble_presence/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_presence/test.esp32-c3.yaml rename to tests/components/ble_presence/test.esp32-ard.yaml diff --git a/tests/components/ble_presence/test.esp32.yaml b/tests/components/ble_presence/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_presence/test.esp32.yaml rename to tests/components/ble_presence/test.esp32-c3-ard.yaml diff --git a/tests/components/ble_rssi/test.esp32-c3.yaml b/tests/components/ble_rssi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_rssi/test.esp32-c3.yaml rename to tests/components/ble_rssi/test.esp32-ard.yaml diff --git a/tests/components/ble_rssi/test.esp32.yaml b/tests/components/ble_rssi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_rssi/test.esp32.yaml rename to tests/components/ble_rssi/test.esp32-c3-ard.yaml diff --git a/tests/components/ble_scanner/test.esp32-c3.yaml b/tests/components/ble_scanner/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_scanner/test.esp32-c3.yaml rename to tests/components/ble_scanner/test.esp32-ard.yaml diff --git a/tests/components/ble_scanner/test.esp32.yaml b/tests/components/ble_scanner/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_scanner/test.esp32.yaml rename to tests/components/ble_scanner/test.esp32-c3-ard.yaml diff --git a/tests/components/bme280_i2c/test.esp32.yaml b/tests/components/bme280_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.esp32.yaml rename to tests/components/bme280_i2c/test.esp32-ard.yaml diff --git a/tests/components/bme280_i2c/test.esp32-c3.yaml b/tests/components/bme280_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.esp32-c3.yaml rename to tests/components/bme280_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/bme280_i2c/test.esp8266.yaml b/tests/components/bme280_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.esp8266.yaml rename to tests/components/bme280_i2c/test.esp8266-ard.yaml diff --git a/tests/components/bme280_i2c/test.rp2040.yaml b/tests/components/bme280_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.rp2040.yaml rename to tests/components/bme280_i2c/test.rp2040-ard.yaml diff --git a/tests/components/bme280_spi/test.esp32.yaml b/tests/components/bme280_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.esp32.yaml rename to tests/components/bme280_spi/test.esp32-ard.yaml diff --git a/tests/components/bme280_spi/test.esp32-c3.yaml b/tests/components/bme280_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.esp32-c3.yaml rename to tests/components/bme280_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/bme280_spi/test.esp8266.yaml b/tests/components/bme280_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.esp8266.yaml rename to tests/components/bme280_spi/test.esp8266-ard.yaml diff --git a/tests/components/bme280_spi/test.rp2040.yaml b/tests/components/bme280_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.rp2040.yaml rename to tests/components/bme280_spi/test.rp2040-ard.yaml diff --git a/tests/components/bme680/test.esp32.yaml b/tests/components/bme680/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme680/test.esp32.yaml rename to tests/components/bme680/test.esp32-ard.yaml diff --git a/tests/components/bme680/test.esp32-c3.yaml b/tests/components/bme680/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bme680/test.esp32-c3.yaml rename to tests/components/bme680/test.esp32-c3-ard.yaml diff --git a/tests/components/bme680/test.esp8266.yaml b/tests/components/bme680/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme680/test.esp8266.yaml rename to tests/components/bme680/test.esp8266-ard.yaml diff --git a/tests/components/bme680/test.rp2040.yaml b/tests/components/bme680/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bme680/test.rp2040.yaml rename to tests/components/bme680/test.rp2040-ard.yaml diff --git a/tests/components/bme680_bsec/test.esp32.yaml b/tests/components/bme680_bsec/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme680_bsec/test.esp32.yaml rename to tests/components/bme680_bsec/test.esp32-ard.yaml diff --git a/tests/components/bme680_bsec/test.esp8266.yaml b/tests/components/bme680_bsec/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme680_bsec/test.esp8266.yaml rename to tests/components/bme680_bsec/test.esp8266-ard.yaml diff --git a/tests/components/bmi160/test.esp32.yaml b/tests/components/bmi160/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmi160/test.esp32.yaml rename to tests/components/bmi160/test.esp32-ard.yaml diff --git a/tests/components/bmi160/test.esp32-c3.yaml b/tests/components/bmi160/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmi160/test.esp32-c3.yaml rename to tests/components/bmi160/test.esp32-c3-ard.yaml diff --git a/tests/components/bmi160/test.esp8266.yaml b/tests/components/bmi160/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmi160/test.esp8266.yaml rename to tests/components/bmi160/test.esp8266-ard.yaml diff --git a/tests/components/bmi160/test.rp2040.yaml b/tests/components/bmi160/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmi160/test.rp2040.yaml rename to tests/components/bmi160/test.rp2040-ard.yaml diff --git a/tests/components/bmp085/test.esp32.yaml b/tests/components/bmp085/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp085/test.esp32.yaml rename to tests/components/bmp085/test.esp32-ard.yaml diff --git a/tests/components/bmp085/test.esp32-c3.yaml b/tests/components/bmp085/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp085/test.esp32-c3.yaml rename to tests/components/bmp085/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp085/test.esp8266.yaml b/tests/components/bmp085/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp085/test.esp8266.yaml rename to tests/components/bmp085/test.esp8266-ard.yaml diff --git a/tests/components/bmp085/test.rp2040.yaml b/tests/components/bmp085/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp085/test.rp2040.yaml rename to tests/components/bmp085/test.rp2040-ard.yaml diff --git a/tests/components/bmp280/test.esp32.yaml b/tests/components/bmp280/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp280/test.esp32.yaml rename to tests/components/bmp280/test.esp32-ard.yaml diff --git a/tests/components/bmp280/test.esp32-c3.yaml b/tests/components/bmp280/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp280/test.esp32-c3.yaml rename to tests/components/bmp280/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp280/test.esp8266.yaml b/tests/components/bmp280/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp280/test.esp8266.yaml rename to tests/components/bmp280/test.esp8266-ard.yaml diff --git a/tests/components/bmp280/test.rp2040.yaml b/tests/components/bmp280/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp280/test.rp2040.yaml rename to tests/components/bmp280/test.rp2040-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.esp32.yaml b/tests/components/bmp3xx_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.esp32.yaml rename to tests/components/bmp3xx_i2c/test.esp32-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.esp32-c3.yaml b/tests/components/bmp3xx_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.esp32-c3.yaml rename to tests/components/bmp3xx_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.esp8266.yaml b/tests/components/bmp3xx_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.esp8266.yaml rename to tests/components/bmp3xx_i2c/test.esp8266-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.rp2040.yaml b/tests/components/bmp3xx_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.rp2040.yaml rename to tests/components/bmp3xx_i2c/test.rp2040-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.esp32.yaml b/tests/components/bmp3xx_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.esp32.yaml rename to tests/components/bmp3xx_spi/test.esp32-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.esp32-c3.yaml b/tests/components/bmp3xx_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.esp32-c3.yaml rename to tests/components/bmp3xx_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.esp8266.yaml b/tests/components/bmp3xx_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.esp8266.yaml rename to tests/components/bmp3xx_spi/test.esp8266-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.rp2040.yaml b/tests/components/bmp3xx_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.rp2040.yaml rename to tests/components/bmp3xx_spi/test.rp2040-ard.yaml diff --git a/tests/components/bmp581/test.esp32.yaml b/tests/components/bmp581/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp581/test.esp32.yaml rename to tests/components/bmp581/test.esp32-ard.yaml diff --git a/tests/components/bmp581/test.esp32-c3.yaml b/tests/components/bmp581/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp581/test.esp32-c3.yaml rename to tests/components/bmp581/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp581/test.esp8266.yaml b/tests/components/bmp581/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp581/test.esp8266.yaml rename to tests/components/bmp581/test.esp8266-ard.yaml diff --git a/tests/components/bmp581/test.rp2040.yaml b/tests/components/bmp581/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp581/test.rp2040.yaml rename to tests/components/bmp581/test.rp2040-ard.yaml diff --git a/tests/components/bp1658cj/test.esp32.yaml b/tests/components/bp1658cj/test.esp32-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.esp32.yaml rename to tests/components/bp1658cj/test.esp32-ard.yaml diff --git a/tests/components/bp1658cj/test.esp32-c3.yaml b/tests/components/bp1658cj/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.esp32-c3.yaml rename to tests/components/bp1658cj/test.esp32-c3-ard.yaml diff --git a/tests/components/bp1658cj/test.esp8266.yaml b/tests/components/bp1658cj/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.esp8266.yaml rename to tests/components/bp1658cj/test.esp8266-ard.yaml diff --git a/tests/components/bp1658cj/test.rp2040.yaml b/tests/components/bp1658cj/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.rp2040.yaml rename to tests/components/bp1658cj/test.rp2040-ard.yaml diff --git a/tests/components/bp5758d/test.esp32.yaml b/tests/components/bp5758d/test.esp32-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.esp32.yaml rename to tests/components/bp5758d/test.esp32-ard.yaml diff --git a/tests/components/bp5758d/test.esp32-c3.yaml b/tests/components/bp5758d/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.esp32-c3.yaml rename to tests/components/bp5758d/test.esp32-c3-ard.yaml diff --git a/tests/components/bp5758d/test.esp8266.yaml b/tests/components/bp5758d/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.esp8266.yaml rename to tests/components/bp5758d/test.esp8266-ard.yaml diff --git a/tests/components/bp5758d/test.rp2040.yaml b/tests/components/bp5758d/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.rp2040.yaml rename to tests/components/bp5758d/test.rp2040-ard.yaml diff --git a/tests/components/button/test.esp32-c3.yaml b/tests/components/button/test.esp32-ard.yaml similarity index 100% rename from tests/components/button/test.esp32-c3.yaml rename to tests/components/button/test.esp32-ard.yaml diff --git a/tests/components/button/test.esp32.yaml b/tests/components/button/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/button/test.esp32.yaml rename to tests/components/button/test.esp32-c3-ard.yaml diff --git a/tests/components/button/test.esp8266.yaml b/tests/components/button/test.esp8266-ard.yaml similarity index 100% rename from tests/components/button/test.esp8266.yaml rename to tests/components/button/test.esp8266-ard.yaml diff --git a/tests/components/button/test.rp2040.yaml b/tests/components/button/test.rp2040-ard.yaml similarity index 100% rename from tests/components/button/test.rp2040.yaml rename to tests/components/button/test.rp2040-ard.yaml diff --git a/tests/components/canbus/test.esp32-c3.yaml b/tests/components/canbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/canbus/test.esp32-c3.yaml rename to tests/components/canbus/test.esp32-ard.yaml diff --git a/tests/components/canbus/test.esp32.yaml b/tests/components/canbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/canbus/test.esp32.yaml rename to tests/components/canbus/test.esp32-c3-ard.yaml diff --git a/tests/components/cap1188/test.esp32.yaml b/tests/components/cap1188/test.esp32-ard.yaml similarity index 100% rename from tests/components/cap1188/test.esp32.yaml rename to tests/components/cap1188/test.esp32-ard.yaml diff --git a/tests/components/cap1188/test.esp32-c3.yaml b/tests/components/cap1188/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cap1188/test.esp32-c3.yaml rename to tests/components/cap1188/test.esp32-c3-ard.yaml diff --git a/tests/components/cap1188/test.esp8266.yaml b/tests/components/cap1188/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cap1188/test.esp8266.yaml rename to tests/components/cap1188/test.esp8266-ard.yaml diff --git a/tests/components/cap1188/test.rp2040.yaml b/tests/components/cap1188/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cap1188/test.rp2040.yaml rename to tests/components/cap1188/test.rp2040-ard.yaml diff --git a/tests/components/captive_portal/test.esp32-c3.yaml b/tests/components/captive_portal/test.esp32-ard.yaml similarity index 100% rename from tests/components/captive_portal/test.esp32-c3.yaml rename to tests/components/captive_portal/test.esp32-ard.yaml diff --git a/tests/components/captive_portal/test.esp32.yaml b/tests/components/captive_portal/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/captive_portal/test.esp32.yaml rename to tests/components/captive_portal/test.esp32-c3-ard.yaml diff --git a/tests/components/captive_portal/test.esp8266.yaml b/tests/components/captive_portal/test.esp8266-ard.yaml similarity index 100% rename from tests/components/captive_portal/test.esp8266.yaml rename to tests/components/captive_portal/test.esp8266-ard.yaml diff --git a/tests/components/ccs811/test.esp32.yaml b/tests/components/ccs811/test.esp32-ard.yaml similarity index 100% rename from tests/components/ccs811/test.esp32.yaml rename to tests/components/ccs811/test.esp32-ard.yaml diff --git a/tests/components/ccs811/test.esp32-c3.yaml b/tests/components/ccs811/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ccs811/test.esp32-c3.yaml rename to tests/components/ccs811/test.esp32-c3-ard.yaml diff --git a/tests/components/ccs811/test.esp8266.yaml b/tests/components/ccs811/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ccs811/test.esp8266.yaml rename to tests/components/ccs811/test.esp8266-ard.yaml diff --git a/tests/components/ccs811/test.rp2040.yaml b/tests/components/ccs811/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ccs811/test.rp2040.yaml rename to tests/components/ccs811/test.rp2040-ard.yaml diff --git a/tests/components/cd74hc4067/test.esp32.yaml b/tests/components/cd74hc4067/test.esp32-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.esp32.yaml rename to tests/components/cd74hc4067/test.esp32-ard.yaml diff --git a/tests/components/cd74hc4067/test.esp32-c3.yaml b/tests/components/cd74hc4067/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.esp32-c3.yaml rename to tests/components/cd74hc4067/test.esp32-c3-ard.yaml diff --git a/tests/components/cd74hc4067/test.esp8266.yaml b/tests/components/cd74hc4067/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.esp8266.yaml rename to tests/components/cd74hc4067/test.esp8266-ard.yaml diff --git a/tests/components/cd74hc4067/test.rp2040.yaml b/tests/components/cd74hc4067/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.rp2040.yaml rename to tests/components/cd74hc4067/test.rp2040-ard.yaml diff --git a/tests/components/climate_ir_lg/test.esp32-c3.yaml b/tests/components/climate_ir_lg/test.esp32-ard.yaml similarity index 100% rename from tests/components/climate_ir_lg/test.esp32-c3.yaml rename to tests/components/climate_ir_lg/test.esp32-ard.yaml diff --git a/tests/components/climate_ir_lg/test.esp32.yaml b/tests/components/climate_ir_lg/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/climate_ir_lg/test.esp32.yaml rename to tests/components/climate_ir_lg/test.esp32-c3-ard.yaml diff --git a/tests/components/climate_ir_lg/test.esp8266.yaml b/tests/components/climate_ir_lg/test.esp8266-ard.yaml similarity index 100% rename from tests/components/climate_ir_lg/test.esp8266.yaml rename to tests/components/climate_ir_lg/test.esp8266-ard.yaml diff --git a/tests/components/color/test.esp32-c3.yaml b/tests/components/color/test.esp32-ard.yaml similarity index 100% rename from tests/components/color/test.esp32-c3.yaml rename to tests/components/color/test.esp32-ard.yaml diff --git a/tests/components/color/test.esp32.yaml b/tests/components/color/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/color/test.esp32.yaml rename to tests/components/color/test.esp32-c3-ard.yaml diff --git a/tests/components/color/test.esp8266.yaml b/tests/components/color/test.esp8266-ard.yaml similarity index 100% rename from tests/components/color/test.esp8266.yaml rename to tests/components/color/test.esp8266-ard.yaml diff --git a/tests/components/color/test.rp2040.yaml b/tests/components/color/test.rp2040-ard.yaml similarity index 100% rename from tests/components/color/test.rp2040.yaml rename to tests/components/color/test.rp2040-ard.yaml diff --git a/tests/components/color_temperature/test.esp32.yaml b/tests/components/color_temperature/test.esp32-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.esp32.yaml rename to tests/components/color_temperature/test.esp32-ard.yaml diff --git a/tests/components/color_temperature/test.esp32-c3.yaml b/tests/components/color_temperature/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.esp32-c3.yaml rename to tests/components/color_temperature/test.esp32-c3-ard.yaml diff --git a/tests/components/color_temperature/test.esp8266.yaml b/tests/components/color_temperature/test.esp8266-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.esp8266.yaml rename to tests/components/color_temperature/test.esp8266-ard.yaml diff --git a/tests/components/color_temperature/test.rp2040.yaml b/tests/components/color_temperature/test.rp2040-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.rp2040.yaml rename to tests/components/color_temperature/test.rp2040-ard.yaml diff --git a/tests/components/combination/test.esp32-c3.yaml b/tests/components/combination/test.esp32-ard.yaml similarity index 100% rename from tests/components/combination/test.esp32-c3.yaml rename to tests/components/combination/test.esp32-ard.yaml diff --git a/tests/components/combination/test.esp32.yaml b/tests/components/combination/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/combination/test.esp32.yaml rename to tests/components/combination/test.esp32-c3-ard.yaml diff --git a/tests/components/combination/test.esp8266.yaml b/tests/components/combination/test.esp8266-ard.yaml similarity index 100% rename from tests/components/combination/test.esp8266.yaml rename to tests/components/combination/test.esp8266-ard.yaml diff --git a/tests/components/combination/test.rp2040.yaml b/tests/components/combination/test.rp2040-ard.yaml similarity index 100% rename from tests/components/combination/test.rp2040.yaml rename to tests/components/combination/test.rp2040-ard.yaml diff --git a/tests/components/coolix/test.esp32-c3.yaml b/tests/components/coolix/test.esp32-ard.yaml similarity index 100% rename from tests/components/coolix/test.esp32-c3.yaml rename to tests/components/coolix/test.esp32-ard.yaml diff --git a/tests/components/coolix/test.esp32.yaml b/tests/components/coolix/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/coolix/test.esp32.yaml rename to tests/components/coolix/test.esp32-c3-ard.yaml diff --git a/tests/components/coolix/test.esp8266.yaml b/tests/components/coolix/test.esp8266-ard.yaml similarity index 100% rename from tests/components/coolix/test.esp8266.yaml rename to tests/components/coolix/test.esp8266-ard.yaml diff --git a/tests/components/copy/test.esp32.yaml b/tests/components/copy/test.esp32-ard.yaml similarity index 100% rename from tests/components/copy/test.esp32.yaml rename to tests/components/copy/test.esp32-ard.yaml diff --git a/tests/components/copy/test.esp32-c3.yaml b/tests/components/copy/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/copy/test.esp32-c3.yaml rename to tests/components/copy/test.esp32-c3-ard.yaml diff --git a/tests/components/copy/test.esp8266.yaml b/tests/components/copy/test.esp8266-ard.yaml similarity index 100% rename from tests/components/copy/test.esp8266.yaml rename to tests/components/copy/test.esp8266-ard.yaml diff --git a/tests/components/copy/test.rp2040.yaml b/tests/components/copy/test.rp2040-ard.yaml similarity index 100% rename from tests/components/copy/test.rp2040.yaml rename to tests/components/copy/test.rp2040-ard.yaml diff --git a/tests/components/cs5460a/test.esp32.yaml b/tests/components/cs5460a/test.esp32-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.esp32.yaml rename to tests/components/cs5460a/test.esp32-ard.yaml diff --git a/tests/components/cs5460a/test.esp32-c3.yaml b/tests/components/cs5460a/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.esp32-c3.yaml rename to tests/components/cs5460a/test.esp32-c3-ard.yaml diff --git a/tests/components/cs5460a/test.esp8266.yaml b/tests/components/cs5460a/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.esp8266.yaml rename to tests/components/cs5460a/test.esp8266-ard.yaml diff --git a/tests/components/cs5460a/test.rp2040.yaml b/tests/components/cs5460a/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.rp2040.yaml rename to tests/components/cs5460a/test.rp2040-ard.yaml diff --git a/tests/components/cse7761/test.esp32.yaml b/tests/components/cse7761/test.esp32-ard.yaml similarity index 100% rename from tests/components/cse7761/test.esp32.yaml rename to tests/components/cse7761/test.esp32-ard.yaml diff --git a/tests/components/cse7761/test.esp32-c3.yaml b/tests/components/cse7761/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cse7761/test.esp32-c3.yaml rename to tests/components/cse7761/test.esp32-c3-ard.yaml diff --git a/tests/components/cse7761/test.esp8266.yaml b/tests/components/cse7761/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cse7761/test.esp8266.yaml rename to tests/components/cse7761/test.esp8266-ard.yaml diff --git a/tests/components/cse7761/test.rp2040.yaml b/tests/components/cse7761/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cse7761/test.rp2040.yaml rename to tests/components/cse7761/test.rp2040-ard.yaml diff --git a/tests/components/cse7766/test.esp32.yaml b/tests/components/cse7766/test.esp32-ard.yaml similarity index 100% rename from tests/components/cse7766/test.esp32.yaml rename to tests/components/cse7766/test.esp32-ard.yaml diff --git a/tests/components/cse7766/test.esp32-c3.yaml b/tests/components/cse7766/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cse7766/test.esp32-c3.yaml rename to tests/components/cse7766/test.esp32-c3-ard.yaml diff --git a/tests/components/cse7766/test.esp8266.yaml b/tests/components/cse7766/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cse7766/test.esp8266.yaml rename to tests/components/cse7766/test.esp8266-ard.yaml diff --git a/tests/components/cse7766/test.rp2040.yaml b/tests/components/cse7766/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cse7766/test.rp2040.yaml rename to tests/components/cse7766/test.rp2040-ard.yaml diff --git a/tests/components/cst226/test.esp32-c3.yaml b/tests/components/cst226/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cst226/test.esp32-c3.yaml rename to tests/components/cst226/test.esp32-c3-ard.yaml diff --git a/tests/components/cst816/test.esp32.yaml b/tests/components/cst816/test.esp32-ard.yaml similarity index 100% rename from tests/components/cst816/test.esp32.yaml rename to tests/components/cst816/test.esp32-ard.yaml diff --git a/tests/components/ct_clamp/test.esp32.yaml b/tests/components/ct_clamp/test.esp32-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.esp32.yaml rename to tests/components/ct_clamp/test.esp32-ard.yaml diff --git a/tests/components/ct_clamp/test.esp32-c3.yaml b/tests/components/ct_clamp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.esp32-c3.yaml rename to tests/components/ct_clamp/test.esp32-c3-ard.yaml diff --git a/tests/components/ct_clamp/test.esp8266.yaml b/tests/components/ct_clamp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.esp8266.yaml rename to tests/components/ct_clamp/test.esp8266-ard.yaml diff --git a/tests/components/ct_clamp/test.rp2040.yaml b/tests/components/ct_clamp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.rp2040.yaml rename to tests/components/ct_clamp/test.rp2040-ard.yaml diff --git a/tests/components/current_based/test.esp32.yaml b/tests/components/current_based/test.esp32-ard.yaml similarity index 100% rename from tests/components/current_based/test.esp32.yaml rename to tests/components/current_based/test.esp32-ard.yaml diff --git a/tests/components/current_based/test.esp32-c3.yaml b/tests/components/current_based/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/current_based/test.esp32-c3.yaml rename to tests/components/current_based/test.esp32-c3-ard.yaml diff --git a/tests/components/current_based/test.esp8266.yaml b/tests/components/current_based/test.esp8266-ard.yaml similarity index 100% rename from tests/components/current_based/test.esp8266.yaml rename to tests/components/current_based/test.esp8266-ard.yaml diff --git a/tests/components/current_based/test.rp2040.yaml b/tests/components/current_based/test.rp2040-ard.yaml similarity index 100% rename from tests/components/current_based/test.rp2040.yaml rename to tests/components/current_based/test.rp2040-ard.yaml diff --git a/tests/components/cwww/test.esp32.yaml b/tests/components/cwww/test.esp32-ard.yaml similarity index 100% rename from tests/components/cwww/test.esp32.yaml rename to tests/components/cwww/test.esp32-ard.yaml diff --git a/tests/components/cwww/test.esp32-c3.yaml b/tests/components/cwww/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cwww/test.esp32-c3.yaml rename to tests/components/cwww/test.esp32-c3-ard.yaml diff --git a/tests/components/cwww/test.esp8266.yaml b/tests/components/cwww/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cwww/test.esp8266.yaml rename to tests/components/cwww/test.esp8266-ard.yaml diff --git a/tests/components/cwww/test.rp2040.yaml b/tests/components/cwww/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cwww/test.rp2040.yaml rename to tests/components/cwww/test.rp2040-ard.yaml diff --git a/tests/components/dac7678/test.esp32.yaml b/tests/components/dac7678/test.esp32-ard.yaml similarity index 100% rename from tests/components/dac7678/test.esp32.yaml rename to tests/components/dac7678/test.esp32-ard.yaml diff --git a/tests/components/dac7678/test.esp32-c3.yaml b/tests/components/dac7678/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dac7678/test.esp32-c3.yaml rename to tests/components/dac7678/test.esp32-c3-ard.yaml diff --git a/tests/components/dac7678/test.esp8266.yaml b/tests/components/dac7678/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dac7678/test.esp8266.yaml rename to tests/components/dac7678/test.esp8266-ard.yaml diff --git a/tests/components/dac7678/test.rp2040.yaml b/tests/components/dac7678/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dac7678/test.rp2040.yaml rename to tests/components/dac7678/test.rp2040-ard.yaml diff --git a/tests/components/daikin/test.esp32.yaml b/tests/components/daikin/test.esp32-ard.yaml similarity index 100% rename from tests/components/daikin/test.esp32.yaml rename to tests/components/daikin/test.esp32-ard.yaml diff --git a/tests/components/daikin/test.esp8266.yaml b/tests/components/daikin/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daikin/test.esp8266.yaml rename to tests/components/daikin/test.esp8266-ard.yaml diff --git a/tests/components/daikin_arc/test.esp32.yaml b/tests/components/daikin_arc/test.esp32-ard.yaml similarity index 100% rename from tests/components/daikin_arc/test.esp32.yaml rename to tests/components/daikin_arc/test.esp32-ard.yaml diff --git a/tests/components/daikin_arc/test.esp8266.yaml b/tests/components/daikin_arc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daikin_arc/test.esp8266.yaml rename to tests/components/daikin_arc/test.esp8266-ard.yaml diff --git a/tests/components/daikin_brc/test.esp32-c3.yaml b/tests/components/daikin_brc/test.esp32-ard.yaml similarity index 100% rename from tests/components/daikin_brc/test.esp32-c3.yaml rename to tests/components/daikin_brc/test.esp32-ard.yaml diff --git a/tests/components/daikin_brc/test.esp32.yaml b/tests/components/daikin_brc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/daikin_brc/test.esp32.yaml rename to tests/components/daikin_brc/test.esp32-c3-ard.yaml diff --git a/tests/components/daikin_brc/test.esp8266.yaml b/tests/components/daikin_brc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daikin_brc/test.esp8266.yaml rename to tests/components/daikin_brc/test.esp8266-ard.yaml diff --git a/tests/components/dallas_temp/test.esp32-c3.yaml b/tests/components/dallas_temp/test.esp32-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.esp32-c3.yaml rename to tests/components/dallas_temp/test.esp32-ard.yaml diff --git a/tests/components/dallas_temp/test.esp32.yaml b/tests/components/dallas_temp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.esp32.yaml rename to tests/components/dallas_temp/test.esp32-c3-ard.yaml diff --git a/tests/components/dallas_temp/test.esp8266.yaml b/tests/components/dallas_temp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.esp8266.yaml rename to tests/components/dallas_temp/test.esp8266-ard.yaml diff --git a/tests/components/dallas_temp/test.rp2040.yaml b/tests/components/dallas_temp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.rp2040.yaml rename to tests/components/dallas_temp/test.rp2040-ard.yaml diff --git a/tests/components/daly_bms/test.esp32.yaml b/tests/components/daly_bms/test.esp32-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.esp32.yaml rename to tests/components/daly_bms/test.esp32-ard.yaml diff --git a/tests/components/daly_bms/test.esp32-c3.yaml b/tests/components/daly_bms/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.esp32-c3.yaml rename to tests/components/daly_bms/test.esp32-c3-ard.yaml diff --git a/tests/components/daly_bms/test.esp8266.yaml b/tests/components/daly_bms/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.esp8266.yaml rename to tests/components/daly_bms/test.esp8266-ard.yaml diff --git a/tests/components/daly_bms/test.rp2040.yaml b/tests/components/daly_bms/test.rp2040-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.rp2040.yaml rename to tests/components/daly_bms/test.rp2040-ard.yaml diff --git a/tests/components/debug/test.esp32-c3.yaml b/tests/components/debug/test.esp32-ard.yaml similarity index 100% rename from tests/components/debug/test.esp32-c3.yaml rename to tests/components/debug/test.esp32-ard.yaml diff --git a/tests/components/debug/test.esp32.yaml b/tests/components/debug/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/debug/test.esp32.yaml rename to tests/components/debug/test.esp32-c3-ard.yaml diff --git a/tests/components/debug/test.esp8266.yaml b/tests/components/debug/test.esp8266-ard.yaml similarity index 100% rename from tests/components/debug/test.esp8266.yaml rename to tests/components/debug/test.esp8266-ard.yaml diff --git a/tests/components/debug/test.rp2040.yaml b/tests/components/debug/test.rp2040-ard.yaml similarity index 100% rename from tests/components/debug/test.rp2040.yaml rename to tests/components/debug/test.rp2040-ard.yaml diff --git a/tests/components/deep_sleep/test.esp32-c3.yaml b/tests/components/deep_sleep/test.esp32-ard.yaml similarity index 100% rename from tests/components/deep_sleep/test.esp32-c3.yaml rename to tests/components/deep_sleep/test.esp32-ard.yaml diff --git a/tests/components/deep_sleep/test.esp32.yaml b/tests/components/deep_sleep/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/deep_sleep/test.esp32.yaml rename to tests/components/deep_sleep/test.esp32-c3-ard.yaml diff --git a/tests/components/deep_sleep/test.esp8266.yaml b/tests/components/deep_sleep/test.esp8266-ard.yaml similarity index 100% rename from tests/components/deep_sleep/test.esp8266.yaml rename to tests/components/deep_sleep/test.esp8266-ard.yaml diff --git a/tests/components/delonghi/test.esp32-c3.yaml b/tests/components/delonghi/test.esp32-ard.yaml similarity index 100% rename from tests/components/delonghi/test.esp32-c3.yaml rename to tests/components/delonghi/test.esp32-ard.yaml diff --git a/tests/components/delonghi/test.esp32.yaml b/tests/components/delonghi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/delonghi/test.esp32.yaml rename to tests/components/delonghi/test.esp32-c3-ard.yaml diff --git a/tests/components/delonghi/test.esp8266.yaml b/tests/components/delonghi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/delonghi/test.esp8266.yaml rename to tests/components/delonghi/test.esp8266-ard.yaml diff --git a/tests/components/dfplayer/test.esp32.yaml b/tests/components/dfplayer/test.esp32-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.esp32.yaml rename to tests/components/dfplayer/test.esp32-ard.yaml diff --git a/tests/components/dfplayer/test.esp32-c3.yaml b/tests/components/dfplayer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.esp32-c3.yaml rename to tests/components/dfplayer/test.esp32-c3-ard.yaml diff --git a/tests/components/dfplayer/test.esp8266.yaml b/tests/components/dfplayer/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.esp8266.yaml rename to tests/components/dfplayer/test.esp8266-ard.yaml diff --git a/tests/components/dfplayer/test.rp2040.yaml b/tests/components/dfplayer/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.rp2040.yaml rename to tests/components/dfplayer/test.rp2040-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.esp32.yaml b/tests/components/dfrobot_sen0395/test.esp32-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.esp32.yaml rename to tests/components/dfrobot_sen0395/test.esp32-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.esp32-c3.yaml b/tests/components/dfrobot_sen0395/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.esp32-c3.yaml rename to tests/components/dfrobot_sen0395/test.esp32-c3-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.esp8266.yaml b/tests/components/dfrobot_sen0395/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.esp8266.yaml rename to tests/components/dfrobot_sen0395/test.esp8266-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.rp2040.yaml b/tests/components/dfrobot_sen0395/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.rp2040.yaml rename to tests/components/dfrobot_sen0395/test.rp2040-ard.yaml diff --git a/tests/components/dht/test.esp32-c3.yaml b/tests/components/dht/test.esp32-ard.yaml similarity index 100% rename from tests/components/dht/test.esp32-c3.yaml rename to tests/components/dht/test.esp32-ard.yaml diff --git a/tests/components/dht/test.esp32.yaml b/tests/components/dht/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dht/test.esp32.yaml rename to tests/components/dht/test.esp32-c3-ard.yaml diff --git a/tests/components/dht/test.esp8266.yaml b/tests/components/dht/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dht/test.esp8266.yaml rename to tests/components/dht/test.esp8266-ard.yaml diff --git a/tests/components/dht/test.rp2040.yaml b/tests/components/dht/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dht/test.rp2040.yaml rename to tests/components/dht/test.rp2040-ard.yaml diff --git a/tests/components/dht12/test.esp32.yaml b/tests/components/dht12/test.esp32-ard.yaml similarity index 100% rename from tests/components/dht12/test.esp32.yaml rename to tests/components/dht12/test.esp32-ard.yaml diff --git a/tests/components/dht12/test.esp32-c3.yaml b/tests/components/dht12/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dht12/test.esp32-c3.yaml rename to tests/components/dht12/test.esp32-c3-ard.yaml diff --git a/tests/components/dht12/test.esp8266.yaml b/tests/components/dht12/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dht12/test.esp8266.yaml rename to tests/components/dht12/test.esp8266-ard.yaml diff --git a/tests/components/dht12/test.rp2040.yaml b/tests/components/dht12/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dht12/test.rp2040.yaml rename to tests/components/dht12/test.rp2040-ard.yaml diff --git a/tests/components/display/test.esp32.yaml b/tests/components/display/test.esp32-ard.yaml similarity index 100% rename from tests/components/display/test.esp32.yaml rename to tests/components/display/test.esp32-ard.yaml diff --git a/tests/components/dps310/test.esp32.yaml b/tests/components/dps310/test.esp32-ard.yaml similarity index 100% rename from tests/components/dps310/test.esp32.yaml rename to tests/components/dps310/test.esp32-ard.yaml diff --git a/tests/components/dps310/test.esp32-c3.yaml b/tests/components/dps310/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dps310/test.esp32-c3.yaml rename to tests/components/dps310/test.esp32-c3-ard.yaml diff --git a/tests/components/dps310/test.esp8266.yaml b/tests/components/dps310/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dps310/test.esp8266.yaml rename to tests/components/dps310/test.esp8266-ard.yaml diff --git a/tests/components/dps310/test.rp2040.yaml b/tests/components/dps310/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dps310/test.rp2040.yaml rename to tests/components/dps310/test.rp2040-ard.yaml diff --git a/tests/components/ds1307/test.esp32.yaml b/tests/components/ds1307/test.esp32-ard.yaml similarity index 100% rename from tests/components/ds1307/test.esp32.yaml rename to tests/components/ds1307/test.esp32-ard.yaml diff --git a/tests/components/ds1307/test.esp32-c3.yaml b/tests/components/ds1307/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ds1307/test.esp32-c3.yaml rename to tests/components/ds1307/test.esp32-c3-ard.yaml diff --git a/tests/components/ds1307/test.esp8266.yaml b/tests/components/ds1307/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ds1307/test.esp8266.yaml rename to tests/components/ds1307/test.esp8266-ard.yaml diff --git a/tests/components/ds1307/test.rp2040.yaml b/tests/components/ds1307/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ds1307/test.rp2040.yaml rename to tests/components/ds1307/test.rp2040-ard.yaml diff --git a/tests/components/dsmr/test.esp32.yaml b/tests/components/dsmr/test.esp32-ard.yaml similarity index 100% rename from tests/components/dsmr/test.esp32.yaml rename to tests/components/dsmr/test.esp32-ard.yaml diff --git a/tests/components/dsmr/test.esp32-c3.yaml b/tests/components/dsmr/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dsmr/test.esp32-c3.yaml rename to tests/components/dsmr/test.esp32-c3-ard.yaml diff --git a/tests/components/dsmr/test.esp8266.yaml b/tests/components/dsmr/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dsmr/test.esp8266.yaml rename to tests/components/dsmr/test.esp8266-ard.yaml diff --git a/tests/components/dsmr/test.rp2040.yaml b/tests/components/dsmr/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dsmr/test.rp2040.yaml rename to tests/components/dsmr/test.rp2040-ard.yaml diff --git a/tests/components/duty_cycle/test.esp32-c3.yaml b/tests/components/duty_cycle/test.esp32-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.esp32-c3.yaml rename to tests/components/duty_cycle/test.esp32-ard.yaml diff --git a/tests/components/duty_cycle/test.esp32.yaml b/tests/components/duty_cycle/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.esp32.yaml rename to tests/components/duty_cycle/test.esp32-c3-ard.yaml diff --git a/tests/components/duty_cycle/test.esp8266.yaml b/tests/components/duty_cycle/test.esp8266-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.esp8266.yaml rename to tests/components/duty_cycle/test.esp8266-ard.yaml diff --git a/tests/components/duty_cycle/test.rp2040.yaml b/tests/components/duty_cycle/test.rp2040-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.rp2040.yaml rename to tests/components/duty_cycle/test.rp2040-ard.yaml diff --git a/tests/components/duty_time/test.esp32-c3.yaml b/tests/components/duty_time/test.esp32-ard.yaml similarity index 100% rename from tests/components/duty_time/test.esp32-c3.yaml rename to tests/components/duty_time/test.esp32-ard.yaml diff --git a/tests/components/duty_time/test.esp32.yaml b/tests/components/duty_time/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/duty_time/test.esp32.yaml rename to tests/components/duty_time/test.esp32-c3-ard.yaml diff --git a/tests/components/duty_time/test.esp8266.yaml b/tests/components/duty_time/test.esp8266-ard.yaml similarity index 100% rename from tests/components/duty_time/test.esp8266.yaml rename to tests/components/duty_time/test.esp8266-ard.yaml diff --git a/tests/components/duty_time/test.rp2040.yaml b/tests/components/duty_time/test.rp2040-ard.yaml similarity index 100% rename from tests/components/duty_time/test.rp2040.yaml rename to tests/components/duty_time/test.rp2040-ard.yaml diff --git a/tests/components/e131/test.esp32-c3.yaml b/tests/components/e131/test.esp32-ard.yaml similarity index 100% rename from tests/components/e131/test.esp32-c3.yaml rename to tests/components/e131/test.esp32-ard.yaml diff --git a/tests/components/e131/test.esp32.yaml b/tests/components/e131/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/e131/test.esp32.yaml rename to tests/components/e131/test.esp32-c3-ard.yaml diff --git a/tests/components/e131/test.esp8266.yaml b/tests/components/e131/test.esp8266-ard.yaml similarity index 100% rename from tests/components/e131/test.esp8266.yaml rename to tests/components/e131/test.esp8266-ard.yaml diff --git a/tests/components/e131/test.rp2040.yaml b/tests/components/e131/test.rp2040-ard.yaml similarity index 100% rename from tests/components/e131/test.rp2040.yaml rename to tests/components/e131/test.rp2040-ard.yaml diff --git a/tests/components/ee895/test.esp32.yaml b/tests/components/ee895/test.esp32-ard.yaml similarity index 100% rename from tests/components/ee895/test.esp32.yaml rename to tests/components/ee895/test.esp32-ard.yaml diff --git a/tests/components/ee895/test.esp32-c3.yaml b/tests/components/ee895/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ee895/test.esp32-c3.yaml rename to tests/components/ee895/test.esp32-c3-ard.yaml diff --git a/tests/components/ee895/test.esp8266.yaml b/tests/components/ee895/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ee895/test.esp8266.yaml rename to tests/components/ee895/test.esp8266-ard.yaml diff --git a/tests/components/ee895/test.rp2040.yaml b/tests/components/ee895/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ee895/test.rp2040.yaml rename to tests/components/ee895/test.rp2040-ard.yaml diff --git a/tests/components/ektf2232/test.esp32.yaml b/tests/components/ektf2232/test.esp32-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.esp32.yaml rename to tests/components/ektf2232/test.esp32-ard.yaml diff --git a/tests/components/ektf2232/test.esp32-c3.yaml b/tests/components/ektf2232/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.esp32-c3.yaml rename to tests/components/ektf2232/test.esp32-c3-ard.yaml diff --git a/tests/components/ektf2232/test.esp8266.yaml b/tests/components/ektf2232/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.esp8266.yaml rename to tests/components/ektf2232/test.esp8266-ard.yaml diff --git a/tests/components/ektf2232/test.rp2040.yaml b/tests/components/ektf2232/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.rp2040.yaml rename to tests/components/ektf2232/test.rp2040-ard.yaml diff --git a/tests/components/emc2101/test.esp32.yaml b/tests/components/emc2101/test.esp32-ard.yaml similarity index 100% rename from tests/components/emc2101/test.esp32.yaml rename to tests/components/emc2101/test.esp32-ard.yaml diff --git a/tests/components/emc2101/test.esp32-c3.yaml b/tests/components/emc2101/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/emc2101/test.esp32-c3.yaml rename to tests/components/emc2101/test.esp32-c3-ard.yaml diff --git a/tests/components/emc2101/test.esp8266.yaml b/tests/components/emc2101/test.esp8266-ard.yaml similarity index 100% rename from tests/components/emc2101/test.esp8266.yaml rename to tests/components/emc2101/test.esp8266-ard.yaml diff --git a/tests/components/emc2101/test.rp2040.yaml b/tests/components/emc2101/test.rp2040-ard.yaml similarity index 100% rename from tests/components/emc2101/test.rp2040.yaml rename to tests/components/emc2101/test.rp2040-ard.yaml diff --git a/tests/components/emmeti/test.esp32.yaml b/tests/components/emmeti/test.esp32-ard.yaml similarity index 100% rename from tests/components/emmeti/test.esp32.yaml rename to tests/components/emmeti/test.esp32-ard.yaml diff --git a/tests/components/emmeti/test.esp8266.yaml b/tests/components/emmeti/test.esp8266-ard.yaml similarity index 100% rename from tests/components/emmeti/test.esp8266.yaml rename to tests/components/emmeti/test.esp8266-ard.yaml diff --git a/tests/components/endstop/test.esp32-c3.yaml b/tests/components/endstop/test.esp32-ard.yaml similarity index 100% rename from tests/components/endstop/test.esp32-c3.yaml rename to tests/components/endstop/test.esp32-ard.yaml diff --git a/tests/components/endstop/test.esp32.yaml b/tests/components/endstop/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/endstop/test.esp32.yaml rename to tests/components/endstop/test.esp32-c3-ard.yaml diff --git a/tests/components/endstop/test.esp8266.yaml b/tests/components/endstop/test.esp8266-ard.yaml similarity index 100% rename from tests/components/endstop/test.esp8266.yaml rename to tests/components/endstop/test.esp8266-ard.yaml diff --git a/tests/components/endstop/test.rp2040.yaml b/tests/components/endstop/test.rp2040-ard.yaml similarity index 100% rename from tests/components/endstop/test.rp2040.yaml rename to tests/components/endstop/test.rp2040-ard.yaml diff --git a/tests/components/ens160_i2c/test.esp32.yaml b/tests/components/ens160_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.esp32.yaml rename to tests/components/ens160_i2c/test.esp32-ard.yaml diff --git a/tests/components/ens160_i2c/test.esp32-c3.yaml b/tests/components/ens160_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.esp32-c3.yaml rename to tests/components/ens160_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ens160_i2c/test.esp8266.yaml b/tests/components/ens160_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.esp8266.yaml rename to tests/components/ens160_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ens160_i2c/test.rp2040.yaml b/tests/components/ens160_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.rp2040.yaml rename to tests/components/ens160_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ens160_spi/test.esp32.yaml b/tests/components/ens160_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.esp32.yaml rename to tests/components/ens160_spi/test.esp32-ard.yaml diff --git a/tests/components/ens160_spi/test.esp32-c3.yaml b/tests/components/ens160_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.esp32-c3.yaml rename to tests/components/ens160_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ens160_spi/test.esp8266.yaml b/tests/components/ens160_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.esp8266.yaml rename to tests/components/ens160_spi/test.esp8266-ard.yaml diff --git a/tests/components/ens160_spi/test.rp2040.yaml b/tests/components/ens160_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.rp2040.yaml rename to tests/components/ens160_spi/test.rp2040-ard.yaml diff --git a/tests/components/ens210/test.esp32.yaml b/tests/components/ens210/test.esp32-ard.yaml similarity index 100% rename from tests/components/ens210/test.esp32.yaml rename to tests/components/ens210/test.esp32-ard.yaml diff --git a/tests/components/ens210/test.esp32-c3.yaml b/tests/components/ens210/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ens210/test.esp32-c3.yaml rename to tests/components/ens210/test.esp32-c3-ard.yaml diff --git a/tests/components/ens210/test.esp8266.yaml b/tests/components/ens210/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ens210/test.esp8266.yaml rename to tests/components/ens210/test.esp8266-ard.yaml diff --git a/tests/components/ens210/test.rp2040.yaml b/tests/components/ens210/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ens210/test.rp2040.yaml rename to tests/components/ens210/test.rp2040-ard.yaml diff --git a/tests/components/esp32_ble/test.esp32-c3.yaml b/tests/components/esp32_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble/test.esp32-c3.yaml rename to tests/components/esp32_ble/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble/test.esp32.yaml b/tests/components/esp32_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble/test.esp32.yaml rename to tests/components/esp32_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_beacon/test.esp32-c3.yaml b/tests/components/esp32_ble_beacon/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_beacon/test.esp32-c3.yaml rename to tests/components/esp32_ble_beacon/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_beacon/test.esp32.yaml b/tests/components/esp32_ble_beacon/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_beacon/test.esp32.yaml rename to tests/components/esp32_ble_beacon/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_client/test.esp32-c3.yaml b/tests/components/esp32_ble_client/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_client/test.esp32-c3.yaml rename to tests/components/esp32_ble_client/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_client/test.esp32.yaml b/tests/components/esp32_ble_client/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_client/test.esp32.yaml rename to tests/components/esp32_ble_client/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_server/test.esp32-c3.yaml b/tests/components/esp32_ble_server/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_server/test.esp32-c3.yaml rename to tests/components/esp32_ble_server/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_server/test.esp32.yaml b/tests/components/esp32_ble_server/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_server/test.esp32.yaml rename to tests/components/esp32_ble_server/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_tracker/test.esp32-c3.yaml b/tests/components/esp32_ble_tracker/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_tracker/test.esp32-c3.yaml rename to tests/components/esp32_ble_tracker/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_tracker/test.esp32.yaml b/tests/components/esp32_ble_tracker/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_tracker/test.esp32.yaml rename to tests/components/esp32_ble_tracker/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_camera/test.esp32.yaml b/tests/components/esp32_camera/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_camera/test.esp32.yaml rename to tests/components/esp32_camera/test.esp32-ard.yaml diff --git a/tests/components/esp32_camera_web_server/test.esp32.yaml b/tests/components/esp32_camera_web_server/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_camera_web_server/test.esp32.yaml rename to tests/components/esp32_camera_web_server/test.esp32-ard.yaml diff --git a/tests/components/esp32_can/test.esp32.yaml b/tests/components/esp32_can/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_can/test.esp32.yaml rename to tests/components/esp32_can/test.esp32-ard.yaml diff --git a/tests/components/esp32_can/test.esp32-c3.yaml b/tests/components/esp32_can/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_can/test.esp32-c3.yaml rename to tests/components/esp32_can/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_dac/test.esp32.yaml b/tests/components/esp32_dac/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_dac/test.esp32.yaml rename to tests/components/esp32_dac/test.esp32-ard.yaml diff --git a/tests/components/esp32_hall/test.esp32.yaml b/tests/components/esp32_hall/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_hall/test.esp32.yaml rename to tests/components/esp32_hall/test.esp32-ard.yaml diff --git a/tests/components/esp32_improv/test.esp32-c3.yaml b/tests/components/esp32_improv/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_improv/test.esp32-c3.yaml rename to tests/components/esp32_improv/test.esp32-ard.yaml diff --git a/tests/components/esp32_improv/test.esp32.yaml b/tests/components/esp32_improv/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_improv/test.esp32.yaml rename to tests/components/esp32_improv/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_rmt_led_strip/test.esp32.yaml b/tests/components/esp32_rmt_led_strip/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_rmt_led_strip/test.esp32.yaml rename to tests/components/esp32_rmt_led_strip/test.esp32-ard.yaml diff --git a/tests/components/esp32_rmt_led_strip/test.esp32-c3.yaml b/tests/components/esp32_rmt_led_strip/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_rmt_led_strip/test.esp32-c3.yaml rename to tests/components/esp32_rmt_led_strip/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_touch/test.esp32.yaml b/tests/components/esp32_touch/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_touch/test.esp32.yaml rename to tests/components/esp32_touch/test.esp32-ard.yaml diff --git a/tests/components/esp8266_pwm/test.esp8266.yaml b/tests/components/esp8266_pwm/test.esp8266-ard.yaml similarity index 100% rename from tests/components/esp8266_pwm/test.esp8266.yaml rename to tests/components/esp8266_pwm/test.esp8266-ard.yaml diff --git a/tests/components/ethernet/test-dp83848.esp32.yaml b/tests/components/ethernet/test-dp83848.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-dp83848.esp32.yaml rename to tests/components/ethernet/test-dp83848.esp32-ard.yaml diff --git a/tests/components/ethernet/test-ip101.esp32.yaml b/tests/components/ethernet/test-ip101.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-ip101.esp32.yaml rename to tests/components/ethernet/test-ip101.esp32-ard.yaml diff --git a/tests/components/ethernet/test-jl1101.esp32.yaml b/tests/components/ethernet/test-jl1101.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-jl1101.esp32.yaml rename to tests/components/ethernet/test-jl1101.esp32-ard.yaml diff --git a/tests/components/ethernet/test-ksz8081.esp32.yaml b/tests/components/ethernet/test-ksz8081.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-ksz8081.esp32.yaml rename to tests/components/ethernet/test-ksz8081.esp32-ard.yaml diff --git a/tests/components/ethernet/test-ksz8081rna.esp32.yaml b/tests/components/ethernet/test-ksz8081rna.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-ksz8081rna.esp32.yaml rename to tests/components/ethernet/test-ksz8081rna.esp32-ard.yaml diff --git a/tests/components/ethernet/test-lan8720.esp32.yaml b/tests/components/ethernet/test-lan8720.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-lan8720.esp32.yaml rename to tests/components/ethernet/test-lan8720.esp32-ard.yaml diff --git a/tests/components/ethernet/test-rtl8201.esp32.yaml b/tests/components/ethernet/test-rtl8201.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-rtl8201.esp32.yaml rename to tests/components/ethernet/test-rtl8201.esp32-ard.yaml diff --git a/tests/components/ethernet/test-w5500.esp32.yaml b/tests/components/ethernet/test-w5500.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-w5500.esp32.yaml rename to tests/components/ethernet/test-w5500.esp32-ard.yaml diff --git a/tests/components/ethernet_info/test.esp32.yaml b/tests/components/ethernet_info/test.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet_info/test.esp32.yaml rename to tests/components/ethernet_info/test.esp32-ard.yaml diff --git a/tests/components/event/test.esp32-c3.yaml b/tests/components/event/test.esp32-ard.yaml similarity index 100% rename from tests/components/event/test.esp32-c3.yaml rename to tests/components/event/test.esp32-ard.yaml diff --git a/tests/components/event/test.esp32.yaml b/tests/components/event/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/event/test.esp32.yaml rename to tests/components/event/test.esp32-c3-ard.yaml diff --git a/tests/components/event/test.esp8266.yaml b/tests/components/event/test.esp8266-ard.yaml similarity index 100% rename from tests/components/event/test.esp8266.yaml rename to tests/components/event/test.esp8266-ard.yaml diff --git a/tests/components/event/test.rp2040.yaml b/tests/components/event/test.rp2040-ard.yaml similarity index 100% rename from tests/components/event/test.rp2040.yaml rename to tests/components/event/test.rp2040-ard.yaml diff --git a/tests/components/exposure_notifications/test.esp32-c3.yaml b/tests/components/exposure_notifications/test.esp32-ard.yaml similarity index 100% rename from tests/components/exposure_notifications/test.esp32-c3.yaml rename to tests/components/exposure_notifications/test.esp32-ard.yaml diff --git a/tests/components/exposure_notifications/test.esp32.yaml b/tests/components/exposure_notifications/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/exposure_notifications/test.esp32.yaml rename to tests/components/exposure_notifications/test.esp32-c3-ard.yaml diff --git a/tests/components/external_components/test.esp32-c3.yaml b/tests/components/external_components/test.esp32-ard.yaml similarity index 100% rename from tests/components/external_components/test.esp32-c3.yaml rename to tests/components/external_components/test.esp32-ard.yaml diff --git a/tests/components/external_components/test.esp32.yaml b/tests/components/external_components/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/external_components/test.esp32.yaml rename to tests/components/external_components/test.esp32-c3-ard.yaml diff --git a/tests/components/external_components/test.esp8266.yaml b/tests/components/external_components/test.esp8266-ard.yaml similarity index 100% rename from tests/components/external_components/test.esp8266.yaml rename to tests/components/external_components/test.esp8266-ard.yaml diff --git a/tests/components/external_components/test.rp2040.yaml b/tests/components/external_components/test.rp2040-ard.yaml similarity index 100% rename from tests/components/external_components/test.rp2040.yaml rename to tests/components/external_components/test.rp2040-ard.yaml diff --git a/tests/components/ezo/test.esp32.yaml b/tests/components/ezo/test.esp32-ard.yaml similarity index 100% rename from tests/components/ezo/test.esp32.yaml rename to tests/components/ezo/test.esp32-ard.yaml diff --git a/tests/components/ezo/test.esp32-c3.yaml b/tests/components/ezo/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ezo/test.esp32-c3.yaml rename to tests/components/ezo/test.esp32-c3-ard.yaml diff --git a/tests/components/ezo/test.esp8266.yaml b/tests/components/ezo/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ezo/test.esp8266.yaml rename to tests/components/ezo/test.esp8266-ard.yaml diff --git a/tests/components/ezo/test.rp2040.yaml b/tests/components/ezo/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ezo/test.rp2040.yaml rename to tests/components/ezo/test.rp2040-ard.yaml diff --git a/tests/components/ezo_pmp/test.esp32.yaml b/tests/components/ezo_pmp/test.esp32-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.esp32.yaml rename to tests/components/ezo_pmp/test.esp32-ard.yaml diff --git a/tests/components/ezo_pmp/test.esp32-c3.yaml b/tests/components/ezo_pmp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.esp32-c3.yaml rename to tests/components/ezo_pmp/test.esp32-c3-ard.yaml diff --git a/tests/components/ezo_pmp/test.esp8266.yaml b/tests/components/ezo_pmp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.esp8266.yaml rename to tests/components/ezo_pmp/test.esp8266-ard.yaml diff --git a/tests/components/ezo_pmp/test.rp2040.yaml b/tests/components/ezo_pmp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.rp2040.yaml rename to tests/components/ezo_pmp/test.rp2040-ard.yaml diff --git a/tests/components/factory_reset/test.esp32-c3.yaml b/tests/components/factory_reset/test.esp32-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.esp32-c3.yaml rename to tests/components/factory_reset/test.esp32-ard.yaml diff --git a/tests/components/factory_reset/test.esp32.yaml b/tests/components/factory_reset/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.esp32.yaml rename to tests/components/factory_reset/test.esp32-c3-ard.yaml diff --git a/tests/components/factory_reset/test.esp8266.yaml b/tests/components/factory_reset/test.esp8266-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.esp8266.yaml rename to tests/components/factory_reset/test.esp8266-ard.yaml diff --git a/tests/components/factory_reset/test.rp2040.yaml b/tests/components/factory_reset/test.rp2040-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.rp2040.yaml rename to tests/components/factory_reset/test.rp2040-ard.yaml diff --git a/tests/components/fastled_clockless/test.esp32.yaml b/tests/components/fastled_clockless/test.esp32-ard.yaml similarity index 100% rename from tests/components/fastled_clockless/test.esp32.yaml rename to tests/components/fastled_clockless/test.esp32-ard.yaml diff --git a/tests/components/fastled_spi/test.esp32.yaml b/tests/components/fastled_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/fastled_spi/test.esp32.yaml rename to tests/components/fastled_spi/test.esp32-ard.yaml diff --git a/tests/components/feedback/test.esp32-c3.yaml b/tests/components/feedback/test.esp32-ard.yaml similarity index 100% rename from tests/components/feedback/test.esp32-c3.yaml rename to tests/components/feedback/test.esp32-ard.yaml diff --git a/tests/components/feedback/test.esp32.yaml b/tests/components/feedback/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/feedback/test.esp32.yaml rename to tests/components/feedback/test.esp32-c3-ard.yaml diff --git a/tests/components/feedback/test.esp8266.yaml b/tests/components/feedback/test.esp8266-ard.yaml similarity index 100% rename from tests/components/feedback/test.esp8266.yaml rename to tests/components/feedback/test.esp8266-ard.yaml diff --git a/tests/components/feedback/test.rp2040.yaml b/tests/components/feedback/test.rp2040-ard.yaml similarity index 100% rename from tests/components/feedback/test.rp2040.yaml rename to tests/components/feedback/test.rp2040-ard.yaml diff --git a/tests/components/fingerprint_grow/test.esp32.yaml b/tests/components/fingerprint_grow/test.esp32-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.esp32.yaml rename to tests/components/fingerprint_grow/test.esp32-ard.yaml diff --git a/tests/components/fingerprint_grow/test.esp32-c3.yaml b/tests/components/fingerprint_grow/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.esp32-c3.yaml rename to tests/components/fingerprint_grow/test.esp32-c3-ard.yaml diff --git a/tests/components/fingerprint_grow/test.esp8266.yaml b/tests/components/fingerprint_grow/test.esp8266-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.esp8266.yaml rename to tests/components/fingerprint_grow/test.esp8266-ard.yaml diff --git a/tests/components/fingerprint_grow/test.rp2040.yaml b/tests/components/fingerprint_grow/test.rp2040-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.rp2040.yaml rename to tests/components/fingerprint_grow/test.rp2040-ard.yaml diff --git a/tests/components/font/test.esp32.yaml b/tests/components/font/test.esp32-ard.yaml similarity index 100% rename from tests/components/font/test.esp32.yaml rename to tests/components/font/test.esp32-ard.yaml diff --git a/tests/components/font/test.esp32-c3.yaml b/tests/components/font/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/font/test.esp32-c3.yaml rename to tests/components/font/test.esp32-c3-ard.yaml diff --git a/tests/components/font/test.esp8266.yaml b/tests/components/font/test.esp8266-ard.yaml similarity index 100% rename from tests/components/font/test.esp8266.yaml rename to tests/components/font/test.esp8266-ard.yaml diff --git a/tests/components/font/test.rp2040.yaml b/tests/components/font/test.rp2040-ard.yaml similarity index 100% rename from tests/components/font/test.rp2040.yaml rename to tests/components/font/test.rp2040-ard.yaml diff --git a/tests/components/fs3000/test.esp32.yaml b/tests/components/fs3000/test.esp32-ard.yaml similarity index 100% rename from tests/components/fs3000/test.esp32.yaml rename to tests/components/fs3000/test.esp32-ard.yaml diff --git a/tests/components/fs3000/test.esp32-c3.yaml b/tests/components/fs3000/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/fs3000/test.esp32-c3.yaml rename to tests/components/fs3000/test.esp32-c3-ard.yaml diff --git a/tests/components/fs3000/test.esp8266.yaml b/tests/components/fs3000/test.esp8266-ard.yaml similarity index 100% rename from tests/components/fs3000/test.esp8266.yaml rename to tests/components/fs3000/test.esp8266-ard.yaml diff --git a/tests/components/fs3000/test.rp2040.yaml b/tests/components/fs3000/test.rp2040-ard.yaml similarity index 100% rename from tests/components/fs3000/test.rp2040.yaml rename to tests/components/fs3000/test.rp2040-ard.yaml diff --git a/tests/components/ft5x06/test.esp32.yaml b/tests/components/ft5x06/test.esp32-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.esp32.yaml rename to tests/components/ft5x06/test.esp32-ard.yaml diff --git a/tests/components/ft5x06/test.esp32-c3.yaml b/tests/components/ft5x06/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.esp32-c3.yaml rename to tests/components/ft5x06/test.esp32-c3-ard.yaml diff --git a/tests/components/ft5x06/test.esp8266.yaml b/tests/components/ft5x06/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.esp8266.yaml rename to tests/components/ft5x06/test.esp8266-ard.yaml diff --git a/tests/components/ft5x06/test.rp2040.yaml b/tests/components/ft5x06/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.rp2040.yaml rename to tests/components/ft5x06/test.rp2040-ard.yaml diff --git a/tests/components/ft63x6/test.esp32.yaml b/tests/components/ft63x6/test.esp32-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.esp32.yaml rename to tests/components/ft63x6/test.esp32-ard.yaml diff --git a/tests/components/ft63x6/test.esp32-c3.yaml b/tests/components/ft63x6/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.esp32-c3.yaml rename to tests/components/ft63x6/test.esp32-c3-ard.yaml diff --git a/tests/components/ft63x6/test.esp8266.yaml b/tests/components/ft63x6/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.esp8266.yaml rename to tests/components/ft63x6/test.esp8266-ard.yaml diff --git a/tests/components/ft63x6/test.rp2040.yaml b/tests/components/ft63x6/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.rp2040.yaml rename to tests/components/ft63x6/test.rp2040-ard.yaml diff --git a/tests/components/fujitsu_general/test.esp32-c3.yaml b/tests/components/fujitsu_general/test.esp32-ard.yaml similarity index 100% rename from tests/components/fujitsu_general/test.esp32-c3.yaml rename to tests/components/fujitsu_general/test.esp32-ard.yaml diff --git a/tests/components/fujitsu_general/test.esp32.yaml b/tests/components/fujitsu_general/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/fujitsu_general/test.esp32.yaml rename to tests/components/fujitsu_general/test.esp32-c3-ard.yaml diff --git a/tests/components/fujitsu_general/test.esp8266.yaml b/tests/components/fujitsu_general/test.esp8266-ard.yaml similarity index 100% rename from tests/components/fujitsu_general/test.esp8266.yaml rename to tests/components/fujitsu_general/test.esp8266-ard.yaml diff --git a/tests/components/gcja5/test.esp32.yaml b/tests/components/gcja5/test.esp32-ard.yaml similarity index 100% rename from tests/components/gcja5/test.esp32.yaml rename to tests/components/gcja5/test.esp32-ard.yaml diff --git a/tests/components/gcja5/test.esp32-c3.yaml b/tests/components/gcja5/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gcja5/test.esp32-c3.yaml rename to tests/components/gcja5/test.esp32-c3-ard.yaml diff --git a/tests/components/gcja5/test.esp8266.yaml b/tests/components/gcja5/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gcja5/test.esp8266.yaml rename to tests/components/gcja5/test.esp8266-ard.yaml diff --git a/tests/components/gcja5/test.rp2040.yaml b/tests/components/gcja5/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gcja5/test.rp2040.yaml rename to tests/components/gcja5/test.rp2040-ard.yaml diff --git a/tests/components/gdk101/test.esp32.yaml b/tests/components/gdk101/test.esp32-ard.yaml similarity index 100% rename from tests/components/gdk101/test.esp32.yaml rename to tests/components/gdk101/test.esp32-ard.yaml diff --git a/tests/components/gdk101/test.esp8266.yaml b/tests/components/gdk101/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gdk101/test.esp8266.yaml rename to tests/components/gdk101/test.esp8266-ard.yaml diff --git a/tests/components/gdk101/test.rp2040.yaml b/tests/components/gdk101/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gdk101/test.rp2040.yaml rename to tests/components/gdk101/test.rp2040-ard.yaml diff --git a/tests/components/globals/test.esp32-c3.yaml b/tests/components/globals/test.esp32-ard.yaml similarity index 100% rename from tests/components/globals/test.esp32-c3.yaml rename to tests/components/globals/test.esp32-ard.yaml diff --git a/tests/components/globals/test.esp32.yaml b/tests/components/globals/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/globals/test.esp32.yaml rename to tests/components/globals/test.esp32-c3-ard.yaml diff --git a/tests/components/globals/test.esp8266.yaml b/tests/components/globals/test.esp8266-ard.yaml similarity index 100% rename from tests/components/globals/test.esp8266.yaml rename to tests/components/globals/test.esp8266-ard.yaml diff --git a/tests/components/globals/test.rp2040.yaml b/tests/components/globals/test.rp2040-ard.yaml similarity index 100% rename from tests/components/globals/test.rp2040.yaml rename to tests/components/globals/test.rp2040-ard.yaml diff --git a/tests/components/gp8403/test.esp32.yaml b/tests/components/gp8403/test.esp32-ard.yaml similarity index 100% rename from tests/components/gp8403/test.esp32.yaml rename to tests/components/gp8403/test.esp32-ard.yaml diff --git a/tests/components/gp8403/test.esp32-c3.yaml b/tests/components/gp8403/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gp8403/test.esp32-c3.yaml rename to tests/components/gp8403/test.esp32-c3-ard.yaml diff --git a/tests/components/gp8403/test.esp8266.yaml b/tests/components/gp8403/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gp8403/test.esp8266.yaml rename to tests/components/gp8403/test.esp8266-ard.yaml diff --git a/tests/components/gp8403/test.rp2040.yaml b/tests/components/gp8403/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gp8403/test.rp2040.yaml rename to tests/components/gp8403/test.rp2040-ard.yaml diff --git a/tests/components/gpio/test.esp32.yaml b/tests/components/gpio/test.esp32-ard.yaml similarity index 100% rename from tests/components/gpio/test.esp32.yaml rename to tests/components/gpio/test.esp32-ard.yaml diff --git a/tests/components/gpio/test.esp32-c3.yaml b/tests/components/gpio/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gpio/test.esp32-c3.yaml rename to tests/components/gpio/test.esp32-c3-ard.yaml diff --git a/tests/components/gpio/test.esp8266.yaml b/tests/components/gpio/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gpio/test.esp8266.yaml rename to tests/components/gpio/test.esp8266-ard.yaml diff --git a/tests/components/gpio/test.rp2040.yaml b/tests/components/gpio/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gpio/test.rp2040.yaml rename to tests/components/gpio/test.rp2040-ard.yaml diff --git a/tests/components/gps/test.esp32.yaml b/tests/components/gps/test.esp32-ard.yaml similarity index 100% rename from tests/components/gps/test.esp32.yaml rename to tests/components/gps/test.esp32-ard.yaml diff --git a/tests/components/gps/test.esp32-c3.yaml b/tests/components/gps/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gps/test.esp32-c3.yaml rename to tests/components/gps/test.esp32-c3-ard.yaml diff --git a/tests/components/gps/test.esp8266.yaml b/tests/components/gps/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gps/test.esp8266.yaml rename to tests/components/gps/test.esp8266-ard.yaml diff --git a/tests/components/gps/test.rp2040.yaml b/tests/components/gps/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gps/test.rp2040.yaml rename to tests/components/gps/test.rp2040-ard.yaml diff --git a/tests/components/graph/test.esp32.yaml b/tests/components/graph/test.esp32-ard.yaml similarity index 100% rename from tests/components/graph/test.esp32.yaml rename to tests/components/graph/test.esp32-ard.yaml diff --git a/tests/components/graph/test.esp32-c3.yaml b/tests/components/graph/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/graph/test.esp32-c3.yaml rename to tests/components/graph/test.esp32-c3-ard.yaml diff --git a/tests/components/graph/test.esp8266.yaml b/tests/components/graph/test.esp8266-ard.yaml similarity index 100% rename from tests/components/graph/test.esp8266.yaml rename to tests/components/graph/test.esp8266-ard.yaml diff --git a/tests/components/graph/test.rp2040.yaml b/tests/components/graph/test.rp2040-ard.yaml similarity index 100% rename from tests/components/graph/test.rp2040.yaml rename to tests/components/graph/test.rp2040-ard.yaml diff --git a/tests/components/graphical_display_menu/test.esp32.yaml b/tests/components/graphical_display_menu/test.esp32-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.esp32.yaml rename to tests/components/graphical_display_menu/test.esp32-ard.yaml diff --git a/tests/components/graphical_display_menu/test.esp32-c3.yaml b/tests/components/graphical_display_menu/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.esp32-c3.yaml rename to tests/components/graphical_display_menu/test.esp32-c3-ard.yaml diff --git a/tests/components/graphical_display_menu/test.esp8266.yaml b/tests/components/graphical_display_menu/test.esp8266-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.esp8266.yaml rename to tests/components/graphical_display_menu/test.esp8266-ard.yaml diff --git a/tests/components/graphical_display_menu/test.rp2040.yaml b/tests/components/graphical_display_menu/test.rp2040-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.rp2040.yaml rename to tests/components/graphical_display_menu/test.rp2040-ard.yaml diff --git a/tests/components/gree/test.esp32-c3.yaml b/tests/components/gree/test.esp32-ard.yaml similarity index 100% rename from tests/components/gree/test.esp32-c3.yaml rename to tests/components/gree/test.esp32-ard.yaml diff --git a/tests/components/gree/test.esp32.yaml b/tests/components/gree/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gree/test.esp32.yaml rename to tests/components/gree/test.esp32-c3-ard.yaml diff --git a/tests/components/gree/test.esp8266.yaml b/tests/components/gree/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gree/test.esp8266.yaml rename to tests/components/gree/test.esp8266-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.esp32.yaml b/tests/components/grove_tb6612fng/test.esp32-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.esp32.yaml rename to tests/components/grove_tb6612fng/test.esp32-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.esp32-c3.yaml b/tests/components/grove_tb6612fng/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.esp32-c3.yaml rename to tests/components/grove_tb6612fng/test.esp32-c3-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.esp8266.yaml b/tests/components/grove_tb6612fng/test.esp8266-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.esp8266.yaml rename to tests/components/grove_tb6612fng/test.esp8266-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.rp2040.yaml b/tests/components/grove_tb6612fng/test.rp2040-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.rp2040.yaml rename to tests/components/grove_tb6612fng/test.rp2040-ard.yaml diff --git a/tests/components/growatt_solar/test.esp32.yaml b/tests/components/growatt_solar/test.esp32-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.esp32.yaml rename to tests/components/growatt_solar/test.esp32-ard.yaml diff --git a/tests/components/growatt_solar/test.esp32-c3.yaml b/tests/components/growatt_solar/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.esp32-c3.yaml rename to tests/components/growatt_solar/test.esp32-c3-ard.yaml diff --git a/tests/components/growatt_solar/test.esp8266.yaml b/tests/components/growatt_solar/test.esp8266-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.esp8266.yaml rename to tests/components/growatt_solar/test.esp8266-ard.yaml diff --git a/tests/components/growatt_solar/test.rp2040.yaml b/tests/components/growatt_solar/test.rp2040-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.rp2040.yaml rename to tests/components/growatt_solar/test.rp2040-ard.yaml diff --git a/tests/components/gt911/test.esp32.yaml b/tests/components/gt911/test.esp32-ard.yaml similarity index 100% rename from tests/components/gt911/test.esp32.yaml rename to tests/components/gt911/test.esp32-ard.yaml diff --git a/tests/components/gt911/test.esp32-c3.yaml b/tests/components/gt911/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gt911/test.esp32-c3.yaml rename to tests/components/gt911/test.esp32-c3-ard.yaml diff --git a/tests/components/gt911/test.esp8266.yaml b/tests/components/gt911/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gt911/test.esp8266.yaml rename to tests/components/gt911/test.esp8266-ard.yaml diff --git a/tests/components/gt911/test.rp2040.yaml b/tests/components/gt911/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gt911/test.rp2040.yaml rename to tests/components/gt911/test.rp2040-ard.yaml diff --git a/tests/components/haier/test.esp32.yaml b/tests/components/haier/test.esp32-ard.yaml similarity index 100% rename from tests/components/haier/test.esp32.yaml rename to tests/components/haier/test.esp32-ard.yaml diff --git a/tests/components/haier/test.esp32-c3.yaml b/tests/components/haier/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/haier/test.esp32-c3.yaml rename to tests/components/haier/test.esp32-c3-ard.yaml diff --git a/tests/components/haier/test.esp8266.yaml b/tests/components/haier/test.esp8266-ard.yaml similarity index 100% rename from tests/components/haier/test.esp8266.yaml rename to tests/components/haier/test.esp8266-ard.yaml diff --git a/tests/components/haier/test.rp2040.yaml b/tests/components/haier/test.rp2040-ard.yaml similarity index 100% rename from tests/components/haier/test.rp2040.yaml rename to tests/components/haier/test.rp2040-ard.yaml diff --git a/tests/components/havells_solar/test.esp32.yaml b/tests/components/havells_solar/test.esp32-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.esp32.yaml rename to tests/components/havells_solar/test.esp32-ard.yaml diff --git a/tests/components/havells_solar/test.esp32-c3.yaml b/tests/components/havells_solar/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.esp32-c3.yaml rename to tests/components/havells_solar/test.esp32-c3-ard.yaml diff --git a/tests/components/havells_solar/test.esp8266.yaml b/tests/components/havells_solar/test.esp8266-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.esp8266.yaml rename to tests/components/havells_solar/test.esp8266-ard.yaml diff --git a/tests/components/havells_solar/test.rp2040.yaml b/tests/components/havells_solar/test.rp2040-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.rp2040.yaml rename to tests/components/havells_solar/test.rp2040-ard.yaml diff --git a/tests/components/hbridge/test.esp32.yaml b/tests/components/hbridge/test.esp32-ard.yaml similarity index 100% rename from tests/components/hbridge/test.esp32.yaml rename to tests/components/hbridge/test.esp32-ard.yaml diff --git a/tests/components/hbridge/test.esp32-c3.yaml b/tests/components/hbridge/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hbridge/test.esp32-c3.yaml rename to tests/components/hbridge/test.esp32-c3-ard.yaml diff --git a/tests/components/hbridge/test.esp8266.yaml b/tests/components/hbridge/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hbridge/test.esp8266.yaml rename to tests/components/hbridge/test.esp8266-ard.yaml diff --git a/tests/components/hbridge/test.rp2040.yaml b/tests/components/hbridge/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hbridge/test.rp2040.yaml rename to tests/components/hbridge/test.rp2040-ard.yaml diff --git a/tests/components/hdc1080/test.esp32.yaml b/tests/components/hdc1080/test.esp32-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.esp32.yaml rename to tests/components/hdc1080/test.esp32-ard.yaml diff --git a/tests/components/hdc1080/test.esp32-c3.yaml b/tests/components/hdc1080/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.esp32-c3.yaml rename to tests/components/hdc1080/test.esp32-c3-ard.yaml diff --git a/tests/components/hdc1080/test.esp8266.yaml b/tests/components/hdc1080/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.esp8266.yaml rename to tests/components/hdc1080/test.esp8266-ard.yaml diff --git a/tests/components/hdc1080/test.rp2040.yaml b/tests/components/hdc1080/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.rp2040.yaml rename to tests/components/hdc1080/test.rp2040-ard.yaml diff --git a/tests/components/he60r/test.esp32.yaml b/tests/components/he60r/test.esp32-ard.yaml similarity index 100% rename from tests/components/he60r/test.esp32.yaml rename to tests/components/he60r/test.esp32-ard.yaml diff --git a/tests/components/he60r/test.esp32-c3.yaml b/tests/components/he60r/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/he60r/test.esp32-c3.yaml rename to tests/components/he60r/test.esp32-c3-ard.yaml diff --git a/tests/components/he60r/test.esp8266.yaml b/tests/components/he60r/test.esp8266-ard.yaml similarity index 100% rename from tests/components/he60r/test.esp8266.yaml rename to tests/components/he60r/test.esp8266-ard.yaml diff --git a/tests/components/he60r/test.rp2040.yaml b/tests/components/he60r/test.rp2040-ard.yaml similarity index 100% rename from tests/components/he60r/test.rp2040.yaml rename to tests/components/he60r/test.rp2040-ard.yaml diff --git a/tests/components/heatpumpir/test.esp32.yaml b/tests/components/heatpumpir/test.esp32-ard.yaml similarity index 100% rename from tests/components/heatpumpir/test.esp32.yaml rename to tests/components/heatpumpir/test.esp32-ard.yaml diff --git a/tests/components/heatpumpir/test.esp8266.yaml b/tests/components/heatpumpir/test.esp8266-ard.yaml similarity index 100% rename from tests/components/heatpumpir/test.esp8266.yaml rename to tests/components/heatpumpir/test.esp8266-ard.yaml diff --git a/tests/components/hitachi_ac344/test.esp32-c3.yaml b/tests/components/hitachi_ac344/test.esp32-ard.yaml similarity index 100% rename from tests/components/hitachi_ac344/test.esp32-c3.yaml rename to tests/components/hitachi_ac344/test.esp32-ard.yaml diff --git a/tests/components/hitachi_ac344/test.esp32.yaml b/tests/components/hitachi_ac344/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hitachi_ac344/test.esp32.yaml rename to tests/components/hitachi_ac344/test.esp32-c3-ard.yaml diff --git a/tests/components/hitachi_ac344/test.esp8266.yaml b/tests/components/hitachi_ac344/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hitachi_ac344/test.esp8266.yaml rename to tests/components/hitachi_ac344/test.esp8266-ard.yaml diff --git a/tests/components/hitachi_ac424/test.esp32-c3.yaml b/tests/components/hitachi_ac424/test.esp32-ard.yaml similarity index 100% rename from tests/components/hitachi_ac424/test.esp32-c3.yaml rename to tests/components/hitachi_ac424/test.esp32-ard.yaml diff --git a/tests/components/hitachi_ac424/test.esp32.yaml b/tests/components/hitachi_ac424/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hitachi_ac424/test.esp32.yaml rename to tests/components/hitachi_ac424/test.esp32-c3-ard.yaml diff --git a/tests/components/hitachi_ac424/test.esp8266.yaml b/tests/components/hitachi_ac424/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hitachi_ac424/test.esp8266.yaml rename to tests/components/hitachi_ac424/test.esp8266-ard.yaml diff --git a/tests/components/hlw8012/test.esp32.yaml b/tests/components/hlw8012/test.esp32-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.esp32.yaml rename to tests/components/hlw8012/test.esp32-ard.yaml diff --git a/tests/components/hlw8012/test.esp32-c3.yaml b/tests/components/hlw8012/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.esp32-c3.yaml rename to tests/components/hlw8012/test.esp32-c3-ard.yaml diff --git a/tests/components/hlw8012/test.esp8266.yaml b/tests/components/hlw8012/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.esp8266.yaml rename to tests/components/hlw8012/test.esp8266-ard.yaml diff --git a/tests/components/hlw8012/test.rp2040.yaml b/tests/components/hlw8012/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.rp2040.yaml rename to tests/components/hlw8012/test.rp2040-ard.yaml diff --git a/tests/components/hm3301/test.esp32.yaml b/tests/components/hm3301/test.esp32-ard.yaml similarity index 100% rename from tests/components/hm3301/test.esp32.yaml rename to tests/components/hm3301/test.esp32-ard.yaml diff --git a/tests/components/hm3301/test.esp32-c3.yaml b/tests/components/hm3301/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hm3301/test.esp32-c3.yaml rename to tests/components/hm3301/test.esp32-c3-ard.yaml diff --git a/tests/components/hm3301/test.esp8266.yaml b/tests/components/hm3301/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hm3301/test.esp8266.yaml rename to tests/components/hm3301/test.esp8266-ard.yaml diff --git a/tests/components/hm3301/test.rp2040.yaml b/tests/components/hm3301/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hm3301/test.rp2040.yaml rename to tests/components/hm3301/test.rp2040-ard.yaml diff --git a/tests/components/hmc5883l/test.esp32.yaml b/tests/components/hmc5883l/test.esp32-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.esp32.yaml rename to tests/components/hmc5883l/test.esp32-ard.yaml diff --git a/tests/components/hmc5883l/test.esp32-c3.yaml b/tests/components/hmc5883l/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.esp32-c3.yaml rename to tests/components/hmc5883l/test.esp32-c3-ard.yaml diff --git a/tests/components/hmc5883l/test.esp8266.yaml b/tests/components/hmc5883l/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.esp8266.yaml rename to tests/components/hmc5883l/test.esp8266-ard.yaml diff --git a/tests/components/hmc5883l/test.rp2040.yaml b/tests/components/hmc5883l/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.rp2040.yaml rename to tests/components/hmc5883l/test.rp2040-ard.yaml diff --git a/tests/components/homeassistant/test.bk72xx.yaml b/tests/components/homeassistant/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.bk72xx.yaml rename to tests/components/homeassistant/test.bk72xx-ard.yaml diff --git a/tests/components/homeassistant/test.esp32-c3.yaml b/tests/components/homeassistant/test.esp32-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.esp32-c3.yaml rename to tests/components/homeassistant/test.esp32-ard.yaml diff --git a/tests/components/homeassistant/test.esp32.yaml b/tests/components/homeassistant/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.esp32.yaml rename to tests/components/homeassistant/test.esp32-c3-ard.yaml diff --git a/tests/components/homeassistant/test.esp8266.yaml b/tests/components/homeassistant/test.esp8266-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.esp8266.yaml rename to tests/components/homeassistant/test.esp8266-ard.yaml diff --git a/tests/components/homeassistant/test.rp2040.yaml b/tests/components/homeassistant/test.rp2040-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.rp2040.yaml rename to tests/components/homeassistant/test.rp2040-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.esp32.yaml b/tests/components/honeywell_hih_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.esp32.yaml rename to tests/components/honeywell_hih_i2c/test.esp32-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.esp32-c3.yaml b/tests/components/honeywell_hih_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.esp32-c3.yaml rename to tests/components/honeywell_hih_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.esp8266.yaml b/tests/components/honeywell_hih_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.esp8266.yaml rename to tests/components/honeywell_hih_i2c/test.esp8266-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.rp2040.yaml b/tests/components/honeywell_hih_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.rp2040.yaml rename to tests/components/honeywell_hih_i2c/test.rp2040-ard.yaml diff --git a/tests/components/honeywellabp/test.esp32.yaml b/tests/components/honeywellabp/test.esp32-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.esp32.yaml rename to tests/components/honeywellabp/test.esp32-ard.yaml diff --git a/tests/components/honeywellabp/test.esp32-c3.yaml b/tests/components/honeywellabp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.esp32-c3.yaml rename to tests/components/honeywellabp/test.esp32-c3-ard.yaml diff --git a/tests/components/honeywellabp/test.esp8266.yaml b/tests/components/honeywellabp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.esp8266.yaml rename to tests/components/honeywellabp/test.esp8266-ard.yaml diff --git a/tests/components/honeywellabp/test.rp2040.yaml b/tests/components/honeywellabp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.rp2040.yaml rename to tests/components/honeywellabp/test.rp2040-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.esp32.yaml b/tests/components/honeywellabp2_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.esp32.yaml rename to tests/components/honeywellabp2_i2c/test.esp32-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.esp32-c3.yaml b/tests/components/honeywellabp2_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.esp32-c3.yaml rename to tests/components/honeywellabp2_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.esp8266.yaml b/tests/components/honeywellabp2_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.esp8266.yaml rename to tests/components/honeywellabp2_i2c/test.esp8266-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.rp2040.yaml b/tests/components/honeywellabp2_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.rp2040.yaml rename to tests/components/honeywellabp2_i2c/test.rp2040-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.esp32.yaml b/tests/components/hrxl_maxsonar_wr/test.esp32-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.esp32.yaml rename to tests/components/hrxl_maxsonar_wr/test.esp32-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.esp32-c3.yaml b/tests/components/hrxl_maxsonar_wr/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.esp32-c3.yaml rename to tests/components/hrxl_maxsonar_wr/test.esp32-c3-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.esp8266.yaml b/tests/components/hrxl_maxsonar_wr/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.esp8266.yaml rename to tests/components/hrxl_maxsonar_wr/test.esp8266-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.rp2040.yaml b/tests/components/hrxl_maxsonar_wr/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.rp2040.yaml rename to tests/components/hrxl_maxsonar_wr/test.rp2040-ard.yaml diff --git a/tests/components/hte501/test.esp32.yaml b/tests/components/hte501/test.esp32-ard.yaml similarity index 100% rename from tests/components/hte501/test.esp32.yaml rename to tests/components/hte501/test.esp32-ard.yaml diff --git a/tests/components/hte501/test.esp32-c3.yaml b/tests/components/hte501/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hte501/test.esp32-c3.yaml rename to tests/components/hte501/test.esp32-c3-ard.yaml diff --git a/tests/components/hte501/test.esp8266.yaml b/tests/components/hte501/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hte501/test.esp8266.yaml rename to tests/components/hte501/test.esp8266-ard.yaml diff --git a/tests/components/hte501/test.rp2040.yaml b/tests/components/hte501/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hte501/test.rp2040.yaml rename to tests/components/hte501/test.rp2040-ard.yaml diff --git a/tests/components/http_request/test-nossl.esp8266.yaml b/tests/components/http_request/test-nossl.esp8266-ard.yaml similarity index 100% rename from tests/components/http_request/test-nossl.esp8266.yaml rename to tests/components/http_request/test-nossl.esp8266-ard.yaml diff --git a/tests/components/http_request/test.esp32-c3.yaml b/tests/components/http_request/test.esp32-ard.yaml similarity index 100% rename from tests/components/http_request/test.esp32-c3.yaml rename to tests/components/http_request/test.esp32-ard.yaml diff --git a/tests/components/http_request/test.esp32.yaml b/tests/components/http_request/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/http_request/test.esp32.yaml rename to tests/components/http_request/test.esp32-c3-ard.yaml diff --git a/tests/components/http_request/test.esp8266.yaml b/tests/components/http_request/test.esp8266-ard.yaml similarity index 100% rename from tests/components/http_request/test.esp8266.yaml rename to tests/components/http_request/test.esp8266-ard.yaml diff --git a/tests/components/http_request/test.rp2040.yaml b/tests/components/http_request/test.rp2040-ard.yaml similarity index 100% rename from tests/components/http_request/test.rp2040.yaml rename to tests/components/http_request/test.rp2040-ard.yaml diff --git a/tests/components/htu21d/test.esp32.yaml b/tests/components/htu21d/test.esp32-ard.yaml similarity index 100% rename from tests/components/htu21d/test.esp32.yaml rename to tests/components/htu21d/test.esp32-ard.yaml diff --git a/tests/components/htu21d/test.esp32-c3.yaml b/tests/components/htu21d/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/htu21d/test.esp32-c3.yaml rename to tests/components/htu21d/test.esp32-c3-ard.yaml diff --git a/tests/components/htu21d/test.esp8266.yaml b/tests/components/htu21d/test.esp8266-ard.yaml similarity index 100% rename from tests/components/htu21d/test.esp8266.yaml rename to tests/components/htu21d/test.esp8266-ard.yaml diff --git a/tests/components/htu21d/test.rp2040.yaml b/tests/components/htu21d/test.rp2040-ard.yaml similarity index 100% rename from tests/components/htu21d/test.rp2040.yaml rename to tests/components/htu21d/test.rp2040-ard.yaml diff --git a/tests/components/htu31d/test.esp32.yaml b/tests/components/htu31d/test.esp32-ard.yaml similarity index 100% rename from tests/components/htu31d/test.esp32.yaml rename to tests/components/htu31d/test.esp32-ard.yaml diff --git a/tests/components/htu31d/test.esp8266.yaml b/tests/components/htu31d/test.esp8266-ard.yaml similarity index 100% rename from tests/components/htu31d/test.esp8266.yaml rename to tests/components/htu31d/test.esp8266-ard.yaml diff --git a/tests/components/hx711/test.esp32.yaml b/tests/components/hx711/test.esp32-ard.yaml similarity index 100% rename from tests/components/hx711/test.esp32.yaml rename to tests/components/hx711/test.esp32-ard.yaml diff --git a/tests/components/hx711/test.esp32-c3.yaml b/tests/components/hx711/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hx711/test.esp32-c3.yaml rename to tests/components/hx711/test.esp32-c3-ard.yaml diff --git a/tests/components/hx711/test.esp8266.yaml b/tests/components/hx711/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hx711/test.esp8266.yaml rename to tests/components/hx711/test.esp8266-ard.yaml diff --git a/tests/components/hx711/test.rp2040.yaml b/tests/components/hx711/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hx711/test.rp2040.yaml rename to tests/components/hx711/test.rp2040-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.esp32.yaml b/tests/components/hydreon_rgxx/test.esp32-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.esp32.yaml rename to tests/components/hydreon_rgxx/test.esp32-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.esp32-c3.yaml b/tests/components/hydreon_rgxx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.esp32-c3.yaml rename to tests/components/hydreon_rgxx/test.esp32-c3-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.esp8266.yaml b/tests/components/hydreon_rgxx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.esp8266.yaml rename to tests/components/hydreon_rgxx/test.esp8266-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.rp2040.yaml b/tests/components/hydreon_rgxx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.rp2040.yaml rename to tests/components/hydreon_rgxx/test.rp2040-ard.yaml diff --git a/tests/components/hyt271/test.esp32.yaml b/tests/components/hyt271/test.esp32-ard.yaml similarity index 100% rename from tests/components/hyt271/test.esp32.yaml rename to tests/components/hyt271/test.esp32-ard.yaml diff --git a/tests/components/hyt271/test.esp32-c3.yaml b/tests/components/hyt271/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hyt271/test.esp32-c3.yaml rename to tests/components/hyt271/test.esp32-c3-ard.yaml diff --git a/tests/components/hyt271/test.esp8266.yaml b/tests/components/hyt271/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hyt271/test.esp8266.yaml rename to tests/components/hyt271/test.esp8266-ard.yaml diff --git a/tests/components/hyt271/test.rp2040.yaml b/tests/components/hyt271/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hyt271/test.rp2040.yaml rename to tests/components/hyt271/test.rp2040-ard.yaml diff --git a/tests/components/i2c/test.esp32.yaml b/tests/components/i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/i2c/test.esp32.yaml rename to tests/components/i2c/test.esp32-ard.yaml diff --git a/tests/components/i2c/test.esp32-c3.yaml b/tests/components/i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/i2c/test.esp32-c3.yaml rename to tests/components/i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/i2c/test.esp8266.yaml b/tests/components/i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/i2c/test.esp8266.yaml rename to tests/components/i2c/test.esp8266-ard.yaml diff --git a/tests/components/i2c/test.rp2040.yaml b/tests/components/i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/i2c/test.rp2040.yaml rename to tests/components/i2c/test.rp2040-ard.yaml diff --git a/tests/components/i2s_audio/test.esp32.yaml b/tests/components/i2s_audio/test.esp32-ard.yaml similarity index 100% rename from tests/components/i2s_audio/test.esp32.yaml rename to tests/components/i2s_audio/test.esp32-ard.yaml diff --git a/tests/components/i2s_audio/test.esp32-c3.yaml b/tests/components/i2s_audio/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/i2s_audio/test.esp32-c3.yaml rename to tests/components/i2s_audio/test.esp32-c3-ard.yaml diff --git a/tests/components/iaqcore/test.esp32.yaml b/tests/components/iaqcore/test.esp32-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.esp32.yaml rename to tests/components/iaqcore/test.esp32-ard.yaml diff --git a/tests/components/iaqcore/test.esp32-c3.yaml b/tests/components/iaqcore/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.esp32-c3.yaml rename to tests/components/iaqcore/test.esp32-c3-ard.yaml diff --git a/tests/components/iaqcore/test.esp8266.yaml b/tests/components/iaqcore/test.esp8266-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.esp8266.yaml rename to tests/components/iaqcore/test.esp8266-ard.yaml diff --git a/tests/components/iaqcore/test.rp2040.yaml b/tests/components/iaqcore/test.rp2040-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.rp2040.yaml rename to tests/components/iaqcore/test.rp2040-ard.yaml diff --git a/tests/components/ili9xxx/test.esp32.yaml b/tests/components/ili9xxx/test.esp32-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.esp32.yaml rename to tests/components/ili9xxx/test.esp32-ard.yaml diff --git a/tests/components/ili9xxx/test.esp32-c3.yaml b/tests/components/ili9xxx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.esp32-c3.yaml rename to tests/components/ili9xxx/test.esp32-c3-ard.yaml diff --git a/tests/components/ili9xxx/test.esp8266.yaml b/tests/components/ili9xxx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.esp8266.yaml rename to tests/components/ili9xxx/test.esp8266-ard.yaml diff --git a/tests/components/ili9xxx/test.rp2040.yaml b/tests/components/ili9xxx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.rp2040.yaml rename to tests/components/ili9xxx/test.rp2040-ard.yaml diff --git a/tests/components/image/test.esp32.yaml b/tests/components/image/test.esp32-ard.yaml similarity index 100% rename from tests/components/image/test.esp32.yaml rename to tests/components/image/test.esp32-ard.yaml diff --git a/tests/components/image/test.esp32-c3.yaml b/tests/components/image/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/image/test.esp32-c3.yaml rename to tests/components/image/test.esp32-c3-ard.yaml diff --git a/tests/components/image/test.esp8266.yaml b/tests/components/image/test.esp8266-ard.yaml similarity index 100% rename from tests/components/image/test.esp8266.yaml rename to tests/components/image/test.esp8266-ard.yaml diff --git a/tests/components/image/test.rp2040.yaml b/tests/components/image/test.rp2040-ard.yaml similarity index 100% rename from tests/components/image/test.rp2040.yaml rename to tests/components/image/test.rp2040-ard.yaml diff --git a/tests/components/improv_serial/test.esp32-c3.yaml b/tests/components/improv_serial/test.esp32-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.esp32-c3.yaml rename to tests/components/improv_serial/test.esp32-ard.yaml diff --git a/tests/components/improv_serial/test.esp32.yaml b/tests/components/improv_serial/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.esp32.yaml rename to tests/components/improv_serial/test.esp32-c3-ard.yaml diff --git a/tests/components/improv_serial/test.esp8266.yaml b/tests/components/improv_serial/test.esp8266-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.esp8266.yaml rename to tests/components/improv_serial/test.esp8266-ard.yaml diff --git a/tests/components/improv_serial/test.rp2040.yaml b/tests/components/improv_serial/test.rp2040-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.rp2040.yaml rename to tests/components/improv_serial/test.rp2040-ard.yaml diff --git a/tests/components/ina219/test.esp32.yaml b/tests/components/ina219/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina219/test.esp32.yaml rename to tests/components/ina219/test.esp32-ard.yaml diff --git a/tests/components/ina219/test.esp32-c3.yaml b/tests/components/ina219/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina219/test.esp32-c3.yaml rename to tests/components/ina219/test.esp32-c3-ard.yaml diff --git a/tests/components/ina219/test.esp8266.yaml b/tests/components/ina219/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina219/test.esp8266.yaml rename to tests/components/ina219/test.esp8266-ard.yaml diff --git a/tests/components/ina219/test.rp2040.yaml b/tests/components/ina219/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina219/test.rp2040.yaml rename to tests/components/ina219/test.rp2040-ard.yaml diff --git a/tests/components/ina226/test.esp32.yaml b/tests/components/ina226/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina226/test.esp32.yaml rename to tests/components/ina226/test.esp32-ard.yaml diff --git a/tests/components/ina226/test.esp32-c3.yaml b/tests/components/ina226/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina226/test.esp32-c3.yaml rename to tests/components/ina226/test.esp32-c3-ard.yaml diff --git a/tests/components/ina226/test.esp8266.yaml b/tests/components/ina226/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina226/test.esp8266.yaml rename to tests/components/ina226/test.esp8266-ard.yaml diff --git a/tests/components/ina226/test.rp2040.yaml b/tests/components/ina226/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina226/test.rp2040.yaml rename to tests/components/ina226/test.rp2040-ard.yaml diff --git a/tests/components/ina260/test.esp32.yaml b/tests/components/ina260/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina260/test.esp32.yaml rename to tests/components/ina260/test.esp32-ard.yaml diff --git a/tests/components/ina260/test.esp32-c3.yaml b/tests/components/ina260/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina260/test.esp32-c3.yaml rename to tests/components/ina260/test.esp32-c3-ard.yaml diff --git a/tests/components/ina260/test.esp8266.yaml b/tests/components/ina260/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina260/test.esp8266.yaml rename to tests/components/ina260/test.esp8266-ard.yaml diff --git a/tests/components/ina260/test.rp2040.yaml b/tests/components/ina260/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina260/test.rp2040.yaml rename to tests/components/ina260/test.rp2040-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.esp32.yaml b/tests/components/ina2xx_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.esp32.yaml rename to tests/components/ina2xx_i2c/test.esp32-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.esp32-c3.yaml b/tests/components/ina2xx_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.esp32-c3.yaml rename to tests/components/ina2xx_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.esp8266.yaml b/tests/components/ina2xx_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.esp8266.yaml rename to tests/components/ina2xx_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.rp2040.yaml b/tests/components/ina2xx_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.rp2040.yaml rename to tests/components/ina2xx_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ina2xx_spi/test.esp32.yaml b/tests/components/ina2xx_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.esp32.yaml rename to tests/components/ina2xx_spi/test.esp32-ard.yaml diff --git a/tests/components/ina2xx_spi/test.esp32-c3.yaml b/tests/components/ina2xx_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.esp32-c3.yaml rename to tests/components/ina2xx_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ina2xx_spi/test.esp8266.yaml b/tests/components/ina2xx_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.esp8266.yaml rename to tests/components/ina2xx_spi/test.esp8266-ard.yaml diff --git a/tests/components/ina2xx_spi/test.rp2040.yaml b/tests/components/ina2xx_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.rp2040.yaml rename to tests/components/ina2xx_spi/test.rp2040-ard.yaml diff --git a/tests/components/ina3221/test.esp32.yaml b/tests/components/ina3221/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina3221/test.esp32.yaml rename to tests/components/ina3221/test.esp32-ard.yaml diff --git a/tests/components/ina3221/test.esp32-c3.yaml b/tests/components/ina3221/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina3221/test.esp32-c3.yaml rename to tests/components/ina3221/test.esp32-c3-ard.yaml diff --git a/tests/components/ina3221/test.esp8266.yaml b/tests/components/ina3221/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina3221/test.esp8266.yaml rename to tests/components/ina3221/test.esp8266-ard.yaml diff --git a/tests/components/ina3221/test.rp2040.yaml b/tests/components/ina3221/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina3221/test.rp2040.yaml rename to tests/components/ina3221/test.rp2040-ard.yaml diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-ard.yaml similarity index 100% rename from tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml rename to tests/components/inkbird_ibsth1_mini/test.esp32-ard.yaml diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/inkbird_ibsth1_mini/test.esp32.yaml rename to tests/components/inkbird_ibsth1_mini/test.esp32-c3-ard.yaml diff --git a/tests/components/inkplate6/test.esp32.yaml b/tests/components/inkplate6/test.esp32-ard.yaml similarity index 100% rename from tests/components/inkplate6/test.esp32.yaml rename to tests/components/inkplate6/test.esp32-ard.yaml diff --git a/tests/components/integration/test.esp32.yaml b/tests/components/integration/test.esp32-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32.yaml rename to tests/components/integration/test.esp32-ard.yaml diff --git a/tests/components/integration/test.esp32-c3.yaml b/tests/components/integration/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32-c3.yaml rename to tests/components/integration/test.esp32-c3-ard.yaml diff --git a/tests/components/integration/test.esp32-s2.yaml b/tests/components/integration/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32-s2.yaml rename to tests/components/integration/test.esp32-s2-ard.yaml diff --git a/tests/components/integration/test.esp32-s3.yaml b/tests/components/integration/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32-s3.yaml rename to tests/components/integration/test.esp32-s3-ard.yaml diff --git a/tests/components/integration/test.esp8266.yaml b/tests/components/integration/test.esp8266-ard.yaml similarity index 100% rename from tests/components/integration/test.esp8266.yaml rename to tests/components/integration/test.esp8266-ard.yaml diff --git a/tests/components/integration/test.rp2040.yaml b/tests/components/integration/test.rp2040-ard.yaml similarity index 100% rename from tests/components/integration/test.rp2040.yaml rename to tests/components/integration/test.rp2040-ard.yaml diff --git a/tests/components/internal_temperature/test.bk72xx.yaml b/tests/components/internal_temperature/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.bk72xx.yaml rename to tests/components/internal_temperature/test.bk72xx-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32-c3.yaml b/tests/components/internal_temperature/test.esp32-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32-c3.yaml rename to tests/components/internal_temperature/test.esp32-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32-s2.yaml b/tests/components/internal_temperature/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32-s2.yaml rename to tests/components/internal_temperature/test.esp32-c3-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32.yaml b/tests/components/internal_temperature/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32.yaml rename to tests/components/internal_temperature/test.esp32-s2-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32-s3.yaml b/tests/components/internal_temperature/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32-s3.yaml rename to tests/components/internal_temperature/test.esp32-s3-ard.yaml diff --git a/tests/components/internal_temperature/test.rp2040.yaml b/tests/components/internal_temperature/test.rp2040-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.rp2040.yaml rename to tests/components/internal_temperature/test.rp2040-ard.yaml diff --git a/tests/components/interval/test.esp32-c3.yaml b/tests/components/interval/test.esp32-ard.yaml similarity index 100% rename from tests/components/interval/test.esp32-c3.yaml rename to tests/components/interval/test.esp32-ard.yaml diff --git a/tests/components/interval/test.esp32.yaml b/tests/components/interval/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/interval/test.esp32.yaml rename to tests/components/interval/test.esp32-c3-ard.yaml diff --git a/tests/components/interval/test.esp8266.yaml b/tests/components/interval/test.esp8266-ard.yaml similarity index 100% rename from tests/components/interval/test.esp8266.yaml rename to tests/components/interval/test.esp8266-ard.yaml diff --git a/tests/components/interval/test.rp2040.yaml b/tests/components/interval/test.rp2040-ard.yaml similarity index 100% rename from tests/components/interval/test.rp2040.yaml rename to tests/components/interval/test.rp2040-ard.yaml diff --git a/tests/components/jsn_sr04t/test.esp32.yaml b/tests/components/jsn_sr04t/test.esp32-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.esp32.yaml rename to tests/components/jsn_sr04t/test.esp32-ard.yaml diff --git a/tests/components/jsn_sr04t/test.esp32-c3.yaml b/tests/components/jsn_sr04t/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.esp32-c3.yaml rename to tests/components/jsn_sr04t/test.esp32-c3-ard.yaml diff --git a/tests/components/jsn_sr04t/test.esp8266.yaml b/tests/components/jsn_sr04t/test.esp8266-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.esp8266.yaml rename to tests/components/jsn_sr04t/test.esp8266-ard.yaml diff --git a/tests/components/jsn_sr04t/test.rp2040.yaml b/tests/components/jsn_sr04t/test.rp2040-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.rp2040.yaml rename to tests/components/jsn_sr04t/test.rp2040-ard.yaml diff --git a/tests/components/kamstrup_kmp/test.esp32.yaml b/tests/components/kamstrup_kmp/test.esp32-ard.yaml similarity index 100% rename from tests/components/kamstrup_kmp/test.esp32.yaml rename to tests/components/kamstrup_kmp/test.esp32-ard.yaml diff --git a/tests/components/kamstrup_kmp/test.esp8266.yaml b/tests/components/kamstrup_kmp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/kamstrup_kmp/test.esp8266.yaml rename to tests/components/kamstrup_kmp/test.esp8266-ard.yaml diff --git a/tests/components/key_collector/test.esp32.yaml b/tests/components/key_collector/test.esp32-ard.yaml similarity index 100% rename from tests/components/key_collector/test.esp32.yaml rename to tests/components/key_collector/test.esp32-ard.yaml diff --git a/tests/components/key_collector/test.esp32-c3.yaml b/tests/components/key_collector/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/key_collector/test.esp32-c3.yaml rename to tests/components/key_collector/test.esp32-c3-ard.yaml diff --git a/tests/components/key_collector/test.esp8266.yaml b/tests/components/key_collector/test.esp8266-ard.yaml similarity index 100% rename from tests/components/key_collector/test.esp8266.yaml rename to tests/components/key_collector/test.esp8266-ard.yaml diff --git a/tests/components/key_collector/test.rp2040.yaml b/tests/components/key_collector/test.rp2040-ard.yaml similarity index 100% rename from tests/components/key_collector/test.rp2040.yaml rename to tests/components/key_collector/test.rp2040-ard.yaml diff --git a/tests/components/kmeteriso/test.esp32.yaml b/tests/components/kmeteriso/test.esp32-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.esp32.yaml rename to tests/components/kmeteriso/test.esp32-ard.yaml diff --git a/tests/components/kmeteriso/test.esp32-c3.yaml b/tests/components/kmeteriso/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.esp32-c3.yaml rename to tests/components/kmeteriso/test.esp32-c3-ard.yaml diff --git a/tests/components/kmeteriso/test.esp8266.yaml b/tests/components/kmeteriso/test.esp8266-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.esp8266.yaml rename to tests/components/kmeteriso/test.esp8266-ard.yaml diff --git a/tests/components/kmeteriso/test.rp2040.yaml b/tests/components/kmeteriso/test.rp2040-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.rp2040.yaml rename to tests/components/kmeteriso/test.rp2040-ard.yaml diff --git a/tests/components/kuntze/test.esp32.yaml b/tests/components/kuntze/test.esp32-ard.yaml similarity index 100% rename from tests/components/kuntze/test.esp32.yaml rename to tests/components/kuntze/test.esp32-ard.yaml diff --git a/tests/components/kuntze/test.esp32-c3.yaml b/tests/components/kuntze/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/kuntze/test.esp32-c3.yaml rename to tests/components/kuntze/test.esp32-c3-ard.yaml diff --git a/tests/components/kuntze/test.esp8266.yaml b/tests/components/kuntze/test.esp8266-ard.yaml similarity index 100% rename from tests/components/kuntze/test.esp8266.yaml rename to tests/components/kuntze/test.esp8266-ard.yaml diff --git a/tests/components/kuntze/test.rp2040.yaml b/tests/components/kuntze/test.rp2040-ard.yaml similarity index 100% rename from tests/components/kuntze/test.rp2040.yaml rename to tests/components/kuntze/test.rp2040-ard.yaml diff --git a/tests/components/lcd_gpio/test.esp32.yaml b/tests/components/lcd_gpio/test.esp32-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.esp32.yaml rename to tests/components/lcd_gpio/test.esp32-ard.yaml diff --git a/tests/components/lcd_gpio/test.esp32-c3.yaml b/tests/components/lcd_gpio/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.esp32-c3.yaml rename to tests/components/lcd_gpio/test.esp32-c3-ard.yaml diff --git a/tests/components/lcd_gpio/test.esp8266.yaml b/tests/components/lcd_gpio/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.esp8266.yaml rename to tests/components/lcd_gpio/test.esp8266-ard.yaml diff --git a/tests/components/lcd_gpio/test.rp2040.yaml b/tests/components/lcd_gpio/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.rp2040.yaml rename to tests/components/lcd_gpio/test.rp2040-ard.yaml diff --git a/tests/components/lcd_menu/test.esp32.yaml b/tests/components/lcd_menu/test.esp32-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.esp32.yaml rename to tests/components/lcd_menu/test.esp32-ard.yaml diff --git a/tests/components/lcd_menu/test.esp32-c3.yaml b/tests/components/lcd_menu/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.esp32-c3.yaml rename to tests/components/lcd_menu/test.esp32-c3-ard.yaml diff --git a/tests/components/lcd_menu/test.esp8266.yaml b/tests/components/lcd_menu/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.esp8266.yaml rename to tests/components/lcd_menu/test.esp8266-ard.yaml diff --git a/tests/components/lcd_menu/test.rp2040.yaml b/tests/components/lcd_menu/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.rp2040.yaml rename to tests/components/lcd_menu/test.rp2040-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.esp32.yaml b/tests/components/lcd_pcf8574/test.esp32-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.esp32.yaml rename to tests/components/lcd_pcf8574/test.esp32-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.esp32-c3.yaml b/tests/components/lcd_pcf8574/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.esp32-c3.yaml rename to tests/components/lcd_pcf8574/test.esp32-c3-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.esp8266.yaml b/tests/components/lcd_pcf8574/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.esp8266.yaml rename to tests/components/lcd_pcf8574/test.esp8266-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.rp2040.yaml b/tests/components/lcd_pcf8574/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.rp2040.yaml rename to tests/components/lcd_pcf8574/test.rp2040-ard.yaml diff --git a/tests/components/ld2410/test.esp32.yaml b/tests/components/ld2410/test.esp32-ard.yaml similarity index 100% rename from tests/components/ld2410/test.esp32.yaml rename to tests/components/ld2410/test.esp32-ard.yaml diff --git a/tests/components/ld2410/test.esp32-c3.yaml b/tests/components/ld2410/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ld2410/test.esp32-c3.yaml rename to tests/components/ld2410/test.esp32-c3-ard.yaml diff --git a/tests/components/ld2410/test.esp8266.yaml b/tests/components/ld2410/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ld2410/test.esp8266.yaml rename to tests/components/ld2410/test.esp8266-ard.yaml diff --git a/tests/components/ld2410/test.rp2040.yaml b/tests/components/ld2410/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ld2410/test.rp2040.yaml rename to tests/components/ld2410/test.rp2040-ard.yaml diff --git a/tests/components/ld2420/test.esp32.yaml b/tests/components/ld2420/test.esp32-ard.yaml similarity index 100% rename from tests/components/ld2420/test.esp32.yaml rename to tests/components/ld2420/test.esp32-ard.yaml diff --git a/tests/components/ld2420/test.esp32-c3.yaml b/tests/components/ld2420/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ld2420/test.esp32-c3.yaml rename to tests/components/ld2420/test.esp32-c3-ard.yaml diff --git a/tests/components/ld2420/test.esp8266.yaml b/tests/components/ld2420/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ld2420/test.esp8266.yaml rename to tests/components/ld2420/test.esp8266-ard.yaml diff --git a/tests/components/ld2420/test.rp2040.yaml b/tests/components/ld2420/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ld2420/test.rp2040.yaml rename to tests/components/ld2420/test.rp2040-ard.yaml diff --git a/tests/components/ledc/test.esp32-c3.yaml b/tests/components/ledc/test.esp32-ard.yaml similarity index 100% rename from tests/components/ledc/test.esp32-c3.yaml rename to tests/components/ledc/test.esp32-ard.yaml diff --git a/tests/components/ledc/test.esp32.yaml b/tests/components/ledc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ledc/test.esp32.yaml rename to tests/components/ledc/test.esp32-c3-ard.yaml diff --git a/tests/components/light/test.esp32.yaml b/tests/components/light/test.esp32-ard.yaml similarity index 100% rename from tests/components/light/test.esp32.yaml rename to tests/components/light/test.esp32-ard.yaml diff --git a/tests/components/light/test.esp32-c3.yaml b/tests/components/light/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/light/test.esp32-c3.yaml rename to tests/components/light/test.esp32-c3-ard.yaml diff --git a/tests/components/light/test.esp8266.yaml b/tests/components/light/test.esp8266-ard.yaml similarity index 100% rename from tests/components/light/test.esp8266.yaml rename to tests/components/light/test.esp8266-ard.yaml diff --git a/tests/components/light/test.rp2040.yaml b/tests/components/light/test.rp2040-ard.yaml similarity index 100% rename from tests/components/light/test.rp2040.yaml rename to tests/components/light/test.rp2040-ard.yaml diff --git a/tests/components/lightwaverf/test.esp8266.yaml b/tests/components/lightwaverf/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lightwaverf/test.esp8266.yaml rename to tests/components/lightwaverf/test.esp8266-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.esp32.yaml b/tests/components/lilygo_t5_47/test.esp32-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.esp32.yaml rename to tests/components/lilygo_t5_47/test.esp32-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.esp32-c3.yaml b/tests/components/lilygo_t5_47/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.esp32-c3.yaml rename to tests/components/lilygo_t5_47/test.esp32-c3-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.esp8266.yaml b/tests/components/lilygo_t5_47/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.esp8266.yaml rename to tests/components/lilygo_t5_47/test.esp8266-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.rp2040.yaml b/tests/components/lilygo_t5_47/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.rp2040.yaml rename to tests/components/lilygo_t5_47/test.rp2040-ard.yaml diff --git a/tests/components/lock/test.esp32-c3.yaml b/tests/components/lock/test.esp32-ard.yaml similarity index 100% rename from tests/components/lock/test.esp32-c3.yaml rename to tests/components/lock/test.esp32-ard.yaml diff --git a/tests/components/lock/test.esp32.yaml b/tests/components/lock/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lock/test.esp32.yaml rename to tests/components/lock/test.esp32-c3-ard.yaml diff --git a/tests/components/lock/test.esp8266.yaml b/tests/components/lock/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lock/test.esp8266.yaml rename to tests/components/lock/test.esp8266-ard.yaml diff --git a/tests/components/lock/test.rp2040.yaml b/tests/components/lock/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lock/test.rp2040.yaml rename to tests/components/lock/test.rp2040-ard.yaml diff --git a/tests/components/logger/test.esp32-c3.yaml b/tests/components/logger/test.esp32-ard.yaml similarity index 100% rename from tests/components/logger/test.esp32-c3.yaml rename to tests/components/logger/test.esp32-ard.yaml diff --git a/tests/components/logger/test.esp32.yaml b/tests/components/logger/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/logger/test.esp32.yaml rename to tests/components/logger/test.esp32-c3-ard.yaml diff --git a/tests/components/logger/test.esp8266.yaml b/tests/components/logger/test.esp8266-ard.yaml similarity index 100% rename from tests/components/logger/test.esp8266.yaml rename to tests/components/logger/test.esp8266-ard.yaml diff --git a/tests/components/logger/test.rp2040.yaml b/tests/components/logger/test.rp2040-ard.yaml similarity index 100% rename from tests/components/logger/test.rp2040.yaml rename to tests/components/logger/test.rp2040-ard.yaml diff --git a/tests/components/ltr390/test.esp32.yaml b/tests/components/ltr390/test.esp32-ard.yaml similarity index 100% rename from tests/components/ltr390/test.esp32.yaml rename to tests/components/ltr390/test.esp32-ard.yaml diff --git a/tests/components/ltr390/test.esp32-c3.yaml b/tests/components/ltr390/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ltr390/test.esp32-c3.yaml rename to tests/components/ltr390/test.esp32-c3-ard.yaml diff --git a/tests/components/ltr390/test.esp8266.yaml b/tests/components/ltr390/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ltr390/test.esp8266.yaml rename to tests/components/ltr390/test.esp8266-ard.yaml diff --git a/tests/components/ltr390/test.rp2040.yaml b/tests/components/ltr390/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ltr390/test.rp2040.yaml rename to tests/components/ltr390/test.rp2040-ard.yaml diff --git a/tests/components/ltr_als_ps/test.esp32.yaml b/tests/components/ltr_als_ps/test.esp32-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.esp32.yaml rename to tests/components/ltr_als_ps/test.esp32-ard.yaml diff --git a/tests/components/ltr_als_ps/test.esp32-c3.yaml b/tests/components/ltr_als_ps/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.esp32-c3.yaml rename to tests/components/ltr_als_ps/test.esp32-c3-ard.yaml diff --git a/tests/components/ltr_als_ps/test.esp8266.yaml b/tests/components/ltr_als_ps/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.esp8266.yaml rename to tests/components/ltr_als_ps/test.esp8266-ard.yaml diff --git a/tests/components/ltr_als_ps/test.rp2040.yaml b/tests/components/ltr_als_ps/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.rp2040.yaml rename to tests/components/ltr_als_ps/test.rp2040-ard.yaml diff --git a/tests/components/matrix_keypad/test.esp32.yaml b/tests/components/matrix_keypad/test.esp32-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.esp32.yaml rename to tests/components/matrix_keypad/test.esp32-ard.yaml diff --git a/tests/components/matrix_keypad/test.esp32-c3.yaml b/tests/components/matrix_keypad/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.esp32-c3.yaml rename to tests/components/matrix_keypad/test.esp32-c3-ard.yaml diff --git a/tests/components/matrix_keypad/test.esp8266.yaml b/tests/components/matrix_keypad/test.esp8266-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.esp8266.yaml rename to tests/components/matrix_keypad/test.esp8266-ard.yaml diff --git a/tests/components/matrix_keypad/test.rp2040.yaml b/tests/components/matrix_keypad/test.rp2040-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.rp2040.yaml rename to tests/components/matrix_keypad/test.rp2040-ard.yaml diff --git a/tests/components/max31855/test.esp32.yaml b/tests/components/max31855/test.esp32-ard.yaml similarity index 100% rename from tests/components/max31855/test.esp32.yaml rename to tests/components/max31855/test.esp32-ard.yaml diff --git a/tests/components/max31855/test.esp32-c3.yaml b/tests/components/max31855/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max31855/test.esp32-c3.yaml rename to tests/components/max31855/test.esp32-c3-ard.yaml diff --git a/tests/components/max31855/test.esp8266.yaml b/tests/components/max31855/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max31855/test.esp8266.yaml rename to tests/components/max31855/test.esp8266-ard.yaml diff --git a/tests/components/max31855/test.rp2040.yaml b/tests/components/max31855/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max31855/test.rp2040.yaml rename to tests/components/max31855/test.rp2040-ard.yaml diff --git a/tests/components/max31856/test.esp32.yaml b/tests/components/max31856/test.esp32-ard.yaml similarity index 100% rename from tests/components/max31856/test.esp32.yaml rename to tests/components/max31856/test.esp32-ard.yaml diff --git a/tests/components/max31856/test.esp32-c3.yaml b/tests/components/max31856/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max31856/test.esp32-c3.yaml rename to tests/components/max31856/test.esp32-c3-ard.yaml diff --git a/tests/components/max31856/test.esp8266.yaml b/tests/components/max31856/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max31856/test.esp8266.yaml rename to tests/components/max31856/test.esp8266-ard.yaml diff --git a/tests/components/max31856/test.rp2040.yaml b/tests/components/max31856/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max31856/test.rp2040.yaml rename to tests/components/max31856/test.rp2040-ard.yaml diff --git a/tests/components/max31865/test.esp32.yaml b/tests/components/max31865/test.esp32-ard.yaml similarity index 100% rename from tests/components/max31865/test.esp32.yaml rename to tests/components/max31865/test.esp32-ard.yaml diff --git a/tests/components/max31865/test.esp32-c3.yaml b/tests/components/max31865/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max31865/test.esp32-c3.yaml rename to tests/components/max31865/test.esp32-c3-ard.yaml diff --git a/tests/components/max31865/test.esp8266.yaml b/tests/components/max31865/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max31865/test.esp8266.yaml rename to tests/components/max31865/test.esp8266-ard.yaml diff --git a/tests/components/max31865/test.rp2040.yaml b/tests/components/max31865/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max31865/test.rp2040.yaml rename to tests/components/max31865/test.rp2040-ard.yaml diff --git a/tests/components/max44009/test.esp32.yaml b/tests/components/max44009/test.esp32-ard.yaml similarity index 100% rename from tests/components/max44009/test.esp32.yaml rename to tests/components/max44009/test.esp32-ard.yaml diff --git a/tests/components/max44009/test.esp32-c3.yaml b/tests/components/max44009/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max44009/test.esp32-c3.yaml rename to tests/components/max44009/test.esp32-c3-ard.yaml diff --git a/tests/components/max44009/test.esp8266.yaml b/tests/components/max44009/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max44009/test.esp8266.yaml rename to tests/components/max44009/test.esp8266-ard.yaml diff --git a/tests/components/max44009/test.rp2040.yaml b/tests/components/max44009/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max44009/test.rp2040.yaml rename to tests/components/max44009/test.rp2040-ard.yaml diff --git a/tests/components/max6675/test.esp32.yaml b/tests/components/max6675/test.esp32-ard.yaml similarity index 100% rename from tests/components/max6675/test.esp32.yaml rename to tests/components/max6675/test.esp32-ard.yaml diff --git a/tests/components/max6675/test.esp32-c3.yaml b/tests/components/max6675/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max6675/test.esp32-c3.yaml rename to tests/components/max6675/test.esp32-c3-ard.yaml diff --git a/tests/components/max6675/test.esp8266.yaml b/tests/components/max6675/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max6675/test.esp8266.yaml rename to tests/components/max6675/test.esp8266-ard.yaml diff --git a/tests/components/max6675/test.rp2040.yaml b/tests/components/max6675/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max6675/test.rp2040.yaml rename to tests/components/max6675/test.rp2040-ard.yaml diff --git a/tests/components/max6956/test.esp32.yaml b/tests/components/max6956/test.esp32-ard.yaml similarity index 100% rename from tests/components/max6956/test.esp32.yaml rename to tests/components/max6956/test.esp32-ard.yaml diff --git a/tests/components/max6956/test.esp32-c3.yaml b/tests/components/max6956/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max6956/test.esp32-c3.yaml rename to tests/components/max6956/test.esp32-c3-ard.yaml diff --git a/tests/components/max6956/test.esp8266.yaml b/tests/components/max6956/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max6956/test.esp8266.yaml rename to tests/components/max6956/test.esp8266-ard.yaml diff --git a/tests/components/max6956/test.rp2040.yaml b/tests/components/max6956/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max6956/test.rp2040.yaml rename to tests/components/max6956/test.rp2040-ard.yaml diff --git a/tests/components/max7219/test.esp32.yaml b/tests/components/max7219/test.esp32-ard.yaml similarity index 100% rename from tests/components/max7219/test.esp32.yaml rename to tests/components/max7219/test.esp32-ard.yaml diff --git a/tests/components/max7219/test.esp32-c3.yaml b/tests/components/max7219/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max7219/test.esp32-c3.yaml rename to tests/components/max7219/test.esp32-c3-ard.yaml diff --git a/tests/components/max7219/test.esp8266.yaml b/tests/components/max7219/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max7219/test.esp8266.yaml rename to tests/components/max7219/test.esp8266-ard.yaml diff --git a/tests/components/max7219/test.rp2040.yaml b/tests/components/max7219/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max7219/test.rp2040.yaml rename to tests/components/max7219/test.rp2040-ard.yaml diff --git a/tests/components/max7219digit/test.esp32.yaml b/tests/components/max7219digit/test.esp32-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.esp32.yaml rename to tests/components/max7219digit/test.esp32-ard.yaml diff --git a/tests/components/max7219digit/test.esp32-c3.yaml b/tests/components/max7219digit/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.esp32-c3.yaml rename to tests/components/max7219digit/test.esp32-c3-ard.yaml diff --git a/tests/components/max7219digit/test.esp8266.yaml b/tests/components/max7219digit/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.esp8266.yaml rename to tests/components/max7219digit/test.esp8266-ard.yaml diff --git a/tests/components/max7219digit/test.rp2040.yaml b/tests/components/max7219digit/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.rp2040.yaml rename to tests/components/max7219digit/test.rp2040-ard.yaml diff --git a/tests/components/max9611/test.esp32.yaml b/tests/components/max9611/test.esp32-ard.yaml similarity index 100% rename from tests/components/max9611/test.esp32.yaml rename to tests/components/max9611/test.esp32-ard.yaml diff --git a/tests/components/max9611/test.esp32-c3.yaml b/tests/components/max9611/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max9611/test.esp32-c3.yaml rename to tests/components/max9611/test.esp32-c3-ard.yaml diff --git a/tests/components/max9611/test.esp8266.yaml b/tests/components/max9611/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max9611/test.esp8266.yaml rename to tests/components/max9611/test.esp8266-ard.yaml diff --git a/tests/components/max9611/test.rp2040.yaml b/tests/components/max9611/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max9611/test.rp2040.yaml rename to tests/components/max9611/test.rp2040-ard.yaml diff --git a/tests/components/mcp23008/test.esp32.yaml b/tests/components/mcp23008/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.esp32.yaml rename to tests/components/mcp23008/test.esp32-ard.yaml diff --git a/tests/components/mcp23008/test.esp32-c3.yaml b/tests/components/mcp23008/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.esp32-c3.yaml rename to tests/components/mcp23008/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23008/test.esp8266.yaml b/tests/components/mcp23008/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.esp8266.yaml rename to tests/components/mcp23008/test.esp8266-ard.yaml diff --git a/tests/components/mcp23008/test.rp2040.yaml b/tests/components/mcp23008/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.rp2040.yaml rename to tests/components/mcp23008/test.rp2040-ard.yaml diff --git a/tests/components/mcp23016/test.esp32.yaml b/tests/components/mcp23016/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.esp32.yaml rename to tests/components/mcp23016/test.esp32-ard.yaml diff --git a/tests/components/mcp23016/test.esp32-c3.yaml b/tests/components/mcp23016/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.esp32-c3.yaml rename to tests/components/mcp23016/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23016/test.esp8266.yaml b/tests/components/mcp23016/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.esp8266.yaml rename to tests/components/mcp23016/test.esp8266-ard.yaml diff --git a/tests/components/mcp23016/test.rp2040.yaml b/tests/components/mcp23016/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.rp2040.yaml rename to tests/components/mcp23016/test.rp2040-ard.yaml diff --git a/tests/components/mcp23017/test.esp32.yaml b/tests/components/mcp23017/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.esp32.yaml rename to tests/components/mcp23017/test.esp32-ard.yaml diff --git a/tests/components/mcp23017/test.esp32-c3.yaml b/tests/components/mcp23017/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.esp32-c3.yaml rename to tests/components/mcp23017/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23017/test.esp8266.yaml b/tests/components/mcp23017/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.esp8266.yaml rename to tests/components/mcp23017/test.esp8266-ard.yaml diff --git a/tests/components/mcp23017/test.rp2040.yaml b/tests/components/mcp23017/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.rp2040.yaml rename to tests/components/mcp23017/test.rp2040-ard.yaml diff --git a/tests/components/mcp23s08/test.esp32.yaml b/tests/components/mcp23s08/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.esp32.yaml rename to tests/components/mcp23s08/test.esp32-ard.yaml diff --git a/tests/components/mcp23s08/test.esp32-c3.yaml b/tests/components/mcp23s08/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.esp32-c3.yaml rename to tests/components/mcp23s08/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23s08/test.esp8266.yaml b/tests/components/mcp23s08/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.esp8266.yaml rename to tests/components/mcp23s08/test.esp8266-ard.yaml diff --git a/tests/components/mcp23s08/test.rp2040.yaml b/tests/components/mcp23s08/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.rp2040.yaml rename to tests/components/mcp23s08/test.rp2040-ard.yaml diff --git a/tests/components/mcp23s17/test.esp32.yaml b/tests/components/mcp23s17/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.esp32.yaml rename to tests/components/mcp23s17/test.esp32-ard.yaml diff --git a/tests/components/mcp23s17/test.esp32-c3.yaml b/tests/components/mcp23s17/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.esp32-c3.yaml rename to tests/components/mcp23s17/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23s17/test.esp8266.yaml b/tests/components/mcp23s17/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.esp8266.yaml rename to tests/components/mcp23s17/test.esp8266-ard.yaml diff --git a/tests/components/mcp23s17/test.rp2040.yaml b/tests/components/mcp23s17/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.rp2040.yaml rename to tests/components/mcp23s17/test.rp2040-ard.yaml diff --git a/tests/components/mcp2515/test.esp32.yaml b/tests/components/mcp2515/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.esp32.yaml rename to tests/components/mcp2515/test.esp32-ard.yaml diff --git a/tests/components/mcp2515/test.esp32-c3.yaml b/tests/components/mcp2515/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.esp32-c3.yaml rename to tests/components/mcp2515/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp2515/test.esp8266.yaml b/tests/components/mcp2515/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.esp8266.yaml rename to tests/components/mcp2515/test.esp8266-ard.yaml diff --git a/tests/components/mcp2515/test.rp2040.yaml b/tests/components/mcp2515/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.rp2040.yaml rename to tests/components/mcp2515/test.rp2040-ard.yaml diff --git a/tests/components/mcp3008/test.esp32.yaml b/tests/components/mcp3008/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.esp32.yaml rename to tests/components/mcp3008/test.esp32-ard.yaml diff --git a/tests/components/mcp3008/test.esp32-c3.yaml b/tests/components/mcp3008/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.esp32-c3.yaml rename to tests/components/mcp3008/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp3008/test.esp8266.yaml b/tests/components/mcp3008/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.esp8266.yaml rename to tests/components/mcp3008/test.esp8266-ard.yaml diff --git a/tests/components/mcp3008/test.rp2040.yaml b/tests/components/mcp3008/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.rp2040.yaml rename to tests/components/mcp3008/test.rp2040-ard.yaml diff --git a/tests/components/mcp3204/test.esp32.yaml b/tests/components/mcp3204/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.esp32.yaml rename to tests/components/mcp3204/test.esp32-ard.yaml diff --git a/tests/components/mcp3204/test.esp32-c3.yaml b/tests/components/mcp3204/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.esp32-c3.yaml rename to tests/components/mcp3204/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp3204/test.esp8266.yaml b/tests/components/mcp3204/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.esp8266.yaml rename to tests/components/mcp3204/test.esp8266-ard.yaml diff --git a/tests/components/mcp3204/test.rp2040.yaml b/tests/components/mcp3204/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.rp2040.yaml rename to tests/components/mcp3204/test.rp2040-ard.yaml diff --git a/tests/components/mcp4725/test.esp32.yaml b/tests/components/mcp4725/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.esp32.yaml rename to tests/components/mcp4725/test.esp32-ard.yaml diff --git a/tests/components/mcp4725/test.esp32-c3.yaml b/tests/components/mcp4725/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.esp32-c3.yaml rename to tests/components/mcp4725/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp4725/test.esp8266.yaml b/tests/components/mcp4725/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.esp8266.yaml rename to tests/components/mcp4725/test.esp8266-ard.yaml diff --git a/tests/components/mcp4725/test.rp2040.yaml b/tests/components/mcp4725/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.rp2040.yaml rename to tests/components/mcp4725/test.rp2040-ard.yaml diff --git a/tests/components/mcp4728/test.esp32.yaml b/tests/components/mcp4728/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.esp32.yaml rename to tests/components/mcp4728/test.esp32-ard.yaml diff --git a/tests/components/mcp4728/test.esp32-c3.yaml b/tests/components/mcp4728/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.esp32-c3.yaml rename to tests/components/mcp4728/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp4728/test.esp8266.yaml b/tests/components/mcp4728/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.esp8266.yaml rename to tests/components/mcp4728/test.esp8266-ard.yaml diff --git a/tests/components/mcp4728/test.rp2040.yaml b/tests/components/mcp4728/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.rp2040.yaml rename to tests/components/mcp4728/test.rp2040-ard.yaml diff --git a/tests/components/mcp47a1/test.esp32.yaml b/tests/components/mcp47a1/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.esp32.yaml rename to tests/components/mcp47a1/test.esp32-ard.yaml diff --git a/tests/components/mcp47a1/test.esp32-c3.yaml b/tests/components/mcp47a1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.esp32-c3.yaml rename to tests/components/mcp47a1/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp47a1/test.esp8266.yaml b/tests/components/mcp47a1/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.esp8266.yaml rename to tests/components/mcp47a1/test.esp8266-ard.yaml diff --git a/tests/components/mcp47a1/test.rp2040.yaml b/tests/components/mcp47a1/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.rp2040.yaml rename to tests/components/mcp47a1/test.rp2040-ard.yaml diff --git a/tests/components/mcp9600/test.esp32.yaml b/tests/components/mcp9600/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.esp32.yaml rename to tests/components/mcp9600/test.esp32-ard.yaml diff --git a/tests/components/mcp9600/test.esp32-c3.yaml b/tests/components/mcp9600/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.esp32-c3.yaml rename to tests/components/mcp9600/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp9600/test.esp8266.yaml b/tests/components/mcp9600/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.esp8266.yaml rename to tests/components/mcp9600/test.esp8266-ard.yaml diff --git a/tests/components/mcp9600/test.rp2040.yaml b/tests/components/mcp9600/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.rp2040.yaml rename to tests/components/mcp9600/test.rp2040-ard.yaml diff --git a/tests/components/mcp9808/test.esp32.yaml b/tests/components/mcp9808/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.esp32.yaml rename to tests/components/mcp9808/test.esp32-ard.yaml diff --git a/tests/components/mcp9808/test.esp32-c3.yaml b/tests/components/mcp9808/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.esp32-c3.yaml rename to tests/components/mcp9808/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp9808/test.esp8266.yaml b/tests/components/mcp9808/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.esp8266.yaml rename to tests/components/mcp9808/test.esp8266-ard.yaml diff --git a/tests/components/mcp9808/test.rp2040.yaml b/tests/components/mcp9808/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.rp2040.yaml rename to tests/components/mcp9808/test.rp2040-ard.yaml diff --git a/tests/components/mdns/test.esp32-c3.yaml b/tests/components/mdns/test.esp32-ard.yaml similarity index 100% rename from tests/components/mdns/test.esp32-c3.yaml rename to tests/components/mdns/test.esp32-ard.yaml diff --git a/tests/components/mdns/test.esp32.yaml b/tests/components/mdns/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mdns/test.esp32.yaml rename to tests/components/mdns/test.esp32-c3-ard.yaml diff --git a/tests/components/mdns/test.esp8266.yaml b/tests/components/mdns/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mdns/test.esp8266.yaml rename to tests/components/mdns/test.esp8266-ard.yaml diff --git a/tests/components/mdns/test.rp2040.yaml b/tests/components/mdns/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mdns/test.rp2040.yaml rename to tests/components/mdns/test.rp2040-ard.yaml diff --git a/tests/components/media_player/test.esp32.yaml b/tests/components/media_player/test.esp32-ard.yaml similarity index 100% rename from tests/components/media_player/test.esp32.yaml rename to tests/components/media_player/test.esp32-ard.yaml diff --git a/tests/components/mhz19/test.esp32.yaml b/tests/components/mhz19/test.esp32-ard.yaml similarity index 100% rename from tests/components/mhz19/test.esp32.yaml rename to tests/components/mhz19/test.esp32-ard.yaml diff --git a/tests/components/mhz19/test.esp32-c3.yaml b/tests/components/mhz19/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mhz19/test.esp32-c3.yaml rename to tests/components/mhz19/test.esp32-c3-ard.yaml diff --git a/tests/components/mhz19/test.esp8266.yaml b/tests/components/mhz19/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mhz19/test.esp8266.yaml rename to tests/components/mhz19/test.esp8266-ard.yaml diff --git a/tests/components/mhz19/test.rp2040.yaml b/tests/components/mhz19/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mhz19/test.rp2040.yaml rename to tests/components/mhz19/test.rp2040-ard.yaml diff --git a/tests/components/micronova/test.esp32.yaml b/tests/components/micronova/test.esp32-ard.yaml similarity index 100% rename from tests/components/micronova/test.esp32.yaml rename to tests/components/micronova/test.esp32-ard.yaml diff --git a/tests/components/micronova/test.esp32-c3.yaml b/tests/components/micronova/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/micronova/test.esp32-c3.yaml rename to tests/components/micronova/test.esp32-c3-ard.yaml diff --git a/tests/components/micronova/test.esp8266.yaml b/tests/components/micronova/test.esp8266-ard.yaml similarity index 100% rename from tests/components/micronova/test.esp8266.yaml rename to tests/components/micronova/test.esp8266-ard.yaml diff --git a/tests/components/micronova/test.rp2040.yaml b/tests/components/micronova/test.rp2040-ard.yaml similarity index 100% rename from tests/components/micronova/test.rp2040.yaml rename to tests/components/micronova/test.rp2040-ard.yaml diff --git a/tests/components/microphone/test.esp32.yaml b/tests/components/microphone/test.esp32-ard.yaml similarity index 100% rename from tests/components/microphone/test.esp32.yaml rename to tests/components/microphone/test.esp32-ard.yaml diff --git a/tests/components/microphone/test.esp32-c3.yaml b/tests/components/microphone/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/microphone/test.esp32-c3.yaml rename to tests/components/microphone/test.esp32-c3-ard.yaml diff --git a/tests/components/mics_4514/test.esp32.yaml b/tests/components/mics_4514/test.esp32-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.esp32.yaml rename to tests/components/mics_4514/test.esp32-ard.yaml diff --git a/tests/components/mics_4514/test.esp32-c3.yaml b/tests/components/mics_4514/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.esp32-c3.yaml rename to tests/components/mics_4514/test.esp32-c3-ard.yaml diff --git a/tests/components/mics_4514/test.esp8266.yaml b/tests/components/mics_4514/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.esp8266.yaml rename to tests/components/mics_4514/test.esp8266-ard.yaml diff --git a/tests/components/mics_4514/test.rp2040.yaml b/tests/components/mics_4514/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.rp2040.yaml rename to tests/components/mics_4514/test.rp2040-ard.yaml diff --git a/tests/components/midea/test.esp32.yaml b/tests/components/midea/test.esp32-ard.yaml similarity index 100% rename from tests/components/midea/test.esp32.yaml rename to tests/components/midea/test.esp32-ard.yaml diff --git a/tests/components/midea/test.esp32-c3.yaml b/tests/components/midea/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/midea/test.esp32-c3.yaml rename to tests/components/midea/test.esp32-c3-ard.yaml diff --git a/tests/components/midea/test.esp8266.yaml b/tests/components/midea/test.esp8266-ard.yaml similarity index 100% rename from tests/components/midea/test.esp8266.yaml rename to tests/components/midea/test.esp8266-ard.yaml diff --git a/tests/components/midea_ir/test.esp32-c3.yaml b/tests/components/midea_ir/test.esp32-ard.yaml similarity index 100% rename from tests/components/midea_ir/test.esp32-c3.yaml rename to tests/components/midea_ir/test.esp32-ard.yaml diff --git a/tests/components/midea_ir/test.esp32.yaml b/tests/components/midea_ir/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/midea_ir/test.esp32.yaml rename to tests/components/midea_ir/test.esp32-c3-ard.yaml diff --git a/tests/components/midea_ir/test.esp8266.yaml b/tests/components/midea_ir/test.esp8266-ard.yaml similarity index 100% rename from tests/components/midea_ir/test.esp8266.yaml rename to tests/components/midea_ir/test.esp8266-ard.yaml diff --git a/tests/components/mitsubishi/test.esp32-c3.yaml b/tests/components/mitsubishi/test.esp32-ard.yaml similarity index 100% rename from tests/components/mitsubishi/test.esp32-c3.yaml rename to tests/components/mitsubishi/test.esp32-ard.yaml diff --git a/tests/components/mitsubishi/test.esp32.yaml b/tests/components/mitsubishi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mitsubishi/test.esp32.yaml rename to tests/components/mitsubishi/test.esp32-c3-ard.yaml diff --git a/tests/components/mitsubishi/test.esp8266.yaml b/tests/components/mitsubishi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mitsubishi/test.esp8266.yaml rename to tests/components/mitsubishi/test.esp8266-ard.yaml diff --git a/tests/components/mlx90393/test.esp32.yaml b/tests/components/mlx90393/test.esp32-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.esp32.yaml rename to tests/components/mlx90393/test.esp32-ard.yaml diff --git a/tests/components/mlx90393/test.esp32-c3.yaml b/tests/components/mlx90393/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.esp32-c3.yaml rename to tests/components/mlx90393/test.esp32-c3-ard.yaml diff --git a/tests/components/mlx90393/test.esp8266.yaml b/tests/components/mlx90393/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.esp8266.yaml rename to tests/components/mlx90393/test.esp8266-ard.yaml diff --git a/tests/components/mlx90393/test.rp2040.yaml b/tests/components/mlx90393/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.rp2040.yaml rename to tests/components/mlx90393/test.rp2040-ard.yaml diff --git a/tests/components/mlx90614/test.esp32.yaml b/tests/components/mlx90614/test.esp32-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.esp32.yaml rename to tests/components/mlx90614/test.esp32-ard.yaml diff --git a/tests/components/mlx90614/test.esp32-c3.yaml b/tests/components/mlx90614/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.esp32-c3.yaml rename to tests/components/mlx90614/test.esp32-c3-ard.yaml diff --git a/tests/components/mlx90614/test.esp8266.yaml b/tests/components/mlx90614/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.esp8266.yaml rename to tests/components/mlx90614/test.esp8266-ard.yaml diff --git a/tests/components/mlx90614/test.rp2040.yaml b/tests/components/mlx90614/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.rp2040.yaml rename to tests/components/mlx90614/test.rp2040-ard.yaml diff --git a/tests/components/mmc5603/test.esp32.yaml b/tests/components/mmc5603/test.esp32-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.esp32.yaml rename to tests/components/mmc5603/test.esp32-ard.yaml diff --git a/tests/components/mmc5603/test.esp32-c3.yaml b/tests/components/mmc5603/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.esp32-c3.yaml rename to tests/components/mmc5603/test.esp32-c3-ard.yaml diff --git a/tests/components/mmc5603/test.esp8266.yaml b/tests/components/mmc5603/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.esp8266.yaml rename to tests/components/mmc5603/test.esp8266-ard.yaml diff --git a/tests/components/mmc5603/test.rp2040.yaml b/tests/components/mmc5603/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.rp2040.yaml rename to tests/components/mmc5603/test.rp2040-ard.yaml diff --git a/tests/components/mmc5983/test.esp32.yaml b/tests/components/mmc5983/test.esp32-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.esp32.yaml rename to tests/components/mmc5983/test.esp32-ard.yaml diff --git a/tests/components/mmc5983/test.esp32-c3.yaml b/tests/components/mmc5983/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.esp32-c3.yaml rename to tests/components/mmc5983/test.esp32-c3-ard.yaml diff --git a/tests/components/mmc5983/test.esp8266.yaml b/tests/components/mmc5983/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.esp8266.yaml rename to tests/components/mmc5983/test.esp8266-ard.yaml diff --git a/tests/components/mmc5983/test.rp2040.yaml b/tests/components/mmc5983/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.rp2040.yaml rename to tests/components/mmc5983/test.rp2040-ard.yaml diff --git a/tests/components/modbus/test.esp32.yaml b/tests/components/modbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/modbus/test.esp32.yaml rename to tests/components/modbus/test.esp32-ard.yaml diff --git a/tests/components/modbus/test.esp32-c3.yaml b/tests/components/modbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/modbus/test.esp32-c3.yaml rename to tests/components/modbus/test.esp32-c3-ard.yaml diff --git a/tests/components/modbus/test.esp8266.yaml b/tests/components/modbus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/modbus/test.esp8266.yaml rename to tests/components/modbus/test.esp8266-ard.yaml diff --git a/tests/components/modbus/test.rp2040.yaml b/tests/components/modbus/test.rp2040-ard.yaml similarity index 100% rename from tests/components/modbus/test.rp2040.yaml rename to tests/components/modbus/test.rp2040-ard.yaml diff --git a/tests/components/modbus_controller/test.esp32.yaml b/tests/components/modbus_controller/test.esp32-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.esp32.yaml rename to tests/components/modbus_controller/test.esp32-ard.yaml diff --git a/tests/components/modbus_controller/test.esp32-c3.yaml b/tests/components/modbus_controller/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.esp32-c3.yaml rename to tests/components/modbus_controller/test.esp32-c3-ard.yaml diff --git a/tests/components/modbus_controller/test.esp8266.yaml b/tests/components/modbus_controller/test.esp8266-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.esp8266.yaml rename to tests/components/modbus_controller/test.esp8266-ard.yaml diff --git a/tests/components/modbus_controller/test.rp2040.yaml b/tests/components/modbus_controller/test.rp2040-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.rp2040.yaml rename to tests/components/modbus_controller/test.rp2040-ard.yaml diff --git a/tests/components/monochromatic/test.esp32-c3.yaml b/tests/components/monochromatic/test.esp32-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.esp32-c3.yaml rename to tests/components/monochromatic/test.esp32-ard.yaml diff --git a/tests/components/monochromatic/test.esp32.yaml b/tests/components/monochromatic/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.esp32.yaml rename to tests/components/monochromatic/test.esp32-c3-ard.yaml diff --git a/tests/components/monochromatic/test.esp8266.yaml b/tests/components/monochromatic/test.esp8266-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.esp8266.yaml rename to tests/components/monochromatic/test.esp8266-ard.yaml diff --git a/tests/components/monochromatic/test.rp2040.yaml b/tests/components/monochromatic/test.rp2040-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.rp2040.yaml rename to tests/components/monochromatic/test.rp2040-ard.yaml diff --git a/tests/components/mopeka_ble/test.esp32-c3.yaml b/tests/components/mopeka_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/mopeka_ble/test.esp32-c3.yaml rename to tests/components/mopeka_ble/test.esp32-ard.yaml diff --git a/tests/components/mopeka_ble/test.esp32.yaml b/tests/components/mopeka_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mopeka_ble/test.esp32.yaml rename to tests/components/mopeka_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/mopeka_pro_check/test.esp32-c3.yaml b/tests/components/mopeka_pro_check/test.esp32-ard.yaml similarity index 100% rename from tests/components/mopeka_pro_check/test.esp32-c3.yaml rename to tests/components/mopeka_pro_check/test.esp32-ard.yaml diff --git a/tests/components/mopeka_pro_check/test.esp32.yaml b/tests/components/mopeka_pro_check/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mopeka_pro_check/test.esp32.yaml rename to tests/components/mopeka_pro_check/test.esp32-c3-ard.yaml diff --git a/tests/components/mopeka_std_check/test.esp32-c3.yaml b/tests/components/mopeka_std_check/test.esp32-ard.yaml similarity index 100% rename from tests/components/mopeka_std_check/test.esp32-c3.yaml rename to tests/components/mopeka_std_check/test.esp32-ard.yaml diff --git a/tests/components/mopeka_std_check/test.esp32.yaml b/tests/components/mopeka_std_check/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mopeka_std_check/test.esp32.yaml rename to tests/components/mopeka_std_check/test.esp32-c3-ard.yaml diff --git a/tests/components/mpl3115a2/test.esp32.yaml b/tests/components/mpl3115a2/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.esp32.yaml rename to tests/components/mpl3115a2/test.esp32-ard.yaml diff --git a/tests/components/mpl3115a2/test.esp32-c3.yaml b/tests/components/mpl3115a2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.esp32-c3.yaml rename to tests/components/mpl3115a2/test.esp32-c3-ard.yaml diff --git a/tests/components/mpl3115a2/test.esp8266.yaml b/tests/components/mpl3115a2/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.esp8266.yaml rename to tests/components/mpl3115a2/test.esp8266-ard.yaml diff --git a/tests/components/mpl3115a2/test.rp2040.yaml b/tests/components/mpl3115a2/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.rp2040.yaml rename to tests/components/mpl3115a2/test.rp2040-ard.yaml diff --git a/tests/components/mpr121/test.esp32.yaml b/tests/components/mpr121/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpr121/test.esp32.yaml rename to tests/components/mpr121/test.esp32-ard.yaml diff --git a/tests/components/mpr121/test.esp32-c3.yaml b/tests/components/mpr121/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpr121/test.esp32-c3.yaml rename to tests/components/mpr121/test.esp32-c3-ard.yaml diff --git a/tests/components/mpr121/test.esp8266.yaml b/tests/components/mpr121/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpr121/test.esp8266.yaml rename to tests/components/mpr121/test.esp8266-ard.yaml diff --git a/tests/components/mpr121/test.rp2040.yaml b/tests/components/mpr121/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpr121/test.rp2040.yaml rename to tests/components/mpr121/test.rp2040-ard.yaml diff --git a/tests/components/mpu6050/test.esp32.yaml b/tests/components/mpu6050/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.esp32.yaml rename to tests/components/mpu6050/test.esp32-ard.yaml diff --git a/tests/components/mpu6050/test.esp32-c3.yaml b/tests/components/mpu6050/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.esp32-c3.yaml rename to tests/components/mpu6050/test.esp32-c3-ard.yaml diff --git a/tests/components/mpu6050/test.esp8266.yaml b/tests/components/mpu6050/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.esp8266.yaml rename to tests/components/mpu6050/test.esp8266-ard.yaml diff --git a/tests/components/mpu6050/test.rp2040.yaml b/tests/components/mpu6050/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.rp2040.yaml rename to tests/components/mpu6050/test.rp2040-ard.yaml diff --git a/tests/components/mpu6886/test.esp32.yaml b/tests/components/mpu6886/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.esp32.yaml rename to tests/components/mpu6886/test.esp32-ard.yaml diff --git a/tests/components/mpu6886/test.esp32-c3.yaml b/tests/components/mpu6886/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.esp32-c3.yaml rename to tests/components/mpu6886/test.esp32-c3-ard.yaml diff --git a/tests/components/mpu6886/test.esp8266.yaml b/tests/components/mpu6886/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.esp8266.yaml rename to tests/components/mpu6886/test.esp8266-ard.yaml diff --git a/tests/components/mpu6886/test.rp2040.yaml b/tests/components/mpu6886/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.rp2040.yaml rename to tests/components/mpu6886/test.rp2040-ard.yaml diff --git a/tests/components/mqtt/test.bk72xx.yaml b/tests/components/mqtt/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/mqtt/test.bk72xx.yaml rename to tests/components/mqtt/test.bk72xx-ard.yaml diff --git a/tests/components/mqtt/test.esp32-c3.yaml b/tests/components/mqtt/test.esp32-ard.yaml similarity index 100% rename from tests/components/mqtt/test.esp32-c3.yaml rename to tests/components/mqtt/test.esp32-ard.yaml diff --git a/tests/components/mqtt/test.esp32.yaml b/tests/components/mqtt/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mqtt/test.esp32.yaml rename to tests/components/mqtt/test.esp32-c3-ard.yaml diff --git a/tests/components/mqtt/test.esp8266.yaml b/tests/components/mqtt/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mqtt/test.esp8266.yaml rename to tests/components/mqtt/test.esp8266-ard.yaml diff --git a/tests/components/mqtt_subscribe/test.esp32-c3.yaml b/tests/components/mqtt_subscribe/test.esp32-ard.yaml similarity index 100% rename from tests/components/mqtt_subscribe/test.esp32-c3.yaml rename to tests/components/mqtt_subscribe/test.esp32-ard.yaml diff --git a/tests/components/mqtt_subscribe/test.esp32.yaml b/tests/components/mqtt_subscribe/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mqtt_subscribe/test.esp32.yaml rename to tests/components/mqtt_subscribe/test.esp32-c3-ard.yaml diff --git a/tests/components/mqtt_subscribe/test.esp8266.yaml b/tests/components/mqtt_subscribe/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mqtt_subscribe/test.esp8266.yaml rename to tests/components/mqtt_subscribe/test.esp8266-ard.yaml diff --git a/tests/components/ms5611/test.esp32.yaml b/tests/components/ms5611/test.esp32-ard.yaml similarity index 100% rename from tests/components/ms5611/test.esp32.yaml rename to tests/components/ms5611/test.esp32-ard.yaml diff --git a/tests/components/ms5611/test.esp32-c3.yaml b/tests/components/ms5611/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ms5611/test.esp32-c3.yaml rename to tests/components/ms5611/test.esp32-c3-ard.yaml diff --git a/tests/components/ms5611/test.esp8266.yaml b/tests/components/ms5611/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ms5611/test.esp8266.yaml rename to tests/components/ms5611/test.esp8266-ard.yaml diff --git a/tests/components/ms5611/test.rp2040.yaml b/tests/components/ms5611/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ms5611/test.rp2040.yaml rename to tests/components/ms5611/test.rp2040-ard.yaml diff --git a/tests/components/my9231/test.esp32-c3.yaml b/tests/components/my9231/test.esp32-ard.yaml similarity index 100% rename from tests/components/my9231/test.esp32-c3.yaml rename to tests/components/my9231/test.esp32-ard.yaml diff --git a/tests/components/my9231/test.esp32.yaml b/tests/components/my9231/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/my9231/test.esp32.yaml rename to tests/components/my9231/test.esp32-c3-ard.yaml diff --git a/tests/components/my9231/test.esp8266.yaml b/tests/components/my9231/test.esp8266-ard.yaml similarity index 100% rename from tests/components/my9231/test.esp8266.yaml rename to tests/components/my9231/test.esp8266-ard.yaml diff --git a/tests/components/my9231/test.rp2040.yaml b/tests/components/my9231/test.rp2040-ard.yaml similarity index 100% rename from tests/components/my9231/test.rp2040.yaml rename to tests/components/my9231/test.rp2040-ard.yaml diff --git a/tests/components/neopixelbus/test.esp32.yaml b/tests/components/neopixelbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/neopixelbus/test.esp32.yaml rename to tests/components/neopixelbus/test.esp32-ard.yaml diff --git a/tests/components/neopixelbus/test.esp32-c3.yaml b/tests/components/neopixelbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/neopixelbus/test.esp32-c3.yaml rename to tests/components/neopixelbus/test.esp32-c3-ard.yaml diff --git a/tests/components/neopixelbus/test.esp8266.yaml b/tests/components/neopixelbus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/neopixelbus/test.esp8266.yaml rename to tests/components/neopixelbus/test.esp8266-ard.yaml diff --git a/tests/components/network/test.esp32-c3.yaml b/tests/components/network/test.esp32-ard.yaml similarity index 100% rename from tests/components/network/test.esp32-c3.yaml rename to tests/components/network/test.esp32-ard.yaml diff --git a/tests/components/network/test.esp32.yaml b/tests/components/network/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/network/test.esp32.yaml rename to tests/components/network/test.esp32-c3-ard.yaml diff --git a/tests/components/network/test.esp8266.yaml b/tests/components/network/test.esp8266-ard.yaml similarity index 100% rename from tests/components/network/test.esp8266.yaml rename to tests/components/network/test.esp8266-ard.yaml diff --git a/tests/components/network/test.rp2040.yaml b/tests/components/network/test.rp2040-ard.yaml similarity index 100% rename from tests/components/network/test.rp2040.yaml rename to tests/components/network/test.rp2040-ard.yaml diff --git a/tests/components/nextion/test.esp32.yaml b/tests/components/nextion/test.esp32-ard.yaml similarity index 100% rename from tests/components/nextion/test.esp32.yaml rename to tests/components/nextion/test.esp32-ard.yaml diff --git a/tests/components/nextion/test.esp32-c3.yaml b/tests/components/nextion/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/nextion/test.esp32-c3.yaml rename to tests/components/nextion/test.esp32-c3-ard.yaml diff --git a/tests/components/nextion/test.esp8266.yaml b/tests/components/nextion/test.esp8266-ard.yaml similarity index 100% rename from tests/components/nextion/test.esp8266.yaml rename to tests/components/nextion/test.esp8266-ard.yaml diff --git a/tests/components/nextion/test.rp2040.yaml b/tests/components/nextion/test.rp2040-ard.yaml similarity index 100% rename from tests/components/nextion/test.rp2040.yaml rename to tests/components/nextion/test.rp2040-ard.yaml diff --git a/tests/components/noblex/test.esp32-c3.yaml b/tests/components/noblex/test.esp32-ard.yaml similarity index 100% rename from tests/components/noblex/test.esp32-c3.yaml rename to tests/components/noblex/test.esp32-ard.yaml diff --git a/tests/components/noblex/test.esp32.yaml b/tests/components/noblex/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/noblex/test.esp32.yaml rename to tests/components/noblex/test.esp32-c3-ard.yaml diff --git a/tests/components/noblex/test.esp8266.yaml b/tests/components/noblex/test.esp8266-ard.yaml similarity index 100% rename from tests/components/noblex/test.esp8266.yaml rename to tests/components/noblex/test.esp8266-ard.yaml diff --git a/tests/components/ntc/test.esp32.yaml b/tests/components/ntc/test.esp32-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32.yaml rename to tests/components/ntc/test.esp32-ard.yaml diff --git a/tests/components/ntc/test.esp32-c3.yaml b/tests/components/ntc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32-c3.yaml rename to tests/components/ntc/test.esp32-c3-ard.yaml diff --git a/tests/components/ntc/test.esp32-s2.yaml b/tests/components/ntc/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32-s2.yaml rename to tests/components/ntc/test.esp32-s2-ard.yaml diff --git a/tests/components/ntc/test.esp32-s3.yaml b/tests/components/ntc/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32-s3.yaml rename to tests/components/ntc/test.esp32-s3-ard.yaml diff --git a/tests/components/ntc/test.esp8266.yaml b/tests/components/ntc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp8266.yaml rename to tests/components/ntc/test.esp8266-ard.yaml diff --git a/tests/components/ntc/test.rp2040.yaml b/tests/components/ntc/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ntc/test.rp2040.yaml rename to tests/components/ntc/test.rp2040-ard.yaml diff --git a/tests/components/ota/test.esp32-c3.yaml b/tests/components/ota/test.esp32-ard.yaml similarity index 100% rename from tests/components/ota/test.esp32-c3.yaml rename to tests/components/ota/test.esp32-ard.yaml diff --git a/tests/components/ota/test.esp32.yaml b/tests/components/ota/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ota/test.esp32.yaml rename to tests/components/ota/test.esp32-c3-ard.yaml diff --git a/tests/components/ota/test.esp8266.yaml b/tests/components/ota/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ota/test.esp8266.yaml rename to tests/components/ota/test.esp8266-ard.yaml diff --git a/tests/components/ota/test.rp2040.yaml b/tests/components/ota/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ota/test.rp2040.yaml rename to tests/components/ota/test.rp2040-ard.yaml diff --git a/tests/components/output/test.esp32.yaml b/tests/components/output/test.esp32-ard.yaml similarity index 100% rename from tests/components/output/test.esp32.yaml rename to tests/components/output/test.esp32-ard.yaml diff --git a/tests/components/output/test.esp32-c3.yaml b/tests/components/output/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/output/test.esp32-c3.yaml rename to tests/components/output/test.esp32-c3-ard.yaml diff --git a/tests/components/output/test.esp8266.yaml b/tests/components/output/test.esp8266-ard.yaml similarity index 100% rename from tests/components/output/test.esp8266.yaml rename to tests/components/output/test.esp8266-ard.yaml diff --git a/tests/components/output/test.rp2040.yaml b/tests/components/output/test.rp2040-ard.yaml similarity index 100% rename from tests/components/output/test.rp2040.yaml rename to tests/components/output/test.rp2040-ard.yaml diff --git a/tests/components/partition/test.esp32.yaml b/tests/components/partition/test.esp32-ard.yaml similarity index 100% rename from tests/components/partition/test.esp32.yaml rename to tests/components/partition/test.esp32-ard.yaml diff --git a/tests/components/partition/test.esp32-c3.yaml b/tests/components/partition/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/partition/test.esp32-c3.yaml rename to tests/components/partition/test.esp32-c3-ard.yaml diff --git a/tests/components/pca6416a/test.esp32.yaml b/tests/components/pca6416a/test.esp32-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.esp32.yaml rename to tests/components/pca6416a/test.esp32-ard.yaml diff --git a/tests/components/pca6416a/test.esp32-c3.yaml b/tests/components/pca6416a/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.esp32-c3.yaml rename to tests/components/pca6416a/test.esp32-c3-ard.yaml diff --git a/tests/components/pca6416a/test.esp8266.yaml b/tests/components/pca6416a/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.esp8266.yaml rename to tests/components/pca6416a/test.esp8266-ard.yaml diff --git a/tests/components/pca6416a/test.rp2040.yaml b/tests/components/pca6416a/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.rp2040.yaml rename to tests/components/pca6416a/test.rp2040-ard.yaml diff --git a/tests/components/pca9554/test.esp32.yaml b/tests/components/pca9554/test.esp32-ard.yaml similarity index 100% rename from tests/components/pca9554/test.esp32.yaml rename to tests/components/pca9554/test.esp32-ard.yaml diff --git a/tests/components/pca9554/test.esp32-c3.yaml b/tests/components/pca9554/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pca9554/test.esp32-c3.yaml rename to tests/components/pca9554/test.esp32-c3-ard.yaml diff --git a/tests/components/pca9554/test.esp8266.yaml b/tests/components/pca9554/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pca9554/test.esp8266.yaml rename to tests/components/pca9554/test.esp8266-ard.yaml diff --git a/tests/components/pca9554/test.rp2040.yaml b/tests/components/pca9554/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pca9554/test.rp2040.yaml rename to tests/components/pca9554/test.rp2040-ard.yaml diff --git a/tests/components/pca9685/test.esp32.yaml b/tests/components/pca9685/test.esp32-ard.yaml similarity index 100% rename from tests/components/pca9685/test.esp32.yaml rename to tests/components/pca9685/test.esp32-ard.yaml diff --git a/tests/components/pca9685/test.esp32-c3.yaml b/tests/components/pca9685/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pca9685/test.esp32-c3.yaml rename to tests/components/pca9685/test.esp32-c3-ard.yaml diff --git a/tests/components/pca9685/test.esp8266.yaml b/tests/components/pca9685/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pca9685/test.esp8266.yaml rename to tests/components/pca9685/test.esp8266-ard.yaml diff --git a/tests/components/pca9685/test.rp2040.yaml b/tests/components/pca9685/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pca9685/test.rp2040.yaml rename to tests/components/pca9685/test.rp2040-ard.yaml diff --git a/tests/components/pcd8544/test.esp32.yaml b/tests/components/pcd8544/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.esp32.yaml rename to tests/components/pcd8544/test.esp32-ard.yaml diff --git a/tests/components/pcd8544/test.esp32-c3.yaml b/tests/components/pcd8544/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.esp32-c3.yaml rename to tests/components/pcd8544/test.esp32-c3-ard.yaml diff --git a/tests/components/pcd8544/test.esp8266.yaml b/tests/components/pcd8544/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.esp8266.yaml rename to tests/components/pcd8544/test.esp8266-ard.yaml diff --git a/tests/components/pcd8544/test.rp2040.yaml b/tests/components/pcd8544/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.rp2040.yaml rename to tests/components/pcd8544/test.rp2040-ard.yaml diff --git a/tests/components/pcf85063/test.esp32.yaml b/tests/components/pcf85063/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.esp32.yaml rename to tests/components/pcf85063/test.esp32-ard.yaml diff --git a/tests/components/pcf85063/test.esp32-c3.yaml b/tests/components/pcf85063/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.esp32-c3.yaml rename to tests/components/pcf85063/test.esp32-c3-ard.yaml diff --git a/tests/components/pcf85063/test.esp8266.yaml b/tests/components/pcf85063/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.esp8266.yaml rename to tests/components/pcf85063/test.esp8266-ard.yaml diff --git a/tests/components/pcf85063/test.rp2040.yaml b/tests/components/pcf85063/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.rp2040.yaml rename to tests/components/pcf85063/test.rp2040-ard.yaml diff --git a/tests/components/pcf8563/test.esp32.yaml b/tests/components/pcf8563/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.esp32.yaml rename to tests/components/pcf8563/test.esp32-ard.yaml diff --git a/tests/components/pcf8563/test.esp32-c3.yaml b/tests/components/pcf8563/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.esp32-c3.yaml rename to tests/components/pcf8563/test.esp32-c3-ard.yaml diff --git a/tests/components/pcf8563/test.esp8266.yaml b/tests/components/pcf8563/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.esp8266.yaml rename to tests/components/pcf8563/test.esp8266-ard.yaml diff --git a/tests/components/pcf8563/test.rp2040.yaml b/tests/components/pcf8563/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.rp2040.yaml rename to tests/components/pcf8563/test.rp2040-ard.yaml diff --git a/tests/components/pcf8574/test.esp32.yaml b/tests/components/pcf8574/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.esp32.yaml rename to tests/components/pcf8574/test.esp32-ard.yaml diff --git a/tests/components/pcf8574/test.esp32-c3.yaml b/tests/components/pcf8574/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.esp32-c3.yaml rename to tests/components/pcf8574/test.esp32-c3-ard.yaml diff --git a/tests/components/pcf8574/test.esp8266.yaml b/tests/components/pcf8574/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.esp8266.yaml rename to tests/components/pcf8574/test.esp8266-ard.yaml diff --git a/tests/components/pcf8574/test.rp2040.yaml b/tests/components/pcf8574/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.rp2040.yaml rename to tests/components/pcf8574/test.rp2040-ard.yaml diff --git a/tests/components/pid/test.esp32-c3.yaml b/tests/components/pid/test.esp32-ard.yaml similarity index 100% rename from tests/components/pid/test.esp32-c3.yaml rename to tests/components/pid/test.esp32-ard.yaml diff --git a/tests/components/pid/test.esp32.yaml b/tests/components/pid/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pid/test.esp32.yaml rename to tests/components/pid/test.esp32-c3-ard.yaml diff --git a/tests/components/pid/test.esp8266.yaml b/tests/components/pid/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pid/test.esp8266.yaml rename to tests/components/pid/test.esp8266-ard.yaml diff --git a/tests/components/pid/test.rp2040.yaml b/tests/components/pid/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pid/test.rp2040.yaml rename to tests/components/pid/test.rp2040-ard.yaml diff --git a/tests/components/pipsolar/test.esp32.yaml b/tests/components/pipsolar/test.esp32-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.esp32.yaml rename to tests/components/pipsolar/test.esp32-ard.yaml diff --git a/tests/components/pipsolar/test.esp32-c3.yaml b/tests/components/pipsolar/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.esp32-c3.yaml rename to tests/components/pipsolar/test.esp32-c3-ard.yaml diff --git a/tests/components/pipsolar/test.esp8266.yaml b/tests/components/pipsolar/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.esp8266.yaml rename to tests/components/pipsolar/test.esp8266-ard.yaml diff --git a/tests/components/pipsolar/test.rp2040.yaml b/tests/components/pipsolar/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.rp2040.yaml rename to tests/components/pipsolar/test.rp2040-ard.yaml diff --git a/tests/components/pm1006/test.esp32.yaml b/tests/components/pm1006/test.esp32-ard.yaml similarity index 100% rename from tests/components/pm1006/test.esp32.yaml rename to tests/components/pm1006/test.esp32-ard.yaml diff --git a/tests/components/pm1006/test.esp32-c3.yaml b/tests/components/pm1006/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pm1006/test.esp32-c3.yaml rename to tests/components/pm1006/test.esp32-c3-ard.yaml diff --git a/tests/components/pm1006/test.esp8266.yaml b/tests/components/pm1006/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pm1006/test.esp8266.yaml rename to tests/components/pm1006/test.esp8266-ard.yaml diff --git a/tests/components/pm1006/test.rp2040.yaml b/tests/components/pm1006/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pm1006/test.rp2040.yaml rename to tests/components/pm1006/test.rp2040-ard.yaml diff --git a/tests/components/pmsa003i/test.esp32.yaml b/tests/components/pmsa003i/test.esp32-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.esp32.yaml rename to tests/components/pmsa003i/test.esp32-ard.yaml diff --git a/tests/components/pmsa003i/test.esp32-c3.yaml b/tests/components/pmsa003i/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.esp32-c3.yaml rename to tests/components/pmsa003i/test.esp32-c3-ard.yaml diff --git a/tests/components/pmsa003i/test.esp8266.yaml b/tests/components/pmsa003i/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.esp8266.yaml rename to tests/components/pmsa003i/test.esp8266-ard.yaml diff --git a/tests/components/pmsa003i/test.rp2040.yaml b/tests/components/pmsa003i/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.rp2040.yaml rename to tests/components/pmsa003i/test.rp2040-ard.yaml diff --git a/tests/components/pmsx003/test.esp32.yaml b/tests/components/pmsx003/test.esp32-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.esp32.yaml rename to tests/components/pmsx003/test.esp32-ard.yaml diff --git a/tests/components/pmsx003/test.esp32-c3.yaml b/tests/components/pmsx003/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.esp32-c3.yaml rename to tests/components/pmsx003/test.esp32-c3-ard.yaml diff --git a/tests/components/pmsx003/test.esp8266.yaml b/tests/components/pmsx003/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.esp8266.yaml rename to tests/components/pmsx003/test.esp8266-ard.yaml diff --git a/tests/components/pmsx003/test.rp2040.yaml b/tests/components/pmsx003/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.rp2040.yaml rename to tests/components/pmsx003/test.rp2040-ard.yaml diff --git a/tests/components/pmwcs3/test.esp32.yaml b/tests/components/pmwcs3/test.esp32-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.esp32.yaml rename to tests/components/pmwcs3/test.esp32-ard.yaml diff --git a/tests/components/pmwcs3/test.esp32-c3.yaml b/tests/components/pmwcs3/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.esp32-c3.yaml rename to tests/components/pmwcs3/test.esp32-c3-ard.yaml diff --git a/tests/components/pmwcs3/test.esp8266.yaml b/tests/components/pmwcs3/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.esp8266.yaml rename to tests/components/pmwcs3/test.esp8266-ard.yaml diff --git a/tests/components/pmwcs3/test.rp2040.yaml b/tests/components/pmwcs3/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.rp2040.yaml rename to tests/components/pmwcs3/test.rp2040-ard.yaml diff --git a/tests/components/pn532_i2c/test.esp32.yaml b/tests/components/pn532_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.esp32.yaml rename to tests/components/pn532_i2c/test.esp32-ard.yaml diff --git a/tests/components/pn532_i2c/test.esp32-c3.yaml b/tests/components/pn532_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.esp32-c3.yaml rename to tests/components/pn532_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/pn532_i2c/test.esp8266.yaml b/tests/components/pn532_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.esp8266.yaml rename to tests/components/pn532_i2c/test.esp8266-ard.yaml diff --git a/tests/components/pn532_i2c/test.rp2040.yaml b/tests/components/pn532_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.rp2040.yaml rename to tests/components/pn532_i2c/test.rp2040-ard.yaml diff --git a/tests/components/pn532_spi/test.esp32.yaml b/tests/components/pn532_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.esp32.yaml rename to tests/components/pn532_spi/test.esp32-ard.yaml diff --git a/tests/components/pn532_spi/test.esp32-c3.yaml b/tests/components/pn532_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.esp32-c3.yaml rename to tests/components/pn532_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/pn532_spi/test.esp8266.yaml b/tests/components/pn532_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.esp8266.yaml rename to tests/components/pn532_spi/test.esp8266-ard.yaml diff --git a/tests/components/pn532_spi/test.rp2040.yaml b/tests/components/pn532_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.rp2040.yaml rename to tests/components/pn532_spi/test.rp2040-ard.yaml diff --git a/tests/components/pn7150_i2c/test.esp32.yaml b/tests/components/pn7150_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.esp32.yaml rename to tests/components/pn7150_i2c/test.esp32-ard.yaml diff --git a/tests/components/pn7150_i2c/test.esp32-c3.yaml b/tests/components/pn7150_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.esp32-c3.yaml rename to tests/components/pn7150_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/pn7150_i2c/test.esp8266.yaml b/tests/components/pn7150_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.esp8266.yaml rename to tests/components/pn7150_i2c/test.esp8266-ard.yaml diff --git a/tests/components/pn7150_i2c/test.rp2040.yaml b/tests/components/pn7150_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.rp2040.yaml rename to tests/components/pn7150_i2c/test.rp2040-ard.yaml diff --git a/tests/components/pn7160_i2c/test.esp32.yaml b/tests/components/pn7160_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.esp32.yaml rename to tests/components/pn7160_i2c/test.esp32-ard.yaml diff --git a/tests/components/pn7160_i2c/test.esp32-c3.yaml b/tests/components/pn7160_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.esp32-c3.yaml rename to tests/components/pn7160_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/pn7160_i2c/test.esp8266.yaml b/tests/components/pn7160_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.esp8266.yaml rename to tests/components/pn7160_i2c/test.esp8266-ard.yaml diff --git a/tests/components/pn7160_i2c/test.rp2040.yaml b/tests/components/pn7160_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.rp2040.yaml rename to tests/components/pn7160_i2c/test.rp2040-ard.yaml diff --git a/tests/components/pn7160_spi/test.esp32.yaml b/tests/components/pn7160_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.esp32.yaml rename to tests/components/pn7160_spi/test.esp32-ard.yaml diff --git a/tests/components/pn7160_spi/test.esp32-c3.yaml b/tests/components/pn7160_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.esp32-c3.yaml rename to tests/components/pn7160_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/pn7160_spi/test.esp8266.yaml b/tests/components/pn7160_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.esp8266.yaml rename to tests/components/pn7160_spi/test.esp8266-ard.yaml diff --git a/tests/components/pn7160_spi/test.rp2040.yaml b/tests/components/pn7160_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.rp2040.yaml rename to tests/components/pn7160_spi/test.rp2040-ard.yaml diff --git a/tests/components/power_supply/test.esp32-c3.yaml b/tests/components/power_supply/test.esp32-ard.yaml similarity index 100% rename from tests/components/power_supply/test.esp32-c3.yaml rename to tests/components/power_supply/test.esp32-ard.yaml diff --git a/tests/components/power_supply/test.esp32.yaml b/tests/components/power_supply/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/power_supply/test.esp32.yaml rename to tests/components/power_supply/test.esp32-c3-ard.yaml diff --git a/tests/components/power_supply/test.esp8266.yaml b/tests/components/power_supply/test.esp8266-ard.yaml similarity index 100% rename from tests/components/power_supply/test.esp8266.yaml rename to tests/components/power_supply/test.esp8266-ard.yaml diff --git a/tests/components/power_supply/test.rp2040.yaml b/tests/components/power_supply/test.rp2040-ard.yaml similarity index 100% rename from tests/components/power_supply/test.rp2040.yaml rename to tests/components/power_supply/test.rp2040-ard.yaml diff --git a/tests/components/prometheus/test.esp32-c3.yaml b/tests/components/prometheus/test.esp32-ard.yaml similarity index 100% rename from tests/components/prometheus/test.esp32-c3.yaml rename to tests/components/prometheus/test.esp32-ard.yaml diff --git a/tests/components/prometheus/test.esp32.yaml b/tests/components/prometheus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/prometheus/test.esp32.yaml rename to tests/components/prometheus/test.esp32-c3-ard.yaml diff --git a/tests/components/prometheus/test.esp8266.yaml b/tests/components/prometheus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/prometheus/test.esp8266.yaml rename to tests/components/prometheus/test.esp8266-ard.yaml diff --git a/tests/components/psram/test.esp32-c3.yaml b/tests/components/psram/test.esp32-ard.yaml similarity index 100% rename from tests/components/psram/test.esp32-c3.yaml rename to tests/components/psram/test.esp32-ard.yaml diff --git a/tests/components/psram/test.esp32.yaml b/tests/components/psram/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/psram/test.esp32.yaml rename to tests/components/psram/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_counter/test.esp32-c3.yaml b/tests/components/pulse_counter/test.esp32-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.esp32-c3.yaml rename to tests/components/pulse_counter/test.esp32-ard.yaml diff --git a/tests/components/pulse_counter/test.esp32.yaml b/tests/components/pulse_counter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.esp32.yaml rename to tests/components/pulse_counter/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_counter/test.esp8266.yaml b/tests/components/pulse_counter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.esp8266.yaml rename to tests/components/pulse_counter/test.esp8266-ard.yaml diff --git a/tests/components/pulse_counter/test.rp2040.yaml b/tests/components/pulse_counter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.rp2040.yaml rename to tests/components/pulse_counter/test.rp2040-ard.yaml diff --git a/tests/components/pulse_meter/test.esp32-c3.yaml b/tests/components/pulse_meter/test.esp32-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.esp32-c3.yaml rename to tests/components/pulse_meter/test.esp32-ard.yaml diff --git a/tests/components/pulse_meter/test.esp32.yaml b/tests/components/pulse_meter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.esp32.yaml rename to tests/components/pulse_meter/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_meter/test.esp8266.yaml b/tests/components/pulse_meter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.esp8266.yaml rename to tests/components/pulse_meter/test.esp8266-ard.yaml diff --git a/tests/components/pulse_meter/test.rp2040.yaml b/tests/components/pulse_meter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.rp2040.yaml rename to tests/components/pulse_meter/test.rp2040-ard.yaml diff --git a/tests/components/pulse_width/test.esp32-c3.yaml b/tests/components/pulse_width/test.esp32-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.esp32-c3.yaml rename to tests/components/pulse_width/test.esp32-ard.yaml diff --git a/tests/components/pulse_width/test.esp32.yaml b/tests/components/pulse_width/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.esp32.yaml rename to tests/components/pulse_width/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_width/test.esp8266.yaml b/tests/components/pulse_width/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.esp8266.yaml rename to tests/components/pulse_width/test.esp8266-ard.yaml diff --git a/tests/components/pulse_width/test.rp2040.yaml b/tests/components/pulse_width/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.rp2040.yaml rename to tests/components/pulse_width/test.rp2040-ard.yaml diff --git a/tests/components/pvvx_mithermometer/test.esp32-c3.yaml b/tests/components/pvvx_mithermometer/test.esp32-ard.yaml similarity index 100% rename from tests/components/pvvx_mithermometer/test.esp32-c3.yaml rename to tests/components/pvvx_mithermometer/test.esp32-ard.yaml diff --git a/tests/components/pvvx_mithermometer/test.esp32.yaml b/tests/components/pvvx_mithermometer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pvvx_mithermometer/test.esp32.yaml rename to tests/components/pvvx_mithermometer/test.esp32-c3-ard.yaml diff --git a/tests/components/pylontech/test.esp32.yaml b/tests/components/pylontech/test.esp32-ard.yaml similarity index 100% rename from tests/components/pylontech/test.esp32.yaml rename to tests/components/pylontech/test.esp32-ard.yaml diff --git a/tests/components/pylontech/test.esp32-c3.yaml b/tests/components/pylontech/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pylontech/test.esp32-c3.yaml rename to tests/components/pylontech/test.esp32-c3-ard.yaml diff --git a/tests/components/pylontech/test.esp8266.yaml b/tests/components/pylontech/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pylontech/test.esp8266.yaml rename to tests/components/pylontech/test.esp8266-ard.yaml diff --git a/tests/components/pylontech/test.rp2040.yaml b/tests/components/pylontech/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pylontech/test.rp2040.yaml rename to tests/components/pylontech/test.rp2040-ard.yaml diff --git a/tests/components/pzem004t/test.esp32.yaml b/tests/components/pzem004t/test.esp32-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.esp32.yaml rename to tests/components/pzem004t/test.esp32-ard.yaml diff --git a/tests/components/pzem004t/test.esp32-c3.yaml b/tests/components/pzem004t/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.esp32-c3.yaml rename to tests/components/pzem004t/test.esp32-c3-ard.yaml diff --git a/tests/components/pzem004t/test.esp8266.yaml b/tests/components/pzem004t/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.esp8266.yaml rename to tests/components/pzem004t/test.esp8266-ard.yaml diff --git a/tests/components/pzem004t/test.rp2040.yaml b/tests/components/pzem004t/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.rp2040.yaml rename to tests/components/pzem004t/test.rp2040-ard.yaml diff --git a/tests/components/pzemac/test.esp32.yaml b/tests/components/pzemac/test.esp32-ard.yaml similarity index 100% rename from tests/components/pzemac/test.esp32.yaml rename to tests/components/pzemac/test.esp32-ard.yaml diff --git a/tests/components/pzemac/test.esp32-c3.yaml b/tests/components/pzemac/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pzemac/test.esp32-c3.yaml rename to tests/components/pzemac/test.esp32-c3-ard.yaml diff --git a/tests/components/pzemac/test.esp8266.yaml b/tests/components/pzemac/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pzemac/test.esp8266.yaml rename to tests/components/pzemac/test.esp8266-ard.yaml diff --git a/tests/components/pzemac/test.rp2040.yaml b/tests/components/pzemac/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pzemac/test.rp2040.yaml rename to tests/components/pzemac/test.rp2040-ard.yaml diff --git a/tests/components/pzemdc/test.esp32.yaml b/tests/components/pzemdc/test.esp32-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.esp32.yaml rename to tests/components/pzemdc/test.esp32-ard.yaml diff --git a/tests/components/pzemdc/test.esp32-c3.yaml b/tests/components/pzemdc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.esp32-c3.yaml rename to tests/components/pzemdc/test.esp32-c3-ard.yaml diff --git a/tests/components/pzemdc/test.esp8266.yaml b/tests/components/pzemdc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.esp8266.yaml rename to tests/components/pzemdc/test.esp8266-ard.yaml diff --git a/tests/components/pzemdc/test.rp2040.yaml b/tests/components/pzemdc/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.rp2040.yaml rename to tests/components/pzemdc/test.rp2040-ard.yaml diff --git a/tests/components/qmc5883l/test.esp32.yaml b/tests/components/qmc5883l/test.esp32-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.esp32.yaml rename to tests/components/qmc5883l/test.esp32-ard.yaml diff --git a/tests/components/qmc5883l/test.esp32-c3.yaml b/tests/components/qmc5883l/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.esp32-c3.yaml rename to tests/components/qmc5883l/test.esp32-c3-ard.yaml diff --git a/tests/components/qmc5883l/test.esp8266.yaml b/tests/components/qmc5883l/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.esp8266.yaml rename to tests/components/qmc5883l/test.esp8266-ard.yaml diff --git a/tests/components/qmc5883l/test.rp2040.yaml b/tests/components/qmc5883l/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.rp2040.yaml rename to tests/components/qmc5883l/test.rp2040-ard.yaml diff --git a/tests/components/qmp6988/test.esp32.yaml b/tests/components/qmp6988/test.esp32-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.esp32.yaml rename to tests/components/qmp6988/test.esp32-ard.yaml diff --git a/tests/components/qmp6988/test.esp32-c3.yaml b/tests/components/qmp6988/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.esp32-c3.yaml rename to tests/components/qmp6988/test.esp32-c3-ard.yaml diff --git a/tests/components/qmp6988/test.esp8266.yaml b/tests/components/qmp6988/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.esp8266.yaml rename to tests/components/qmp6988/test.esp8266-ard.yaml diff --git a/tests/components/qmp6988/test.rp2040.yaml b/tests/components/qmp6988/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.rp2040.yaml rename to tests/components/qmp6988/test.rp2040-ard.yaml diff --git a/tests/components/qr_code/test.esp32.yaml b/tests/components/qr_code/test.esp32-ard.yaml similarity index 100% rename from tests/components/qr_code/test.esp32.yaml rename to tests/components/qr_code/test.esp32-ard.yaml diff --git a/tests/components/qr_code/test.esp32-c3.yaml b/tests/components/qr_code/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qr_code/test.esp32-c3.yaml rename to tests/components/qr_code/test.esp32-c3-ard.yaml diff --git a/tests/components/qr_code/test.esp8266.yaml b/tests/components/qr_code/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qr_code/test.esp8266.yaml rename to tests/components/qr_code/test.esp8266-ard.yaml diff --git a/tests/components/qr_code/test.rp2040.yaml b/tests/components/qr_code/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qr_code/test.rp2040.yaml rename to tests/components/qr_code/test.rp2040-ard.yaml diff --git a/tests/components/qwiic_pir/test.esp32.yaml b/tests/components/qwiic_pir/test.esp32-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.esp32.yaml rename to tests/components/qwiic_pir/test.esp32-ard.yaml diff --git a/tests/components/qwiic_pir/test.esp32-c3.yaml b/tests/components/qwiic_pir/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.esp32-c3.yaml rename to tests/components/qwiic_pir/test.esp32-c3-ard.yaml diff --git a/tests/components/qwiic_pir/test.esp8266.yaml b/tests/components/qwiic_pir/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.esp8266.yaml rename to tests/components/qwiic_pir/test.esp8266-ard.yaml diff --git a/tests/components/qwiic_pir/test.rp2040.yaml b/tests/components/qwiic_pir/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.rp2040.yaml rename to tests/components/qwiic_pir/test.rp2040-ard.yaml diff --git a/tests/components/radon_eye_ble/test.esp32-c3.yaml b/tests/components/radon_eye_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/radon_eye_ble/test.esp32-c3.yaml rename to tests/components/radon_eye_ble/test.esp32-ard.yaml diff --git a/tests/components/radon_eye_ble/test.esp32.yaml b/tests/components/radon_eye_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/radon_eye_ble/test.esp32.yaml rename to tests/components/radon_eye_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/radon_eye_rd200/test.esp32-c3.yaml b/tests/components/radon_eye_rd200/test.esp32-ard.yaml similarity index 100% rename from tests/components/radon_eye_rd200/test.esp32-c3.yaml rename to tests/components/radon_eye_rd200/test.esp32-ard.yaml diff --git a/tests/components/radon_eye_rd200/test.esp32.yaml b/tests/components/radon_eye_rd200/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/radon_eye_rd200/test.esp32.yaml rename to tests/components/radon_eye_rd200/test.esp32-c3-ard.yaml diff --git a/tests/components/rc522_i2c/test.esp32.yaml b/tests/components/rc522_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.esp32.yaml rename to tests/components/rc522_i2c/test.esp32-ard.yaml diff --git a/tests/components/rc522_i2c/test.esp32-c3.yaml b/tests/components/rc522_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.esp32-c3.yaml rename to tests/components/rc522_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/rc522_i2c/test.esp8266.yaml b/tests/components/rc522_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.esp8266.yaml rename to tests/components/rc522_i2c/test.esp8266-ard.yaml diff --git a/tests/components/rc522_i2c/test.rp2040.yaml b/tests/components/rc522_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.rp2040.yaml rename to tests/components/rc522_i2c/test.rp2040-ard.yaml diff --git a/tests/components/rc522_spi/test.esp32.yaml b/tests/components/rc522_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.esp32.yaml rename to tests/components/rc522_spi/test.esp32-ard.yaml diff --git a/tests/components/rc522_spi/test.esp32-c3.yaml b/tests/components/rc522_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.esp32-c3.yaml rename to tests/components/rc522_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/rc522_spi/test.esp8266.yaml b/tests/components/rc522_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.esp8266.yaml rename to tests/components/rc522_spi/test.esp8266-ard.yaml diff --git a/tests/components/rc522_spi/test.rp2040.yaml b/tests/components/rc522_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.rp2040.yaml rename to tests/components/rc522_spi/test.rp2040-ard.yaml diff --git a/tests/components/rdm6300/test.esp32.yaml b/tests/components/rdm6300/test.esp32-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.esp32.yaml rename to tests/components/rdm6300/test.esp32-ard.yaml diff --git a/tests/components/rdm6300/test.esp32-c3.yaml b/tests/components/rdm6300/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.esp32-c3.yaml rename to tests/components/rdm6300/test.esp32-c3-ard.yaml diff --git a/tests/components/rdm6300/test.esp8266.yaml b/tests/components/rdm6300/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.esp8266.yaml rename to tests/components/rdm6300/test.esp8266-ard.yaml diff --git a/tests/components/rdm6300/test.rp2040.yaml b/tests/components/rdm6300/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.rp2040.yaml rename to tests/components/rdm6300/test.rp2040-ard.yaml diff --git a/tests/components/remote_receiver/test.esp32-c3.yaml b/tests/components/remote_receiver/test.esp32-ard.yaml similarity index 100% rename from tests/components/remote_receiver/test.esp32-c3.yaml rename to tests/components/remote_receiver/test.esp32-ard.yaml diff --git a/tests/components/remote_receiver/test.esp32.yaml b/tests/components/remote_receiver/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/remote_receiver/test.esp32.yaml rename to tests/components/remote_receiver/test.esp32-c3-ard.yaml diff --git a/tests/components/remote_receiver/test.esp8266.yaml b/tests/components/remote_receiver/test.esp8266-ard.yaml similarity index 100% rename from tests/components/remote_receiver/test.esp8266.yaml rename to tests/components/remote_receiver/test.esp8266-ard.yaml diff --git a/tests/components/remote_transmitter/test.esp32.yaml b/tests/components/remote_transmitter/test.esp32-ard.yaml similarity index 100% rename from tests/components/remote_transmitter/test.esp32.yaml rename to tests/components/remote_transmitter/test.esp32-ard.yaml diff --git a/tests/components/remote_transmitter/test.esp32-c3.yaml b/tests/components/remote_transmitter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/remote_transmitter/test.esp32-c3.yaml rename to tests/components/remote_transmitter/test.esp32-c3-ard.yaml diff --git a/tests/components/remote_transmitter/test.esp8266.yaml b/tests/components/remote_transmitter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/remote_transmitter/test.esp8266.yaml rename to tests/components/remote_transmitter/test.esp8266-ard.yaml diff --git a/tests/components/resistance/test.esp32.yaml b/tests/components/resistance/test.esp32-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32.yaml rename to tests/components/resistance/test.esp32-ard.yaml diff --git a/tests/components/resistance/test.esp32-c3.yaml b/tests/components/resistance/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32-c3.yaml rename to tests/components/resistance/test.esp32-c3-ard.yaml diff --git a/tests/components/resistance/test.esp32-s2.yaml b/tests/components/resistance/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32-s2.yaml rename to tests/components/resistance/test.esp32-s2-ard.yaml diff --git a/tests/components/resistance/test.esp32-s3.yaml b/tests/components/resistance/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32-s3.yaml rename to tests/components/resistance/test.esp32-s3-ard.yaml diff --git a/tests/components/resistance/test.esp8266.yaml b/tests/components/resistance/test.esp8266-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp8266.yaml rename to tests/components/resistance/test.esp8266-ard.yaml diff --git a/tests/components/resistance/test.rp2040.yaml b/tests/components/resistance/test.rp2040-ard.yaml similarity index 100% rename from tests/components/resistance/test.rp2040.yaml rename to tests/components/resistance/test.rp2040-ard.yaml diff --git a/tests/components/restart/test.esp32-c3.yaml b/tests/components/restart/test.esp32-ard.yaml similarity index 100% rename from tests/components/restart/test.esp32-c3.yaml rename to tests/components/restart/test.esp32-ard.yaml diff --git a/tests/components/restart/test.esp32.yaml b/tests/components/restart/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/restart/test.esp32.yaml rename to tests/components/restart/test.esp32-c3-ard.yaml diff --git a/tests/components/restart/test.esp8266.yaml b/tests/components/restart/test.esp8266-ard.yaml similarity index 100% rename from tests/components/restart/test.esp8266.yaml rename to tests/components/restart/test.esp8266-ard.yaml diff --git a/tests/components/restart/test.rp2040.yaml b/tests/components/restart/test.rp2040-ard.yaml similarity index 100% rename from tests/components/restart/test.rp2040.yaml rename to tests/components/restart/test.rp2040-ard.yaml diff --git a/tests/components/rf_bridge/test.esp32.yaml b/tests/components/rf_bridge/test.esp32-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.esp32.yaml rename to tests/components/rf_bridge/test.esp32-ard.yaml diff --git a/tests/components/rf_bridge/test.esp32-c3.yaml b/tests/components/rf_bridge/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.esp32-c3.yaml rename to tests/components/rf_bridge/test.esp32-c3-ard.yaml diff --git a/tests/components/rf_bridge/test.esp8266.yaml b/tests/components/rf_bridge/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.esp8266.yaml rename to tests/components/rf_bridge/test.esp8266-ard.yaml diff --git a/tests/components/rf_bridge/test.rp2040.yaml b/tests/components/rf_bridge/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.rp2040.yaml rename to tests/components/rf_bridge/test.rp2040-ard.yaml diff --git a/tests/components/rgb/test.esp32.yaml b/tests/components/rgb/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgb/test.esp32.yaml rename to tests/components/rgb/test.esp32-ard.yaml diff --git a/tests/components/rgb/test.esp32-c3.yaml b/tests/components/rgb/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgb/test.esp32-c3.yaml rename to tests/components/rgb/test.esp32-c3-ard.yaml diff --git a/tests/components/rgb/test.esp8266.yaml b/tests/components/rgb/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgb/test.esp8266.yaml rename to tests/components/rgb/test.esp8266-ard.yaml diff --git a/tests/components/rgb/test.rp2040.yaml b/tests/components/rgb/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgb/test.rp2040.yaml rename to tests/components/rgb/test.rp2040-ard.yaml diff --git a/tests/components/rgbct/test.esp32.yaml b/tests/components/rgbct/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgbct/test.esp32.yaml rename to tests/components/rgbct/test.esp32-ard.yaml diff --git a/tests/components/rgbct/test.esp32-c3.yaml b/tests/components/rgbct/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgbct/test.esp32-c3.yaml rename to tests/components/rgbct/test.esp32-c3-ard.yaml diff --git a/tests/components/rgbct/test.esp8266.yaml b/tests/components/rgbct/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgbct/test.esp8266.yaml rename to tests/components/rgbct/test.esp8266-ard.yaml diff --git a/tests/components/rgbct/test.rp2040.yaml b/tests/components/rgbct/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgbct/test.rp2040.yaml rename to tests/components/rgbct/test.rp2040-ard.yaml diff --git a/tests/components/rgbw/test.esp32.yaml b/tests/components/rgbw/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgbw/test.esp32.yaml rename to tests/components/rgbw/test.esp32-ard.yaml diff --git a/tests/components/rgbw/test.esp32-c3.yaml b/tests/components/rgbw/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgbw/test.esp32-c3.yaml rename to tests/components/rgbw/test.esp32-c3-ard.yaml diff --git a/tests/components/rgbw/test.esp8266.yaml b/tests/components/rgbw/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgbw/test.esp8266.yaml rename to tests/components/rgbw/test.esp8266-ard.yaml diff --git a/tests/components/rgbw/test.rp2040.yaml b/tests/components/rgbw/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgbw/test.rp2040.yaml rename to tests/components/rgbw/test.rp2040-ard.yaml diff --git a/tests/components/rgbww/test.esp32.yaml b/tests/components/rgbww/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgbww/test.esp32.yaml rename to tests/components/rgbww/test.esp32-ard.yaml diff --git a/tests/components/rgbww/test.esp32-c3.yaml b/tests/components/rgbww/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgbww/test.esp32-c3.yaml rename to tests/components/rgbww/test.esp32-c3-ard.yaml diff --git a/tests/components/rgbww/test.esp8266.yaml b/tests/components/rgbww/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgbww/test.esp8266.yaml rename to tests/components/rgbww/test.esp8266-ard.yaml diff --git a/tests/components/rgbww/test.rp2040.yaml b/tests/components/rgbww/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgbww/test.rp2040.yaml rename to tests/components/rgbww/test.rp2040-ard.yaml diff --git a/tests/components/rotary_encoder/test.esp32.yaml b/tests/components/rotary_encoder/test.esp32-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.esp32.yaml rename to tests/components/rotary_encoder/test.esp32-ard.yaml diff --git a/tests/components/rotary_encoder/test.esp32-c3.yaml b/tests/components/rotary_encoder/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.esp32-c3.yaml rename to tests/components/rotary_encoder/test.esp32-c3-ard.yaml diff --git a/tests/components/rotary_encoder/test.esp8266.yaml b/tests/components/rotary_encoder/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.esp8266.yaml rename to tests/components/rotary_encoder/test.esp8266-ard.yaml diff --git a/tests/components/rotary_encoder/test.rp2040.yaml b/tests/components/rotary_encoder/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.rp2040.yaml rename to tests/components/rotary_encoder/test.rp2040-ard.yaml diff --git a/tests/components/rp2040_pio_led_strip/test.rp2040.yaml b/tests/components/rp2040_pio_led_strip/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rp2040_pio_led_strip/test.rp2040.yaml rename to tests/components/rp2040_pio_led_strip/test.rp2040-ard.yaml diff --git a/tests/components/rp2040_pwm/test.rp2040.yaml b/tests/components/rp2040_pwm/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rp2040_pwm/test.rp2040.yaml rename to tests/components/rp2040_pwm/test.rp2040-ard.yaml diff --git a/tests/components/rtttl/test.esp32.yaml b/tests/components/rtttl/test.esp32-ard.yaml similarity index 100% rename from tests/components/rtttl/test.esp32.yaml rename to tests/components/rtttl/test.esp32-ard.yaml diff --git a/tests/components/rtttl/test.esp32-c3.yaml b/tests/components/rtttl/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rtttl/test.esp32-c3.yaml rename to tests/components/rtttl/test.esp32-c3-ard.yaml diff --git a/tests/components/rtttl/test.esp8266.yaml b/tests/components/rtttl/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rtttl/test.esp8266.yaml rename to tests/components/rtttl/test.esp8266-ard.yaml diff --git a/tests/components/rtttl/test.rp2040.yaml b/tests/components/rtttl/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rtttl/test.rp2040.yaml rename to tests/components/rtttl/test.rp2040-ard.yaml diff --git a/tests/components/ruuvi_ble/test.esp32-c3.yaml b/tests/components/ruuvi_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/ruuvi_ble/test.esp32-c3.yaml rename to tests/components/ruuvi_ble/test.esp32-ard.yaml diff --git a/tests/components/ruuvi_ble/test.esp32.yaml b/tests/components/ruuvi_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ruuvi_ble/test.esp32.yaml rename to tests/components/ruuvi_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/ruuvitag/test.esp32-c3.yaml b/tests/components/ruuvitag/test.esp32-ard.yaml similarity index 100% rename from tests/components/ruuvitag/test.esp32-c3.yaml rename to tests/components/ruuvitag/test.esp32-ard.yaml diff --git a/tests/components/ruuvitag/test.esp32.yaml b/tests/components/ruuvitag/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ruuvitag/test.esp32.yaml rename to tests/components/ruuvitag/test.esp32-c3-ard.yaml diff --git a/tests/components/safe_mode/test.esp32-c3.yaml b/tests/components/safe_mode/test.esp32-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.esp32-c3.yaml rename to tests/components/safe_mode/test.esp32-ard.yaml diff --git a/tests/components/safe_mode/test.esp32.yaml b/tests/components/safe_mode/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.esp32.yaml rename to tests/components/safe_mode/test.esp32-c3-ard.yaml diff --git a/tests/components/safe_mode/test.esp8266.yaml b/tests/components/safe_mode/test.esp8266-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.esp8266.yaml rename to tests/components/safe_mode/test.esp8266-ard.yaml diff --git a/tests/components/safe_mode/test.rp2040.yaml b/tests/components/safe_mode/test.rp2040-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.rp2040.yaml rename to tests/components/safe_mode/test.rp2040-ard.yaml diff --git a/tests/components/scd30/test.esp32.yaml b/tests/components/scd30/test.esp32-ard.yaml similarity index 100% rename from tests/components/scd30/test.esp32.yaml rename to tests/components/scd30/test.esp32-ard.yaml diff --git a/tests/components/scd30/test.esp32-c3.yaml b/tests/components/scd30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/scd30/test.esp32-c3.yaml rename to tests/components/scd30/test.esp32-c3-ard.yaml diff --git a/tests/components/scd30/test.esp8266.yaml b/tests/components/scd30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/scd30/test.esp8266.yaml rename to tests/components/scd30/test.esp8266-ard.yaml diff --git a/tests/components/scd30/test.rp2040.yaml b/tests/components/scd30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/scd30/test.rp2040.yaml rename to tests/components/scd30/test.rp2040-ard.yaml diff --git a/tests/components/scd4x/test.esp32.yaml b/tests/components/scd4x/test.esp32-ard.yaml similarity index 100% rename from tests/components/scd4x/test.esp32.yaml rename to tests/components/scd4x/test.esp32-ard.yaml diff --git a/tests/components/scd4x/test.esp32-c3.yaml b/tests/components/scd4x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/scd4x/test.esp32-c3.yaml rename to tests/components/scd4x/test.esp32-c3-ard.yaml diff --git a/tests/components/scd4x/test.esp8266.yaml b/tests/components/scd4x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/scd4x/test.esp8266.yaml rename to tests/components/scd4x/test.esp8266-ard.yaml diff --git a/tests/components/scd4x/test.rp2040.yaml b/tests/components/scd4x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/scd4x/test.rp2040.yaml rename to tests/components/scd4x/test.rp2040-ard.yaml diff --git a/tests/components/script/test.bk72xx.yaml b/tests/components/script/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/script/test.bk72xx.yaml rename to tests/components/script/test.bk72xx-ard.yaml diff --git a/tests/components/script/test.esp32-c3.yaml b/tests/components/script/test.esp32-ard.yaml similarity index 100% rename from tests/components/script/test.esp32-c3.yaml rename to tests/components/script/test.esp32-ard.yaml diff --git a/tests/components/script/test.esp32.yaml b/tests/components/script/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/script/test.esp32.yaml rename to tests/components/script/test.esp32-c3-ard.yaml diff --git a/tests/components/script/test.esp8266.yaml b/tests/components/script/test.esp8266-ard.yaml similarity index 100% rename from tests/components/script/test.esp8266.yaml rename to tests/components/script/test.esp8266-ard.yaml diff --git a/tests/components/script/test.rp2040.yaml b/tests/components/script/test.rp2040-ard.yaml similarity index 100% rename from tests/components/script/test.rp2040.yaml rename to tests/components/script/test.rp2040-ard.yaml diff --git a/tests/components/sdm_meter/test.esp32.yaml b/tests/components/sdm_meter/test.esp32-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.esp32.yaml rename to tests/components/sdm_meter/test.esp32-ard.yaml diff --git a/tests/components/sdm_meter/test.esp32-c3.yaml b/tests/components/sdm_meter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.esp32-c3.yaml rename to tests/components/sdm_meter/test.esp32-c3-ard.yaml diff --git a/tests/components/sdm_meter/test.esp8266.yaml b/tests/components/sdm_meter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.esp8266.yaml rename to tests/components/sdm_meter/test.esp8266-ard.yaml diff --git a/tests/components/sdm_meter/test.rp2040.yaml b/tests/components/sdm_meter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.rp2040.yaml rename to tests/components/sdm_meter/test.rp2040-ard.yaml diff --git a/tests/components/sdp3x/test.esp32.yaml b/tests/components/sdp3x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.esp32.yaml rename to tests/components/sdp3x/test.esp32-ard.yaml diff --git a/tests/components/sdp3x/test.esp32-c3.yaml b/tests/components/sdp3x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.esp32-c3.yaml rename to tests/components/sdp3x/test.esp32-c3-ard.yaml diff --git a/tests/components/sdp3x/test.esp8266.yaml b/tests/components/sdp3x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.esp8266.yaml rename to tests/components/sdp3x/test.esp8266-ard.yaml diff --git a/tests/components/sdp3x/test.rp2040.yaml b/tests/components/sdp3x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.rp2040.yaml rename to tests/components/sdp3x/test.rp2040-ard.yaml diff --git a/tests/components/sds011/test.esp32.yaml b/tests/components/sds011/test.esp32-ard.yaml similarity index 100% rename from tests/components/sds011/test.esp32.yaml rename to tests/components/sds011/test.esp32-ard.yaml diff --git a/tests/components/sds011/test.esp32-c3.yaml b/tests/components/sds011/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sds011/test.esp32-c3.yaml rename to tests/components/sds011/test.esp32-c3-ard.yaml diff --git a/tests/components/sds011/test.esp8266.yaml b/tests/components/sds011/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sds011/test.esp8266.yaml rename to tests/components/sds011/test.esp8266-ard.yaml diff --git a/tests/components/sds011/test.rp2040.yaml b/tests/components/sds011/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sds011/test.rp2040.yaml rename to tests/components/sds011/test.rp2040-ard.yaml diff --git a/tests/components/seeed_mr24hpc1/test.esp32-c3.yaml b/tests/components/seeed_mr24hpc1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/seeed_mr24hpc1/test.esp32-c3.yaml rename to tests/components/seeed_mr24hpc1/test.esp32-c3-ard.yaml diff --git a/tests/components/selec_meter/test.esp32.yaml b/tests/components/selec_meter/test.esp32-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.esp32.yaml rename to tests/components/selec_meter/test.esp32-ard.yaml diff --git a/tests/components/selec_meter/test.esp32-c3.yaml b/tests/components/selec_meter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.esp32-c3.yaml rename to tests/components/selec_meter/test.esp32-c3-ard.yaml diff --git a/tests/components/selec_meter/test.esp8266.yaml b/tests/components/selec_meter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.esp8266.yaml rename to tests/components/selec_meter/test.esp8266-ard.yaml diff --git a/tests/components/selec_meter/test.rp2040.yaml b/tests/components/selec_meter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.rp2040.yaml rename to tests/components/selec_meter/test.rp2040-ard.yaml diff --git a/tests/components/sen0321/test.esp32.yaml b/tests/components/sen0321/test.esp32-ard.yaml similarity index 100% rename from tests/components/sen0321/test.esp32.yaml rename to tests/components/sen0321/test.esp32-ard.yaml diff --git a/tests/components/sen0321/test.esp32-c3.yaml b/tests/components/sen0321/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sen0321/test.esp32-c3.yaml rename to tests/components/sen0321/test.esp32-c3-ard.yaml diff --git a/tests/components/sen0321/test.esp8266.yaml b/tests/components/sen0321/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sen0321/test.esp8266.yaml rename to tests/components/sen0321/test.esp8266-ard.yaml diff --git a/tests/components/sen0321/test.rp2040.yaml b/tests/components/sen0321/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sen0321/test.rp2040.yaml rename to tests/components/sen0321/test.rp2040-ard.yaml diff --git a/tests/components/sen21231/test.esp32.yaml b/tests/components/sen21231/test.esp32-ard.yaml similarity index 100% rename from tests/components/sen21231/test.esp32.yaml rename to tests/components/sen21231/test.esp32-ard.yaml diff --git a/tests/components/sen21231/test.esp32-c3.yaml b/tests/components/sen21231/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sen21231/test.esp32-c3.yaml rename to tests/components/sen21231/test.esp32-c3-ard.yaml diff --git a/tests/components/sen21231/test.esp8266.yaml b/tests/components/sen21231/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sen21231/test.esp8266.yaml rename to tests/components/sen21231/test.esp8266-ard.yaml diff --git a/tests/components/sen21231/test.rp2040.yaml b/tests/components/sen21231/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sen21231/test.rp2040.yaml rename to tests/components/sen21231/test.rp2040-ard.yaml diff --git a/tests/components/sen5x/test.esp32.yaml b/tests/components/sen5x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sen5x/test.esp32.yaml rename to tests/components/sen5x/test.esp32-ard.yaml diff --git a/tests/components/sen5x/test.esp32-c3.yaml b/tests/components/sen5x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sen5x/test.esp32-c3.yaml rename to tests/components/sen5x/test.esp32-c3-ard.yaml diff --git a/tests/components/sen5x/test.esp8266.yaml b/tests/components/sen5x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sen5x/test.esp8266.yaml rename to tests/components/sen5x/test.esp8266-ard.yaml diff --git a/tests/components/sen5x/test.rp2040.yaml b/tests/components/sen5x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sen5x/test.rp2040.yaml rename to tests/components/sen5x/test.rp2040-ard.yaml diff --git a/tests/components/senseair/test.esp32.yaml b/tests/components/senseair/test.esp32-ard.yaml similarity index 100% rename from tests/components/senseair/test.esp32.yaml rename to tests/components/senseair/test.esp32-ard.yaml diff --git a/tests/components/senseair/test.esp32-c3.yaml b/tests/components/senseair/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/senseair/test.esp32-c3.yaml rename to tests/components/senseair/test.esp32-c3-ard.yaml diff --git a/tests/components/senseair/test.esp8266.yaml b/tests/components/senseair/test.esp8266-ard.yaml similarity index 100% rename from tests/components/senseair/test.esp8266.yaml rename to tests/components/senseair/test.esp8266-ard.yaml diff --git a/tests/components/senseair/test.rp2040.yaml b/tests/components/senseair/test.rp2040-ard.yaml similarity index 100% rename from tests/components/senseair/test.rp2040.yaml rename to tests/components/senseair/test.rp2040-ard.yaml diff --git a/tests/components/servo/test.esp32.yaml b/tests/components/servo/test.esp32-ard.yaml similarity index 100% rename from tests/components/servo/test.esp32.yaml rename to tests/components/servo/test.esp32-ard.yaml diff --git a/tests/components/servo/test.esp32-c3.yaml b/tests/components/servo/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/servo/test.esp32-c3.yaml rename to tests/components/servo/test.esp32-c3-ard.yaml diff --git a/tests/components/servo/test.esp8266.yaml b/tests/components/servo/test.esp8266-ard.yaml similarity index 100% rename from tests/components/servo/test.esp8266.yaml rename to tests/components/servo/test.esp8266-ard.yaml diff --git a/tests/components/servo/test.rp2040.yaml b/tests/components/servo/test.rp2040-ard.yaml similarity index 100% rename from tests/components/servo/test.rp2040.yaml rename to tests/components/servo/test.rp2040-ard.yaml diff --git a/tests/components/sfa30/test.esp32.yaml b/tests/components/sfa30/test.esp32-ard.yaml similarity index 100% rename from tests/components/sfa30/test.esp32.yaml rename to tests/components/sfa30/test.esp32-ard.yaml diff --git a/tests/components/sfa30/test.esp32-c3.yaml b/tests/components/sfa30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sfa30/test.esp32-c3.yaml rename to tests/components/sfa30/test.esp32-c3-ard.yaml diff --git a/tests/components/sfa30/test.esp8266.yaml b/tests/components/sfa30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sfa30/test.esp8266.yaml rename to tests/components/sfa30/test.esp8266-ard.yaml diff --git a/tests/components/sfa30/test.rp2040.yaml b/tests/components/sfa30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sfa30/test.rp2040.yaml rename to tests/components/sfa30/test.rp2040-ard.yaml diff --git a/tests/components/sgp30/test.esp32.yaml b/tests/components/sgp30/test.esp32-ard.yaml similarity index 100% rename from tests/components/sgp30/test.esp32.yaml rename to tests/components/sgp30/test.esp32-ard.yaml diff --git a/tests/components/sgp30/test.esp32-c3.yaml b/tests/components/sgp30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sgp30/test.esp32-c3.yaml rename to tests/components/sgp30/test.esp32-c3-ard.yaml diff --git a/tests/components/sgp30/test.esp8266.yaml b/tests/components/sgp30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sgp30/test.esp8266.yaml rename to tests/components/sgp30/test.esp8266-ard.yaml diff --git a/tests/components/sgp30/test.rp2040.yaml b/tests/components/sgp30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sgp30/test.rp2040.yaml rename to tests/components/sgp30/test.rp2040-ard.yaml diff --git a/tests/components/sgp4x/test.esp32.yaml b/tests/components/sgp4x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.esp32.yaml rename to tests/components/sgp4x/test.esp32-ard.yaml diff --git a/tests/components/sgp4x/test.esp32-c3.yaml b/tests/components/sgp4x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.esp32-c3.yaml rename to tests/components/sgp4x/test.esp32-c3-ard.yaml diff --git a/tests/components/sgp4x/test.esp8266.yaml b/tests/components/sgp4x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.esp8266.yaml rename to tests/components/sgp4x/test.esp8266-ard.yaml diff --git a/tests/components/sgp4x/test.rp2040.yaml b/tests/components/sgp4x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.rp2040.yaml rename to tests/components/sgp4x/test.rp2040-ard.yaml diff --git a/tests/components/shelly_dimmer/test.esp8266.yaml b/tests/components/shelly_dimmer/test.esp8266-ard.yaml similarity index 100% rename from tests/components/shelly_dimmer/test.esp8266.yaml rename to tests/components/shelly_dimmer/test.esp8266-ard.yaml diff --git a/tests/components/sht3xd/test.esp32.yaml b/tests/components/sht3xd/test.esp32-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.esp32.yaml rename to tests/components/sht3xd/test.esp32-ard.yaml diff --git a/tests/components/sht3xd/test.esp32-c3.yaml b/tests/components/sht3xd/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.esp32-c3.yaml rename to tests/components/sht3xd/test.esp32-c3-ard.yaml diff --git a/tests/components/sht3xd/test.esp8266.yaml b/tests/components/sht3xd/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.esp8266.yaml rename to tests/components/sht3xd/test.esp8266-ard.yaml diff --git a/tests/components/sht3xd/test.rp2040.yaml b/tests/components/sht3xd/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.rp2040.yaml rename to tests/components/sht3xd/test.rp2040-ard.yaml diff --git a/tests/components/sht4x/test.esp32.yaml b/tests/components/sht4x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sht4x/test.esp32.yaml rename to tests/components/sht4x/test.esp32-ard.yaml diff --git a/tests/components/sht4x/test.esp32-c3.yaml b/tests/components/sht4x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sht4x/test.esp32-c3.yaml rename to tests/components/sht4x/test.esp32-c3-ard.yaml diff --git a/tests/components/sht4x/test.esp8266.yaml b/tests/components/sht4x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sht4x/test.esp8266.yaml rename to tests/components/sht4x/test.esp8266-ard.yaml diff --git a/tests/components/sht4x/test.rp2040.yaml b/tests/components/sht4x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sht4x/test.rp2040.yaml rename to tests/components/sht4x/test.rp2040-ard.yaml diff --git a/tests/components/shtcx/test.esp32.yaml b/tests/components/shtcx/test.esp32-ard.yaml similarity index 100% rename from tests/components/shtcx/test.esp32.yaml rename to tests/components/shtcx/test.esp32-ard.yaml diff --git a/tests/components/shtcx/test.esp32-c3.yaml b/tests/components/shtcx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/shtcx/test.esp32-c3.yaml rename to tests/components/shtcx/test.esp32-c3-ard.yaml diff --git a/tests/components/shtcx/test.esp8266.yaml b/tests/components/shtcx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/shtcx/test.esp8266.yaml rename to tests/components/shtcx/test.esp8266-ard.yaml diff --git a/tests/components/shtcx/test.rp2040.yaml b/tests/components/shtcx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/shtcx/test.rp2040.yaml rename to tests/components/shtcx/test.rp2040-ard.yaml diff --git a/tests/components/shutdown/test.esp32-c3.yaml b/tests/components/shutdown/test.esp32-ard.yaml similarity index 100% rename from tests/components/shutdown/test.esp32-c3.yaml rename to tests/components/shutdown/test.esp32-ard.yaml diff --git a/tests/components/shutdown/test.esp32.yaml b/tests/components/shutdown/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/shutdown/test.esp32.yaml rename to tests/components/shutdown/test.esp32-c3-ard.yaml diff --git a/tests/components/shutdown/test.esp8266.yaml b/tests/components/shutdown/test.esp8266-ard.yaml similarity index 100% rename from tests/components/shutdown/test.esp8266.yaml rename to tests/components/shutdown/test.esp8266-ard.yaml diff --git a/tests/components/shutdown/test.rp2040.yaml b/tests/components/shutdown/test.rp2040-ard.yaml similarity index 100% rename from tests/components/shutdown/test.rp2040.yaml rename to tests/components/shutdown/test.rp2040-ard.yaml diff --git a/tests/components/sigma_delta_output/test.esp32-c3.yaml b/tests/components/sigma_delta_output/test.esp32-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.esp32-c3.yaml rename to tests/components/sigma_delta_output/test.esp32-ard.yaml diff --git a/tests/components/sigma_delta_output/test.esp32.yaml b/tests/components/sigma_delta_output/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.esp32.yaml rename to tests/components/sigma_delta_output/test.esp32-c3-ard.yaml diff --git a/tests/components/sigma_delta_output/test.esp8266.yaml b/tests/components/sigma_delta_output/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.esp8266.yaml rename to tests/components/sigma_delta_output/test.esp8266-ard.yaml diff --git a/tests/components/sigma_delta_output/test.rp2040.yaml b/tests/components/sigma_delta_output/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.rp2040.yaml rename to tests/components/sigma_delta_output/test.rp2040-ard.yaml diff --git a/tests/components/sim800l/test.esp32.yaml b/tests/components/sim800l/test.esp32-ard.yaml similarity index 100% rename from tests/components/sim800l/test.esp32.yaml rename to tests/components/sim800l/test.esp32-ard.yaml diff --git a/tests/components/sim800l/test.esp32-c3.yaml b/tests/components/sim800l/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sim800l/test.esp32-c3.yaml rename to tests/components/sim800l/test.esp32-c3-ard.yaml diff --git a/tests/components/sim800l/test.esp8266.yaml b/tests/components/sim800l/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sim800l/test.esp8266.yaml rename to tests/components/sim800l/test.esp8266-ard.yaml diff --git a/tests/components/sim800l/test.rp2040.yaml b/tests/components/sim800l/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sim800l/test.rp2040.yaml rename to tests/components/sim800l/test.rp2040-ard.yaml diff --git a/tests/components/slow_pwm/test.esp32-c3.yaml b/tests/components/slow_pwm/test.esp32-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.esp32-c3.yaml rename to tests/components/slow_pwm/test.esp32-ard.yaml diff --git a/tests/components/slow_pwm/test.esp32.yaml b/tests/components/slow_pwm/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.esp32.yaml rename to tests/components/slow_pwm/test.esp32-c3-ard.yaml diff --git a/tests/components/slow_pwm/test.esp8266.yaml b/tests/components/slow_pwm/test.esp8266-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.esp8266.yaml rename to tests/components/slow_pwm/test.esp8266-ard.yaml diff --git a/tests/components/slow_pwm/test.rp2040.yaml b/tests/components/slow_pwm/test.rp2040-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.rp2040.yaml rename to tests/components/slow_pwm/test.rp2040-ard.yaml diff --git a/tests/components/sm16716/test.esp32-c3.yaml b/tests/components/sm16716/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm16716/test.esp32-c3.yaml rename to tests/components/sm16716/test.esp32-ard.yaml diff --git a/tests/components/sm16716/test.esp32.yaml b/tests/components/sm16716/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm16716/test.esp32.yaml rename to tests/components/sm16716/test.esp32-c3-ard.yaml diff --git a/tests/components/sm16716/test.esp8266.yaml b/tests/components/sm16716/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm16716/test.esp8266.yaml rename to tests/components/sm16716/test.esp8266-ard.yaml diff --git a/tests/components/sm16716/test.rp2040.yaml b/tests/components/sm16716/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm16716/test.rp2040.yaml rename to tests/components/sm16716/test.rp2040-ard.yaml diff --git a/tests/components/sm2135/test.esp32-c3.yaml b/tests/components/sm2135/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm2135/test.esp32-c3.yaml rename to tests/components/sm2135/test.esp32-ard.yaml diff --git a/tests/components/sm2135/test.esp32.yaml b/tests/components/sm2135/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm2135/test.esp32.yaml rename to tests/components/sm2135/test.esp32-c3-ard.yaml diff --git a/tests/components/sm2135/test.esp8266.yaml b/tests/components/sm2135/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm2135/test.esp8266.yaml rename to tests/components/sm2135/test.esp8266-ard.yaml diff --git a/tests/components/sm2135/test.rp2040.yaml b/tests/components/sm2135/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm2135/test.rp2040.yaml rename to tests/components/sm2135/test.rp2040-ard.yaml diff --git a/tests/components/sm2235/test.esp32-c3.yaml b/tests/components/sm2235/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm2235/test.esp32-c3.yaml rename to tests/components/sm2235/test.esp32-ard.yaml diff --git a/tests/components/sm2235/test.esp32.yaml b/tests/components/sm2235/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm2235/test.esp32.yaml rename to tests/components/sm2235/test.esp32-c3-ard.yaml diff --git a/tests/components/sm2235/test.esp8266.yaml b/tests/components/sm2235/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm2235/test.esp8266.yaml rename to tests/components/sm2235/test.esp8266-ard.yaml diff --git a/tests/components/sm2235/test.rp2040.yaml b/tests/components/sm2235/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm2235/test.rp2040.yaml rename to tests/components/sm2235/test.rp2040-ard.yaml diff --git a/tests/components/sm2335/test.esp32-c3.yaml b/tests/components/sm2335/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm2335/test.esp32-c3.yaml rename to tests/components/sm2335/test.esp32-ard.yaml diff --git a/tests/components/sm2335/test.esp32.yaml b/tests/components/sm2335/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm2335/test.esp32.yaml rename to tests/components/sm2335/test.esp32-c3-ard.yaml diff --git a/tests/components/sm2335/test.esp8266.yaml b/tests/components/sm2335/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm2335/test.esp8266.yaml rename to tests/components/sm2335/test.esp8266-ard.yaml diff --git a/tests/components/sm2335/test.rp2040.yaml b/tests/components/sm2335/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm2335/test.rp2040.yaml rename to tests/components/sm2335/test.rp2040-ard.yaml diff --git a/tests/components/sm300d2/test.esp32.yaml b/tests/components/sm300d2/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.esp32.yaml rename to tests/components/sm300d2/test.esp32-ard.yaml diff --git a/tests/components/sm300d2/test.esp32-c3.yaml b/tests/components/sm300d2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.esp32-c3.yaml rename to tests/components/sm300d2/test.esp32-c3-ard.yaml diff --git a/tests/components/sm300d2/test.esp8266.yaml b/tests/components/sm300d2/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.esp8266.yaml rename to tests/components/sm300d2/test.esp8266-ard.yaml diff --git a/tests/components/sm300d2/test.rp2040.yaml b/tests/components/sm300d2/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.rp2040.yaml rename to tests/components/sm300d2/test.rp2040-ard.yaml diff --git a/tests/components/sml/test.esp32.yaml b/tests/components/sml/test.esp32-ard.yaml similarity index 100% rename from tests/components/sml/test.esp32.yaml rename to tests/components/sml/test.esp32-ard.yaml diff --git a/tests/components/sml/test.esp32-c3.yaml b/tests/components/sml/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sml/test.esp32-c3.yaml rename to tests/components/sml/test.esp32-c3-ard.yaml diff --git a/tests/components/sml/test.esp8266.yaml b/tests/components/sml/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sml/test.esp8266.yaml rename to tests/components/sml/test.esp8266-ard.yaml diff --git a/tests/components/sml/test.rp2040.yaml b/tests/components/sml/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sml/test.rp2040.yaml rename to tests/components/sml/test.rp2040-ard.yaml diff --git a/tests/components/smt100/test.esp32.yaml b/tests/components/smt100/test.esp32-ard.yaml similarity index 100% rename from tests/components/smt100/test.esp32.yaml rename to tests/components/smt100/test.esp32-ard.yaml diff --git a/tests/components/smt100/test.esp32-c3.yaml b/tests/components/smt100/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/smt100/test.esp32-c3.yaml rename to tests/components/smt100/test.esp32-c3-ard.yaml diff --git a/tests/components/smt100/test.esp8266.yaml b/tests/components/smt100/test.esp8266-ard.yaml similarity index 100% rename from tests/components/smt100/test.esp8266.yaml rename to tests/components/smt100/test.esp8266-ard.yaml diff --git a/tests/components/smt100/test.rp2040.yaml b/tests/components/smt100/test.rp2040-ard.yaml similarity index 100% rename from tests/components/smt100/test.rp2040.yaml rename to tests/components/smt100/test.rp2040-ard.yaml diff --git a/tests/components/sn74hc165/test.esp32.yaml b/tests/components/sn74hc165/test.esp32-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.esp32.yaml rename to tests/components/sn74hc165/test.esp32-ard.yaml diff --git a/tests/components/sn74hc165/test.esp32-c3.yaml b/tests/components/sn74hc165/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.esp32-c3.yaml rename to tests/components/sn74hc165/test.esp32-c3-ard.yaml diff --git a/tests/components/sn74hc165/test.esp8266.yaml b/tests/components/sn74hc165/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.esp8266.yaml rename to tests/components/sn74hc165/test.esp8266-ard.yaml diff --git a/tests/components/sn74hc165/test.rp2040.yaml b/tests/components/sn74hc165/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.rp2040.yaml rename to tests/components/sn74hc165/test.rp2040-ard.yaml diff --git a/tests/components/sn74hc595/test.esp32.yaml b/tests/components/sn74hc595/test.esp32-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.esp32.yaml rename to tests/components/sn74hc595/test.esp32-ard.yaml diff --git a/tests/components/sn74hc595/test.esp32-c3.yaml b/tests/components/sn74hc595/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.esp32-c3.yaml rename to tests/components/sn74hc595/test.esp32-c3-ard.yaml diff --git a/tests/components/sn74hc595/test.esp8266.yaml b/tests/components/sn74hc595/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.esp8266.yaml rename to tests/components/sn74hc595/test.esp8266-ard.yaml diff --git a/tests/components/sn74hc595/test.rp2040.yaml b/tests/components/sn74hc595/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.rp2040.yaml rename to tests/components/sn74hc595/test.rp2040-ard.yaml diff --git a/tests/components/sntp/test.bk72xx.yaml b/tests/components/sntp/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/sntp/test.bk72xx.yaml rename to tests/components/sntp/test.bk72xx-ard.yaml diff --git a/tests/components/sntp/test.esp32-c3.yaml b/tests/components/sntp/test.esp32-ard.yaml similarity index 100% rename from tests/components/sntp/test.esp32-c3.yaml rename to tests/components/sntp/test.esp32-ard.yaml diff --git a/tests/components/sntp/test.esp32.yaml b/tests/components/sntp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sntp/test.esp32.yaml rename to tests/components/sntp/test.esp32-c3-ard.yaml diff --git a/tests/components/sntp/test.esp8266.yaml b/tests/components/sntp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sntp/test.esp8266.yaml rename to tests/components/sntp/test.esp8266-ard.yaml diff --git a/tests/components/sntp/test.rp2040.yaml b/tests/components/sntp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sntp/test.rp2040.yaml rename to tests/components/sntp/test.rp2040-ard.yaml diff --git a/tests/components/sonoff_d1/test.esp32.yaml b/tests/components/sonoff_d1/test.esp32-ard.yaml similarity index 100% rename from tests/components/sonoff_d1/test.esp32.yaml rename to tests/components/sonoff_d1/test.esp32-ard.yaml diff --git a/tests/components/sonoff_d1/test.esp8266.yaml b/tests/components/sonoff_d1/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sonoff_d1/test.esp8266.yaml rename to tests/components/sonoff_d1/test.esp8266-ard.yaml diff --git a/tests/components/speaker/test.esp32.yaml b/tests/components/speaker/test.esp32-ard.yaml similarity index 100% rename from tests/components/speaker/test.esp32.yaml rename to tests/components/speaker/test.esp32-ard.yaml diff --git a/tests/components/speaker/test.esp32-c3.yaml b/tests/components/speaker/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/speaker/test.esp32-c3.yaml rename to tests/components/speaker/test.esp32-c3-ard.yaml diff --git a/tests/components/speed/test.esp32.yaml b/tests/components/speed/test.esp32-ard.yaml similarity index 100% rename from tests/components/speed/test.esp32.yaml rename to tests/components/speed/test.esp32-ard.yaml diff --git a/tests/components/speed/test.esp32-c3.yaml b/tests/components/speed/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/speed/test.esp32-c3.yaml rename to tests/components/speed/test.esp32-c3-ard.yaml diff --git a/tests/components/speed/test.esp8266.yaml b/tests/components/speed/test.esp8266-ard.yaml similarity index 100% rename from tests/components/speed/test.esp8266.yaml rename to tests/components/speed/test.esp8266-ard.yaml diff --git a/tests/components/speed/test.rp2040.yaml b/tests/components/speed/test.rp2040-ard.yaml similarity index 100% rename from tests/components/speed/test.rp2040.yaml rename to tests/components/speed/test.rp2040-ard.yaml diff --git a/tests/components/spi/test.esp32.yaml b/tests/components/spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/spi/test.esp32.yaml rename to tests/components/spi/test.esp32-ard.yaml diff --git a/tests/components/spi/test.esp32-c3.yaml b/tests/components/spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/spi/test.esp32-c3.yaml rename to tests/components/spi/test.esp32-c3-ard.yaml diff --git a/tests/components/spi/test.esp8266.yaml b/tests/components/spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/spi/test.esp8266.yaml rename to tests/components/spi/test.esp8266-ard.yaml diff --git a/tests/components/spi/test.rp2040.yaml b/tests/components/spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/spi/test.rp2040.yaml rename to tests/components/spi/test.rp2040-ard.yaml diff --git a/tests/components/spi_device/test.esp32.yaml b/tests/components/spi_device/test.esp32-ard.yaml similarity index 100% rename from tests/components/spi_device/test.esp32.yaml rename to tests/components/spi_device/test.esp32-ard.yaml diff --git a/tests/components/spi_device/test.esp32-c3.yaml b/tests/components/spi_device/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/spi_device/test.esp32-c3.yaml rename to tests/components/spi_device/test.esp32-c3-ard.yaml diff --git a/tests/components/spi_device/test.esp8266.yaml b/tests/components/spi_device/test.esp8266-ard.yaml similarity index 100% rename from tests/components/spi_device/test.esp8266.yaml rename to tests/components/spi_device/test.esp8266-ard.yaml diff --git a/tests/components/spi_device/test.rp2040.yaml b/tests/components/spi_device/test.rp2040-ard.yaml similarity index 100% rename from tests/components/spi_device/test.rp2040.yaml rename to tests/components/spi_device/test.rp2040-ard.yaml diff --git a/tests/components/spi_led_strip/test.esp32.yaml b/tests/components/spi_led_strip/test.esp32-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.esp32.yaml rename to tests/components/spi_led_strip/test.esp32-ard.yaml diff --git a/tests/components/spi_led_strip/test.esp32-c3.yaml b/tests/components/spi_led_strip/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.esp32-c3.yaml rename to tests/components/spi_led_strip/test.esp32-c3-ard.yaml diff --git a/tests/components/spi_led_strip/test.esp8266.yaml b/tests/components/spi_led_strip/test.esp8266-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.esp8266.yaml rename to tests/components/spi_led_strip/test.esp8266-ard.yaml diff --git a/tests/components/spi_led_strip/test.rp2040.yaml b/tests/components/spi_led_strip/test.rp2040-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.rp2040.yaml rename to tests/components/spi_led_strip/test.rp2040-ard.yaml diff --git a/tests/components/sprinkler/test.esp32-c3.yaml b/tests/components/sprinkler/test.esp32-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.esp32-c3.yaml rename to tests/components/sprinkler/test.esp32-ard.yaml diff --git a/tests/components/sprinkler/test.esp32.yaml b/tests/components/sprinkler/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.esp32.yaml rename to tests/components/sprinkler/test.esp32-c3-ard.yaml diff --git a/tests/components/sprinkler/test.esp8266.yaml b/tests/components/sprinkler/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.esp8266.yaml rename to tests/components/sprinkler/test.esp8266-ard.yaml diff --git a/tests/components/sprinkler/test.rp2040.yaml b/tests/components/sprinkler/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.rp2040.yaml rename to tests/components/sprinkler/test.rp2040-ard.yaml diff --git a/tests/components/sps30/test.esp32.yaml b/tests/components/sps30/test.esp32-ard.yaml similarity index 100% rename from tests/components/sps30/test.esp32.yaml rename to tests/components/sps30/test.esp32-ard.yaml diff --git a/tests/components/sps30/test.esp32-c3.yaml b/tests/components/sps30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sps30/test.esp32-c3.yaml rename to tests/components/sps30/test.esp32-c3-ard.yaml diff --git a/tests/components/sps30/test.esp8266.yaml b/tests/components/sps30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sps30/test.esp8266.yaml rename to tests/components/sps30/test.esp8266-ard.yaml diff --git a/tests/components/sps30/test.rp2040.yaml b/tests/components/sps30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sps30/test.rp2040.yaml rename to tests/components/sps30/test.rp2040-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.esp32.yaml b/tests/components/ssd1306_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.esp32.yaml rename to tests/components/ssd1306_i2c/test.esp32-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.esp32-c3.yaml b/tests/components/ssd1306_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.esp32-c3.yaml rename to tests/components/ssd1306_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.esp8266.yaml b/tests/components/ssd1306_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.esp8266.yaml rename to tests/components/ssd1306_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.rp2040.yaml b/tests/components/ssd1306_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.rp2040.yaml rename to tests/components/ssd1306_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ssd1306_spi/test.esp32.yaml b/tests/components/ssd1306_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.esp32.yaml rename to tests/components/ssd1306_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1306_spi/test.esp32-c3.yaml b/tests/components/ssd1306_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.esp32-c3.yaml rename to tests/components/ssd1306_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1306_spi/test.esp8266.yaml b/tests/components/ssd1306_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.esp8266.yaml rename to tests/components/ssd1306_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1306_spi/test.rp2040.yaml b/tests/components/ssd1306_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.rp2040.yaml rename to tests/components/ssd1306_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1322_spi/test.esp32.yaml b/tests/components/ssd1322_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.esp32.yaml rename to tests/components/ssd1322_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1322_spi/test.esp32-c3.yaml b/tests/components/ssd1322_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.esp32-c3.yaml rename to tests/components/ssd1322_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1322_spi/test.esp8266.yaml b/tests/components/ssd1322_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.esp8266.yaml rename to tests/components/ssd1322_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1322_spi/test.rp2040.yaml b/tests/components/ssd1322_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.rp2040.yaml rename to tests/components/ssd1322_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1325_spi/test.esp32.yaml b/tests/components/ssd1325_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.esp32.yaml rename to tests/components/ssd1325_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1325_spi/test.esp32-c3.yaml b/tests/components/ssd1325_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.esp32-c3.yaml rename to tests/components/ssd1325_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1325_spi/test.esp8266.yaml b/tests/components/ssd1325_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.esp8266.yaml rename to tests/components/ssd1325_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1325_spi/test.rp2040.yaml b/tests/components/ssd1325_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.rp2040.yaml rename to tests/components/ssd1325_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.esp32.yaml b/tests/components/ssd1327_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.esp32.yaml rename to tests/components/ssd1327_i2c/test.esp32-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.esp32-c3.yaml b/tests/components/ssd1327_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.esp32-c3.yaml rename to tests/components/ssd1327_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.esp8266.yaml b/tests/components/ssd1327_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.esp8266.yaml rename to tests/components/ssd1327_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.rp2040.yaml b/tests/components/ssd1327_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.rp2040.yaml rename to tests/components/ssd1327_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ssd1327_spi/test.esp32.yaml b/tests/components/ssd1327_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.esp32.yaml rename to tests/components/ssd1327_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1327_spi/test.esp32-c3.yaml b/tests/components/ssd1327_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.esp32-c3.yaml rename to tests/components/ssd1327_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1327_spi/test.esp8266.yaml b/tests/components/ssd1327_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.esp8266.yaml rename to tests/components/ssd1327_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1327_spi/test.rp2040.yaml b/tests/components/ssd1327_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.rp2040.yaml rename to tests/components/ssd1327_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1331_spi/test.esp32.yaml b/tests/components/ssd1331_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.esp32.yaml rename to tests/components/ssd1331_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1331_spi/test.esp32-c3.yaml b/tests/components/ssd1331_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.esp32-c3.yaml rename to tests/components/ssd1331_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1331_spi/test.esp8266.yaml b/tests/components/ssd1331_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.esp8266.yaml rename to tests/components/ssd1331_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1331_spi/test.rp2040.yaml b/tests/components/ssd1331_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.rp2040.yaml rename to tests/components/ssd1331_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1351_spi/test.esp32.yaml b/tests/components/ssd1351_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.esp32.yaml rename to tests/components/ssd1351_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1351_spi/test.esp32-c3.yaml b/tests/components/ssd1351_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.esp32-c3.yaml rename to tests/components/ssd1351_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1351_spi/test.esp8266.yaml b/tests/components/ssd1351_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.esp8266.yaml rename to tests/components/ssd1351_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1351_spi/test.rp2040.yaml b/tests/components/ssd1351_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.rp2040.yaml rename to tests/components/ssd1351_spi/test.rp2040-ard.yaml diff --git a/tests/components/st7567_i2c/test.esp32.yaml b/tests/components/st7567_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.esp32.yaml rename to tests/components/st7567_i2c/test.esp32-ard.yaml diff --git a/tests/components/st7567_i2c/test.esp32-c3.yaml b/tests/components/st7567_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.esp32-c3.yaml rename to tests/components/st7567_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/st7567_i2c/test.esp8266.yaml b/tests/components/st7567_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.esp8266.yaml rename to tests/components/st7567_i2c/test.esp8266-ard.yaml diff --git a/tests/components/st7567_i2c/test.rp2040.yaml b/tests/components/st7567_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.rp2040.yaml rename to tests/components/st7567_i2c/test.rp2040-ard.yaml diff --git a/tests/components/st7567_spi/test.esp32.yaml b/tests/components/st7567_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.esp32.yaml rename to tests/components/st7567_spi/test.esp32-ard.yaml diff --git a/tests/components/st7567_spi/test.esp32-c3.yaml b/tests/components/st7567_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.esp32-c3.yaml rename to tests/components/st7567_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/st7567_spi/test.esp8266.yaml b/tests/components/st7567_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.esp8266.yaml rename to tests/components/st7567_spi/test.esp8266-ard.yaml diff --git a/tests/components/st7567_spi/test.rp2040.yaml b/tests/components/st7567_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.rp2040.yaml rename to tests/components/st7567_spi/test.rp2040-ard.yaml diff --git a/tests/components/st7735/test.esp32.yaml b/tests/components/st7735/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7735/test.esp32.yaml rename to tests/components/st7735/test.esp32-ard.yaml diff --git a/tests/components/st7735/test.esp32-c3.yaml b/tests/components/st7735/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7735/test.esp32-c3.yaml rename to tests/components/st7735/test.esp32-c3-ard.yaml diff --git a/tests/components/st7735/test.esp8266.yaml b/tests/components/st7735/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7735/test.esp8266.yaml rename to tests/components/st7735/test.esp8266-ard.yaml diff --git a/tests/components/st7735/test.rp2040.yaml b/tests/components/st7735/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7735/test.rp2040.yaml rename to tests/components/st7735/test.rp2040-ard.yaml diff --git a/tests/components/st7789v/test.esp32.yaml b/tests/components/st7789v/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7789v/test.esp32.yaml rename to tests/components/st7789v/test.esp32-ard.yaml diff --git a/tests/components/st7789v/test.esp32-c3.yaml b/tests/components/st7789v/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7789v/test.esp32-c3.yaml rename to tests/components/st7789v/test.esp32-c3-ard.yaml diff --git a/tests/components/st7789v/test.esp8266.yaml b/tests/components/st7789v/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7789v/test.esp8266.yaml rename to tests/components/st7789v/test.esp8266-ard.yaml diff --git a/tests/components/st7789v/test.rp2040.yaml b/tests/components/st7789v/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7789v/test.rp2040.yaml rename to tests/components/st7789v/test.rp2040-ard.yaml diff --git a/tests/components/st7920/test.esp32.yaml b/tests/components/st7920/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7920/test.esp32.yaml rename to tests/components/st7920/test.esp32-ard.yaml diff --git a/tests/components/st7920/test.esp32-c3.yaml b/tests/components/st7920/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7920/test.esp32-c3.yaml rename to tests/components/st7920/test.esp32-c3-ard.yaml diff --git a/tests/components/st7920/test.esp8266.yaml b/tests/components/st7920/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7920/test.esp8266.yaml rename to tests/components/st7920/test.esp8266-ard.yaml diff --git a/tests/components/st7920/test.rp2040.yaml b/tests/components/st7920/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7920/test.rp2040.yaml rename to tests/components/st7920/test.rp2040-ard.yaml diff --git a/tests/components/status/test.esp32-c3.yaml b/tests/components/status/test.esp32-ard.yaml similarity index 100% rename from tests/components/status/test.esp32-c3.yaml rename to tests/components/status/test.esp32-ard.yaml diff --git a/tests/components/status/test.esp32.yaml b/tests/components/status/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/status/test.esp32.yaml rename to tests/components/status/test.esp32-c3-ard.yaml diff --git a/tests/components/status/test.esp8266.yaml b/tests/components/status/test.esp8266-ard.yaml similarity index 100% rename from tests/components/status/test.esp8266.yaml rename to tests/components/status/test.esp8266-ard.yaml diff --git a/tests/components/status/test.rp2040.yaml b/tests/components/status/test.rp2040-ard.yaml similarity index 100% rename from tests/components/status/test.rp2040.yaml rename to tests/components/status/test.rp2040-ard.yaml diff --git a/tests/components/status_led/test.esp32-c3.yaml b/tests/components/status_led/test.esp32-ard.yaml similarity index 100% rename from tests/components/status_led/test.esp32-c3.yaml rename to tests/components/status_led/test.esp32-ard.yaml diff --git a/tests/components/status_led/test.esp32.yaml b/tests/components/status_led/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/status_led/test.esp32.yaml rename to tests/components/status_led/test.esp32-c3-ard.yaml diff --git a/tests/components/status_led/test.esp8266.yaml b/tests/components/status_led/test.esp8266-ard.yaml similarity index 100% rename from tests/components/status_led/test.esp8266.yaml rename to tests/components/status_led/test.esp8266-ard.yaml diff --git a/tests/components/status_led/test.rp2040.yaml b/tests/components/status_led/test.rp2040-ard.yaml similarity index 100% rename from tests/components/status_led/test.rp2040.yaml rename to tests/components/status_led/test.rp2040-ard.yaml diff --git a/tests/components/stepper/test.esp32-c3.yaml b/tests/components/stepper/test.esp32-ard.yaml similarity index 100% rename from tests/components/stepper/test.esp32-c3.yaml rename to tests/components/stepper/test.esp32-ard.yaml diff --git a/tests/components/stepper/test.esp32.yaml b/tests/components/stepper/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/stepper/test.esp32.yaml rename to tests/components/stepper/test.esp32-c3-ard.yaml diff --git a/tests/components/stepper/test.esp8266.yaml b/tests/components/stepper/test.esp8266-ard.yaml similarity index 100% rename from tests/components/stepper/test.esp8266.yaml rename to tests/components/stepper/test.esp8266-ard.yaml diff --git a/tests/components/stepper/test.rp2040.yaml b/tests/components/stepper/test.rp2040-ard.yaml similarity index 100% rename from tests/components/stepper/test.rp2040.yaml rename to tests/components/stepper/test.rp2040-ard.yaml diff --git a/tests/components/sts3x/test.esp32.yaml b/tests/components/sts3x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sts3x/test.esp32.yaml rename to tests/components/sts3x/test.esp32-ard.yaml diff --git a/tests/components/sts3x/test.esp32-c3.yaml b/tests/components/sts3x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sts3x/test.esp32-c3.yaml rename to tests/components/sts3x/test.esp32-c3-ard.yaml diff --git a/tests/components/sts3x/test.esp8266.yaml b/tests/components/sts3x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sts3x/test.esp8266.yaml rename to tests/components/sts3x/test.esp8266-ard.yaml diff --git a/tests/components/sts3x/test.rp2040.yaml b/tests/components/sts3x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sts3x/test.rp2040.yaml rename to tests/components/sts3x/test.rp2040-ard.yaml diff --git a/tests/components/sun/test.esp32-c3.yaml b/tests/components/sun/test.esp32-ard.yaml similarity index 100% rename from tests/components/sun/test.esp32-c3.yaml rename to tests/components/sun/test.esp32-ard.yaml diff --git a/tests/components/sun/test.esp32.yaml b/tests/components/sun/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sun/test.esp32.yaml rename to tests/components/sun/test.esp32-c3-ard.yaml diff --git a/tests/components/sun/test.esp8266.yaml b/tests/components/sun/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sun/test.esp8266.yaml rename to tests/components/sun/test.esp8266-ard.yaml diff --git a/tests/components/sun/test.rp2040.yaml b/tests/components/sun/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sun/test.rp2040.yaml rename to tests/components/sun/test.rp2040-ard.yaml diff --git a/tests/components/sun_gtil2/test.esp32.yaml b/tests/components/sun_gtil2/test.esp32-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.esp32.yaml rename to tests/components/sun_gtil2/test.esp32-ard.yaml diff --git a/tests/components/sun_gtil2/test.esp32-c3.yaml b/tests/components/sun_gtil2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.esp32-c3.yaml rename to tests/components/sun_gtil2/test.esp32-c3-ard.yaml diff --git a/tests/components/sun_gtil2/test.esp8266.yaml b/tests/components/sun_gtil2/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.esp8266.yaml rename to tests/components/sun_gtil2/test.esp8266-ard.yaml diff --git a/tests/components/sun_gtil2/test.rp2040.yaml b/tests/components/sun_gtil2/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.rp2040.yaml rename to tests/components/sun_gtil2/test.rp2040-ard.yaml diff --git a/tests/components/sx1509/test.esp32.yaml b/tests/components/sx1509/test.esp32-ard.yaml similarity index 100% rename from tests/components/sx1509/test.esp32.yaml rename to tests/components/sx1509/test.esp32-ard.yaml diff --git a/tests/components/sx1509/test.esp32-c3.yaml b/tests/components/sx1509/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sx1509/test.esp32-c3.yaml rename to tests/components/sx1509/test.esp32-c3-ard.yaml diff --git a/tests/components/sx1509/test.esp8266.yaml b/tests/components/sx1509/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sx1509/test.esp8266.yaml rename to tests/components/sx1509/test.esp8266-ard.yaml diff --git a/tests/components/sx1509/test.rp2040.yaml b/tests/components/sx1509/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sx1509/test.rp2040.yaml rename to tests/components/sx1509/test.rp2040-ard.yaml diff --git a/tests/components/t6615/test.esp32.yaml b/tests/components/t6615/test.esp32-ard.yaml similarity index 100% rename from tests/components/t6615/test.esp32.yaml rename to tests/components/t6615/test.esp32-ard.yaml diff --git a/tests/components/t6615/test.esp32-c3.yaml b/tests/components/t6615/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/t6615/test.esp32-c3.yaml rename to tests/components/t6615/test.esp32-c3-ard.yaml diff --git a/tests/components/t6615/test.esp8266.yaml b/tests/components/t6615/test.esp8266-ard.yaml similarity index 100% rename from tests/components/t6615/test.esp8266.yaml rename to tests/components/t6615/test.esp8266-ard.yaml diff --git a/tests/components/t6615/test.rp2040.yaml b/tests/components/t6615/test.rp2040-ard.yaml similarity index 100% rename from tests/components/t6615/test.rp2040.yaml rename to tests/components/t6615/test.rp2040-ard.yaml diff --git a/tests/components/tca9548a/test.esp32.yaml b/tests/components/tca9548a/test.esp32-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.esp32.yaml rename to tests/components/tca9548a/test.esp32-ard.yaml diff --git a/tests/components/tca9548a/test.esp32-c3.yaml b/tests/components/tca9548a/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.esp32-c3.yaml rename to tests/components/tca9548a/test.esp32-c3-ard.yaml diff --git a/tests/components/tca9548a/test.esp8266.yaml b/tests/components/tca9548a/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.esp8266.yaml rename to tests/components/tca9548a/test.esp8266-ard.yaml diff --git a/tests/components/tca9548a/test.rp2040.yaml b/tests/components/tca9548a/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.rp2040.yaml rename to tests/components/tca9548a/test.rp2040-ard.yaml diff --git a/tests/components/tcl112/test.esp32-c3.yaml b/tests/components/tcl112/test.esp32-ard.yaml similarity index 100% rename from tests/components/tcl112/test.esp32-c3.yaml rename to tests/components/tcl112/test.esp32-ard.yaml diff --git a/tests/components/tcl112/test.esp32.yaml b/tests/components/tcl112/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tcl112/test.esp32.yaml rename to tests/components/tcl112/test.esp32-c3-ard.yaml diff --git a/tests/components/tcl112/test.esp8266.yaml b/tests/components/tcl112/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tcl112/test.esp8266.yaml rename to tests/components/tcl112/test.esp8266-ard.yaml diff --git a/tests/components/tcs34725/test.esp32.yaml b/tests/components/tcs34725/test.esp32-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.esp32.yaml rename to tests/components/tcs34725/test.esp32-ard.yaml diff --git a/tests/components/tcs34725/test.esp32-c3.yaml b/tests/components/tcs34725/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.esp32-c3.yaml rename to tests/components/tcs34725/test.esp32-c3-ard.yaml diff --git a/tests/components/tcs34725/test.esp8266.yaml b/tests/components/tcs34725/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.esp8266.yaml rename to tests/components/tcs34725/test.esp8266-ard.yaml diff --git a/tests/components/tcs34725/test.rp2040.yaml b/tests/components/tcs34725/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.rp2040.yaml rename to tests/components/tcs34725/test.rp2040-ard.yaml diff --git a/tests/components/tee501/test.esp32.yaml b/tests/components/tee501/test.esp32-ard.yaml similarity index 100% rename from tests/components/tee501/test.esp32.yaml rename to tests/components/tee501/test.esp32-ard.yaml diff --git a/tests/components/tee501/test.esp32-c3.yaml b/tests/components/tee501/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tee501/test.esp32-c3.yaml rename to tests/components/tee501/test.esp32-c3-ard.yaml diff --git a/tests/components/tee501/test.esp8266.yaml b/tests/components/tee501/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tee501/test.esp8266.yaml rename to tests/components/tee501/test.esp8266-ard.yaml diff --git a/tests/components/tee501/test.rp2040.yaml b/tests/components/tee501/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tee501/test.rp2040.yaml rename to tests/components/tee501/test.rp2040-ard.yaml diff --git a/tests/components/teleinfo/test.esp32.yaml b/tests/components/teleinfo/test.esp32-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.esp32.yaml rename to tests/components/teleinfo/test.esp32-ard.yaml diff --git a/tests/components/teleinfo/test.esp32-c3.yaml b/tests/components/teleinfo/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.esp32-c3.yaml rename to tests/components/teleinfo/test.esp32-c3-ard.yaml diff --git a/tests/components/teleinfo/test.esp8266.yaml b/tests/components/teleinfo/test.esp8266-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.esp8266.yaml rename to tests/components/teleinfo/test.esp8266-ard.yaml diff --git a/tests/components/teleinfo/test.rp2040.yaml b/tests/components/teleinfo/test.rp2040-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.rp2040.yaml rename to tests/components/teleinfo/test.rp2040-ard.yaml diff --git a/tests/components/template/test.bk72xx.yaml b/tests/components/template/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/template/test.bk72xx.yaml rename to tests/components/template/test.bk72xx-ard.yaml diff --git a/tests/components/template/test.esp32-c3.yaml b/tests/components/template/test.esp32-ard.yaml similarity index 100% rename from tests/components/template/test.esp32-c3.yaml rename to tests/components/template/test.esp32-ard.yaml diff --git a/tests/components/template/test.esp32.yaml b/tests/components/template/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/template/test.esp32.yaml rename to tests/components/template/test.esp32-c3-ard.yaml diff --git a/tests/components/template/test.esp8266.yaml b/tests/components/template/test.esp8266-ard.yaml similarity index 100% rename from tests/components/template/test.esp8266.yaml rename to tests/components/template/test.esp8266-ard.yaml diff --git a/tests/components/template/test.rp2040.yaml b/tests/components/template/test.rp2040-ard.yaml similarity index 100% rename from tests/components/template/test.rp2040.yaml rename to tests/components/template/test.rp2040-ard.yaml diff --git a/tests/components/thermostat/test.esp32-c3.yaml b/tests/components/thermostat/test.esp32-ard.yaml similarity index 100% rename from tests/components/thermostat/test.esp32-c3.yaml rename to tests/components/thermostat/test.esp32-ard.yaml diff --git a/tests/components/thermostat/test.esp32.yaml b/tests/components/thermostat/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/thermostat/test.esp32.yaml rename to tests/components/thermostat/test.esp32-c3-ard.yaml diff --git a/tests/components/thermostat/test.esp8266.yaml b/tests/components/thermostat/test.esp8266-ard.yaml similarity index 100% rename from tests/components/thermostat/test.esp8266.yaml rename to tests/components/thermostat/test.esp8266-ard.yaml diff --git a/tests/components/thermostat/test.rp2040.yaml b/tests/components/thermostat/test.rp2040-ard.yaml similarity index 100% rename from tests/components/thermostat/test.rp2040.yaml rename to tests/components/thermostat/test.rp2040-ard.yaml diff --git a/tests/components/time/test.esp32-c3.yaml b/tests/components/time/test.esp32-ard.yaml similarity index 100% rename from tests/components/time/test.esp32-c3.yaml rename to tests/components/time/test.esp32-ard.yaml diff --git a/tests/components/time/test.esp32.yaml b/tests/components/time/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/time/test.esp32.yaml rename to tests/components/time/test.esp32-c3-ard.yaml diff --git a/tests/components/time/test.esp8266.yaml b/tests/components/time/test.esp8266-ard.yaml similarity index 100% rename from tests/components/time/test.esp8266.yaml rename to tests/components/time/test.esp8266-ard.yaml diff --git a/tests/components/time/test.rp2040.yaml b/tests/components/time/test.rp2040-ard.yaml similarity index 100% rename from tests/components/time/test.rp2040.yaml rename to tests/components/time/test.rp2040-ard.yaml diff --git a/tests/components/time_based/test.esp32-c3.yaml b/tests/components/time_based/test.esp32-ard.yaml similarity index 100% rename from tests/components/time_based/test.esp32-c3.yaml rename to tests/components/time_based/test.esp32-ard.yaml diff --git a/tests/components/time_based/test.esp32.yaml b/tests/components/time_based/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/time_based/test.esp32.yaml rename to tests/components/time_based/test.esp32-c3-ard.yaml diff --git a/tests/components/time_based/test.esp8266.yaml b/tests/components/time_based/test.esp8266-ard.yaml similarity index 100% rename from tests/components/time_based/test.esp8266.yaml rename to tests/components/time_based/test.esp8266-ard.yaml diff --git a/tests/components/time_based/test.rp2040.yaml b/tests/components/time_based/test.rp2040-ard.yaml similarity index 100% rename from tests/components/time_based/test.rp2040.yaml rename to tests/components/time_based/test.rp2040-ard.yaml diff --git a/tests/components/tlc59208f/test.esp32.yaml b/tests/components/tlc59208f/test.esp32-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.esp32.yaml rename to tests/components/tlc59208f/test.esp32-ard.yaml diff --git a/tests/components/tlc59208f/test.esp32-c3.yaml b/tests/components/tlc59208f/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.esp32-c3.yaml rename to tests/components/tlc59208f/test.esp32-c3-ard.yaml diff --git a/tests/components/tlc59208f/test.esp8266.yaml b/tests/components/tlc59208f/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.esp8266.yaml rename to tests/components/tlc59208f/test.esp8266-ard.yaml diff --git a/tests/components/tlc59208f/test.rp2040.yaml b/tests/components/tlc59208f/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.rp2040.yaml rename to tests/components/tlc59208f/test.rp2040-ard.yaml diff --git a/tests/components/tlc5947/test.esp32.yaml b/tests/components/tlc5947/test.esp32-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.esp32.yaml rename to tests/components/tlc5947/test.esp32-ard.yaml diff --git a/tests/components/tlc5947/test.esp32-c3.yaml b/tests/components/tlc5947/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.esp32-c3.yaml rename to tests/components/tlc5947/test.esp32-c3-ard.yaml diff --git a/tests/components/tlc5947/test.esp8266.yaml b/tests/components/tlc5947/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.esp8266.yaml rename to tests/components/tlc5947/test.esp8266-ard.yaml diff --git a/tests/components/tlc5947/test.rp2040.yaml b/tests/components/tlc5947/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.rp2040.yaml rename to tests/components/tlc5947/test.rp2040-ard.yaml diff --git a/tests/components/tlc5971/test.esp32.yaml b/tests/components/tlc5971/test.esp32-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp32.yaml rename to tests/components/tlc5971/test.esp32-ard.yaml diff --git a/tests/components/tlc5971/test.esp32-c3.yaml b/tests/components/tlc5971/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp32-c3.yaml rename to tests/components/tlc5971/test.esp32-c3-ard.yaml diff --git a/tests/components/tlc5971/test.esp32-s2.yaml b/tests/components/tlc5971/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp32-s2.yaml rename to tests/components/tlc5971/test.esp32-s2-ard.yaml diff --git a/tests/components/tlc5971/test.esp8266.yaml b/tests/components/tlc5971/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp8266.yaml rename to tests/components/tlc5971/test.esp8266-ard.yaml diff --git a/tests/components/tlc5971/test.rp2040.yaml b/tests/components/tlc5971/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.rp2040.yaml rename to tests/components/tlc5971/test.rp2040-ard.yaml diff --git a/tests/components/tm1621/test.esp32.yaml b/tests/components/tm1621/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1621/test.esp32.yaml rename to tests/components/tm1621/test.esp32-ard.yaml diff --git a/tests/components/tm1621/test.esp32-c3.yaml b/tests/components/tm1621/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1621/test.esp32-c3.yaml rename to tests/components/tm1621/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1621/test.esp8266.yaml b/tests/components/tm1621/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1621/test.esp8266.yaml rename to tests/components/tm1621/test.esp8266-ard.yaml diff --git a/tests/components/tm1621/test.rp2040.yaml b/tests/components/tm1621/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1621/test.rp2040.yaml rename to tests/components/tm1621/test.rp2040-ard.yaml diff --git a/tests/components/tm1637/test.esp32.yaml b/tests/components/tm1637/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1637/test.esp32.yaml rename to tests/components/tm1637/test.esp32-ard.yaml diff --git a/tests/components/tm1637/test.esp32-c3.yaml b/tests/components/tm1637/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1637/test.esp32-c3.yaml rename to tests/components/tm1637/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1637/test.esp8266.yaml b/tests/components/tm1637/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1637/test.esp8266.yaml rename to tests/components/tm1637/test.esp8266-ard.yaml diff --git a/tests/components/tm1637/test.rp2040.yaml b/tests/components/tm1637/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1637/test.rp2040.yaml rename to tests/components/tm1637/test.rp2040-ard.yaml diff --git a/tests/components/tm1638/test.esp32-c3.yaml b/tests/components/tm1638/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1638/test.esp32-c3.yaml rename to tests/components/tm1638/test.esp32-ard.yaml diff --git a/tests/components/tm1638/test.esp32.yaml b/tests/components/tm1638/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1638/test.esp32.yaml rename to tests/components/tm1638/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1638/test.esp8266.yaml b/tests/components/tm1638/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1638/test.esp8266.yaml rename to tests/components/tm1638/test.esp8266-ard.yaml diff --git a/tests/components/tm1638/test.rp2040.yaml b/tests/components/tm1638/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1638/test.rp2040.yaml rename to tests/components/tm1638/test.rp2040-ard.yaml diff --git a/tests/components/tm1651/test.esp32-c3.yaml b/tests/components/tm1651/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1651/test.esp32-c3.yaml rename to tests/components/tm1651/test.esp32-ard.yaml diff --git a/tests/components/tm1651/test.esp32.yaml b/tests/components/tm1651/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1651/test.esp32.yaml rename to tests/components/tm1651/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1651/test.esp8266.yaml b/tests/components/tm1651/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1651/test.esp8266.yaml rename to tests/components/tm1651/test.esp8266-ard.yaml diff --git a/tests/components/tm1651/test.rp2040.yaml b/tests/components/tm1651/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1651/test.rp2040.yaml rename to tests/components/tm1651/test.rp2040-ard.yaml diff --git a/tests/components/tmp102/test.esp32.yaml b/tests/components/tmp102/test.esp32-ard.yaml similarity index 100% rename from tests/components/tmp102/test.esp32.yaml rename to tests/components/tmp102/test.esp32-ard.yaml diff --git a/tests/components/tmp102/test.esp32-c3.yaml b/tests/components/tmp102/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tmp102/test.esp32-c3.yaml rename to tests/components/tmp102/test.esp32-c3-ard.yaml diff --git a/tests/components/tmp102/test.esp8266.yaml b/tests/components/tmp102/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tmp102/test.esp8266.yaml rename to tests/components/tmp102/test.esp8266-ard.yaml diff --git a/tests/components/tmp102/test.rp2040.yaml b/tests/components/tmp102/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tmp102/test.rp2040.yaml rename to tests/components/tmp102/test.rp2040-ard.yaml diff --git a/tests/components/tmp1075/test.esp32.yaml b/tests/components/tmp1075/test.esp32-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.esp32.yaml rename to tests/components/tmp1075/test.esp32-ard.yaml diff --git a/tests/components/tmp1075/test.esp32-c3.yaml b/tests/components/tmp1075/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.esp32-c3.yaml rename to tests/components/tmp1075/test.esp32-c3-ard.yaml diff --git a/tests/components/tmp1075/test.esp8266.yaml b/tests/components/tmp1075/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.esp8266.yaml rename to tests/components/tmp1075/test.esp8266-ard.yaml diff --git a/tests/components/tmp1075/test.rp2040.yaml b/tests/components/tmp1075/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.rp2040.yaml rename to tests/components/tmp1075/test.rp2040-ard.yaml diff --git a/tests/components/tmp117/test.esp32.yaml b/tests/components/tmp117/test.esp32-ard.yaml similarity index 100% rename from tests/components/tmp117/test.esp32.yaml rename to tests/components/tmp117/test.esp32-ard.yaml diff --git a/tests/components/tmp117/test.esp32-c3.yaml b/tests/components/tmp117/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tmp117/test.esp32-c3.yaml rename to tests/components/tmp117/test.esp32-c3-ard.yaml diff --git a/tests/components/tmp117/test.esp8266.yaml b/tests/components/tmp117/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tmp117/test.esp8266.yaml rename to tests/components/tmp117/test.esp8266-ard.yaml diff --git a/tests/components/tmp117/test.rp2040.yaml b/tests/components/tmp117/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tmp117/test.rp2040.yaml rename to tests/components/tmp117/test.rp2040-ard.yaml diff --git a/tests/components/tof10120/test.esp32.yaml b/tests/components/tof10120/test.esp32-ard.yaml similarity index 100% rename from tests/components/tof10120/test.esp32.yaml rename to tests/components/tof10120/test.esp32-ard.yaml diff --git a/tests/components/tof10120/test.esp32-c3.yaml b/tests/components/tof10120/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tof10120/test.esp32-c3.yaml rename to tests/components/tof10120/test.esp32-c3-ard.yaml diff --git a/tests/components/tof10120/test.esp8266.yaml b/tests/components/tof10120/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tof10120/test.esp8266.yaml rename to tests/components/tof10120/test.esp8266-ard.yaml diff --git a/tests/components/tof10120/test.rp2040.yaml b/tests/components/tof10120/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tof10120/test.rp2040.yaml rename to tests/components/tof10120/test.rp2040-ard.yaml diff --git a/tests/components/toshiba/test.esp32-c3.yaml b/tests/components/toshiba/test.esp32-ard.yaml similarity index 100% rename from tests/components/toshiba/test.esp32-c3.yaml rename to tests/components/toshiba/test.esp32-ard.yaml diff --git a/tests/components/toshiba/test.esp32.yaml b/tests/components/toshiba/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/toshiba/test.esp32.yaml rename to tests/components/toshiba/test.esp32-c3-ard.yaml diff --git a/tests/components/toshiba/test.esp8266.yaml b/tests/components/toshiba/test.esp8266-ard.yaml similarity index 100% rename from tests/components/toshiba/test.esp8266.yaml rename to tests/components/toshiba/test.esp8266-ard.yaml diff --git a/tests/components/total_daily_energy/test.esp32.yaml b/tests/components/total_daily_energy/test.esp32-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.esp32.yaml rename to tests/components/total_daily_energy/test.esp32-ard.yaml diff --git a/tests/components/total_daily_energy/test.esp32-c3.yaml b/tests/components/total_daily_energy/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.esp32-c3.yaml rename to tests/components/total_daily_energy/test.esp32-c3-ard.yaml diff --git a/tests/components/total_daily_energy/test.esp8266.yaml b/tests/components/total_daily_energy/test.esp8266-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.esp8266.yaml rename to tests/components/total_daily_energy/test.esp8266-ard.yaml diff --git a/tests/components/total_daily_energy/test.rp2040.yaml b/tests/components/total_daily_energy/test.rp2040-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.rp2040.yaml rename to tests/components/total_daily_energy/test.rp2040-ard.yaml diff --git a/tests/components/tsl2561/test.esp32.yaml b/tests/components/tsl2561/test.esp32-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.esp32.yaml rename to tests/components/tsl2561/test.esp32-ard.yaml diff --git a/tests/components/tsl2561/test.esp32-c3.yaml b/tests/components/tsl2561/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.esp32-c3.yaml rename to tests/components/tsl2561/test.esp32-c3-ard.yaml diff --git a/tests/components/tsl2561/test.esp8266.yaml b/tests/components/tsl2561/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.esp8266.yaml rename to tests/components/tsl2561/test.esp8266-ard.yaml diff --git a/tests/components/tsl2561/test.rp2040.yaml b/tests/components/tsl2561/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.rp2040.yaml rename to tests/components/tsl2561/test.rp2040-ard.yaml diff --git a/tests/components/tsl2591/test.esp32.yaml b/tests/components/tsl2591/test.esp32-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.esp32.yaml rename to tests/components/tsl2591/test.esp32-ard.yaml diff --git a/tests/components/tsl2591/test.esp32-c3.yaml b/tests/components/tsl2591/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.esp32-c3.yaml rename to tests/components/tsl2591/test.esp32-c3-ard.yaml diff --git a/tests/components/tsl2591/test.esp8266.yaml b/tests/components/tsl2591/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.esp8266.yaml rename to tests/components/tsl2591/test.esp8266-ard.yaml diff --git a/tests/components/tsl2591/test.rp2040.yaml b/tests/components/tsl2591/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.rp2040.yaml rename to tests/components/tsl2591/test.rp2040-ard.yaml diff --git a/tests/components/tt21100/test.esp32.yaml b/tests/components/tt21100/test.esp32-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp32.yaml rename to tests/components/tt21100/test.esp32-ard.yaml diff --git a/tests/components/tt21100/test.esp32-c3.yaml b/tests/components/tt21100/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp32-c3.yaml rename to tests/components/tt21100/test.esp32-c3-ard.yaml diff --git a/tests/components/tt21100/test.esp32-s2.yaml b/tests/components/tt21100/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp32-s2.yaml rename to tests/components/tt21100/test.esp32-s2-ard.yaml diff --git a/tests/components/tt21100/test.esp8266.yaml b/tests/components/tt21100/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp8266.yaml rename to tests/components/tt21100/test.esp8266-ard.yaml diff --git a/tests/components/tt21100/test.rp2040.yaml b/tests/components/tt21100/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tt21100/test.rp2040.yaml rename to tests/components/tt21100/test.rp2040-ard.yaml diff --git a/tests/components/ttp229_bsf/test.esp32.yaml b/tests/components/ttp229_bsf/test.esp32-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.esp32.yaml rename to tests/components/ttp229_bsf/test.esp32-ard.yaml diff --git a/tests/components/ttp229_bsf/test.esp32-c3.yaml b/tests/components/ttp229_bsf/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.esp32-c3.yaml rename to tests/components/ttp229_bsf/test.esp32-c3-ard.yaml diff --git a/tests/components/ttp229_bsf/test.esp8266.yaml b/tests/components/ttp229_bsf/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.esp8266.yaml rename to tests/components/ttp229_bsf/test.esp8266-ard.yaml diff --git a/tests/components/ttp229_bsf/test.rp2040.yaml b/tests/components/ttp229_bsf/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.rp2040.yaml rename to tests/components/ttp229_bsf/test.rp2040-ard.yaml diff --git a/tests/components/ttp229_lsf/test.esp32.yaml b/tests/components/ttp229_lsf/test.esp32-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.esp32.yaml rename to tests/components/ttp229_lsf/test.esp32-ard.yaml diff --git a/tests/components/ttp229_lsf/test.esp32-c3.yaml b/tests/components/ttp229_lsf/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.esp32-c3.yaml rename to tests/components/ttp229_lsf/test.esp32-c3-ard.yaml diff --git a/tests/components/ttp229_lsf/test.esp8266.yaml b/tests/components/ttp229_lsf/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.esp8266.yaml rename to tests/components/ttp229_lsf/test.esp8266-ard.yaml diff --git a/tests/components/ttp229_lsf/test.rp2040.yaml b/tests/components/ttp229_lsf/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.rp2040.yaml rename to tests/components/ttp229_lsf/test.rp2040-ard.yaml diff --git a/tests/components/tuya/test.esp32.yaml b/tests/components/tuya/test.esp32-ard.yaml similarity index 100% rename from tests/components/tuya/test.esp32.yaml rename to tests/components/tuya/test.esp32-ard.yaml diff --git a/tests/components/tuya/test.esp32-c3.yaml b/tests/components/tuya/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tuya/test.esp32-c3.yaml rename to tests/components/tuya/test.esp32-c3-ard.yaml diff --git a/tests/components/tuya/test.esp8266.yaml b/tests/components/tuya/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tuya/test.esp8266.yaml rename to tests/components/tuya/test.esp8266-ard.yaml diff --git a/tests/components/tuya/test.rp2040.yaml b/tests/components/tuya/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tuya/test.rp2040.yaml rename to tests/components/tuya/test.rp2040-ard.yaml diff --git a/tests/components/tx20/test.esp32-c3.yaml b/tests/components/tx20/test.esp32-ard.yaml similarity index 100% rename from tests/components/tx20/test.esp32-c3.yaml rename to tests/components/tx20/test.esp32-ard.yaml diff --git a/tests/components/tx20/test.esp32.yaml b/tests/components/tx20/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tx20/test.esp32.yaml rename to tests/components/tx20/test.esp32-c3-ard.yaml diff --git a/tests/components/tx20/test.esp8266.yaml b/tests/components/tx20/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tx20/test.esp8266.yaml rename to tests/components/tx20/test.esp8266-ard.yaml diff --git a/tests/components/tx20/test.rp2040.yaml b/tests/components/tx20/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tx20/test.rp2040.yaml rename to tests/components/tx20/test.rp2040-ard.yaml diff --git a/tests/components/uart/test.esp32.yaml b/tests/components/uart/test.esp32-ard.yaml similarity index 100% rename from tests/components/uart/test.esp32.yaml rename to tests/components/uart/test.esp32-ard.yaml diff --git a/tests/components/uart/test.esp32-c3.yaml b/tests/components/uart/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uart/test.esp32-c3.yaml rename to tests/components/uart/test.esp32-c3-ard.yaml diff --git a/tests/components/uart/test.esp8266.yaml b/tests/components/uart/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uart/test.esp8266.yaml rename to tests/components/uart/test.esp8266-ard.yaml diff --git a/tests/components/uart/test.rp2040.yaml b/tests/components/uart/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uart/test.rp2040.yaml rename to tests/components/uart/test.rp2040-ard.yaml diff --git a/tests/components/ufire_ec/test.esp32.yaml b/tests/components/ufire_ec/test.esp32-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.esp32.yaml rename to tests/components/ufire_ec/test.esp32-ard.yaml diff --git a/tests/components/ufire_ec/test.esp32-c3.yaml b/tests/components/ufire_ec/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.esp32-c3.yaml rename to tests/components/ufire_ec/test.esp32-c3-ard.yaml diff --git a/tests/components/ufire_ec/test.esp8266.yaml b/tests/components/ufire_ec/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.esp8266.yaml rename to tests/components/ufire_ec/test.esp8266-ard.yaml diff --git a/tests/components/ufire_ec/test.rp2040.yaml b/tests/components/ufire_ec/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.rp2040.yaml rename to tests/components/ufire_ec/test.rp2040-ard.yaml diff --git a/tests/components/ufire_ise/test.esp32.yaml b/tests/components/ufire_ise/test.esp32-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.esp32.yaml rename to tests/components/ufire_ise/test.esp32-ard.yaml diff --git a/tests/components/ufire_ise/test.esp32-c3.yaml b/tests/components/ufire_ise/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.esp32-c3.yaml rename to tests/components/ufire_ise/test.esp32-c3-ard.yaml diff --git a/tests/components/ufire_ise/test.esp8266.yaml b/tests/components/ufire_ise/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.esp8266.yaml rename to tests/components/ufire_ise/test.esp8266-ard.yaml diff --git a/tests/components/ufire_ise/test.rp2040.yaml b/tests/components/ufire_ise/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.rp2040.yaml rename to tests/components/ufire_ise/test.rp2040-ard.yaml diff --git a/tests/components/uln2003/test.esp32.yaml b/tests/components/uln2003/test.esp32-ard.yaml similarity index 100% rename from tests/components/uln2003/test.esp32.yaml rename to tests/components/uln2003/test.esp32-ard.yaml diff --git a/tests/components/uln2003/test.esp32-c3.yaml b/tests/components/uln2003/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uln2003/test.esp32-c3.yaml rename to tests/components/uln2003/test.esp32-c3-ard.yaml diff --git a/tests/components/uln2003/test.esp8266.yaml b/tests/components/uln2003/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uln2003/test.esp8266.yaml rename to tests/components/uln2003/test.esp8266-ard.yaml diff --git a/tests/components/uln2003/test.rp2040.yaml b/tests/components/uln2003/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uln2003/test.rp2040.yaml rename to tests/components/uln2003/test.rp2040-ard.yaml diff --git a/tests/components/ultrasonic/test.esp32-c3.yaml b/tests/components/ultrasonic/test.esp32-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.esp32-c3.yaml rename to tests/components/ultrasonic/test.esp32-ard.yaml diff --git a/tests/components/ultrasonic/test.esp32.yaml b/tests/components/ultrasonic/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.esp32.yaml rename to tests/components/ultrasonic/test.esp32-c3-ard.yaml diff --git a/tests/components/ultrasonic/test.esp8266.yaml b/tests/components/ultrasonic/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.esp8266.yaml rename to tests/components/ultrasonic/test.esp8266-ard.yaml diff --git a/tests/components/ultrasonic/test.rp2040.yaml b/tests/components/ultrasonic/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.rp2040.yaml rename to tests/components/ultrasonic/test.rp2040-ard.yaml diff --git a/tests/components/update/test.esp8266.yaml b/tests/components/update/test.esp8266-ard.yaml similarity index 100% rename from tests/components/update/test.esp8266.yaml rename to tests/components/update/test.esp8266-ard.yaml diff --git a/tests/components/update/test.rp2040.yaml b/tests/components/update/test.rp2040-ard.yaml similarity index 100% rename from tests/components/update/test.rp2040.yaml rename to tests/components/update/test.rp2040-ard.yaml diff --git a/tests/components/uponor_smatrix/test.esp32.yaml b/tests/components/uponor_smatrix/test.esp32-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.esp32.yaml rename to tests/components/uponor_smatrix/test.esp32-ard.yaml diff --git a/tests/components/uponor_smatrix/test.esp32-c3.yaml b/tests/components/uponor_smatrix/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.esp32-c3.yaml rename to tests/components/uponor_smatrix/test.esp32-c3-ard.yaml diff --git a/tests/components/uponor_smatrix/test.esp8266.yaml b/tests/components/uponor_smatrix/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.esp8266.yaml rename to tests/components/uponor_smatrix/test.esp8266-ard.yaml diff --git a/tests/components/uponor_smatrix/test.rp2040.yaml b/tests/components/uponor_smatrix/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.rp2040.yaml rename to tests/components/uponor_smatrix/test.rp2040-ard.yaml diff --git a/tests/components/uptime/test.esp32-c3.yaml b/tests/components/uptime/test.esp32-ard.yaml similarity index 100% rename from tests/components/uptime/test.esp32-c3.yaml rename to tests/components/uptime/test.esp32-ard.yaml diff --git a/tests/components/uptime/test.esp32.yaml b/tests/components/uptime/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uptime/test.esp32.yaml rename to tests/components/uptime/test.esp32-c3-ard.yaml diff --git a/tests/components/uptime/test.esp8266.yaml b/tests/components/uptime/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uptime/test.esp8266.yaml rename to tests/components/uptime/test.esp8266-ard.yaml diff --git a/tests/components/uptime/test.rp2040.yaml b/tests/components/uptime/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uptime/test.rp2040.yaml rename to tests/components/uptime/test.rp2040-ard.yaml diff --git a/tests/components/vbus/test.esp32.yaml b/tests/components/vbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/vbus/test.esp32.yaml rename to tests/components/vbus/test.esp32-ard.yaml diff --git a/tests/components/vbus/test.esp32-c3.yaml b/tests/components/vbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/vbus/test.esp32-c3.yaml rename to tests/components/vbus/test.esp32-c3-ard.yaml diff --git a/tests/components/vbus/test.esp8266.yaml b/tests/components/vbus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/vbus/test.esp8266.yaml rename to tests/components/vbus/test.esp8266-ard.yaml diff --git a/tests/components/vbus/test.rp2040.yaml b/tests/components/vbus/test.rp2040-ard.yaml similarity index 100% rename from tests/components/vbus/test.rp2040.yaml rename to tests/components/vbus/test.rp2040-ard.yaml diff --git a/tests/components/veml3235/test.esp32.yaml b/tests/components/veml3235/test.esp32-ard.yaml similarity index 100% rename from tests/components/veml3235/test.esp32.yaml rename to tests/components/veml3235/test.esp32-ard.yaml diff --git a/tests/components/veml3235/test.esp32-c3.yaml b/tests/components/veml3235/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/veml3235/test.esp32-c3.yaml rename to tests/components/veml3235/test.esp32-c3-ard.yaml diff --git a/tests/components/veml3235/test.esp8266.yaml b/tests/components/veml3235/test.esp8266-ard.yaml similarity index 100% rename from tests/components/veml3235/test.esp8266.yaml rename to tests/components/veml3235/test.esp8266-ard.yaml diff --git a/tests/components/veml3235/test.rp2040.yaml b/tests/components/veml3235/test.rp2040-ard.yaml similarity index 100% rename from tests/components/veml3235/test.rp2040.yaml rename to tests/components/veml3235/test.rp2040-ard.yaml diff --git a/tests/components/veml7700/test.esp32.yaml b/tests/components/veml7700/test.esp32-ard.yaml similarity index 100% rename from tests/components/veml7700/test.esp32.yaml rename to tests/components/veml7700/test.esp32-ard.yaml diff --git a/tests/components/veml7700/test.esp32-c3.yaml b/tests/components/veml7700/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/veml7700/test.esp32-c3.yaml rename to tests/components/veml7700/test.esp32-c3-ard.yaml diff --git a/tests/components/veml7700/test.esp8266.yaml b/tests/components/veml7700/test.esp8266-ard.yaml similarity index 100% rename from tests/components/veml7700/test.esp8266.yaml rename to tests/components/veml7700/test.esp8266-ard.yaml diff --git a/tests/components/veml7700/test.rp2040.yaml b/tests/components/veml7700/test.rp2040-ard.yaml similarity index 100% rename from tests/components/veml7700/test.rp2040.yaml rename to tests/components/veml7700/test.rp2040-ard.yaml diff --git a/tests/components/version/test.esp32-c3.yaml b/tests/components/version/test.esp32-ard.yaml similarity index 100% rename from tests/components/version/test.esp32-c3.yaml rename to tests/components/version/test.esp32-ard.yaml diff --git a/tests/components/version/test.esp32.yaml b/tests/components/version/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/version/test.esp32.yaml rename to tests/components/version/test.esp32-c3-ard.yaml diff --git a/tests/components/version/test.esp8266.yaml b/tests/components/version/test.esp8266-ard.yaml similarity index 100% rename from tests/components/version/test.esp8266.yaml rename to tests/components/version/test.esp8266-ard.yaml diff --git a/tests/components/version/test.rp2040.yaml b/tests/components/version/test.rp2040-ard.yaml similarity index 100% rename from tests/components/version/test.rp2040.yaml rename to tests/components/version/test.rp2040-ard.yaml diff --git a/tests/components/vl53l0x/test.esp32.yaml b/tests/components/vl53l0x/test.esp32-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.esp32.yaml rename to tests/components/vl53l0x/test.esp32-ard.yaml diff --git a/tests/components/vl53l0x/test.esp32-c3.yaml b/tests/components/vl53l0x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.esp32-c3.yaml rename to tests/components/vl53l0x/test.esp32-c3-ard.yaml diff --git a/tests/components/vl53l0x/test.esp8266.yaml b/tests/components/vl53l0x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.esp8266.yaml rename to tests/components/vl53l0x/test.esp8266-ard.yaml diff --git a/tests/components/vl53l0x/test.rp2040.yaml b/tests/components/vl53l0x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.rp2040.yaml rename to tests/components/vl53l0x/test.rp2040-ard.yaml diff --git a/tests/components/voice_assistant/test.esp32.yaml b/tests/components/voice_assistant/test.esp32-ard.yaml similarity index 100% rename from tests/components/voice_assistant/test.esp32.yaml rename to tests/components/voice_assistant/test.esp32-ard.yaml diff --git a/tests/components/voice_assistant/test.esp32-c3.yaml b/tests/components/voice_assistant/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/voice_assistant/test.esp32-c3.yaml rename to tests/components/voice_assistant/test.esp32-c3-ard.yaml diff --git a/tests/components/wake_on_lan/test.esp32-c3.yaml b/tests/components/wake_on_lan/test.esp32-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.esp32-c3.yaml rename to tests/components/wake_on_lan/test.esp32-ard.yaml diff --git a/tests/components/wake_on_lan/test.esp32.yaml b/tests/components/wake_on_lan/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.esp32.yaml rename to tests/components/wake_on_lan/test.esp32-c3-ard.yaml diff --git a/tests/components/wake_on_lan/test.esp8266.yaml b/tests/components/wake_on_lan/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.esp8266.yaml rename to tests/components/wake_on_lan/test.esp8266-ard.yaml diff --git a/tests/components/wake_on_lan/test.rp2040.yaml b/tests/components/wake_on_lan/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.rp2040.yaml rename to tests/components/wake_on_lan/test.rp2040-ard.yaml diff --git a/tests/components/waveshare_epaper/test.esp32.yaml b/tests/components/waveshare_epaper/test.esp32-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.esp32.yaml rename to tests/components/waveshare_epaper/test.esp32-ard.yaml diff --git a/tests/components/waveshare_epaper/test.esp32-c3.yaml b/tests/components/waveshare_epaper/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.esp32-c3.yaml rename to tests/components/waveshare_epaper/test.esp32-c3-ard.yaml diff --git a/tests/components/waveshare_epaper/test.esp8266.yaml b/tests/components/waveshare_epaper/test.esp8266-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.esp8266.yaml rename to tests/components/waveshare_epaper/test.esp8266-ard.yaml diff --git a/tests/components/waveshare_epaper/test.rp2040.yaml b/tests/components/waveshare_epaper/test.rp2040-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.rp2040.yaml rename to tests/components/waveshare_epaper/test.rp2040-ard.yaml diff --git a/tests/components/web_server/test.esp32-c3.yaml b/tests/components/web_server/test.esp32-ard.yaml similarity index 100% rename from tests/components/web_server/test.esp32-c3.yaml rename to tests/components/web_server/test.esp32-ard.yaml diff --git a/tests/components/web_server/test.esp32.yaml b/tests/components/web_server/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/web_server/test.esp32.yaml rename to tests/components/web_server/test.esp32-c3-ard.yaml diff --git a/tests/components/web_server/test.esp8266.yaml b/tests/components/web_server/test.esp8266-ard.yaml similarity index 100% rename from tests/components/web_server/test.esp8266.yaml rename to tests/components/web_server/test.esp8266-ard.yaml diff --git a/tests/components/whirlpool/test.esp32-c3.yaml b/tests/components/whirlpool/test.esp32-ard.yaml similarity index 100% rename from tests/components/whirlpool/test.esp32-c3.yaml rename to tests/components/whirlpool/test.esp32-ard.yaml diff --git a/tests/components/whirlpool/test.esp32.yaml b/tests/components/whirlpool/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/whirlpool/test.esp32.yaml rename to tests/components/whirlpool/test.esp32-c3-ard.yaml diff --git a/tests/components/whirlpool/test.esp8266.yaml b/tests/components/whirlpool/test.esp8266-ard.yaml similarity index 100% rename from tests/components/whirlpool/test.esp8266.yaml rename to tests/components/whirlpool/test.esp8266-ard.yaml diff --git a/tests/components/whynter/test.esp32-c3.yaml b/tests/components/whynter/test.esp32-ard.yaml similarity index 100% rename from tests/components/whynter/test.esp32-c3.yaml rename to tests/components/whynter/test.esp32-ard.yaml diff --git a/tests/components/whynter/test.esp32.yaml b/tests/components/whynter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/whynter/test.esp32.yaml rename to tests/components/whynter/test.esp32-c3-ard.yaml diff --git a/tests/components/whynter/test.esp8266.yaml b/tests/components/whynter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/whynter/test.esp8266.yaml rename to tests/components/whynter/test.esp8266-ard.yaml diff --git a/tests/components/wiegand/test.esp32-c3.yaml b/tests/components/wiegand/test.esp32-ard.yaml similarity index 100% rename from tests/components/wiegand/test.esp32-c3.yaml rename to tests/components/wiegand/test.esp32-ard.yaml diff --git a/tests/components/wiegand/test.esp32.yaml b/tests/components/wiegand/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wiegand/test.esp32.yaml rename to tests/components/wiegand/test.esp32-c3-ard.yaml diff --git a/tests/components/wiegand/test.esp8266.yaml b/tests/components/wiegand/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wiegand/test.esp8266.yaml rename to tests/components/wiegand/test.esp8266-ard.yaml diff --git a/tests/components/wiegand/test.rp2040.yaml b/tests/components/wiegand/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wiegand/test.rp2040.yaml rename to tests/components/wiegand/test.rp2040-ard.yaml diff --git a/tests/components/wifi/test.esp32-c3.yaml b/tests/components/wifi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wifi/test.esp32-c3.yaml rename to tests/components/wifi/test.esp32-ard.yaml diff --git a/tests/components/wifi/test.esp32.yaml b/tests/components/wifi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wifi/test.esp32.yaml rename to tests/components/wifi/test.esp32-c3-ard.yaml diff --git a/tests/components/wifi/test.esp8266.yaml b/tests/components/wifi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wifi/test.esp8266.yaml rename to tests/components/wifi/test.esp8266-ard.yaml diff --git a/tests/components/wifi/test.rp2040.yaml b/tests/components/wifi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wifi/test.rp2040.yaml rename to tests/components/wifi/test.rp2040-ard.yaml diff --git a/tests/components/wifi_info/test.esp32-c3.yaml b/tests/components/wifi_info/test.esp32-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.esp32-c3.yaml rename to tests/components/wifi_info/test.esp32-ard.yaml diff --git a/tests/components/wifi_info/test.esp32.yaml b/tests/components/wifi_info/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.esp32.yaml rename to tests/components/wifi_info/test.esp32-c3-ard.yaml diff --git a/tests/components/wifi_info/test.esp8266.yaml b/tests/components/wifi_info/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.esp8266.yaml rename to tests/components/wifi_info/test.esp8266-ard.yaml diff --git a/tests/components/wifi_info/test.rp2040.yaml b/tests/components/wifi_info/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.rp2040.yaml rename to tests/components/wifi_info/test.rp2040-ard.yaml diff --git a/tests/components/wifi_signal/test.esp32-c3.yaml b/tests/components/wifi_signal/test.esp32-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.esp32-c3.yaml rename to tests/components/wifi_signal/test.esp32-ard.yaml diff --git a/tests/components/wifi_signal/test.esp32.yaml b/tests/components/wifi_signal/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.esp32.yaml rename to tests/components/wifi_signal/test.esp32-c3-ard.yaml diff --git a/tests/components/wifi_signal/test.esp8266.yaml b/tests/components/wifi_signal/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.esp8266.yaml rename to tests/components/wifi_signal/test.esp8266-ard.yaml diff --git a/tests/components/wifi_signal/test.rp2040.yaml b/tests/components/wifi_signal/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.rp2040.yaml rename to tests/components/wifi_signal/test.rp2040-ard.yaml diff --git a/tests/components/wireguard/test.bk72xx.yaml b/tests/components/wireguard/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/wireguard/test.bk72xx.yaml rename to tests/components/wireguard/test.bk72xx-ard.yaml diff --git a/tests/components/wireguard/test.esp32.yaml b/tests/components/wireguard/test.esp32-ard.yaml similarity index 100% rename from tests/components/wireguard/test.esp32.yaml rename to tests/components/wireguard/test.esp32-ard.yaml diff --git a/tests/components/wireguard/test.esp32-c3.yaml b/tests/components/wireguard/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wireguard/test.esp32-c3.yaml rename to tests/components/wireguard/test.esp32-c3-ard.yaml diff --git a/tests/components/wireguard/test.esp8266.yaml b/tests/components/wireguard/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wireguard/test.esp8266.yaml rename to tests/components/wireguard/test.esp8266-ard.yaml diff --git a/tests/components/wk2132_i2c/test.esp32.yaml b/tests/components/wk2132_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2132_i2c/test.esp32.yaml rename to tests/components/wk2132_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2132_i2c/test.esp32-s3.yaml b/tests/components/wk2132_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2132_i2c/test.esp32-s3.yaml rename to tests/components/wk2132_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2132_spi/test.esp32.yaml b/tests/components/wk2132_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2132_spi/test.esp32.yaml rename to tests/components/wk2132_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2132_spi/test.esp32-s3.yaml b/tests/components/wk2132_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2132_spi/test.esp32-s3.yaml rename to tests/components/wk2132_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2168_i2c/test.esp32.yaml b/tests/components/wk2168_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2168_i2c/test.esp32.yaml rename to tests/components/wk2168_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2168_i2c/test.esp32-s3.yaml b/tests/components/wk2168_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2168_i2c/test.esp32-s3.yaml rename to tests/components/wk2168_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2168_spi/test.esp32.yaml b/tests/components/wk2168_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2168_spi/test.esp32.yaml rename to tests/components/wk2168_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2168_spi/test.esp32-s3.yaml b/tests/components/wk2168_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2168_spi/test.esp32-s3.yaml rename to tests/components/wk2168_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2204_i2c/test.esp32.yaml b/tests/components/wk2204_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2204_i2c/test.esp32.yaml rename to tests/components/wk2204_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2204_i2c/test.esp32-s3.yaml b/tests/components/wk2204_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2204_i2c/test.esp32-s3.yaml rename to tests/components/wk2204_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2204_spi/test.esp32.yaml b/tests/components/wk2204_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2204_spi/test.esp32.yaml rename to tests/components/wk2204_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2204_spi/test.esp32-s3.yaml b/tests/components/wk2204_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2204_spi/test.esp32-s3.yaml rename to tests/components/wk2204_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2212_i2c/test.esp32.yaml b/tests/components/wk2212_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2212_i2c/test.esp32.yaml rename to tests/components/wk2212_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2212_i2c/test.esp32-s3.yaml b/tests/components/wk2212_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2212_i2c/test.esp32-s3.yaml rename to tests/components/wk2212_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2212_spi/test.esp32.yaml b/tests/components/wk2212_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2212_spi/test.esp32.yaml rename to tests/components/wk2212_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2212_spi/test.esp32-s3.yaml b/tests/components/wk2212_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2212_spi/test.esp32-s3.yaml rename to tests/components/wk2212_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wl_134/test.esp32.yaml b/tests/components/wl_134/test.esp32-ard.yaml similarity index 100% rename from tests/components/wl_134/test.esp32.yaml rename to tests/components/wl_134/test.esp32-ard.yaml diff --git a/tests/components/wl_134/test.esp32-c3.yaml b/tests/components/wl_134/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wl_134/test.esp32-c3.yaml rename to tests/components/wl_134/test.esp32-c3-ard.yaml diff --git a/tests/components/wl_134/test.esp8266.yaml b/tests/components/wl_134/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wl_134/test.esp8266.yaml rename to tests/components/wl_134/test.esp8266-ard.yaml diff --git a/tests/components/wl_134/test.rp2040.yaml b/tests/components/wl_134/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wl_134/test.rp2040.yaml rename to tests/components/wl_134/test.rp2040-ard.yaml diff --git a/tests/components/wled/test.esp32-c3.yaml b/tests/components/wled/test.esp32-ard.yaml similarity index 100% rename from tests/components/wled/test.esp32-c3.yaml rename to tests/components/wled/test.esp32-ard.yaml diff --git a/tests/components/wled/test.esp32.yaml b/tests/components/wled/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wled/test.esp32.yaml rename to tests/components/wled/test.esp32-c3-ard.yaml diff --git a/tests/components/wled/test.esp8266.yaml b/tests/components/wled/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wled/test.esp8266.yaml rename to tests/components/wled/test.esp8266-ard.yaml diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32-ard.yaml similarity index 100% rename from tests/components/x9c/test.esp32.yaml rename to tests/components/x9c/test.esp32-ard.yaml diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/x9c/test.esp32-c3.yaml rename to tests/components/x9c/test.esp32-c3-ard.yaml diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/x9c/test.esp8266.yaml rename to tests/components/x9c/test.esp8266-ard.yaml diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/x9c/test.rp2040.yaml rename to tests/components/x9c/test.rp2040-ard.yaml diff --git a/tests/components/xgzp68xx/test.esp32.yaml b/tests/components/xgzp68xx/test.esp32-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.esp32.yaml rename to tests/components/xgzp68xx/test.esp32-ard.yaml diff --git a/tests/components/xgzp68xx/test.esp32-c3.yaml b/tests/components/xgzp68xx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.esp32-c3.yaml rename to tests/components/xgzp68xx/test.esp32-c3-ard.yaml diff --git a/tests/components/xgzp68xx/test.esp8266.yaml b/tests/components/xgzp68xx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.esp8266.yaml rename to tests/components/xgzp68xx/test.esp8266-ard.yaml diff --git a/tests/components/xgzp68xx/test.rp2040.yaml b/tests/components/xgzp68xx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.rp2040.yaml rename to tests/components/xgzp68xx/test.rp2040-ard.yaml diff --git a/tests/components/xiaomi_ble/test.esp32-c3.yaml b/tests/components/xiaomi_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_ble/test.esp32-c3.yaml rename to tests/components/xiaomi_ble/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_ble/test.esp32.yaml b/tests/components/xiaomi_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_ble/test.esp32.yaml rename to tests/components/xiaomi_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgd1/test.esp32-c3.yaml b/tests/components/xiaomi_cgd1/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgd1/test.esp32-c3.yaml rename to tests/components/xiaomi_cgd1/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgd1/test.esp32.yaml b/tests/components/xiaomi_cgd1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgd1/test.esp32.yaml rename to tests/components/xiaomi_cgd1/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgdk2/test.esp32-c3.yaml b/tests/components/xiaomi_cgdk2/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgdk2/test.esp32-c3.yaml rename to tests/components/xiaomi_cgdk2/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgdk2/test.esp32.yaml b/tests/components/xiaomi_cgdk2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgdk2/test.esp32.yaml rename to tests/components/xiaomi_cgdk2/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgg1/test.esp32-c3.yaml b/tests/components/xiaomi_cgg1/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgg1/test.esp32-c3.yaml rename to tests/components/xiaomi_cgg1/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgg1/test.esp32.yaml b/tests/components/xiaomi_cgg1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgg1/test.esp32.yaml rename to tests/components/xiaomi_cgg1/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgpr1/test.esp32-c3.yaml b/tests/components/xiaomi_cgpr1/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgpr1/test.esp32-c3.yaml rename to tests/components/xiaomi_cgpr1/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgpr1/test.esp32.yaml b/tests/components/xiaomi_cgpr1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgpr1/test.esp32.yaml rename to tests/components/xiaomi_cgpr1/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_gcls002/test.esp32-c3.yaml b/tests/components/xiaomi_gcls002/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_gcls002/test.esp32-c3.yaml rename to tests/components/xiaomi_gcls002/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_gcls002/test.esp32.yaml b/tests/components/xiaomi_gcls002/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_gcls002/test.esp32.yaml rename to tests/components/xiaomi_gcls002/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_hhccjcy01/test.esp32-c3.yaml b/tests/components/xiaomi_hhccjcy01/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccjcy01/test.esp32-c3.yaml rename to tests/components/xiaomi_hhccjcy01/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_hhccjcy01/test.esp32.yaml b/tests/components/xiaomi_hhccjcy01/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccjcy01/test.esp32.yaml rename to tests/components/xiaomi_hhccjcy01/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_hhccpot002/test.esp32-c3.yaml b/tests/components/xiaomi_hhccpot002/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccpot002/test.esp32-c3.yaml rename to tests/components/xiaomi_hhccpot002/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_hhccpot002/test.esp32.yaml b/tests/components/xiaomi_hhccpot002/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccpot002/test.esp32.yaml rename to tests/components/xiaomi_hhccpot002/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_jqjcy01ym/test.esp32-c3.yaml b/tests/components/xiaomi_jqjcy01ym/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_jqjcy01ym/test.esp32-c3.yaml rename to tests/components/xiaomi_jqjcy01ym/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_jqjcy01ym/test.esp32.yaml b/tests/components/xiaomi_jqjcy01ym/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_jqjcy01ym/test.esp32.yaml rename to tests/components/xiaomi_jqjcy01ym/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_lywsd02/test.esp32-c3.yaml b/tests/components/xiaomi_lywsd02/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd02/test.esp32-c3.yaml rename to tests/components/xiaomi_lywsd02/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_lywsd02/test.esp32.yaml b/tests/components/xiaomi_lywsd02/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd02/test.esp32.yaml rename to tests/components/xiaomi_lywsd02/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_lywsd03mmc/test.esp32-c3.yaml b/tests/components/xiaomi_lywsd03mmc/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd03mmc/test.esp32-c3.yaml rename to tests/components/xiaomi_lywsd03mmc/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_lywsd03mmc/test.esp32.yaml b/tests/components/xiaomi_lywsd03mmc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd03mmc/test.esp32.yaml rename to tests/components/xiaomi_lywsd03mmc/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_lywsdcgq/test.esp32-c3.yaml b/tests/components/xiaomi_lywsdcgq/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsdcgq/test.esp32-c3.yaml rename to tests/components/xiaomi_lywsdcgq/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_lywsdcgq/test.esp32.yaml b/tests/components/xiaomi_lywsdcgq/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsdcgq/test.esp32.yaml rename to tests/components/xiaomi_lywsdcgq/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mhoc303/test.esp32-c3.yaml b/tests/components/xiaomi_mhoc303/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc303/test.esp32-c3.yaml rename to tests/components/xiaomi_mhoc303/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mhoc303/test.esp32.yaml b/tests/components/xiaomi_mhoc303/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc303/test.esp32.yaml rename to tests/components/xiaomi_mhoc303/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mhoc401/test.esp32-c3.yaml b/tests/components/xiaomi_mhoc401/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc401/test.esp32-c3.yaml rename to tests/components/xiaomi_mhoc401/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mhoc401/test.esp32.yaml b/tests/components/xiaomi_mhoc401/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc401/test.esp32.yaml rename to tests/components/xiaomi_mhoc401/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_miscale copy/test.esp32-c3.yaml b/tests/components/xiaomi_miscale copy/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale copy/test.esp32-c3.yaml rename to tests/components/xiaomi_miscale copy/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_miscale copy/test.esp32.yaml b/tests/components/xiaomi_miscale copy/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale copy/test.esp32.yaml rename to tests/components/xiaomi_miscale copy/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_miscale/test.esp32-c3.yaml b/tests/components/xiaomi_miscale/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale/test.esp32-c3.yaml rename to tests/components/xiaomi_miscale/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_miscale/test.esp32.yaml b/tests/components/xiaomi_miscale/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale/test.esp32.yaml rename to tests/components/xiaomi_miscale/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mjyd02yla/test.esp32-c3.yaml b/tests/components/xiaomi_mjyd02yla/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mjyd02yla/test.esp32-c3.yaml rename to tests/components/xiaomi_mjyd02yla/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mjyd02yla/test.esp32.yaml b/tests/components/xiaomi_mjyd02yla/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mjyd02yla/test.esp32.yaml rename to tests/components/xiaomi_mjyd02yla/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mue4094rt/test.esp32-c3.yaml b/tests/components/xiaomi_mue4094rt/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mue4094rt/test.esp32-c3.yaml rename to tests/components/xiaomi_mue4094rt/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mue4094rt/test.esp32.yaml b/tests/components/xiaomi_mue4094rt/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mue4094rt/test.esp32.yaml rename to tests/components/xiaomi_mue4094rt/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_rtcgq02lm/test.esp32-c3.yaml b/tests/components/xiaomi_rtcgq02lm/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_rtcgq02lm/test.esp32-c3.yaml rename to tests/components/xiaomi_rtcgq02lm/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_rtcgq02lm/test.esp32.yaml b/tests/components/xiaomi_rtcgq02lm/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_rtcgq02lm/test.esp32.yaml rename to tests/components/xiaomi_rtcgq02lm/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_wx08zm/test.esp32-c3.yaml b/tests/components/xiaomi_wx08zm/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_wx08zm/test.esp32-c3.yaml rename to tests/components/xiaomi_wx08zm/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_wx08zm/test.esp32.yaml b/tests/components/xiaomi_wx08zm/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_wx08zm/test.esp32.yaml rename to tests/components/xiaomi_wx08zm/test.esp32-c3-ard.yaml diff --git a/tests/components/xl9535/test.esp32.yaml b/tests/components/xl9535/test.esp32-ard.yaml similarity index 100% rename from tests/components/xl9535/test.esp32.yaml rename to tests/components/xl9535/test.esp32-ard.yaml diff --git a/tests/components/xl9535/test.esp32-c3.yaml b/tests/components/xl9535/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xl9535/test.esp32-c3.yaml rename to tests/components/xl9535/test.esp32-c3-ard.yaml diff --git a/tests/components/xl9535/test.esp8266.yaml b/tests/components/xl9535/test.esp8266-ard.yaml similarity index 100% rename from tests/components/xl9535/test.esp8266.yaml rename to tests/components/xl9535/test.esp8266-ard.yaml diff --git a/tests/components/xl9535/test.rp2040.yaml b/tests/components/xl9535/test.rp2040-ard.yaml similarity index 100% rename from tests/components/xl9535/test.rp2040.yaml rename to tests/components/xl9535/test.rp2040-ard.yaml diff --git a/tests/components/xpt2046/test.esp32.yaml b/tests/components/xpt2046/test.esp32-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp32.yaml rename to tests/components/xpt2046/test.esp32-ard.yaml diff --git a/tests/components/xpt2046/test.esp32-c3.yaml b/tests/components/xpt2046/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp32-c3.yaml rename to tests/components/xpt2046/test.esp32-c3-ard.yaml diff --git a/tests/components/xpt2046/test.esp32-s2.yaml b/tests/components/xpt2046/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp32-s2.yaml rename to tests/components/xpt2046/test.esp32-s2-ard.yaml diff --git a/tests/components/xpt2046/test.esp8266.yaml b/tests/components/xpt2046/test.esp8266-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp8266.yaml rename to tests/components/xpt2046/test.esp8266-ard.yaml diff --git a/tests/components/xpt2046/test.rp2040.yaml b/tests/components/xpt2046/test.rp2040-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.rp2040.yaml rename to tests/components/xpt2046/test.rp2040-ard.yaml diff --git a/tests/components/yashima/test.esp32-c3.yaml b/tests/components/yashima/test.esp32-ard.yaml similarity index 100% rename from tests/components/yashima/test.esp32-c3.yaml rename to tests/components/yashima/test.esp32-ard.yaml diff --git a/tests/components/yashima/test.esp32.yaml b/tests/components/yashima/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/yashima/test.esp32.yaml rename to tests/components/yashima/test.esp32-c3-ard.yaml diff --git a/tests/components/yashima/test.esp8266.yaml b/tests/components/yashima/test.esp8266-ard.yaml similarity index 100% rename from tests/components/yashima/test.esp8266.yaml rename to tests/components/yashima/test.esp8266-ard.yaml diff --git a/tests/components/zhlt01/test.esp32-c3.yaml b/tests/components/zhlt01/test.esp32-ard.yaml similarity index 100% rename from tests/components/zhlt01/test.esp32-c3.yaml rename to tests/components/zhlt01/test.esp32-ard.yaml diff --git a/tests/components/zhlt01/test.esp32.yaml b/tests/components/zhlt01/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/zhlt01/test.esp32.yaml rename to tests/components/zhlt01/test.esp32-c3-ard.yaml diff --git a/tests/components/zhlt01/test.esp8266.yaml b/tests/components/zhlt01/test.esp8266-ard.yaml similarity index 100% rename from tests/components/zhlt01/test.esp8266.yaml rename to tests/components/zhlt01/test.esp8266-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.esp32.yaml b/tests/components/zio_ultrasonic/test.esp32-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.esp32.yaml rename to tests/components/zio_ultrasonic/test.esp32-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.esp32-c3.yaml b/tests/components/zio_ultrasonic/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.esp32-c3.yaml rename to tests/components/zio_ultrasonic/test.esp32-c3-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.esp8266.yaml b/tests/components/zio_ultrasonic/test.esp8266-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.esp8266.yaml rename to tests/components/zio_ultrasonic/test.esp8266-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.rp2040.yaml b/tests/components/zio_ultrasonic/test.rp2040-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.rp2040.yaml rename to tests/components/zio_ultrasonic/test.rp2040-ard.yaml diff --git a/tests/components/zyaura/test.esp32.yaml b/tests/components/zyaura/test.esp32-ard.yaml similarity index 100% rename from tests/components/zyaura/test.esp32.yaml rename to tests/components/zyaura/test.esp32-ard.yaml diff --git a/tests/components/zyaura/test.esp32-c3.yaml b/tests/components/zyaura/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/zyaura/test.esp32-c3.yaml rename to tests/components/zyaura/test.esp32-c3-ard.yaml diff --git a/tests/components/zyaura/test.esp8266.yaml b/tests/components/zyaura/test.esp8266-ard.yaml similarity index 100% rename from tests/components/zyaura/test.esp8266.yaml rename to tests/components/zyaura/test.esp8266-ard.yaml diff --git a/tests/components/zyaura/test.rp2040.yaml b/tests/components/zyaura/test.rp2040-ard.yaml similarity index 100% rename from tests/components/zyaura/test.rp2040.yaml rename to tests/components/zyaura/test.rp2040-ard.yaml diff --git a/tests/test_build_components/build_components_base.bk72xx.yaml b/tests/test_build_components/build_components_base.bk72xx-ard.yaml similarity index 100% rename from tests/test_build_components/build_components_base.bk72xx.yaml rename to tests/test_build_components/build_components_base.bk72xx-ard.yaml diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml new file mode 100644 index 0000000000..08d4d8679c --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml @@ -0,0 +1,19 @@ +esphome: + name: componenttestesp32c3idf50 + friendly_name: $component_name + +esp32: + board: lolin_c3_mini + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-idf-50.yaml new file mode 100644 index 0000000000..c9f2c1e943 --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-idf-50.yaml @@ -0,0 +1,19 @@ +esphome: + name: componenttestesp32idf50 + friendly_name: $component_name + +esp32: + board: nodemcu-32s + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml new file mode 100644 index 0000000000..351f5fb019 --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml @@ -0,0 +1,20 @@ +esphome: + name: componenttestesp32s2idf50 + friendly_name: $component_name + +esp32: + board: esp32-s2-saola-1 + variant: ESP32S2 + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf.yaml index 62f0f4f7bc..484906e8df 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2ard + name: componenttestesp32s2idf friendly_name: $component_name esp32: diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml new file mode 100644 index 0000000000..c05378903f --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml @@ -0,0 +1,20 @@ +esphome: + name: componenttestesp32s3idf50 + friendly_name: $component_name + +esp32: + board: esp32s3box + variant: ESP32S3 + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf.yaml index b1d08fcdf8..ee209000e9 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3ard + name: componenttestesp32s3idf friendly_name: $component_name esp32: diff --git a/tests/test_build_components/build_components_base.esp8266.yaml b/tests/test_build_components/build_components_base.esp8266-ard.yaml similarity index 87% rename from tests/test_build_components/build_components_base.esp8266.yaml rename to tests/test_build_components/build_components_base.esp8266-ard.yaml index ecf9acd2ba..e4d6607c86 100644 --- a/tests/test_build_components/build_components_base.esp8266.yaml +++ b/tests/test_build_components/build_components_base.esp8266-ard.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp8266 + name: componenttestesp8266ard friendly_name: $component_name esp8266: diff --git a/tests/test_build_components/build_components_base.rp2040.yaml b/tests/test_build_components/build_components_base.rp2040-ard.yaml similarity index 92% rename from tests/test_build_components/build_components_base.rp2040.yaml rename to tests/test_build_components/build_components_base.rp2040-ard.yaml index 335642374b..6c6a27e0a7 100644 --- a/tests/test_build_components/build_components_base.rp2040.yaml +++ b/tests/test_build_components/build_components_base.rp2040-ard.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestrp2040 + name: componenttestrp2040ard friendly_name: $component_name rp2040: From a78b2d0128bd3a3c54fdb092d8180497cd03a8a8 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:07:43 +1200 Subject: [PATCH 066/151] [wifi] Fix some access point bugs related to esp-idf 4.4.7 (#6928) * Set dhcp server range to only 10 IPs * Change log level to errors to make it clearer * We want to stop the dhcp server, not client --- .../wifi/wifi_component_esp32_arduino.cpp | 12 ++++++------ .../components/wifi/wifi_component_esp8266.cpp | 14 +++++++------- .../components/wifi/wifi_component_esp_idf.cpp | 16 ++++++++-------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp32_arduino.cpp b/esphome/components/wifi/wifi_component_esp32_arduino.cpp index ef7a624cd5..fc954a2333 100644 --- a/esphome/components/wifi/wifi_component_esp32_arduino.cpp +++ b/esphome/components/wifi/wifi_component_esp32_arduino.cpp @@ -694,15 +694,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -712,20 +712,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index 838250972b..997457e2d2 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -716,12 +716,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { if (wifi_softap_dhcps_status() == DHCP_STARTED) { if (!wifi_softap_dhcps_stop()) { - ESP_LOGV(TAG, "Stopping DHCP server failed!"); + ESP_LOGW(TAG, "Stopping DHCP server failed!"); } } if (!wifi_set_ip_info(SOFTAP_IF, &info)) { - ESP_LOGV(TAG, "Setting SoftAP info failed!"); + ESP_LOGE(TAG, "Setting SoftAP info failed!"); return false; } @@ -735,17 +735,17 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); if (!wifi_softap_set_dhcps_lease(&lease)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease failed!"); return false; } // lease time 1440 minutes (=24 hours) if (!wifi_softap_set_dhcps_lease_time(1440)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease time failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease time failed!"); return false; } @@ -755,13 +755,13 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { uint8_t mode = 1; // bit0, 1 enables router information from ESP8266 SoftAP DHCP server. if (!wifi_softap_set_dhcps_offer_option(OFFER_ROUTER, &mode)) { - ESP_LOGV(TAG, "wifi_softap_set_dhcps_offer_option failed!"); + ESP_LOGE(TAG, "wifi_softap_set_dhcps_offer_option failed!"); return false; } #endif if (!wifi_softap_dhcps_start()) { - ESP_LOGV(TAG, "Starting SoftAP DHCPS failed!"); + ESP_LOGE(TAG, "Starting SoftAP DHCPS failed!"); return false; } diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index bc575e6a2d..c21486fee4 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -823,15 +823,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -841,20 +841,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } @@ -887,12 +887,12 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { esp_err_t err = esp_wifi_set_config(WIFI_IF_AP, &conf); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_set_config failed! %d", err); + ESP_LOGE(TAG, "esp_wifi_set_config failed! %d", err); return false; } if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) { - ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!"); + ESP_LOGE(TAG, "wifi_ap_ip_config_ failed!"); return false; } From 4c313bc1982c2eabc3ccfe54b84008323c8fc5ad Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:12:55 +1200 Subject: [PATCH 067/151] Rename legacy/modern to ota/factory (#6922) * Rename legacy/modern to ota/factory * Add modern/legacy in brackets --- esphome/components/esp32/__init__.py | 14 +++++------ esphome/components/esp32/post_build.py.script | 13 ++++++++++- .../components/esp8266/post_build.py.script | 10 +++++++- esphome/components/rp2040/__init__.py | 18 +++++++++++++-- .../components/rp2040/post_build.py.script | 23 +++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 esphome/components/rp2040/post_build.py.script diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 8f46567266..1effea708f 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -96,16 +96,16 @@ def get_board(core_obj=None): def get_download_types(storage_json): return [ { - "title": "Modern format", + "title": "Factory format (Previously Modern)", "description": "For use with ESPHome Web and other tools.", - "file": "firmware-factory.bin", - "download": f"{storage_json.name}-factory.bin", + "file": "firmware.factory.bin", + "download": f"{storage_json.name}.factory.bin", }, { - "title": "Legacy format", - "description": "For use with ESPHome Flasher.", - "file": "firmware.bin", - "download": f"{storage_json.name}.bin", + "title": "OTA format (Previously Legacy)", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] diff --git a/esphome/components/esp32/post_build.py.script b/esphome/components/esp32/post_build.py.script index c941bdb386..c181cf30b1 100644 --- a/esphome/components/esp32/post_build.py.script +++ b/esphome/components/esp32/post_build.py.script @@ -17,17 +17,19 @@ from SCons.Script import ARGUMENTS # Copy over the default sdkconfig. from os import path + if path.exists("./sdkconfig.defaults"): os.makedirs(".temp", exist_ok=True) shutil.copy("./sdkconfig.defaults", "./.temp/sdkconfig-esp32-idf") + def esp32_create_combined_bin(source, target, env): verbose = bool(int(ARGUMENTS.get("PIOVERBOSE", "0"))) if verbose: print("Generating combined binary for serial flashing") app_offset = 0x10000 - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") @@ -62,5 +64,14 @@ def esp32_create_combined_bin(source, target, env): else: subprocess.run(["esptool.py", *cmd]) + +def esp32_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa diff --git a/esphome/components/esp8266/post_build.py.script b/esphome/components/esp8266/post_build.py.script index 4dab1cbd27..0a854d7599 100644 --- a/esphome/components/esp8266/post_build.py.script +++ b/esphome/components/esp8266/post_build.py.script @@ -6,10 +6,18 @@ Import("env") # noqa def esp8266_copy_factory_bin(source, target, env): firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +def esp8266_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") shutil.copyfile(firmware_name, new_file_name) # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_factory_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_ota_bin) # noqa diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index ace455add7..f5c3b8bda2 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -47,10 +47,16 @@ def set_core_data(config): def get_download_types(storage_json): return [ { - "title": "UF2 format", + "title": "UF2 factory format", "description": "For copying to RP2040 over USB.", "file": "firmware.uf2", - "download": f"{storage_json.name}.uf2", + "download": f"{storage_json.name}.factory.uf2", + }, + { + "title": "OTA format", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] @@ -160,6 +166,8 @@ async def to_code(config): cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_define("ESPHOME_VARIANT", "RP2040") + cg.add_platformio_option("extra_scripts", ["post:post_build.py"]) + conf = config[CONF_FRAMEWORK] cg.add_platformio_option("framework", "arduino") cg.add_build_flag("-DUSE_ARDUINO") @@ -225,4 +233,10 @@ def generate_pio_files() -> bool: # Called by writer.py def copy_files() -> bool: + dir = os.path.dirname(__file__) + post_build_file = os.path.join(dir, "post_build.py.script") + copy_file_if_changed( + post_build_file, + CORE.relative_build_path("post_build.py"), + ) return generate_pio_files() diff --git a/esphome/components/rp2040/post_build.py.script b/esphome/components/rp2040/post_build.py.script new file mode 100644 index 0000000000..7dcd7e52a6 --- /dev/null +++ b/esphome/components/rp2040/post_build.py.script @@ -0,0 +1,23 @@ +import shutil + +# pylint: disable=E0602 +Import("env") # noqa + + +def rp2040_copy_factory_uf2(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.uf2") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.uf2") + + shutil.copyfile(firmware_name, new_file_name) + + +def rp2040_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +# pylint: disable=E0602 +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_factory_uf2) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_ota_bin) # noqa From 7d642147c154ad4c825f23c726ac73bcf4210f8a Mon Sep 17 00:00:00 2001 From: Faidon Liambotis Date: Tue, 18 Jun 2024 05:22:50 +0300 Subject: [PATCH 068/151] uart: allow setting the UART id in final_validate_device_schema (#6923) --- esphome/components/uart/__init__.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/esphome/components/uart/__init__.py b/esphome/components/uart/__init__.py index 088227afe5..b036288078 100644 --- a/esphome/components/uart/__init__.py +++ b/esphome/components/uart/__init__.py @@ -258,6 +258,7 @@ KEY_UART_DEVICES = "uart_devices" def final_validate_device_schema( name: str, *, + uart_bus: str = CONF_UART_ID, baud_rate: Optional[int] = None, require_tx: bool = False, require_rx: bool = False, @@ -268,7 +269,7 @@ def final_validate_device_schema( def validate_baud_rate(value): if value != baud_rate: raise cv.Invalid( - f"Component {name} requires baud rate {baud_rate} for the uart bus" + f"Component {name} requires baud rate {baud_rate} for the uart referenced by {uart_bus}" ) return value @@ -287,21 +288,21 @@ def final_validate_device_schema( def validate_data_bits(value): if value != data_bits: raise cv.Invalid( - f"Component {name} requires {data_bits} data bits for the uart bus" + f"Component {name} requires {data_bits} data bits for the uart referenced by {uart_bus}" ) return value def validate_parity(value): if value != parity: raise cv.Invalid( - f"Component {name} requires parity {parity} for the uart bus" + f"Component {name} requires parity {parity} for the uart referenced by {uart_bus}" ) return value def validate_stop_bits(value): if value != stop_bits: raise cv.Invalid( - f"Component {name} requires {stop_bits} stop bits for the uart bus" + f"Component {name} requires {stop_bits} stop bits for the uart referenced by {uart_bus}" ) return value @@ -316,14 +317,14 @@ def final_validate_device_schema( hub_schema[ cv.Required( CONF_TX_PIN, - msg=f"Component {name} requires this uart bus to declare a tx_pin", + msg=f"Component {name} requires uart referenced by {uart_bus} to declare a tx_pin", ) ] = validate_pin(CONF_TX_PIN, device) if require_rx and uart_id_type_str in NATIVE_UART_CLASSES: hub_schema[ cv.Required( CONF_RX_PIN, - msg=f"Component {name} requires this uart bus to declare a rx_pin", + msg=f"Component {name} requires uart referenced by {uart_bus} to declare a rx_pin", ) ] = validate_pin(CONF_RX_PIN, device) if baud_rate is not None: @@ -337,7 +338,7 @@ def final_validate_device_schema( return cv.Schema(hub_schema, extra=cv.ALLOW_EXTRA)(hub_config) return cv.Schema( - {cv.Required(CONF_UART_ID): fv.id_declaration_match_schema(validate_hub)}, + {cv.Required(uart_bus): fv.id_declaration_match_schema(validate_hub)}, extra=cv.ALLOW_EXTRA, ) From 5dec62bf1e464baca86d9e8cda94ca4ada2e0913 Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Mon, 17 Jun 2024 07:48:56 +0200 Subject: [PATCH 069/151] fix(dallas): make recovery time for 1-bit equal to that of 0-bit (#6763) --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index f47e8d58e3..34c2cf3c29 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -60,7 +60,7 @@ void HOT IRAM_ATTR GPIOOneWireBus::write_bit_(bool bit) { // recovery time: t_rec: min=1µs // ds18b20 appears to read the bus after roughly 14µs uint32_t delay0 = bit ? 6 : 60; - uint32_t delay1 = bit ? 54 : 5; + uint32_t delay1 = bit ? 59 : 5; // delay A/C delayMicroseconds(delay0); From d27e7b3b70310a7970ee44213bb3680a554bd5b1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:07:43 +1200 Subject: [PATCH 070/151] [wifi] Fix some access point bugs related to esp-idf 4.4.7 (#6928) * Set dhcp server range to only 10 IPs * Change log level to errors to make it clearer * We want to stop the dhcp server, not client --- .../wifi/wifi_component_esp32_arduino.cpp | 12 ++++++------ .../components/wifi/wifi_component_esp8266.cpp | 14 +++++++------- .../components/wifi/wifi_component_esp_idf.cpp | 16 ++++++++-------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp32_arduino.cpp b/esphome/components/wifi/wifi_component_esp32_arduino.cpp index ef7a624cd5..fc954a2333 100644 --- a/esphome/components/wifi/wifi_component_esp32_arduino.cpp +++ b/esphome/components/wifi/wifi_component_esp32_arduino.cpp @@ -694,15 +694,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -712,20 +712,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index 838250972b..997457e2d2 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -716,12 +716,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { if (wifi_softap_dhcps_status() == DHCP_STARTED) { if (!wifi_softap_dhcps_stop()) { - ESP_LOGV(TAG, "Stopping DHCP server failed!"); + ESP_LOGW(TAG, "Stopping DHCP server failed!"); } } if (!wifi_set_ip_info(SOFTAP_IF, &info)) { - ESP_LOGV(TAG, "Setting SoftAP info failed!"); + ESP_LOGE(TAG, "Setting SoftAP info failed!"); return false; } @@ -735,17 +735,17 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); if (!wifi_softap_set_dhcps_lease(&lease)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease failed!"); return false; } // lease time 1440 minutes (=24 hours) if (!wifi_softap_set_dhcps_lease_time(1440)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease time failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease time failed!"); return false; } @@ -755,13 +755,13 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { uint8_t mode = 1; // bit0, 1 enables router information from ESP8266 SoftAP DHCP server. if (!wifi_softap_set_dhcps_offer_option(OFFER_ROUTER, &mode)) { - ESP_LOGV(TAG, "wifi_softap_set_dhcps_offer_option failed!"); + ESP_LOGE(TAG, "wifi_softap_set_dhcps_offer_option failed!"); return false; } #endif if (!wifi_softap_dhcps_start()) { - ESP_LOGV(TAG, "Starting SoftAP DHCPS failed!"); + ESP_LOGE(TAG, "Starting SoftAP DHCPS failed!"); return false; } diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index bc575e6a2d..c21486fee4 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -823,15 +823,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -841,20 +841,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } @@ -887,12 +887,12 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { esp_err_t err = esp_wifi_set_config(WIFI_IF_AP, &conf); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_set_config failed! %d", err); + ESP_LOGE(TAG, "esp_wifi_set_config failed! %d", err); return false; } if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) { - ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!"); + ESP_LOGE(TAG, "wifi_ap_ip_config_ failed!"); return false; } From 43b5c2deb747114eae8367f7fbfba34296c24146 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:12:55 +1200 Subject: [PATCH 071/151] Rename legacy/modern to ota/factory (#6922) * Rename legacy/modern to ota/factory * Add modern/legacy in brackets --- esphome/components/esp32/__init__.py | 14 +++++------ esphome/components/esp32/post_build.py.script | 13 ++++++++++- .../components/esp8266/post_build.py.script | 10 +++++++- esphome/components/rp2040/__init__.py | 18 +++++++++++++-- .../components/rp2040/post_build.py.script | 23 +++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 esphome/components/rp2040/post_build.py.script diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 8f46567266..1effea708f 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -96,16 +96,16 @@ def get_board(core_obj=None): def get_download_types(storage_json): return [ { - "title": "Modern format", + "title": "Factory format (Previously Modern)", "description": "For use with ESPHome Web and other tools.", - "file": "firmware-factory.bin", - "download": f"{storage_json.name}-factory.bin", + "file": "firmware.factory.bin", + "download": f"{storage_json.name}.factory.bin", }, { - "title": "Legacy format", - "description": "For use with ESPHome Flasher.", - "file": "firmware.bin", - "download": f"{storage_json.name}.bin", + "title": "OTA format (Previously Legacy)", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] diff --git a/esphome/components/esp32/post_build.py.script b/esphome/components/esp32/post_build.py.script index c941bdb386..c181cf30b1 100644 --- a/esphome/components/esp32/post_build.py.script +++ b/esphome/components/esp32/post_build.py.script @@ -17,17 +17,19 @@ from SCons.Script import ARGUMENTS # Copy over the default sdkconfig. from os import path + if path.exists("./sdkconfig.defaults"): os.makedirs(".temp", exist_ok=True) shutil.copy("./sdkconfig.defaults", "./.temp/sdkconfig-esp32-idf") + def esp32_create_combined_bin(source, target, env): verbose = bool(int(ARGUMENTS.get("PIOVERBOSE", "0"))) if verbose: print("Generating combined binary for serial flashing") app_offset = 0x10000 - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") @@ -62,5 +64,14 @@ def esp32_create_combined_bin(source, target, env): else: subprocess.run(["esptool.py", *cmd]) + +def esp32_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa diff --git a/esphome/components/esp8266/post_build.py.script b/esphome/components/esp8266/post_build.py.script index 4dab1cbd27..0a854d7599 100644 --- a/esphome/components/esp8266/post_build.py.script +++ b/esphome/components/esp8266/post_build.py.script @@ -6,10 +6,18 @@ Import("env") # noqa def esp8266_copy_factory_bin(source, target, env): firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +def esp8266_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") shutil.copyfile(firmware_name, new_file_name) # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_factory_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_ota_bin) # noqa diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index ace455add7..f5c3b8bda2 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -47,10 +47,16 @@ def set_core_data(config): def get_download_types(storage_json): return [ { - "title": "UF2 format", + "title": "UF2 factory format", "description": "For copying to RP2040 over USB.", "file": "firmware.uf2", - "download": f"{storage_json.name}.uf2", + "download": f"{storage_json.name}.factory.uf2", + }, + { + "title": "OTA format", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] @@ -160,6 +166,8 @@ async def to_code(config): cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_define("ESPHOME_VARIANT", "RP2040") + cg.add_platformio_option("extra_scripts", ["post:post_build.py"]) + conf = config[CONF_FRAMEWORK] cg.add_platformio_option("framework", "arduino") cg.add_build_flag("-DUSE_ARDUINO") @@ -225,4 +233,10 @@ def generate_pio_files() -> bool: # Called by writer.py def copy_files() -> bool: + dir = os.path.dirname(__file__) + post_build_file = os.path.join(dir, "post_build.py.script") + copy_file_if_changed( + post_build_file, + CORE.relative_build_path("post_build.py"), + ) return generate_pio_files() diff --git a/esphome/components/rp2040/post_build.py.script b/esphome/components/rp2040/post_build.py.script new file mode 100644 index 0000000000..7dcd7e52a6 --- /dev/null +++ b/esphome/components/rp2040/post_build.py.script @@ -0,0 +1,23 @@ +import shutil + +# pylint: disable=E0602 +Import("env") # noqa + + +def rp2040_copy_factory_uf2(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.uf2") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.uf2") + + shutil.copyfile(firmware_name, new_file_name) + + +def rp2040_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +# pylint: disable=E0602 +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_factory_uf2) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_ota_bin) # noqa From ff07637dfdfb5364076966fba12dc1de949e8748 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:26:24 +1200 Subject: [PATCH 072/151] Bump version to 2024.6.0b4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index a0fe325282..eea437bcdc 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b3" +__version__ = "2024.6.0b4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 65a79acfb972876bfd54d777393bd553cdfde8e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:44:20 +1200 Subject: [PATCH 073/151] Bump pypa/gh-action-pypi-publish from 1.8.14 to 1.9.0 (#6926) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c07335104..a1942e8cac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,7 @@ jobs: pip3 install build python3 -m build - name: Publish - uses: pypa/gh-action-pypi-publish@v1.8.14 + uses: pypa/gh-action-pypi-publish@v1.9.0 deploy-docker: name: Build ESPHome ${{ matrix.platform }} From c18056bdda129136f05b52388e738ceec8242e62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:16:10 +1200 Subject: [PATCH 074/151] Bump docker/build-push-action from 5.4.0 to 6.0.0 in /.github/actions/build-image (#6927) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d792ab5f4c..c685e80bec 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile From 65b05af0143a11a5d0e290f7025a275808cbd143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:38:31 +1200 Subject: [PATCH 075/151] Bump peter-evans/create-pull-request from 6.0.5 to 6.1.0 (#6935) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/sync-device-classes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-device-classes.yml b/.github/workflows/sync-device-classes.yml index 45f6b27127..89a3627c64 100644 --- a/.github/workflows/sync-device-classes.yml +++ b/.github/workflows/sync-device-classes.yml @@ -36,7 +36,7 @@ jobs: python ./script/sync-device_class.py - name: Commit changes - uses: peter-evans/create-pull-request@v6.0.5 + uses: peter-evans/create-pull-request@v6.1.0 with: commit-message: "Synchronise Device Classes from Home Assistant" committer: esphomebot From ed6462fa00b2162d541a433076c01d67fb3c8e84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:38:50 +1200 Subject: [PATCH 076/151] Bump docker/build-push-action from 6.0.0 to 6.0.1 in /.github/actions/build-image (#6934) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index c685e80bec..53cd836573 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile From 896cdab22dfde5fbd64f3d0506d0d0d3990ef28b Mon Sep 17 00:00:00 2001 From: Manuel Kasper Date: Tue, 18 Jun 2024 21:53:01 +0200 Subject: [PATCH 077/151] Fix garbled graphics on LILYGO T4-S3 display (#6910) --- esphome/components/qspi_amoled/display.py | 20 +++++++++++++++---- .../components/qspi_amoled/qspi_amoled.cpp | 13 ++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/esphome/components/qspi_amoled/display.py b/esphome/components/qspi_amoled/display.py index 84bf9553cb..77d1e3d095 100644 --- a/esphome/components/qspi_amoled/display.py +++ b/esphome/components/qspi_amoled/display.py @@ -42,6 +42,14 @@ COLOR_ORDERS = { } DATA_PIN_SCHEMA = pins.internal_gpio_output_pin_schema + +def validate_dimension(value): + value = cv.positive_int(value) + if value % 2 != 0: + raise cv.Invalid("Width/height/offset must be divisible by 2") + return value + + CONFIG_SCHEMA = cv.All( display.FULL_DISPLAY_SCHEMA.extend( cv.Schema( @@ -52,10 +60,14 @@ CONFIG_SCHEMA = cv.All( cv.dimensions, cv.Schema( { - cv.Required(CONF_WIDTH): cv.int_, - cv.Required(CONF_HEIGHT): cv.int_, - cv.Optional(CONF_OFFSET_HEIGHT, default=0): cv.int_, - cv.Optional(CONF_OFFSET_WIDTH, default=0): cv.int_, + cv.Required(CONF_WIDTH): validate_dimension, + cv.Required(CONF_HEIGHT): validate_dimension, + cv.Optional( + CONF_OFFSET_HEIGHT, default=0 + ): validate_dimension, + cv.Optional( + CONF_OFFSET_WIDTH, default=0 + ): validate_dimension, } ), ), diff --git a/esphome/components/qspi_amoled/qspi_amoled.cpp b/esphome/components/qspi_amoled/qspi_amoled.cpp index 697989e861..36e9b03252 100644 --- a/esphome/components/qspi_amoled/qspi_amoled.cpp +++ b/esphome/components/qspi_amoled/qspi_amoled.cpp @@ -26,6 +26,19 @@ void QspiAmoLed::setup() { void QspiAmoLed::update() { this->do_update_(); + // Start addresses and widths/heights must be divisible by 2 (CASET/RASET restriction in datasheet) + if (this->x_low_ % 2 == 1) { + this->x_low_--; + } + if (this->x_high_ % 2 == 0) { + this->x_high_++; + } + if (this->y_low_ % 2 == 1) { + this->y_low_--; + } + if (this->y_high_ % 2 == 0) { + this->y_high_++; + } int w = this->x_high_ - this->x_low_ + 1; int h = this->y_high_ - this->y_low_ + 1; this->draw_pixels_at(this->x_low_, this->y_low_, w, h, this->buffer_, this->color_mode_, display::COLOR_BITNESS_565, From 310f850ee4a7dd7ed5084bd307122c0cbb2d4991 Mon Sep 17 00:00:00 2001 From: peter--s Date: Wed, 19 Jun 2024 03:28:03 +0200 Subject: [PATCH 078/151] Update cover.h for open() and close() compiler warnings (#6936) --- esphome/components/cover/cover.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/cover/cover.h b/esphome/components/cover/cover.h index 89598a9636..8b6f5b8a72 100644 --- a/esphome/components/cover/cover.h +++ b/esphome/components/cover/cover.h @@ -129,13 +129,13 @@ class Cover : public EntityBase, public EntityBase_DeviceClass { * * This is a legacy method and may be removed later, please use `.make_call()` instead. */ - ESPDEPRECATED("open() is deprecated, use make_call().set_command_open() instead.", "2021.9") + ESPDEPRECATED("open() is deprecated, use make_call().set_command_open().perform() instead.", "2021.9") void open(); /** Close the cover. * * This is a legacy method and may be removed later, please use `.make_call()` instead. */ - ESPDEPRECATED("close() is deprecated, use make_call().set_command_close() instead.", "2021.9") + ESPDEPRECATED("close() is deprecated, use make_call().set_command_close().perform() instead.", "2021.9") void close(); /** Stop the cover. * From 8567877f07d2900a067c6b0fc57e5b0e07685f1d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:09:16 +1200 Subject: [PATCH 079/151] [network] Default ipv6 to false to always set the flags (#6937) * [network] Default ipv6 to false to always set the flags * Separate tests for ipv6 disabled and enabled * Forgot other platforms wouldnt have the variable in config --- esphome/components/network/__init__.py | 26 +++++++++++-------- tests/components/network/common.yaml | 5 +++- .../network/test-ipv6.esp32-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-idf.yaml | 4 +++ .../network/test-ipv6.esp32-idf.yaml | 4 +++ .../network/test-ipv6.esp8266-ard.yaml | 4 +++ .../network/test-ipv6.rp2040-ard.yaml | 4 +++ tests/components/network/test.host.yaml | 1 + 9 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 tests/components/network/test-ipv6.esp32-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp32-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp8266-ard.yaml create mode 100644 tests/components/network/test-ipv6.rp2040-ard.yaml create mode 100644 tests/components/network/test.host.yaml diff --git a/esphome/components/network/__init__.py b/esphome/components/network/__init__.py index 36144ff0a4..9ef75e0fb9 100644 --- a/esphome/components/network/__init__.py +++ b/esphome/components/network/__init__.py @@ -19,7 +19,12 @@ IPAddress = network_ns.class_("IPAddress") CONFIG_SCHEMA = cv.Schema( { - cv.SplitDefault(CONF_ENABLE_IPV6): cv.All( + cv.SplitDefault( + CONF_ENABLE_IPV6, + esp8266=False, + esp32=False, + rp2040=False, + ): cv.All( cv.boolean, cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040]) ), cv.Optional(CONF_MIN_IPV6_ADDR_COUNT, default=0): cv.positive_int, @@ -28,18 +33,17 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): - if CONF_ENABLE_IPV6 in config: - cg.add_define("USE_NETWORK_IPV6", config[CONF_ENABLE_IPV6]) - cg.add_define( - "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] - ) - if CORE.using_esp_idf: - add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", config[CONF_ENABLE_IPV6]) - add_idf_sdkconfig_option( - "CONFIG_LWIP_IPV6_AUTOCONFIG", config[CONF_ENABLE_IPV6] + if (enable_ipv6 := config.get(CONF_ENABLE_IPV6, None)) is not None: + cg.add_define("USE_NETWORK_IPV6", enable_ipv6) + if enable_ipv6: + cg.add_define( + "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] ) + if CORE.using_esp_idf: + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", enable_ipv6) + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6_AUTOCONFIG", enable_ipv6) else: - if config[CONF_ENABLE_IPV6]: + if enable_ipv6: cg.add_build_flag("-DCONFIG_LWIP_IPV6") cg.add_build_flag("-DCONFIG_LWIP_IPV6_AUTOCONFIG") if CORE.is_rp2040: diff --git a/tests/components/network/common.yaml b/tests/components/network/common.yaml index 147afd1e81..dca00cbeb6 100644 --- a/tests/components/network/common.yaml +++ b/tests/components/network/common.yaml @@ -1,6 +1,9 @@ +substitutions: + network_enable_ipv6: "false" + wifi: ssid: MySSID password: password1 network: - enable_ipv6: true + enable_ipv6: ${network_enable_ipv6} diff --git a/tests/components/network/test-ipv6.esp32-ard.yaml b/tests/components/network/test-ipv6.esp32-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-ard.yaml b/tests/components/network/test-ipv6.esp32-c3-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-idf.yaml b/tests/components/network/test-ipv6.esp32-c3-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-idf.yaml b/tests/components/network/test-ipv6.esp32-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp8266-ard.yaml b/tests/components/network/test-ipv6.esp8266-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp8266-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.rp2040-ard.yaml b/tests/components/network/test-ipv6.rp2040-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.rp2040-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test.host.yaml b/tests/components/network/test.host.yaml new file mode 100644 index 0000000000..61889b0361 --- /dev/null +++ b/tests/components/network/test.host.yaml @@ -0,0 +1 @@ +network: From fd7a212562089d1e2ce55b4f698cd20343de8094 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:44:20 +1200 Subject: [PATCH 080/151] Bump pypa/gh-action-pypi-publish from 1.8.14 to 1.9.0 (#6926) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 563d485b6a..62031e925a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,7 @@ jobs: pip3 install build python3 -m build - name: Publish - uses: pypa/gh-action-pypi-publish@v1.8.14 + uses: pypa/gh-action-pypi-publish@v1.9.0 deploy-docker: name: Build ESPHome ${{ matrix.platform }} From acf69bb56f53b636932e224fc466ef8cab65ef0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:16:10 +1200 Subject: [PATCH 081/151] Bump docker/build-push-action from 5.4.0 to 6.0.0 in /.github/actions/build-image (#6927) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d792ab5f4c..c685e80bec 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile From c17090c1e556aebeb0186f0042824f9611266896 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:38:50 +1200 Subject: [PATCH 082/151] Bump docker/build-push-action from 6.0.0 to 6.0.1 in /.github/actions/build-image (#6934) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index c685e80bec..53cd836573 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile From 6682451ee0c53a30d577d67574f827ec82952b17 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:09:16 +1200 Subject: [PATCH 083/151] [network] Default ipv6 to false to always set the flags (#6937) * [network] Default ipv6 to false to always set the flags * Separate tests for ipv6 disabled and enabled * Forgot other platforms wouldnt have the variable in config --- esphome/components/network/__init__.py | 26 +++++++++++-------- tests/components/network/common.yaml | 5 +++- .../network/test-ipv6.esp32-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-idf.yaml | 4 +++ .../network/test-ipv6.esp32-idf.yaml | 4 +++ .../network/test-ipv6.esp8266-ard.yaml | 4 +++ .../network/test-ipv6.rp2040-ard.yaml | 4 +++ tests/components/network/test.host.yaml | 1 + 9 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 tests/components/network/test-ipv6.esp32-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp32-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp8266-ard.yaml create mode 100644 tests/components/network/test-ipv6.rp2040-ard.yaml create mode 100644 tests/components/network/test.host.yaml diff --git a/esphome/components/network/__init__.py b/esphome/components/network/__init__.py index 36144ff0a4..9ef75e0fb9 100644 --- a/esphome/components/network/__init__.py +++ b/esphome/components/network/__init__.py @@ -19,7 +19,12 @@ IPAddress = network_ns.class_("IPAddress") CONFIG_SCHEMA = cv.Schema( { - cv.SplitDefault(CONF_ENABLE_IPV6): cv.All( + cv.SplitDefault( + CONF_ENABLE_IPV6, + esp8266=False, + esp32=False, + rp2040=False, + ): cv.All( cv.boolean, cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040]) ), cv.Optional(CONF_MIN_IPV6_ADDR_COUNT, default=0): cv.positive_int, @@ -28,18 +33,17 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): - if CONF_ENABLE_IPV6 in config: - cg.add_define("USE_NETWORK_IPV6", config[CONF_ENABLE_IPV6]) - cg.add_define( - "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] - ) - if CORE.using_esp_idf: - add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", config[CONF_ENABLE_IPV6]) - add_idf_sdkconfig_option( - "CONFIG_LWIP_IPV6_AUTOCONFIG", config[CONF_ENABLE_IPV6] + if (enable_ipv6 := config.get(CONF_ENABLE_IPV6, None)) is not None: + cg.add_define("USE_NETWORK_IPV6", enable_ipv6) + if enable_ipv6: + cg.add_define( + "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] ) + if CORE.using_esp_idf: + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", enable_ipv6) + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6_AUTOCONFIG", enable_ipv6) else: - if config[CONF_ENABLE_IPV6]: + if enable_ipv6: cg.add_build_flag("-DCONFIG_LWIP_IPV6") cg.add_build_flag("-DCONFIG_LWIP_IPV6_AUTOCONFIG") if CORE.is_rp2040: diff --git a/tests/components/network/common.yaml b/tests/components/network/common.yaml index 147afd1e81..dca00cbeb6 100644 --- a/tests/components/network/common.yaml +++ b/tests/components/network/common.yaml @@ -1,6 +1,9 @@ +substitutions: + network_enable_ipv6: "false" + wifi: ssid: MySSID password: password1 network: - enable_ipv6: true + enable_ipv6: ${network_enable_ipv6} diff --git a/tests/components/network/test-ipv6.esp32-ard.yaml b/tests/components/network/test-ipv6.esp32-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-ard.yaml b/tests/components/network/test-ipv6.esp32-c3-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-idf.yaml b/tests/components/network/test-ipv6.esp32-c3-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-idf.yaml b/tests/components/network/test-ipv6.esp32-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp8266-ard.yaml b/tests/components/network/test-ipv6.esp8266-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp8266-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.rp2040-ard.yaml b/tests/components/network/test-ipv6.rp2040-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.rp2040-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test.host.yaml b/tests/components/network/test.host.yaml new file mode 100644 index 0000000000..61889b0361 --- /dev/null +++ b/tests/components/network/test.host.yaml @@ -0,0 +1 @@ +network: From 8bac82f80497b7e25639abc94102c125082e59cf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:37:43 +1200 Subject: [PATCH 084/151] Bump version to 2024.6.0b5 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index eea437bcdc..3aba12b9dd 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b4" +__version__ = "2024.6.0b5" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From ff803aa108214331d292fc90574ac06e84b82409 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:37:33 +1200 Subject: [PATCH 085/151] Rename test files --- .../{test-ipv6.esp8266-ard.yaml => test-ipv6.esp8266.yaml} | 0 .../network/{test-ipv6.rp2040-ard.yaml => test-ipv6.rp2040.yaml} | 0 tests/components/network/{test.esp32.yaml => test.esp32-ard.yaml} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename tests/components/network/{test-ipv6.esp8266-ard.yaml => test-ipv6.esp8266.yaml} (100%) rename tests/components/network/{test-ipv6.rp2040-ard.yaml => test-ipv6.rp2040.yaml} (100%) rename tests/components/network/{test.esp32.yaml => test.esp32-ard.yaml} (100%) diff --git a/tests/components/network/test-ipv6.esp8266-ard.yaml b/tests/components/network/test-ipv6.esp8266.yaml similarity index 100% rename from tests/components/network/test-ipv6.esp8266-ard.yaml rename to tests/components/network/test-ipv6.esp8266.yaml diff --git a/tests/components/network/test-ipv6.rp2040-ard.yaml b/tests/components/network/test-ipv6.rp2040.yaml similarity index 100% rename from tests/components/network/test-ipv6.rp2040-ard.yaml rename to tests/components/network/test-ipv6.rp2040.yaml diff --git a/tests/components/network/test.esp32.yaml b/tests/components/network/test.esp32-ard.yaml similarity index 100% rename from tests/components/network/test.esp32.yaml rename to tests/components/network/test.esp32-ard.yaml From a6d1aa91de821726d114c46c30a0c9cb36c147ff Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 21:52:47 +1200 Subject: [PATCH 086/151] Bump version to 2024.6.0 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 3aba12b9dd..0f5caa7f9d 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b5" +__version__ = "2024.6.0" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 80e5e1995653a3b51193b456d9861ec7f7f81c24 Mon Sep 17 00:00:00 2001 From: Cossid <83468485+Cossid@users.noreply.github.com> Date: Wed, 19 Jun 2024 19:59:37 -0500 Subject: [PATCH 087/151] debug_libretiny - Fix typo (#6942) --- esphome/components/debug/debug_libretiny.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/debug/debug_libretiny.cpp b/esphome/components/debug/debug_libretiny.cpp index c3418cf96c..b5e2a5b310 100644 --- a/esphome/components/debug/debug_libretiny.cpp +++ b/esphome/components/debug/debug_libretiny.cpp @@ -12,7 +12,7 @@ std::string DebugComponent::get_reset_reason_() { return lt_get_reboot_reason_na uint32_t DebugComponent::get_free_heap_() { return lt_heap_get_free(); } void DebugComponent::get_device_info_(std::string &device_info) { - str::string reset_reason = get_reset_reason_(); + std::string reset_reason = get_reset_reason_(); ESP_LOGD(TAG, "LibreTiny Version: %s", lt_get_version()); ESP_LOGD(TAG, "Chip: %s (%04x) @ %u MHz", lt_cpu_get_model_name(), lt_cpu_get_model(), lt_cpu_get_freq_mhz()); ESP_LOGD(TAG, "Chip ID: 0x%06X", lt_cpu_get_mac_id()); From 775e03cfd95d6532292e7665f82b5301924795b9 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:12:38 +1200 Subject: [PATCH 088/151] Bump esphome-dashboard to 20240620.0 (#6944) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a7b08f8a14..0cbe5e7265 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240613.0 +esphome-dashboard==20240620.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From 96f1a146a66e5266d4417e7afb0db2781e243048 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 19 Jun 2024 21:32:29 -0500 Subject: [PATCH 089/151] [CI] Add debug component test for LibreTiny (#6945) --- tests/components/debug/test.bk72xx-ard.yaml | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/components/debug/test.bk72xx-ard.yaml diff --git a/tests/components/debug/test.bk72xx-ard.yaml b/tests/components/debug/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/debug/test.bk72xx-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From ad8cf698973ea821ec1a8e4ec7ad74caa691b6cb Mon Sep 17 00:00:00 2001 From: Cossid <83468485+Cossid@users.noreply.github.com> Date: Wed, 19 Jun 2024 19:59:37 -0500 Subject: [PATCH 090/151] debug_libretiny - Fix typo (#6942) --- esphome/components/debug/debug_libretiny.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/debug/debug_libretiny.cpp b/esphome/components/debug/debug_libretiny.cpp index c3418cf96c..b5e2a5b310 100644 --- a/esphome/components/debug/debug_libretiny.cpp +++ b/esphome/components/debug/debug_libretiny.cpp @@ -12,7 +12,7 @@ std::string DebugComponent::get_reset_reason_() { return lt_get_reboot_reason_na uint32_t DebugComponent::get_free_heap_() { return lt_heap_get_free(); } void DebugComponent::get_device_info_(std::string &device_info) { - str::string reset_reason = get_reset_reason_(); + std::string reset_reason = get_reset_reason_(); ESP_LOGD(TAG, "LibreTiny Version: %s", lt_get_version()); ESP_LOGD(TAG, "Chip: %s (%04x) @ %u MHz", lt_cpu_get_model_name(), lt_cpu_get_model(), lt_cpu_get_freq_mhz()); ESP_LOGD(TAG, "Chip ID: 0x%06X", lt_cpu_get_mac_id()); From c868dae44a141ca3e0cbbf76a5c92b6bba7f5bbe Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:12:38 +1200 Subject: [PATCH 091/151] Bump esphome-dashboard to 20240620.0 (#6944) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a7b08f8a14..0cbe5e7265 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240613.0 +esphome-dashboard==20240620.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From a7a9eb6f71677e8b1ec29cfcea86569452d16d57 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:59:27 +1200 Subject: [PATCH 092/151] Bump version to 2024.6.1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 0f5caa7f9d..3b3bdd1a17 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0" +__version__ = "2024.6.1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 6f074d369205ad91523bfc7eedaba34093dce423 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:49:26 +1200 Subject: [PATCH 093/151] [dooya] Flip bit timings (#6947) --- esphome/components/remote_base/dooya_protocol.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/esphome/components/remote_base/dooya_protocol.cpp b/esphome/components/remote_base/dooya_protocol.cpp index d979bca8c5..04c5fef8f3 100644 --- a/esphome/components/remote_base/dooya_protocol.cpp +++ b/esphome/components/remote_base/dooya_protocol.cpp @@ -8,10 +8,10 @@ static const char *const TAG = "remote.dooya"; static const uint32_t HEADER_HIGH_US = 5000; static const uint32_t HEADER_LOW_US = 1500; -static const uint32_t BIT_ZERO_HIGH_US = 750; -static const uint32_t BIT_ZERO_LOW_US = 350; -static const uint32_t BIT_ONE_HIGH_US = 350; -static const uint32_t BIT_ONE_LOW_US = 750; +static const uint32_t BIT_ZERO_HIGH_US = 350; +static const uint32_t BIT_ZERO_LOW_US = 750; +static const uint32_t BIT_ONE_HIGH_US = 750; +static const uint32_t BIT_ONE_LOW_US = 350; void DooyaProtocol::encode(RemoteTransmitData *dst, const DooyaData &data) { dst->set_carrier_frequency(0); From 8045b889d39c7675ba69afa0d38e7fd7b952d93c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:09:00 +1200 Subject: [PATCH 094/151] [core] Fix package merging with lists of primitives (#6952) --- esphome/config_helpers.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/config_helpers.py b/esphome/config_helpers.py index b5e0b26143..54242bc259 100644 --- a/esphome/config_helpers.py +++ b/esphome/config_helpers.py @@ -58,17 +58,21 @@ def merge_config(full_old, full_new): ids = { v_id: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, str) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, str) } extend_ids = { v_id.value: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, Extend) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, Extend) } ids_to_delete = [] for v in new: - if new_id := v.get(CONF_ID): + if isinstance(v, dict) and (new_id := v.get(CONF_ID)): if isinstance(new_id, Extend): new_id = new_id.value if new_id in ids: From e7556271e72f85e09d1381bee68e43bde8843387 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:59:52 +1200 Subject: [PATCH 095/151] [update] Set entity_category to config & Publish state to logs (#6954) --- esphome/components/update/__init__.py | 5 ++++ esphome/components/update/update_entity.cpp | 26 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ea1cf778b6..20a9373a06 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -4,11 +4,13 @@ import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( CONF_DEVICE_CLASS, + CONF_ENTITY_CATEGORY, CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, + ENTITY_CATEGORY_CONFIG, ) from esphome.core import CORE, coroutine_with_priority from esphome.cpp_helpers import setup_entity @@ -41,6 +43,9 @@ UPDATE_SCHEMA = ( cv.Optional(CONF_ON_UPDATE_AVAILABLE): automation.validate_automation( single=True ), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ) ) diff --git a/esphome/components/update/update_entity.cpp b/esphome/components/update/update_entity.cpp index 501cb6635f..ed9a0480d8 100644 --- a/esphome/components/update/update_entity.cpp +++ b/esphome/components/update/update_entity.cpp @@ -1,9 +1,35 @@ #include "update_entity.h" +#include "esphome/core/log.h" + namespace esphome { namespace update { +static const char *const TAG = "update"; + void UpdateEntity::publish_state() { + ESP_LOGD(TAG, "'%s' - Publishing:", this->name_.c_str()); + ESP_LOGD(TAG, " Current Version: %s", this->update_info_.current_version.c_str()); + + if (!this->update_info_.md5.empty()) { + ESP_LOGD(TAG, " Latest Version: %s", this->update_info_.latest_version.c_str()); + } + if (!this->update_info_.firmware_url.empty()) { + ESP_LOGD(TAG, " Firmware URL: %s", this->update_info_.firmware_url.c_str()); + } + + ESP_LOGD(TAG, " Title: %s", this->update_info_.title.c_str()); + if (!this->update_info_.summary.empty()) { + ESP_LOGD(TAG, " Summary: %s", this->update_info_.summary.c_str()); + } + if (!this->update_info_.release_url.empty()) { + ESP_LOGD(TAG, " Release URL: %s", this->update_info_.release_url.c_str()); + } + + if (this->update_info_.has_progress) { + ESP_LOGD(TAG, " Progress: %.0f%%", this->update_info_.progress); + } + this->has_state_ = true; this->state_callback_.call(); } From 6c11f0bd5152b32579b3f86802365f2e308e9ca4 Mon Sep 17 00:00:00 2001 From: Manuel Kasper Date: Fri, 21 Jun 2024 16:46:06 +0200 Subject: [PATCH 096/151] [qspi_amoled] Fix display remaining blank after update() before setup completion (#6958) --- esphome/components/qspi_amoled/qspi_amoled.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esphome/components/qspi_amoled/qspi_amoled.cpp b/esphome/components/qspi_amoled/qspi_amoled.cpp index 36e9b03252..b1f651025a 100644 --- a/esphome/components/qspi_amoled/qspi_amoled.cpp +++ b/esphome/components/qspi_amoled/qspi_amoled.cpp @@ -25,6 +25,9 @@ void QspiAmoLed::setup() { } void QspiAmoLed::update() { + if (!this->setup_complete_) { + return; + } this->do_update_(); // Start addresses and widths/heights must be divisible by 2 (CASET/RASET restriction in datasheet) if (this->x_low_ % 2 == 1) { From 67bd5db6d6eb6c23e44b430200fefa9a371e2491 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:18:43 -0400 Subject: [PATCH 097/151] Fix infinite loop in http_request for ESP-IDF. (#6963) --- esphome/components/http_request/http_request_idf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 138e0438f4..d6fac7a133 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -90,7 +90,7 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin int write_left = body_len; int write_index = 0; const char *buf = body.c_str(); - while (body_len > 0) { + while (write_left > 0) { int written = esp_http_client_write(client, buf + write_index, write_left); if (written < 0) { err = ESP_FAIL; From 0a9703bff998a5196e15a3aefa35257b7d651c98 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:28:11 -0400 Subject: [PATCH 098/151] ESP-IDF 4.x expects seconds for esp_task_wdt_init(), not milliseconds. (#6964) --- esphome/components/http_request/watchdog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/watchdog.cpp b/esphome/components/http_request/watchdog.cpp index e609feb4dd..a8519c59ed 100644 --- a/esphome/components/http_request/watchdog.cpp +++ b/esphome/components/http_request/watchdog.cpp @@ -46,7 +46,7 @@ void WatchdogManager::set_timeout_(uint32_t timeout_ms) { }; esp_task_wdt_reconfigure(&wdt_config); #else - esp_task_wdt_init(timeout_ms, true); + esp_task_wdt_init(timeout_ms / 1000, true); #endif // ESP_IDF_VERSION_MAJOR #endif // USE_ESP32 From 9c5507ab4680ce4df996910807100cc72f911e1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Jun 2024 12:50:21 +0200 Subject: [PATCH 099/151] Bump docker/build-push-action from 6.0.1 to 6.1.0 in /.github/actions/build-image (#6962) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index 53cd836573..27d2ffc533 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.0.1 + uses: docker/build-push-action@v6.1.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.0.1 + uses: docker/build-push-action@v6.1.0 with: context: . file: ./docker/Dockerfile From 2aacf14e960d005aee29e7a259f47b90ae1d3970 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Sat, 22 Jun 2024 04:57:27 -0700 Subject: [PATCH 100/151] Onewire (#6967) * retry scan * setup pin and log retries * fix retries * remove retries --------- Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index 34c2cf3c29..b4e69e975a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -9,6 +9,10 @@ static const char *const TAG = "gpio.one_wire"; void GPIOOneWireBus::setup() { ESP_LOGCONFIG(TAG, "Setting up 1-wire bus..."); + this->t_pin_->setup(); + // clear bus with 480µs high, otherwise initial reset in search might fail + this->t_pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + delayMicroseconds(480); this->search(); } From 18690d51f51c0d8a145c8ca71a234a496a06b3d9 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Sun, 23 Jun 2024 01:27:47 +1200 Subject: [PATCH 101/151] Synchronise Device Classes from Home Assistant (#6966) --- esphome/components/number/__init__.py | 2 ++ esphome/components/sensor/__init__.py | 2 ++ esphome/const.py | 1 + 3 files changed, 5 insertions(+) diff --git a/esphome/components/number/__init__.py b/esphome/components/number/__init__.py index 303535c138..d9c16fd7a9 100644 --- a/esphome/components/number/__init__.py +++ b/esphome/components/number/__init__.py @@ -26,6 +26,7 @@ from esphome.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, @@ -82,6 +83,7 @@ DEVICE_CLASSES = [ DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index 6077f5dc1f..262e69d75b 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -43,6 +43,7 @@ from esphome.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, @@ -103,6 +104,7 @@ DEVICE_CLASSES = [ DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, diff --git a/esphome/const.py b/esphome/const.py index 9c4e451029..a13a0af8eb 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1070,6 +1070,7 @@ DEVICE_CLASS_BUTTON = "button" DEVICE_CLASS_CARBON_DIOXIDE = "carbon_dioxide" DEVICE_CLASS_CARBON_MONOXIDE = "carbon_monoxide" DEVICE_CLASS_COLD = "cold" +DEVICE_CLASS_CONDUCTIVITY = "conductivity" DEVICE_CLASS_CONNECTIVITY = "connectivity" DEVICE_CLASS_CURRENT = "current" DEVICE_CLASS_CURTAIN = "curtain" From 1e05bcaa614040617ef94340a54ca3f22871c4ac Mon Sep 17 00:00:00 2001 From: Manuel Kasper Date: Sat, 22 Jun 2024 17:10:22 +0200 Subject: [PATCH 102/151] [qspi_amoled] Fix clear/fill with rotation (#6960) --- esphome/components/qspi_amoled/qspi_amoled.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/esphome/components/qspi_amoled/qspi_amoled.h b/esphome/components/qspi_amoled/qspi_amoled.h index 28d243f548..c766b4e685 100644 --- a/esphome/components/qspi_amoled/qspi_amoled.h +++ b/esphome/components/qspi_amoled/qspi_amoled.h @@ -65,13 +65,10 @@ class QspiAmoLed : public display::DisplayBuffer, void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; } void set_enable_pin(GPIOPin *enable_pin) { this->enable_pin_ = enable_pin; } - void set_width(uint16_t width) { this->width_ = width; } void set_dimensions(uint16_t width, uint16_t height) { this->width_ = width; this->height_ = height; } - int get_width() override { return this->width_; } - int get_height() override { return this->height_; } void set_invert_colors(bool invert_colors) { this->invert_colors_ = invert_colors; this->reset_params_(); From 17204baac0168b6a6dd2f6ad87968cd83717f7de Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Sun, 23 Jun 2024 15:22:08 -0700 Subject: [PATCH 103/151] allow template parameters (#6972) --- esphome/components/script/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/script/__init__.py b/esphome/components/script/__init__.py index 483357f85b..16b1d4c54e 100644 --- a/esphome/components/script/__init__.py +++ b/esphome/components/script/__init__.py @@ -88,7 +88,7 @@ def validate_parameter_name(value): raise cv.Invalid(f"Script's parameter name cannot be {CONF_ID}") -ALLOWED_PARAM_TYPE_CHARSET = set("abcdefghijklmnopqrstuvwxyz0123456789_:*&[]") +ALLOWED_PARAM_TYPE_CHARSET = set("abcdefghijklmnopqrstuvwxyz0123456789_:*&[]<>") def validate_parameter_type(value): From 0f49b58e0a727284c055246188a4ce9fee687eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Mon, 24 Jun 2024 06:32:20 +0200 Subject: [PATCH 104/151] [http_request] memory leak fix (#6973) --- esphome/components/http_request/http_request.h | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index df6bc7dea7..6281adddb6 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -149,6 +149,7 @@ template class HttpRequestSendAction : public Action { } response_body.reserve(read_index); response_body.assign((char *) buf, read_index); + allocator.deallocate(buf, max_length); } } From 7ee1406f64a04807bf1737cbd407f978744004ab Mon Sep 17 00:00:00 2001 From: Brian Kaufman Date: Sun, 23 Jun 2024 21:54:30 -0700 Subject: [PATCH 105/151] Await cg.get_variable in Update component (#6974) --- esphome/components/update/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index 20a9373a06..45bf082fa4 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -69,7 +69,7 @@ async def setup_update_core_(var, config): await mqtt.register_mqtt_component(mqtt_, config) if web_server_id_config := config.get(CONF_WEB_SERVER_ID): - web_server_ = cg.get_variable(web_server_id_config) + web_server_ = await cg.get_variable(web_server_id_config) web_server.add_entity_to_sorting_list(web_server_, var, config) From f7af51b92c9d3fee019f2ff5abda5880cf18061e Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Mon, 24 Jun 2024 10:22:07 +0400 Subject: [PATCH 106/151] [haier] climate ID auto generation (#6949) --- esphome/components/haier/binary_sensor/__init__.py | 8 ++++---- esphome/components/haier/button/__init__.py | 2 +- esphome/components/haier/climate.py | 11 +++-------- esphome/components/haier/sensor/__init__.py | 10 +++++----- esphome/components/haier/text_sensor/__init__.py | 8 ++++---- tests/components/haier/test.esp32-c3-ard.yaml | 4 ---- tests/components/haier/test.esp32-c3-idf.yaml | 4 ---- tests/components/haier/test.esp32-idf.yaml | 4 ---- tests/components/haier/test.esp8266-ard.yaml | 4 ---- tests/components/haier/test.rp2040-ard.yaml | 4 ---- 10 files changed, 17 insertions(+), 42 deletions(-) diff --git a/esphome/components/haier/binary_sensor/__init__.py b/esphome/components/haier/binary_sensor/__init__.py index 8e9d5ec578..3a4935b22d 100644 --- a/esphome/components/haier/binary_sensor/__init__.py +++ b/esphome/components/haier/binary_sensor/__init__.py @@ -56,7 +56,7 @@ SENSOR_TYPES = { CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), } ).extend({cv.Optional(type): schema for type, schema in SENSOR_TYPES.items()}) @@ -64,8 +64,8 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): paren = await cg.get_variable(config[CONF_HAIER_ID]) - for type, _ in SENSOR_TYPES.items(): - if conf := config.get(type): + for type_ in SENSOR_TYPES: + if conf := config.get(type_): sens = await binary_sensor.new_binary_sensor(conf) - binary_sensor_type = getattr(BinarySensorTypeEnum, type.upper()) + binary_sensor_type = getattr(BinarySensorTypeEnum, type_.upper()) cg.add(paren.set_sub_binary_sensor(binary_sensor_type, sens)) diff --git a/esphome/components/haier/button/__init__.py b/esphome/components/haier/button/__init__.py index efe6180aaf..745ad95fb6 100644 --- a/esphome/components/haier/button/__init__.py +++ b/esphome/components/haier/button/__init__.py @@ -21,7 +21,7 @@ ICON_SPRAY_BOTTLE = "mdi:spray-bottle" CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), cv.Optional(CONF_SELF_CLEANING): button.button_schema( SelfCleaningButton, icon=ICON_SPRAY_BOTTLE, diff --git a/esphome/components/haier/climate.py b/esphome/components/haier/climate.py index 1562708a4f..3dcb35708c 100644 --- a/esphome/components/haier/climate.py +++ b/esphome/components/haier/climate.py @@ -183,7 +183,6 @@ BASE_CONFIG_SCHEMA = ( cv.Optional( CONF_SUPPORTED_SWING_MODES, default=[ - "OFF", "VERTICAL", "HORIZONTAL", "BOTH", @@ -211,7 +210,7 @@ CONFIG_SCHEMA = cv.All( ): cv.boolean, cv.Optional( CONF_SUPPORTED_PRESETS, - default=list(["BOOST", "COMFORT"]), # No AWAY by default + default=["BOOST", "COMFORT"], # No AWAY by default ): cv.ensure_list( cv.enum(SUPPORTED_CLIMATE_PRESETS_SMARTAIR2_OPTIONS, upper=True) ), @@ -231,7 +230,7 @@ CONFIG_SCHEMA = cv.All( ): cv.int_range(min=PROTOCOL_CONTROL_PACKET_SIZE, max=50), cv.Optional( CONF_SUPPORTED_PRESETS, - default=list(["BOOST", "ECO", "SLEEP"]), # No AWAY by default + default=["BOOST", "ECO", "SLEEP"], # No AWAY by default ): cv.ensure_list( cv.enum(SUPPORTED_CLIMATE_PRESETS_HON_OPTIONS, upper=True) ), @@ -427,11 +426,7 @@ def _final_validate(config): "No logger component found, logging for Haier protocol is disabled" ) cg.add_build_flag("-DHAIER_LOG_LEVEL=0") - if ( - (CONF_WIFI_SIGNAL in config) - and (config[CONF_WIFI_SIGNAL]) - and CONF_WIFI not in full_config - ): + if config.get(CONF_WIFI_SIGNAL) and CONF_WIFI not in full_config: raise cv.Invalid( f"No WiFi configured, if you want to use haier climate without WiFi add {CONF_WIFI_SIGNAL}: false to climate configuration" ) diff --git a/esphome/components/haier/sensor/__init__.py b/esphome/components/haier/sensor/__init__.py index b2717631e0..23c1d6f008 100644 --- a/esphome/components/haier/sensor/__init__.py +++ b/esphome/components/haier/sensor/__init__.py @@ -137,16 +137,16 @@ SENSOR_TYPES = { CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), } -).extend({cv.Optional(type): schema for type, schema in SENSOR_TYPES.items()}) +).extend({cv.Optional(type_): schema for type_, schema in SENSOR_TYPES.items()}) async def to_code(config): paren = await cg.get_variable(config[CONF_HAIER_ID]) - for type, _ in SENSOR_TYPES.items(): - if conf := config.get(type): + for type_ in SENSOR_TYPES: + if conf := config.get(type_): sens = await sensor.new_sensor(conf) - sensor_type = getattr(SensorTypeEnum, type.upper()) + sensor_type = getattr(SensorTypeEnum, type_.upper()) cg.add(paren.set_sub_sensor(sensor_type, sens)) diff --git a/esphome/components/haier/text_sensor/__init__.py b/esphome/components/haier/text_sensor/__init__.py index 528b70d83e..d28c5a8c0e 100644 --- a/esphome/components/haier/text_sensor/__init__.py +++ b/esphome/components/haier/text_sensor/__init__.py @@ -39,7 +39,7 @@ TEXT_SENSOR_TYPES = { CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), } ).extend({cv.Optional(type): schema for type, schema in TEXT_SENSOR_TYPES.items()}) @@ -47,8 +47,8 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): paren = await cg.get_variable(config[CONF_HAIER_ID]) - for type, _ in TEXT_SENSOR_TYPES.items(): - if conf := config.get(type): + for type_ in TEXT_SENSOR_TYPES: + if conf := config.get(type_): sens = await text_sensor.new_text_sensor(conf) - text_sensor_type = getattr(TextSensorTypeEnum, type.upper()) + text_sensor_type = getattr(TextSensorTypeEnum, type_.upper()) cg.add(paren.set_sub_text_sensor(text_sensor_type, sens)) diff --git a/tests/components/haier/test.esp32-c3-ard.yaml b/tests/components/haier/test.esp32-c3-ard.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.esp32-c3-ard.yaml +++ b/tests/components/haier/test.esp32-c3-ard.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.esp32-c3-idf.yaml b/tests/components/haier/test.esp32-c3-idf.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.esp32-c3-idf.yaml +++ b/tests/components/haier/test.esp32-c3-idf.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.esp32-idf.yaml b/tests/components/haier/test.esp32-idf.yaml index efff532d25..54e384f3ce 100644 --- a/tests/components/haier/test.esp32-idf.yaml +++ b/tests/components/haier/test.esp32-idf.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.esp8266-ard.yaml b/tests/components/haier/test.esp8266-ard.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.esp8266-ard.yaml +++ b/tests/components/haier/test.esp8266-ard.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.rp2040-ard.yaml b/tests/components/haier/test.rp2040-ard.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.rp2040-ard.yaml +++ b/tests/components/haier/test.rp2040-ard.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: From b1868123db2107a84ad093a6776e4f096829ba1a Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Mon, 24 Jun 2024 04:21:28 -0700 Subject: [PATCH 107/151] fix potential hang (#6976) Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index b4e69e975a..36eaf2160a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -94,13 +94,15 @@ bool HOT IRAM_ATTR GPIOOneWireBus::read_bit_() { // measure from start value directly, to get best accurate timing no matter // how long pin_mode/delayMicroseconds took - delayMicroseconds(12 - (micros() - start)); + uint32_t now = micros(); + if (now - start < 12) + delayMicroseconds(12 - (now - start)); // sample bus to read bit from peer bool r = pin_.digital_read(); // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked - uint32_t now = micros(); + now = micros(); if (now - start < 60) delayMicroseconds(60 - (now - start)); From 78450da6f33366735aeb8da0521c2791160ac12d Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Tue, 25 Jun 2024 00:04:58 +0400 Subject: [PATCH 108/151] [midea] fix fan speed compatibility with some models (#6978) --- esphome/components/midea/climate.py | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/midea/climate.py b/esphome/components/midea/climate.py index 83540a061a..e5612796a3 100644 --- a/esphome/components/midea/climate.py +++ b/esphome/components/midea/climate.py @@ -293,4 +293,4 @@ async def to_code(config): if CONF_HUMIDITY_SETPOINT in config: sens = await sensor.new_sensor(config[CONF_HUMIDITY_SETPOINT]) cg.add(var.set_humidity_setpoint_sensor(sens)) - cg.add_library("dudanov/MideaUART", "1.1.8") + cg.add_library("dudanov/MideaUART", "1.1.9") diff --git a/platformio.ini b/platformio.ini index ee82dee243..e106114ff6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,7 +64,7 @@ lib_deps = freekode/TM1651@1.0.1 ; tm1651 glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr - dudanov/MideaUART@1.1.8 ; midea + dudanov/MideaUART@1.1.9 ; midea tonia/HeatpumpIR@1.0.23 ; heatpumpir build_flags = ${common.build_flags} From a21dab334c48da775189085d7206fe88ecdaa3a5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:09:00 +1200 Subject: [PATCH 109/151] [core] Fix package merging with lists of primitives (#6952) --- esphome/config_helpers.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/config_helpers.py b/esphome/config_helpers.py index b5e0b26143..54242bc259 100644 --- a/esphome/config_helpers.py +++ b/esphome/config_helpers.py @@ -58,17 +58,21 @@ def merge_config(full_old, full_new): ids = { v_id: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, str) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, str) } extend_ids = { v_id.value: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, Extend) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, Extend) } ids_to_delete = [] for v in new: - if new_id := v.get(CONF_ID): + if isinstance(v, dict) and (new_id := v.get(CONF_ID)): if isinstance(new_id, Extend): new_id = new_id.value if new_id in ids: From 7dbc20b776c56c6cce910e25fe6f12871e9d9b47 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:59:52 +1200 Subject: [PATCH 110/151] [update] Set entity_category to config & Publish state to logs (#6954) --- esphome/components/update/__init__.py | 5 ++++ esphome/components/update/update_entity.cpp | 26 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ea1cf778b6..20a9373a06 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -4,11 +4,13 @@ import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( CONF_DEVICE_CLASS, + CONF_ENTITY_CATEGORY, CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, + ENTITY_CATEGORY_CONFIG, ) from esphome.core import CORE, coroutine_with_priority from esphome.cpp_helpers import setup_entity @@ -41,6 +43,9 @@ UPDATE_SCHEMA = ( cv.Optional(CONF_ON_UPDATE_AVAILABLE): automation.validate_automation( single=True ), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ) ) diff --git a/esphome/components/update/update_entity.cpp b/esphome/components/update/update_entity.cpp index 501cb6635f..ed9a0480d8 100644 --- a/esphome/components/update/update_entity.cpp +++ b/esphome/components/update/update_entity.cpp @@ -1,9 +1,35 @@ #include "update_entity.h" +#include "esphome/core/log.h" + namespace esphome { namespace update { +static const char *const TAG = "update"; + void UpdateEntity::publish_state() { + ESP_LOGD(TAG, "'%s' - Publishing:", this->name_.c_str()); + ESP_LOGD(TAG, " Current Version: %s", this->update_info_.current_version.c_str()); + + if (!this->update_info_.md5.empty()) { + ESP_LOGD(TAG, " Latest Version: %s", this->update_info_.latest_version.c_str()); + } + if (!this->update_info_.firmware_url.empty()) { + ESP_LOGD(TAG, " Firmware URL: %s", this->update_info_.firmware_url.c_str()); + } + + ESP_LOGD(TAG, " Title: %s", this->update_info_.title.c_str()); + if (!this->update_info_.summary.empty()) { + ESP_LOGD(TAG, " Summary: %s", this->update_info_.summary.c_str()); + } + if (!this->update_info_.release_url.empty()) { + ESP_LOGD(TAG, " Release URL: %s", this->update_info_.release_url.c_str()); + } + + if (this->update_info_.has_progress) { + ESP_LOGD(TAG, " Progress: %.0f%%", this->update_info_.progress); + } + this->has_state_ = true; this->state_callback_.call(); } From ae2962259ec004777ecfb96cd409bba85b56e0d4 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:18:43 -0400 Subject: [PATCH 111/151] Fix infinite loop in http_request for ESP-IDF. (#6963) --- esphome/components/http_request/http_request_idf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 138e0438f4..d6fac7a133 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -90,7 +90,7 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin int write_left = body_len; int write_index = 0; const char *buf = body.c_str(); - while (body_len > 0) { + while (write_left > 0) { int written = esp_http_client_write(client, buf + write_index, write_left); if (written < 0) { err = ESP_FAIL; From 96d63de292eba3fa4c6c820faf1b482e0fff205e Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:28:11 -0400 Subject: [PATCH 112/151] ESP-IDF 4.x expects seconds for esp_task_wdt_init(), not milliseconds. (#6964) --- esphome/components/http_request/watchdog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/watchdog.cpp b/esphome/components/http_request/watchdog.cpp index e609feb4dd..a8519c59ed 100644 --- a/esphome/components/http_request/watchdog.cpp +++ b/esphome/components/http_request/watchdog.cpp @@ -46,7 +46,7 @@ void WatchdogManager::set_timeout_(uint32_t timeout_ms) { }; esp_task_wdt_reconfigure(&wdt_config); #else - esp_task_wdt_init(timeout_ms, true); + esp_task_wdt_init(timeout_ms / 1000, true); #endif // ESP_IDF_VERSION_MAJOR #endif // USE_ESP32 From 0d3cf5cb7809e13de16c5edb75c0437705efa4ce Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Sat, 22 Jun 2024 04:57:27 -0700 Subject: [PATCH 113/151] Onewire (#6967) * retry scan * setup pin and log retries * fix retries * remove retries --------- Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index 34c2cf3c29..b4e69e975a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -9,6 +9,10 @@ static const char *const TAG = "gpio.one_wire"; void GPIOOneWireBus::setup() { ESP_LOGCONFIG(TAG, "Setting up 1-wire bus..."); + this->t_pin_->setup(); + // clear bus with 480µs high, otherwise initial reset in search might fail + this->t_pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + delayMicroseconds(480); this->search(); } From e39961f7f1c329ae70422ded669b548c43226d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Mon, 24 Jun 2024 06:32:20 +0200 Subject: [PATCH 114/151] [http_request] memory leak fix (#6973) --- esphome/components/http_request/http_request.h | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index df6bc7dea7..6281adddb6 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -149,6 +149,7 @@ template class HttpRequestSendAction : public Action { } response_body.reserve(read_index); response_body.assign((char *) buf, read_index); + allocator.deallocate(buf, max_length); } } From 5bd5b777a6ff949f539b9e58ed537b223e40020e Mon Sep 17 00:00:00 2001 From: Brian Kaufman Date: Sun, 23 Jun 2024 21:54:30 -0700 Subject: [PATCH 115/151] Await cg.get_variable in Update component (#6974) --- esphome/components/update/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index 20a9373a06..45bf082fa4 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -69,7 +69,7 @@ async def setup_update_core_(var, config): await mqtt.register_mqtt_component(mqtt_, config) if web_server_id_config := config.get(CONF_WEB_SERVER_ID): - web_server_ = cg.get_variable(web_server_id_config) + web_server_ = await cg.get_variable(web_server_id_config) web_server.add_entity_to_sorting_list(web_server_, var, config) From c5aae8ee254f3e16ed204912457637ba62743818 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Mon, 24 Jun 2024 04:21:28 -0700 Subject: [PATCH 116/151] fix potential hang (#6976) Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index b4e69e975a..36eaf2160a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -94,13 +94,15 @@ bool HOT IRAM_ATTR GPIOOneWireBus::read_bit_() { // measure from start value directly, to get best accurate timing no matter // how long pin_mode/delayMicroseconds took - delayMicroseconds(12 - (micros() - start)); + uint32_t now = micros(); + if (now - start < 12) + delayMicroseconds(12 - (now - start)); // sample bus to read bit from peer bool r = pin_.digital_read(); // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked - uint32_t now = micros(); + now = micros(); if (now - start < 60) delayMicroseconds(60 - (now - start)); From a6e1ef2dd144dff244800fa00624285c8bd6e70e Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Tue, 25 Jun 2024 00:04:58 +0400 Subject: [PATCH 117/151] [midea] fix fan speed compatibility with some models (#6978) --- esphome/components/midea/climate.py | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/midea/climate.py b/esphome/components/midea/climate.py index 83540a061a..e5612796a3 100644 --- a/esphome/components/midea/climate.py +++ b/esphome/components/midea/climate.py @@ -293,4 +293,4 @@ async def to_code(config): if CONF_HUMIDITY_SETPOINT in config: sens = await sensor.new_sensor(config[CONF_HUMIDITY_SETPOINT]) cg.add(var.set_humidity_setpoint_sensor(sens)) - cg.add_library("dudanov/MideaUART", "1.1.8") + cg.add_library("dudanov/MideaUART", "1.1.9") diff --git a/platformio.ini b/platformio.ini index 6b34b2f05d..14e9ea9fc6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,7 +64,7 @@ lib_deps = freekode/TM1651@1.0.1 ; tm1651 glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr - dudanov/MideaUART@1.1.8 ; midea + dudanov/MideaUART@1.1.9 ; midea tonia/HeatpumpIR@1.0.23 ; heatpumpir build_flags = ${common.build_flags} From 09a947beaa45b45f71dbfb3aac06de2b138abebf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 08:57:38 +1200 Subject: [PATCH 118/151] Bump version to 2024.6.2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 3b3bdd1a17..cde917ca98 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.1" +__version__ = "2024.6.2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 11b8e2e1af4af190f407cdd0922f778899e19412 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:43:30 +1200 Subject: [PATCH 119/151] [core] Add script to extract actions, conditions, and pin_providers (#6929) --- script/extract_automations.py | 25 +++++++++++++++++++++++ script/list-components.py | 38 ++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 18 deletions(-) create mode 100755 script/extract_automations.py diff --git a/script/extract_automations.py b/script/extract_automations.py new file mode 100755 index 0000000000..943eb7110a --- /dev/null +++ b/script/extract_automations.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import json + +from helpers import git_ls_files + +from esphome.automation import ACTION_REGISTRY, CONDITION_REGISTRY +from esphome.pins import PIN_SCHEMA_REGISTRY + +list_components = __import__("list-components") + + +if __name__ == "__main__": + files = git_ls_files() + files = filter(list_components.filter_component_files, files) + + components = list_components.get_components(files, True) + + dump = { + "actions": sorted(list(ACTION_REGISTRY.keys())), + "conditions": sorted(list(CONDITION_REGISTRY.keys())), + "pin_providers": sorted(list(PIN_SCHEMA_REGISTRY.keys())), + } + + print(json.dumps(dump, indent=2)) diff --git a/script/list-components.py b/script/list-components.py index 5b5fa5811f..4eccdbf96c 100755 --- a/script/list-components.py +++ b/script/list-components.py @@ -50,6 +50,7 @@ def create_components_graph(): {KEY_TARGET_FRAMEWORK: "arduino", KEY_TARGET_PLATFORM: None}, {KEY_TARGET_FRAMEWORK: "esp-idf", KEY_TARGET_PLATFORM: None}, {KEY_TARGET_FRAMEWORK: None, KEY_TARGET_PLATFORM: PLATFORM_ESP32}, + {KEY_TARGET_FRAMEWORK: None, KEY_TARGET_PLATFORM: PLATFORM_ESP8266}, ] CORE.data[KEY_CORE] = TARGET_CONFIGURATIONS[0] @@ -119,6 +120,23 @@ def find_children_of_component(components_graph, component_name, depth=0): return list(set(children)) +def get_components(files: list[str], get_dependencies: bool = False): + components = extract_component_names_array_from_files_array(files) + + if get_dependencies: + components_graph = create_components_graph() + + all_components = components.copy() + for c in components: + all_components.extend(find_children_of_component(components_graph, c)) + # Remove duplicate values + all_changed_components = list(set(all_components)) + + return sorted(all_changed_components) + + return sorted(components) + + def main(): parser = argparse.ArgumentParser() parser.add_argument( @@ -142,24 +160,8 @@ def main(): changed = changed_files() files = [f for f in files if f in changed] - components = extract_component_names_array_from_files_array(files) - - if args.changed: - components_graph = create_components_graph() - - all_changed_components = components.copy() - for c in components: - all_changed_components.extend( - find_children_of_component(components_graph, c) - ) - # Remove duplicate values - all_changed_components = list(set(all_changed_components)) - - for c in sorted(all_changed_components): - print(c) - else: - for c in sorted(components): - print(c) + for c in get_components(files, args.changed): + print(c) if __name__ == "__main__": From 8a25bedaf9323c6e1f62a9324b46344d9292ed24 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:42:55 +1200 Subject: [PATCH 120/151] [external_files] Move common ``download_content`` function to ``external_files.py`` (#6982) --- esphome/components/font/__init__.py | 30 ++------------------------- esphome/components/image/__init__.py | 31 ++-------------------------- esphome/external_files.py | 26 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/esphome/components/font/__init__.py b/esphome/components/font/__init__.py index b3a5beb199..7e4674ffda 100644 --- a/esphome/components/font/__init__.py +++ b/esphome/components/font/__init__.py @@ -17,7 +17,6 @@ from esphome.helpers import ( cpp_string_escape, ) from esphome.const import ( - __version__, CONF_FAMILY, CONF_FILE, CONF_GLYPHS, @@ -185,31 +184,6 @@ def get_font_path(value, type) -> Path: return None -def download_content(url: str, path: Path) -> None: - if not external_files.has_remote_file_changed(url, path): - _LOGGER.debug("Remote file has not changed %s", url) - return - - _LOGGER.debug( - "Remote file has changed, downloading from %s to %s", - url, - path, - ) - - try: - req = requests.get( - url, - timeout=external_files.NETWORK_TIMEOUT, - headers={"User-agent": f"ESPHome/{__version__} (https://esphome.io)"}, - ) - req.raise_for_status() - except requests.exceptions.RequestException as e: - raise cv.Invalid(f"Could not download from {url}: {e}") - - path.parent.mkdir(parents=True, exist_ok=True) - path.write_bytes(req.content) - - def download_gfont(value): name = ( f"{value[CONF_FAMILY]}:ital,wght@{int(value[CONF_ITALIC])},{value[CONF_WEIGHT]}" @@ -236,7 +210,7 @@ def download_gfont(value): ttf_url = match.group(1) _LOGGER.debug("download_gfont: ttf_url=%s", ttf_url) - download_content(ttf_url, path) + external_files.download_content(ttf_url, path) return value @@ -244,7 +218,7 @@ def download_web_font(value): url = value[CONF_URL] path = get_font_path(value, TYPE_WEB) - download_content(url, path) + external_files.download_content(url, path) _LOGGER.debug("download_web_font: path=%s", path) return value diff --git a/esphome/components/image/__init__.py b/esphome/components/image/__init__.py index c275136427..e5a205f1e0 100644 --- a/esphome/components/image/__init__.py +++ b/esphome/components/image/__init__.py @@ -6,7 +6,6 @@ import hashlib import io from pathlib import Path import re -import requests from magic import Magic from esphome import core @@ -15,7 +14,6 @@ from esphome import external_files import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( - __version__, CONF_DITHER, CONF_FILE, CONF_ICON, @@ -75,31 +73,6 @@ def compute_local_image_path(value: dict) -> Path: return base_dir / key -def download_content(url: str, path: Path) -> None: - if not external_files.has_remote_file_changed(url, path): - _LOGGER.debug("Remote file has not changed %s", url) - return - - _LOGGER.debug( - "Remote file has changed, downloading from %s to %s", - url, - path, - ) - - try: - req = requests.get( - url, - timeout=IMAGE_DOWNLOAD_TIMEOUT, - headers={"User-agent": f"ESPHome/{__version__} (https://esphome.io)"}, - ) - req.raise_for_status() - except requests.exceptions.RequestException as e: - raise cv.Invalid(f"Could not download from {url}: {e}") - - path.parent.mkdir(parents=True, exist_ok=True) - path.write_bytes(req.content) - - def download_mdi(value): validate_cairosvg_installed(value) @@ -108,7 +81,7 @@ def download_mdi(value): url = f"https://raw.githubusercontent.com/Templarian/MaterialDesign/master/svg/{mdi_id}.svg" - download_content(url, path) + external_files.download_content(url, path, IMAGE_DOWNLOAD_TIMEOUT) return value @@ -117,7 +90,7 @@ def download_image(value): url = value[CONF_URL] path = compute_local_image_path(value) - download_content(url, path) + external_files.download_content(url, path, IMAGE_DOWNLOAD_TIMEOUT) return value diff --git a/esphome/external_files.py b/esphome/external_files.py index a1422d02b1..f8eb1dcabe 100644 --- a/esphome/external_files.py +++ b/esphome/external_files.py @@ -7,6 +7,7 @@ from datetime import datetime import requests import esphome.config_validation as cv from esphome.core import CORE, TimePeriodSeconds +from esphome.const import __version__ _LOGGER = logging.getLogger(__name__) CODEOWNERS = ["@landonr"] @@ -75,3 +76,28 @@ def compute_local_file_dir(domain: str) -> Path: base_directory.mkdir(parents=True, exist_ok=True) return base_directory + + +def download_content(url: str, path: Path, timeout=NETWORK_TIMEOUT) -> None: + if not has_remote_file_changed(url, path): + _LOGGER.debug("Remote file has not changed %s", url) + return + + _LOGGER.debug( + "Remote file has changed, downloading from %s to %s", + url, + path, + ) + + try: + req = requests.get( + url, + timeout=timeout, + headers={"User-agent": f"ESPHome/{__version__} (https://esphome.io)"}, + ) + req.raise_for_status() + except requests.exceptions.RequestException as e: + raise cv.Invalid(f"Could not download from {url}: {e}") + + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(req.content) From c9a0daf4b6435533bf14594c0b579f829719aa15 Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:05:37 +0200 Subject: [PATCH 121/151] Do not build mDNS when mDNS is disabled via yaml (#6979) --- esphome/components/mdns/__init__.py | 6 +++--- esphome/components/mdns/mdns_component.cpp | 4 +++- esphome/components/mdns/mdns_component.h | 4 +++- esphome/components/mdns/mdns_esp32.cpp | 3 ++- esphome/components/mdns/mdns_esp8266.cpp | 3 ++- esphome/components/mdns/mdns_host.cpp | 3 ++- esphome/components/mdns/mdns_libretiny.cpp | 3 ++- esphome/components/mdns/mdns_rp2040.cpp | 3 ++- 8 files changed, 19 insertions(+), 10 deletions(-) diff --git a/esphome/components/mdns/__init__.py b/esphome/components/mdns/__init__.py index 82cf087fdc..fb90986314 100644 --- a/esphome/components/mdns/__init__.py +++ b/esphome/components/mdns/__init__.py @@ -74,6 +74,9 @@ def mdns_service( @coroutine_with_priority(55.0) async def to_code(config): + if config[CONF_DISABLED] is True: + return + if CORE.using_arduino: if CORE.is_esp32: cg.add_library("ESPmDNS", None) @@ -92,9 +95,6 @@ async def to_code(config): path="components/mdns", ) - if config[CONF_DISABLED]: - return - cg.add_define("USE_MDNS") var = cg.new_Pvariable(config[CONF_ID]) diff --git a/esphome/components/mdns/mdns_component.cpp b/esphome/components/mdns/mdns_component.cpp index e2e562670b..2fc09330cd 100644 --- a/esphome/components/mdns/mdns_component.cpp +++ b/esphome/components/mdns/mdns_component.cpp @@ -1,5 +1,6 @@ -#include "mdns_component.h" #include "esphome/core/defines.h" +#ifdef USE_MDNS +#include "mdns_component.h" #include "esphome/core/version.h" #include "esphome/core/application.h" #include "esphome/core/log.h" @@ -125,3 +126,4 @@ void MDNSComponent::dump_config() { } // namespace mdns } // namespace esphome +#endif diff --git a/esphome/components/mdns/mdns_component.h b/esphome/components/mdns/mdns_component.h index b2cb10db62..dfb5b72292 100644 --- a/esphome/components/mdns/mdns_component.h +++ b/esphome/components/mdns/mdns_component.h @@ -1,5 +1,6 @@ #pragma once - +#include "esphome/core/defines.h" +#ifdef USE_MDNS #include #include #include "esphome/core/component.h" @@ -46,3 +47,4 @@ class MDNSComponent : public Component { } // namespace mdns } // namespace esphome +#endif diff --git a/esphome/components/mdns/mdns_esp32.cpp b/esphome/components/mdns/mdns_esp32.cpp index 6081c96637..8006eb27f1 100644 --- a/esphome/components/mdns/mdns_esp32.cpp +++ b/esphome/components/mdns/mdns_esp32.cpp @@ -1,4 +1,5 @@ -#ifdef USE_ESP32 +#include "esphome/core/defines.h" +#if defined(USE_ESP32) && defined(USE_MDNS) #include #include diff --git a/esphome/components/mdns/mdns_esp8266.cpp b/esphome/components/mdns/mdns_esp8266.cpp index 5ff1b86341..7b6e7ec448 100644 --- a/esphome/components/mdns/mdns_esp8266.cpp +++ b/esphome/components/mdns/mdns_esp8266.cpp @@ -1,4 +1,5 @@ -#if defined(USE_ESP8266) && defined(USE_ARDUINO) +#include "esphome/core/defines.h" +#if defined(USE_ESP8266) && defined(USE_ARDUINO) && defined(USE_MDNS) #include #include "esphome/components/network/ip_address.h" diff --git a/esphome/components/mdns/mdns_host.cpp b/esphome/components/mdns/mdns_host.cpp index 3f89146f02..78767ed136 100644 --- a/esphome/components/mdns/mdns_host.cpp +++ b/esphome/components/mdns/mdns_host.cpp @@ -1,4 +1,5 @@ -#ifdef USE_HOST +#include "esphome/core/defines.h" +#if defined(USE_HOST) && defined(USE_MDNS) #include "esphome/components/network/ip_address.h" #include "esphome/components/network/util.h" diff --git a/esphome/components/mdns/mdns_libretiny.cpp b/esphome/components/mdns/mdns_libretiny.cpp index ccb79c88b9..c9a9a289dd 100644 --- a/esphome/components/mdns/mdns_libretiny.cpp +++ b/esphome/components/mdns/mdns_libretiny.cpp @@ -1,4 +1,5 @@ -#ifdef USE_LIBRETINY +#include "esphome/core/defines.h" +#if defined(USE_LIBRETINY) && defined(USE_MDNS) #include "esphome/components/network/ip_address.h" #include "esphome/components/network/util.h" diff --git a/esphome/components/mdns/mdns_rp2040.cpp b/esphome/components/mdns/mdns_rp2040.cpp index 56afd6f5e1..89e668ee59 100644 --- a/esphome/components/mdns/mdns_rp2040.cpp +++ b/esphome/components/mdns/mdns_rp2040.cpp @@ -1,4 +1,5 @@ -#ifdef USE_RP2040 +#include "esphome/core/defines.h" +#if defined(USE_RP2040) && defined(USE_MDNS) #include "esphome/components/network/ip_address.h" #include "esphome/components/network/util.h" From 481cf7384ae081e2cabe568cba31a6a6dde68754 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:07:19 +1200 Subject: [PATCH 122/151] [safe_mode] Set safe mode core data in disabled cases (#6983) --- esphome/components/safe_mode/__init__.py | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index 881937890d..185c0e70b1 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -56,21 +56,20 @@ CONFIG_SCHEMA = cv.All( @coroutine_with_priority(50.0) async def to_code(config): - if config[CONF_DISABLED]: - return + if not config[CONF_DISABLED]: + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) + for conf in config.get(CONF_ON_SAFE_MODE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [], conf) - for conf in config.get(CONF_ON_SAFE_MODE, []): - trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) - await automation.build_automation(trigger, [], conf) + condition = var.should_enter_safe_mode( + config[CONF_NUM_ATTEMPTS], + config[CONF_REBOOT_TIMEOUT], + config[CONF_BOOT_IS_GOOD_AFTER], + ) + cg.add(RawExpression(f"if ({condition}) return")) - condition = var.should_enter_safe_mode( - config[CONF_NUM_ATTEMPTS], - config[CONF_REBOOT_TIMEOUT], - config[CONF_BOOT_IS_GOOD_AFTER], - ) - cg.add(RawExpression(f"if ({condition}) return")) CORE.data[CONF_SAFE_MODE] = {} CORE.data[CONF_SAFE_MODE][KEY_PAST_SAFE_MODE] = True From fb9844463b53d3aee6fd5e67bd5f71a7568c6a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Tue, 25 Jun 2024 11:08:57 +0200 Subject: [PATCH 123/151] Bump HeatpumpIR and IRremoteESP8266 (#6948) --- esphome/components/heatpumpir/climate.py | 10 ++++++++-- esphome/components/heatpumpir/heatpumpir.cpp | 6 ++++++ esphome/components/heatpumpir/heatpumpir.h | 6 ++++++ platformio.ini | 6 +++--- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/esphome/components/heatpumpir/climate.py b/esphome/components/heatpumpir/climate.py index 8af4ca590f..b86d405b7e 100644 --- a/esphome/components/heatpumpir/climate.py +++ b/esphome/components/heatpumpir/climate.py @@ -34,6 +34,7 @@ PROTOCOLS = { "greeyan": Protocol.PROTOCOL_GREEYAN, "greeyac": Protocol.PROTOCOL_GREEYAC, "greeyt": Protocol.PROTOCOL_GREEYT, + "greeyap": Protocol.PROTOCOL_GREEYAP, "hisense_aud": Protocol.PROTOCOL_HISENSE_AUD, "hitachi": Protocol.PROTOCOL_HITACHI, "hyundai": Protocol.PROTOCOL_HYUNDAI, @@ -61,6 +62,11 @@ PROTOCOLS = { "toshiba_daiseikai": Protocol.PROTOCOL_TOSHIBA_DAISEIKAI, "toshiba": Protocol.PROTOCOL_TOSHIBA, "zhlt01": Protocol.PROTOCOL_ZHLT01, + "nibe": Protocol.PROTOCOL_NIBE, + "carrier_qlima_1": Protocol.PROTOCOL_QLIMA_1, + "carrier_qlima_2": Protocol.PROTOCOL_QLIMA_2, + "samsung_aqv12msan": Protocol.PROTOCOL_SAMSUNG_AQV12MSAN, + "zhjg01": Protocol.PROTOCOL_ZHJG01, } CONF_HORIZONTAL_DEFAULT = "horizontal_default" @@ -116,7 +122,7 @@ def to_code(config): cg.add(var.set_max_temperature(config[CONF_MAX_TEMPERATURE])) cg.add(var.set_min_temperature(config[CONF_MIN_TEMPERATURE])) - cg.add_library("tonia/HeatpumpIR", "1.0.23") + cg.add_library("tonia/HeatpumpIR", "1.0.26") if CORE.is_esp8266 or CORE.is_esp32: - cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.4") + cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.6") diff --git a/esphome/components/heatpumpir/heatpumpir.cpp b/esphome/components/heatpumpir/heatpumpir.cpp index 5e7237b63c..22a5779c8d 100644 --- a/esphome/components/heatpumpir/heatpumpir.cpp +++ b/esphome/components/heatpumpir/heatpumpir.cpp @@ -28,6 +28,7 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_GREEYAN, []() { return new GreeYANHeatpumpIR(); }}, // NOLINT {PROTOCOL_GREEYAC, []() { return new GreeYACHeatpumpIR(); }}, // NOLINT {PROTOCOL_GREEYT, []() { return new GreeYTHeatpumpIR(); }}, // NOLINT + {PROTOCOL_GREEYAP, []() { return new GreeYAPHeatpumpIR(); }}, // NOLINT {PROTOCOL_HISENSE_AUD, []() { return new HisenseHeatpumpIR(); }}, // NOLINT {PROTOCOL_HITACHI, []() { return new HitachiHeatpumpIR(); }}, // NOLINT {PROTOCOL_HYUNDAI, []() { return new HyundaiHeatpumpIR(); }}, // NOLINT @@ -55,6 +56,11 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_TOSHIBA_DAISEIKAI, []() { return new ToshibaDaiseikaiHeatpumpIR(); }}, // NOLINT {PROTOCOL_TOSHIBA, []() { return new ToshibaHeatpumpIR(); }}, // NOLINT {PROTOCOL_ZHLT01, []() { return new ZHLT01HeatpumpIR(); }}, // NOLINT + {PROTOCOL_NIBE, []() { return new NibeHeatpumpIR(); }}, // NOLINT + {PROTOCOL_QLIMA_1, []() { return new Qlima1HeatpumpIR(); }}, // NOLINT + {PROTOCOL_QLIMA_2, []() { return new Qlima2HeatpumpIR(); }}, // NOLINT + {PROTOCOL_SAMSUNG_AQV12MSAN, []() { return new SamsungAQV12MSANHeatpumpIR(); }}, // NOLINT + {PROTOCOL_ZHJG01, []() { return new ZHJG01HeatpumpIR(); }}, // NOLINT }; void HeatpumpIRClimate::setup() { diff --git a/esphome/components/heatpumpir/heatpumpir.h b/esphome/components/heatpumpir/heatpumpir.h index e8b03b4c26..0e6ea2218f 100644 --- a/esphome/components/heatpumpir/heatpumpir.h +++ b/esphome/components/heatpumpir/heatpumpir.h @@ -28,6 +28,7 @@ enum Protocol { PROTOCOL_GREEYAN, PROTOCOL_GREEYAC, PROTOCOL_GREEYT, + PROTOCOL_GREEYAP, PROTOCOL_HISENSE_AUD, PROTOCOL_HITACHI, PROTOCOL_HYUNDAI, @@ -55,6 +56,11 @@ enum Protocol { PROTOCOL_TOSHIBA_DAISEIKAI, PROTOCOL_TOSHIBA, PROTOCOL_ZHLT01, + PROTOCOL_NIBE, + PROTOCOL_QLIMA_1, + PROTOCOL_QLIMA_2, + PROTOCOL_SAMSUNG_AQV12MSAN, + PROTOCOL_ZHJG01, }; // Simple enum to represent horizontal directios diff --git a/platformio.ini b/platformio.ini index e106114ff6..e2e66bf672 100644 --- a/platformio.ini +++ b/platformio.ini @@ -65,7 +65,7 @@ lib_deps = glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr dudanov/MideaUART@1.1.9 ; midea - tonia/HeatpumpIR@1.0.23 ; heatpumpir + tonia/HeatpumpIR@1.0.26 ; heatpumpir build_flags = ${common.build_flags} -DUSE_ARDUINO @@ -93,7 +93,7 @@ lib_deps = ESP8266HTTPClient ; http_request (Arduino built-in) ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) - crankyoldgit/IRremoteESP8266@~2.8.4 ; heatpumpir + crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.1 ; wireguard build_flags = ${common:arduino.build_flags} @@ -123,7 +123,7 @@ lib_deps = ESPmDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio - crankyoldgit/IRremoteESP8266@~2.8.4 ; heatpumpir + crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.1 ; wireguard build_flags = ${common:arduino.build_flags} From d8a5c1ea0c440ff488a2b6c1cd84f8440ab81e51 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Tue, 25 Jun 2024 15:57:15 -0500 Subject: [PATCH 124/151] [ota-esphome] Validate for multiple esphome ota instances (#6984) --- esphome/components/esphome/ota/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index c5903974c2..88e729f230 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,10 +1,14 @@ import esphome.codegen as cg import esphome.config_validation as cv +import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent from esphome.const import ( + CONF_ESPHOME, CONF_ID, CONF_NUM_ATTEMPTS, + CONF_OTA, CONF_PASSWORD, + CONF_PLATFORM, CONF_PORT, CONF_REBOOT_TIMEOUT, CONF_SAFE_MODE, @@ -21,6 +25,19 @@ esphome = cg.esphome_ns.namespace("esphome") ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) +def ota_esphome_final_validate(config): + fconf = fv.full_config.get()[CONF_OTA] + used_ports = [] + for ota_conf in fconf: + if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: + if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: + used_ports.append(plat_port) + else: + raise cv.Invalid( + f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + ) + + CONFIG_SCHEMA = ( cv.Schema( { @@ -50,6 +67,8 @@ CONFIG_SCHEMA = ( .extend(cv.COMPONENT_SCHEMA) ) +FINAL_VALIDATE_SCHEMA = ota_esphome_final_validate + @coroutine_with_priority(52.0) async def to_code(config): From 0179358f9cbb212d30627999a2f7233ff18e12ea Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Tue, 25 Jun 2024 19:50:54 -0400 Subject: [PATCH 125/151] Improve 'body' handling in http_request on_response triggers (#6968) --- esphome/codegen.py | 1 + esphome/components/http_request/__init__.py | 2 +- .../components/http_request/http_request.h | 19 ++++++++++++++----- esphome/cpp_types.py | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/esphome/codegen.py b/esphome/codegen.py index b552490129..6b000b53a1 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -60,6 +60,7 @@ from esphome.cpp_types import ( # noqa std_ns, std_shared_ptr, std_string, + std_string_ref, std_vector, uint8, uint16, diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 37487ec9a7..ade7024bed 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -257,7 +257,7 @@ async def http_request_action_to_code(config, action_id, template_arg, args): trigger, [ (cg.std_shared_ptr.template(HttpContainer), "response"), - (cg.std_string, "body"), + (cg.std_string_ref, "body"), ], conf, ) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index 6281adddb6..82b7392648 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -43,10 +43,10 @@ class HttpContainer : public Parented { bool secure_{false}; }; -class HttpRequestResponseTrigger : public Trigger, std::string> { +class HttpRequestResponseTrigger : public Trigger, std::string &> { public: - void process(std::shared_ptr container, std::string response_body) { - this->trigger(std::move(container), std::move(response_body)); + void process(std::shared_ptr container, std::string &response_body) { + this->trigger(std::move(container), response_body); } }; @@ -153,8 +153,17 @@ template class HttpRequestSendAction : public Action { } } - for (auto *trigger : this->response_triggers_) { - trigger->process(container, response_body); + if (this->response_triggers_.size() == 1) { + // if there is only one trigger, no need to copy the response body + this->response_triggers_[0]->process(container, response_body); + } else { + for (auto *trigger : this->response_triggers_) { + // with multiple triggers, pass a copy of the response body to each + // one so that modifications made in one trigger are not visible to + // the others + auto response_body_copy = std::string(response_body); + trigger->process(container, response_body_copy); + } } container->end(); } diff --git a/esphome/cpp_types.py b/esphome/cpp_types.py index bd79d3b2f9..dab993f87f 100644 --- a/esphome/cpp_types.py +++ b/esphome/cpp_types.py @@ -10,6 +10,7 @@ int_ = global_ns.namespace("int") std_ns = global_ns.namespace("std") std_shared_ptr = std_ns.class_("shared_ptr") std_string = std_ns.class_("string") +std_string_ref = std_ns.namespace("string &") std_vector = std_ns.class_("vector") uint8 = global_ns.namespace("uint8_t") uint16 = global_ns.namespace("uint16_t") From bc26de2d68283d0d743a1e5a08921abfa6c00820 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 25 Jun 2024 16:54:02 -0700 Subject: [PATCH 126/151] [ds1307] Initialize uninitialized struct members (#6985) --- esphome/components/ds1307/ds1307.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/esphome/components/ds1307/ds1307.cpp b/esphome/components/ds1307/ds1307.cpp index 472ccc7a9a..9df8a1d373 100644 --- a/esphome/components/ds1307/ds1307.cpp +++ b/esphome/components/ds1307/ds1307.cpp @@ -37,14 +37,18 @@ void DS1307Component::read_time() { ESP_LOGW(TAG, "RTC halted, not syncing to system clock."); return; } - ESPTime rtc_time{.second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), - .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), - .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), - .day_of_week = uint8_t(ds1307_.reg.weekday), - .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), - .day_of_year = 1, // ignored by recalc_timestamp_utc(false) - .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), - .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000)}; + ESPTime rtc_time{ + .second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), + .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), + .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), + .day_of_week = uint8_t(ds1307_.reg.weekday), + .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), + .day_of_year = 1, // ignored by recalc_timestamp_utc(false) + .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), + .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000), + .is_dst = false, // not used + .timestamp = 0 // overwritten by recalc_timestamp_utc(false) + }; rtc_time.recalc_timestamp_utc(false); if (!rtc_time.is_valid()) { ESP_LOGE(TAG, "Invalid RTC time, not syncing to system clock."); From cc4f1c667ed15f1962c6bacaa7b30c0a7f329b43 Mon Sep 17 00:00:00 2001 From: Petapton <14984292+Petapton@users.noreply.github.com> Date: Wed, 26 Jun 2024 02:08:16 +0200 Subject: [PATCH 127/151] Fix float encoding in modbus server (#6986) --- esphome/components/modbus_controller/modbus_controller.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/modbus_controller.cpp b/esphome/components/modbus_controller/modbus_controller.cpp index 9f73988b03..29d3137603 100644 --- a/esphome/components/modbus_controller/modbus_controller.cpp +++ b/esphome/components/modbus_controller/modbus_controller.cpp @@ -116,7 +116,8 @@ void ModbusController::on_modbus_read_registers(uint8_t function_code, uint16_t ESP_LOGD(TAG, "Matched register. Address: 0x%02X. Value type: %zu. Register count: %u. Value: %0.1f.", server_register->address, static_cast(server_register->value_type), server_register->register_count, value); - number_to_payload(sixteen_bit_response, value, server_register->value_type); + std::vector payload = float_to_payload(value, server_register->value_type); + sixteen_bit_response.insert(sixteen_bit_response.end(), payload.cbegin(), payload.cend()); current_address += server_register->register_count; found = true; break; From 91766afb64e804db97cc03f8ba6174e13968f742 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 26 Jun 2024 00:27:07 -0700 Subject: [PATCH 128/151] [dallas_temp] fix ds18s20 temp calc (#6988) --- .../components/dallas_temp/dallas_temp.cpp | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/esphome/components/dallas_temp/dallas_temp.cpp b/esphome/components/dallas_temp/dallas_temp.cpp index fe7c9a95ea..ae567d6a76 100644 --- a/esphome/components/dallas_temp/dallas_temp.cpp +++ b/esphome/components/dallas_temp/dallas_temp.cpp @@ -145,24 +145,21 @@ bool DallasTemperatureSensor::check_scratch_pad_() { float DallasTemperatureSensor::get_temp_c_() { int16_t temp = (this->scratch_pad_[1] << 8) | this->scratch_pad_[0]; if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { - if (this->scratch_pad_[7] != 0x10) - ESP_LOGE(TAG, "unexpected COUNT_PER_C value: %u", this->scratch_pad_[7]); - temp = ((temp & 0xfff7) << 3) + (0x10 - this->scratch_pad_[6]) - 4; - } else { - switch (this->resolution_) { - case 9: - temp &= 0xfff8; - break; - case 10: - temp &= 0xfffc; - break; - case 11: - temp &= 0xfffe; - break; - case 12: - default: - break; - } + return (temp >> 1) + (this->scratch_pad_[7] - this->scratch_pad_[6]) / float(this->scratch_pad_[7]) - 0.25; + } + switch (this->resolution_) { + case 9: + temp &= 0xfff8; + break; + case 10: + temp &= 0xfffc; + break; + case 11: + temp &= 0xfffe; + break; + case 12: + default: + break; } return temp / 16.0f; From 01bcf5fb97643d73a96fbf7119ea48a768f85b73 Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Wed, 26 Jun 2024 14:38:11 +0400 Subject: [PATCH 129/151] [modbus-text-sensor] fix potential buffer overflow (#6993) --- .../modbus_controller/text_sensor/modbus_textsensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp index 359c6e2f50..da5c0fba37 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp @@ -15,7 +15,7 @@ void ModbusTextSensor::parse_and_publish(const std::vector &data) { std::ostringstream output; uint8_t items_left = this->response_bytes; uint8_t index = this->offset; - char buffer[4]; + char buffer[5]; while ((items_left > 0) && index < data.size()) { uint8_t b = data[index]; switch (this->encode_) { From 7be071a0e91771019fce9be8704e6dffc1d6e0af Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:07:19 +1200 Subject: [PATCH 130/151] [safe_mode] Set safe mode core data in disabled cases (#6983) --- esphome/components/safe_mode/__init__.py | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index 881937890d..185c0e70b1 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -56,21 +56,20 @@ CONFIG_SCHEMA = cv.All( @coroutine_with_priority(50.0) async def to_code(config): - if config[CONF_DISABLED]: - return + if not config[CONF_DISABLED]: + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) + for conf in config.get(CONF_ON_SAFE_MODE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [], conf) - for conf in config.get(CONF_ON_SAFE_MODE, []): - trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) - await automation.build_automation(trigger, [], conf) + condition = var.should_enter_safe_mode( + config[CONF_NUM_ATTEMPTS], + config[CONF_REBOOT_TIMEOUT], + config[CONF_BOOT_IS_GOOD_AFTER], + ) + cg.add(RawExpression(f"if ({condition}) return")) - condition = var.should_enter_safe_mode( - config[CONF_NUM_ATTEMPTS], - config[CONF_REBOOT_TIMEOUT], - config[CONF_BOOT_IS_GOOD_AFTER], - ) - cg.add(RawExpression(f"if ({condition}) return")) CORE.data[CONF_SAFE_MODE] = {} CORE.data[CONF_SAFE_MODE][KEY_PAST_SAFE_MODE] = True From d8a6d8594a246fd038c6051f157c7ce2eaf8b0eb Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Tue, 25 Jun 2024 15:57:15 -0500 Subject: [PATCH 131/151] [ota-esphome] Validate for multiple esphome ota instances (#6984) --- esphome/components/esphome/ota/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index c5903974c2..88e729f230 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,10 +1,14 @@ import esphome.codegen as cg import esphome.config_validation as cv +import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent from esphome.const import ( + CONF_ESPHOME, CONF_ID, CONF_NUM_ATTEMPTS, + CONF_OTA, CONF_PASSWORD, + CONF_PLATFORM, CONF_PORT, CONF_REBOOT_TIMEOUT, CONF_SAFE_MODE, @@ -21,6 +25,19 @@ esphome = cg.esphome_ns.namespace("esphome") ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) +def ota_esphome_final_validate(config): + fconf = fv.full_config.get()[CONF_OTA] + used_ports = [] + for ota_conf in fconf: + if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: + if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: + used_ports.append(plat_port) + else: + raise cv.Invalid( + f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + ) + + CONFIG_SCHEMA = ( cv.Schema( { @@ -50,6 +67,8 @@ CONFIG_SCHEMA = ( .extend(cv.COMPONENT_SCHEMA) ) +FINAL_VALIDATE_SCHEMA = ota_esphome_final_validate + @coroutine_with_priority(52.0) async def to_code(config): From 1579dfeb80a7b49d6cc4cfeb4f52074c026621b3 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Tue, 25 Jun 2024 19:50:54 -0400 Subject: [PATCH 132/151] Improve 'body' handling in http_request on_response triggers (#6968) --- esphome/codegen.py | 1 + esphome/components/http_request/__init__.py | 2 +- .../components/http_request/http_request.h | 19 ++++++++++++++----- esphome/cpp_types.py | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/esphome/codegen.py b/esphome/codegen.py index b552490129..6b000b53a1 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -60,6 +60,7 @@ from esphome.cpp_types import ( # noqa std_ns, std_shared_ptr, std_string, + std_string_ref, std_vector, uint8, uint16, diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 37487ec9a7..ade7024bed 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -257,7 +257,7 @@ async def http_request_action_to_code(config, action_id, template_arg, args): trigger, [ (cg.std_shared_ptr.template(HttpContainer), "response"), - (cg.std_string, "body"), + (cg.std_string_ref, "body"), ], conf, ) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index 6281adddb6..82b7392648 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -43,10 +43,10 @@ class HttpContainer : public Parented { bool secure_{false}; }; -class HttpRequestResponseTrigger : public Trigger, std::string> { +class HttpRequestResponseTrigger : public Trigger, std::string &> { public: - void process(std::shared_ptr container, std::string response_body) { - this->trigger(std::move(container), std::move(response_body)); + void process(std::shared_ptr container, std::string &response_body) { + this->trigger(std::move(container), response_body); } }; @@ -153,8 +153,17 @@ template class HttpRequestSendAction : public Action { } } - for (auto *trigger : this->response_triggers_) { - trigger->process(container, response_body); + if (this->response_triggers_.size() == 1) { + // if there is only one trigger, no need to copy the response body + this->response_triggers_[0]->process(container, response_body); + } else { + for (auto *trigger : this->response_triggers_) { + // with multiple triggers, pass a copy of the response body to each + // one so that modifications made in one trigger are not visible to + // the others + auto response_body_copy = std::string(response_body); + trigger->process(container, response_body_copy); + } } container->end(); } diff --git a/esphome/cpp_types.py b/esphome/cpp_types.py index bd79d3b2f9..dab993f87f 100644 --- a/esphome/cpp_types.py +++ b/esphome/cpp_types.py @@ -10,6 +10,7 @@ int_ = global_ns.namespace("int") std_ns = global_ns.namespace("std") std_shared_ptr = std_ns.class_("shared_ptr") std_string = std_ns.class_("string") +std_string_ref = std_ns.namespace("string &") std_vector = std_ns.class_("vector") uint8 = global_ns.namespace("uint8_t") uint16 = global_ns.namespace("uint16_t") From 169fb79c977aa451655fa1840b738dfee9bfca13 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 25 Jun 2024 16:54:02 -0700 Subject: [PATCH 133/151] [ds1307] Initialize uninitialized struct members (#6985) --- esphome/components/ds1307/ds1307.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/esphome/components/ds1307/ds1307.cpp b/esphome/components/ds1307/ds1307.cpp index 472ccc7a9a..9df8a1d373 100644 --- a/esphome/components/ds1307/ds1307.cpp +++ b/esphome/components/ds1307/ds1307.cpp @@ -37,14 +37,18 @@ void DS1307Component::read_time() { ESP_LOGW(TAG, "RTC halted, not syncing to system clock."); return; } - ESPTime rtc_time{.second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), - .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), - .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), - .day_of_week = uint8_t(ds1307_.reg.weekday), - .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), - .day_of_year = 1, // ignored by recalc_timestamp_utc(false) - .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), - .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000)}; + ESPTime rtc_time{ + .second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), + .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), + .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), + .day_of_week = uint8_t(ds1307_.reg.weekday), + .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), + .day_of_year = 1, // ignored by recalc_timestamp_utc(false) + .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), + .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000), + .is_dst = false, // not used + .timestamp = 0 // overwritten by recalc_timestamp_utc(false) + }; rtc_time.recalc_timestamp_utc(false); if (!rtc_time.is_valid()) { ESP_LOGE(TAG, "Invalid RTC time, not syncing to system clock."); From bbd7c9cf861d199c7e671aa175c3d225a3bea14f Mon Sep 17 00:00:00 2001 From: Petapton <14984292+Petapton@users.noreply.github.com> Date: Wed, 26 Jun 2024 02:08:16 +0200 Subject: [PATCH 134/151] Fix float encoding in modbus server (#6986) --- esphome/components/modbus_controller/modbus_controller.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/modbus_controller.cpp b/esphome/components/modbus_controller/modbus_controller.cpp index 9f73988b03..29d3137603 100644 --- a/esphome/components/modbus_controller/modbus_controller.cpp +++ b/esphome/components/modbus_controller/modbus_controller.cpp @@ -116,7 +116,8 @@ void ModbusController::on_modbus_read_registers(uint8_t function_code, uint16_t ESP_LOGD(TAG, "Matched register. Address: 0x%02X. Value type: %zu. Register count: %u. Value: %0.1f.", server_register->address, static_cast(server_register->value_type), server_register->register_count, value); - number_to_payload(sixteen_bit_response, value, server_register->value_type); + std::vector payload = float_to_payload(value, server_register->value_type); + sixteen_bit_response.insert(sixteen_bit_response.end(), payload.cbegin(), payload.cend()); current_address += server_register->register_count; found = true; break; From c747d7d45d15469c111635045e2c95437bedccc1 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 26 Jun 2024 00:27:07 -0700 Subject: [PATCH 135/151] [dallas_temp] fix ds18s20 temp calc (#6988) --- .../components/dallas_temp/dallas_temp.cpp | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/esphome/components/dallas_temp/dallas_temp.cpp b/esphome/components/dallas_temp/dallas_temp.cpp index fe7c9a95ea..ae567d6a76 100644 --- a/esphome/components/dallas_temp/dallas_temp.cpp +++ b/esphome/components/dallas_temp/dallas_temp.cpp @@ -145,24 +145,21 @@ bool DallasTemperatureSensor::check_scratch_pad_() { float DallasTemperatureSensor::get_temp_c_() { int16_t temp = (this->scratch_pad_[1] << 8) | this->scratch_pad_[0]; if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { - if (this->scratch_pad_[7] != 0x10) - ESP_LOGE(TAG, "unexpected COUNT_PER_C value: %u", this->scratch_pad_[7]); - temp = ((temp & 0xfff7) << 3) + (0x10 - this->scratch_pad_[6]) - 4; - } else { - switch (this->resolution_) { - case 9: - temp &= 0xfff8; - break; - case 10: - temp &= 0xfffc; - break; - case 11: - temp &= 0xfffe; - break; - case 12: - default: - break; - } + return (temp >> 1) + (this->scratch_pad_[7] - this->scratch_pad_[6]) / float(this->scratch_pad_[7]) - 0.25; + } + switch (this->resolution_) { + case 9: + temp &= 0xfff8; + break; + case 10: + temp &= 0xfffc; + break; + case 11: + temp &= 0xfffe; + break; + case 12: + default: + break; } return temp / 16.0f; From 9c2af6318ced3de3927db404172fe358fd0afa7d Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Wed, 26 Jun 2024 14:38:11 +0400 Subject: [PATCH 136/151] [modbus-text-sensor] fix potential buffer overflow (#6993) --- .../modbus_controller/text_sensor/modbus_textsensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp index 359c6e2f50..da5c0fba37 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp @@ -15,7 +15,7 @@ void ModbusTextSensor::parse_and_publish(const std::vector &data) { std::ostringstream output; uint8_t items_left = this->response_bytes; uint8_t index = this->offset; - char buffer[4]; + char buffer[5]; while ((items_left > 0) && index < data.size()) { uint8_t b = data[index]; switch (this->encode_) { From 86791422f02a5401c2fff948bba4eb1b0d82ac85 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 26 Jun 2024 22:41:48 +1200 Subject: [PATCH 137/151] Bump version to 2024.6.3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index cde917ca98..2434609191 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.2" +__version__ = "2024.6.3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 7174cf35dd9dc3e9e48ab84466dfcd69f2cb2f03 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 17:53:29 -0500 Subject: [PATCH 138/151] [CI] Add more mdns and safe_mode tests (#6990) --- tests/components/mdns/{common.yaml => common-enabled.yaml} | 0 tests/components/mdns/test-disabled.esp32-idf.yaml | 6 ++++++ tests/components/mdns/test-enabled.esp32-ard.yaml | 1 + tests/components/mdns/test-enabled.esp32-c3-ard.yaml | 1 + tests/components/mdns/test-enabled.esp32-c3-idf.yaml | 1 + tests/components/mdns/test-enabled.esp32-idf.yaml | 1 + tests/components/mdns/test-enabled.esp8266-ard.yaml | 1 + tests/components/mdns/test-enabled.rp2040-ard.yaml | 1 + tests/components/mdns/test.esp32-ard.yaml | 1 - tests/components/mdns/test.esp32-c3-ard.yaml | 1 - tests/components/mdns/test.esp32-c3-idf.yaml | 1 - tests/components/mdns/test.esp32-idf.yaml | 1 - tests/components/mdns/test.esp8266-ard.yaml | 1 - tests/components/mdns/test.rp2040-ard.yaml | 1 - .../safe_mode/{common.yaml => common-enabled.yaml} | 0 tests/components/safe_mode/test-disabled.esp32-idf.yaml | 6 ++++++ tests/components/safe_mode/test-enabled.esp32-ard.yaml | 1 + tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml | 1 + tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml | 1 + tests/components/safe_mode/test-enabled.esp32-idf.yaml | 1 + tests/components/safe_mode/test-enabled.esp8266-ard.yaml | 1 + tests/components/safe_mode/test-enabled.rp2040-ard.yaml | 1 + tests/components/safe_mode/test.esp32-ard.yaml | 1 - tests/components/safe_mode/test.esp32-c3-ard.yaml | 1 - tests/components/safe_mode/test.esp32-c3-idf.yaml | 1 - tests/components/safe_mode/test.esp32-idf.yaml | 1 - tests/components/safe_mode/test.esp8266-ard.yaml | 1 - tests/components/safe_mode/test.rp2040-ard.yaml | 1 - 28 files changed, 24 insertions(+), 12 deletions(-) rename tests/components/mdns/{common.yaml => common-enabled.yaml} (100%) create mode 100644 tests/components/mdns/test-disabled.esp32-idf.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-ard.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-c3-ard.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-c3-idf.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-idf.yaml create mode 100644 tests/components/mdns/test-enabled.esp8266-ard.yaml create mode 100644 tests/components/mdns/test-enabled.rp2040-ard.yaml delete mode 100644 tests/components/mdns/test.esp32-ard.yaml delete mode 100644 tests/components/mdns/test.esp32-c3-ard.yaml delete mode 100644 tests/components/mdns/test.esp32-c3-idf.yaml delete mode 100644 tests/components/mdns/test.esp32-idf.yaml delete mode 100644 tests/components/mdns/test.esp8266-ard.yaml delete mode 100644 tests/components/mdns/test.rp2040-ard.yaml rename tests/components/safe_mode/{common.yaml => common-enabled.yaml} (100%) create mode 100644 tests/components/safe_mode/test-disabled.esp32-idf.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-ard.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-idf.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp8266-ard.yaml create mode 100644 tests/components/safe_mode/test-enabled.rp2040-ard.yaml delete mode 100644 tests/components/safe_mode/test.esp32-ard.yaml delete mode 100644 tests/components/safe_mode/test.esp32-c3-ard.yaml delete mode 100644 tests/components/safe_mode/test.esp32-c3-idf.yaml delete mode 100644 tests/components/safe_mode/test.esp32-idf.yaml delete mode 100644 tests/components/safe_mode/test.esp8266-ard.yaml delete mode 100644 tests/components/safe_mode/test.rp2040-ard.yaml diff --git a/tests/components/mdns/common.yaml b/tests/components/mdns/common-enabled.yaml similarity index 100% rename from tests/components/mdns/common.yaml rename to tests/components/mdns/common-enabled.yaml diff --git a/tests/components/mdns/test-disabled.esp32-idf.yaml b/tests/components/mdns/test-disabled.esp32-idf.yaml new file mode 100644 index 0000000000..07c70bf248 --- /dev/null +++ b/tests/components/mdns/test-disabled.esp32-idf.yaml @@ -0,0 +1,6 @@ +wifi: + ssid: MySSID + password: password1 + +mdns: + disabled: true diff --git a/tests/components/mdns/test-enabled.esp32-ard.yaml b/tests/components/mdns/test-enabled.esp32-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp32-c3-ard.yaml b/tests/components/mdns/test-enabled.esp32-c3-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp32-c3-idf.yaml b/tests/components/mdns/test-enabled.esp32-c3-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp32-idf.yaml b/tests/components/mdns/test-enabled.esp32-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp8266-ard.yaml b/tests/components/mdns/test-enabled.esp8266-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.rp2040-ard.yaml b/tests/components/mdns/test-enabled.rp2040-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test.esp32-ard.yaml b/tests/components/mdns/test.esp32-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp32-c3-ard.yaml b/tests/components/mdns/test.esp32-c3-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-c3-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp32-c3-idf.yaml b/tests/components/mdns/test.esp32-c3-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-c3-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp32-idf.yaml b/tests/components/mdns/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp8266-ard.yaml b/tests/components/mdns/test.esp8266-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp8266-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.rp2040-ard.yaml b/tests/components/mdns/test.rp2040-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.rp2040-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/common.yaml b/tests/components/safe_mode/common-enabled.yaml similarity index 100% rename from tests/components/safe_mode/common.yaml rename to tests/components/safe_mode/common-enabled.yaml diff --git a/tests/components/safe_mode/test-disabled.esp32-idf.yaml b/tests/components/safe_mode/test-disabled.esp32-idf.yaml new file mode 100644 index 0000000000..291f5a2c7c --- /dev/null +++ b/tests/components/safe_mode/test-disabled.esp32-idf.yaml @@ -0,0 +1,6 @@ +wifi: + ssid: MySSID + password: password1 + +safe_mode: + disabled: true diff --git a/tests/components/safe_mode/test-enabled.esp32-ard.yaml b/tests/components/safe_mode/test-enabled.esp32-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml b/tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml b/tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp32-idf.yaml b/tests/components/safe_mode/test-enabled.esp32-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp8266-ard.yaml b/tests/components/safe_mode/test-enabled.esp8266-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.rp2040-ard.yaml b/tests/components/safe_mode/test-enabled.rp2040-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test.esp32-ard.yaml b/tests/components/safe_mode/test.esp32-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp32-c3-ard.yaml b/tests/components/safe_mode/test.esp32-c3-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-c3-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp32-c3-idf.yaml b/tests/components/safe_mode/test.esp32-c3-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-c3-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp32-idf.yaml b/tests/components/safe_mode/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp8266-ard.yaml b/tests/components/safe_mode/test.esp8266-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp8266-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.rp2040-ard.yaml b/tests/components/safe_mode/test.rp2040-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.rp2040-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml From 300d48a55e14f9d6170069364d4eaf9b0217a7d5 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 17:54:17 -0500 Subject: [PATCH 139/151] [CI] Remove old test yamls (#6991) --- .github/workflows/ci.yml | 67 ---------------------------------------- 1 file changed, 67 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df7a9178e1..45fe336d77 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -248,72 +248,6 @@ jobs: run: script/ci-suggest-changes if: always() - compile-tests-list: - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} - steps: - - name: Check out code from GitHub - uses: actions/checkout@v4.1.7 - - name: Find all YAML test files - id: set-matrix - run: echo "matrix=$(ls tests/test*.yaml | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT - - validate-tests: - name: Validate YAML test ${{ matrix.file }} - runs-on: ubuntu-latest - needs: - - common - - compile-tests-list - strategy: - fail-fast: false - matrix: - file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} - steps: - - name: Check out code from GitHub - uses: actions/checkout@v4.1.7 - - name: Restore Python - uses: ./.github/actions/restore-python - with: - python-version: ${{ env.DEFAULT_PYTHON }} - cache-key: ${{ needs.common.outputs.cache-key }} - - name: Run esphome config ${{ matrix.file }} - run: | - . venv/bin/activate - esphome config ${{ matrix.file }} - - compile-tests: - name: Run YAML test ${{ matrix.file }} - runs-on: ubuntu-latest - needs: - - common - - black - - ci-custom - - clang-format - - flake8 - - pylint - - pytest - - pyupgrade - - compile-tests-list - - validate-tests - strategy: - fail-fast: false - max-parallel: 2 - matrix: - file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} - steps: - - name: Check out code from GitHub - uses: actions/checkout@v4.1.7 - - name: Restore Python - uses: ./.github/actions/restore-python - with: - python-version: ${{ env.DEFAULT_PYTHON }} - cache-key: ${{ needs.common.outputs.cache-key }} - - name: Run esphome compile ${{ matrix.file }} - run: | - . venv/bin/activate - esphome compile ${{ matrix.file }} - clang-tidy: name: ${{ matrix.name }} runs-on: ubuntu-latest @@ -550,7 +484,6 @@ jobs: - pylint - pytest - pyupgrade - - compile-tests - clang-tidy - list-components - test-build-components From 855d154439906ea0b150eb57ae7fa866bf52ca3d Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 17:55:05 -0500 Subject: [PATCH 140/151] [CI] Update tests to run against IDF 5.1 (#6992) --- ...f-50.yaml => build_components_base.esp32-c3-idf-51.yaml} | 6 +++--- ...-idf-50.yaml => build_components_base.esp32-idf-51.yaml} | 6 +++--- ...f-50.yaml => build_components_base.esp32-s2-idf-51.yaml} | 6 +++--- ...f-50.yaml => build_components_base.esp32-s3-idf-51.yaml} | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename tests/test_build_components/{build_components_base.esp32-c3-idf-50.yaml => build_components_base.esp32-c3-idf-51.yaml} (76%) rename tests/test_build_components/{build_components_base.esp32-idf-50.yaml => build_components_base.esp32-idf-51.yaml} (77%) rename tests/test_build_components/{build_components_base.esp32-s2-idf-50.yaml => build_components_base.esp32-s2-idf-51.yaml} (78%) rename tests/test_build_components/{build_components_base.esp32-s3-idf-50.yaml => build_components_base.esp32-s3-idf-51.yaml} (77%) diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml similarity index 76% rename from tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml index 08d4d8679c..73d2c8fa19 100644 --- a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32c3idf50 + name: componenttestesp32c3idf51 friendly_name: $component_name esp32: board: lolin_c3_mini framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-idf-51.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-idf-51.yaml index c9f2c1e943..6c8eb3c193 100644 --- a/tests/test_build_components/build_components_base.esp32-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-idf-51.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32idf50 + name: componenttestesp32idf51 friendly_name: $component_name esp32: board: nodemcu-32s framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml similarity index 78% rename from tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml index 351f5fb019..8894efb6b8 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2idf50 + name: componenttestesp32s2idf51 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S2 framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml index c05378903f..efeffa5a0f 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3idf50 + name: componenttestesp32s3idf51 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S3 framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE From 192718fee626852690acd575efae60dc06453df6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:55:42 +1200 Subject: [PATCH 141/151] Bump docker/build-push-action from 6.1.0 to 6.2.0 in /.github/actions/build-image (#6999) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index 27d2ffc533..b038a285ef 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: ./docker/Dockerfile From 10504c4d68b9808b86d51763f3b92ee0a41b96db Mon Sep 17 00:00:00 2001 From: Christiaan de Ridder Date: Thu, 27 Jun 2024 01:03:55 +0200 Subject: [PATCH 142/151] Tuya invalid command 0x22 (#6980) --- esphome/components/tuya/tuya.cpp | 10 ++++++++-- esphome/components/tuya/tuya.h | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/esphome/components/tuya/tuya.cpp b/esphome/components/tuya/tuya.cpp index 402953bb3b..1443d10254 100644 --- a/esphome/components/tuya/tuya.cpp +++ b/esphome/components/tuya/tuya.cpp @@ -223,13 +223,19 @@ void Tuya::handle_command_(uint8_t command, uint8_t version, const uint8_t *buff break; case TuyaCommandType::DATAPOINT_DELIVER: break; - case TuyaCommandType::DATAPOINT_REPORT: + case TuyaCommandType::DATAPOINT_REPORT_ASYNC: + case TuyaCommandType::DATAPOINT_REPORT_SYNC: if (this->init_state_ == TuyaInitState::INIT_DATAPOINT) { this->init_state_ = TuyaInitState::INIT_DONE; this->set_timeout("datapoint_dump", 1000, [this] { this->dump_config(); }); this->initialized_callback_.call(); } this->handle_datapoints_(buffer, len); + + if (command_type == TuyaCommandType::DATAPOINT_REPORT_SYNC) { + this->send_command_( + TuyaCommand{.cmd = TuyaCommandType::DATAPOINT_REPORT_ACK, .payload = std::vector{0x01}}); + } break; case TuyaCommandType::DATAPOINT_QUERY: break; @@ -423,7 +429,7 @@ void Tuya::send_raw_command_(TuyaCommand command) { break; case TuyaCommandType::DATAPOINT_DELIVER: case TuyaCommandType::DATAPOINT_QUERY: - this->expected_response_ = TuyaCommandType::DATAPOINT_REPORT; + this->expected_response_ = TuyaCommandType::DATAPOINT_REPORT_ASYNC; break; default: break; diff --git a/esphome/components/tuya/tuya.h b/esphome/components/tuya/tuya.h index 6db417d474..76431ddfe4 100644 --- a/esphome/components/tuya/tuya.h +++ b/esphome/components/tuya/tuya.h @@ -53,10 +53,12 @@ enum class TuyaCommandType : uint8_t { WIFI_RESET = 0x04, WIFI_SELECT = 0x05, DATAPOINT_DELIVER = 0x06, - DATAPOINT_REPORT = 0x07, + DATAPOINT_REPORT_ASYNC = 0x07, DATAPOINT_QUERY = 0x08, WIFI_TEST = 0x0E, LOCAL_TIME_QUERY = 0x1C, + DATAPOINT_REPORT_SYNC = 0x22, + DATAPOINT_REPORT_ACK = 0x23, WIFI_RSSI = 0x24, VACUUM_MAP_UPLOAD = 0x28, GET_NETWORK_STATUS = 0x2B, From cd7894ae8f235df2d601e03b20a725b61b5a2921 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 20:07:07 -0500 Subject: [PATCH 143/151] [ota-esphome] Merge configurations by port (#7001) --- esphome/components/esphome/ota/__init__.py | 65 +++++++++++++++++++--- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index 88e729f230..a852d8d001 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,7 +1,10 @@ +import logging + import esphome.codegen as cg import esphome.config_validation as cv import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent +from esphome.config_helpers import merge_config from esphome.const import ( CONF_ESPHOME, CONF_ID, @@ -16,6 +19,8 @@ from esphome.const import ( ) from esphome.core import coroutine_with_priority +_LOGGER = logging.getLogger(__name__) + CODEOWNERS = ["@esphome/core"] AUTO_LOAD = ["md5", "socket"] @@ -26,16 +31,62 @@ ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) def ota_esphome_final_validate(config): - fconf = fv.full_config.get()[CONF_OTA] - used_ports = [] - for ota_conf in fconf: + full_conf = fv.full_config.get() + full_ota_conf = full_conf[CONF_OTA] + new_ota_conf = [] + merged_ota_esphome_configs_by_port = {} + ports_with_merged_configs = [] + for ota_conf in full_ota_conf: if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: - if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: - used_ports.append(plat_port) + if ( + conf_port := ota_conf.get(CONF_PORT) + ) not in merged_ota_esphome_configs_by_port: + merged_ota_esphome_configs_by_port[conf_port] = ota_conf else: - raise cv.Invalid( - f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + if merged_ota_esphome_configs_by_port[conf_port][ + CONF_VERSION + ] != ota_conf.get(CONF_VERSION): + raise cv.Invalid( + f"Found multiple configurations but {CONF_VERSION} is inconsistent" + ) + if ( + merged_ota_esphome_configs_by_port[conf_port][CONF_ID].is_manual + and ota_conf.get(CONF_ID).is_manual + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_ID} is inconsistent" + ) + if ( + CONF_PASSWORD in merged_ota_esphome_configs_by_port[conf_port] + and CONF_PASSWORD in ota_conf + and merged_ota_esphome_configs_by_port[conf_port][CONF_PASSWORD] + != ota_conf.get(CONF_PASSWORD) + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_PASSWORD} is inconsistent" + ) + + ports_with_merged_configs.append(conf_port) + merged_ota_esphome_configs_by_port[conf_port] = merge_config( + merged_ota_esphome_configs_by_port[conf_port], ota_conf ) + else: + new_ota_conf.append(ota_conf) + + for port_conf in merged_ota_esphome_configs_by_port.values(): + new_ota_conf.append(port_conf) + + full_conf[CONF_OTA] = new_ota_conf + fv.full_config.set(full_conf) + + if len(ports_with_merged_configs) > 0: + _LOGGER.warning( + "Found and merged multiple configurations for %s %s %s port(s) %s", + CONF_OTA, + CONF_PLATFORM, + CONF_ESPHOME, + ports_with_merged_configs, + ) CONFIG_SCHEMA = ( From bfdf63055fa1113be5b2ee664e464f7763cab808 Mon Sep 17 00:00:00 2001 From: Simone Rossetto Date: Thu, 27 Jun 2024 03:42:16 +0200 Subject: [PATCH 144/151] Allow wireguard to bind to PPP interface (#6989) Co-authored-by: Tim Lunn --- esphome/components/wireguard/__init__.py | 2 +- platformio.ini | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/components/wireguard/__init__.py b/esphome/components/wireguard/__init__.py index 5d5f620b51..16d0d0226e 100644 --- a/esphome/components/wireguard/__init__.py +++ b/esphome/components/wireguard/__init__.py @@ -132,7 +132,7 @@ async def to_code(config): # the '+1' modifier is relative to the device's own address that will # be automatically added to the provided list. cg.add_build_flag(f"-DCONFIG_WIREGUARD_MAX_SRC_IPS={len(allowed_ips) + 1}") - cg.add_library("droscy/esp_wireguard", "0.4.1") + cg.add_library("droscy/esp_wireguard", "0.4.2") await cg.register_component(var, config) diff --git a/platformio.ini b/platformio.ini index e2e66bf672..aa73437222 100644 --- a/platformio.ini +++ b/platformio.ini @@ -94,7 +94,7 @@ lib_deps = ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:arduino.build_flags} -Wno-nonnull-compare @@ -124,7 +124,7 @@ lib_deps = DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:arduino.build_flags} -DUSE_ESP32 @@ -142,7 +142,7 @@ platform_packages = framework = espidf lib_deps = ${common:idf.lib_deps} - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:idf.build_flags} -Wno-nonnull-compare @@ -174,7 +174,7 @@ extends = common:arduino platform = libretiny framework = arduino lib_deps = - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:arduino.build_flags} -DUSE_LIBRETINY From decf50ed492a06aeba7ce1735a0ab324bc4dad73 Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Thu, 27 Jun 2024 03:48:01 +0200 Subject: [PATCH 145/151] Fix LEDC 100% is not 100% duty with ESP32 IDF (#6997) --- esphome/components/ledc/ledc_output.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/esphome/components/ledc/ledc_output.cpp b/esphome/components/ledc/ledc_output.cpp index 1040ac25b6..90e11fe4ad 100644 --- a/esphome/components/ledc/ledc_output.cpp +++ b/esphome/components/ledc/ledc_output.cpp @@ -115,12 +115,15 @@ void LEDCOutput::write_state(float state) { const uint32_t max_duty = (uint32_t(1) << this->bit_depth_) - 1; const float duty_rounded = roundf(state * max_duty); auto duty = static_cast(duty_rounded); - #ifdef USE_ARDUINO ESP_LOGV(TAG, "Setting duty: %u on channel %u", duty, this->channel_); ledcWrite(this->channel_, duty); #endif #ifdef USE_ESP_IDF + // ensure that 100% on is not 99.975% on + if ((duty == max_duty) && (max_duty != 1)) { + duty = max_duty + 1; + } auto speed_mode = get_speed_mode(channel_); auto chan_num = static_cast(channel_ % 8); int hpoint = ledc_angle_to_htop(this->phase_angle_, this->bit_depth_); From 9a26cdb3364fa40957a05309d16b007f96f29c0f Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 27 Jun 2024 05:50:25 +0400 Subject: [PATCH 146/151] [modbus_text_sensor] new default ANSI encoding type (#6975) --- esphome/components/modbus_controller/text_sensor/__init__.py | 3 ++- .../modbus_controller/text_sensor/modbus_textsensor.cpp | 5 ++++- .../modbus_controller/text_sensor/modbus_textsensor.h | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/components/modbus_controller/text_sensor/__init__.py b/esphome/components/modbus_controller/text_sensor/__init__.py index 763336e104..81d6453c6f 100644 --- a/esphome/components/modbus_controller/text_sensor/__init__.py +++ b/esphome/components/modbus_controller/text_sensor/__init__.py @@ -37,6 +37,7 @@ RAW_ENCODING = { "NONE": RawEncoding.NONE, "HEXBYTES": RawEncoding.HEXBYTES, "COMMA": RawEncoding.COMMA, + "ANSI": RawEncoding.ANSI, } CONFIG_SCHEMA = cv.All( @@ -49,7 +50,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_REGISTER_TYPE): cv.enum(MODBUS_REGISTER_TYPE), cv.Optional(CONF_REGISTER_COUNT, default=0): cv.positive_int, cv.Optional(CONF_RESPONSE_SIZE, default=2): cv.positive_int, - cv.Optional(CONF_RAW_ENCODE, default="NONE"): cv.enum(RAW_ENCODING), + cv.Optional(CONF_RAW_ENCODE, default="ANSI"): cv.enum(RAW_ENCODING), } ), validate_modbus_register, diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp index da5c0fba37..acdcacc083 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp @@ -27,8 +27,11 @@ void ModbusTextSensor::parse_and_publish(const std::vector &data) { sprintf(buffer, index != this->offset ? ",%d" : "%d", b); output << buffer; break; + case RawEncoding::ANSI: + if (b < 0x20) + break; + // FALLTHROUGH // Anything else no encoding - case RawEncoding::NONE: default: output << (char) b; break; diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h index 9cc0db05a5..d6eb5fd230 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h @@ -9,7 +9,7 @@ namespace esphome { namespace modbus_controller { -enum class RawEncoding { NONE = 0, HEXBYTES = 1, COMMA = 2 }; +enum class RawEncoding { NONE = 0, HEXBYTES = 1, COMMA = 2, ANSI = 3 }; class ModbusTextSensor : public Component, public text_sensor::TextSensor, public SensorItem { public: From e23153d090061c93a314a4de7bfb0c58ff05a006 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 21:34:39 -0500 Subject: [PATCH 147/151] [CI] Remove old test yaml files (#7002) --- tests/test1.1.yaml | 232 --- tests/test1.yaml | 4427 ------------------------------------------- tests/test11.5.yaml | 809 -------- tests/test2.yaml | 879 --------- tests/test3.1.yaml | 734 ------- tests/test3.yaml | 1432 -------------- tests/test4.yaml | 998 ---------- tests/test5.yaml | 747 -------- tests/test6.yaml | 77 - tests/test7.yaml | 27 - tests/test8.1.yaml | 78 - tests/test8.2.yaml | 75 - tests/test8.yaml | 125 -- tests/test9.1.yaml | 29 - tests/test9.yaml | 35 - 15 files changed, 10704 deletions(-) delete mode 100644 tests/test1.1.yaml delete mode 100644 tests/test1.yaml delete mode 100644 tests/test11.5.yaml delete mode 100644 tests/test2.yaml delete mode 100644 tests/test3.1.yaml delete mode 100644 tests/test3.yaml delete mode 100644 tests/test4.yaml delete mode 100644 tests/test5.yaml delete mode 100644 tests/test6.yaml delete mode 100644 tests/test7.yaml delete mode 100644 tests/test8.1.yaml delete mode 100644 tests/test8.2.yaml delete mode 100644 tests/test8.yaml delete mode 100644 tests/test9.1.yaml delete mode 100644 tests/test9.yaml diff --git a/tests/test1.1.yaml b/tests/test1.1.yaml deleted file mode 100644 index c71aa6e0ef..0000000000 --- a/tests/test1.1.yaml +++ /dev/null @@ -1,232 +0,0 @@ ---- -substitutions: - devicename: test1_1 - sensorname: my - textname: template - roomname: fastled_room - -esphome: - name: test1-1 - name_add_mac_suffix: true - platform: ESP32 - board: nodemcu-32s - platformio_options: - board_build.partitions: huge_app.csv - on_loop: - then: - - light.addressable_set: - id: addr1 - range_from: 0 - range_to: 100 - red: 100% - green: !lambda "return 255;" - blue: 0% - white: 100% - -wled: - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - -uart: - - id: adalight_uart - tx_pin: GPIO25 - rx_pin: GPIO26 - baud_rate: 115200 - rx_buffer_size: 1024 - -adalight: - -network: - -e131: - -power_supply: - - id: atx_power_supply - enable_time: 20ms - keep_on_time: 10s - enable_on_boot: true - pin: - number: 13 - inverted: true - -i2c: - sda: 21 - scl: - number: 22 - allow_other_uses: true - scan: true - frequency: 100kHz - setup_priority: -100 - id: i2c_bus - -pca9685: - frequency: 500 - address: 0x0 - i2c_id: i2c_bus - -output: - - platform: pca9685 - id: pca_0 - channel: 0 - - platform: pca9685 - id: pca_1 - channel: 1 - - platform: pca9685 - id: pca_2 - channel: 2 - -light: - - platform: rgb - name: Living Room Lights - id: ${roomname}_lights - red: pca_0 - green: pca_1 - blue: pca_2 - - platform: fastled_clockless - id: addr1 - chipset: WS2811 - pin: - allow_other_uses: true - number: GPIO23 - num_leds: 60 - rgb_order: BRG - max_refresh_rate: 20ms - power_supply: atx_power_supply - color_correct: [75%, 100%, 50%] - name: FastLED WS2811 Light - effects: - - addressable_color_wipe: - - addressable_color_wipe: - name: Color Wipe Effect With Custom Values - colors: - - red: 100% - green: 100% - blue: 100% - num_leds: 1 - - red: 0% - green: 0% - blue: 0% - num_leds: 1 - add_led_interval: 100ms - reverse: false - - addressable_scan: - - addressable_scan: - name: Scan Effect With Custom Values - move_interval: 100ms - - addressable_twinkle: - - addressable_twinkle: - name: Twinkle Effect With Custom Values - twinkle_probability: 5% - progress_interval: 4ms - - addressable_random_twinkle: - - addressable_random_twinkle: - name: Random Twinkle Effect With Custom Values - twinkle_probability: 5% - progress_interval: 32ms - - addressable_fireworks: - - addressable_fireworks: - name: Fireworks Effect With Custom Values - update_interval: 32ms - spark_probability: 10% - use_random_color: false - fade_out_rate: 120 - - addressable_flicker: - - addressable_flicker: - name: Flicker Effect With Custom Values - update_interval: 16ms - intensity: 5% - - addressable_lambda: - name: Test For Custom Lambda Effect - lambda: |- - if (initial_run) { - it[0] = current_color; - } - - - wled: - port: 11111 - - - adalight: - uart_id: adalight_uart - - - e131: - universe: 1 - - - automation: - name: Custom Effect - sequence: - - light.addressable_set: - id: addr1 - red: 100% - green: 100% - blue: 0% - - delay: 100ms - - light.addressable_set: - id: addr1 - red: 0% - green: 100% - blue: 0% - - - platform: fastled_spi - id: addr2 - chipset: WS2801 - data_pin: - allow_other_uses: true - number: GPIO23 - clock_pin: - number: GPIO22 - allow_other_uses: true - data_rate: 2MHz - num_leds: 60 - rgb_order: BRG - name: FastLED SPI Light - - platform: neopixelbus - id: addr3 - name: Neopixelbus Light - gamma_correct: 2.8 - color_correct: [0.0, 0.0, 0.0, 0.0] - default_transition_length: 10s - power_supply: atx_power_supply - effects: - - addressable_flicker: - name: Flicker Effect With Custom Values - update_interval: 16ms - intensity: 5% - type: GRBW - variant: SK6812 - method: ESP32_I2S_0 - num_leds: 60 - pin: - allow_other_uses: true - number: GPIO23 - - platform: partition - name: Partition Light - segments: - - id: addr1 - from: 0 - to: 0 - - id: addr2 - from: 1 - to: 10 - - id: addr2 - from: 20 - to: 25 - - single_light_id: ${roomname}_lights - -canbus: - - platform: esp32_can - id: esp32_internal_can - rx_pin: GPIO04 - tx_pin: GPIO05 - can_id: 4 - bit_rate: 50kbps - -button: - - platform: template - name: Canbus Actions - on_press: - - canbus.send: "abc" - - canbus.send: [0, 1, 2] - - canbus.send: !lambda return {0, 1, 2}; diff --git a/tests/test1.yaml b/tests/test1.yaml deleted file mode 100644 index 79cb1bba2b..0000000000 --- a/tests/test1.yaml +++ /dev/null @@ -1,4427 +0,0 @@ ---- -substitutions: - devicename: test1 - sensorname: my - textname: template - roomname: living_room - -esphome: - name: test1 - name_add_mac_suffix: true - platform: ESP32 - board: nodemcu-32s - platformio_options: - board_build.partitions: huge_app.csv - on_boot: - priority: 150.0 - then: - - lambda: >- - ESP_LOGD("main", "ON BOOT!"); - on_shutdown: - then: - - lambda: >- - ESP_LOGD("main", "ON SHUTDOWN!"); - on_loop: - then: - - lambda: >- - ESP_LOGV("main", "ON LOOP!"); - build_path: build/test1 - -packages: - wifi: !include test_packages/test_packages_package_wifi.yaml - pkg_test: !include test_packages/test_packages_package1.yaml - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - - ssid: "MySSID2" - password: "" - channel: 14 - bssid: "A1:63:95:47:D3:1D" - manual_ip: - static_ip: 192.168.178.230 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - dns1: 1.1.1.1 - dns2: 1.2.2.1 - domain: .local - reboot_timeout: 120s - power_save_mode: light - on_connect: - - light.turn_on: ${roomname}_lights - on_disconnect: - - light.turn_off: ${roomname}_lights - -network: - enable_ipv6: true - -mdns: - disabled: false - -mqtt: - broker: "192.168.178.84" - port: 1883 - username: "debug" - password: "debug" - client_id: someclient - use_abbreviations: false - discovery: true - discovery_retain: false - discovery_prefix: discovery - discovery_unique_id_generator: legacy - topic_prefix: helloworld - log_topic: - topic: helloworld/hi - level: INFO - birth_message: - will_message: - shutdown_message: - topic: topic/to/send/to - payload: hi - qos: 2 - retain: true - keepalive: 60s - reboot_timeout: 60s - on_message: - - topic: my/custom/topic - qos: 0 - then: - - lambda: >- - ESP_LOGD("main", "Got message %s", x.c_str()); - - topic: livingroom/ota_mode - then: - - deep_sleep.prevent - - deep_sleep.allow - - topic: livingroom/ota_mode - then: - - deep_sleep.enter: - on_json_message: - topic: the/topic - then: - - if: - condition: - - wifi.connected: - - mqtt.connected: - - light.is_on: kitchen - - light.is_off: kitchen - - fan.is_on: fan_speed - - fan.is_off: fan_speed - then: - - lambda: |- - int data = x["my_data"]; - ESP_LOGD("main", "The data is: %d", data); - - light.turn_on: - id: ${roomname}_lights - brightness: !lambda |- - float brightness = 1.0; - if (x.containsKey("brightness")) - brightness = x["brightness"]; - return brightness; - effect: !lambda |- - const char *effect = "None"; - if (x.containsKey("effect")) - effect = x["effect"]; - return effect; - - light.control: - id: ${roomname}_lights - # yamllint disable-line rule:line-length - brightness: !lambda "return id(${roomname}_lights).current_values.get_brightness() + 0.5;" - - light.dim_relative: - id: ${roomname}_lights - relative_brightness: 5% - - uart.write: - id: uart_0 - data: Hello World - - uart.write: - id: uart_0 - data: [0x00, 0x20, 0x30] - - uart.write: - id: uart_0 - data: !lambda |- - return {}; - - bluetooth_password.set: - id: my_ld2410 - password: abcdef - on_connect: - - light.turn_on: ${roomname}_lights - - mqtt.publish: - topic: some/topic - payload: Hello - on_disconnect: - - light.turn_off: ${roomname}_lights - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - allow_other_uses: true - number: 22 - scan: true - frequency: 100kHz - setup_priority: -100 - id: i2c_bus - -spi: - id: spi_bus - clk_pin: - allow_other_uses: true - number: GPIO21 - mosi_pin: - allow_other_uses: true - number: GPIO22 - miso_pin: - allow_other_uses: true - number: GPIO23 - -uart: - - tx_pin: - allow_other_uses: true - number: GPIO22 - inverted: true - rx_pin: - allow_other_uses: true - number: GPIO23 - inverted: true - baud_rate: 115200 - id: uart_0 - parity: NONE - data_bits: 8 - stop_bits: 1 - rx_buffer_size: 512 - debug: - dummy_receiver: true - direction: both - after: - bytes: 50 - timeout: 500ms - delimiter: "\r\n" - sequence: - - lambda: UARTDebug::log_hex(direction, bytes, ':'); - - lambda: UARTDebug::log_string(direction, bytes); - - lambda: UARTDebug::log_int(direction, bytes, ','); - - lambda: UARTDebug::log_binary(direction, bytes, ';'); - - id: ld2410_uart - tx_pin: - allow_other_uses: true - number: 18 - rx_pin: - allow_other_uses: true - number: 23 - baud_rate: 256000 - parity: NONE - stop_bits: 1 - - id: dfrobot_mmwave_uart - tx_pin: - allow_other_uses: true - number: 14 - rx_pin: - allow_other_uses: true - number: 27 - baud_rate: 115200 - - id: ld2420_uart - tx_pin: - allow_other_uses: true - number: 17 - rx_pin: - allow_other_uses: true - number: 16 - baud_rate: 115200 - parity: NONE - stop_bits: 1 - - id: gcja5_uart - rx_pin: GPIO10 - parity: EVEN - baud_rate: 9600 - -safe_mode: - num_attempts: 3 - reboot_timeout: 2min - -ota: - - platform: esphome - password: "superlongpasswordthatnoonewillknow" - port: 3286 - on_state_change: - then: - lambda: >- - ESP_LOGD("ota", "State %d", state); - on_begin: - then: - logger.log: OTA begin - on_progress: - then: - lambda: >- - ESP_LOGD("ota", "Got progress %f", x); - on_end: - then: - logger.log: OTA end - on_error: - then: - lambda: >- - ESP_LOGD("ota", "Got error code %d", x); - -logger: - baud_rate: 0 - level: VERBOSE - logs: - mqtt.component: DEBUG - mqtt.client: ERROR - -web_server: - port: 8080 - version: 2 - -power_supply: - id: atx_power_supply - enable_time: 20ms - keep_on_time: 10s - pin: - number: 13 - allow_other_uses: true - inverted: true - -deep_sleep: - run_duration: 20s - sleep_duration: 50s - wakeup_pin: - allow_other_uses: true - number: GPIO2 - ignore_strapping_warning: true - wakeup_pin_mode: INVERT_WAKEUP - -ads1115: - address: 0x48 - i2c_id: i2c_bus - -ads1118: - spi_id: spi_bus - cs_pin: - allow_other_uses: true - number: GPIO12 - -as5600: - i2c_id: i2c_bus - dir_pin: - number: 27 - allow_other_uses: true - direction: clockwise - start_position: 90deg - range: 180deg - watchdog: true - power_mode: low1 - hysteresis: lsb1 - slow_filter: 8x - fast_filter: lsb6 - -as3935_spi: - cs_pin: - ignore_strapping_warning: true - allow_other_uses: true - number: GPIO12 - irq_pin: - allow_other_uses: true - number: GPIO13 - -esp32_ble: - io_capability: keyboard_only - -esp32_ble_tracker: - -ble_client: - - mac_address: AA:BB:CC:DD:EE:FF - id: ble_foo - auto_connect: true - - mac_address: 11:22:33:44:55:66 - id: ble_blah - auto_connect: false - on_connect: - then: - - switch.turn_on: ble1_status - on_disconnect: - then: - - switch.turn_on: ble1_status - on_passkey_request: - then: - - ble_client.passkey_reply: - id: ble_blah - passkey: 123456 - on_passkey_notification: - then: - - logger.log: "Passkey notification received" - on_numeric_comparison_request: - then: - - ble_client.numeric_comparison_reply: - id: ble_blah - accept: true - - mac_address: C4:4F:33:11:22:33 - id: my_bedjet_ble_client - -bedjet: - - ble_client_id: my_bedjet_ble_client - id: my_bedjet_client - time_id: sntp_time -mcp23s08: - - id: mcp23s08_hub - cs_pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - deviceaddress: 0 - -mcp23s17: - - id: mcp23s17_hub - cs_pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - deviceaddress: 1 - -micronova: - enable_rx_pin: - allow_other_uses: true - number: 4 - uart_id: uart_0 - -dfrobot_sen0395: - - id: mmwave - uart_id: dfrobot_mmwave_uart - -sensor: - - platform: xgzp68xx - i2c_id: i2c_bus - temperature: - name: Pressure Temperature - pressure: - name: Differential pressure - k_value: 4096 - - - platform: pmwcs3 - i2c_id: i2c_bus - e25: - name: pmwcs3_e25 - ec: - name: pmwcs3_ec - temperature: - name: pmwcs3_temperature - vwc: - name: pmwcs3_vwc - - platform: gcja5 - pm_1_0: - name: "Particulate Matter <1.0µm Concentration" - pm_2_5: - name: "Particulate Matter <2.5µm Concentration" - pm_10_0: - name: "Particulate Matter <10.0µm Concentration" - pmc_0_5: - name: "PMC 0.5" - pmc_1_0: - name: "PMC 1.0" - pmc_2_5: - name: "PMC 2.5" - pmc_5_0: - name: "PMC 5.0" - pmc_10_0: - name: "PMC 10.0" - uart_id: gcja5_uart - - platform: internal_temperature - name: Internal Temperature - - platform: ble_client - type: characteristic - ble_client_id: ble_foo - name: Green iTag btn - service_uuid: ffe0 - characteristic_uuid: ffe1 - descriptor_uuid: ffe2 - notify: true - update_interval: never - lambda: |- - ESP_LOGD("main", "Length of data is %i", x.size()); - return x[0]; - on_notify: - then: - - lambda: |- - ESP_LOGD("green_btn", "Button was pressed, val%f", x); - - platform: ble_client - type: rssi - ble_client_id: ble_foo - name: Green iTag RSSI - update_interval: 15s - - platform: adc - pin: A0 - name: Living Room Brightness - update_interval: "1:01" - attenuation: 2.5db - unit_of_measurement: "°C" - icon: "mdi:water-percent" - accuracy_decimals: 5 - expire_after: 120s - setup_priority: -100 - force_update: true - filters: - - offset: 2.0 - - multiply: 1.2 - - calibrate_linear: - datapoints: - - 0.0 -> 0.0 - - 40.0 -> 45.0 - - 100.0 -> 102.5 - - clamp: - min_value: -100 - max_value: 100 - - filter_out: 42.0 - - filter_out: nan - - median: - window_size: 5 - send_every: 5 - send_first_at: 3 - - min: - window_size: 5 - send_every: 5 - send_first_at: 3 - - max: - window_size: 5 - send_every: 5 - send_first_at: 3 - - sliding_window_moving_average: - window_size: 15 - send_every: 15 - send_first_at: 15 - - exponential_moving_average: - alpha: 0.1 - send_every: 15 - send_first_at: 15 - - throttle_average: 60s - - throttle: 1s - - heartbeat: 5s - - debounce: 0.1s - - delta: 5.0 - - delta: 1% - - or: - - throttle: 1s - - delta: 5.0 - - lambda: return x * (9.0/5.0) + 32.0; - on_value: - then: - # yamllint disable rule:line-length - - lambda: |- - ESP_LOGD("main", "Got value %f", x); - id(${sensorname}_sensor).publish_state(42.0); - ESP_LOGI("main", "Value of my sensor: %f", id(${sensorname}_sensor).state); - ESP_LOGI("main", "Raw Value of my sensor: %f", id(${sensorname}_sensor).state); - # yamllint enable rule:line-length - on_value_range: - above: 5 - below: 10 - then: - - lambda: >- - ESP_LOGD("main", "Got value range %f", x); - - wait_until: wifi.connected - - wait_until: - condition: - binary_sensor.is_on: binary_sensor1 - timeout: 1s - on_raw_value: - - lambda: >- - ESP_LOGD("main", "Got raw value %f", x); - - logger.log: - level: DEBUG - format: Got raw value %f - args: ["x"] - - logger.log: Got raw value NAN - - mqtt.publish: - topic: some/topic - payload: Hello - qos: 2 - retain: true - - platform: esp32_hall - name: ESP32 Hall Sensor - - platform: ads1115 - multiplexer: A0_A1 - gain: 1.024 - id: ${sensorname}_sensor - filters: - state_topic: hi/me - retain: false - availability: - - platform: ads1118 - name: ads1118 adc - multiplexer: A0_A1 - gain: 1.024 - type: adc - - platform: ads1118 - name: ads1118 temperature - type: temperature - - platform: as5600 - name: AS5600 Position - raw_position: - name: AS5600 Raw Position - gain: - name: AS5600 Gain - magnitude: - name: AS5600 Magnitude - status: - name: AS5600 Status - - platform: as7341 - update_interval: 15s - gain: X8 - atime: 120 - astep: 99 - f1: - name: F1 - f2: - name: F2 - f3: - name: F3 - f4: - name: F4 - f5: - name: F5 - f6: - name: F6 - f7: - name: F7 - f8: - name: F8 - clear: - name: Clear - nir: - name: NIR - i2c_id: i2c_bus - - platform: atm90e26 - cs_pin: - allow_other_uses: true - number: 5 - voltage: - name: Line Voltage - current: - name: CT Amps - power: - name: Active Watts - power_factor: - name: Power Factor - frequency: - name: Line Frequency - line_frequency: 50Hz - meter_constant: 1000 - pl_const: 1429876 - gain_pga: 1X - gain_metering: 7481 - gain_voltage: 26400 - gain_ct: 31251 - - platform: atm90e32 - cs_pin: - allow_other_uses: true - number: 5 - phase_a: - voltage: - name: EMON Line Voltage A - current: - name: EMON CT1 Current - power: - name: EMON Active Power CT1 - reactive_power: - name: EMON Reactive Power CT1 - power_factor: - name: EMON Power Factor CT1 - gain_voltage: 7305 - gain_ct: 27961 - phase_b: - current: - name: EMON CT2 Current - power: - name: EMON Active Power CT2 - reactive_power: - name: EMON Reactive Power CT2 - power_factor: - name: EMON Power Factor CT2 - gain_voltage: 7305 - gain_ct: 27961 - phase_c: - current: - name: EMON CT3 Current - power: - name: EMON Active Power CT3 - reactive_power: - name: EMON Reactive Power CT3 - power_factor: - name: EMON Power Factor CT3 - gain_voltage: 7305 - gain_ct: 27961 - frequency: - name: EMON Line Frequency - chip_temperature: - name: EMON Chip Temp A - line_frequency: 60Hz - current_phases: 3 - gain_pga: 2X - - platform: bh1750 - name: Living Room Brightness 3 - internal: true - address: 0x23 - update_interval: 30s - qos: 2 - retain: false - availability: - state_topic: livingroom/custom_state_topic - i2c_id: i2c_bus - - platform: max44009 - name: Outside Brightness 1 - internal: true - address: 0x4A - update_interval: 30s - mode: low_power - i2c_id: i2c_bus - - platform: bme680 - temperature: - name: Outside Temperature - oversampling: 16x - pressure: - name: Outside Pressure - humidity: - name: Outside Humidity - gas_resistance: - name: Outside Gas Sensor - address: 0x77 - heater: - temperature: 320 - duration: 150ms - update_interval: 15s - i2c_id: i2c_bus - - platform: bmp085 - temperature: - name: Outside Temperature - pressure: - name: Outside Pressure - filters: - - lambda: >- - return x / powf(1.0 - (x / 44330.0), 5.255); - update_interval: 15s - i2c_id: i2c_bus - - platform: bmp280 - temperature: - name: Outside Temperature - oversampling: 16x - pressure: - name: Outside Pressure - address: 0x77 - update_interval: 15s - iir_filter: 16x - i2c_id: i2c_bus - - platform: dht - pin: - allow_other_uses: true - number: GPIO26 - temperature: - id: dht_temperature - name: Living Room Temperature 3 - humidity: - id: dht_humidity - name: Living Room Humidity 3 - model: AM2302 - update_interval: 15s - - platform: dht12 - temperature: - name: Living Room Temperature 4 - humidity: - name: Living Room Humidity 4 - update_interval: 15s - i2c_id: i2c_bus - - platform: duty_cycle - pin: - allow_other_uses: true - number: GPIO25 - name: Duty Cycle Sensor - - platform: ee895 - co2: - name: Office CO2 1 - temperature: - name: Office Temperature 1 - pressure: - name: Office Pressure 1 - address: 0x5F - i2c_id: i2c_bus - - platform: esp32_hall - name: ESP32 Hall Sensor - update_interval: 15s - - platform: ens210 - temperature: - name: Living Room Temperature 5 - humidity: - name: Living Room Humidity 5 - update_interval: 15s - i2c_id: i2c_bus - - platform: hdc1080 - temperature: - name: Living Room Temperature 6 - humidity: - name: Living Room Humidity 5 - update_interval: 15s - i2c_id: i2c_bus - - platform: hlw8012 - sel_pin: - allow_other_uses: true - number: 5 - cf_pin: - allow_other_uses: true - number: 14 - cf1_pin: - allow_other_uses: true - number: 13 - current: - name: HLW8012 Current - voltage: - name: HLW8012 Voltage - power: - name: HLW8012 Power - id: hlw8012_power - energy: - name: HLW8012 Energy - id: hlw8012_energy - update_interval: 15s - current_resistor: 0.001 ohm - voltage_divider: 2351 - change_mode_every: "never" - initial_mode: VOLTAGE - model: hlw8012 - - platform: total_daily_energy - power_id: hlw8012_power - name: HLW8012 Total Daily Energy - - platform: integration - sensor: hlw8012_power - name: Integration Sensor - time_unit: s - - platform: integration - sensor: hlw8012_power - name: Integration Sensor lazy - time_unit: s - - platform: hmc5883l - address: 0x68 - field_strength_x: - name: HMC5883L Field Strength X - field_strength_y: - name: HMC5883L Field Strength Y - field_strength_z: - name: HMC5883L Field Strength Z - heading: - name: HMC5883L Heading - range: 130uT - oversampling: 8x - update_interval: 15s - i2c_id: i2c_bus - - platform: honeywell_hih_i2c - temperature: - name: Living Room Temperature 7 - humidity: - name: Living Room Humidity 7 - update_interval: 15s - i2c_id: i2c_bus - - platform: honeywellabp - pressure: - name: Honeywell pressure - min_pressure: 0 - max_pressure: 15 - temperature: - name: Honeywell temperature - cs_pin: - allow_other_uses: true - number: GPIO5 - - platform: honeywellabp2_i2c - pressure: - name: Honeywell2 pressure - min_pressure: 0 - max_pressure: 16000 - transfer_function: A - temperature: - name: Honeywell temperature - i2c_id: i2c_bus - address: 0x28 - - platform: hte501 - temperature: - name: Office Temperature 2 - humidity: - name: Office Humidity 1 - address: 0x40 - i2c_id: i2c_bus - - platform: qmc5883l - address: 0x0D - field_strength_x: - name: QMC5883L Field Strength X - field_strength_y: - name: QMC5883L Field Strength Y - field_strength_z: - name: QMC5883L Field Strength Z - heading: - name: QMC5883L Heading - range: 800uT - oversampling: 256x - update_interval: 15s - i2c_id: i2c_bus - - platform: hx711 - name: HX711 Value - dout_pin: - allow_other_uses: true - number: GPIO23 - clk_pin: - allow_other_uses: true - number: GPIO25 - gain: 128 - update_interval: 15s - - platform: ina219 - address: 0x40 - shunt_resistance: 0.1 ohm - current: - name: INA219 Current - power: - name: INA219 Power - bus_voltage: - name: INA219 Bus Voltage - shunt_voltage: - name: INA219 Shunt Voltage - max_voltage: 32.0V - max_current: 3.2A - update_interval: 15s - i2c_id: i2c_bus - - platform: ina226 - address: 0x40 - shunt_resistance: 0.1 ohm - current: - name: INA226 Current - power: - name: INA226 Power - bus_voltage: - name: INA226 Bus Voltage - shunt_voltage: - name: INA226 Shunt Voltage - max_current: 3.2A - update_interval: 15s - i2c_id: i2c_bus - - platform: ina3221 - address: 0x40 - channel_1: - shunt_resistance: 0.1 ohm - current: - name: INA3221 Channel 1 Current - power: - name: INA3221 Channel 1 Power - bus_voltage: - name: INA3221 Channel 1 Bus Voltage - shunt_voltage: - name: INA3221 Channel 1 Shunt Voltage - update_interval: 15s - i2c_id: i2c_bus - - platform: kmeteriso - temperature: - name: Outside Temperature - internal_temperature: - name: Internal Ttemperature - update_interval: 15s - i2c_id: i2c_bus - - platform: combination - type: kalman - name: Kalman-filtered temperature - process_std_dev: 0.00139 - sources: - - source: scd30_temperature - error: !lambda |- - return 0.4 + std::abs(x - 25) * 0.023; - - source: scd4x_temperature - error: 1.5 - - platform: combination - type: linear - name: Linearly combined temperatures - sources: - - source: scd30_temperature - coeffecient: !lambda |- - return 0.4 + std::abs(x - 25) * 0.023; - - source: scd4x_temperature - coeffecient: 1.5 - - platform: combination - type: max - name: Max of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: mean - name: Mean of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: median - name: Median of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: min - name: Min of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: most_recently_updated - name: Most recently updated of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: range - name: Range of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: sum - name: Sum of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: htu21d - temperature: - name: Living Room Temperature 6 - humidity: - name: Living Room Humidity 6 - heater: - name: Living Room Heater 6 - update_interval: 15s - i2c_id: i2c_bus - - platform: max6675 - name: Living Room Temperature - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 15s - - platform: max31855 - name: Den Temperature - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 15s - reference_temperature: - name: MAX31855 Internal Temperature - - platform: max31856 - name: BBQ Temperature - cs_pin: - allow_other_uses: true - number: GPIO17 - update_interval: 15s - mains_filter: 50Hz - - platform: max31865 - name: Water Tank Temperature - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 15s - reference_resistance: 430 Ω - rtd_nominal_resistance: 100 Ω - - platform: mhz19 - uart_id: uart_0 - co2: - name: MH-Z19 CO2 Value - temperature: - name: MH-Z19 Temperature - update_interval: 15s - automatic_baseline_calibration: false - - platform: mpu6050 - address: 0x68 - accel_x: - name: MPU6050 Accel X - accel_y: - name: MPU6050 Accel Y - accel_z: - name: MPU6050 Accel z - gyro_x: - name: MPU6050 Gyro X - gyro_y: - name: MPU6050 Gyro Y - gyro_z: - name: MPU6050 Gyro z - temperature: - name: MPU6050 Temperature - i2c_id: i2c_bus - - platform: mpu6886 - address: 0x68 - accel_x: - name: MPU6886 Accel X - accel_y: - name: MPU6886 Accel Y - accel_z: - name: MPU6886 Accel z - gyro_x: - name: MPU6886 Gyro X - gyro_y: - name: MPU6886 Gyro Y - gyro_z: - name: MPU6886 Gyro z - temperature: - name: MPU6886 Temperature - i2c_id: i2c_bus - - platform: bmi160 - address: 0x68 - acceleration_x: - name: BMI160 Accel X - acceleration_y: - name: BMI160 Accel Y - acceleration_z: - name: BMI160 Accel z - gyroscope_x: - name: BMI160 Gyro X - gyroscope_y: - name: BMI160 Gyro Y - gyroscope_z: - name: BMI160 Gyro z - temperature: - name: BMI160 Temperature - i2c_id: i2c_bus - - platform: mmc5603 - address: 0x30 - field_strength_x: - name: HMC5883L Field Strength X - field_strength_y: - name: HMC5883L Field Strength Y - field_strength_z: - name: HMC5883L Field Strength Z - i2c_id: i2c_bus - - platform: dps310 - temperature: - name: DPS310 Temperature - pressure: - name: DPS310 Pressure - address: 0x77 - update_interval: 15s - i2c_id: i2c_bus - - platform: ms5611 - temperature: - name: Outside Temperature - pressure: - name: Outside Pressure - address: 0x77 - update_interval: 15s - i2c_id: i2c_bus - - platform: pmsa003i - pm_1_0: - name: PMSA003i PM1.0 - pm_2_5: - name: PMSA003i PM2.5 - pm_10_0: - name: PMSA003i PM10.0 - pmc_0_3: - name: PMSA003i PMC <0.3µm - pmc_0_5: - name: PMSA003i PMC <0.5µm - pmc_1_0: - name: PMSA003i PMC <1µm - pmc_2_5: - name: PMSA003i PMC <2.5µm - pmc_5_0: - name: PMSA003i PMC <5µm - pmc_10_0: - name: PMSA003i PMC <10µm - address: 0x12 - standard_units: true - i2c_id: i2c_bus - - platform: pulse_counter - name: Pulse Counter - pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - count_mode: - rising_edge: INCREMENT - falling_edge: DECREMENT - internal_filter: 13us - update_interval: 15s - - platform: pulse_meter - name: Pulse Meter - id: pulse_meter_sensor - pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - internal_filter: 100ms - timeout: 2 min - on_value: - - pulse_meter.set_total_pulses: - id: pulse_meter_sensor - value: 12345 - total: - name: Pulse Meter Total - - platform: qmp6988 - temperature: - name: Living Temperature QMP - oversampling: 32x - pressure: - name: Living Pressure QMP - oversampling: 2x - address: 0x70 - update_interval: 30s - iir_filter: 16x - i2c_id: i2c_bus - - platform: rotary_encoder - name: Rotary Encoder - id: rotary_encoder1 - pin_a: - allow_other_uses: true - number: GPIO23 - pin_b: - allow_other_uses: true - number: GPIO25 - pin_reset: - allow_other_uses: true - number: GPIO25 - filters: - - or: - - debounce: 0.1s - - delta: 10 - resolution: 4 - min_value: -10 - max_value: 30 - on_value: - - sensor.rotary_encoder.set_value: - id: rotary_encoder1 - value: 10 - - sensor.rotary_encoder.set_value: - id: rotary_encoder1 - value: !lambda "return -1;" - on_clockwise: - - logger.log: Clockwise - - display_menu.down: test_lcd_menu - - display_menu.down: test_graphical_display_menu - on_anticlockwise: - - logger.log: Anticlockwise - - display_menu.up: test_lcd_menu - - display_menu.up: test_graphical_display_menu - - platform: pulse_width - name: Pulse Width - pin: - allow_other_uses: true - number: GPIO12 - - platform: sm300d2 - uart_id: uart_0 - co2: - name: SM300D2 CO2 Value - formaldehyde: - name: SM300D2 Formaldehyde Value - tvoc: - name: SM300D2 TVOC Value - pm_2_5: - name: SM300D2 PM2.5 Value - pm_10_0: - name: SM300D2 PM10 Value - temperature: - name: SM300D2 Temperature Value - humidity: - name: SM300D2 Humidity Value - update_interval: 60s - - platform: sht3xd - temperature: - name: Living Room Temperature 8 - humidity: - name: Living Room Humidity 8 - address: 0x44 - i2c_id: i2c_bus - update_interval: 15s - - platform: sts3x - name: Living Room Temperature 9 - address: 0x4A - i2c_id: i2c_bus - - platform: scd30 - co2: - name: Living Room CO2 9 - temperature: - id: scd30_temperature - name: Living Room Temperature 9 - humidity: - name: Living Room Humidity 9 - address: 0x61 - update_interval: 15s - automatic_self_calibration: true - altitude_compensation: 10m - ambient_pressure_compensation: 961mBar - temperature_offset: 4.2C - i2c_id: i2c_bus - - platform: scd4x - id: scd40 - co2: - name: SCD4X CO2 - temperature: - id: scd4x_temperature - name: SCD4X Temperature - humidity: - name: SCD4X Humidity - update_interval: 15s - automatic_self_calibration: true - altitude_compensation: 10m - ambient_pressure_compensation: 961mBar - temperature_offset: 4.2C - i2c_id: i2c_bus - - platform: sfa30 - formaldehyde: - name: "SFA30 formaldehyde" - temperature: - name: "SFA30 temperature" - humidity: - name: "SFA30 humidity" - i2c_id: i2c_bus - address: 0x5D - update_interval: 30s - - platform: sen0321 - name: Workshop Ozone Sensor - id: sen0321_ozone - update_interval: 10s - i2c_id: i2c_bus - - platform: sgp30 - eco2: - name: Workshop eCO2 - accuracy_decimals: 1 - tvoc: - name: Workshop TVOC - accuracy_decimals: 1 - address: 0x58 - update_interval: 5s - i2c_id: i2c_bus - - platform: sps30 - pm_1_0: - name: Workshop PM <1µm Weight concentration - id: workshop_PM_1_0 - pm_2_5: - name: Workshop PM <2.5µm Weight concentration - id: workshop_PM_2_5 - pm_4_0: - name: Workshop PM <4µm Weight concentration - id: workshop_PM_4_0 - pm_10_0: - name: Workshop PM <10µm Weight concentration - id: workshop_PM_10_0 - pmc_0_5: - name: Workshop PM <0.5µm Number concentration - id: workshop_PMC_0_5 - pmc_1_0: - name: Workshop PM <1µm Number concentration - id: workshop_PMC_1_0 - pmc_2_5: - name: Workshop PM <2.5µm Number concentration - id: workshop_PMC_2_5 - pmc_4_0: - name: Workshop PM <4µm Number concentration - id: workshop_PMC_4_0 - pmc_10_0: - name: Workshop PM <10µm Number concentration - id: workshop_PMC_10_0 - address: 0x69 - update_interval: 10s - i2c_id: i2c_bus - - platform: sht4x - temperature: - name: SHT4X Temperature - humidity: - name: SHT4X Humidity - address: 0x44 - update_interval: 15s - i2c_id: i2c_bus - - platform: shtcx - temperature: - name: Living Room Temperature 10 - humidity: - name: Living Room Humidity 10 - address: 0x70 - update_interval: 15s - i2c_id: i2c_bus - - platform: template - name: Template Sensor - state_class: measurement - id: template_sensor - lambda: |- - if (id(ultrasonic_sensor1).state > 1) { - return 42.0; - } else { - return {}; - } - update_interval: 15s - on_value: - - sensor.template.publish: - id: template_sensor - state: 43.0 - - sensor.template.publish: - id: template_sensor - state: !lambda "return NAN;" - - platform: tsl2561 - name: TSL2561 Ambient Light - address: 0x39 - update_interval: 15s - is_cs_package: true - integration_time: 402ms - gain: 16x - i2c_id: i2c_bus - - platform: tsl2591 - id: this_little_light_of_mine - address: 0x29 - update_interval: 15s - integration_time: 600ms - gain: high - visible: - name: tsl2591 visible - id: tsl2591_vis - unit_of_measurement: pH - infrared: - name: tsl2591 infrared - id: tsl2591_ir - full_spectrum: - name: tsl2591 full_spectrum - id: tsl2591_fs - calculated_lux: - name: tsl2591 calculated_lux - id: tsl2591_cl - i2c_id: i2c_bus - - platform: veml3235 - id: veml3235_sensor - name: VEML3235 Light Sensor - i2c_id: i2c_bus - auto_gain: true - auto_gain_threshold_high: 90% - auto_gain_threshold_low: 15% - digital_gain: 1X - gain: 1X - integration_time: 50ms - - platform: tee501 - name: Office Temperature 3 - address: 0x48 - i2c_id: i2c_bus - - platform: ultrasonic - trigger_pin: - allow_other_uses: true - number: GPIO25 - echo_pin: - number: GPIO23 - allow_other_uses: true - inverted: true - name: Ultrasonic Sensor - timeout: 5.5m - id: ultrasonic_sensor1 - - platform: uptime - name: Uptime Sensor - - id: !extend ${devicename}_uptime_pcg - unit_of_measurement: s - - platform: wifi_signal - name: WiFi Signal Sensor - update_interval: 15s - - platform: mqtt_subscribe - name: MQTT Subscribe Sensor 1 - topic: mqtt/topic - id: the_sensor - qos: 2 - on_value: - - mqtt.publish_json: - topic: the/topic - payload: |- - root["key"] = id(the_sensor).state; - root["greeting"] = "Hello World"; - - platform: sds011 - uart_id: uart_0 - pm_2_5: - name: SDS011 PM2.5 - pm_10_0: - name: SDS011 PM10.0 - update_interval: 5min - rx_only: false - - platform: ccs811 - eco2: - name: CCS811 eCO2 - tvoc: - name: CCS811 TVOC - update_interval: 30s - baseline: 0x4242 - i2c_id: i2c_bus - - platform: tx20 - wind_speed: - name: Windspeed - wind_direction_degrees: - name: Winddirection Degrees - pin: - number: GPIO04 - mode: INPUT - allow_other_uses: true - - platform: zyaura - clock_pin: - allow_other_uses: true - number: GPIO5 - data_pin: - allow_other_uses: true - number: GPIO4 - co2: - name: ZyAura CO2 - temperature: - name: ZyAura Temperature - humidity: - name: ZyAura Humidity - - platform: as3935 - lightning_energy: - name: Lightning Energy - distance: - name: Distance Storm - - platform: tmp117 - name: TMP117 Temperature - update_interval: 5s - i2c_id: i2c_bus - - platform: hm3301 - pm_1_0: - name: PM1.0 - pm_2_5: - name: PM2.5 - pm_10_0: - name: PM10.0 - aqi: - name: AQI - calculation_type: CAQI - i2c_id: i2c_bus - - platform: teleinfo - tag_name: HCHC - name: hchc - unit_of_measurement: Wh - icon: mdi:flash - teleinfo_id: myteleinfo - - platform: mcp9808 - name: MCP9808 Temperature - update_interval: 15s - i2c_id: i2c_bus - - platform: ezo - id: ph_ezo - address: 99 - unit_of_measurement: pH - i2c_id: i2c_bus - - platform: sdp3x - name: HVAC Filter Pressure drop - id: filter_pressure - update_interval: 5s - accuracy_decimals: 3 - i2c_id: i2c_bus - - platform: cs5460a - id: cs5460a1 - current: - name: Socket current - voltage: - name: Mains voltage - power: - name: Socket power - on_value: - then: - cs5460a.restart: cs5460a1 - samples: 1600 - pga_gain: 10X - current_gain: 0.01 - voltage_gain: 0.000573 - current_hpf: true - voltage_hpf: true - phase_offset: 20 - pulse_energy: 0.01 kWh - cs_pin: - mcp23xxx: mcp23017_hub - number: 14 - - platform: max9611 - i2c_id: i2c_bus - shunt_resistance: 0.2 ohm - gain: 1X - voltage: - name: Max9611 Voltage - current: - name: Max9611 Current - power: - name: Max9611 Watts - temperature: - name: Max9611 Temp - update_interval: 1s - - platform: mlx90614 - i2c_id: i2c_bus - ambient: - name: Ambient - object: - name: Object - emissivity: 1.0 - - platform: mpl3115a2 - i2c_id: i2c_bus - temperature: - name: "MPL3115A2 Temperature" - pressure: - name: "MPL3115A2 Pressure" - update_interval: 10s - - platform: alpha3 - ble_client_id: ble_foo - flow: - name: "Radiator Pump Flow" - head: - name: "Radiator Pump Head" - power: - name: "Radiator Pump Power" - speed: - name: "Radiator Pump Speed" - - platform: ld2410 - light: - name: light - moving_distance: - name: "Moving distance (cm)" - still_distance: - name: "Still Distance (cm)" - moving_energy: - name: "Move Energy (%)" - still_energy: - name: "Still Energy (%)" - detection_distance: - name: "Distance Detection (cm)" - g0: - move_energy: - name: g0 move energy - still_energy: - name: g0 still energy - g1: - move_energy: - name: g1 move energy - still_energy: - name: g1 still energy - g2: - move_energy: - name: g2 move energy - still_energy: - name: g2 still energy - g3: - move_energy: - name: g3 move energy - still_energy: - name: g3 still energy - g4: - move_energy: - name: g4 move energy - still_energy: - name: g4 still energy - g5: - move_energy: - name: g5 move energy - still_energy: - name: g5 still energy - g6: - move_energy: - name: g6 move energy - still_energy: - name: g6 still energy - g7: - move_energy: - name: g7 move energy - still_energy: - name: g7 still energy - g8: - move_energy: - name: g8 move energy - still_energy: - name: g8 still energy - - - platform: ld2420 - moving_distance: - name: "Moving distance (cm)" - - platform: sen21231 - name: "Person Sensor" - i2c_id: i2c_bus - - platform: fs3000 - name: "Air Velocity" - model: 1005 - update_interval: 60s - i2c_id: i2c_bus - - platform: absolute_humidity - name: DHT Absolute Humidity - temperature: dht_temperature - humidity: dht_humidity - - platform: hyt271 - i2c_id: i2c_bus - temperature: - name: "Temperature hyt271" - id: temp_etuve - humidity: - name: "Humidity hyt271" - - platform: iaqcore - i2c_id: i2c_bus - co2: - name: "iAQ Core CO2 Sensor" - tvoc: - name: "iAQ Core TVOC Sensor" - - platform: tmp1075 - name: "Temperature TMP1075" - update_interval: 10s - i2c_id: i2c_bus - conversion_rate: 27.5ms - alert: - limit_low: 50 - limit_high: 75 - fault_count: 1 - polarity: active_high - function: comparator - - platform: zio_ultrasonic - name: "Distance" - update_interval: 60s - i2c_id: i2c_bus - - platform: bmp581 - i2c_id: i2c_bus - temperature: - name: "BMP581 Temperature" - iir_filter: 2x - pressure: - name: "BMP581 Pressure" - oversampling: 128x - - platform: debug - free: - name: "Heap Free" - block: - name: "Heap Max Block" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - - platform: mmc5983 - i2c_id: i2c_bus - field_strength_x: - name: "Magnet X" - id: magnet_x - field_strength_y: - name: "Magnet Y" - id: magnet_y - field_strength_z: - name: "Magnet Z" - id: magnet_z - - platform: micronova - room_temperature: - name: Room Temperature - fumes_temperature: - name: Fumes Temperature - water_temperature: - name: Water temperature - water_pressure: - name: Water pressure - stove_power: - name: Stove Power - fan_speed: - fan_rpm_offset: 240 - name: Fan RPM - memory_address_sensor: - memory_location: 0x20 - memory_address: 0x7d - name: Adres sensor - - platform: ade7880 - i2c_id: i2c_bus - irq0_pin: - number: GPIO13 - allow_other_uses: true - irq1_pin: - number: GPIO5 - allow_other_uses: true - reset_pin: - number: GPIO16 - allow_other_uses: true - frequency: 60Hz - phase_a: - name: Channel A - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3116628 - voltage_gain: -757178 - power_gain: -1344457 - phase_angle: 188 - phase_b: - name: Channel B - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3133655 - voltage_gain: -755235 - power_gain: -1345638 - phase_angle: 188 - phase_c: - name: Channel C - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3111158 - voltage_gain: -743813 - power_gain: -1351437 - phase_angle: 180 - neutral: - name: Neutral - current: Current - calibration: - current_gain: 3189 - -psram: - -esp32_touch: - setup_mode: false - iir_filter: 10ms - sleep_duration: 27ms - measurement_duration: 8ms - low_voltage_reference: 0.5V - high_voltage_reference: 2.7V - voltage_attenuation: 1.5V - -binary_sensor: - - platform: gpio - name: "MCP23S08 Pin #1" - pin: - mcp23xxx: mcp23s08_hub - # Use pin number 1 - number: 1 - # One of INPUT or INPUT_PULLUP - mode: INPUT_PULLUP - inverted: false - - platform: gpio - name: "MCP23S17 Pin #1" - pin: - mcp23xxx: mcp23s17_hub - # Use pin number 1 - number: 1 - allow_other_uses: true - # One of INPUT or INPUT_PULLUP - mode: INPUT_PULLUP - inverted: false - - platform: gpio - name: "MCP23S17 Pin #1 with interrupt" - pin: - mcp23xxx: mcp23s17_hub - # Use pin number 1 - allow_other_uses: true - number: 1 - # One of INPUT or INPUT_PULLUP - mode: INPUT_PULLUP - inverted: false - interrupt: FALLING - - platform: gpio - pin: - allow_other_uses: true - number: GPIO9 - name: Living Room Window - device_class: window - filters: - - invert: - - delayed_on_off: 40ms - - delayed_on_off: - time_on: 10s - time_off: !lambda "return 1000;" - - delayed_on: 40ms - - delayed_off: 40ms - - delayed_on_off: !lambda "return 10;" - - delayed_on: !lambda "return 1000;" - - delayed_off: !lambda "return 0;" - - settle: 40ms - - settle: !lambda "return 10;" - on_press: - then: - - lambda: >- - ESP_LOGD("main", "Pressed"); - on_release: - then: - - lambda: >- - ESP_LOGD("main", "Released"); - on_click: - - min_length: 50ms - max_length: 350ms - then: - - lambda: >- - ESP_LOGD("main", "Clicked"); - - then: - - lambda: >- - ESP_LOGD("main", "Clicked"); - on_double_click: - - min_length: 50ms - max_length: 350ms - then: - - lambda: >- - ESP_LOGD("main", "Double Clicked"); - - then: - - lambda: >- - ESP_LOGD("main", "Double Clicked"); - on_multi_click: - - timing: - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at least 0.2s - then: - - logger.log: - format: Multi Clicked TWO - level: warn - - timing: - - OFF for 1s to 2s - - ON for 1s to 2s - - OFF for at least 0.5s - then: - - logger.log: - format: Multi Clicked LONG SINGLE - level: warn - - timing: - - ON for at most 1s - - OFF for at least 0.5s - then: - - logger.log: - format: Multi Clicked SINGLE - level: warn - id: binary_sensor1 - - platform: gpio - pin: - number: GPIO9 - allow_other_uses: true - mode: INPUT_PULLUP - name: Living Room Window 2 - - platform: gpio - pin: - number: GPIO9 - allow_other_uses: true - mode: INPUT_OUTPUT_OPEN_DRAIN - name: Living Room Button - - platform: status - name: Living Room Status - - platform: esp32_touch - name: ESP32 Touch Pad GPIO27 - pin: GPIO27 - threshold: 1000 - id: btn_left - on_press: - - if: - condition: - display_menu.is_active: test_lcd_menu - then: - - display_menu.enter: test_lcd_menu - else: - - display_menu.left: test_lcd_menu - - display_menu.right: test_lcd_menu - - display_menu.show: test_lcd_menu - - if: - condition: - display_menu.is_active: test_graphical_display_menu - then: - - display_menu.enter: test_graphical_display_menu - else: - - display_menu.left: test_graphical_display_menu - - display_menu.right: test_graphical_display_menu - - display_menu.show: test_graphical_display_menu - - platform: template - name: Garage Door Open - id: garage_door - lambda: |- - if (isnan(id(${sensorname}_sensor).state)) { - // isnan checks if the ultrasonic sensor echo - // has timed out, resulting in a NaN (not a number) state - // in that case, return {} to indicate that we don't know. - return {}; - } else if (id(${sensorname}_sensor).state > 30) { - // Garage Door is open. - return true; - } else { - // Garage Door is closed. - return false; - } - on_press: - - binary_sensor.template.publish: - id: garage_door - state: false - - output.ledc.set_frequency: - id: gpio_19 - frequency: 500.0Hz - - output.ledc.set_frequency: - id: gpio_19 - frequency: !lambda "return 500.0;" - - platform: pn532 - pn532_id: pn532_bs - uid: 74-10-37-94 - name: PN532 NFC Tag - - platform: rdm6300 - uid: 7616525 - name: RDM6300 NFC Tag - - platform: gpio - name: PCF binary sensor - pin: - pcf8574: pcf8574_hub - number: 1 - mode: INPUT - inverted: true - - platform: gpio - name: PCA9554 binary sensor - pin: - pca9554: pca9554_hub - number: 1 - mode: INPUT - inverted: true - - platform: gpio - name: PCA6416A binary sensor - pin: - pca6416a: pca6416a_hub - number: 15 - mode: INPUT - inverted: true - - platform: gpio - name: MCP21 binary sensor - pin: - mcp23xxx: mcp23017_hub - number: 1 - allow_other_uses: true - mode: INPUT - inverted: true - - platform: gpio - name: MCP22 binary sensor - pin: - mcp23xxx: mcp23008_hub - number: 7 - mode: INPUT_PULLUP - inverted: false - - platform: gpio - name: MCP23 binary sensor - pin: - mcp23016: mcp23016_hub - number: 7 - mode: INPUT - inverted: false - - platform: gpio - name: Speed Fan Cycle binary sensor" - pin: - number: 18 - allow_other_uses: true - mode: - input: true - pulldown: true - on_press: - - fan.cycle_speed: - id: fan_speed - off_speed_cycle: false - - logger.log: "Cycle speed clicked" - - platform: remote_receiver - name: Raw Remote Receiver Test - raw: - code: - [ - 5685, - -4252, - 1711, - -2265, - 1712, - -2265, - 1711, - -2264, - 1712, - -2266, - 3700, - -2263, - 1712, - -4254, - 1711, - -4249, - 1715, - -2266, - 1710, - -2267, - 1709, - -2265, - 3704, - -4250, - 1712, - -4254, - 3700, - -2260, - 1714, - -2265, - 1712, - -2262, - 1714, - -2267, - 1709, - ] - - platform: remote_receiver - name: Coolix Test 1 - coolix: 0xB21F98 - - platform: remote_receiver - name: Coolix Test 2 - coolix: - first: 0xB2E003 - - platform: remote_receiver - name: Coolix Test 3 - coolix: - first: 0xB2E003 - second: 0xB21F98 - - platform: as3935 - name: Storm Alert - - platform: analog_threshold - name: Analog Trheshold 1 - sensor_id: template_sensor - threshold: - upper: 110 - lower: 90 - filters: - - delayed_on: 0s - - delayed_off: 10s - - platform: analog_threshold - name: Analog Trheshold 2 - sensor_id: template_sensor - threshold: 100 - filters: - - invert: - - platform: template - id: open_endstop_sensor - - platform: template - id: open_sensor - - platform: template - id: open_obstacle_sensor - - - platform: template - id: close_endstop_sensor - - platform: template - id: close_sensor - - platform: template - id: close_obstacle_sensor - - platform: ld2410 - has_target: - name: presence - has_moving_target: - name: movement - has_still_target: - name: still - out_pin_presence_status: - name: out pin presence status - - platform: qwiic_pir - i2c_id: i2c_bus - name: "Qwiic PIR Motion Sensor" - - platform: dfrobot_sen0395 - id: mmwave_detected_uart - dfrobot_sen0395_id: mmwave - - platform: nfc - nfcc_id: nfcc_pn7160_i2c - ndef_contains: pulse - name: MFC Tag 1 - - platform: nfc - nfcc_id: nfcc_pn7160_i2c - tag_id: pulse - name: MFC Tag 2 - - platform: nfc - nfcc_id: nfcc_pn7160_i2c - uid: 59-FC-AB-15 - name: MFC Tag 3 - -pca9685: - frequency: 500 - address: 0x0 - i2c_id: i2c_bus - -tlc59208f: - - address: 0x20 - id: tlc59208f_1 - i2c_id: i2c_bus - - address: 0x22 - id: tlc59208f_2 - i2c_id: i2c_bus - - address: 0x24 - id: tlc59208f_3 - i2c_id: i2c_bus - -my9231: - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - num_channels: 6 - num_chips: 2 - bit_depth: 16 - -sm2235: - data_pin: - allow_other_uses: true - number: GPIO4 - clock_pin: - allow_other_uses: true - number: GPIO5 - max_power_color_channels: 9 - max_power_white_channels: 9 - -sm2335: - data_pin: - allow_other_uses: true - number: GPIO4 - clock_pin: - allow_other_uses: true - number: GPIO5 - max_power_color_channels: 9 - max_power_white_channels: 9 - -bp1658cj: - data_pin: - allow_other_uses: true - number: GPIO3 - clock_pin: - allow_other_uses: true - number: GPIO5 - max_power_color_channels: 4 - max_power_white_channels: 6 - -bp5758d: - data_pin: - allow_other_uses: true - number: GPIO3 - clock_pin: - allow_other_uses: true - number: GPIO5 - -output: - - platform: gpio - pin: - allow_other_uses: true - number: GPIO26 - id: gpio_26 - power_supply: atx_power_supply - inverted: false - - platform: ledc - pin: - allow_other_uses: true - number: 19 - id: gpio_19 - frequency: 1500Hz - channel: 14 - max_power: 0.5 - - platform: pca9685 - id: pca_0 - channel: 0 - - platform: pca9685 - id: pca_1 - channel: 1 - - platform: pca9685 - id: pca_2 - channel: 2 - - platform: pca9685 - id: pca_3 - channel: 3 - - platform: pca9685 - id: pca_4 - channel: 4 - - platform: pca9685 - id: pca_5 - channel: 5 - - platform: pca9685 - id: pca_6 - channel: 6 - - platform: pca9685 - id: pca_7 - channel: 7 - - platform: tlc59208f - id: tlc_0 - channel: 0 - tlc59208f_id: tlc59208f_1 - - platform: tlc59208f - id: tlc_1 - channel: 1 - tlc59208f_id: tlc59208f_1 - - platform: tlc59208f - id: tlc_2 - channel: 2 - tlc59208f_id: tlc59208f_1 - - platform: tlc59208f - id: tlc_3 - channel: 0 - tlc59208f_id: tlc59208f_2 - - platform: tlc59208f - id: tlc_4 - channel: 1 - tlc59208f_id: tlc59208f_2 - - platform: tlc59208f - id: tlc_5 - channel: 2 - tlc59208f_id: tlc59208f_2 - - platform: tlc59208f - id: tlc_6 - channel: 0 - tlc59208f_id: tlc59208f_3 - - platform: tlc59208f - id: tlc_7 - channel: 1 - tlc59208f_id: tlc59208f_3 - - platform: tlc59208f - id: tlc_8 - channel: 2 - tlc59208f_id: tlc59208f_3 - - platform: gpio - id: id2 - pin: - pcf8574: pcf8574_hub - number: 0 - # allow_other_uses: true - mode: OUTPUT - inverted: false - - platform: gpio - id: id26 - pin: - pca9554: pca9554_hub - number: 0 - # allow_other_uses: true - mode: OUTPUT - inverted: false - - platform: gpio - id: id22 - pin: - mcp23xxx: mcp23017_hub - number: 0 - mode: OUTPUT - inverted: false - - platform: gpio - id: id23 - pin: - mcp23xxx: mcp23008_hub - number: 0 - mode: OUTPUT - inverted: false - - platform: gpio - id: id25 - pin: - mcp23016: mcp23016_hub - number: 0 - mode: OUTPUT - inverted: false - - platform: my9231 - id: my_0 - channel: 0 - - platform: my9231 - id: my_1 - channel: 1 - - platform: my9231 - id: my_2 - channel: 2 - - platform: my9231 - id: my_3 - channel: 3 - - platform: my9231 - id: my_4 - channel: 4 - - platform: my9231 - id: my_5 - channel: 5 - - platform: sm2235 - id: sm2235_red - channel: 1 - - platform: sm2235 - id: sm2235_green - channel: 0 - - platform: sm2235 - id: sm2235_blue - channel: 2 - - platform: sm2235 - id: sm2235_coldwhite - channel: 4 - - platform: sm2235 - id: sm2235_warmwhite - channel: 3 - - platform: sm2335 - id: sm2335_red - channel: 1 - - platform: sm2335 - id: sm2335_green - channel: 0 - - platform: sm2335 - id: sm2335_blue - channel: 2 - - platform: sm2335 - id: sm2335_coldwhite - channel: 4 - - platform: sm2335 - id: sm2335_warmwhite - channel: 3 - - platform: slow_pwm - id: id24 - pin: - allow_other_uses: true - number: GPIO26 - period: 15s - - platform: ac_dimmer - id: dimmer1 - gate_pin: - allow_other_uses: true - number: GPIO5 - zero_cross_pin: - allow_other_uses: true - number: GPIO26 - - platform: esp32_dac - pin: - allow_other_uses: true - number: GPIO25 - id: dac_output - - platform: mcp4725 - id: mcp4725_dac_output - i2c_id: i2c_bus - - platform: mcp4728 - id: mcp4728_dac_output_a - channel: A - vref: vdd - power_down: normal - - platform: mcp4728 - id: mcp4728_dac_output_b - channel: B - vref: internal - gain: X1 - power_down: gnd_1k - - platform: mcp4728 - id: mcp4728_dac_output_c - channel: C - vref: vdd - power_down: gnd_100k - - platform: mcp4728 - id: mcp4728_dac_output_d - channel: D - vref: internal - gain: X2 - power_down: gnd_500k - - platform: bp1658cj - id: bp1658cj_red - channel: 1 - - platform: bp1658cj - id: bp1658cj_green - channel: 2 - - platform: bp1658cj - id: bp1658cj_blue - channel: 0 - - platform: bp1658cj - id: bp1658cj_coldwhite - channel: 3 - - platform: bp1658cj - id: bp1658cj_warmwhite - channel: 4 - - platform: bp5758d - id: bp5758d_red - channel: 2 - current: 10 - - platform: bp5758d - id: bp5758d_green - channel: 3 - current: 10 - - platform: bp5758d - id: bp5758d_blue - channel: 1 - current: 10 - - platform: bp5758d - id: bp5758d_coldwhite - channel: 5 - current: 10 - - platform: bp5758d - id: bp5758d_warmwhite - channel: 4 - current: 10 - - platform: x9c - id: test_x9c - cs_pin: - allow_other_uses: true - number: GPIO25 - inc_pin: - allow_other_uses: true - number: GPIO26 - ud_pin: - allow_other_uses: true - number: GPIO27 - initial_value: 0.5 - -light: - - platform: binary - name: Desk Lamp - output: gpio_26 - effects: - - strobe: - - strobe: - name: My Strobe - colors: - - state: true - duration: 250ms - - state: false - duration: 250ms - on_turn_on: - - switch.template.publish: - id: livingroom_lights - state: true - on_turn_off: - - switch.template.publish: - id: livingroom_lights - state: true - - platform: monochromatic - name: Kitchen Lights - id: kitchen - output: gpio_19 - gamma_correct: 2.8 - default_transition_length: 2s - effects: - - strobe: - - flicker: - - flicker: - name: My Flicker - alpha: 98% - intensity: 1.5% - - lambda: - name: My Custom Effect - update_interval: 1s - lambda: |- - static int state = 0; - state += 1; - if (state == 4) - state = 0; - - pulse: - transition_length: 10s - update_interval: 20s - min_brightness: 10% - max_brightness: 90% - - pulse: - name: pulse2 - transition_length: - on_length: 10s - off_length: 5s - update_interval: 15s - min_brightness: 10% - max_brightness: 90% - - - platform: rgb - name: Living Room Lights - id: ${roomname}_lights - red: pca_0 - green: pca_1 - blue: pca_2 - - platform: rgbw - name: Living Room Lights 2 - red: pca_3 - green: pca_4 - blue: pca_5 - white: pca_6 - color_interlock: true - - platform: rgbww - name: Living Room Lights 2 - red: pca_3 - green: pca_4 - blue: pca_5 - cold_white: pca_6 - warm_white: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - color_interlock: true - - platform: rgbct - name: Living Room Lights 2 - red: pca_3 - green: pca_4 - blue: pca_5 - color_temperature: pca_6 - white_brightness: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - color_interlock: true - - platform: cwww - name: Living Room Lights 2 - cold_white: pca_6 - warm_white: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - constant_brightness: true - - platform: color_temperature - name: Living Room Lights 2 - color_temperature: pca_6 - brightness: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - -remote_transmitter: - - pin: - allow_other_uses: true - number: 32 - carrier_duty_percent: 100% - -climate: - - platform: tcl112 - name: TCL112 Climate With Sensor - supports_heat: true - supports_cool: true - sensor: ${sensorname}_sensor - - platform: tcl112 - name: TCL112 Climate - action_state_topic: action/state/topic - away_command_topic: away/command/topic - away_state_topic: away/state/topic - current_temperature_state_topic: current/temperature/state/topic - fan_mode_command_topic: fan_mode/mode/command/topic - fan_mode_state_topic: fan_mode/mode/state/topic - mode_command_topic: mode/command/topic - mode_state_topic: mode/state/topic - swing_mode_command_topic: swing_mode/command/topic - swing_mode_state_topic: swing_mode/state/topic - target_temperature_command_topic: target/temperature/command/topic - target_temperature_high_command_topic: target/temperature/high/command/topic - target_temperature_high_state_topic: target/temperature/high/state/topic - target_temperature_low_command_topic: target/temperature/low/command/topic - target_temperature_low_state_topic: target/temperature/low/state/topic - target_temperature_state_topic: target/temperature/state/topic - - platform: coolix - name: Coolix Climate With Sensor - supports_heat: true - supports_cool: true - sensor: ${sensorname}_sensor - - platform: coolix - name: Coolix Climate - - platform: fujitsu_general - name: Fujitsu General Climate - - platform: daikin - name: Daikin Climate - - platform: daikin_brc - name: Daikin BRC Climate - use_fahrenheit: true - - platform: delonghi - name: Delonghi Climate - - platform: yashima - name: Yashima Climate - - platform: mitsubishi - name: Mitsubishi - supports_dry: "true" - supports_fan_only: "true" - horizontal_default: "left" - vertical_default: "down" - - platform: whirlpool - name: Whirlpool Climate - - platform: climate_ir_lg - name: LG Climate - - platform: toshiba - name: Toshiba Climate - - platform: hitachi_ac344 - name: Hitachi Climate - - platform: heatpumpir - protocol: mitsubishi_heavy_zm - horizontal_default: left - vertical_default: up - name: HeatpumpIR Climate - min_temperature: 18 - max_temperature: 30 - - platform: heatpumpir - protocol: greeyt - horizontal_default: left - vertical_default: up - name: HeatpumpIR Climate - min_temperature: 18 - max_temperature: 30 - - platform: midea_ir - name: Midea IR - use_fahrenheit: true - - platform: midea - on_control: - - logger.log: Control message received! - - lambda: |- - x.set_mode(CLIMATE_MODE_FAN_ONLY); - on_state: - - logger.log: State changed! - - lambda: |- - if (x.mode == CLIMATE_MODE_FAN_ONLY) - id(binary_sensor1).publish_state(true); - id: midea_unit - uart_id: uart_0 - name: Midea Climate - transmitter_id: - period: 1s - num_attempts: 5 - timeout: 2s - beeper: false - autoconf: true - visual: - min_temperature: 17 °C - max_temperature: 30 °C - temperature_step: 0.5 °C - supported_modes: - - FAN_ONLY - - HEAT_COOL - - COOL - - HEAT - - DRY - custom_fan_modes: - - SILENT - - TURBO - supported_presets: - - ECO - - BOOST - - SLEEP - custom_presets: - - FREEZE_PROTECTION - supported_swing_modes: - - VERTICAL - - HORIZONTAL - - BOTH - outdoor_temperature: - name: Temp - power_usage: - name: Power - humidity_setpoint: - name: Humidity - - platform: anova - name: Anova cooker - ble_client_id: ble_blah - unit_of_measurement: c - icon: mdi:stove - - platform: bedjet - name: My Bedjet - bedjet_id: my_bedjet_client - heat_mode: extended - - platform: whynter - name: Whynter - - platform: noblex - name: AC Living - id: noblex_ac - sensor: ${sensorname}_sensor - receiver_id: rcvr - - platform: gree - name: GREE - model: generic - - platform: zhlt01 - name: ZH/LT-01 Climate - -script: - - id: climate_custom - then: - - climate.control: - id: midea_unit - custom_preset: FREEZE_PROTECTION - custom_fan_mode: SILENT - - id: climate_preset - then: - - climate.control: - id: midea_unit - preset: SLEEP - -switch: - - platform: template - name: MIDEA_AC_BEEPER_CONTROL - optimistic: true - turn_on_action: - midea_ac.beeper_on: - turn_off_action: - midea_ac.beeper_off: - - platform: template - name: MIDEA_RAW - turn_on_action: - - remote_transmitter.transmit_coolix: - first: 0xB21F98 - - remote_transmitter.transmit_coolix: - first: 0xB21F98 - second: 0xB21F98 - - remote_transmitter.transmit_coolix: - first: !lambda "return 0xB21F98;" - second: !lambda "return 0xB21F98;" - - remote_transmitter.transmit_midea: - code: [0xA2, 0x08, 0xFF, 0xFF, 0xFF] - - remote_transmitter.transmit_midea: - code: !lambda "return {0xA2, 0x08, 0xFF, 0xFF, 0xFF};" - - platform: gpio - name: "MCP23S08 Pin #0" - pin: - mcp23xxx: mcp23s08_hub - # Use pin number 0 - number: 0 - mode: OUTPUT - inverted: false - - platform: gpio - name: "MCP23S17 Pin #0" - pin: - mcp23xxx: mcp23s17_hub - # Use pin number 0 - number: 1 - allow_other_uses: true - mode: OUTPUT - inverted: false - - platform: gpio - pin: - allow_other_uses: true - number: GPIO25 - name: Living Room Dehumidifier - icon: "mdi:restart" - inverted: true - command_topic: custom_command_topic - command_retain: true - restore_mode: ALWAYS_OFF - - platform: template - name: JVC Off - id: living_room_lights_on - turn_on_action: - remote_transmitter.transmit_jvc: - data: 0x10EF - - platform: template - name: MagiQuest - turn_on_action: - remote_transmitter.transmit_magiquest: - wand_id: 0x01234567 - - platform: template - name: NEC - id: living_room_lights_off - turn_on_action: - remote_transmitter.transmit_nec: - address: 0x4242 - command: 0x8484 - - platform: template - name: LG - turn_on_action: - remote_transmitter.transmit_lg: - data: 4294967295 - nbits: 28 - - platform: template - name: Samsung - turn_on_action: - remote_transmitter.transmit_samsung: - data: 0xABCDEF - - platform: template - name: Samsung36 - turn_on_action: - remote_transmitter.transmit_samsung36: - address: 0x0400 - command: 0x000E00FF - - platform: template - name: ToshibaAC - turn_on_action: - - remote_transmitter.transmit_toshiba_ac: - rc_code_1: 0xB24DBF4050AF - rc_code_2: 0xD5660001003C - - platform: template - name: Sony - turn_on_action: - remote_transmitter.transmit_sony: - data: 0xABCDEF - nbits: 12 - - platform: template - name: Panasonic - turn_on_action: - remote_transmitter.transmit_panasonic: - address: 0x4004 - command: 0x1000BCD - - platform: template - name: Pioneer - turn_on_action: - - remote_transmitter.transmit_pioneer: - rc_code_1: 0xA556 - rc_code_2: 0xA506 - repeat: - times: 2 - - platform: template - name: RC Switch Raw - turn_on_action: - remote_transmitter.transmit_rc_switch_raw: - code: "00101001100111110101xxxx" - protocol: 1 - - platform: template - name: RC Switch Type A - turn_on_action: - remote_transmitter.transmit_rc_switch_type_a: - group: "11001" - device: "01000" - state: true - protocol: - pulse_length: 175 - sync: [1, 31] - zero: [1, 3] - one: [3, 1] - inverted: false - - platform: template - name: RC Switch Type B - turn_on_action: - remote_transmitter.transmit_rc_switch_type_b: - address: 4 - channel: 2 - state: true - - platform: template - name: RC Switch Type C - turn_on_action: - remote_transmitter.transmit_rc_switch_type_c: - family: "a" - group: 1 - device: 2 - state: true - - platform: template - name: RC Switch Type D - turn_on_action: - remote_transmitter.transmit_rc_switch_type_d: - group: "a" - device: 2 - state: true - - platform: template - name: RC5 - turn_on_action: - remote_transmitter.transmit_rc5: - address: 0x00 - command: 0x0B - - platform: template - name: RC5 - turn_on_action: - remote_transmitter.transmit_raw: - code: [1000, -1000] - - platform: template - name: AEHA - id: eaha_hitachi_climate_power_on - turn_on_action: - remote_transmitter.transmit_aeha: - address: 0x8008 - carrier_frequency: 36700Hz - data: - [ - 0x00, - 0x02, - 0xFD, - 0xFF, - 0x00, - 0x33, - 0xCC, - 0x49, - 0xB6, - 0xC8, - 0x37, - 0x16, - 0xE9, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0xCA, - 0x35, - 0x8F, - 0x70, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - ] - - platform: template - name: Haier - turn_on_action: - remote_transmitter.transmit_haier: - code: - [ - 0xA6, - 0xDA, - 0x00, - 0x00, - 0x40, - 0x40, - 0x00, - 0x80, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - ] - - platform: template - name: Living Room Lights - id: livingroom_lights - optimistic: true - assumed_state: true - turn_on_action: - - switch.turn_on: living_room_lights_on - - output.set_level: - id: gpio_19 - level: 50% - - output.set_level: - id: gpio_19 - level: !lambda "return 0.5;" - - output.set_level: - id: dac_output - level: 50% - - output.set_level: - id: dac_output - level: !lambda "return 0.5;" - - output.set_level: - id: mcp4725_dac_output - level: !lambda "return 0.5;" - - output.set_level: - id: mcp4728_dac_output_a - level: !lambda "return 0.5;" - turn_off_action: - - switch.turn_on: living_room_lights_off - on_turn_on: - - switch.template.publish: - id: livingroom_lights - state: true - - platform: restart - name: Living Room Restart - - platform: safe_mode - name: Living Room Restart (Safe Mode) - - platform: factory_reset - name: Living Room Restart (Factory Default Settings) - - platform: shutdown - name: Living Room Shutdown - - platform: output - name: Generic Output - output: pca_6 - - platform: template - name: Template Switch - id: my_switch - lambda: |- - if (id(binary_sensor1).state) { - return true; - } else { - return {}; - } - id(my_switch).publish_state(false); - id(my_switch).publish_state(true); - if (id(my_switch).state) { - // Switch is ON, do something here - id(my_switch).turn_off(); - id(my_switch).turn_on(); - } else { - // Switch is OFF, do something else here - } - optimistic: true - assumed_state: false - on_turn_off: - - switch.template.publish: - id: my_switch - state: !lambda "return false;" - - platform: uart - uart_id: uart_0 - name: UART String Output - data: DataToSend - - platform: uart - uart_id: uart_0 - name: UART Bytes Output - data: [0xDE, 0xAD, 0xBE, 0xEF] - - platform: uart - uart_id: uart_0 - name: UART Recurring Output - data: [0xDE, 0xAD, 0xBE, 0xEF] - send_every: 1s - - platform: uart - uart_id: uart_0 - name: "UART On/Off" - data: - turn_on: "TurnOn\r\n" - turn_off: "TurnOff\r\n" - - platform: template - assumed_state: true - name: Stepper Switch - turn_on_action: - - stepper.set_target: - id: my_stepper - target: !lambda |- - static int32_t i = 0; - i += 1000; - if (i > 5000) { - i = -5000; - } - return i; - - stepper.report_position: - id: my_stepper - position: 0 - - - platform: gpio - name: "SN74HC595 Pin #0" - pin: - sn74hc595: sn74hc595_hub_2 - # Use pin number 0 - number: 0 - inverted: false - - platform: template - id: ble1_status - optimistic: true - - platform: template - id: outlet_switch - optimistic: true - device_class: outlet - - platform: ld2410 - engineering_mode: - name: "control ld2410 engineering mode" - bluetooth: - name: "control ld2410 bluetooth" - - platform: micronova - stove: - name: Stove on/off - -fan: - - platform: binary - output: gpio_26 - name: Living Room Fan 1 - oscillation_output: gpio_19 - direction_output: gpio_26 - - platform: speed - id: fan_speed - icon: mdi:weather-windy - output: pca_6 - speed_count: 10 - name: Living Room Fan 2 - oscillation_output: gpio_19 - direction_output: gpio_26 - oscillation_state_topic: oscillation/state/topic - oscillation_command_topic: oscillation/command/topic - speed_level_state_topic: speed_level/state/topic - speed_level_command_topic: speed_level/command/topic - speed_state_topic: speed/state/topic - speed_command_topic: speed/command/topic - on_speed_set: - then: - - logger.log: Fan speed was changed! - - platform: speed - id: fan_speed_presets - icon: mdi:weather-windy - output: pca_6 - speed_count: 10 - name: Speed Fan w/ Presets - oscillation_output: gpio_19 - direction_output: gpio_26 - preset_modes: - - Preset 1 - - Preset 2 - on_preset_set: - then: - - logger.log: Preset mode was changed! - - platform: hbridge - id: fan_hbridge_presets - icon: mdi:weather-windy - speed_count: 4 - name: H-bridge Fan w/ Presets - pin_a: pca_6 - pin_b: pca_7 - preset_modes: - - Preset 1 - - Preset 2 - on_preset_set: - then: - - logger.log: Preset mode was changed! - - platform: bedjet - name: My Bedjet fan - bedjet_id: my_bedjet_client - - platform: copy - source_id: fan_speed - name: Fan Speed Copy - -interval: - - interval: 10s - then: - - display.page.show: !lambda |- - if (true) return id(page1); else return id(page2); - - display.page.show_next: display1 - - display.page.show_previous: display1 - - interval: 2s - then: - # yamllint disable rule:line-length - - lambda: |- - static uint16_t btn_left_state = id(btn_left)->get_value(); - - ESP_LOGD("adaptive touch", "___ Touch Pad '%s' (T%u): val: %u state: %u tres:%u", id(btn_left)->get_name().c_str(), id(btn_left)->get_touch_pad(), id(btn_left)->get_value(), btn_left_state, id(btn_left)->get_threshold()); - - btn_left_state = ((uint32_t) id(btn_left)->get_value() + 63 * (uint32_t)btn_left_state) >> 6; - - id(btn_left)->set_threshold(btn_left_state * 0.9); - # yamllint enable rule:line-length - - if: - condition: - display.is_displaying_page: - id: display1 - page_id: page1 - then: - - logger.log: Seeing page 1 - - interval: 60min - then: - - ble_client.connect: ble_blah - - ble_client.ble_write: - id: ble_blah - service_uuid: EBE0CCB0-7A0A-4B0C-8A1A-6FF2997DA3A6 - characteristic_uuid: EBE0CCB7-7A0A-4B0C-8A1A-6FF2997DA3A6 - value: !lambda |- - return {1, 0}; - - ble_client.disconnect: ble_blah - -color: - - id: kbx_red - red: 100% - green_int: 123 - blue: 2% - - id: kbx_blue - red: 0% - green: 1% - blue: 100% - - id: kbx_green - hex: "3DEC55" - -display: - - platform: lcd_gpio - id: my_lcd_gpio - dimensions: 18x4 - data_pins: - - allow_other_uses: true - number: GPIO19 - - allow_other_uses: true - number: GPIO21 - - allow_other_uses: true - number: GPIO22 - - allow_other_uses: true - number: GPIO23 - enable_pin: - allow_other_uses: true - number: GPIO23 - rs_pin: - allow_other_uses: true - number: GPIO25 - lambda: |- - it.print("Hello World!"); - - platform: lcd_pcf8574 - dimensions: 18x4 - address: 0x3F - user_characters: - - position: 0 - data: - - 0b00000 - - 0b01010 - - 0b00000 - - 0b00100 - - 0b00100 - - 0b10001 - - 0b01110 - - 0b00000 - lambda: |- - it.print("Hello World!"); - i2c_id: i2c_bus - - platform: max7219 - cs_pin: - allow_other_uses: true - number: GPIO23 - num_chips: 1 - lambda: |- - it.print("01234567"); - - platform: tm1637 - clk_pin: - allow_other_uses: true - number: GPIO23 - dio_pin: - allow_other_uses: true - number: GPIO25 - intensity: 3 - lambda: |- - it.print("1234"); - - platform: tm1637 - clk_pin: - mcp23xxx: mcp23017_hub - number: 1 - allow_other_uses: true - dio_pin: - mcp23xxx: mcp23017_hub - number: 2 - intensity: 3 - inverted: true - length: 4 - lambda: |- - it.print("1234"); - - platform: pcd8544 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - contrast: 60 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1306_i2c - model: SSD1306_128X64 - reset_pin: - allow_other_uses: true - number: GPIO23 - address: 0x3C - id: display1 - contrast: 60% - pages: - - id: page1 - lambda: |- - it.qr_code(0, 0, id(homepage_qr)); - it.rectangle(0, 0, it.get_width(), it.get_height()); - - id: page2 - lambda: |- - // Nothing - on_page_change: - from: page1 - to: page2 - then: - lambda: |- - ESP_LOGD("display", "1 -> 2"); - i2c_id: i2c_bus - - platform: ssd1306_spi - model: SSD1306 128x64 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1322_spi - model: SSD1322 256x64 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1325_spi - model: SSD1325 128x64 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1327_i2c - model: SSD1327 128X128 - reset_pin: - allow_other_uses: true - number: GPIO23 - address: 0x3D - id: display1327 - brightness: 60% - pages: - - id: page13271 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - id: page13272 - lambda: |- - // Nothing - i2c_id: i2c_bus - - platform: ssd1327_spi - model: SSD1327 128x128 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1331_spi - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1351_spi - model: SSD1351 128x128 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7789v - model: TTGO TDisplay 135x240 - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO16 - reset_pin: - allow_other_uses: true - number: GPIO23 - backlight_pin: false - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7920 - width: 128 - height: 64 - cs_pin: - allow_other_uses: true - number: GPIO23 - inverted: true - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7567_i2c - id: st7735_display_i2c - address: 0x3F - i2c_id: i2c_bus - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7567_spi - id: st7735_display_spi - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO16 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7735 - id: st7735_display - model: INITR_BLACKTAB - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO16 - reset_pin: - allow_other_uses: true - number: GPIO23 - rotation: 0 - device_width: 128 - device_height: 160 - col_start: 0 - row_start: 0 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ili9xxx - invert_colors: true - dimensions: 320x240 - transform: - swap_xy: true - mirror_x: true - mirror_y: false - model: TFT 2.4 - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO4 - color_palette: GRAYSCALE - reset_pin: - allow_other_uses: true - number: GPIO22 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ili9xxx - dimensions: - width: 320 - height: 240 - offset_width: 20 - offset_height: 10 - model: TFT 2.4 - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO4 - reset_pin: - allow_other_uses: true - number: GPIO22 - auto_clear_enabled: false - rotation: 90 - lambda: |- - if (!id(glob_bool_processed)) { - it.fill(Color::WHITE); - id(glob_bool_processed) = true; - } - - platform: pvvx_mithermometer - ble_client_id: ble_foo - time_id: sntp_time - disconnect_delay: 3s - update_interval: 10min - validity_period: 20min - lambda: |- - it.print_bignum(188.8); - it.print_unit(pvvx_mithermometer::UNIT_DEG_E); - it.print_smallnum(88); - it.print_percent(true); - it.print_happy(true); - it.print_sad(true); - it.print_bracket(true); - it.print_battery(true); - - platform: tm1621 - id: tm1621_display - cs_pin: - allow_other_uses: true - number: GPIO17 - data_pin: - allow_other_uses: true - number: GPIO5 - read_pin: - allow_other_uses: true - number: GPIO23 - write_pin: - allow_other_uses: true - number: GPIO18 - lambda: |- - it.printf(0, "%.1f", id(dht_temperature).state); - it.display_celsius(true); - it.printf(1, "%.1f", id(dht_humidity).state); - it.display_humidity(true); - -tm1651: - id: tm1651_battery - clk_pin: - allow_other_uses: true - number: GPIO23 - dio_pin: - allow_other_uses: true - number: GPIO23 - -remote_receiver: - id: rcvr - pin: - allow_other_uses: true - number: GPIO32 - dump: all - on_coolix: - then: - delay: !lambda "return x.first + x.second;" - on_rc_switch: - then: - delay: !lambda "return uint32_t(x.code) + x.protocol;" - -status_led: - pin: - allow_other_uses: true - number: GPIO2 - ignore_strapping_warning: true - -pn532_spi: - id: pn532_bs - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - - mqtt.publish: - topic: the/topic - payload: !lambda "return x;" - on_tag_removed: - - lambda: |- - ESP_LOGD("main", "Removed tag %s", x.c_str()); - - mqtt.publish: - topic: the/topic - payload: !lambda "return x;" - -pn532_i2c: - i2c_id: i2c_bus - -pn7150_i2c: - id: nfcc_pn7150_i2c - i2c_id: i2c_bus - irq_pin: - allow_other_uses: true - number: GPIO32 - ven_pin: - allow_other_uses: true - number: GPIO16 - -pn7160_i2c: - id: nfcc_pn7160_i2c - i2c_id: i2c_bus - dwl_req_pin: - allow_other_uses: true - number: GPIO17 - irq_pin: - allow_other_uses: true - number: GPIO35 - ven_pin: - allow_other_uses: true - number: GPIO16 - wkup_req_pin: - allow_other_uses: true - number: GPIO21 - emulation_message: https://www.home-assistant.io/tag/pulse_ce - tag_ttl: 1000ms - -pn7160_spi: - id: nfcc_pn7160_spi - cs_pin: - number: GPIO15 - dwl_req_pin: - allow_other_uses: true - number: GPIO17 - irq_pin: - allow_other_uses: true - number: GPIO35 - ven_pin: - allow_other_uses: true - number: GPIO16 - wkup_req_pin: - allow_other_uses: true - number: GPIO21 - emulation_message: https://www.home-assistant.io/tag/pulse_ce - tag_ttl: 1000ms - -rdm6300: - uart_id: uart_0 - -rc522_spi: - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - -rc522_i2c: - - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - i2c_id: i2c_bus - - - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - i2c_id: i2c_bus - -mcp4728: - - id: mcp4728_dac - store_in_eeprom: false - address: 0x60 - i2c_id: i2c_bus - -gps: - uart_id: uart_0 - -time: - - platform: sntp - id: sntp_time - servers: - - 0.pool.ntp.org - - 1.pool.ntp.org - - 192.168.178.1 - on_time: - cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI" - then: - - lambda: 'ESP_LOGD("main", "time");' - - platform: gps - on_time_sync: - then: - ds1307.write_time: - id: ds1307_time - - platform: ds1307 - id: ds1307_time - update_interval: never - i2c_id: i2c_bus - on_time: - - seconds: 0 - then: ds1307.read_time - - at: "16:00:00" - then: - - if: - condition: - or: - - binary_sensor.is_on: close_sensor - - binary_sensor.is_on: open_sensor - then: - logger.log: "close_sensor or open_sensor is on" - - if: - condition: - and: - - binary_sensor.is_on: close_sensor - - binary_sensor.is_on: open_sensor - then: - logger.log: "close_sensor and open_sensor are both on" - - if: - condition: - xor: - - binary_sensor.is_on: close_sensor - - binary_sensor.is_on: open_sensor - then: - logger.log: "close_sensor or open_sensor is exclusively on" - - if: - condition: - not: - - binary_sensor.is_on: close_sensor - then: - logger.log: "close_sensor is not on" -cover: - - platform: template - name: Template Cover - id: template_cover - lambda: |- - if (id(binary_sensor1).state) { - return COVER_OPEN; - } else { - return {}; - } - optimistic: true - open_action: - - cover.template.publish: - id: template_cover - state: CLOSED - assumed_state: false - has_position: true - position_state_topic: position/state/topic - position_command_topic: position/command/topic - tilt_lambda: !lambda "return 0.5;" - tilt_state_topic: tilt/state/topic - tilt_command_topic: tilt/command/topic - on_open: - then: - - lambda: 'ESP_LOGD("cover", "open");' - on_closed: - then: - - lambda: 'ESP_LOGD("cover", "closed");' - - platform: am43 - name: Test AM43 - id: am43_test - ble_client_id: ble_foo - icon: mdi:blinds - - platform: feedback - name: Feedback Cover - id: gate - device_class: gate - - infer_endstop_from_movement: false - has_built_in_endstop: false - max_duration: 30s - direction_change_wait_time: 300ms - acceleration_wait_time: 150ms - obstacle_rollback: 10% - - open_duration: 22.1s - open_endstop: open_endstop_sensor - open_sensor: open_sensor - open_obstacle_sensor: open_obstacle_sensor - - close_duration: 22.4s - close_endstop: close_endstop_sensor - close_sensor: close_sensor - close_obstacle_sensor: close_obstacle_sensor - - open_action: - - logger.log: Open Action - - close_action: - - logger.log: Close Action - - stop_action: - - logger.log: Stop Action - -debug: - -tca9548a: - - address: 0x70 - id: multiplex0 - channels: - - bus_id: multiplex0_chan0 - channel: 0 - i2c_id: i2c_bus - - address: 0x71 - id: multiplex1 - i2c_id: multiplex0_chan0 - -pcf8574: - - id: pcf8574_hub - address: 0x21 - pcf8575: false - i2c_id: i2c_bus - -pca9554: - - id: pca9554_hub - pin_count: 8 - address: 0x3F - i2c_id: i2c_bus - -pca6416a: - - id: pca6416a_hub - address: 0x21 - i2c_id: i2c_bus - -mcp23017: - - id: mcp23017_hub - open_drain_interrupt: true - i2c_id: i2c_bus - -mcp23008: - - id: mcp23008_hub - address: 0x22 - open_drain_interrupt: true - i2c_id: i2c_bus - -mcp23016: - - id: mcp23016_hub - address: 0x23 - i2c_id: i2c_bus - -stepper: - - platform: a4988 - id: my_stepper - step_pin: - allow_other_uses: true - number: GPIO23 - dir_pin: - allow_other_uses: true - number: GPIO25 - sleep_pin: - allow_other_uses: true - number: GPIO25 - max_speed: 250 steps/s - acceleration: 100 steps/s^2 - deceleration: 200 steps/s^2 - -globals: - - id: glob_int - type: int - restore_value: true - initial_value: "0" - - id: glob_float - type: float - restore_value: true - initial_value: "0.0f" - - id: glob_bool - type: bool - restore_value: false - initial_value: "true" - - id: glob_string - type: std::string - restore_value: false - # initial_value: "" - - id: glob_bool_processed - type: bool - restore_value: false - initial_value: "false" - -text_sensor: - - platform: ble_client - ble_client_id: ble_foo - name: Sensor Location - service_uuid: "180d" - characteristic_uuid: "2a38" - descriptor_uuid: "2902" - notify: true - update_interval: never - on_notify: - then: - - lambda: |- - ESP_LOGD("green_btn", "Location changed: %s", x.c_str()); - - platform: mqtt_subscribe - name: MQTT Subscribe Text - topic: "the/topic" - qos: 2 - on_value: - - text_sensor.template.publish: - id: ${textname}_text - state: Hello World - - text_sensor.template.publish: - id: ${textname}_text - state: |- - return "Hello World2"; - - globals.set: - id: glob_int - value: "0" - - canbus.send: - canbus_id: mcp2515_can - can_id: 23 - data: [0x10, 0x20, 0x30] - - canbus.send: - canbus_id: mcp2515_can - can_id: 23 - data: !lambda return {0x10, 0x20, 0x30}; - - canbus.send: - canbus_id: esp32_internal_can - can_id: 23 - data: [0x10, 0x20, 0x30] - - canbus.send: - canbus_id: mcp2515_can - can_id: 24 - remote_transmission_request: true - data: [] - - canbus.send: - canbus_id: esp32_internal_can - can_id: 24 - remote_transmission_request: true - data: [] - - platform: template - name: Template Text Sensor - id: ${textname}_text - - platform: template - name: Template Text Sensor Timestamp - id: ${textname}_text_timestamp - device_class: timestamp - - platform: wifi_info - scan_results: - name: Scan Results - ip_address: - name: IP Address - ssid: - name: SSID - bssid: - name: BSSID - mac_address: - name: Mac Address - dns_address: - name: DNS ADdress - - platform: version - name: ESPHome Version No Timestamp - hide_timestamp: true - - platform: teleinfo - tag_name: OPTARIF - name: optarif - teleinfo_id: myteleinfo - - platform: ld2410 - version: - name: "presenece sensor version" - mac_address: - name: "presenece sensor mac address" - -sn74hc595: - - id: sn74hc595_hub - data_pin: - allow_other_uses: true - number: GPIO21 - clock_pin: - allow_other_uses: true - number: GPIO23 - latch_pin: - allow_other_uses: true - number: GPIO22 - oe_pin: - allow_other_uses: true - number: GPIO32 - sr_count: 2 - - id: sn74hc595_hub_2 - latch_pin: - allow_other_uses: true - number: GPIO22 - oe_pin: - allow_other_uses: true - number: GPIO32 - sr_count: 2 - spi_id: spi_bus - type: spi - -rtttl: - output: gpio_19 - -canbus: - - platform: mcp2515 - id: mcp2515_can - cs_pin: - pca9554: pca9554_hub - number: 7 - mode: - output: true - inverted: true - can_id: 4 - bit_rate: 50kbps - on_frame: - - can_id: 500 - then: - - lambda: |- - std::string b(x.begin(), x.end()); - ESP_LOGD("canid 500", "%s", b.c_str()); - - can_id: 23 - then: - - if: - condition: - lambda: "return x[0] == 0x11;" - then: - light.toggle: ${roomname}_lights - - can_id: 0b00000000000000000000001000000 - can_id_mask: 0b11111000000000011111111000000 - use_extended_id: true - then: - - lambda: |- - auto pdo_id = can_id >> 14; - switch (pdo_id) - { - case 117: - ESP_LOGD("canbus", "exhaust_fan_duty"); - break; - case 118: - ESP_LOGD("canbus", "supply_fan_duty"); - break; - case 119: - ESP_LOGD("canbus", "supply_fan_flow"); - break; - // to be continued... - } - - platform: esp32_can - id: esp32_internal_can - rx_pin: - allow_other_uses: true - number: GPIO04 - tx_pin: - allow_other_uses: true - number: GPIO05 - can_id: 4 - bit_rate: 50kbps - on_frame: - - can_id: 500 - then: - - lambda: |- - std::string b(x.begin(), x.end()); - ESP_LOGD("canid 500", "%s", b.c_str() ); - - can_id: 23 - then: - - if: - condition: - lambda: "return x[0] == 0x11;" - then: - light.toggle: ${roomname}_lights - - can_id: 0b00000000000000000000001000000 - can_id_mask: 0b11111000000000011111111000000 - use_extended_id: true - then: - - lambda: |- - auto pdo_id = can_id >> 14; - switch (pdo_id) - { - case 117: - ESP_LOGD("canbus", "exhaust_fan_duty"); - break; - case 118: - ESP_LOGD("canbus", "supply_fan_duty"); - break; - case 119: - ESP_LOGD("canbus", "supply_fan_flow"); - break; - // to be continued... - } - -teleinfo: - id: myteleinfo - uart_id: uart_0 - update_interval: 60s - historical_mode: true - -number: - - platform: template - id: test_number - state_topic: livingroom/custom_state_topic - command_topic: livingroom/custom_command_topic - min_value: 0 - step: 1 - max_value: 10 - optimistic: true - - platform: ld2410 - light_threshold: - name: light threshold - timeout: - name: timeout - max_move_distance_gate: - name: max move distance gate - max_still_distance_gate: - name: max still distance gate - g0: - move_threshold: - name: g0 move threshold - still_threshold: - name: g0 still threshold - g1: - move_threshold: - name: g1 move threshold - still_threshold: - name: g1 still threshold - g2: - move_threshold: - name: g2 move threshold - still_threshold: - name: g2 still threshold - g3: - move_threshold: - name: g3 move threshold - still_threshold: - name: g3 still threshold - g4: - move_threshold: - name: g4 move threshold - still_threshold: - name: g4 still threshold - g5: - move_threshold: - name: g5 move threshold - still_threshold: - name: g5 still threshold - g6: - move_threshold: - name: g6 move threshold - still_threshold: - name: g6 still threshold - g7: - move_threshold: - name: g7 move threshold - still_threshold: - name: g7 still threshold - g8: - move_threshold: - name: g8 move threshold - still_threshold: - name: g8 still threshold - - platform: micronova - thermostat_temperature: - name: Micronova Thermostaat - step: 1 - power_level: - name: Micronova Power level - -select: - - platform: template - id: test_select - state_topic: livingroom/custom_state_topic - command_topic: livingroom/custom_command_topic - options: - - one - - two - optimistic: true - - platform: copy - source_id: test_select - name: Test Select Copy - - platform: ld2410 - distance_resolution: - name: distance resolution - baud_rate: - name: baud rate - light_function: - name: light function - out_pin_level: - name: out ping level - -qr_code: - - id: homepage_qr - value: https://esphome.io/index.html - -lock: - - platform: template - id: test_lock1 - name: Template Switch - lambda: |- - if (id(binary_sensor1).state) { - return LOCK_STATE_LOCKED; - }else{ - return LOCK_STATE_UNLOCKED; - } - optimistic: true - assumed_state: false - on_unlock: - - lock.template.publish: - id: test_lock1 - state: !lambda "return LOCK_STATE_UNLOCKED;" - on_lock: - - lock.template.publish: - id: test_lock1 - state: !lambda "return LOCK_STATE_LOCKED;" - - platform: output - name: Generic Output Lock - id: test_lock2 - output: pca_6 - - platform: copy - source_id: test_lock2 - name: Generic Output Lock Copy - -button: - - platform: template - name: Start calibration - on_press: - - scd4x.perform_forced_calibration: - value: 419 - id: scd40 - - scd4x.factory_reset: - id: scd40 - - platform: template - name: Midea Display Toggle - on_press: - midea_ac.display_toggle: - - platform: template - name: Midea Swing Step - on_press: - midea_ac.swing_step: - - platform: template - name: Midea Power On - on_press: - midea_ac.power_on: - - platform: template - name: Midea Power Off - on_press: - midea_ac.power_off: - - platform: template - name: Midea Power Inverse - on_press: - midea_ac.power_toggle: - - platform: template - name: Update Mmwave Sensor Settings - on_press: - - dfrobot_sen0395.settings: - id: mmwave - factory_reset: true - detection_segments: - - [0cm, 5m] - - 600cm - - !lambda |- - return 7; - output_latency: - delay_after_detect: 0s - delay_after_disappear: 0s - sensitivity: 6 - - platform: template - name: Reset Mmwave Sensor - on_press: - - dfrobot_sen0395.reset: - - platform: template - name: Poller component suspend test - on_press: - - component.suspend: myteleinfo - - delay: 20s - - component.update: myteleinfo - - delay: 20s - - component.resume: myteleinfo - - delay: 20s - - component.resume: - id: myteleinfo - update_interval: 2s - - delay: 20s - - component.resume: - id: myteleinfo - update_interval: !lambda return 2500; - - platform: ld2410 - factory_reset: - name: "factory reset" - restart: - name: "restart" - query_params: - name: query params - - platform: uart - uart_id: uart_0 - name: UART button - data: "Pressed\r\n" - - platform: micronova - custom_button: - name: Custom Micronova Button - memory_location: 0xA0 - memory_address: 0x7D - memory_data: 0x0F - -ld2410: - id: my_ld2410 - uart_id: ld2410_uart - -ld2420: - id: my_ld2420 - uart_id: ld2420_uart - -lcd_menu: - id: test_lcd_menu - display_id: my_lcd_gpio - mark_back: 0x5e - mark_selected: 0x3e - mark_editing: 0x2a - mark_submenu: 0x7e - active: false - mode: rotary - on_enter: - then: - lambda: 'ESP_LOGI("lcd_menu", "root enter");' - on_leave: - then: - lambda: 'ESP_LOGI("lcd_menu", "root leave");' - items: - - type: back - text: Back - - type: label - - type: menu - text: Submenu 1 - items: - - type: back - text: Back - - type: menu - text: Submenu 21 - items: - - type: back - text: Back - - type: command - text: Show Main - on_value: - then: - - display_menu.show_main: test_lcd_menu - - type: select - text: Enum Item - immediate_edit: true - select: test_select - on_enter: - then: - lambda: 'ESP_LOGI("lcd_menu", "select enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("lcd_menu", "select leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("lcd_menu", "select value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: number - text: Number - number: test_number - on_enter: - then: - lambda: 'ESP_LOGI("lcd_menu", "number enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("lcd_menu", "number leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("lcd_menu", "number value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: command - text: Hide - on_value: - then: - - display_menu.hide: test_lcd_menu - - type: switch - text: Switch - switch: my_switch - on_text: Bright - off_text: Dark - immediate_edit: false - on_value: - then: - lambda: 'ESP_LOGI("lcd_menu", "switch value: %s", it->get_value_text().c_str());' - - type: custom - text: !lambda 'return "Custom";' - value_lambda: 'return "Val";' - on_next: - then: - lambda: 'ESP_LOGI("lcd_menu", "custom next: %s", it->get_text().c_str());' - on_prev: - then: - lambda: 'ESP_LOGI("lcd_menu", "custom prev: %s", it->get_text().c_str());' - -font: - - file: "gfonts://Roboto" - id: roboto - size: 20 - -graphical_display_menu: - id: test_graphical_display_menu - display: st7735_display - font: roboto - active: false - mode: rotary - on_enter: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "root enter");' - on_leave: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "root leave");' - items: - - type: back - text: "Back" - - type: label - - type: menu - text: "Submenu 1" - items: - - type: back - text: "Back" - - type: menu - text: "Submenu 21" - items: - - type: back - text: "Back" - - type: command - text: "Show Main" - on_value: - then: - - display_menu.show_main: test_graphical_display_menu - - type: select - text: "Enum Item" - immediate_edit: true - select: test_select - on_enter: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "select enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "select leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "select value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: number - text: "Number" - number: test_number - on_enter: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "number enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "number leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "number value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: command - text: "Hide" - on_value: - then: - - display_menu.hide: test_graphical_display_menu - - type: switch - text: "Switch" - switch: my_switch - on_text: "Bright" - off_text: "Dark" - immediate_edit: false - on_value: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "switch value: %s", it->get_value_text().c_str());' - - type: custom - text: !lambda 'return "Custom";' - value_lambda: 'return "Val";' - on_next: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "custom next: %s", it->get_text().c_str());' - on_prev: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "custom prev: %s", it->get_text().c_str());' - -alarm_control_panel: - - platform: template - id: alarmcontrolpanel1 - name: Alarm Panel - codes: - - "1234" - requires_code_to_arm: true - arming_home_time: 1s - arming_away_time: 15s - pending_time: 15s - trigger_time: 30s - binary_sensors: - - binary_sensor1 - on_state: - then: - - lambda: !lambda |- - ESP_LOGD("TEST", "State change %s", alarm_control_panel_state_to_string(id(alarmcontrolpanel1)->get_state())); diff --git a/tests/test11.5.yaml b/tests/test11.5.yaml deleted file mode 100644 index 758f295a6c..0000000000 --- a/tests/test11.5.yaml +++ /dev/null @@ -1,809 +0,0 @@ ---- -# copy of test5.yaml configured to build on IDF 5 -esphome: - name: test11-5 - build_path: build/test11.5 - project: - name: esphome.test11_5_project - version: "1.0.0" - -esp32: - board: nodemcu-32s - framework: - type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 - advanced: - ignore_efuse_mac_crc: true - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - manual_ip: - static_ip: 192.168.1.23 - gateway: 192.168.1.1 - subnet: 255.255.255.0 - -network: - enable_ipv6: true - -api: - -ota: - - platform: esphome - -logger: - -debug: - -psram: - -uart: - - id: uart_1 - tx_pin: 1 - rx_pin: 3 - baud_rate: 9600 - - id: uart_2 - tx_pin: - allow_other_uses: true - number: 17 - rx_pin: - allow_other_uses: true - number: 16 - baud_rate: 19200 - -i2c: - sda: - number: 21 - allow_other_uses: true - frequency: 100khz - -spi: - - id: spi_1 - clk_pin: - allow_other_uses: true - number: 12 - mosi_pin: - allow_other_uses: true - number: 13 - miso_pin: - allow_other_uses: true - number: 14 - - id: spi_2 - clk_pin: - allow_other_uses: true - number: 32 - mosi_pin: 33 - -modbus: - uart_id: uart_1 - flow_control_pin: - allow_other_uses: true - number: 5 - id: mod_bus1 - -modbus_controller: - - id: modbus_controller_test - address: 0x2 - modbus_id: mod_bus1 - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant - idf_send_async: false - on_message: - topic: testing/sensor/testing_sensor/state - qos: 0 - then: - # yamllint disable rule:line-length - - lambda: |- - ESP_LOGD("Mqtt Test", "testing/sensor/testing_sensor/state=[%s]", x.c_str()); - # yamllint enable rule:line-length - -vbus: - - uart_id: uart_2 - -binary_sensor: - - platform: gpio - pin: GPIO0 - id: io0_button - icon: mdi:gesture-tap-button - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_binsensortest - register_type: read - address: 0x3200 - bitmask: 0x80 # (bit 8) - lambda: "return x;" - - - platform: tm1638 - id: Button0 - key: 0 - filters: - - delayed_on: 10ms - on_press: - then: - - switch.turn_on: Led0 - on_release: - then: - - switch.turn_off: Led0 - - if: - condition: ble.enabled - then: - - ble.disable: - else: - - ble.enable: - - - platform: tm1638 - id: Button1 - key: 1 - on_press: - then: - - switch.turn_on: Led1 - on_release: - then: - - switch.turn_off: Led1 - - - platform: tm1638 - id: Button2 - key: 2 - on_press: - then: - - switch.turn_on: Led2 - on_release: - then: - - switch.turn_off: Led2 - - - platform: tm1638 - id: Button3 - key: 3 - on_press: - then: - - switch.turn_on: Led3 - on_release: - then: - - switch.turn_off: Led3 - - - platform: tm1638 - id: Button4 - key: 4 - on_press: - then: - - output.turn_on: Led4 - on_release: - then: - - output.turn_off: Led4 - - - platform: tm1638 - id: Button5 - key: 5 - on_press: - then: - - output.turn_on: Led5 - on_release: - then: - - output.turn_off: Led5 - - - platform: tm1638 - id: Button6 - key: 6 - on_press: - then: - - output.turn_on: Led6 - on_release: - then: - - output.turn_off: Led6 - - - platform: tm1638 - id: Button7 - key: 7 - on_press: - then: - - output.turn_on: Led7 - on_release: - then: - - output.turn_off: Led7 - - - platform: gpio - id: sn74hc165_pin_0 - pin: - sn74hc165: sn74hc165_hub - number: 0 - - - platform: ezo_pmp - pump_state: - name: "Pump State" - is_paused: - name: "Is Paused" - - - platform: matrix_keypad - keypad_id: keypad - id: key4 - row: 1 - col: 1 - - platform: matrix_keypad - id: key1 - key: 1 - - - platform: vbus - model: deltasol_bs_plus - relay2: - name: Relay 2 On - sensor1_error: - name: Sensor 1 Error - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - binary_sensors: - - id: vcustom_b - name: VBus Custom Binary Sensor - lambda: return x[0] & 1; - -tlc5947: - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - lat_pin: - allow_other_uses: true - number: GPIO15 - -gp8403: - - id: gp8403_5v - voltage: 5V - - id: gp8403_10v - voltage: 10V - -output: - - platform: gpio - pin: GPIO2 - id: built_in_led - - - platform: tlc5947 - id: output_red - channel: 0 - max_power: 0.8 - - - platform: mcp47a1 - id: output_mcp47a1 - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_output_test - lambda: |- - return x * 1.0 ; - address: 0x9001 - value_type: U_WORD - - - platform: tm1638 - id: Led4 - led: 4 - - - platform: tm1638 - id: Led5 - led: 5 - - - platform: tm1638 - id: Led6 - led: 6 - - - platform: tm1638 - id: Led7 - led: 7 - - - platform: gp8403 - id: gp8403_output_0 - gp8403_id: gp8403_5v - channel: 0 - - platform: gp8403 - gp8403_id: gp8403_10v - id: gp8403_output_1 - channel: 1 - -demo: - -esp32_ble: - enable_on_boot: false - -esp32_ble_server: - manufacturer: ESPHome - model: Test11 - -esp32_improv: - authorizer: io0_button - authorized_duration: 1min - status_indicator: built_in_led - -ezo_pmp: - id: hcl_pump - update_interval: 1s - -number: - - platform: template - name: My template number - id: template_number_id - optimistic: true - max_value: 100 - min_value: 0 - step: 5 - unit_of_measurement: "%" - mode: slider - device_class: humidity - on_value: - - logger.log: - format: Number changed to %f - args: [x] - set_action: - - logger.log: - format: Template Number set to %f - args: [x] - - number.set: - id: template_number_id - value: 50 - - number.to_min: template_number_id - - number.to_min: - id: template_number_id - - number.to_max: template_number_id - - number.to_max: - id: template_number_id - - number.increment: template_number_id - - number.increment: - id: template_number_id - cycle: false - - number.decrement: template_number_id - - number.decrement: - id: template_number_id - cycle: false - - number.operation: - id: template_number_id - operation: Increment - cycle: false - - number.operation: - id: template_number_id - operation: !lambda "return NUMBER_OP_INCREMENT;" - cycle: !lambda "return false;" - - - id: modbus_numbertest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - name: ModbusNumber - address: 0x9002 - value_type: U_WORD - lambda: "return x * 1.0;" - write_lambda: |- - return x * 1.0 ; - multiply: 1.0 - -select: - - platform: template - name: My template select - id: template_select_id - optimistic: true - initial_option: two - restore_value: true - on_value: - - logger.log: - format: Select changed to %s (index %d)" - args: ["x.c_str()", "i"] - set_action: - - logger.log: - format: Template Select set to %s - args: ["x.c_str()"] - - select.set: - id: template_select_id - option: two - - select.first: template_select_id - - select.last: - id: template_select_id - - select.previous: template_select_id - - select.next: - id: template_select_id - cycle: false - - select.operation: - id: template_select_id - operation: Previous - cycle: false - - select.operation: - id: template_select_id - operation: !lambda "return SELECT_OP_PREVIOUS;" - cycle: !lambda "return true;" - - select.set_index: - id: template_select_id - index: 1 - - select.set_index: - id: template_select_id - index: !lambda "return 1 + 1;" - options: - - one - - two - - three - - - platform: modbus_controller - name: Modbus Select Register 1000 - address: 1000 - value_type: U_WORD - optionsmap: - "Zero": 0 - "One": 1 - "Two": 2 - "Three": 3 - -sensor: - - platform: adc - id: adc_sensor_p32 - name: ADC pin 32 - pin: - allow_other_uses: true - number: 32 - attenuation: 11db - update_interval: 1s - - platform: internal_temperature - name: Internal Temperature - - platform: selec_meter - total_active_energy: - name: SelecEM2M Total Active Energy - import_active_energy: - name: SelecEM2M Import Active Energy - export_active_energy: - name: SelecEM2M Export Active Energy - total_reactive_energy: - name: SelecEM2M Total Reactive Energy - import_reactive_energy: - name: SelecEM2M Import Reactive Energy - export_reactive_energy: - name: SelecEM2M Export Reactive Energy - apparent_energy: - name: SelecEM2M Apparent Energy - active_power: - name: SelecEM2M Active Power - reactive_power: - name: SelecEM2M Reactive Power - apparent_power: - name: SelecEM2M Apparent Power - voltage: - name: SelecEM2M Voltage - current: - name: SelecEM2M Current - power_factor: - name: SelecEM2M Power Factor - frequency: - name: SelecEM2M Frequency - maximum_demand_active_power: - name: SelecEM2M Maximum Demand Active Power - disabled_by_default: true - maximum_demand_reactive_power: - name: SelecEM2M Maximum Demand Reactive Power - disabled_by_default: true - maximum_demand_apparent_power: - name: SelecEM2M Maximum Demand Apparent Power - disabled_by_default: true - - - id: modbus_sensortest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - address: 0x331A - register_type: read - value_type: U_WORD - - - platform: t6615 - uart_id: uart_2 - co2: - name: CO2 Sensor - - - platform: sen5x - id: sen54 - temperature: - name: Temperature - accuracy_decimals: 1 - humidity: - name: Humidity - accuracy_decimals: 0 - pm_1_0: - name: PM <1µm Weight concentration - id: pm_1_0 - accuracy_decimals: 1 - pm_2_5: - name: PM <2.5µm Weight concentration - id: pm_2_5 - accuracy_decimals: 1 - pm_4_0: - name: PM <4µm Weight concentration - id: pm_4_0 - accuracy_decimals: 1 - pm_10_0: - name: PM <10µm Weight concentration - id: pm_10_0 - accuracy_decimals: 1 - nox: - name: NOx - voc: - name: VOC - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - temperature_compensation: - offset: 0 - normalized_offset_slope: 0 - time_constant: 0 - auto_cleaning_interval: 604800s - acceleration_mode: low - store_baseline: true - address: 0x69 - - platform: mcp9600 - thermocouple_type: K - hot_junction: - name: Thermocouple Temperature - cold_junction: - name: Ambient Temperature - - - platform: ezo_pmp - current_volume_dosed: - name: Current Volume Dosed - total_volume_dosed: - name: Total Volume Dosed - absolute_total_volume_dosed: - name: Absolute Total Volume Dosed - pump_voltage: - name: Pump Voltage - last_volume_requested: - name: Last Volume Requested - max_flow_rate: - name: Max Flow Rate - - - platform: vbus - model: deltasol c - temperature_3: - name: Temperature 3 - operating_hours_1: - name: Operating Hours 1 - heat_quantity: - name: Heat Quantity - time: - name: System Time - - - platform: debug - free: - name: "Heap Free" - block: - name: "Heap Max Block" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - sensors: - - id: vcustom - name: VBus Custom Sensor - lambda: return x[0] / 10.0; - - - platform: kuntze - ph: - name: Kuntze pH - temperature: - name: Kuntze temperature - - - platform: ade7953_i2c - irq_pin: - allow_other_uses: true - number: 16 - voltage: - name: ADE7953 Voltage - current_a: - name: ADE7953 Current A - current_b: - name: ADE7953 Current B - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - - - platform: ade7953_spi - spi_id: spi_1 - cs_pin: 04 - irq_pin: - allow_other_uses: true - number: 16 - voltage: - name: ADE7953 Voltage - current_a: - name: ADE7953 Current A - current_b: - name: ADE7953 Current B - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - -script: - - id: automation_test - then: - - repeat: - count: 5 - then: - - logger.log: looping! - - - id: zero_repeat_test - then: - - repeat: - count: !lambda "return 0;" - then: - - logger.log: shouldn't see mee! - -switch: - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_switch_test - register_type: coil - address: 2 - bitmask: 1 - - - platform: tm1638 - id: Led0 - led: 0 - name: TM1638Led0 - - - platform: tm1638 - id: Led1 - led: 1 - name: TM1638Led1 - - - platform: tm1638 - id: Led2 - led: 2 - name: TM1638Led2 - - - platform: tm1638 - id: Led3 - led: 3 - name: TM1638Led3 - -display: - - platform: tm1638 - id: primarydisplay - stb_pin: - allow_other_uses: true - number: 5 # TM1638 STB - clk_pin: 18 # TM1638 CLK - dio_pin: 23 # TM1638 DIO - update_interval: 5s - intensity: 5 - lambda: |- - it.print("81818181"); - -time: - - platform: pcf85063 - - platform: pcf8563 - -text_sensor: - - platform: ezo_pmp - dosing_mode: - name: Dosing Mode - calibration_status: - name: Calibration Status - on_value: - - ezo_pmp.dose_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.dose_volume_over_time: - id: hcl_pump - volume: 10 - duration: 2 - - ezo_pmp.dose_with_constant_flow_rate: - id: hcl_pump - volume_per_minute: 10 - duration: 2 - - ezo_pmp.set_calibration_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.find: hcl_pump - - ezo_pmp.dose_continuously: hcl_pump - - ezo_pmp.clear_total_volume_dosed: hcl_pump - - ezo_pmp.clear_calibration: hcl_pump - - ezo_pmp.pause_dosing: hcl_pump - - ezo_pmp.stop_dosing: hcl_pump - - ezo_pmp.arbitrary_command: - id: hcl_pump - command: D,? - -sn74hc165: - id: sn74hc165_hub - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - load_pin: - number: GPIO27 - clock_inhibit_pin: - number: GPIO26 - sr_count: 4 - -matrix_keypad: - id: keypad - rows: - - pin: - allow_other_uses: true - number: 21 - - pin: 19 - columns: - - pin: - allow_other_uses: true - number: 17 - - pin: - allow_other_uses: true - number: 16 - keys: "1234" - -key_collector: - - id: reader - source_id: keypad - min_length: 4 - max_length: 4 - -light: - - platform: esp32_rmt_led_strip - id: led_strip - pin: - allow_other_uses: true - number: 13 - num_leds: 60 - rmt_channel: 6 - rgb_order: GRB - chipset: ws2812 - - platform: esp32_rmt_led_strip - id: led_strip2 - pin: - allow_other_uses: true - number: 15 - num_leds: 60 - rmt_channel: 2 - rgb_order: RGB - bit0_high: 100us - bit0_low: 100us - bit1_high: 100us - bit1_low: 100us diff --git a/tests/test2.yaml b/tests/test2.yaml deleted file mode 100644 index 92977697c1..0000000000 --- a/tests/test2.yaml +++ /dev/null @@ -1,879 +0,0 @@ ---- -esphome: - name: $devicename - build_path: build/test2 - -esp32: - board: esp32dev - flash_size: 8MB - -globals: - - id: my_global_string - type: std::string - restore_value: true - max_restore_data_length: 70 - initial_value: '"DefaultValue"' - -substitutions: - devicename: test2 - -ethernet: - type: LAN8720 - mdc_pin: - allow_other_uses: true - number: GPIO23 - mdio_pin: - allow_other_uses: true - number: GPIO25 - clk_mode: GPIO0_IN - phy_addr: 0 - power_pin: - allow_other_uses: true - number: GPIO25 - manual_ip: - static_ip: 192.168.178.56 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - domain: .local - -network: - enable_ipv6: true - -mdns: - disabled: true - -api: - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - allow_other_uses: true - number: 22 - scan: false - -spi: - clk_pin: - allow_other_uses: true - number: GPIO21 - mosi_pin: - allow_other_uses: true - number: GPIO22 - miso_pin: - allow_other_uses: true - number: GPIO23 - -uart: - tx_pin: - allow_other_uses: true - number: GPIO22 - rx_pin: - allow_other_uses: true - number: GPIO23 - baud_rate: 115200 - # Specifically added for testing debug with no after: definition. - debug: - dummy_receiver: false - direction: rx - sequence: - - lambda: UARTDebug::log_hex(direction, bytes, ':'); - -safe_mode: - -ota: - - platform: esphome - port: 3286 - -logger: - level: DEBUG - -debug: - -deep_sleep: - run_duration: - default: 20s - gpio_wakeup_reason: 10s - touch_wakeup_reason: 15s - sleep_duration: 50s - wakeup_pin: - allow_other_uses: true - number: GPIO2 - wakeup_pin_mode: INVERT_WAKEUP - -as3935_i2c: - irq_pin: - allow_other_uses: true - number: GPIO12 - -mcp3008: - - id: mcp3008_hub - cs_pin: - allow_other_uses: true - number: GPIO12 - -output: - - platform: ac_dimmer - id: dimmer1 - gate_pin: GPIO5 - zero_cross_pin: - allow_other_uses: true - number: GPIO12 - -sensor: - - platform: homeassistant - entity_id: sensor.hello_world - id: ha_hello_world - - platform: homeassistant - entity_id: climate.living_room - attribute: temperature - id: ha_hello_world_temperature - - platform: ble_rssi - mac_address: AC:37:43:77:5F:4C - name: BLE Google Home Mini RSSI value - - platform: ble_rssi - service_uuid: 11aa - name: BLE Test Service 16 - - platform: ble_rssi - service_uuid: "11223344" - name: BLE Test Service 32 - - platform: ble_rssi - service_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - name: BLE Test Service 128 - - platform: ble_rssi - service_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - name: BLE Test iBeacon UUID - - platform: b_parasite - mac_address: F0:CA:F0:CA:01:01 - humidity: - name: b-parasite Air Humidity - temperature: - name: b-parasite Air Temperature - moisture: - name: b-parasite Soil Moisture - battery_voltage: - name: b-parasite Battery Voltage - illuminance: - name: b-parasite Illuminance - - platform: senseair - id: senseair0 - co2: - name: SenseAir CO2 Value - on_value: - then: - - senseair.background_calibration: senseair0 - - senseair.background_calibration_result: senseair0 - - senseair.abc_get_period: senseair0 - - senseair.abc_enable: senseair0 - - senseair.abc_disable: senseair0 - update_interval: 15s - - platform: ruuvitag - mac_address: FF:56:D3:2F:7D:E8 - humidity: - name: RuuviTag Humidity - temperature: - name: RuuviTag Temperature - pressure: - name: RuuviTag Pressure - acceleration_x: - name: RuuviTag Acceleration X - acceleration_y: - name: RuuviTag Acceleration Y - acceleration_z: - name: RuuviTag Acceleration Z - battery_voltage: - name: RuuviTag Battery Voltage - tx_power: - name: RuuviTag TX Power - movement_counter: - name: RuuviTag Movement Counter - measurement_sequence_number: - name: RuuviTag Measurement Sequence Number - - platform: as3935 - lightning_energy: - name: Lightning Energy - distance: - name: Distance Storm - - platform: xiaomi_hhccjcy01 - mac_address: 94:2B:FF:5C:91:61 - temperature: - name: Xiaomi HHCCJCY01 Temperature - moisture: - name: Xiaomi HHCCJCY01 Moisture - illuminance: - name: Xiaomi HHCCJCY01 Illuminance - conductivity: - name: Xiaomi HHCCJCY01 Soil Conductivity - battery_level: - name: Xiaomi HHCCJCY01 Battery Level - - platform: xiaomi_hhccjcy10 - mac_address: DD:25:6D:E4:FF:8F - temperature: - name: "Xiaomi HHCCJCY10 Temperature" - moisture: - name: "Xiaomi HHCCJCY10 Moisture" - illuminance: - name: "Xiaomi HHCCJCY10 Illuminance" - conductivity: - name: "Xiaomi HHCCJCY10 Soil Conductivity" - battery_level: - name: "Xiaomi HHCCJCY10 Battery Level" - - platform: xiaomi_lywsdcgq - mac_address: 7A:80:8E:19:36:BA - temperature: - name: Xiaomi LYWSDCGQ Temperature - humidity: - name: Xiaomi LYWSDCGQ Humidity - battery_level: - name: Xiaomi LYWSDCGQ Battery Level - - platform: xiaomi_lywsd02 - mac_address: 3F:5B:7D:82:58:4E - temperature: - name: Xiaomi LYWSD02 Temperature - humidity: - name: Xiaomi LYWSD02 Humidity - battery_level: - name: Xiaomi LYWSD02 Battery Level - - platform: xiaomi_cgg1 - mac_address: 7A:80:8E:19:36:BA - temperature: - name: Xiaomi CGG1 Temperature - humidity: - name: Xiaomi CGG1 Humidity - battery_level: - name: Xiaomi CGG1 Battery Level - - platform: xiaomi_gcls002 - mac_address: 94:2B:FF:5C:91:61 - temperature: - name: GCLS02 Temperature - moisture: - name: GCLS02 Moisture - conductivity: - name: GCLS02 Soil Conductivity - illuminance: - name: GCLS02 Illuminance - - platform: xiaomi_hhccpot002 - mac_address: 94:2B:FF:5C:91:61 - moisture: - name: HHCCPOT002 Moisture - conductivity: - name: HHCCPOT002 Soil Conductivity - - platform: xiaomi_lywsd03mmc - mac_address: A4:C1:38:4E:16:78 - bindkey: e9efaa6873f9f9c87a5e75a5f814801c - temperature: - name: Xiaomi LYWSD03MMC Temperature - humidity: - name: Xiaomi LYWSD03MMC Humidity - battery_level: - name: Xiaomi LYWSD03MMC Battery Level - - platform: xiaomi_cgd1 - mac_address: A4:C1:38:D1:61:7D - bindkey: c99d2313182473b38001086febf781bd - temperature: - name: Xiaomi CGD1 Temperature - humidity: - name: Xiaomi CGD1 Humidity - battery_level: - name: Xiaomi CGD1 Battery Level - - platform: xiaomi_jqjcy01ym - mac_address: 7A:80:8E:19:36:BA - temperature: - name: JQJCY01YM Temperature - humidity: - name: JQJCY01YM Humidity - formaldehyde: - name: JQJCY01YM Formaldehyde - battery_level: - name: JQJCY01YM Battery Level - - platform: xiaomi_mhoc303 - mac_address: E7:50:59:32:A0:1C - temperature: - name: MHO-C303 Temperature - humidity: - name: MHO-C303 Humidity - battery_level: - name: MHO-C303 Battery Level - - platform: atc_mithermometer - mac_address: A4:C1:38:4E:16:78 - temperature: - name: ATC Temperature - humidity: - name: ATC Humidity - battery_level: - name: ATC Battery-Level - battery_voltage: - name: ATC Battery-Voltage - - platform: pvvx_mithermometer - mac_address: A4:C1:38:4E:16:78 - temperature: - name: PVVX Temperature - humidity: - name: PVVX Humidity - battery_level: - name: PVVX Battery-Level - battery_voltage: - name: PVVX Battery-Voltage - - platform: inkbird_ibsth1_mini - mac_address: 38:81:D7:0A:9C:11 - temperature: - name: Inkbird IBS-TH1 Temperature - humidity: - name: Inkbird IBS-TH1 Humidity - battery_level: - name: Inkbird IBS-TH1 Battery Level - - platform: xiaomi_rtcgq02lm - id: motion_rtcgq02lm - battery_level: - name: Mi Motion Sensor 2 Battery level - - platform: ltr390 - uv: - name: LTR390 UV - uv_index: - name: LTR390 UVI - light: - name: LTR390 Light - ambient_light: - name: LTR390 ALS - gain: X3 - resolution: 18 - window_correction_factor: 1.0 - address: 0x53 - update_interval: 60s - - platform: sgp4x - voc: - name: VOC Index - id: sgp40_voc_index - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - nox: - name: NOx - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - update_interval: 5s - - platform: mcp3008 - update_interval: 5s - mcp3008_id: mcp3008_hub - id: freezer_temp_source - reference_voltage: 3.19 - number: 0 - - id: airthingswp - platform: airthings_wave_plus - ble_client_id: airthings01 - update_interval: 5min - battery_update_interval: 12h - temperature: - name: Wave Plus Temperature - radon: - name: Wave Plus Radon - radon_long_term: - name: Wave Plus Radon Long Term - pressure: - name: Wave Plus Pressure - humidity: - name: Wave Plus Humidity - co2: - name: Wave Plus CO2 - tvoc: - name: Wave Plus VOC - battery_voltage: - name: Wave Plus Battery Voltage - - id: airthingswm - platform: airthings_wave_mini - ble_client_id: airthingsmini01 - update_interval: 5min - battery_update_interval: 12h - temperature: - name: Wave Mini Temperature - humidity: - name: Wave Mini Humidity - pressure: - name: Wave Mini Pressure - tvoc: - name: Wave Mini VOC - battery_voltage: - name: Wave Mini Battery Voltage - - platform: ina260 - address: 0x40 - current: - name: INA260 Current - power: - name: INA260 Power - bus_voltage: - name: INA260 Voltage - update_interval: 60s - - platform: radon_eye_rd200 - ble_client_id: radon_eye_ble_id - update_interval: 10min - radon: - name: RD200 Radon - radon_long_term: - name: RD200 Radon Long Term - - platform: mopeka_pro_check - mac_address: D3:75:F2:DC:16:91 - tank_type: CUSTOM - custom_distance_full: 40cm - custom_distance_empty: 10mm - temperature: - name: Propane test temp - level: - name: Propane test level - distance: - name: Propane test distance - battery_level: - name: Propane test battery level - - platform: ufire_ec - id: ufire_ec_board - ec: - name: Ufire EC - temperature_sensor: ha_hello_world_temperature - temperature_compensation: 20.0 - temperature_coefficient: 0.019 - - platform: ufire_ise - id: ufire_ise_board - temperature_sensor: ha_hello_world_temperature - ph: - name: Ufire pH - - platform: mics_4514 - update_interval: 60s - nitrogen_dioxide: - name: MICS-4514 NO2 - carbon_monoxide: - name: MICS-4514 CO - methane: - name: MICS-4514 CH4 - hydrogen: - name: MICS-4514 H2 - ethanol: - name: MICS-4514 C2H5OH - ammonia: - name: MICS-4514 NH3 - - platform: mopeka_std_check - mac_address: D3:75:F2:DC:16:91 - tank_type: CUSTOM - custom_distance_full: 40cm - custom_distance_empty: 10mm - temperature: - name: Propane test temp - level: - name: Propane test level - distance: - name: Propane test distance - battery_level: - name: Propane test battery level - - platform: duty_time - id: duty_time1 - name: Test Duty Time - restore: true - last_time: - name: Test Last Duty Time Sensor - sensor: ha_hello_world_binary - - platform: duty_time - id: duty_time2 - name: Test Duty Time 2 - restore: false - lambda: "return true;" - -time: - - platform: homeassistant - on_time: - - at: "16:00:00" - then: - - logger.log: It's 16:00 - - if: - condition: - - sensor.duty_time.is_running: duty_time2 - then: - - sensor.duty_time.start: duty_time1 - - if: - condition: - - sensor.duty_time.is_not_running: duty_time1 - then: - - sensor.duty_time.stop: duty_time2 - - sensor.duty_time.reset: duty_time1 - -esp32_touch: - setup_mode: true - -binary_sensor: - - platform: homeassistant - entity_id: binary_sensor.hello_world - id: ha_hello_world_binary - - platform: homeassistant - entity_id: binary_sensor.hello - attribute: world - id: ha_hello_world_binary_attribute - - platform: ble_presence - mac_address: AC:37:43:77:5F:4C - name: ESP32 BLE Tracker Google Home Mini - timeout: 30s - - platform: ble_presence - service_uuid: 11aa - name: BLE Test Service 16 Presence - - platform: ble_presence - service_uuid: "11223344" - name: BLE Test Service 32 Presence - - platform: ble_presence - service_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - name: BLE Test Service 128 Presence - - platform: ble_presence - ibeacon_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - ibeacon_major: 100 - ibeacon_minor: 1 - name: BLE Test iBeacon Presence - - platform: esp32_touch - name: ESP32 Touch Pad GPIO27 - pin: GPIO27 - threshold: 1000 - - platform: as3935 - name: Storm Alert - - platform: xiaomi_mue4094rt - name: MUE4094RT Motion - mac_address: 7A:80:8E:19:36:BA - timeout: 5s - - platform: xiaomi_mjyd02yla - name: MJYD02YL-A Motion - mac_address: 50:EC:50:CD:32:02 - bindkey: 48403ebe2d385db8d0c187f81e62cb64 - idle_time: - name: MJYD02YL-A Idle Time - light: - name: MJYD02YL-A Light Status - battery_level: - name: MJYD02YL-A Battery Level - - platform: xiaomi_wx08zm - name: WX08ZM Activation State - mac_address: 74:a3:4a:b5:07:34 - tablet: - name: WX08ZM Tablet Resource - battery_level: - name: WX08ZM Battery Level - - platform: xiaomi_cgpr1 - name: CGPR1 Motion - mac_address: "12:34:56:12:34:56" - bindkey: 48403ebe2d385db8d0c187f81e62cb64 - battery_level: - name: CGPR1 battery Level - idle_time: - name: CGPR1 Idle Time - illuminance: - name: CGPR1 Illuminance - - platform: xiaomi_rtcgq02lm - id: motion_rtcgq02lm - motion: - name: Mi Motion Sensor 2 - light: - name: Mi Motion Sensor 2 Light - button: - name: Mi Motion Sensor 2 Button - - platform: gpio - id: gpio_set_retry_test - pin: - allow_other_uses: true - number: GPIO9 - on_press: - then: - - lambda: |- - App.scheduler.set_retry(id(gpio_set_retry_test), "set_retry_test", 100, 3, [](const uint8_t remaining) { - return remaining ? RetryResult::RETRY : RetryResult::DONE; // just to reference both symbols - }, 5.0f); - -esp32_ble_tracker: - on_ble_advertise: - - mac_address: - - AA:BB:CC:DD:EE:FF - - FF:EE:DD:CC:BB:AA - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The device address (%s) exists in list", x.address_str().c_str()); - # yamllint enable rule:line-length - - mac_address: AC:37:43:77:5F:4C - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The device address is %s", x.address_str().c_str()); - # yamllint enable rule:line-length - - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The device address is %s", x.address_str().c_str()); - # yamllint enable rule:line-length - on_ble_service_data_advertise: - - service_uuid: ABCD - then: - - lambda: !lambda |- - ESP_LOGD("main", "Length of service data is %i", x.size()); - on_ble_manufacturer_data_advertise: - - manufacturer_id: ABCD - then: - - lambda: !lambda |- - ESP_LOGD("main", "Length of manufacturer data is %i", x.size()); - -ble_client: - - mac_address: 01:02:03:04:05:06 - id: airthings01 - - mac_address: 01:02:03:04:05:06 - id: airthingsmini01 - - mac_address: 01:02:03:04:05:06 - id: radon_eye_ble_id - -airthings_ble: - -radon_eye_ble: - -ruuvi_ble: - -xiaomi_ble: - -mopeka_ble: - -bluetooth_proxy: - active: true - -xiaomi_rtcgq02lm: - - id: motion_rtcgq02lm - mac_address: 01:02:03:04:05:06 - bindkey: "48403ebe2d385db8d0c187f81e62cb64" - -status_led: - pin: - allow_other_uses: true - number: GPIO2 - -text_sensor: - - platform: version - name: ESPHome Version - icon: mdi:icon - id: version_sensor - on_value: - - if: - condition: - - api.connected: - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The state is %s=%s", x.c_str(), id(version_sensor).state.c_str()); - # yamllint enable rule:line-length - - script.execute: my_script - - script.execute: - id: my_script_with_params - prefix: Running my_script_with_params - param2: 100 - param3: true - - script.execute: - id: my_script_with_params - prefix: Running my_script_with_params using lambda parameters - param2: !lambda return 200; - param3: !lambda return true; - - homeassistant.service: - service: notify.html5 - data: - title: New Humidity - data_template: - message: The humidity is {{ my_variable }}%. - variables: - my_variable: |- - return id(version_sensor).state; - my_variable_str: |- - return "Hello World"; - - homeassistant.service: - service: light.turn_on - data: - entity_id: light.my_light - - homeassistant.tag_scanned: - tag: 1234-abcd - - homeassistant.tag_scanned: 1234-abcd - - deep_sleep.enter: - sleep_duration: 30min - - deep_sleep.enter: - sleep_duration: !lambda "return 30 * 60 * 1000;" - - platform: template - name: Template Text Sensor - lambda: |- - return {"Hello World"}; - filters: - - to_upper: - - to_lower: - - append: xyz - - prepend: abcd - - substitute: - - Hello -> Goodbye - - map: - - red -> green - - lambda: 'return {"1234"};' - - platform: homeassistant - entity_id: sensor.hello_world2 - id: ha_hello_world2 - - platform: homeassistant - entity_id: sensor.hello_world3 - id: ha_hello_world3 - attribute: some_attribute - - platform: ble_scanner - name: Scanner - -script: - - id: my_script - mode: single - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_queued - mode: queued - max_runs: 2 - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_parallel - mode: parallel - max_runs: 2 - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_restart - mode: restart - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_with_params - parameters: - prefix: string - param2: int - param3: bool - then: - - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());' - -stepper: - - platform: uln2003 - id: my_stepper - pin_a: - allow_other_uses: true - number: GPIO23 - pin_b: GPIO27 - pin_c: - allow_other_uses: true - number: GPIO25 - pin_d: GPIO26 - sleep_when_done: false - step_mode: HALF_STEP - max_speed: 250 steps/s - - # Optional: - acceleration: inf - deceleration: inf - -interval: - interval: 5s - startup_delay: 10s - then: - - logger.log: Interval Run - -display: - - platform: st7789v - model: LILYGO_T-EMBED_170X320 - spi_mode: mode0 - height: 320 - width: 170 - offset_height: 35 - offset_width: 0 - dc_pin: GPIO13 - reset_pin: - allow_other_uses: true - number: GPIO9 - -image: - - id: binary_image - file: pnglogo.png - type: BINARY - dither: FloydSteinberg - - id: transparent_transparent_image - file: pnglogo.png - type: TRANSPARENT_BINARY - - id: rgba_image - file: pnglogo.png - type: RGBA - resize: 50x50 - - id: rgb24_image - file: pnglogo.png - type: RGB24 - use_transparency: true - - id: rgb565_image - file: pnglogo.png - type: RGB565 - use_transparency: false - - id: web_svg_image - file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg - resize: 256x48 - type: TRANSPARENT_BINARY - - id: web_tiff_image - file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff - type: RGB24 - resize: 48x48 - - id: web_redirect_image - file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4 - type: RGB24 - resize: 48x48 - - - id: mdi_alert - file: mdi:alert-circle-outline - resize: 50x50 - - id: another_alert_icon - file: mdi:alert-outline - type: BINARY - -graph: - - id: my_graph - sensor: ha_hello_world_temperature - duration: 1h - width: 100 - height: 100 - -cap1188: - id: cap1188_component - address: 0x29 - touch_threshold: 0x20 - allow_multiple_touches: true - reset_pin: 14 - -switch: - - platform: template - name: Test BLE Write Action - turn_on_action: - - ble_client.ble_write: - id: airthings01 - service_uuid: F61E3BE9-2826-A81B-970A-4D4DECFABBAE - characteristic_uuid: 6490FAFE-0734-732C-8705-91B653A081FC - value: [0x01, 0xab, 0xff] - - ble_client.ble_write: - id: airthings01 - service_uuid: F61E3BE9-2826-A81B-970A-4D4DECFABBAE - characteristic_uuid: 6490FAFE-0734-732C-8705-91B653A081FC - value: !lambda |- - return {0x13, 0x37}; - -esp32_ble_server: - id: ble - manufacturer_data: [0x72, 0x4, 0x00, 0x23] - -text: - - platform: template - name: My Text - id: my_text - min_length: 0 - max_length: 20 - mode: text - pattern: "[a-z]+" - optimistic: true - restore_value: true - initial_value: "Hello World" - - platform: copy - name: My Text Copy - id: my_text_copy - source_id: my_text - mode: password diff --git a/tests/test3.1.yaml b/tests/test3.1.yaml deleted file mode 100644 index c3b078fe67..0000000000 --- a/tests/test3.1.yaml +++ /dev/null @@ -1,734 +0,0 @@ ---- -esphome: - name: $device_name - comment: $device_comment - build_path: build/test3.1 - includes: - - custom.h - -esp8266: - board: d1_mini - -substitutions: - device_name: test3-1 - device_comment: test3-1 device - min_sub: "0.03" - max_sub: "12.0%" - -api: - -wifi: - ssid: "MySSID" - password: "password1" - -network: - enable_ipv6: true - -web_server: - port: 80 - version: 2 - -i2c: - sda: - allow_other_uses: true - number: 4 - scl: - allow_other_uses: true - number: 5 - scan: false - -spi: - clk_pin: - allow_other_uses: true - number: GPIO12 - mosi_pin: - allow_other_uses: true - number: GPIO13 - miso_pin: - allow_other_uses: true - number: GPIO14 - -ota: - - platform: esphome - version: 2 - -logger: - -debug: - -sensor: - - platform: apds9960 - type: proximity - name: APDS9960 Proximity - - platform: vl53l0x - name: VL53L0x Distance - address: 0x29 - update_interval: 60s - enable_pin: - allow_other_uses: true - number: GPIO13 - timeout: 200us - - platform: apds9960 - type: clear - name: APDS9960 Clear - - platform: apds9960 - type: red - name: APDS9960 Red - - platform: apds9960 - type: green - name: APDS9960 Green - - platform: apds9960 - type: blue - name: APDS9960 Blue - - - platform: aht10 - temperature: - name: Temperature - humidity: - name: Humidity - - platform: am2320 - temperature: - name: Temperature - humidity: - name: Humidity - - platform: adc - pin: VCC - id: my_sensor - filters: - - offset: 5.0 - - multiply: 2.0 - - filter_out: NAN - - sliding_window_moving_average: - - exponential_moving_average: - - quantile: - window_size: 5 - send_every: 5 - send_first_at: 3 - quantile: .8 - - lambda: "return 0;" - - delta: 100 - - throttle: 100ms - - debounce: 500s - - timeout: 10min - - timeout: - timeout: 10min - value: 0 - - calibrate_linear: - method: exact - datapoints: - - -1 -> 3 - - 0.0 -> 1.0 - - 1.0 -> 2.0 - - 2.0 -> 3.0 - - calibrate_polynomial: - degree: 3 - datapoints: - - 0 -> 0 - - 100 -> 200 - - 400 -> 500 - - -50 -> -1000 - - -100 -> -10000 - - platform: cd74hc4067 - id: cd74hc4067_0 - number: 0 - sensor: my_sensor - - platform: resistance - sensor: my_sensor - configuration: DOWNSTREAM - resistor: 10kΩ - reference_voltage: 3.3V - name: Resistance - id: resist - - platform: ntc - sensor: resist - name: NTC Sensor - calibration: - b_constant: 3950 - reference_resistance: 10k - reference_temperature: 25°C - - platform: ntc - sensor: resist - name: NTC Sensor2 - calibration: - - 10.0kOhm -> 25°C - - 27.219kOhm -> 0°C - - 14.674kOhm -> 15°C - - platform: ct_clamp - sensor: my_sensor - name: CT Clamp - sample_duration: 500ms - update_interval: 5s - - - platform: tcs34725 - red_channel: - name: Red Channel - green_channel: - name: Green Channel - blue_channel: - name: Blue Channel - clear_channel: - name: Clear Channel - illuminance: - name: Illuminance - color_temperature: - name: Color Temperature - integration_time: 614ms - gain: 60x - - platform: custom - lambda: |- - auto s = new CustomSensor(); - App.register_component(s); - return {s}; - sensors: - - id: custom_sensor - name: Custom Sensor - - - platform: ade7953_i2c - irq_pin: - allow_other_uses: true - number: GPIO16 - voltage: - name: ADE7953 Voltage - id: ade7953_voltage - current_a: - name: ADE7953 Current A - id: ade7953_current_a - current_b: - name: ADE7953 Current B - id: ade7953_current_b - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - - - platform: ade7953_spi - cs_pin: - allow_other_uses: true - number: GPIO04 - irq_pin: - allow_other_uses: true - number: GPIO16 - voltage: - name: ADE7953 Voltage - current_a: - name: ADE7953 Current A - current_b: - name: ADE7953 Current B - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - - - platform: tmp102 - name: TMP102 Temperature - - platform: hm3301 - pm_1_0: - name: PM1.0 - pm_2_5: - name: PM2.5 - pm_10_0: - name: PM10.0 - aqi: - name: AQI - calculation_type: AQI - - platform: ezo - id: ph_ezo - address: 99 - unit_of_measurement: pH - - platform: tof10120 - name: Distance sensor - update_interval: 5s - - - platform: mlx90393 - oversampling: 1 - filter: 0 - gain: 3X - x_axis: - name: mlxxaxis - y_axis: - name: mlxyaxis - z_axis: - name: mlxzaxis - resolution: 17BIT - temperature: - name: mlxtemp - oversampling: 2 - - - platform: adc128s102 - id: adc128s102_channel_0 - channel: 0 - - - platform: ade7880 - irq0_pin: - number: GPIO13 - allow_other_uses: true - irq1_pin: - number: GPIO5 - allow_other_uses: true - reset_pin: - number: GPIO16 - allow_other_uses: true - frequency: 60Hz - phase_a: - name: Channel A - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3116628 - voltage_gain: -757178 - power_gain: -1344457 - phase_angle: 188 - phase_b: - name: Channel B - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3133655 - voltage_gain: -755235 - power_gain: -1345638 - phase_angle: 188 - phase_c: - name: Channel C - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3111158 - voltage_gain: -743813 - power_gain: -1351437 - phase_angle: 180 - neutral: - name: Neutral - current: Current - calibration: - current_gain: 3189 - -apds9960: - address: 0x20 - update_interval: 60s - -binary_sensor: - - platform: apds9960 - direction: up - name: APDS9960 Up - device_class: motion - filters: - - invert - - delayed_on: 20ms - - delayed_off: 20ms - - lambda: "return false;" - on_state: - - logger.log: New state - id: my_binary_sensor - - platform: apds9960 - direction: down - name: APDS9960 Down - - platform: apds9960 - direction: left - name: APDS9960 Left - - platform: apds9960 - direction: right - name: APDS9960 Right - - - platform: ttp229_lsf - channel: 1 - name: TTP229 LSF Test - - platform: ttp229_bsf - channel: 1 - name: TTP229 BSF Test - - platform: custom - lambda: |- - auto s = new CustomBinarySensor(); - App.register_component(s); - return {s}; - binary_sensors: - - id: custom_binary_sensor - name: Custom Binary Sensor - - - platform: template - id: cover_toggle - on_press: - then: - - cover.toggle: time_based_cover - - cover.toggle: endstop_cover - - cover.toggle: current_based_cover - -globals: - - id: my_global_string - type: std::string - initial_value: '""' - -text_sensor: - - platform: custom - lambda: |- - auto s = new CustomTextSensor(); - App.register_component(s); - return {s}; - text_sensors: - - id: custom_text_sensor - name: Custom Text Sensor - -sm2135: - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - rgb_current: 20mA - cw_current: 60mA - -grove_tb6612fng: - id: test_motor - address: 0x14 - -switch: - - platform: gpio - id: gpio_switch1 - pin: - mcp23xxx: mcp23017_hub - number: 0 - mode: OUTPUT - interlock: &interlock [gpio_switch1, gpio_switch2, gpio_switch3] - - platform: gpio - id: gpio_switch2 - pin: - mcp23xxx: mcp23008_hub - number: 0 - mode: OUTPUT - interlock: *interlock - - platform: gpio - id: gpio_switch3 - pin: - allow_other_uses: true - number: GPIO1 - interlock: *interlock - - platform: custom - lambda: |- - auto s = new CustomSwitch(); - return {s}; - switches: - - id: custom_switch - name: Custom Switch - - platform: template - name: open_vent - id: open_vent - optimistic: true - on_turn_on: - then: - - grove_tb6612fng.run: - channel: 1 - speed: 255 - direction: BACKWARD - id: test_motor - -custom_component: - lambda: |- - auto s = new CustomComponent(); - s->set_update_interval(15000); - return {s}; - -stepper: - - platform: uln2003 - id: my_stepper - pin_a: - allow_other_uses: true - number: GPIO12 - pin_b: - allow_other_uses: true - number: GPIO13 - pin_c: - allow_other_uses: true - number: GPIO14 - pin_d: - allow_other_uses: true - number: GPIO15 - sleep_when_done: false - step_mode: HALF_STEP - max_speed: 250 steps/s - acceleration: inf - deceleration: inf - - platform: a4988 - id: my_stepper2 - step_pin: - allow_other_uses: true - number: GPIO1 - dir_pin: - allow_other_uses: true - number: GPIO2 - max_speed: 0.1 steps/s - acceleration: 10 steps/s^2 - deceleration: 10 steps/s^2 - -interval: - interval: 5s - then: - - logger.log: Interval Run - - stepper.set_target: - id: my_stepper2 - target: 500 - - stepper.set_target: - id: my_stepper - target: !lambda "return 0;" - - stepper.report_position: - id: my_stepper2 - position: 0 - - stepper.report_position: - id: my_stepper - position: !lambda "return 50/100.0;" - -cover: - - platform: endstop - name: Endstop Cover - id: endstop_cover - stop_action: - - switch.turn_on: gpio_switch1 - open_endstop: my_binary_sensor - open_action: - - switch.turn_on: gpio_switch1 - open_duration: 5min - close_endstop: my_binary_sensor - close_action: - - switch.turn_on: gpio_switch2 - - output.set_level: - id: out - level: 50% - - output.esp8266_pwm.set_frequency: - id: out - frequency: 500.0Hz - - output.esp8266_pwm.set_frequency: - id: out - frequency: !lambda "return 500.0;" - - servo.write: - id: my_servo - level: -100% - - servo.write: - id: my_servo - level: !lambda "return -1.0;" - - delay: 2s - - servo.detach: my_servo - close_duration: 4.5min - max_duration: 10min - - platform: time_based - name: Time Based Cover - id: time_based_cover - stop_action: - - switch.turn_on: gpio_switch1 - open_action: - - switch.turn_on: gpio_switch1 - open_duration: 5min - close_action: - - switch.turn_on: gpio_switch2 - close_duration: 4.5min - - platform: current_based - name: Current Based Cover - id: current_based_cover - open_sensor: ade7953_current_a - open_moving_current_threshold: 0.5 - open_obstacle_current_threshold: 0.8 - open_duration: 12s - open_action: - - switch.turn_on: gpio_switch1 - close_sensor: ade7953_current_b - close_moving_current_threshold: 0.5 - close_obstacle_current_threshold: 0.8 - close_duration: 10s - close_action: - - switch.turn_on: gpio_switch2 - stop_action: - - switch.turn_off: gpio_switch1 - - switch.turn_off: gpio_switch2 - obstacle_rollback: 30% - start_sensing_delay: 0.8s - malfunction_detection: true - malfunction_action: - then: - - logger.log: Malfunction Detected - - platform: template - name: Template Cover with Tilt - tilt_lambda: "return 0.5;" - tilt_action: - - output.set_level: - id: out - level: !lambda "return tilt;" - position_action: - - output.set_level: - id: out - level: !lambda "return pos;" - -output: - - platform: esp8266_pwm - id: out - pin: - number: D3 - frequency: 50Hz - - platform: esp8266_pwm - id: out2 - pin: - allow_other_uses: true - number: D4 - - platform: custom - type: binary - lambda: |- - auto s = new CustomBinaryOutput(); - App.register_component(s); - return {s}; - outputs: - - id: custom_binary - - platform: sigma_delta_output - id: sddac - update_interval: 60s - pin: - allow_other_uses: true - number: D4 - turn_on_action: - then: - - logger.log: "Turned on" - turn_off_action: - then: - - logger.log: "Turned off" - state_change_action: - then: - - logger.log: - format: "Changed state: %d" - args: ["state"] - - platform: custom - type: float - lambda: |- - auto s = new CustomFloatOutput(); - App.register_component(s); - return {s}; - outputs: - - id: custom_float - - platform: slow_pwm - pin: - allow_other_uses: true - number: GPIO5 - id: my_slow_pwm - period: 15s - restart_cycle_on_state_change: false - - platform: sm2135 - id: sm2135_0 - channel: 0 - - platform: sm2135 - id: sm2135_1 - channel: 1 - - platform: sm2135 - id: sm2135_2 - channel: 2 - - platform: sm2135 - id: sm2135_3 - channel: 3 - - platform: sm2135 - id: sm2135_4 - channel: 4 - -mcp23017: - id: mcp23017_hub - -mcp23008: - id: mcp23008_hub - -light: - - platform: hbridge - name: Icicle Lights - pin_a: out - pin_b: out2 - -servo: - id: my_servo - output: out - restore: true - min_level: $min_sub - max_level: $max_sub - -ttp229_lsf: - -ttp229_bsf: - sdo_pin: - allow_other_uses: true - number: D2 - scl_pin: - allow_other_uses: true - number: D1 - -display: - - platform: max7219digit - cs_pin: - allow_other_uses: true - number: GPIO15 - num_chips: 4 - rotate_chip: 0 - intensity: 10 - scroll_mode: STOP - id: my_matrix - lambda: |- - it.printdigit("hello"); - -button: - - platform: output - id: output_button - output: out - duration: 100ms - - platform: wake_on_lan - target_mac_address: 12:34:56:78:90:ab - name: wol_test_1 - id: wol_1 - - platform: factory_reset - name: Restart Button (Factory Default Settings) - -cd74hc4067: - pin_s0: - allow_other_uses: true - number: GPIO12 - pin_s1: - allow_other_uses: true - number: GPIO13 - pin_s2: - allow_other_uses: true - number: GPIO14 - pin_s3: - allow_other_uses: true - number: GPIO15 - -adc128s102: - cs_pin: - allow_other_uses: true - number: GPIO12 diff --git a/tests/test3.yaml b/tests/test3.yaml deleted file mode 100644 index d10413b142..0000000000 --- a/tests/test3.yaml +++ /dev/null @@ -1,1432 +0,0 @@ ---- -esphome: - name: $device_name - comment: $device_comment - build_path: build/test3 - on_boot: - - if: - condition: - - api.connected - - wifi.connected - - time.has_time - then: - - logger.log: Have time - -esp8266: - board: d1_mini - early_pin_init: true - -substitutions: - device_name: test3 - device_comment: test3 device - -api: - port: 8000 - password: pwd - reboot_timeout: 0min - encryption: - key: bOFFzzvfpg5DB94DuBGLXD/hMnhpDKgP9UQyBulwWVU= - services: - - service: hello_world - variables: - name: string - then: - - logger.log: - format: Hello World %s! - args: - - name.c_str() - - service: empty_service - then: - - logger.log: Service Called - - service: all_types - variables: - bool_: bool - int_: int - float_: float - string_: string - then: - - logger.log: Something happened - - service: array_types - variables: - bool_arr: bool[] - int_arr: int[] - float_arr: float[] - string_arr: string[] - then: - - logger.log: - # yamllint disable rule:line-length - format: "Bool: %s (%u), Int: %d (%u), Float: %f (%u), String: %s (%u)" - # yamllint enable rule:line-length - args: - - YESNO(bool_arr[0]) - - bool_arr.size() - - int_arr[0] - - int_arr.size() - - float_arr[0] - - float_arr.size() - - string_arr[0].c_str() - - string_arr.size() - - service: dfplayer_next - then: - - dfplayer.play_next: - - service: dfplayer_previous - then: - - dfplayer.play_previous: - - service: dfplayer_play - variables: - file: int - then: - - dfplayer.play: !lambda "return file;" - - service: dfplayer_play_loop - variables: - file: int - loop_: bool - then: - - dfplayer.play: - file: !lambda "return file;" - loop: !lambda "return loop_;" - - service: dfplayer_play_folder - variables: - folder: int - file: int - then: - - dfplayer.play_folder: - folder: !lambda "return folder;" - file: !lambda "return file;" - - - service: dfplayer_play_loo_folder - variables: - folder: int - then: - - dfplayer.play_folder: - folder: !lambda "return folder;" - loop: true - - - service: dfplayer_set_device - variables: - device: int - then: - - dfplayer.set_device: - device: TF_CARD - - - service: dfplayer_set_volume - variables: - volume: int - then: - - dfplayer.set_volume: !lambda "return volume;" - - service: dfplayer_set_eq - variables: - preset: int - then: - # yamllint disable rule:line-length - - dfplayer.set_eq: !lambda "return static_cast(preset);" - # yamllint enable rule:line-length - - - service: dfplayer_sleep - then: - - dfplayer.sleep - - - service: dfplayer_reset - then: - - dfplayer.reset - - - service: dfplayer_start - then: - - dfplayer.start - - - service: dfplayer_pause - then: - - dfplayer.pause - - - service: dfplayer_stop - then: - - dfplayer.stop - - - service: dfplayer_random - then: - - dfplayer.random - - - service: dfplayer_volume_up - then: - - dfplayer.volume_up - - - service: dfplayer_volume_down - then: - - dfplayer.volume_down - - - service: battery_level_percent - variables: - level_percent: int - then: - - tm1651.set_level_percent: - id: tm1651_battery - level_percent: !lambda "return level_percent;" - - service: battery_level - variables: - level: int - then: - - tm1651.set_level: - id: tm1651_battery - level: !lambda "return level;" - - service: battery_brightness - variables: - brightness: int - then: - - tm1651.set_brightness: - id: tm1651_battery - brightness: !lambda "return brightness;" - - service: battery_turn_on - then: - - tm1651.turn_on: - id: tm1651_battery - - service: battery_turn_on - then: - - tm1651.turn_off: - id: tm1651_battery - - service: pid_set_control_parameters - then: - - climate.pid.set_control_parameters: - id: pid_climate - kp: 1.0 - kd: 1.0 - ki: 1.0 - - service: fingerprint_grow_enroll - variables: - finger_id: int - num_scans: int - then: - - fingerprint_grow.enroll: - finger_id: !lambda "return finger_id;" - num_scans: !lambda "return num_scans;" - - service: fingerprint_grow_cancel_enroll - then: - - fingerprint_grow.cancel_enroll: - - service: fingerprint_grow_delete - variables: - finger_id: int - then: - - fingerprint_grow.delete: - finger_id: !lambda "return finger_id;" - - service: fingerprint_grow_delete_all - then: - - fingerprint_grow.delete_all: - -wifi: - ssid: "MySSID" - password: "password1" - -network: - enable_ipv6: true - -uart: - - id: uart_1 - tx_pin: - number: GPIO1 - inverted: true - allow_other_uses: true - rx_pin: - allow_other_uses: true - number: GPIO3 - baud_rate: 115200 - - id: uart_2 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_3 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 4800 - - id: uart_4 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_5 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_6 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_7 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 38400 - - id: uart_8 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 4800 - parity: NONE - stop_bits: 2 - # Specifically added for testing debug with no options at all. - debug: - - id: uart_9 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_10 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_11 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_12 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - -modbus: - uart_id: uart_1 - -vbus: - uart_id: uart_4 - -safe_mode: - num_attempts: 5 - reboot_timeout: 10min - -ota: - - platform: esphome - port: 3286 - -logger: - hardware_uart: UART1 - level: DEBUG - esp8266_store_log_strings_in_flash: true - -debug: - -improv_serial: - next_url: https://esphome.io/?name={{device_name}}&version={{esphome_version}}&ip={{ip_address}} - -deep_sleep: - run_duration: 20s - sleep_duration: 50s - -wled: - -adalight: - -sensor: - - platform: daly_bms - voltage: - name: Battery Voltage - current: - name: Battery Current - battery_level: - name: Battery Level - max_cell_voltage: - name: Max Cell Voltage - max_cell_voltage_number: - name: Max Cell Voltage Number - min_cell_voltage: - name: Min Cell Voltage - min_cell_voltage_number: - name: Min Cell Voltage Number - max_temperature: - name: Max Temperature - max_temperature_probe_number: - name: Max Temperature Probe Number - min_temperature: - name: Min Temperature - min_temperature_probe_number: - name: Min Temperature Probe Number - remaining_capacity: - name: Remaining Capacity - cells_number: - name: Cells Number - temperature_1: - name: Temperature 1 - temperature_2: - name: Temperature 2 - - - platform: homeassistant - entity_id: sensor.hello_world - id: ha_hello_world - - - platform: hydreon_rgxx - model: RG 9 - uart_id: uart_6 - id: hydreon_rg9 - moisture: - name: hydreon_rain - id: hydreon_rain - temperature: - name: hydreon_temperature - disable_led: true - - - platform: hydreon_rgxx - model: RG_15 - uart_id: uart_6 - acc: - name: hydreon_acc - event_acc: - name: hydreon_event_acc - total_acc: - name: hydreon_total_acc - r_int: - name: hydreon_r_int - resolution: low - - - platform: adc - pin: VCC - id: my_sensor - - - platform: binary_sensor_map - name: Binary Sensor Map - type: group - channels: - - binary_sensor: bin1 - value: 10.0 - - binary_sensor: bin2 - value: 15.0 - - binary_sensor: bin3 - value: 100.0 - - - platform: binary_sensor_map - name: Binary Sensor Map - type: sum - channels: - - binary_sensor: bin1 - value: 10.0 - - binary_sensor: bin2 - value: 15.0 - - binary_sensor: bin3 - value: 100.0 - - - platform: binary_sensor_map - name: Binary Sensor Map - type: bayesian - prior: 0.4 - observations: - - binary_sensor: bin1 - prob_given_true: 0.9 - prob_given_false: 0.4 - - binary_sensor: bin2 - prob_given_true: 0.7 - prob_given_false: 0.05 - - binary_sensor: bin3 - prob_given_true: 0.8 - prob_given_false: 0.2 - - - platform: bl0939 - uart_id: uart_8 - voltage: - name: BL0939 Voltage - current_1: - name: BL0939 Current 1 - current_2: - name: BL0939 Current 2 - active_power_1: - name: BL0939 Active Power 1 - active_power_2: - name: BL0939 Active Power 2 - energy_1: - name: BL0939 Energy 1 - energy_2: - name: BL0939 Energy 2 - energy_total: - name: BL0939 Total energy - - platform: bl0940 - uart_id: uart_3 - voltage: - name: BL0940 Voltage - current: - name: BL0940 Current - power: - name: BL0940 Power - energy: - name: BL0940 Energy - internal_temperature: - name: BL0940 Internal temperature - external_temperature: - name: BL0940 External temperature - - platform: bl0942 - uart_id: uart_3 - voltage: - name: BL0942 Voltage - current: - name: BL0942 Current - power: - name: BL0942 Power - energy: - name: BL0942 Energy - frequency: - name: BL0942 Frequency - - platform: pzem004t - uart_id: uart_3 - voltage: - name: PZEM004T Voltage - current: - name: PZEM004T Current - power: - name: PZEM004T Power - - platform: pzemac - id: pzemac1 - voltage: - name: PZEMAC Voltage - current: - name: PZEMAC Current - power: - name: PZEMAC Power - energy: - name: PZEMAC Energy - frequency: - name: PZEMAC Frequency - power_factor: - name: PZEMAC Power Factor - - platform: pzemdc - id: pzemdc1 - voltage: - name: PZEMDC Voltage - current: - name: PZEMDC Current - power: - name: PZEMDC Power - energy: - name: PZEMDC Energy - - platform: pmsx003 - uart_id: uart_9 - type: PMSX003 - pm_1_0: - name: PM 1.0 Concentration - pm_2_5: - name: PM 2.5 Concentration - pm_10_0: - name: PM 10.0 Concentration - pm_1_0_std: - name: PM 1.0 Standard Atmospher Concentration - pm_2_5_std: - name: PM 2.5 Standard Atmospher Concentration - pm_10_0_std: - name: PM 10.0 Standard Atmospher Concentration - pm_0_3um: - name: Particulate Count >0.3um - pm_0_5um: - name: Particulate Count >0.5um - pm_1_0um: - name: Particulate Count >1.0um - pm_2_5um: - name: Particulate Count >2.5um - pm_5_0um: - name: Particulate Count >5.0um - pm_10_0um: - name: Particulate Count >10.0um - update_interval: 30s - - platform: pmsx003 - uart_id: uart_5 - type: PMS5003T - pm_1_0: - name: PM 1.0 Concentration - pm_2_5: - name: PM 2.5 Concentration - pm_10_0: - name: PM 10.0 Concentration - pm_1_0_std: - name: PM 1.0 Standard Atmospher Concentration - pm_2_5_std: - name: PM 2.5 Standard Atmospher Concentration - pm_10_0_std: - name: PM 10.0 Standard Atmospher Concentration - pm_0_3um: - name: Particulate Count >0.3um - pm_0_5um: - name: Particulate Count >0.5um - pm_1_0um: - name: Particulate Count >1.0um - pm_2_5um: - name: Particulate Count >2.5um - temperature: - name: PMS Temperature - humidity: - name: PMS Humidity - - platform: pmsx003 - uart_id: uart_6 - type: PMS5003ST - pm_1_0: - name: PM 1.0 Concentration - pm_2_5: - name: PM 2.5 Concentration - pm_10_0: - name: PM 10.0 Concentration - pm_1_0_std: - name: PM 1.0 Standard Atmospher Concentration - pm_2_5_std: - name: PM 2.5 Standard Atmospher Concentration - pm_10_0_std: - name: PM 10.0 Standard Atmospher Concentration - pm_0_3um: - name: Particulate Count >0.3um - pm_0_5um: - name: Particulate Count >0.5um - pm_1_0um: - name: Particulate Count >1.0um - pm_2_5um: - name: Particulate Count >2.5um - pm_5_0um: - name: Particulate Count >5.0um - pm_10_0um: - name: Particulate Count >10.0um - temperature: - name: PMS Temperature - humidity: - name: PMS Humidity - formaldehyde: - name: PMS Formaldehyde Concentration - - platform: cse7761 - uart_id: uart_7 - voltage: - name: CSE7761 Voltage - current_1: - name: CSE7761 Current 1 - current_2: - name: CSE7761 Current 2 - active_power_1: - name: CSE7761 Active Power 1 - active_power_2: - name: CSE7761 Active Power 2 - - platform: cse7766 - uart_id: uart_3 - voltage: - name: CSE7766 Voltage - current: - name: CSE7766 Current - power: - name: CSE7766 Power - apparent_power: - name: CSE7766 Apparent Power - power_factor: - name: CSE7766 Power Factor - - - platform: fingerprint_grow - fingerprint_count: - name: Fingerprint Count - status: - name: Fingerprint Status - capacity: - name: Fingerprint Capacity - security_level: - name: Fingerprint Security Level - last_finger_id: - name: Fingerprint Last Finger ID - last_confidence: - name: Fingerprint Last Confidence - - platform: sdm_meter - phase_a: - current: - name: Phase A Current - voltage: - name: Phase A Voltage - active_power: - name: Phase A Power - power_factor: - name: Phase A Power Factor - apparent_power: - name: Phase A Apparent Power - reactive_power: - name: Phase A Reactive Power - phase_angle: - name: Phase A Phase Angle - phase_b: - current: - name: Phase B Current - voltage: - name: Phase B Voltage - active_power: - name: Phase B Power - power_factor: - name: Phase B Power Factor - apparent_power: - name: Phase B Apparent Power - reactive_power: - name: Phase B Reactive Power - phase_angle: - name: Phase B Phase Angle - phase_c: - current: - name: Phase C Current - voltage: - name: Phase C Voltage - active_power: - name: Phase C Power - power_factor: - name: Phase C Power Factor - apparent_power: - name: Phase C Apparent Power - reactive_power: - name: Phase C Reactive Power - phase_angle: - name: Phase C Phase Angle - frequency: - name: Frequency - import_active_energy: - name: Import Active Energy - export_active_energy: - name: Export Active Energy - import_reactive_energy: - name: Import Reactive Energy - export_reactive_energy: - name: Export Reactive Energy - - platform: dsmr - energy_delivered_tariff1: - name: dsmr_energy_delivered_tariff1 - - - platform: nextion - id: testnumber - name: testnumber - variable_name: testnumber - - platform: nextion - id: testwave - name: testwave - component_id: 2 - wave_channel_id: 1 - - platform: smt100 - uart_id: uart_10 - counts: - name: Counts - dielectric_constant: - name: Dielectric Constant - temperature: - name: Temperature - moisture: - name: Moisture - voltage: - name: Voltage - update_interval: 60s - - - platform: vbus - model: deltasol c - temperature_1: - name: Temperature 1 - - - platform: kuntze - ph: - name: Kuntze pH - temperature: - name: Kuntze temperature - - - platform: haier - haier_id: haier_climate - compressor_current: - name: Haier AC compressor current - compressor_frequency: - name: Haier AC compressor frequency - expansion_valve_open_degree: - name: Haier AC expansion valve open degree - humidity: - name: Haier AC indoor humidity - indoor_coil_temperature: - name: Haier AC indoor coil temperature - outdoor_coil_temperature: - name: Haier AC outdoor coil temperature - outdoor_defrost_temperature: - name: Haier AC outdoor defrost temperature - outdoor_in_air_temperature: - name: Haier AC outdoor in air temperature - outdoor_out_air_temperature: - name: Haier AC outdoor out air temperature - outdoor_temperature: - name: Haier AC outdoor temperature - power: - name: Haier AC power - -time: - - platform: homeassistant - -binary_sensor: - - platform: daly_bms - charging_mos_enabled: - name: Charging MOS - discharging_mos_enabled: - name: Discharging MOS - - - platform: homeassistant - entity_id: binary_sensor.hello_world - id: ha_hello_world_binary - - - platform: fingerprint_grow - name: Fingerprint Enrolling - - platform: nextion - page_id: 0 - component_id: 2 - name: Nextion Component 2 Touch - - platform: nextion - id: r0_sensor - name: R0 Sensor - component_name: page0.r0 - - - platform: hydreon_rgxx - hydreon_rgxx_id: hydreon_rg9 - too_cold: - name: rg9_toocold - em_sat: - name: rg9_emsat - lens_bad: - name: rg9_lens_bad - - - platform: template - id: pzemac_reset_energy - on_press: - then: - - pzemac.reset_energy: pzemac1 - - platform: template - id: pzemdc_reset_energy - on_press: - then: - - pzemdc.reset_energy: pzemdc1 - - - platform: vbus - model: deltasol_bs_plus - relay1: - name: Relay 1 On - - - platform: gpio - id: bin1 - pin: - allow_other_uses: true - number: 1 - - platform: gpio - id: bin2 - pin: - allow_other_uses: true - number: 2 - - platform: gpio - id: bin3 - pin: - allow_other_uses: true - number: 3 - - - platform: haier - haier_id: haier_climate - compressor_status: - name: Haier AC compressor status - defrost_status: - name: Haier AC defrost status - four_way_valve_status: - name: Haier AC four-way valve status - indoor_electric_heating_status: - name: Haier AC indoor electric heating status - indoor_fan_status: - name: Haier AC indoor fan status - outdoor_fan_status: - name: Haier AC outdoor fan status - -globals: - - id: my_global_string - type: std::string - initial_value: '""' - -remote_receiver: - pin: - allow_other_uses: true - number: GPIO12 - dump: [] - -status_led: - pin: - allow_other_uses: true - number: GPIO2 - -text_sensor: - - platform: daly_bms - status: - name: BMS Status - - platform: version - name: ESPHome Version - icon: mdi:icon - id: version_sensor - on_value: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The state is %s=%s", x.c_str(), id(version_sensor).state.c_str()); - # yamllint enable rule:line-length - - script.execute: my_script - - script.wait: my_script - - script.stop: my_script - - homeassistant.service: - service: notify.html5 - data: - title: New Humidity - data_template: - message: The humidity is {{ my_variable }}%. - variables: - my_variable: |- - return id(version_sensor).state; - - platform: template - name: Template Text Sensor - lambda: |- - return {"Hello World"}; - - platform: homeassistant - entity_id: sensor.hello_world2 - id: ha_hello_world2 - - platform: nextion - name: text0 - id: text0 - update_interval: 4s - component_name: text0 - - platform: dsmr - identification: - name: dsmr_identification - p1_version: - name: dsmr_p1_version - -script: - - id: my_script - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - -switch: - - platform: gpio - id: gpio_switch1 - pin: - allow_other_uses: true - number: 1 - - platform: gpio - id: gpio_switch2 - pin: - allow_other_uses: true - number: 2 - - platform: gpio - id: gpio_switch3 - pin: - allow_other_uses: true - number: 3 - - - platform: nextion - id: r0 - name: R0 Switch - component_name: page0.r0 - -climate: - - platform: bang_bang - name: Bang Bang Climate - sensor: ha_hello_world - humidity_sensor: ha_hello_world - default_target_temperature_low: 18°C - default_target_temperature_high: 24°C - idle_action: - - switch.turn_on: gpio_switch1 - cool_action: - - switch.turn_on: gpio_switch2 - heat_action: - - switch.turn_on: gpio_switch1 - away_config: - default_target_temperature_low: 16°C - default_target_temperature_high: 20°C - - platform: thermostat - name: Thermostat Climate - sensor: ha_hello_world - humidity_sensor: ha_hello_world - preset: - - name: Default Preset - default_target_temperature_low: 18°C - default_target_temperature_high: 24°C - - name: Away - default_target_temperature_low: 16°C - default_target_temperature_high: 20°C - idle_action: - - switch.turn_on: gpio_switch1 - cool_action: - - switch.turn_on: gpio_switch2 - supplemental_cooling_action: - - switch.turn_on: gpio_switch3 - heat_action: - - switch.turn_on: gpio_switch1 - supplemental_heating_action: - - switch.turn_on: gpio_switch3 - dry_action: - - switch.turn_on: gpio_switch2 - fan_only_action: - - switch.turn_on: gpio_switch1 - auto_mode: - - switch.turn_on: gpio_switch2 - off_mode: - - switch.turn_on: gpio_switch1 - heat_mode: - - switch.turn_on: gpio_switch2 - cool_mode: - - switch.turn_on: gpio_switch1 - dry_mode: - - switch.turn_on: gpio_switch2 - fan_only_mode: - - switch.turn_on: gpio_switch1 - fan_mode_auto_action: - - switch.turn_on: gpio_switch2 - fan_mode_on_action: - - switch.turn_on: gpio_switch1 - fan_mode_off_action: - - switch.turn_on: gpio_switch2 - fan_mode_low_action: - - switch.turn_on: gpio_switch1 - fan_mode_medium_action: - - switch.turn_on: gpio_switch2 - fan_mode_high_action: - - switch.turn_on: gpio_switch1 - fan_mode_middle_action: - - switch.turn_on: gpio_switch2 - fan_mode_focus_action: - - switch.turn_on: gpio_switch1 - fan_mode_diffuse_action: - - switch.turn_on: gpio_switch2 - fan_mode_quiet_action: - - switch.turn_on: gpio_switch1 - swing_off_action: - - switch.turn_on: gpio_switch2 - swing_horizontal_action: - - switch.turn_on: gpio_switch1 - swing_vertical_action: - - switch.turn_on: gpio_switch2 - swing_both_action: - - switch.turn_on: gpio_switch1 - startup_delay: true - supplemental_cooling_delta: 2.0 - cool_deadband: 0.5 - cool_overrun: 0.5 - min_cooling_off_time: 300s - min_cooling_run_time: 300s - max_cooling_run_time: 600s - supplemental_heating_delta: 2.0 - heat_deadband: 0.5 - heat_overrun: 0.5 - min_heating_off_time: 300s - min_heating_run_time: 300s - max_heating_run_time: 600s - min_fanning_off_time: 30s - min_fanning_run_time: 30s - min_fan_mode_switching_time: 15s - min_idle_time: 30s - set_point_minimum_differential: 0.5 - fan_only_action_uses_fan_mode_timer: true - fan_only_cooling: true - fan_with_cooling: true - fan_with_heating: true - - platform: pid - id: pid_climate - name: PID Climate Controller - sensor: ha_hello_world - humidity_sensor: ha_hello_world - default_target_temperature: 21°C - heat_output: my_slow_pwm - control_parameters: - kp: 0.0 - ki: 0.0 - kd: 0.0 - max_integral: 0.0 - output_averaging_samples: 1 - derivative_averaging_samples: 1 - deadband_parameters: - threshold_high: 0.4 - threshold_low: -2.0 - kp_multiplier: 0.0 - ki_multiplier: 0.0 - kd_multiplier: 0.0 - deadband_output_averaging_samples: 1 - - platform: haier - id: haier_climate - protocol: hOn - name: Haier AC - uart_id: uart_12 - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - "OFF" - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - "OFF" - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: 'Alarm activated. Code: %d. Message: "%s"' - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: 'Alarm deactivated. Code: %d. Message: "%s"' - args: [code, message] - -sprinkler: - - id: yard_sprinkler_ctrlr - main_switch: Yard Sprinklers - auto_advance_switch: Yard Sprinklers Auto Advance - reverse_switch: Yard Sprinklers Reverse - pump_start_pump_delay: 2s - pump_stop_valve_delay: 4s - pump_switch_off_during_valve_open_delay: true - valve_open_delay: 5s - valves: - - valve_switch: Yard Valve 0 - enable_switch: Enable Yard Valve 0 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - valve_switch: Yard Valve 1 - enable_switch: Enable Yard Valve 1 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - valve_switch: Yard Valve 2 - enable_switch: Enable Yard Valve 2 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - id: garden_sprinkler_ctrlr - main_switch: Garden Sprinklers - auto_advance_switch: Garden Sprinklers Auto Advance - reverse_switch: Garden Sprinklers Reverse - valve_overlap: 5s - valves: - - valve_switch: Garden Valve 0 - enable_switch: Enable Garden Valve 0 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - valve_switch: Garden Valve 1 - enable_switch: Enable Garden Valve 1 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - -output: - - platform: esp8266_pwm - id: out - pin: - number: D3 - frequency: 50Hz - - platform: esp8266_pwm - id: out2 - pin: - allow_other_uses: true - number: D4 - - platform: slow_pwm - pin: - allow_other_uses: true - number: GPIO5 - id: my_slow_pwm - period: 15s - restart_cycle_on_state_change: false - -e131: - -light: - - platform: neopixelbus - name: Neopixelbus Light - pin: - allow_other_uses: true - number: GPIO1 - type: GRBW - variant: SK6812 - method: ESP8266_UART0 - num_leds: 100 - effects: - - wled: - - adalight: - uart_id: uart_3 - - e131: - universe: 1 - - platform: hbridge - name: Icicle Lights - pin_a: out - pin_b: out2 - - platform: sonoff_d1 - uart_id: uart_2 - use_rm433_remote: false - name: Sonoff D1 Dimmer - id: d1_light - restore_mode: RESTORE_DEFAULT_OFF - - platform: shelly_dimmer - name: "Shelly Dimmer Light" - power: - name: "Shelly Dimmer Power" - voltage: - name: "Shelly Dimmer Voltage" - current: - name: "Shelly Dimmer Current" - max_brightness: 500 - firmware: "51.6" - uart_id: uart_11 - nrst_pin: - number: 5 - allow_other_uses: true - boot0_pin: - number: 4 - allow_other_uses: true - -sim800l: - uart_id: uart_4 - on_sms_received: - - lambda: |- - std::string str; - str = sender; - str = message; - - sim800l.send_sms: - message: hello you - recipient: "+1234" - - sim800l.dial: - recipient: "+1234" - -dfplayer: - uart_id: uart_5 - on_finished_playback: - then: - if: - condition: - not: dfplayer.is_playing - then: - logger.log: Playback finished event -tm1651: - id: tm1651_battery - clk_pin: - allow_other_uses: true - number: D6 - dio_pin: - allow_other_uses: true - number: D5 - -rf_bridge: - uart_id: uart_5 - on_code_received: - - lambda: |- - uint32_t test; - test = data.sync; - test = data.low; - test = data.high; - test = data.code; - - rf_bridge.send_code: - sync: 0x1234 - low: 0x1234 - high: 0x1234 - code: 0x123456 - - rf_bridge.learn - - on_advanced_code_received: - - lambda: |- - uint32_t test; - std::string test_code; - test = data.length; - test = data.protocol; - test_code = data.code; - - rf_bridge.start_advanced_sniffing: - - rf_bridge.stop_advanced_sniffing: - - rf_bridge.send_advanced_code: - length: 0x04 - protocol: 0x01 - code: "ABC123" - - rf_bridge.send_raw: - raw: "AAA5070008001000ABC12355" - -display: - - platform: nextion - uart_id: uart_1 - tft_url: http://esphome.io/default35.tft - update_interval: 5s - on_sleep: - then: - lambda: 'ESP_LOGD("display","Display went to sleep");' - on_wake: - then: - lambda: 'ESP_LOGD("display","Display woke up");' - on_setup: - then: - lambda: 'ESP_LOGD("display","Display setup completed");' - on_page: - then: - lambda: 'ESP_LOGD("display","Display shows new page %u", x);' - -fingerprint_grow: - sensing_pin: - allow_other_uses: true - number: 4 - sensor_power_pin: - allow_other_uses: true - number: 5 - inverted: true - idle_period_to_sleep: 5s - password: 0x12FE37DC - new_password: 0xA65B9840 - on_finger_scan_start: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_start - on_finger_scan_invalid: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_invalid - on_finger_scan_matched: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_matched - data: - finger_id: !lambda "return finger_id;" - confidence: !lambda "return confidence;" - on_finger_scan_unmatched: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_unmatched - on_finger_scan_misplaced: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_misplaced - on_enrollment_scan: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_enrollment_scan - data: - finger_id: !lambda "return finger_id;" - scan_num: !lambda "return scan_num;" - on_enrollment_done: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_node_enrollment_done - data: - finger_id: !lambda "return finger_id;" - on_enrollment_failed: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_enrollment_failed - data: - finger_id: !lambda "return finger_id;" - uart_id: uart_6 - -dsmr: - decryption_key: 00112233445566778899aabbccddeeff - uart_id: uart_6 - max_telegram_length: 1000 - request_pin: - allow_other_uses: true - number: D5 - request_interval: 20s - receive_timeout: 100ms - -daly_bms: - update_interval: 20s - uart_id: uart_1 - -qr_code: - - id: homepage_qr - value: https://esphome.io/index.html - -lightwaverf: - read_pin: - number: 13 - write_pin: - allow_other_uses: true - number: 14 - -alarm_control_panel: - - platform: template - id: alarmcontrolpanel1 - name: Alarm Panel - codes: - - "1234" - requires_code_to_arm: true - arming_home_time: 1s - arming_night_time: 1s - arming_away_time: 15s - pending_time: 15s - trigger_time: 30s - binary_sensors: - - input: bin1 - bypass_armed_home: true - bypass_armed_night: true - on_state: - then: - - lambda: !lambda |- - ESP_LOGD("TEST", "State change %s", alarm_control_panel_state_to_string(id(alarmcontrolpanel1)->get_state())); - - platform: template - id: alarmcontrolpanel2 - name: Alarm Panel - codes: - - "1234" - requires_code_to_arm: true - arming_home_time: 1s - arming_night_time: 1s - arming_away_time: 15s - pending_time: 15s - trigger_time: 30s - binary_sensors: - - input: bin1 - bypass_armed_home: true - bypass_armed_night: true - on_disarmed: - then: - - logger.log: "### DISARMED ###" - on_pending: - then: - - logger.log: "### PENDING ###" - on_arming: - then: - - logger.log: "### ARMING ###" - on_armed_home: - then: - - logger.log: "### ARMED HOME ###" - on_armed_night: - then: - - logger.log: "### ARMED NIGHT ###" - on_armed_away: - then: - - logger.log: "### ARMED AWAY ###" - on_triggered: - then: - - logger.log: "### TRIGGERED ###" - on_cleared: - then: - - logger.log: "### CLEARED ###" diff --git a/tests/test4.yaml b/tests/test4.yaml deleted file mode 100644 index c9e8a27317..0000000000 --- a/tests/test4.yaml +++ /dev/null @@ -1,998 +0,0 @@ ---- -esphome: - name: $devicename - platform: ESP32 - board: nodemcu-32s - build_path: build/test4 - -substitutions: - devicename: test-4 - -ethernet: - type: LAN8720 - mdc_pin: - allow_other_uses: true - number: GPIO23 - mdio_pin: - allow_other_uses: true - number: GPIO25 - clk_mode: GPIO0_IN - phy_addr: 0 - power_pin: - allow_other_uses: true - number: GPIO25 - manual_ip: - static_ip: 192.168.178.56 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - domain: .local - -network: - enable_ipv6: true - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant - topic_prefix: - -api: - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - allow_other_uses: true - number: 22 - scan: false - -spi: - - id: spi_id_1 - clk_pin: - allow_other_uses: true - number: GPIO21 - mosi_pin: - allow_other_uses: true - number: GPIO22 - miso_pin: - allow_other_uses: true - number: GPIO23 - interface: hardware - - id: spi_id_2 - clk_pin: - number: GPIO32 - mosi_pin: - number: GPIO33 - interface: hardware - -uart: - - id: uart115200 - tx_pin: - allow_other_uses: true - number: GPIO22 - rx_pin: - allow_other_uses: true - number: GPIO23 - baud_rate: 115200 - - id: uart9600 - tx_pin: - allow_other_uses: true - number: GPIO25 - rx_pin: - allow_other_uses: true - number: GPIO26 - baud_rate: 9600 - - id: uart_a02yyuw - tx_pin: - allow_other_uses: true - number: GPIO22 - rx_pin: - allow_other_uses: true - number: GPIO23 - baud_rate: 9600 - - id: uart_he60r - tx_pin: - number: GPIO18 - allow_other_uses: true - rx_pin: - number: GPIO36 - allow_other_uses: true - baud_rate: 1200 - parity: EVEN - -safe_mode: - -ota: - - platform: esphome - port: 3286 - -logger: - level: DEBUG - -debug: - -web_server: - ota: false - auth: - username: admin - password: admin - include_internal: true - -time: - - platform: sntp - id: sntp_time - -tuya: - time_id: sntp_time - uart_id: uart115200 - status_pin: - number: GPIO5 - inverted: true - allow_other_uses: true - -select: - - platform: tuya - id: tuya_select - enum_datapoint: 42 - options: - 0: Internal - 1: Floor - 2: Both - -pipsolar: - id: inverter0 - uart_id: uart115200 - -pylontech: - - id: pylontech0 - uart_id: uart115200 - - id: pylontech1 - uart_id: uart115200 - -sx1509: - - id: sx1509_hub - address: 0x3E - -mcp3204: - spi_id: spi_id_1 - cs_pin: - allow_other_uses: true - number: GPIO23 - -dac7678: - address: 0x4A - id: dac7678_hub1 - internal_reference: true - -sensor: - - platform: pylontech - pylontech_id: pylontech0 - battery: 1 - voltage: - id: pyl01_voltage - current: - id: pyl01_current - coulomb: - id: pyl01_soc - mos_temperature: - id: pyl01_mos_temperature - - platform: pylontech - pylontech_id: pylontech1 - battery: 1 - voltage: - id: pyl13_voltage - temperature_low: - id: pyl13_temperature_low - temperature_high: - id: pyl13_temperature_high - voltage_low: - id: pyl13_voltage_low - voltage_high: - id: pyl13_voltage_high - - platform: homeassistant - entity_id: sensor.hello_world - id: ha_hello_world - - platform: tuya - id: tuya_sensor - sensor_datapoint: 1 - - platform: pipsolar - pipsolar_id: inverter0 - grid_rating_voltage: - id: inverter0_grid_rating_voltage - name: inverter0_grid_rating_voltage - grid_rating_current: - id: inverter0_grid_rating_current - name: inverter0_grid_rating_current - ac_output_rating_voltage: - id: inverter0_ac_output_rating_voltage - name: inverter0_ac_output_rating_voltage - ac_output_rating_frequency: - id: inverter0_ac_output_rating_frequency - name: inverter0_ac_output_rating_frequency - ac_output_rating_current: - id: inverter0_ac_output_rating_current - name: inverter0_ac_output_rating_current - ac_output_rating_apparent_power: - id: inverter0_ac_output_rating_apparent_power - name: inverter0_ac_output_rating_apparent_power - ac_output_rating_active_power: - id: inverter0_ac_output_rating_active_power - name: inverter0_ac_output_rating_active_power - battery_rating_voltage: - id: inverter0_battery_rating_voltage - name: inverter0_battery_rating_voltage - battery_recharge_voltage: - id: inverter0_battery_recharge_voltage - name: inverter0_battery_recharge_voltage - battery_under_voltage: - id: inverter0_battery_under_voltage - name: inverter0_battery_under_voltage - battery_bulk_voltage: - id: inverter0_battery_bulk_voltage - name: inverter0_battery_bulk_voltage - battery_float_voltage: - id: inverter0_battery_float_voltage - name: inverter0_battery_float_voltage - battery_type: - id: inverter0_battery_type - name: inverter0_battery_type - current_max_ac_charging_current: - id: inverter0_current_max_ac_charging_current - name: inverter0_current_max_ac_charging_current - current_max_charging_current: - id: inverter0_current_max_charging_current - name: inverter0_current_max_charging_current - input_voltage_range: - id: inverter0_input_voltage_range - name: inverter0_input_voltage_range - output_source_priority: - id: inverter0_output_source_priority - name: inverter0_output_source_priority - charger_source_priority: - id: inverter0_charger_source_priority - name: inverter0_charger_source_priority - parallel_max_num: - id: inverter0_parallel_max_num - name: inverter0_parallel_max_num - machine_type: - id: inverter0_machine_type - name: inverter0_machine_type - topology: - id: inverter0_topology - name: inverter0_topology - output_mode: - id: inverter0_output_mode - name: inverter0_output_mode - battery_redischarge_voltage: - id: inverter0_battery_redischarge_voltage - name: inverter0_battery_redischarge_voltage - pv_ok_condition_for_parallel: - id: inverter0_pv_ok_condition_for_parallel - name: inverter0_pv_ok_condition_for_parallel - pv_power_balance: - id: inverter0_pv_power_balance - name: inverter0_pv_power_balance - grid_voltage: - id: inverter0_grid_voltage - name: inverter0_grid_voltage - grid_frequency: - id: inverter0_grid_frequency - name: inverter0_grid_frequency - ac_output_voltage: - id: inverter0_ac_output_voltage - name: inverter0_ac_output_voltage - ac_output_frequency: - id: inverter0_ac_output_frequency - name: inverter0_ac_output_frequency - ac_output_apparent_power: - id: inverter0_ac_output_apparent_power - name: inverter0_ac_output_apparent_power - ac_output_active_power: - id: inverter0_ac_output_active_power - name: inverter0_ac_output_active_power - output_load_percent: - id: inverter0_output_load_percent - name: inverter0_output_load_percent - bus_voltage: - id: inverter0_bus_voltage - name: inverter0_bus_voltage - battery_voltage: - id: inverter0_battery_voltage - name: inverter0_battery_voltage - battery_charging_current: - id: inverter0_battery_charging_current - name: inverter0_battery_charging_current - battery_capacity_percent: - id: inverter0_battery_capacity_percent - name: inverter0_battery_capacity_percent - inverter_heat_sink_temperature: - id: inverter0_inverter_heat_sink_temperature - name: inverter0_inverter_heat_sink_temperature - pv_input_current_for_battery: - id: inverter0_pv_input_current_for_battery - name: inverter0_pv_input_current_for_battery - pv_input_voltage: - id: inverter0_pv_input_voltage - name: inverter0_pv_input_voltage - battery_voltage_scc: - id: inverter0_battery_voltage_scc - name: inverter0_battery_voltage_scc - battery_discharge_current: - id: inverter0_battery_discharge_current - name: inverter0_battery_discharge_current - battery_voltage_offset_for_fans_on: - id: inverter0_battery_voltage_offset_for_fans_on - name: inverter0_battery_voltage_offset_for_fans_on - eeprom_version: - id: inverter0_eeprom_version - name: inverter0_eeprom_version - pv_charging_power: - id: inverter0_pv_charging_power - name: inverter0_pv_charging_power - - platform: hrxl_maxsonar_wr - name: Rainwater Tank Level - uart_id: uart115200 - filters: - - sliding_window_moving_average: - window_size: 12 - send_every: 12 - - or: - - throttle: 20min - - delta: 0.02 - - platform: mcp3204 - name: MCP3204 Pin 1 - number: 1 - id: mcp_sensor - - platform: copy - source_id: mcp_sensor - name: MCP binary sensor copy - - platform: ufire_ec - id: ufire_ec_board - temperature: - name: Ufire Temperature - ec: - name: Ufire EC - temperature_compensation: 20.0 - temperature_coefficient: 0.019 - - platform: ufire_ise - id: ufire_ise_board - temperature: - name: Ufire Temperature - ph: - name: Ufire pH - - platform: a01nyub - id: a01nyub_sensor - name: "a01nyub Distance" - uart_id: uart9600 - state_topic: "esphome/sensor/a01nyub_sensor/state" - - platform: a02yyuw - id: a02yyuw_sensor - name: "a02yyuw Distance" - uart_id: uart_a02yyuw - state_topic: "esphome/sensor/a02yyuw_sensor/state" - -# -# platform sensor.apds9960 requires component apds9960 -# -# - platform: apds9960 -# type: proximity -# name: APDS9960 Proximity -# - platform: apds9960 -# type: clear -# name: APDS9960 Clear -# - platform: apds9960 -# type: red -# name: APDS9960 Red -# - platform: apds9960 -# type: green -# name: APDS9960 Green -# - platform: apds9960 -# type: blue -# name: APDS9960 Blue - -binary_sensor: - - platform: tuya - id: tuya_binary_sensor - sensor_datapoint: 1 - - platform: pipsolar - pipsolar_id: inverter0 - add_sbu_priority_version: - id: inverter0_add_sbu_priority_version - name: inverter0_add_sbu_priority_version - configuration_status: - id: inverter0_configuration_status - name: inverter0_configuration_status - scc_firmware_version: - id: inverter0_scc_firmware_version - name: inverter0_scc_firmware_version - load_status: - id: inverter0_load_status - name: inverter0_load_status - battery_voltage_to_steady_while_charging: - id: inverter0_battery_voltage_to_steady_while_charging - name: inverter0_battery_voltage_to_steady_while_charging - charging_status: - id: inverter0_charging_status - name: inverter0_charging_status - scc_charging_status: - id: inverter0_scc_charging_status - name: inverter0_scc_charging_status - ac_charging_status: - id: inverter0_ac_charging_status - name: inverter0_ac_charging_status - charging_to_floating_mode: - id: inverter0_charging_to_floating_mode - name: inverter0_charging_to_floating_mode - switch_on: - id: inverter0_switch_on - name: inverter0_switch_on - dustproof_installed: - id: inverter0_dustproof_installed - name: inverter0_dustproof_installed - silence_buzzer_open_buzzer: - id: inverter0_silence_buzzer_open_buzzer - name: inverter0_silence_buzzer_open_buzzer - overload_bypass_function: - id: inverter0_overload_bypass_function - name: inverter0_overload_bypass_function - lcd_escape_to_default: - id: inverter0_lcd_escape_to_default - name: inverter0_lcd_escape_to_default - overload_restart_function: - id: inverter0_overload_restart_function - name: inverter0_overload_restart_function - over_temperature_restart_function: - id: inverter0_over_temperature_restart_function - name: inverter0_over_temperature_restart_function - backlight_on: - id: inverter0_backlight_on - name: inverter0_backlight_on - - platform: template - id: ar1 - lambda: "return {};" - filters: - - autorepeat: - - delay: 2s - time_off: 100ms - time_on: 900ms - - delay: 4s - time_off: 100ms - time_on: 400ms - on_state: - then: - - lambda: 'ESP_LOGI("ar1:", "%d", x);' - - platform: touchscreen - touchscreen_id: xpt_touchscreen - id: touch_key0 - x_min: 80 - x_max: 160 - y_min: 106 - y_max: 212 - on_press: - - logger.log: Touched - - - platform: gpio - name: GPIO SX1509 test - pin: - sx1509: sx1509_hub - number: 3 - - - platform: touchscreen - touchscreen_id: lilygo_touchscreen - id: touch_key1 - x_min: 0 - x_max: 100 - y_min: 0 - y_max: 100 - on_press: - - logger.log: Touched - - platform: gt911 - id: touch_key_911 - index: 0 - - - platform: gpio - name: MaxIn Pin 4 - pin: - max6956: max6956_1 - number: 4 - - mode: - input: true - pullup: true - inverted: false - - - platform: gpio - name: XL9535 Pin 0 - pin: - xl9535: xl9535_hub - number: 0 - mode: - input: true - inverted: false - - - platform: gpio - name: XL9535 Pin 17 - pin: - xl9535: xl9535_hub - number: 17 - mode: - input: true - inverted: false - -climate: - - platform: tuya - id: tuya_climate - switch_datapoint: 1 - target_temperature_datapoint: 3 - current_temperature_multiplier: 0.5 - target_temperature_multiplier: 0.5 - reports_fahrenheit: true - -switch: - - platform: tuya - id: tuya_switch - switch_datapoint: 1 - - platform: pipsolar - pipsolar_id: inverter0 - output_source_priority_utility: - name: inverter0_output_source_priority_utility - output_source_priority_solar: - name: inverter0_output_source_priority_solar - output_source_priority_battery: - name: inverter0_output_source_priority_battery - input_voltage_range: - name: inverter0_input_voltage_range - pv_ok_condition_for_parallel: - name: inverter0_pv_ok_condition_for_parallel - pv_power_balance: - name: inverter0_pv_power_balance - - platform: copy - source_id: tuya_switch - name: Tuya Switch Copy - -light: - - platform: fastled_clockless - id: led_matrix_32x8 - name: led_matrix_32x8 - chipset: WS2812B - pin: - allow_other_uses: true - number: GPIO15 - num_leds: 256 - rgb_order: GRB - default_transition_length: 0s - color_correct: [50%, 50%, 50%] - - platform: tuya - id: tuya_light - switch_datapoint: 1 - dimmer_datapoint: 2 - min_value_datapoint: 3 - color_temperature_datapoint: 4 - min_value: 1 - max_value: 100 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - gamma_correct: 1 - -cover: - - platform: tuya - id: tuya_cover - position_datapoint: 2 - - platform: copy - source_id: tuya_cover - name: Tuya Cover copy - - platform: he60r - uart_id: uart_he60r - id: garage_door - name: Garage Door - open_duration: 14s - close_duration: 14s - -display: - - platform: addressable_light - id: led_matrix_32x8_display - addressable_light_id: led_matrix_32x8 - width: 32 - height: 8 - pixel_mapper: |- - if (x % 2 == 0) { - return (x * 8) + y; - } - return (x * 8) + (7 - y); - lambda: |- - Color red = Color(0xFF0000); - Color green = Color(0x00FF00); - Color blue = Color(0x0000FF); - it.rectangle(0, 0, it.get_width(), it.get_height(), red); - it.rectangle(1, 1, it.get_width()-2, it.get_height()-2, green); - it.rectangle(2, 2, it.get_width()-4, it.get_height()-4, blue); - it.rectangle(3, 3, it.get_width()-6, it.get_height()-6, red); - auto touch = id(ft63_touchscreen)->get_touch(); - if (touch) { ESP_LOGD("touch", "%d/%d", touch.value().x, touch.value().y); } - rotation: 0° - update_interval: 16ms - - - platform: inkplate6 - id: inkplate_display - greyscale: false - partial_updating: false - update_interval: 60s - display_data_1_pin: - number: GPIO5 - allow_other_uses: true - display_data_2_pin: - number: GPIO18 - allow_other_uses: true - display_data_3_pin: - number: GPIO19 - allow_other_uses: true - display_data_5_pin: - number: GPIO25 - allow_other_uses: true - display_data_4_pin: - number: GPIO23 - allow_other_uses: true - display_data_6_pin: - number: GPIO26 - allow_other_uses: true - display_data_7_pin: - number: GPIO27 - allow_other_uses: true - ckv_pin: - number: GPIO1 - allow_other_uses: true - sph_pin: - number: GPIO1 - allow_other_uses: true - gmod_pin: - number: GPIO1 - allow_other_uses: true - gpio0_enable_pin: - number: GPIO1 - allow_other_uses: true - oe_pin: - number: GPIO1 - allow_other_uses: true - spv_pin: - number: GPIO1 - allow_other_uses: true - powerup_pin: - number: GPIO1 - allow_other_uses: true - wakeup_pin: - number: GPIO1 - allow_other_uses: true - vcom_pin: - number: GPIO1 - allow_other_uses: true - -number: - - platform: tuya - id: tuya_number - number_datapoint: 102 - min_value: 0 - max_value: 17 - step: 1 - - platform: copy - source_id: tuya_number - name: Tuya Number Copy - -text_sensor: - - platform: pylontech - pylontech_id: pylontech0 - battery: 1 - base_state: - id: pyl0_base_state - voltage_state: - id: pyl0_voltage_state - current_state: - id: pyl0_current_state - temperature_state: - id: pyl0_temperature_state - - platform: pipsolar - pipsolar_id: inverter0 - device_mode: - id: inverter0_device_mode - name: inverter0_device_mode - last_qpigs: - id: inverter0_last_qpigs - name: inverter0_last_qpigs - last_qpiri: - id: inverter0_last_qpiri - name: inverter0_last_qpiri - last_qmod: - id: inverter0_last_qmod - name: inverter0_last_qmod - last_qflag: - id: inverter0_last_qflag - name: inverter0_last_qflag - - platform: copy - source_id: inverter0_device_mode - name: Inverter Text Sensor Copy - - platform: ethernet_info - ip_address: - name: IP Address - -output: - - platform: pipsolar - pipsolar_id: inverter0 - battery_recharge_voltage: - id: inverter0_battery_recharge_voltage_out - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 0 - id: dac7678_1_ch0 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 1 - id: dac7678_1_ch1 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 2 - id: dac7678_1_ch2 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 3 - id: dac7678_1_ch3 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 4 - id: dac7678_1_ch4 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 5 - id: dac7678_1_ch5 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 6 - id: dac7678_1_ch6 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 7 - id: dac7678_1_ch7 -esp32_camera: - name: ESP-32 Camera - data_pins: - - number: GPIO17 - allow_other_uses: true - - number: GPIO35 - allow_other_uses: true - - number: GPIO34 - - number: GPIO5 - allow_other_uses: true - - number: GPIO39 - allow_other_uses: true - - number: GPIO18 - allow_other_uses: true - - number: GPIO36 - allow_other_uses: true - - number: GPIO19 - allow_other_uses: true - vsync_pin: - allow_other_uses: true - number: GPIO22 - href_pin: - allow_other_uses: true - number: GPIO26 - pixel_clock_pin: - allow_other_uses: true - number: GPIO21 - external_clock: - pin: - allow_other_uses: true - number: GPIO27 - frequency: 20MHz - i2c_pins: - sda: - allow_other_uses: true - number: GPIO25 - scl: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO15 - power_down_pin: - allow_other_uses: true - number: GPIO1 - resolution: 640x480 - jpeg_quality: 10 - on_image: - then: - - lambda: |- - ESP_LOGD("main", "image len=%d, data=%c", image.length, image.data[0]); - -esp32_camera_web_server: - - port: 8080 - mode: stream - - port: 8081 - mode: snapshot - -external_components: - - source: github://esphome/esphome@dev - refresh: 1d - components: [bh1750] - - source: ../esphome/components - components: [sntp] - -button: - - platform: restart - name: Restart Button - - platform: safe_mode - name: Safe Mode Button - - platform: shutdown - name: Shutdown Button - id: shutdown_btn - - platform: copy - source_id: shutdown_btn - name: Shutdown Button Copy - -touchscreen: - - platform: ektf2232 - interrupt_pin: - allow_other_uses: true - number: GPIO36 - rts_pin: - allow_other_uses: true - number: GPIO5 - display: inkplate_display - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - - - platform: xpt2046 - id: xpt_touchscreen - spi_id: spi_id_2 - cs_pin: - allow_other_uses: true - number: GPIO17 - interrupt_pin: - number: GPIO16 - display: inkplate_display - update_interval: 50ms - threshold: 400 - calibration: - x_min: 3860 - x_max: 280 - y_min: 340 - y_max: 3860 - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - - - platform: lilygo_t5_47 - id: lilygo_touchscreen - interrupt_pin: - allow_other_uses: true - number: GPIO36 - display: inkplate_display - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - - platform: gt911 - interrupt_pin: - number: GPIO3 - display: inkplate_display - - - platform: ft63x6 - id: ft63_touchscreen - interrupt_pin: - allow_other_uses: true - number: GPIO39 - reset_pin: - allow_other_uses: true - number: GPIO5 - display: inkplate_display - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - -i2s_audio: - i2s_lrclk_pin: - allow_other_uses: true - number: GPIO26 - i2s_bclk_pin: - allow_other_uses: true - number: GPIO27 - i2s_mclk_pin: - allow_other_uses: true - number: GPIO25 - -media_player: - - platform: i2s_audio - name: None - dac_type: external - i2s_dout_pin: - allow_other_uses: true - number: GPIO25 - mute_pin: - number: GPIO14 - on_state: - - media_player.play: - - media_player.play_media: http://localhost/media.mp3 - - media_player.play_media: !lambda 'return "http://localhost/media.mp3";' - on_idle: - - media_player.pause: - on_play: - - media_player.stop: - on_pause: - - media_player.toggle: - - wait_until: - media_player.is_idle: - - wait_until: - media_player.is_playing: - - media_player.volume_up: - - media_player.volume_down: - - media_player.volume_set: 50% - -prometheus: - include_internal: true - relabel: - ha_hello_world: - id: hellow_world - name: Hello World - -microphone: - - platform: i2s_audio - id: mic_id_adc - adc_pin: - allow_other_uses: true - number: GPIO35 - adc_type: internal - - - platform: i2s_audio - id: mic_id_external - i2s_din_pin: - allow_other_uses: true - number: GPIO23 - adc_type: external - pdm: false - -speaker: - - platform: i2s_audio - id: speaker_id - dac_type: external - i2s_dout_pin: - allow_other_uses: true - number: GPIO25 - mode: mono - -voice_assistant: - microphone: mic_id_external - speaker: speaker_id - on_listening: - - logger.log: "Voice assistant microphone listening" - on_start: - - logger.log: "Voice assistant started" - on_stt_end: - - logger.log: - format: "Voice assistant STT ended with result %s" - args: [x.c_str()] - on_tts_start: - - logger.log: - format: "Voice assistant TTS started with text %s" - args: [x.c_str()] - on_tts_end: - - logger.log: - format: "Voice assistant TTS ended with url %s" - args: [x.c_str()] - on_end: - - logger.log: "Voice assistant ended" - on_error: - - logger.log: - format: "Voice assistant error - code %s, message: %s" - args: [code.c_str(), message.c_str()] - -max6956: - - id: max6956_1 - address: 0x40 - -xl9535: - - id: xl9535_hub - address: 0x20 diff --git a/tests/test5.yaml b/tests/test5.yaml deleted file mode 100644 index f7a34d5a1b..0000000000 --- a/tests/test5.yaml +++ /dev/null @@ -1,747 +0,0 @@ ---- -esphome: - name: test5 - build_path: build/test5 - project: - name: esphome.test5_project - version: "1.0.0" - -esp32: - board: nodemcu-32s - framework: - type: esp-idf - advanced: - ignore_efuse_mac_crc: true - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - manual_ip: - static_ip: 192.168.1.23 - gateway: 192.168.1.1 - subnet: 255.255.255.0 - -network: - enable_ipv6: true - -api: - -ota: - - platform: esphome - -logger: - -debug: - -psram: - -uart: - - id: uart_1 - tx_pin: 1 - rx_pin: 3 - baud_rate: 9600 - - id: uart_2 - tx_pin: - allow_other_uses: true - number: 17 - inverted: true - rx_pin: - allow_other_uses: true - number: 16 - baud_rate: 19200 - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - number: 22 - frequency: 100khz - -modbus: - uart_id: uart_1 - flow_control_pin: - allow_other_uses: true - number: 5 - id: mod_bus1 - -modbus_controller: - - id: modbus_controller_test - address: 0x2 - modbus_id: mod_bus1 - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant - idf_send_async: false - log_topic: - on_message: - topic: testing/sensor/testing_sensor/state - qos: 0 - then: - # yamllint disable rule:line-length - - lambda: |- - ESP_LOGD("Mqtt Test", "testing/sensor/testing_sensor/state=[%s]", x.c_str()); - # yamllint enable rule:line-length - -vbus: - - uart_id: uart_2 - -binary_sensor: - - platform: gpio - pin: GPIO0 - id: io0_button - icon: mdi:gesture-tap-button - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_binsensortest - register_type: read - address: 0x3200 - bitmask: 0x80 # (bit 8) - lambda: "return x;" - - - platform: tm1638 - id: Button0 - key: 0 - filters: - - delayed_on: 10ms - on_press: - then: - - switch.turn_on: Led0 - on_release: - then: - - switch.turn_off: Led0 - - - platform: tm1638 - id: Button1 - key: 1 - on_press: - then: - - switch.turn_on: Led1 - on_release: - then: - - switch.turn_off: Led1 - - - platform: tm1638 - id: Button2 - key: 2 - on_press: - then: - - switch.turn_on: Led2 - on_release: - then: - - switch.turn_off: Led2 - - - platform: tm1638 - id: Button3 - key: 3 - on_press: - then: - - switch.turn_on: Led3 - on_release: - then: - - switch.turn_off: Led3 - - - platform: tm1638 - id: Button4 - key: 4 - on_press: - then: - - output.turn_on: Led4 - on_release: - then: - - output.turn_off: Led4 - - - platform: tm1638 - id: Button5 - key: 5 - on_press: - then: - - output.turn_on: Led5 - on_release: - then: - - output.turn_off: Led5 - - - platform: tm1638 - id: Button6 - key: 6 - on_press: - then: - - output.turn_on: Led6 - on_release: - then: - - output.turn_off: Led6 - - - platform: tm1638 - id: Button7 - key: 7 - on_press: - then: - - output.turn_on: Led7 - on_release: - then: - - output.turn_off: Led7 - - - platform: gpio - id: sn74hc165_pin_0 - pin: - sn74hc165: sn74hc165_hub - number: 0 - - - platform: ezo_pmp - pump_state: - name: "Pump State" - is_paused: - name: "Is Paused" - - - platform: matrix_keypad - keypad_id: keypad - id: key4 - row: 1 - col: 1 - - platform: matrix_keypad - id: key1 - key: 1 - - - platform: vbus - model: deltasol_bs_plus - relay2: - name: Relay 2 On - sensor1_error: - name: Sensor 1 Error - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - binary_sensors: - - id: vcustom_b - name: VBus Custom Binary Sensor - lambda: return x[0] & 1; - -tlc5947: - data_pin: - number: GPIO12 - allow_other_uses: true - clock_pin: - allow_other_uses: true - number: GPIO14 - lat_pin: - allow_other_uses: true - number: GPIO15 - -gp8403: - - id: gp8403_5v - voltage: 5V - - id: gp8403_10v - voltage: 10V - -output: - - platform: gpio - pin: GPIO2 - id: built_in_led - - - platform: tlc5947 - id: output_red - channel: 0 - max_power: 0.8 - - - platform: mcp47a1 - id: output_mcp47a1 - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_output_test - lambda: |- - return x * 1.0 ; - address: 0x9001 - value_type: U_WORD - - - platform: tm1638 - id: Led4 - led: 4 - - - platform: tm1638 - id: Led5 - led: 5 - - - platform: tm1638 - id: Led6 - led: 6 - - - platform: tm1638 - id: Led7 - led: 7 - - - platform: gp8403 - id: gp8403_output_0 - gp8403_id: gp8403_5v - channel: 0 - - platform: gp8403 - gp8403_id: gp8403_10v - id: gp8403_output_1 - channel: 1 - -demo: - -esp32_ble: - -esp32_ble_server: - manufacturer: ESPHome - model: Test5 - -esp32_improv: - authorizer: io0_button - authorized_duration: 1min - status_indicator: built_in_led - -ezo_pmp: - id: hcl_pump - update_interval: 1s - -number: - - platform: template - name: My template number - id: template_number_id - optimistic: true - max_value: 100 - min_value: 0 - step: 5 - unit_of_measurement: "%" - mode: slider - device_class: humidity - on_value: - - logger.log: - format: Number changed to %f - args: [x] - set_action: - - logger.log: - format: Template Number set to %f - args: [x] - - number.set: - id: template_number_id - value: 50 - - number.to_min: template_number_id - - number.to_min: - id: template_number_id - - number.to_max: template_number_id - - number.to_max: - id: template_number_id - - number.increment: template_number_id - - number.increment: - id: template_number_id - cycle: false - - number.decrement: template_number_id - - number.decrement: - id: template_number_id - cycle: false - - number.operation: - id: template_number_id - operation: Increment - cycle: false - - number.operation: - id: template_number_id - operation: !lambda "return NUMBER_OP_INCREMENT;" - cycle: !lambda "return false;" - - - id: modbus_numbertest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - name: ModbusNumber - address: 0x9002 - value_type: U_WORD - lambda: "return x * 1.0;" - write_lambda: |- - return x * 1.0 ; - multiply: 1.0 - -select: - - platform: template - name: My template select - id: template_select_id - optimistic: true - initial_option: two - restore_value: true - on_value: - - logger.log: - format: Select changed to %s (index %d)" - args: ["x.c_str()", "i"] - set_action: - - logger.log: - format: Template Select set to %s - args: ["x.c_str()"] - - select.set: - id: template_select_id - option: two - - select.first: template_select_id - - select.last: - id: template_select_id - - select.previous: template_select_id - - select.next: - id: template_select_id - cycle: false - - select.operation: - id: template_select_id - operation: Previous - cycle: false - - select.operation: - id: template_select_id - operation: !lambda "return SELECT_OP_PREVIOUS;" - cycle: !lambda "return true;" - - select.set_index: - id: template_select_id - index: 1 - - select.set_index: - id: template_select_id - index: !lambda "return 1 + 1;" - options: - - one - - two - - three - - - platform: modbus_controller - name: Modbus Select Register 1000 - address: 1000 - value_type: U_WORD - optionsmap: - "Zero": 0 - "One": 1 - "Two": 2 - "Three": 3 - -sensor: - - platform: adc - id: adc_sensor_p32 - name: ADC pin 32 - pin: 32 - attenuation: 11db - update_interval: 1s - - platform: internal_temperature - name: Internal Temperature - state_topic: - - platform: selec_meter - total_active_energy: - name: SelecEM2M Total Active Energy - import_active_energy: - name: SelecEM2M Import Active Energy - export_active_energy: - name: SelecEM2M Export Active Energy - total_reactive_energy: - name: SelecEM2M Total Reactive Energy - import_reactive_energy: - name: SelecEM2M Import Reactive Energy - export_reactive_energy: - name: SelecEM2M Export Reactive Energy - apparent_energy: - name: SelecEM2M Apparent Energy - active_power: - name: SelecEM2M Active Power - reactive_power: - name: SelecEM2M Reactive Power - apparent_power: - name: SelecEM2M Apparent Power - voltage: - name: SelecEM2M Voltage - current: - name: SelecEM2M Current - power_factor: - name: SelecEM2M Power Factor - frequency: - name: SelecEM2M Frequency - maximum_demand_active_power: - name: SelecEM2M Maximum Demand Active Power - disabled_by_default: true - maximum_demand_reactive_power: - name: SelecEM2M Maximum Demand Reactive Power - disabled_by_default: true - maximum_demand_apparent_power: - name: SelecEM2M Maximum Demand Apparent Power - disabled_by_default: true - - - id: modbus_sensortest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - address: 0x331A - register_type: read - value_type: U_WORD - - - platform: t6615 - uart_id: uart_2 - co2: - name: CO2 Sensor - - - platform: ms8607 - temperature: - name: Temperature - humidity: - name: Humidity - pressure: - name: Pressure - - platform: ms8607 - id: ms8607_more_config - temperature: - name: Indoor Temperature - accuracy_decimals: 1 - pressure: - name: Indoor Pressure - internal: true - humidity: - name: Indoor Humidity - address: 0x41 - i2c_id: - i2c_id: - address: 0x77 - update_interval: 10min - - - platform: sen5x - id: sen54 - temperature: - name: Temperature - accuracy_decimals: 1 - humidity: - name: Humidity - accuracy_decimals: 0 - pm_1_0: - name: PM <1µm Weight concentration - id: pm_1_0 - accuracy_decimals: 1 - pm_2_5: - name: PM <2.5µm Weight concentration - id: pm_2_5 - accuracy_decimals: 1 - pm_4_0: - name: PM <4µm Weight concentration - id: pm_4_0 - accuracy_decimals: 1 - pm_10_0: - name: PM <10µm Weight concentration - id: pm_10_0 - accuracy_decimals: 1 - nox: - name: NOx - voc: - name: VOC - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - temperature_compensation: - offset: 0 - normalized_offset_slope: 0 - time_constant: 0 - auto_cleaning_interval: 604800s - acceleration_mode: low - store_baseline: true - address: 0x69 - - platform: mcp9600 - thermocouple_type: K - hot_junction: - name: Thermocouple Temperature - cold_junction: - name: Ambient Temperature - - - platform: ezo_pmp - current_volume_dosed: - name: Current Volume Dosed - total_volume_dosed: - name: Total Volume Dosed - absolute_total_volume_dosed: - name: Absolute Total Volume Dosed - pump_voltage: - name: Pump Voltage - last_volume_requested: - name: Last Volume Requested - max_flow_rate: - name: Max Flow Rate - - - platform: vbus - model: deltasol c - temperature_3: - name: Temperature 3 - operating_hours_1: - name: Operating Hours 1 - heat_quantity: - name: Heat Quantity - time: - name: System Time - - - platform: debug - free: - name: "Heap Free" - block: - name: "Heap Max Block" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - sensors: - - id: vcustom - name: VBus Custom Sensor - lambda: return x[0] / 10.0; - - - platform: kuntze - ph: - name: Kuntze pH - temperature: - name: Kuntze temperature - -script: - - id: automation_test - then: - - repeat: - count: 5 - then: - - logger.log: looping! - - - id: zero_repeat_test - then: - - repeat: - count: !lambda "return 0;" - then: - - logger.log: shouldn't see mee! - -switch: - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_switch_test - register_type: coil - address: 2 - bitmask: 1 - - - platform: tm1638 - id: Led0 - led: 0 - name: TM1638Led0 - - - platform: tm1638 - id: Led1 - led: 1 - name: TM1638Led1 - - - platform: tm1638 - id: Led2 - led: 2 - name: TM1638Led2 - - - platform: tm1638 - id: Led3 - led: 3 - name: TM1638Led3 - -display: - - platform: tm1638 - id: primarydisplay - stb_pin: - allow_other_uses: true - number: 5 # TM1638 STB - clk_pin: 18 # TM1638 CLK - dio_pin: 23 # TM1638 DIO - update_interval: 5s - intensity: 5 - lambda: |- - it.print("81818181"); - -time: - - platform: pcf85063 - - platform: pcf8563 - -text_sensor: - - platform: ezo_pmp - dosing_mode: - name: Dosing Mode - calibration_status: - name: Calibration Status - on_value: - - ezo_pmp.dose_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.dose_volume_over_time: - id: hcl_pump - volume: 10 - duration: 2 - - ezo_pmp.dose_with_constant_flow_rate: - id: hcl_pump - volume_per_minute: 10 - duration: 2 - - ezo_pmp.set_calibration_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.find: hcl_pump - - ezo_pmp.dose_continuously: hcl_pump - - ezo_pmp.clear_total_volume_dosed: hcl_pump - - ezo_pmp.clear_calibration: hcl_pump - - ezo_pmp.pause_dosing: hcl_pump - - ezo_pmp.stop_dosing: hcl_pump - - ezo_pmp.arbitrary_command: - id: hcl_pump - command: D,? - -sn74hc165: - id: sn74hc165_hub - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - load_pin: GPIO27 - clock_inhibit_pin: GPIO26 - sr_count: 4 - -matrix_keypad: - id: keypad - rows: - - pin: - allow_other_uses: true - number: 21 - - pin: 19 - columns: - - pin: - allow_other_uses: true - number: 17 - - pin: - allow_other_uses: true - number: 16 - keys: "1234" - has_pulldowns: true - -key_collector: - - id: reader - source_id: keypad - min_length: 4 - max_length: 4 - -light: - - platform: esp32_rmt_led_strip - id: led_strip - pin: 13 - num_leds: 60 - rmt_channel: 6 - rgb_order: GRB - chipset: ws2812 - - platform: esp32_rmt_led_strip - id: led_strip2 - pin: - allow_other_uses: true - number: 15 - num_leds: 60 - rmt_channel: 2 - rgb_order: RGB - bit0_high: 100us - bit0_low: 100us - bit1_high: 100us - bit1_low: 100us diff --git a/tests/test6.yaml b/tests/test6.yaml deleted file mode 100644 index b1103eb126..0000000000 --- a/tests/test6.yaml +++ /dev/null @@ -1,77 +0,0 @@ ---- -esphome: - name: test6 - project: - name: esphome.test6_project - version: "1.0.0" - -rp2040: - board: rpipicow - framework: - # Waiting for https://github.com/platformio/platform-raspberrypi/pull/36 - platform_version: https://github.com/maxgerhardt/platform-raspberrypi.git - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - -network: - enable_ipv6: true - -api: - -ota: - - platform: esphome - -logger: - -debug: - -binary_sensor: - - platform: gpio - pin: GPIO5 - id: pin_5_button - -output: - - platform: gpio - pin: GPIO4 - id: pin_4 - -switch: - - platform: output - output: pin_4 - id: pin_4_switch - -spi: # Pins are for SPI1 on the RP2040 Pico-W - miso_pin: 8 - clk_pin: 10 - mosi_pin: 11 - id: spi_0 - interface: hardware - -# light: -# - platform: rp2040_pio_led_strip -# id: led_strip -# pin: GPIO13 -# num_leds: 60 -# pio: 0 -# rgb_order: GRB -# chipset: WS2812 -# - platform: rp2040_pio_led_strip -# id: led_strip_custom_timings -# pin: GPIO13 -# num_leds: 60 -# pio: 1 -# rgb_order: GRB -# bit0_high: .1us -# bit0_low: 1.2us -# bit1_high: .69us -# bit1_low: .4us - -sensor: - - platform: internal_temperature - name: Internal Temperature - - platform: adc - pin: VCC - name: VSYS diff --git a/tests/test7.yaml b/tests/test7.yaml deleted file mode 100644 index ac193eae4e..0000000000 --- a/tests/test7.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Tests for ESP32-C3 boards which use toolchain-riscv32-esp ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: lolin_c3_mini - framework: - type: arduino - -esphome: - name: test7 - -logger: - -debug: - -sensor: - - platform: adc - id: adc_sensor_p4 - name: ADC pin 4 - pin: 4 - attenuation: 11db - update_interval: 1s diff --git a/tests/test8.1.yaml b/tests/test8.1.yaml deleted file mode 100644 index ab3d0d44aa..0000000000 --- a/tests/test8.1.yaml +++ /dev/null @@ -1,78 +0,0 @@ -# Tests for ESP32-S3 boards - IDf ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: esp32s3box - variant: ESP32S3 - framework: - type: esp-idf - -esphome: - name: esp32-s3-test - -logger: - -debug: - -psram: - -spi: - - id: spi_id_1 - type: single - clk_pin: - number: GPIO7 - allow_other_uses: false - mosi_pin: GPIO6 - interface: hardware -spi_device: - id: spidev - data_rate: 2MHz - spi_id: spi_id_1 - mode: 3 - bit_order: lsb_first - -display: - - platform: ili9xxx - id: displ8 - model: ili9342 - cs_pin: GPIO5 - dc_pin: GPIO4 - reset_pin: - number: GPIO48 - allow_other_uses: true - -i2c: - scl: GPIO18 - sda: GPIO8 - -touchscreen: - - platform: tt21100 - display: displ8 - interrupt_pin: - number: GPIO3 - ignore_strapping_warning: true - allow_other_uses: false - reset_pin: - number: GPIO48 - allow_other_uses: true - -binary_sensor: - - platform: tt21100 - name: Home Button - index: 1 - -sensor: - - platform: debug - free: - name: "Heap Free" - block: - name: "Max Block Free" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" diff --git a/tests/test8.2.yaml b/tests/test8.2.yaml deleted file mode 100644 index ae892559e5..0000000000 --- a/tests/test8.2.yaml +++ /dev/null @@ -1,75 +0,0 @@ -# Tests for ESP32-C3 boards - IDf ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: lolin_c3_mini - variant: ESP32C3 - framework: - type: esp-idf - -esphome: - name: esp32-c3-test - -logger: - -debug: - -psram: - -spi: - - id: spi_id_1 - clk_pin: - number: GPIO7 - allow_other_uses: false - mosi_pin: GPIO6 - interface: any - -spi_device: - id: spidev - data_rate: 2MHz - spi_id: spi_id_1 - mode: 3 - bit_order: lsb_first - -display: - - platform: ili9xxx - id: displ8 - model: ili9342 - cs_pin: GPIO5 - dc_pin: GPIO4 - reset_pin: - number: GPIO21 - -i2c: - scl: GPIO18 - sda: GPIO8 - -touchscreen: - - platform: tt21100 - display: displ8 - interrupt_pin: - number: GPIO3 - allow_other_uses: false - reset_pin: - number: GPIO20 - -binary_sensor: - - platform: tt21100 - name: Home Button - index: 1 - -sensor: - - platform: debug - free: - name: "Heap Free" - block: - name: "Max Block Free" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" diff --git a/tests/test8.yaml b/tests/test8.yaml deleted file mode 100644 index fcc93c6154..0000000000 --- a/tests/test8.yaml +++ /dev/null @@ -1,125 +0,0 @@ -# Tests for ESP32-S3 boards ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: esp32s3box - variant: ESP32S3 - framework: - type: arduino - -esphome: - name: esp32-s3-test - -logger: - -debug: - -psram: - -light: - - platform: neopixelbus - type: GRB - variant: WS2812 - pin: GPIO38 - num_leds: 1 - id: neopixel - method: esp32_rmt - name: neopixel-enable - internal: false - restore_mode: ALWAYS_OFF - - platform: spi_led_strip - num_leds: 4 - color_correct: [80%, 60%, 100%] - id: rgb_led - name: "RGB LED" - data_rate: 8MHz - - platform: binary - name: "Red Info Light" - output: board_info_ed - entity_category: diagnostic - restore_mode: ALWAYS_OFF - -spi: - id: spi_id_1 - clk_pin: GPIO7 - mosi_pin: GPIO6 - interface: any - -spi_device: - id: spidev - data_rate: 2MHz - spi_id: spi_id_1 - mode: 3 - bit_order: lsb_first - -font: - - file: "gfonts://Roboto" - id: roboto - size: 20 - -display: - - platform: ili9xxx - id: displ8 - model: ili9342 - cs_pin: GPIO5 - dc_pin: GPIO4 - reset_pin: - number: GPIO48 - allow_other_uses: true - lambda: |- - it.printf(10, 100, id(roboto), Color(0x123456), COLOR_OFF, display::TextAlign::BASELINE, "%f", id(heap_free).state); - -i2c: - scl: GPIO18 - sda: GPIO8 - -output: - - platform: gpio - id: board_info_ed - pin: - # This pin is reserved on the ESP32S3! - number: 26 - ignore_pin_validation_error: true - -touchscreen: - - platform: tt21100 - display: displ8 - interrupt_pin: - number: GPIO3 - ignore_strapping_warning: true - allow_other_uses: false - reset_pin: - number: GPIO48 - allow_other_uses: true - -binary_sensor: - - platform: tt21100 - name: Home Button - index: 1 - -sensor: - - platform: debug - free: - id: heap_free - name: "Heap Free" - block: - name: "Max Block Free" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - -# Purposely test that `animation:` does auto-load `image:` -# Keep the `image:` undefined. -# image: - -animation: - - id: rgb565_animation - file: pnglogo.png - type: RGB565 - use_transparency: false diff --git a/tests/test9.1.yaml b/tests/test9.1.yaml deleted file mode 100644 index 2d205ef4e6..0000000000 --- a/tests/test9.1.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# Tests for rtl87xx boards using LibreTiny ---- -wifi: - ssid: "ssid" - -rtl87xx: - board: generic-rtl8710bn-2mb-788k - -esphome: - name: rtl87xx-test - -logger: - -ota: - - platform: esphome - -captive_portal: - -binary_sensor: - - platform: gpio - name: Home Button - pin: GPIO11 - -sensor: - - platform: adc - id: adc_sensor - name: ADC - pin: PA19 - update_interval: 1s diff --git a/tests/test9.yaml b/tests/test9.yaml deleted file mode 100644 index 5017ccc5ed..0000000000 --- a/tests/test9.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Tests for bk7xx boards using LibreTiny ---- -wifi: - ssid: "ssid" - -bk72xx: - board: cb2s - -esphome: - name: bk72xx-test - -logger: - -ota: - - platform: esphome - -captive_portal: - -binary_sensor: - - platform: gpio - name: Home Button - pin: GPIO24 - -sensor: - - platform: adc - id: adc_sensor - name: ADC - pin: GPIO23 - update_interval: 1s - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant From dc4a93f5d0ec268bc1a0de28ac2f9d4c7b96aa6d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:15:02 +1200 Subject: [PATCH 148/151] Revert "[CI] Update tests to run against IDF 5.1" (#7003) --- ...f-51.yaml => build_components_base.esp32-c3-idf-50.yaml} | 6 +++--- ...-idf-51.yaml => build_components_base.esp32-idf-50.yaml} | 6 +++--- ...f-51.yaml => build_components_base.esp32-s2-idf-50.yaml} | 6 +++--- ...f-51.yaml => build_components_base.esp32-s3-idf-50.yaml} | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename tests/test_build_components/{build_components_base.esp32-c3-idf-51.yaml => build_components_base.esp32-c3-idf-50.yaml} (76%) rename tests/test_build_components/{build_components_base.esp32-idf-51.yaml => build_components_base.esp32-idf-50.yaml} (77%) rename tests/test_build_components/{build_components_base.esp32-s2-idf-51.yaml => build_components_base.esp32-s2-idf-50.yaml} (78%) rename tests/test_build_components/{build_components_base.esp32-s3-idf-51.yaml => build_components_base.esp32-s3-idf-50.yaml} (77%) diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml similarity index 76% rename from tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml index 73d2c8fa19..08d4d8679c 100644 --- a/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32c3idf51 + name: componenttestesp32c3idf50 friendly_name: $component_name esp32: board: lolin_c3_mini framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-idf-50.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-idf-50.yaml index 6c8eb3c193..c9f2c1e943 100644 --- a/tests/test_build_components/build_components_base.esp32-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-idf-50.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32idf51 + name: componenttestesp32idf50 friendly_name: $component_name esp32: board: nodemcu-32s framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml similarity index 78% rename from tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml index 8894efb6b8..351f5fb019 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2idf51 + name: componenttestesp32s2idf50 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S2 framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml index efeffa5a0f..c05378903f 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3idf51 + name: componenttestesp32s3idf50 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S3 framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE From 0e50cac39930770cb9321a06a03403ff938206fd Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 20:07:07 -0500 Subject: [PATCH 149/151] [ota-esphome] Merge configurations by port (#7001) --- esphome/components/esphome/ota/__init__.py | 65 +++++++++++++++++++--- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index 88e729f230..a852d8d001 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,7 +1,10 @@ +import logging + import esphome.codegen as cg import esphome.config_validation as cv import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent +from esphome.config_helpers import merge_config from esphome.const import ( CONF_ESPHOME, CONF_ID, @@ -16,6 +19,8 @@ from esphome.const import ( ) from esphome.core import coroutine_with_priority +_LOGGER = logging.getLogger(__name__) + CODEOWNERS = ["@esphome/core"] AUTO_LOAD = ["md5", "socket"] @@ -26,16 +31,62 @@ ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) def ota_esphome_final_validate(config): - fconf = fv.full_config.get()[CONF_OTA] - used_ports = [] - for ota_conf in fconf: + full_conf = fv.full_config.get() + full_ota_conf = full_conf[CONF_OTA] + new_ota_conf = [] + merged_ota_esphome_configs_by_port = {} + ports_with_merged_configs = [] + for ota_conf in full_ota_conf: if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: - if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: - used_ports.append(plat_port) + if ( + conf_port := ota_conf.get(CONF_PORT) + ) not in merged_ota_esphome_configs_by_port: + merged_ota_esphome_configs_by_port[conf_port] = ota_conf else: - raise cv.Invalid( - f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + if merged_ota_esphome_configs_by_port[conf_port][ + CONF_VERSION + ] != ota_conf.get(CONF_VERSION): + raise cv.Invalid( + f"Found multiple configurations but {CONF_VERSION} is inconsistent" + ) + if ( + merged_ota_esphome_configs_by_port[conf_port][CONF_ID].is_manual + and ota_conf.get(CONF_ID).is_manual + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_ID} is inconsistent" + ) + if ( + CONF_PASSWORD in merged_ota_esphome_configs_by_port[conf_port] + and CONF_PASSWORD in ota_conf + and merged_ota_esphome_configs_by_port[conf_port][CONF_PASSWORD] + != ota_conf.get(CONF_PASSWORD) + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_PASSWORD} is inconsistent" + ) + + ports_with_merged_configs.append(conf_port) + merged_ota_esphome_configs_by_port[conf_port] = merge_config( + merged_ota_esphome_configs_by_port[conf_port], ota_conf ) + else: + new_ota_conf.append(ota_conf) + + for port_conf in merged_ota_esphome_configs_by_port.values(): + new_ota_conf.append(port_conf) + + full_conf[CONF_OTA] = new_ota_conf + fv.full_config.set(full_conf) + + if len(ports_with_merged_configs) > 0: + _LOGGER.warning( + "Found and merged multiple configurations for %s %s %s port(s) %s", + CONF_OTA, + CONF_PLATFORM, + CONF_ESPHOME, + ports_with_merged_configs, + ) CONFIG_SCHEMA = ( From 3a48b1075700bbc1e7a46b9bfda062b1a4400f2d Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Thu, 27 Jun 2024 03:48:01 +0200 Subject: [PATCH 150/151] Fix LEDC 100% is not 100% duty with ESP32 IDF (#6997) --- esphome/components/ledc/ledc_output.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/esphome/components/ledc/ledc_output.cpp b/esphome/components/ledc/ledc_output.cpp index 1040ac25b6..90e11fe4ad 100644 --- a/esphome/components/ledc/ledc_output.cpp +++ b/esphome/components/ledc/ledc_output.cpp @@ -115,12 +115,15 @@ void LEDCOutput::write_state(float state) { const uint32_t max_duty = (uint32_t(1) << this->bit_depth_) - 1; const float duty_rounded = roundf(state * max_duty); auto duty = static_cast(duty_rounded); - #ifdef USE_ARDUINO ESP_LOGV(TAG, "Setting duty: %u on channel %u", duty, this->channel_); ledcWrite(this->channel_, duty); #endif #ifdef USE_ESP_IDF + // ensure that 100% on is not 99.975% on + if ((duty == max_duty) && (max_duty != 1)) { + duty = max_duty + 1; + } auto speed_mode = get_speed_mode(channel_); auto chan_num = static_cast(channel_ % 8); int hpoint = ledc_angle_to_htop(this->phase_angle_, this->bit_depth_); From 7904d3b157280387295d57e1dc9f60b253836b56 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:19:13 +1200 Subject: [PATCH 151/151] Bump version to 2024.6.4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 2434609191..b26d8d2851 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.3" +__version__ = "2024.6.4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = (