From 9e53da83cd55452271b18ca7e7f5405143f8a4af Mon Sep 17 00:00:00 2001 From: WanqQixiang Date: Thu, 21 Sep 2023 11:54:06 +0800 Subject: [PATCH] esp_matter: add icd management cluster support Add thread sleepy example connectedhomeip: update submodule to support ICD Update idf version to commit 6b1f40b9bf on release/v5.1 branch --- .gitlab-ci.yml | 6 +- README.md | 4 +- .../esp_matter/esp_matter_attribute.cpp | 66 +++++ components/esp_matter/esp_matter_attribute.h | 11 + components/esp_matter/esp_matter_cluster.cpp | 42 ++++ components/esp_matter/esp_matter_cluster.h | 12 + components/esp_matter/esp_matter_command.cpp | 68 +++++ components/esp_matter/esp_matter_command.h | 9 + components/esp_matter/esp_matter_core.cpp | 20 +- components/esp_matter/esp_matter_endpoint.cpp | 6 +- components/esp_matter/esp_matter_endpoint.h | 1 + components/esp_matter/esp_matter_feature.cpp | 54 +++- components/esp_matter/esp_matter_feature.h | 21 +- .../app/PluginApplicationCallbacks.h | 26 +- .../zap_common/app/callback-stub.cpp | 238 ++++++++++++++++-- .../zap_common/zap-generated/CHIPClusters.h | 198 ++++++++++++++- .../zap_common/zap-generated/access.h | 36 ++- .../zap_common/zap-generated/gen_config.h | 1 + .../logger/zap-generated/DataModelLogger.cpp | 67 ++++- .../logger/zap-generated/DataModelLogger.h | 2 + connectedhomeip/connectedhomeip | 2 +- docs/en/developing.rst | 2 +- examples/.build-rules.yml | 6 + examples/sleepy_device/CMakeLists.txt | 40 +++ examples/sleepy_device/README.md | 39 +++ examples/sleepy_device/image/power_record.png | Bin 0 -> 132111 bytes examples/sleepy_device/main/CMakeLists.txt | 5 + examples/sleepy_device/main/app_main.cpp | 168 +++++++++++++ examples/sleepy_device/main/app_priv.h | 33 +++ examples/sleepy_device/main/idf_component.yml | 6 + examples/sleepy_device/partitions.csv | 10 + examples/sleepy_device/sdkconfig.defaults | 42 ++++ .../sleepy_device/sdkconfig.defaults.esp32h2 | 93 +++++++ examples/zap_light/CMakeLists.txt | 2 +- 34 files changed, 1270 insertions(+), 66 deletions(-) create mode 100644 examples/sleepy_device/CMakeLists.txt create mode 100644 examples/sleepy_device/README.md create mode 100644 examples/sleepy_device/image/power_record.png create mode 100644 examples/sleepy_device/main/CMakeLists.txt create mode 100644 examples/sleepy_device/main/app_main.cpp create mode 100644 examples/sleepy_device/main/app_priv.h create mode 100644 examples/sleepy_device/main/idf_component.yml create mode 100644 examples/sleepy_device/partitions.csv create mode 100644 examples/sleepy_device/sdkconfig.defaults create mode 100644 examples/sleepy_device/sdkconfig.defaults.esp32h2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f14b8879..9d877f53f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -164,7 +164,7 @@ build_esp_matter_examples_pytest_C6_idf_v5_1: when: always expire_in: 4 days variables: - IDF_VERSION: "v5.1.1" + IDF_VERSION: "6b1f40b9bfb91ec82fab4a60e5bfb4ca0c9b062f" script: - cd ${ESP_MATTER_PATH} - pip install -r tools/ci/requirements-build.txt @@ -197,7 +197,7 @@ build_esp_matter_examples_pytest_H2_idf_v5_1: when: always expire_in: 4 days variables: - IDF_VERSION: "v5.1.1" + IDF_VERSION: "6b1f40b9bfb91ec82fab4a60e5bfb4ca0c9b062f" script: - *setup_ot_rcp - *setup_ot_br @@ -221,7 +221,7 @@ build_esp_matter_examples_non_pytest_idf_v5_1: when: always expire_in: 4 days variables: - IDF_VERSION: "v5.1.1" + IDF_VERSION: "6b1f40b9bfb91ec82fab4a60e5bfb4ca0c9b062f" script: - *build_external_platform_example diff --git a/README.md b/README.md index 195e52db4..dcd61d643 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Espressif's SDK for Matter is the official Matter development framework for ESP3 ## Supported ESP-IDF and connectedhomeip versions -- This SDK currently works with [5b4f800](https://github.com/project-chip/connectedhomeip/commit/5b4f8004662d00bdb111367fec7d3ea978c23372) of connectedhomeip. -- For Matter projects development with this SDK, it is recommended to utilize ESP-IDF [v5.1.1 release](https://github.com/espressif/esp-idf/releases/tag/v5.1.1). +- This SDK currently works with [699ff65e](https://github.com/project-chip/connectedhomeip/commit/699ff65e065a28e4b7ee3a2d84110444b1709040) of connectedhomeip. +- For Matter projects development with this SDK, it is recommended to utilize ESP-IDF [v5.1 commit 6b1f40b9b](https://github.com/espressif/esp-idf/tree/6b1f40b9bfb91ec82fab4a60e5bfb4ca0c9b062f). ## Documentation diff --git a/components/esp_matter/esp_matter_attribute.cpp b/components/esp_matter/esp_matter_attribute.cpp index 1e97b4f76..7d250ec8f 100644 --- a/components/esp_matter/esp_matter_attribute.cpp +++ b/components/esp_matter/esp_matter_attribute.cpp @@ -542,6 +542,72 @@ attribute_t *create_max_group_keys_per_fabric(cluster_t *cluster, uint16_t value } /* attribute */ } /* group_key_management */ +namespace icd_management { +namespace attribute { +attribute_t *create_idle_mode_interval(cluster_t *cluster, uint32_t value, uint32_t min, uint32_t max) +{ + attribute_t *attribute = esp_matter::attribute::create(cluster, IcdManagement::Attributes::IdleModeInterval::Id, + ATTRIBUTE_FLAG_NONE, esp_matter_uint32(value)); + if (!attribute) { + ESP_LOGE(TAG, "Could not create attribute"); + return NULL; + } + esp_matter::attribute::add_bounds(attribute, esp_matter_uint32(min), esp_matter_uint32(max)); + return attribute; +} + +attribute_t *create_active_mode_interval(cluster_t *cluster, uint32_t value, uint32_t min) +{ + attribute_t *attribute = esp_matter::attribute::create(cluster, IcdManagement::Attributes::ActiveModeInterval::Id, + ATTRIBUTE_FLAG_NONE, esp_matter_uint32(value)); + if (!attribute) { + ESP_LOGE(TAG, "Could not create attribute"); + return NULL; + } + esp_matter::attribute::add_bounds(attribute, esp_matter_uint32(min), esp_matter_uint32(UINT32_MAX)); + return attribute; +} + +attribute_t *create_active_mode_threshold(cluster_t *cluster, uint16_t value, uint16_t min) +{ + attribute_t *attribute = esp_matter::attribute::create(cluster, IcdManagement::Attributes::ActiveModeThreshold::Id, + ATTRIBUTE_FLAG_NONE, esp_matter_uint16(value)); + if (!attribute) { + ESP_LOGE(TAG, "Could not create attribute"); + return NULL; + } + esp_matter::attribute::add_bounds(attribute, esp_matter_uint16(min), esp_matter_uint16(UINT16_MAX)); + return attribute; +} + +attribute_t *create_registered_clients(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count) +{ + return esp_matter::attribute::create(cluster, IcdManagement::Attributes::RegisteredClients::Id, ATTRIBUTE_FLAG_NONVOLATILE, + esp_matter_array(value,length, count)); +} + +attribute_t *create_icd_counter(cluster_t *cluster,uint32_t value) +{ + return esp_matter::attribute::create(cluster, IcdManagement::Attributes::ICDCounter::Id, ATTRIBUTE_FLAG_NONVOLATILE, + esp_matter_uint32(value)); +} + +attribute_t *create_clients_supported_per_fabric(cluster_t *cluster, uint16_t value, uint16_t min) +{ + attribute_t *attribute = esp_matter::attribute::create(cluster, IcdManagement::Attributes::ClientsSupportedPerFabric::Id, + ATTRIBUTE_FLAG_NONE, esp_matter_uint16(value)); + if (!attribute) { + ESP_LOGE(TAG, "Could not create attribute"); + return NULL; + } + esp_matter::attribute::add_bounds(attribute, esp_matter_uint16(min), esp_matter_uint16(UINT16_MAX)); + return attribute; + +} + +} /* attribute */ +} /* icd_management */ + namespace diagnostics_network_wifi { namespace attribute { diff --git a/components/esp_matter/esp_matter_attribute.h b/components/esp_matter/esp_matter_attribute.h index a0583466c..b805315e1 100644 --- a/components/esp_matter/esp_matter_attribute.h +++ b/components/esp_matter/esp_matter_attribute.h @@ -173,6 +173,17 @@ attribute_t *create_max_group_keys_per_fabric(cluster_t *cluster, uint16_t value } /* attribute */ } /* group_key_management */ +namespace icd_management { +namespace attribute { +attribute_t *create_idle_mode_interval(cluster_t *cluster, uint32_t value, uint32_t min, uint32_t max); +attribute_t *create_active_mode_interval(cluster_t *cluster, uint32_t value, uint32_t min); +attribute_t *create_active_mode_threshold(cluster_t *cluster, uint16_t value, uint16_t min); +attribute_t *create_registered_clients(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count); +attribute_t *create_icd_counter(cluster_t *cluster,uint32_t value); +attribute_t *create_clients_supported_per_fabric(cluster_t *cluster, uint16_t value, uint16_t min); +} /* attribute */ +} /* icd_management */ + namespace diagnostics_network_wifi { namespace attribute { attribute_t *create_bssid(cluster_t *cluster, uint8_t *value, uint16_t length); diff --git a/components/esp_matter/esp_matter_cluster.cpp b/components/esp_matter/esp_matter_cluster.cpp index 10d08a9b5..f85a3e085 100644 --- a/components/esp_matter/esp_matter_cluster.cpp +++ b/components/esp_matter/esp_matter_cluster.cpp @@ -886,6 +886,48 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_ } } /* power_source */ +namespace icd_management { +const function_generic_t *function_list = NULL; +const int function_flags = CLUSTER_FLAG_NONE; + +cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features) +{ + cluster_t *cluster = cluster::create(endpoint, IcdManagement::Id, flags); + if (!cluster) { + ESP_LOGE(TAG, "Could not create cluster"); + return NULL; + } +#if CONFIG_ENABLE_ICD_SERVER + if (flags & CLUSTER_FLAG_SERVER) { + set_plugin_server_init_callback(cluster, MatterIcdManagementPluginServerInitCallback); + add_function_list(cluster, function_list, function_flags); + } + + if (flags & CLUSTER_FLAG_SERVER) { + /* Attributes managed internally */ + global::attribute::create_feature_map(cluster, 0); + + /* Attributes not managed internally */ + if (config) { + global::attribute::create_cluster_revision(cluster, config->cluster_revision); + attribute::create_idle_mode_interval(cluster, config->idle_mode_interval, 500, 64800000); + attribute::create_active_mode_interval(cluster, config->active_mode_interval, 300); + attribute::create_active_mode_threshold(cluster, config->active_mode_threshold, 300); + } else { + ESP_LOGE(TAG, "Config is NULL. Cannot add some attributes."); + } + } + + if (features & feature::check_in_protocol_support::get_id()) { + feature::check_in_protocol_support::config_t cip_config; + feature::check_in_protocol_support::add(cluster, &cip_config); + } +#endif // CONFIG_ENABLE_ICD_SERVER + return cluster; +} + +} /* icd_management */ + namespace user_label { const function_generic_t *function_list = NULL; const int function_flags = CLUSTER_FLAG_NONE; diff --git a/components/esp_matter/esp_matter_cluster.h b/components/esp_matter/esp_matter_cluster.h index bdaec9954..193a612cb 100644 --- a/components/esp_matter/esp_matter_cluster.h +++ b/components/esp_matter/esp_matter_cluster.h @@ -233,6 +233,18 @@ typedef struct config { cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features); } /* power_source */ +namespace icd_management { +typedef struct config { + uint16_t cluster_revision; + uint32_t idle_mode_interval; + uint32_t active_mode_interval; + uint16_t active_mode_threshold; + config() : cluster_revision(1), idle_mode_interval(5000), active_mode_interval(300), active_mode_threshold(300) {} +} config_t; + +cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features); +} /* icd_management */ + namespace user_label { typedef struct config { uint16_t cluster_revision; diff --git a/components/esp_matter/esp_matter_command.cpp b/components/esp_matter/esp_matter_command.cpp index 5383fadc3..ed87d2170 100644 --- a/components/esp_matter/esp_matter_command.cpp +++ b/components/esp_matter/esp_matter_command.cpp @@ -426,6 +426,45 @@ static esp_err_t esp_matter_command_callback_add_group_if_identifying(const Conc return ESP_OK; } +static esp_err_t esp_matter_command_callback_register_client(const ConcreteCommandPath &command_path, + TLVReader &tlv_data, void *opaque_ptr) +{ + chip::app::Clusters::IcdManagement::Commands::RegisterClient::DecodableType command_data; + CHIP_ERROR error = Decode(tlv_data, command_data); + if (error == CHIP_NO_ERROR) { +#if CONFIG_ENABLE_ICD_SERVER + emberAfIcdManagementClusterRegisterClientCallback((CommandHandler *)opaque_ptr, command_path, command_data); +#endif + } + return ESP_OK; +} + +static esp_err_t esp_matter_command_callback_unregister_client(const ConcreteCommandPath &command_path, + TLVReader &tlv_data, void *opaque_ptr) +{ + chip::app::Clusters::IcdManagement::Commands::UnregisterClient::DecodableType command_data; + CHIP_ERROR error = Decode(tlv_data, command_data); + if (error == CHIP_NO_ERROR) { +#if CONFIG_ENABLE_ICD_SERVER + emberAfIcdManagementClusterUnregisterClientCallback((CommandHandler *)opaque_ptr, command_path, command_data); +#endif + } + return ESP_OK; +} + +static esp_err_t esp_matter_command_callback_stay_active_request(const ConcreteCommandPath &command_path, + TLVReader &tlv_data, void *opaque_ptr) +{ + chip::app::Clusters::IcdManagement::Commands::StayActiveRequest::DecodableType command_data; + CHIP_ERROR error = Decode(tlv_data, command_data); + if (error == CHIP_NO_ERROR) { +#if CONFIG_ENABLE_ICD_SERVER + emberAfIcdManagementClusterStayActiveRequestCallback((CommandHandler *)opaque_ptr, command_path, command_data); +#endif + } + return ESP_OK; +} + static esp_err_t esp_matter_command_callback_off(const ConcreteCommandPath &command_path, TLVReader &tlv_data, void *opaque_ptr) { @@ -1682,6 +1721,35 @@ command_t *create_remove_group_response(cluster_t *cluster) } /* command */ } /* groups */ +namespace icd_management { +namespace command { +command_t *create_register_client(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, IcdManagement::Commands::RegisterClient::Id, COMMAND_FLAG_ACCEPTED, + esp_matter_command_callback_register_client); +} + +command_t *create_register_client_response(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, IcdManagement::Commands::RegisterClientResponse::Id, + COMMAND_FLAG_GENERATED, NULL); +} + +command_t *create_unregister_client(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, IcdManagement::Commands::UnregisterClient::Id, COMMAND_FLAG_ACCEPTED, + esp_matter_command_callback_unregister_client); +} + +command_t *create_stay_active_request(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, IcdManagement::Commands::StayActiveRequest::Id, COMMAND_FLAG_ACCEPTED, + esp_matter_command_callback_stay_active_request); +} + +} /* command */ +} /* icd_management */ + namespace scenes { namespace command { diff --git a/components/esp_matter/esp_matter_command.h b/components/esp_matter/esp_matter_command.h index 2f41def00..bba44c3c2 100644 --- a/components/esp_matter/esp_matter_command.h +++ b/components/esp_matter/esp_matter_command.h @@ -172,6 +172,15 @@ command_t *create_remove_group_response(cluster_t *cluster); } /* command */ } /* groups */ +namespace icd_management { +namespace command { +command_t *create_register_client(cluster_t *cluster); +command_t *create_register_client_response(cluster_t *cluster); +command_t *create_unregister_client(cluster_t *cluster); +command_t *create_stay_active_request(cluster_t *cluster); +} /* command */ +} /* icd_management */ + namespace scenes { namespace command { command_t *create_add_scene(cluster_t *cluster); diff --git a/components/esp_matter/esp_matter_core.cpp b/components/esp_matter/esp_matter_core.cpp index 43e6ced45..d3b431ddd 100644 --- a/components/esp_matter/esp_matter_core.cpp +++ b/components/esp_matter/esp_matter_core.cpp @@ -981,12 +981,28 @@ static esp_err_t chip_init(event_callback_t callback, intptr_t callback_arg) ESP_LOGE(TAG, "Failed to initialize Thread stack"); return ESP_FAIL; } +#if CHIP_CONFIG_ENABLE_ICD_SERVER + if (ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice) != CHIP_NO_ERROR) { + ESP_LOGE(TAG, "Failed to set the Thread device type"); + return ESP_FAIL; + } +#elif CHIP_DEVICE_CONFIG_THREAD_FTD + if (ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_Router) != CHIP_NO_ERROR) { + ESP_LOGE(TAG, "Failed to set the Thread device type"); + return ESP_FAIL; + } +#else + if (ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice) != CHIP_NO_ERROR) { + ESP_LOGE(TAG, "Failed to set the Thread device type"); + return ESP_FAIL; + } +#endif if (ThreadStackMgr().StartThreadTask() != CHIP_NO_ERROR) { ESP_LOGE(TAG, "Failed to launch Thread task"); return ESP_FAIL; } -#endif +#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD PlatformMgr().ScheduleWork(esp_matter_chip_init_task, reinterpret_cast(xTaskGetCurrentTaskHandle())); // Wait for the matter stack to be initialized @@ -1042,6 +1058,8 @@ esp_err_t factory_reset() if (err == ESP_OK) { nvs_erase_all(node_handle); } + nvs_commit(node_handle); + nvs_close(node_handle); nvs_close(node_handle); nvs_commit(node_handle); diff --git a/components/esp_matter/esp_matter_endpoint.cpp b/components/esp_matter/esp_matter_endpoint.cpp index b7078066b..908fcaac0 100644 --- a/components/esp_matter/esp_matter_endpoint.cpp +++ b/components/esp_matter/esp_matter_endpoint.cpp @@ -63,6 +63,10 @@ endpoint_t *add(endpoint_t *endpoint, config_t *config) #if CHIP_DEVICE_CONFIG_ENABLE_THREAD diagnostics_network_thread::create(endpoint, &(config->diagnostics_network_thread), CLUSTER_FLAG_SERVER); #endif +#if CHIP_CONFIG_ENABLE_ICD_SERVER + icd_management::create(endpoint, &(config->icd_management), CLUSTER_FLAG_SERVER, + icd_management::feature::check_in_protocol_support::get_id()); +#endif return endpoint; } @@ -1039,7 +1043,7 @@ endpoint_t *add(endpoint_t *endpoint, config_t *config) descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER); identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER); - on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::dead_front::get_id()); + on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::dead_front_behavior::get_id()); cluster::thermostat::create(endpoint, &(config->thermostat), CLUSTER_FLAG_SERVER, cluster::thermostat::feature::cooling::get_id() | cluster::thermostat::feature::heating::get_id()); diff --git a/components/esp_matter/esp_matter_endpoint.h b/components/esp_matter/esp_matter_endpoint.h index 1e25a6231..943bcd146 100644 --- a/components/esp_matter/esp_matter_endpoint.h +++ b/components/esp_matter/esp_matter_endpoint.h @@ -109,6 +109,7 @@ typedef struct config { cluster::operational_credentials::config_t operational_credentials; cluster::diagnostics_network_wifi::config_t diagnostics_network_wifi; cluster::diagnostics_network_thread::config_t diagnostics_network_thread; + cluster::icd_management::config_t icd_management; } config_t; uint32_t get_device_type_id(); diff --git a/components/esp_matter/esp_matter_feature.cpp b/components/esp_matter/esp_matter_feature.cpp index bf8c1df75..95055d959 100644 --- a/components/esp_matter/esp_matter_feature.cpp +++ b/components/esp_matter/esp_matter_feature.cpp @@ -215,7 +215,7 @@ esp_err_t add(cluster_t *cluster) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); - + return ESP_OK; } @@ -229,13 +229,13 @@ uint32_t get_id() } esp_err_t add(cluster_t *cluster) -{ +{ if (!cluster) { ESP_LOGE(TAG, "Cluster cannot be NULL"); return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); - + return ESP_OK; } @@ -244,18 +244,18 @@ esp_err_t add(cluster_t *cluster) namespace fabric_scenes { uint32_t get_id() -{ +{ return (uint32_t)Scenes::Feature::kFabricScenes; } esp_err_t add(cluster_t *cluster) -{ +{ if (!cluster) { ESP_LOGE(TAG, "Cluster cannot be NULL"); return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); - + return ESP_OK; } @@ -264,6 +264,42 @@ esp_err_t add(cluster_t *cluster) } /* feature */ } /* scenes */ +namespace icd_management { +namespace feature { +namespace check_in_protocol_support { + +uint32_t get_id() +{ + return (uint32_t)IcdManagement::Feature::kCheckInProtocolSupport; +} + +esp_err_t add(cluster_t *cluster, config_t *config) +{ + if (!cluster) { + ESP_LOGE(TAG, "Cluster cannot be NULL"); + return ESP_ERR_INVALID_ARG; + } + update_feature_map(cluster, get_id()); + + /* Attributes managed internally */ + attribute::create_registered_clients(cluster, NULL, 0, 0); + attribute::create_icd_counter(cluster, 0); + + /* Attribute not managed internally*/ + attribute::create_clients_supported_per_fabric(cluster, config->clients_supported_per_fabric, 1); + + /* Commands */ + command::create_register_client(cluster); + command::create_register_client_response(cluster); + command::create_unregister_client(cluster); + + return ESP_OK; +} + +} /* check_in_protocol_support */ +} /* feature */ +} /* icd_management */ + namespace on_off { namespace feature { namespace lighting { @@ -297,11 +333,11 @@ esp_err_t add(cluster_t *cluster, config_t *config) } /* lighting */ -namespace dead_front { +namespace dead_front_behavior { uint32_t get_id() { - return (uint32_t)OnOff::Feature::kDeadFront; + return (uint32_t)OnOff::Feature::kDeadFrontBehavior; } esp_err_t add(cluster_t *cluster) @@ -315,7 +351,7 @@ esp_err_t add(cluster_t *cluster) return ESP_OK; } -} /* dead_front */ +} /* dead_front_behavior */ } /* feature */ } /* on_off */ diff --git a/components/esp_matter/esp_matter_feature.h b/components/esp_matter/esp_matter_feature.h index 7b777c0fd..9c030e955 100644 --- a/components/esp_matter/esp_matter_feature.h +++ b/components/esp_matter/esp_matter_feature.h @@ -57,7 +57,7 @@ esp_err_t add(cluster_t *cluster, config_t *config); } /* battery */ -// Rechargeable feature is dependent on Battery feature, in order to add +// Rechargeable feature is dependent on Battery feature, in order to add // Rechargeable feature one must add Battery feature first. namespace rechargeable { typedef struct config { @@ -71,7 +71,7 @@ esp_err_t add(cluster_t *cluster, config_t *config); } /* rechargeable */ -// Replaceable feature is dependent on Battery feature, in order to add +// Replaceable feature is dependent on Battery feature, in order to add // Replaceable feature one must add Battery feature first. namespace replaceable { typedef struct config { @@ -120,6 +120,19 @@ esp_err_t add(cluster_t *cluster); } /* feature */ } /* scenes */ +namespace icd_management { +namespace feature { +namespace check_in_protocol_support { +typedef struct config { + uint16_t clients_supported_per_fabric; +} config_t; + +uint32_t get_id(); +esp_err_t add(cluster_t *cluster, config_t *config); + +} /* check_in_protocol_support */ +} /* feature */ +} /* icd_management */ namespace on_off { namespace feature { @@ -138,12 +151,12 @@ esp_err_t add(cluster_t *cluster, config_t *config); } /* lighting */ -namespace dead_front { +namespace dead_front_behavior { uint32_t get_id(); esp_err_t add(cluster_t *cluster); -} /* dead_front */ +} /* dead_front_behavior */ } /* feature */ } /* on_off */ diff --git a/components/esp_matter/zap_common/app/PluginApplicationCallbacks.h b/components/esp_matter/zap_common/app/PluginApplicationCallbacks.h index 989e76208..fef14489d 100644 --- a/components/esp_matter/zap_common/app/PluginApplicationCallbacks.h +++ b/components/esp_matter/zap_common/app/PluginApplicationCallbacks.h @@ -18,11 +18,12 @@ // THIS FILE IS GENERATED BY ZAP #pragma once - void MatterAccessControlPluginServerInitCallback(); void MatterAccountLoginPluginServerInitCallback(); void MatterActionsPluginServerInitCallback(); +void MatterActivatedCarbonFilterMonitoringPluginServerInitCallback(); void MatterAdministratorCommissioningPluginServerInitCallback(); +void MatterAirQualityPluginServerInitCallback(); void MatterApplicationBasicPluginServerInitCallback(); void MatterApplicationLauncherPluginServerInitCallback(); void MatterAudioOutputPluginServerInitCallback(); @@ -32,12 +33,15 @@ void MatterBasicInformationPluginServerInitCallback(); void MatterBinaryInputBasicPluginServerInitCallback(); void MatterBindingPluginServerInitCallback(); void MatterBooleanStatePluginServerInitCallback(); +void MatterCarbonDioxideConcentrationMeasurementPluginServerInitCallback(); +void MatterCarbonMonoxideConcentrationMeasurementPluginServerInitCallback(); void MatterChannelPluginServerInitCallback(); -void MatterClientMonitoringPluginServerInitCallback(); void MatterColorControlPluginServerInitCallback(); void MatterContentLauncherPluginServerInitCallback(); void MatterDescriptorPluginServerInitCallback(); void MatterDiagnosticLogsPluginServerInitCallback(); +void MatterDishwasherAlarmPluginServerInitCallback(); +void MatterDishwasherModePluginServerInitCallback(); void MatterDoorLockPluginServerInitCallback(); void MatterElectricalMeasurementPluginServerInitCallback(); void MatterEthernetNetworkDiagnosticsPluginServerInitCallback(); @@ -45,13 +49,18 @@ void MatterFanControlPluginServerInitCallback(); void MatterFaultInjectionPluginServerInitCallback(); void MatterFixedLabelPluginServerInitCallback(); void MatterFlowMeasurementPluginServerInitCallback(); +void MatterFormaldehydeConcentrationMeasurementPluginServerInitCallback(); void MatterGeneralCommissioningPluginServerInitCallback(); void MatterGeneralDiagnosticsPluginServerInitCallback(); void MatterGroupKeyManagementPluginServerInitCallback(); void MatterGroupsPluginServerInitCallback(); +void MatterHepaFilterMonitoringPluginServerInitCallback(); +void MatterIcdManagementPluginServerInitCallback(); void MatterIdentifyPluginServerInitCallback(); void MatterIlluminanceMeasurementPluginServerInitCallback(); void MatterKeypadInputPluginServerInitCallback(); +void MatterLaundryWasherControlsPluginServerInitCallback(); +void MatterLaundryWasherModePluginServerInitCallback(); void MatterLevelControlPluginServerInitCallback(); void MatterLocalizationConfigurationPluginServerInitCallback(); void MatterLowPowerPluginServerInitCallback(); @@ -59,19 +68,31 @@ void MatterMediaInputPluginServerInitCallback(); void MatterMediaPlaybackPluginServerInitCallback(); void MatterModeSelectPluginServerInitCallback(); void MatterNetworkCommissioningPluginServerInitCallback(); +void MatterNitrogenDioxideConcentrationMeasurementPluginServerInitCallback(); void MatterOccupancySensingPluginServerInitCallback(); void MatterOnOffPluginServerInitCallback(); void MatterOnOffSwitchConfigurationPluginServerInitCallback(); void MatterOperationalCredentialsPluginServerInitCallback(); +void MatterOperationalStatePluginServerInitCallback(); void MatterOtaSoftwareUpdateProviderPluginServerInitCallback(); void MatterOtaSoftwareUpdateRequestorPluginServerInitCallback(); +void MatterOzoneConcentrationMeasurementPluginServerInitCallback(); +void MatterPm10ConcentrationMeasurementPluginServerInitCallback(); +void MatterPm1ConcentrationMeasurementPluginServerInitCallback(); +void MatterPm25ConcentrationMeasurementPluginServerInitCallback(); void MatterPowerSourcePluginServerInitCallback(); void MatterPowerSourceConfigurationPluginServerInitCallback(); void MatterPressureMeasurementPluginServerInitCallback(); void MatterPumpConfigurationAndControlPluginServerInitCallback(); +void MatterRadonConcentrationMeasurementPluginServerInitCallback(); void MatterRefrigeratorAlarmPluginServerInitCallback(); +void MatterRefrigeratorAndTemperatureControlledCabinetModePluginServerInitCallback(); void MatterRelativeHumidityMeasurementPluginServerInitCallback(); +void MatterRvcCleanModePluginServerInitCallback(); +void MatterRvcOperationalStatePluginServerInitCallback(); +void MatterRvcRunModePluginServerInitCallback(); void MatterScenesPluginServerInitCallback(); +void MatterSmokeCoAlarmPluginServerInitCallback(); void MatterSoftwareDiagnosticsPluginServerInitCallback(); void MatterSwitchPluginServerInitCallback(); void MatterTargetNavigatorPluginServerInitCallback(); @@ -82,6 +103,7 @@ void MatterThermostatUserInterfaceConfigurationPluginServerInitCallback(); void MatterThreadNetworkDiagnosticsPluginServerInitCallback(); void MatterTimeFormatLocalizationPluginServerInitCallback(); void MatterTimeSynchronizationPluginServerInitCallback(); +void MatterTotalVolatileOrganicCompoundsConcentrationMeasurementPluginServerInitCallback(); void MatterUnitLocalizationPluginServerInitCallback(); void MatterUnitTestingPluginServerInitCallback(); void MatterUserLabelPluginServerInitCallback(); diff --git a/components/esp_matter/zap_common/app/callback-stub.cpp b/components/esp_matter/zap_common/app/callback-stub.cpp index 9ebc70f25..18d51d78c 100644 --- a/components/esp_matter/zap_common/app/callback-stub.cpp +++ b/components/esp_matter/zap_common/app/callback-stub.cpp @@ -1,22 +1,3 @@ -/* - * - * Copyright (c) 2022 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// THIS FILE IS GENERATED BY ZAP - #include #include #include @@ -38,9 +19,15 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::Actions::Id: emberAfActionsClusterInitCallback(endpoint); break; + case app::Clusters::ActivatedCarbonFilterMonitoring::Id: + emberAfActivatedCarbonFilterMonitoringClusterInitCallback(endpoint); + break; case app::Clusters::AdministratorCommissioning::Id: emberAfAdministratorCommissioningClusterInitCallback(endpoint); break; + case app::Clusters::AirQuality::Id: + emberAfAirQualityClusterInitCallback(endpoint); + break; case app::Clusters::ApplicationBasic::Id: emberAfApplicationBasicClusterInitCallback(endpoint); break; @@ -68,12 +55,15 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::BooleanState::Id: emberAfBooleanStateClusterInitCallback(endpoint); break; + case app::Clusters::CarbonDioxideConcentrationMeasurement::Id: + emberAfCarbonDioxideConcentrationMeasurementClusterInitCallback(endpoint); + break; + case app::Clusters::CarbonMonoxideConcentrationMeasurement::Id: + emberAfCarbonMonoxideConcentrationMeasurementClusterInitCallback(endpoint); + break; case app::Clusters::Channel::Id: emberAfChannelClusterInitCallback(endpoint); break; - case app::Clusters::IcdManagement::Id: - emberAfIcdManagementClusterInitCallback(endpoint); - break; case app::Clusters::ColorControl::Id: emberAfColorControlClusterInitCallback(endpoint); break; @@ -86,6 +76,12 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::DiagnosticLogs::Id: emberAfDiagnosticLogsClusterInitCallback(endpoint); break; + case app::Clusters::DishwasherAlarm::Id: + emberAfDishwasherAlarmClusterInitCallback(endpoint); + break; + case app::Clusters::DishwasherMode::Id: + emberAfDishwasherModeClusterInitCallback(endpoint); + break; case app::Clusters::DoorLock::Id: emberAfDoorLockClusterInitCallback(endpoint); break; @@ -107,6 +103,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::FlowMeasurement::Id: emberAfFlowMeasurementClusterInitCallback(endpoint); break; + case app::Clusters::FormaldehydeConcentrationMeasurement::Id: + emberAfFormaldehydeConcentrationMeasurementClusterInitCallback(endpoint); + break; case app::Clusters::GeneralCommissioning::Id: emberAfGeneralCommissioningClusterInitCallback(endpoint); break; @@ -119,6 +118,12 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::Groups::Id: emberAfGroupsClusterInitCallback(endpoint); break; + case app::Clusters::HepaFilterMonitoring::Id: + emberAfHepaFilterMonitoringClusterInitCallback(endpoint); + break; + case app::Clusters::IcdManagement::Id: + emberAfIcdManagementClusterInitCallback(endpoint); + break; case app::Clusters::Identify::Id: emberAfIdentifyClusterInitCallback(endpoint); break; @@ -128,6 +133,12 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::KeypadInput::Id: emberAfKeypadInputClusterInitCallback(endpoint); break; + case app::Clusters::LaundryWasherControls::Id: + emberAfLaundryWasherControlsClusterInitCallback(endpoint); + break; + case app::Clusters::LaundryWasherMode::Id: + emberAfLaundryWasherModeClusterInitCallback(endpoint); + break; case app::Clusters::LevelControl::Id: emberAfLevelControlClusterInitCallback(endpoint); break; @@ -149,6 +160,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::NetworkCommissioning::Id: emberAfNetworkCommissioningClusterInitCallback(endpoint); break; + case app::Clusters::NitrogenDioxideConcentrationMeasurement::Id: + emberAfNitrogenDioxideConcentrationMeasurementClusterInitCallback(endpoint); + break; case app::Clusters::OccupancySensing::Id: emberAfOccupancySensingClusterInitCallback(endpoint); break; @@ -161,12 +175,27 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::OperationalCredentials::Id: emberAfOperationalCredentialsClusterInitCallback(endpoint); break; + case app::Clusters::OperationalState::Id: + emberAfOperationalStateClusterInitCallback(endpoint); + break; case app::Clusters::OtaSoftwareUpdateProvider::Id: emberAfOtaSoftwareUpdateProviderClusterInitCallback(endpoint); break; case app::Clusters::OtaSoftwareUpdateRequestor::Id: emberAfOtaSoftwareUpdateRequestorClusterInitCallback(endpoint); break; + case app::Clusters::OzoneConcentrationMeasurement::Id: + emberAfOzoneConcentrationMeasurementClusterInitCallback(endpoint); + break; + case app::Clusters::Pm10ConcentrationMeasurement::Id: + emberAfPm10ConcentrationMeasurementClusterInitCallback(endpoint); + break; + case app::Clusters::Pm1ConcentrationMeasurement::Id: + emberAfPm1ConcentrationMeasurementClusterInitCallback(endpoint); + break; + case app::Clusters::Pm25ConcentrationMeasurement::Id: + emberAfPm25ConcentrationMeasurementClusterInitCallback(endpoint); + break; case app::Clusters::PowerSource::Id: emberAfPowerSourceClusterInitCallback(endpoint); break; @@ -179,12 +208,33 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::PumpConfigurationAndControl::Id: emberAfPumpConfigurationAndControlClusterInitCallback(endpoint); break; + case app::Clusters::RadonConcentrationMeasurement::Id: + emberAfRadonConcentrationMeasurementClusterInitCallback(endpoint); + break; + case app::Clusters::RefrigeratorAlarm::Id: + emberAfRefrigeratorAlarmClusterInitCallback(endpoint); + break; + case app::Clusters::RefrigeratorAndTemperatureControlledCabinetMode::Id: + emberAfRefrigeratorAndTemperatureControlledCabinetModeClusterInitCallback(endpoint); + break; case app::Clusters::RelativeHumidityMeasurement::Id: emberAfRelativeHumidityMeasurementClusterInitCallback(endpoint); break; + case app::Clusters::RvcCleanMode::Id: + emberAfRvcCleanModeClusterInitCallback(endpoint); + break; + case app::Clusters::RvcOperationalState::Id: + emberAfRvcOperationalStateClusterInitCallback(endpoint); + break; + case app::Clusters::RvcRunMode::Id: + emberAfRvcRunModeClusterInitCallback(endpoint); + break; case app::Clusters::Scenes::Id: emberAfScenesClusterInitCallback(endpoint); break; + case app::Clusters::SmokeCoAlarm::Id: + emberAfSmokeCoAlarmClusterInitCallback(endpoint); + break; case app::Clusters::SoftwareDiagnostics::Id: emberAfSoftwareDiagnosticsClusterInitCallback(endpoint); break; @@ -194,6 +244,9 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::TargetNavigator::Id: emberAfTargetNavigatorClusterInitCallback(endpoint); break; + case app::Clusters::TemperatureControl::Id: + emberAfTemperatureControlClusterInitCallback(endpoint); + break; case app::Clusters::TemperatureMeasurement::Id: emberAfTemperatureMeasurementClusterInitCallback(endpoint); break; @@ -209,6 +262,12 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case app::Clusters::TimeFormatLocalization::Id: emberAfTimeFormatLocalizationClusterInitCallback(endpoint); break; + case app::Clusters::TimeSynchronization::Id: + emberAfTimeSynchronizationClusterInitCallback(endpoint); + break; + case app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::Id: + emberAfTotalVolatileOrganicCompoundsConcentrationMeasurementClusterInitCallback(endpoint); + break; case app::Clusters::UnitLocalization::Id: emberAfUnitLocalizationClusterInitCallback(endpoint); break; @@ -232,7 +291,6 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) break; } } - void __attribute__((weak)) emberAfAccessControlClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -248,11 +306,21 @@ void __attribute__((weak)) emberAfActionsClusterInitCallback(EndpointId endpoint // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfActivatedCarbonFilterMonitoringClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfAdministratorCommissioningClusterInitCallback(EndpointId endpoint) { // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfAirQualityClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfApplicationBasicClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -298,12 +366,17 @@ void __attribute__((weak)) emberAfBooleanStateClusterInitCallback(EndpointId end // To prevent warning (void) endpoint; } -void __attribute__((weak)) emberAfChannelClusterInitCallback(EndpointId endpoint) +void __attribute__((weak)) emberAfCarbonDioxideConcentrationMeasurementClusterInitCallback(EndpointId endpoint) { // To prevent warning (void) endpoint; } -void __attribute__((weak)) emberAfIcdManagementClusterInitCallback(EndpointId endpoint) +void __attribute__((weak)) emberAfCarbonMonoxideConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfChannelClusterInitCallback(EndpointId endpoint) { // To prevent warning (void) endpoint; @@ -328,6 +401,16 @@ void __attribute__((weak)) emberAfDiagnosticLogsClusterInitCallback(EndpointId e // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfDishwasherAlarmClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfDishwasherModeClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfDoorLockClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -363,6 +446,11 @@ void __attribute__((weak)) emberAfFlowMeasurementClusterInitCallback(EndpointId // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfFormaldehydeConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfGeneralCommissioningClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -383,6 +471,16 @@ void __attribute__((weak)) emberAfGroupsClusterInitCallback(EndpointId endpoint) // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfHepaFilterMonitoringClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfIcdManagementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfIdentifyClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -398,6 +496,16 @@ void __attribute__((weak)) emberAfKeypadInputClusterInitCallback(EndpointId endp // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfLaundryWasherControlsClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfLaundryWasherModeClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfLevelControlClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -433,6 +541,11 @@ void __attribute__((weak)) emberAfNetworkCommissioningClusterInitCallback(Endpoi // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfNitrogenDioxideConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfOccupancySensingClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -453,6 +566,11 @@ void __attribute__((weak)) emberAfOperationalCredentialsClusterInitCallback(Endp // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfOperationalStateClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfOtaSoftwareUpdateProviderClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -463,6 +581,26 @@ void __attribute__((weak)) emberAfOtaSoftwareUpdateRequestorClusterInitCallback( // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfOzoneConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfPm10ConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfPm1ConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfPm25ConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfPowerSourceClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -483,16 +621,51 @@ void __attribute__((weak)) emberAfPumpConfigurationAndControlClusterInitCallback // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfRadonConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfRefrigeratorAlarmClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfRefrigeratorAndTemperatureControlledCabinetModeClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfRelativeHumidityMeasurementClusterInitCallback(EndpointId endpoint) { // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfRvcCleanModeClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfRvcOperationalStateClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfRvcRunModeClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfScenesClusterInitCallback(EndpointId endpoint) { // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfSmokeCoAlarmClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfSoftwareDiagnosticsClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -508,6 +681,11 @@ void __attribute__((weak)) emberAfTargetNavigatorClusterInitCallback(EndpointId // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfTemperatureControlClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfTemperatureMeasurementClusterInitCallback(EndpointId endpoint) { // To prevent warning @@ -533,6 +711,16 @@ void __attribute__((weak)) emberAfTimeFormatLocalizationClusterInitCallback(Endp // To prevent warning (void) endpoint; } +void __attribute__((weak)) emberAfTimeSynchronizationClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} +void __attribute__((weak)) emberAfTotalVolatileOrganicCompoundsConcentrationMeasurementClusterInitCallback(EndpointId endpoint) +{ + // To prevent warning + (void) endpoint; +} void __attribute__((weak)) emberAfUnitLocalizationClusterInitCallback(EndpointId endpoint) { // To prevent warning diff --git a/components/esp_matter/zap_common/zap-generated/CHIPClusters.h b/components/esp_matter/zap_common/zap-generated/CHIPClusters.h index 76c6fdf52..3f4da83ae 100644 --- a/components/esp_matter/zap_common/zap-generated/CHIPClusters.h +++ b/components/esp_matter/zap_common/zap-generated/CHIPClusters.h @@ -16,8 +16,6 @@ */ // THIS FILE IS GENERATED BY ZAP - -// Prevent multiple inclusion #pragma once #include @@ -219,6 +217,13 @@ public: ~EthernetNetworkDiagnosticsCluster() {} }; +class DLL_EXPORT TimeSynchronizationCluster : public ClusterBase +{ +public: + TimeSynchronizationCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~TimeSynchronizationCluster() {} +}; + class DLL_EXPORT BridgedDeviceBasicInformationCluster : public ClusterBase { public: @@ -275,6 +280,13 @@ public: ~BooleanStateCluster() {} }; +class DLL_EXPORT IcdManagementCluster : public ClusterBase +{ +public: + IcdManagementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~IcdManagementCluster() {} +}; + class DLL_EXPORT ModeSelectCluster : public ClusterBase { public: @@ -282,6 +294,111 @@ public: ~ModeSelectCluster() {} }; +class DLL_EXPORT LaundryWasherModeCluster : public ClusterBase +{ +public: + LaundryWasherModeCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~LaundryWasherModeCluster() {} +}; + +class DLL_EXPORT RefrigeratorAndTemperatureControlledCabinetModeCluster : public ClusterBase +{ +public: + RefrigeratorAndTemperatureControlledCabinetModeCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~RefrigeratorAndTemperatureControlledCabinetModeCluster() {} +}; + +class DLL_EXPORT LaundryWasherControlsCluster : public ClusterBase +{ +public: + LaundryWasherControlsCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~LaundryWasherControlsCluster() {} +}; + +class DLL_EXPORT RvcRunModeCluster : public ClusterBase +{ +public: + RvcRunModeCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~RvcRunModeCluster() {} +}; + +class DLL_EXPORT RvcCleanModeCluster : public ClusterBase +{ +public: + RvcCleanModeCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~RvcCleanModeCluster() {} +}; + +class DLL_EXPORT TemperatureControlCluster : public ClusterBase +{ +public: + TemperatureControlCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~TemperatureControlCluster() {} +}; + +class DLL_EXPORT RefrigeratorAlarmCluster : public ClusterBase +{ +public: + RefrigeratorAlarmCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~RefrigeratorAlarmCluster() {} +}; + +class DLL_EXPORT DishwasherModeCluster : public ClusterBase +{ +public: + DishwasherModeCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~DishwasherModeCluster() {} +}; + +class DLL_EXPORT AirQualityCluster : public ClusterBase +{ +public: + AirQualityCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~AirQualityCluster() {} +}; + +class DLL_EXPORT SmokeCoAlarmCluster : public ClusterBase +{ +public: + SmokeCoAlarmCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~SmokeCoAlarmCluster() {} +}; + +class DLL_EXPORT DishwasherAlarmCluster : public ClusterBase +{ +public: + DishwasherAlarmCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~DishwasherAlarmCluster() {} +}; + +class DLL_EXPORT OperationalStateCluster : public ClusterBase +{ +public: + OperationalStateCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~OperationalStateCluster() {} +}; + +class DLL_EXPORT RvcOperationalStateCluster : public ClusterBase +{ +public: + RvcOperationalStateCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~RvcOperationalStateCluster() {} +}; + +class DLL_EXPORT HepaFilterMonitoringCluster : public ClusterBase +{ +public: + HepaFilterMonitoringCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~HepaFilterMonitoringCluster() {} +}; + +class DLL_EXPORT ActivatedCarbonFilterMonitoringCluster : public ClusterBase +{ +public: + ActivatedCarbonFilterMonitoringCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~ActivatedCarbonFilterMonitoringCluster() {} +}; + class DLL_EXPORT DoorLockCluster : public ClusterBase { public: @@ -387,6 +504,76 @@ public: ~OccupancySensingCluster() {} }; +class DLL_EXPORT CarbonMonoxideConcentrationMeasurementCluster : public ClusterBase +{ +public: + CarbonMonoxideConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~CarbonMonoxideConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT CarbonDioxideConcentrationMeasurementCluster : public ClusterBase +{ +public: + CarbonDioxideConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~CarbonDioxideConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT NitrogenDioxideConcentrationMeasurementCluster : public ClusterBase +{ +public: + NitrogenDioxideConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~NitrogenDioxideConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT OzoneConcentrationMeasurementCluster : public ClusterBase +{ +public: + OzoneConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~OzoneConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT Pm25ConcentrationMeasurementCluster : public ClusterBase +{ +public: + Pm25ConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~Pm25ConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT FormaldehydeConcentrationMeasurementCluster : public ClusterBase +{ +public: + FormaldehydeConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~FormaldehydeConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT Pm1ConcentrationMeasurementCluster : public ClusterBase +{ +public: + Pm1ConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~Pm1ConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT Pm10ConcentrationMeasurementCluster : public ClusterBase +{ +public: + Pm10ConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~Pm10ConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT TotalVolatileOrganicCompoundsConcentrationMeasurementCluster : public ClusterBase +{ +public: + TotalVolatileOrganicCompoundsConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~TotalVolatileOrganicCompoundsConcentrationMeasurementCluster() {} +}; + +class DLL_EXPORT RadonConcentrationMeasurementCluster : public ClusterBase +{ +public: + RadonConcentrationMeasurementCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} + ~RadonConcentrationMeasurementCluster() {} +}; + class DLL_EXPORT WakeOnLanCluster : public ClusterBase { public: @@ -478,13 +665,6 @@ public: ~ElectricalMeasurementCluster() {} }; -class DLL_EXPORT ClientMonitoringCluster : public ClusterBase -{ -public: - ClientMonitoringCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : ClusterBase(exchangeManager, session, endpoint) {} - ~ClientMonitoringCluster() {} -}; - class DLL_EXPORT UnitTestingCluster : public ClusterBase { public: diff --git a/components/esp_matter/zap_common/zap-generated/access.h b/components/esp_matter/zap_common/zap-generated/access.h index 363a189f4..799f8f7d5 100644 --- a/components/esp_matter/zap_common/zap-generated/access.h +++ b/components/esp_matter/zap_common/zap-generated/access.h @@ -49,6 +49,8 @@ 0x0000003E, /* Cluster: Operational Credentials, Attribute: NOCs, Privilege: administer */ \ /* Cluster: Group Key Management, Attribute: GroupKeyMap, Privilege: view */ \ /* Cluster: User Label, Attribute: LabelList, Privilege: view */ \ + 0x00000046, /* Cluster: ICD Management, Attribute: RegisteredClients, Privilege: administer */ \ + 0x00000046, /* Cluster: ICD Management, Attribute: ICDCounter, Privilege: administer */ \ /* Cluster: Door Lock, Attribute: DoorOpenEvents, Privilege: view */ \ /* Cluster: Door Lock, Attribute: DoorClosedEvents, Privilege: view */ \ /* Cluster: Door Lock, Attribute: OpenPeriod, Privilege: view */ \ @@ -112,6 +114,8 @@ 0x00000000, /* Cluster: Operational Credentials, Attribute: NOCs, Privilege: administer */ \ /* Cluster: Group Key Management, Attribute: GroupKeyMap, Privilege: view */ \ /* Cluster: User Label, Attribute: LabelList, Privilege: view */ \ + 0x00000003, /* Cluster: ICD Management, Attribute: RegisteredClients, Privilege: administer */ \ + 0x00000004, /* Cluster: ICD Management, Attribute: ICDCounter, Privilege: administer */ \ /* Cluster: Door Lock, Attribute: DoorOpenEvents, Privilege: view */ \ /* Cluster: Door Lock, Attribute: DoorClosedEvents, Privilege: view */ \ /* Cluster: Door Lock, Attribute: OpenPeriod, Privilege: view */ \ @@ -175,6 +179,8 @@ kMatterAccessPrivilegeAdminister, /* Cluster: Operational Credentials, Attribute: NOCs, Privilege: administer */ \ /* Cluster: Group Key Management, Attribute: GroupKeyMap, Privilege: view */ \ /* Cluster: User Label, Attribute: LabelList, Privilege: view */ \ + kMatterAccessPrivilegeAdminister, /* Cluster: ICD Management, Attribute: RegisteredClients, Privilege: administer */ \ + kMatterAccessPrivilegeAdminister, /* Cluster: ICD Management, Attribute: ICDCounter, Privilege: administer */ \ /* Cluster: Door Lock, Attribute: DoorOpenEvents, Privilege: view */ \ /* Cluster: Door Lock, Attribute: DoorClosedEvents, Privilege: view */ \ /* Cluster: Door Lock, Attribute: OpenPeriod, Privilege: view */ \ @@ -404,6 +410,11 @@ 0x00000031, /* Cluster: Network Commissioning, Command: ConnectNetwork, Privilege: administer */ \ 0x00000031, /* Cluster: Network Commissioning, Command: ReorderNetwork, Privilege: administer */ \ 0x00000033, /* Cluster: General Diagnostics, Command: TestEventTrigger, Privilege: manage */ \ + 0x00000038, /* Cluster: Time Synchronization, Command: SetUTCTime, Privilege: administer */ \ + 0x00000038, /* Cluster: Time Synchronization, Command: SetTrustedTimeSource, Privilege: administer */ \ + 0x00000038, /* Cluster: Time Synchronization, Command: SetTimeZone, Privilege: manage */ \ + 0x00000038, /* Cluster: Time Synchronization, Command: SetDSTOffset, Privilege: manage */ \ + 0x00000038, /* Cluster: Time Synchronization, Command: SetDefaultNTP, Privilege: administer */ \ 0x0000003C, /* Cluster: Administrator Commissioning, Command: OpenCommissioningWindow, Privilege: administer */ \ 0x0000003C, /* Cluster: Administrator Commissioning, Command: OpenBasicCommissioningWindow, Privilege: administer */ \ 0x0000003C, /* Cluster: Administrator Commissioning, Command: RevokeCommissioning, Privilege: administer */ \ @@ -419,6 +430,9 @@ 0x0000003F, /* Cluster: Group Key Management, Command: KeySetRead, Privilege: administer */ \ 0x0000003F, /* Cluster: Group Key Management, Command: KeySetRemove, Privilege: administer */ \ 0x0000003F, /* Cluster: Group Key Management, Command: KeySetReadAllIndices, Privilege: administer */ \ + 0x00000046, /* Cluster: ICD Management, Command: RegisterClient, Privilege: manage */ \ + 0x00000046, /* Cluster: ICD Management, Command: UnregisterClient, Privilege: manage */ \ + 0x00000046, /* Cluster: ICD Management, Command: StayActiveRequest, Privilege: manage */ \ 0x00000101, /* Cluster: Door Lock, Command: SetWeekDaySchedule, Privilege: administer */ \ 0x00000101, /* Cluster: Door Lock, Command: GetWeekDaySchedule, Privilege: administer */ \ 0x00000101, /* Cluster: Door Lock, Command: ClearWeekDaySchedule, Privilege: administer */ \ @@ -430,8 +444,6 @@ 0x00000101, /* Cluster: Door Lock, Command: SetCredential, Privilege: administer */ \ 0x00000101, /* Cluster: Door Lock, Command: GetCredentialStatus, Privilege: administer */ \ 0x00000101, /* Cluster: Door Lock, Command: ClearCredential, Privilege: administer */ \ - 0x00001046, /* Cluster: Client Monitoring, Command: RegisterClientMonitoring, Privilege: manage */ \ - 0x00001046, /* Cluster: Client Monitoring, Command: UnregisterClientMonitoring, Privilege: manage */ \ 0xFFF1FC06, /* Cluster: Fault Injection, Command: FailAtFault, Privilege: manage */ \ 0xFFF1FC06, /* Cluster: Fault Injection, Command: FailRandomlyAtFault, Privilege: manage */ \ } @@ -458,6 +470,11 @@ 0x00000006, /* Cluster: Network Commissioning, Command: ConnectNetwork, Privilege: administer */ \ 0x00000008, /* Cluster: Network Commissioning, Command: ReorderNetwork, Privilege: administer */ \ 0x00000000, /* Cluster: General Diagnostics, Command: TestEventTrigger, Privilege: manage */ \ + 0x00000000, /* Cluster: Time Synchronization, Command: SetUTCTime, Privilege: administer */ \ + 0x00000001, /* Cluster: Time Synchronization, Command: SetTrustedTimeSource, Privilege: administer */ \ + 0x00000002, /* Cluster: Time Synchronization, Command: SetTimeZone, Privilege: manage */ \ + 0x00000004, /* Cluster: Time Synchronization, Command: SetDSTOffset, Privilege: manage */ \ + 0x00000005, /* Cluster: Time Synchronization, Command: SetDefaultNTP, Privilege: administer */ \ 0x00000000, /* Cluster: Administrator Commissioning, Command: OpenCommissioningWindow, Privilege: administer */ \ 0x00000001, /* Cluster: Administrator Commissioning, Command: OpenBasicCommissioningWindow, Privilege: administer */ \ 0x00000002, /* Cluster: Administrator Commissioning, Command: RevokeCommissioning, Privilege: administer */ \ @@ -473,6 +490,9 @@ 0x00000001, /* Cluster: Group Key Management, Command: KeySetRead, Privilege: administer */ \ 0x00000003, /* Cluster: Group Key Management, Command: KeySetRemove, Privilege: administer */ \ 0x00000004, /* Cluster: Group Key Management, Command: KeySetReadAllIndices, Privilege: administer */ \ + 0x00000000, /* Cluster: ICD Management, Command: RegisterClient, Privilege: manage */ \ + 0x00000002, /* Cluster: ICD Management, Command: UnregisterClient, Privilege: manage */ \ + 0x00000003, /* Cluster: ICD Management, Command: StayActiveRequest, Privilege: manage */ \ 0x0000000B, /* Cluster: Door Lock, Command: SetWeekDaySchedule, Privilege: administer */ \ 0x0000000C, /* Cluster: Door Lock, Command: GetWeekDaySchedule, Privilege: administer */ \ 0x0000000D, /* Cluster: Door Lock, Command: ClearWeekDaySchedule, Privilege: administer */ \ @@ -484,8 +504,6 @@ 0x00000022, /* Cluster: Door Lock, Command: SetCredential, Privilege: administer */ \ 0x00000024, /* Cluster: Door Lock, Command: GetCredentialStatus, Privilege: administer */ \ 0x00000026, /* Cluster: Door Lock, Command: ClearCredential, Privilege: administer */ \ - 0x00000000, /* Cluster: Client Monitoring, Command: RegisterClientMonitoring, Privilege: manage */ \ - 0x00000001, /* Cluster: Client Monitoring, Command: UnregisterClientMonitoring, Privilege: manage */ \ 0x00000000, /* Cluster: Fault Injection, Command: FailAtFault, Privilege: manage */ \ 0x00000001, /* Cluster: Fault Injection, Command: FailRandomlyAtFault, Privilege: manage */ \ } @@ -512,6 +530,11 @@ kMatterAccessPrivilegeAdminister, /* Cluster: Network Commissioning, Command: ConnectNetwork, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Network Commissioning, Command: ReorderNetwork, Privilege: administer */ \ kMatterAccessPrivilegeManage, /* Cluster: General Diagnostics, Command: TestEventTrigger, Privilege: manage */ \ + kMatterAccessPrivilegeAdminister, /* Cluster: Time Synchronization, Command: SetUTCTime, Privilege: administer */ \ + kMatterAccessPrivilegeAdminister, /* Cluster: Time Synchronization, Command: SetTrustedTimeSource, Privilege: administer */ \ + kMatterAccessPrivilegeManage, /* Cluster: Time Synchronization, Command: SetTimeZone, Privilege: manage */ \ + kMatterAccessPrivilegeManage, /* Cluster: Time Synchronization, Command: SetDSTOffset, Privilege: manage */ \ + kMatterAccessPrivilegeAdminister, /* Cluster: Time Synchronization, Command: SetDefaultNTP, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Administrator Commissioning, Command: OpenCommissioningWindow, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Administrator Commissioning, Command: OpenBasicCommissioningWindow, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Administrator Commissioning, Command: RevokeCommissioning, Privilege: administer */ \ @@ -527,6 +550,9 @@ kMatterAccessPrivilegeAdminister, /* Cluster: Group Key Management, Command: KeySetRead, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Group Key Management, Command: KeySetRemove, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Group Key Management, Command: KeySetReadAllIndices, Privilege: administer */ \ + kMatterAccessPrivilegeManage, /* Cluster: ICD Management, Command: RegisterClient, Privilege: manage */ \ + kMatterAccessPrivilegeManage, /* Cluster: ICD Management, Command: UnregisterClient, Privilege: manage */ \ + kMatterAccessPrivilegeManage, /* Cluster: ICD Management, Command: StayActiveRequest, Privilege: manage */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Door Lock, Command: SetWeekDaySchedule, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Door Lock, Command: GetWeekDaySchedule, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Door Lock, Command: ClearWeekDaySchedule, Privilege: administer */ \ @@ -538,8 +564,6 @@ kMatterAccessPrivilegeAdminister, /* Cluster: Door Lock, Command: SetCredential, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Door Lock, Command: GetCredentialStatus, Privilege: administer */ \ kMatterAccessPrivilegeAdminister, /* Cluster: Door Lock, Command: ClearCredential, Privilege: administer */ \ - kMatterAccessPrivilegeManage, /* Cluster: Client Monitoring, Command: RegisterClientMonitoring, Privilege: manage */ \ - kMatterAccessPrivilegeManage, /* Cluster: Client Monitoring, Command: UnregisterClientMonitoring, Privilege: manage */ \ kMatterAccessPrivilegeManage, /* Cluster: Fault Injection, Command: FailAtFault, Privilege: manage */ \ kMatterAccessPrivilegeManage, /* Cluster: Fault Injection, Command: FailRandomlyAtFault, Privilege: manage */ \ } diff --git a/components/esp_matter/zap_common/zap-generated/gen_config.h b/components/esp_matter/zap_common/zap-generated/gen_config.h index 1b3602219..4abbc0486 100644 --- a/components/esp_matter/zap_common/zap-generated/gen_config.h +++ b/components/esp_matter/zap_common/zap-generated/gen_config.h @@ -194,6 +194,7 @@ #define EMBER_AF_FAN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT FIXED_ENDPOINT_COUNT // used in fan control #define EMBER_AF_DISHWASHER_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT FIXED_ENDPOINT_COUNT // used in dishwasher #define EMBER_AF_LAUNDRY_WASHER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT FIXED_ENDPOINT_COUNT // used in washer control +#define EMBER_AF_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT FIXED_ENDPOINT_COUNT // used in sample-mei #define EMBER_AF_MODE_SELECT_CLUSTER_SERVER_ENDPOINT_COUNT CONFIG_ESP_MATTER_MODE_SELECT_CLUSTER_ENDPOINT_COUNT // used in mode select #define EMBER_AF_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT CONFIG_ESP_MATTER_TEMPERATURE_CONTROL_CLUSTER_ENDPOINT_COUNT // used in temperature control diff --git a/components/esp_matter_controller/logger/zap-generated/DataModelLogger.cpp b/components/esp_matter_controller/logger/zap-generated/DataModelLogger.cpp index 9e2a1da4d..d9252de91 100644 --- a/components/esp_matter_controller/logger/zap-generated/DataModelLogger.cpp +++ b/components/esp_matter_controller/logger/zap-generated/DataModelLogger.cpp @@ -5077,6 +5077,14 @@ CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, DataModelLogger::LogString(indent, "}"); return CHIP_NO_ERROR; } +CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, + const SampleMei::Commands::AddArgumentsResponse::DecodableType & value) +{ + DataModelLogger::LogString(label, indent, "{"); + ReturnErrorOnFailure(DataModelLogger::LogValue("returnValue", indent + 1, value.returnValue)); + DataModelLogger::LogString(indent, "}"); + return CHIP_NO_ERROR; +} CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributePath & path, chip::TLV::TLVReader * data) { @@ -5273,7 +5281,7 @@ CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributeP return DataModelLogger::LogValue("OffWaitTime", 1, value); } case OnOff::Attributes::StartUpOnOff::Id: { - chip::app::DataModel::Nullable value; + chip::app::DataModel::Nullable value; ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); return DataModelLogger::LogValue("StartUpOnOff", 1, value); } @@ -6631,6 +6639,11 @@ CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributeP ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); return DataModelLogger::LogValue("TestEventTriggersEnabled", 1, value); } + case GeneralDiagnostics::Attributes::AverageWearCount::Id: { + uint32_t value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("AverageWearCount", 1, value); + } case GeneralDiagnostics::Attributes::GeneratedCommandList::Id: { chip::app::DataModel::DecodableList value; ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); @@ -13490,6 +13503,47 @@ CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributeP } break; } + case SampleMei::Id: { + switch (path.mAttributeId) + { + case SampleMei::Attributes::FlipFlop::Id: { + bool value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("FlipFlop", 1, value); + } + case SampleMei::Attributes::GeneratedCommandList::Id: { + chip::app::DataModel::DecodableList value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("GeneratedCommandList", 1, value); + } + case SampleMei::Attributes::AcceptedCommandList::Id: { + chip::app::DataModel::DecodableList value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("AcceptedCommandList", 1, value); + } + case SampleMei::Attributes::EventList::Id: { + chip::app::DataModel::DecodableList value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("EventList", 1, value); + } + case SampleMei::Attributes::AttributeList::Id: { + chip::app::DataModel::DecodableList value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("AttributeList", 1, value); + } + case SampleMei::Attributes::FeatureMap::Id: { + uint32_t value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("FeatureMap", 1, value); + } + case SampleMei::Attributes::ClusterRevision::Id: { + uint16_t value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("ClusterRevision", 1, value); + } + } + break; + } default: break; } @@ -13997,6 +14051,17 @@ CHIP_ERROR DataModelLogger::LogCommand(const chip::app::ConcreteCommandPath & pa } break; } + case SampleMei::Id: { + switch (path.mCommandId) + { + case SampleMei::Commands::AddArgumentsResponse::Id: { + SampleMei::Commands::AddArgumentsResponse::DecodableType value; + ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); + return DataModelLogger::LogValue("AddArgumentsResponse", 1, value); + } + } + break; + } default: break; } diff --git a/components/esp_matter_controller/logger/zap-generated/DataModelLogger.h b/components/esp_matter_controller/logger/zap-generated/DataModelLogger.h index a5fbdc0c4..96f8b52b0 100644 --- a/components/esp_matter_controller/logger/zap-generated/DataModelLogger.h +++ b/components/esp_matter_controller/logger/zap-generated/DataModelLogger.h @@ -557,3 +557,5 @@ static CHIP_ERROR LogValue(const char * label, size_t indent, static CHIP_ERROR LogValue(const char * label, size_t indent, const chip::app::Clusters::UnitTesting::Commands::TestEmitTestFabricScopedEventResponse::DecodableType & value); +static CHIP_ERROR LogValue(const char * label, size_t indent, + const chip::app::Clusters::SampleMei::Commands::AddArgumentsResponse::DecodableType & value); diff --git a/connectedhomeip/connectedhomeip b/connectedhomeip/connectedhomeip index ecc0d63cf..699ff65e0 160000 --- a/connectedhomeip/connectedhomeip +++ b/connectedhomeip/connectedhomeip @@ -1 +1 @@ -Subproject commit ecc0d63cf7eb91f4017bf8c264b53cf690420eb5 +Subproject commit 699ff65e065a28e4b7ee3a2d84110444b1709040 diff --git a/docs/en/developing.rst b/docs/en/developing.rst index 38d174fdf..5e49b5687 100644 --- a/docs/en/developing.rst +++ b/docs/en/developing.rst @@ -51,7 +51,7 @@ For using VSCode for development, please check `Developing in WSL Llvy;$jIzs4$jS(nB%u^#@3OLrOGwFZ`Y*=JN;42id-uGR>Y@%-S$9b-E9<0)NVpY+3i~_f#cBLFK5!M_r`^#6aikP=&&d=NSyn6opU}REeW_?A)aCI<8SH4w#PL7J2T3&W`V@u1z;^I|J z&5i%h>>IG{;G6YS$d znq~On#S8z}1WN79o6@+Usm)85FJHcNDKIK(VrE9l@asWB!0XpWg_aj8e|?wQ3=rz; z@4s~YdQ3#b@=$fK>*}8qCr;d2O}_N22gIH8udV0E=vad<*zhkAmW3%x)XSuJlZf>x0*-hx@#6;5>zsHY5LPL)oJ7!>D;Cqsn7eB8o zFF)M$`a_<>iEuuXG0v1YZ4(tun<@G^Jg8XB~{S9VOjCPEPKjv5Q$1_l)1!8+w-2 z#U{@)oKMeQQA&@InIfGbCnqO4B}Gh3YUe6KsM>*`XVuj}KmyrvwFmFD`Oq$qU}QchAGq^Uj?+M-CrOw!e1m zn#)-ah2*N*TC0xiV`t9jN=rYi9X={*eY4bK=hSmC&r-^vmvM3YX06=PN6IA`g`+Ht zjKX7M`4Xgreo$LxzV#)vyuDg(;G^CxvH6uUC17h0(SMoH})in|m+w(9n?F#15UK68G;R zE!eMa|97igmiWOuF&SmmX&0lE+mo5M?>GKkvIk7Xt`@n%N*6A0gf@(P zkL9a5@#BMCSD`~j-2L&-HgP10z;?P@OjT7?`x8}ot?SZk zKaNXpiF@x`o%~y6k5pq$hgvbLba!_@c<|u&?|V2D5)vPgv%~4B$>Sq${@bwS(;)M^;(UI)jd5oPsEIgd+`0=rciSLm@ zWF$8CNRe?CXL`Ta)M%HuNwoBIb{?jsrKO^JcqjY!@85oOd?UldKgY(}ySjdTv?Gnr z&d$agxo@uLr=*ya`%tZ{tRNe+Jo5Eb)Yl)#HER<#Z;wk$)793#kNrfQD0W@d*3mg~ za7J{v4;C+#vTJ92}&fqB?0msYOCUVmf{IYj?rj>Jd3Tz21=#LzgoyOS6|=o}Hj#6Z{)b}LR3ub(BZ?62cDI!WWOW6GIR^Fkx2tt z6{fLtt!dYC+SA+HwThbV_I-NjQiv>ke`)rXnc2iUqwj{_qEDnt35SJ-?%cIY`TTjl z8$}11LqbA^CMKf7!(XSTPY(>p&}u0uRkysk8XOe#T;)|(R+gvdb}Ke*q}q&(8C)8b zjO?Smhs11eySlC?Dh10G@JP`(IXUG#ElYSnR}}CuA4&7JQd@KLep=f3mE_daJ)PGg zVq^7?i1U@y)YPPF>nwpOY1T3<3K{rAf;SkttHp-3%le8Piff76 zdRkiAuDu7DT771EOG=!6jbJsuMT>b-rY0vJ=j9!lsJ_Yn;oeUc4h{v*>;H*jhVS{R z@8rDXNa!V9o}0ct*Hnb%bd4F@bY&sr@j~+crOEWh%K0c*uWi>PXqcB$7VHz=R)l+mW*YtqQ zSh${B>D!2i2zz^bS#R|gS5x~|S?QfmV`OC1z1vFoP7k|q6vLrI1?C;uc+aLU`^d=N z<>z0$c=0Uh!p|n}+Tjm{g_lKmYHDkn=3NXdyWcmwxtek8eAt=$zsG+6Y!Y<}E-EU* z?md0_6lXOyHg@)iSAU^sQ&Ur0h91tRdv^$e_V8gWqoUz4X6CuYUU!;J+yGUeqP+Z0 zsS~)60pyfIlO}eY*r!KC5MO1VK5b!UciNkyHA{ z#$$t(&wLvb6B4Ky884_V9;Ku6F1%jsBDN4e*_nI(+&RNvBXz(+I2K)*x3_l z1+|bARZ&sd>qLvpWYN?3`0-BB^=%izv_N+nsH@O^O8G!DEswU`#F>*Pv#ffH z&DzrIzJ2@l{rl!bM#*W1Y3^gkT1F(6mzjE#^leuEOd;Ha%vu8mw(kHg`BCUFX!KC& z{Q0gti!L83R-f;){bj&V0WmQ=#+u>0*H;$W^t>kTqxSU;RQQ#B{#^V;Vr6>w?%nb0 z{7ffK6abezdbF!}0~>+3($?1Q>FJ?3dPb|z{%vC7Q1+eL9WA+WjosZvhINN^N47~R zn?HN@Ob>_;DB6oVs^_Eg_va@E*Oq@J?EMd3_o<+WqYtDrp!I8+{#K#xpJ(17bME%L zj)d>g8MgZm9;~{_pIme4%9YTdAZi(()S2#L*CU(HiV_nE2eJ34AtDx?a#PmGZePB9 z(Wqr~Uwg-=u2RYAmz1EPm*$f&!|7sKhE0~+Yaw>3$(v?FL8l2%=Y)n z!bF)jMer8NRNIiq$iqmqFZbU6Gx@Wxj~@r3@);xD{{7LCu7@wQR8{#1%bA;V2Ui1R zvt%VECEZH#sL zpu3+xfAa9~Jbd`j@nPNblLn}j!otER73mond^|h|?TXiI?Ce1=qN1Wm_8vT2_)Ao^ z%i#*|?8E~pQN#n#449Lpxw*Nm?Ww@2`wQctU^*co`@vVJsk86>RM+im?CoWYy`iUf zK~r4Dr~39Db*>x5F1{sFAB&3QqK^oj{$5u0^23MI0s_APphc(PrHvPw8X9s63IY)- za+mx`6Q^J2${L*6>FVlAy)J#_II`5kr_EZ_+5H}ei#+vyQqYT@W#APM zX!`W&f$2}J;jz}YI-sC}NzyM5y=9U&6ZEfR^7TxcuRt<(dnDCncZz`SLjkDBr zc^8p+`wL}gd3AlJ0GKtz)mrY2)ibA3S;@(4uIBZ!d(d)(*V;KaRH~M2tZ-fN7ju}V z&ujV|x#QzKAn<+60Q>Sn>>L~hn~3`YAqA&5F0!owaJ9LU*TFx1drJuSdO_2^B(9z*k6~H|DEoLy!@BMqx@sVPw z&9z`bs^z86USuxc7v|@xTU-{BN z1sNd#T(c#(tRE%I^YzkU&clDnHa6x%i738vD=hUXSqc_YVsRIdgC9;@!Ifc?dLd zQPF_ab7Vq@h0cme#jzfMZpS!we%O5_=V zl}cAvcb4n-;{#lsfzP9rU#rFJxWmDG;61`eA@|uKfnAKC1e68{S!LxtGCo7Hr2(RW z;QiktIA+qKV`7j6y}m0`qG$k7H8(UcJNNPvOSkhP;L_~y%~|R@ry|&#ioi$<3dB0( zbDe$}5-6kU{`~p#%Kmv|WMoK4&h2XIR4Oh78VpBEcVLJ9 z$i=CfU!R`@I|Jvc+`NY%EO<;Qlc-2p zU6xNR>ze<=DMRgBk)NL(l^CC%=GA98vv(otVOR2Od);J78BX6zPE3>w ziQkzN85A5$V;kn}O|mhlb>)iP@3Bjlb`jMvyyW_c$sh`taJlVJR(5s}y>bH;H zBxRO+>lF@Jfnql5%){mIXb%dXQ~S-7S;L7muZTv0I%3y{<(Tq zUA?iXiN;7EB{`XC{3xw4rA$%k)<-JT#CXD;lHsuLCwp_|xGMn=|YbXiSpx--{ID--ER$iJNJ_MJO*u~NNXz8IoP>hEJ4 zvoZK!H({u+@9|7lR<>e%d9<%CO2p32PA=-zJgBEW&k1JchpX;3Ay^fJFex+CgBun0 zojE3?#AHSNq(hP*CBz=A#CZw1-u>Izf3|JQmQcpCVk}f=aZ4V12JUgQeUkxJzqsZ% zwwGQs;6vB8rZ-plu&acNC4L=5jXU1|>v&ScV$vTUshel$4YhBxU<&UBj7bA01Bhqy#hn zydfvE68Vmrh#vld*SkldtMPzTp;RCdXdhrk#kBL{18hm-e>}2_N9RDomOer1lRbUU+Is9q zp-5eOeZBR{@1J)^zd;3@ogc2{rX?F)iu-)~6r@CB6O-k&<-6qGcUOL!xVvw@RCuN? zpz6Xln~*x{^VP`Ui@Ww67Q9^*KqLYMcV8zb`*d%5cx>Yh@4^OWM@>3! zvASdq#qmgEi)0v&PM-Vb2ILk1qi7aRLBSlXiHD}0jLheU+ese#`TgkbK6BcmRG3H07~Bo6`s(9Z^m z*+(+IM-_C^w_fPvTkhMv+t<&}%+m74d+S>=G9EcOzdd%6ff7(tQ%mX%j3$9nGFDYp z)j!_y>hPc*lYX9Hl6p z531P7lT=44pB(bc57Y+;v+OO70Syif6>^-txqbWgpv9-kckT>h{qbudr#=r2wL>)H z;tz0X_NC)@k~5sv(A6z+U9}I|sY{u|U?hlb0b@=`O;r}=Q;?VM-_9a?IS?z-+zeR{ zyccptLPhUKxAo56UMT^AcPJ9Tv(LpH(q{{HGqbX8XAB5>sZmo?vu*o!)F+$Ig^7u5 z;QU2JXK)cfgYyeI>gu)&<1P3)d$5VQ`D9-oQ!C$pRC*~!sk2|Hc1tRRY(}|>nVOnf za~cyUtDme!JdcVB-lO|`^n2{Y*qH8n>weHl(4z5%m)>!A5A5F$!NH$i%tP-w-Wx;- zmGgHft8~?)LJCI7Sv#g9amiio#mswmm9@29m6ncAN~-ATc~Sn{(a|weD-CR_|9QsD zjy1uQ2pdU8lo$F!n~7E)`g0C*0~JZ{)35ke6q_9Ob#4+-H{Fp`TXUPEwJEFN~ zb~CV?VzkpcctD>~#8Ov$O`H~cU$VI&E-1L)O2NX!WNvnr|J11!HMthX{p`U`s8MV3 zArM_q2%s4D6gqtG?Tyv^_2wm$6!S#`et>Lnr_<2cut#2GbQ^!Vth~Iua9$WBT}1uq z%N3QCZAGJTU8fNQVqy|b^E+Ofj-w1h%ouNZleG?h1NJ}E1#E!pZmX^)DzeRdjbmfR z_?Azf&Yn1tg4P7X8OQpsU%%GWJWfl7KoA$lq@$yQkO}3wIx;j=US9qL>;RIh(YNSp zAMTy77q_2m$GUH>Oz^26kNeU0Tn@QRA6jQAiHG0`eRpK~li&@!z;Z)Xf!J^;yus|M zAFTU5e0_Hd<;IS=tSy~nV%oxZ`OUnLpdh`({pRxWM08caW$|l(q#&)lJoogp%|JQ0 zI(GDw?T{jU-1yI*9VPCY`;G|fLL~u5g(UVxDe`Z|->6;NQUhg_%9rWWoz&tnYbeNH zILkgg+&)?twRr52F!?p^7IIn6kPU@l-rq?<-VZ7IsH#`8r z`ZDf|i4_o~G4gO89mAV9A1t0>AwX}rWo7k@^0ebDQ%db2YHEFbeOqJ;9F3`-kE@`n z4Gj%QU0|dyge?wlcpjvo`Gr^jKcIgFRlEcO3%XX(ypgvfIeM9!Pw$*1m_P01%dlH@dAz~hS$y_V;yFGJvB`MA)$)hd?*AdVnw?_-$>)p z4Qf=r=c)rP5A`OP+Z%%^!EYw1^L8*xZ&b*hCD0c)Sbs~-b^4&vOL4Xq59RQUU@Sx zFtE11Ud>nsxQDR*0Wt1%wxtNbkGXJHYirntBY`2?C`0mM+pC4oLRSZeM#wbTe?jtl zue!T1C#M;F02l^`-kgaWPR*T&PZZ#VtFGkuaCDj*a4wY!)<^u_>1pJbM zyQ4vEN3%W|-7zvMgwojZ;)Rs^H;2zIbcxpZXEYV1^oq-qiVLIY!upsod_#ms`K z)5mApPj%X_I_yW<&QaH8b=)C!>wmle=bn5T{`6j#cfo)xXZtQsY120?ZEX%32iwqf zbeQRx8Xq?`GZP2u;Np6Ndi#5#?K@s|b^BI zf`a9ZkaQV$uSt^8kBV?W(}s5c9!%*V$E<*!)E3Xtq(sU?C~>+7+Aw4Pt1 z-(PozhKA1NNmFy|{3kMIdxyl;{j1y;05yzN0V!~=RaKNIqQuNW+E1=>;Yg+xL zL>eT!H6QfsZWK8--1iAGf}&uz8Gv!1QKm%k&8pHQHOIxoTnAdA zl#y`$GZb~?h<7G4q3Gks>QuicPm1o2k}q^B1;>$Gy>u!5%^Pv_{`K6~bL*}#6A*2= z#tkez_eXIJIOCudNlE%Ro_l+$JOwUXF5S8x=%G15ZD8eHhdDRdJg45!j~9!N2H87n zONgrEd9tI5$W`^{j-Hi6b4$dkM}>9@^5C~vsm$Y zg75326TCasC`$`dGWb@dO>%)fnY%r(0T+zztL8}3)@3>*@9eeV zT++}u<1{~n?gDyv75&zPuMgKOpAkI}Tche|hxKtrZR!jVN9Yln18{1aOe5o3TE6;$4wWua*Q{{4V7J~3te0nrzsg(to6@XVx?fga5IrKU!?^Bh=12YS~~ z)zLA={&&8Yp)3}yHhTecOw07t)YB;}iiUW#;B5l~B84;kL=?MDwBNJ>kaMCbA24H*-Yl=O7o;A%ANcuxY} zKdZhCgjR&kU`S>dRZsWL@L-6B7k_n|dfBw8a5q+U2RVC%SLQh2%cw)9ASQL zj%q^F=Nq8Zo!hr@jGdya)s7JY;!5I0jVNV~A3yF>J3O$Sh$A#S@kC@6cNJ~O5s|pW zdz9SUb3vaF0A~jPoH6;5(Gkc%k?R>H8w0Dk=L{1N=??$#cWqJ?f3zJM7|=I2S5YVE zgR8x|5bFk3bYm0wM_gRo^v5CFX(;sFKYpN2``p#k31l3S{QwO&b%g(`2PL#a@msy_ujpGm)k2K@gQ7Ve0s%0wgqoA z-!_5-f*A=3{m8dsOs~IfZvOQR9U6On_uk(u-PV(DyiF-eSstQ45R;(%Bfh_Vxzd&l zdV2a-DiMviL*mZqEr5yRV4r8(MYy;){R55%s0Lnwa0l>Q{}8g$m64bC2O8L$H*Y{4 z(N$EO1cJo-!y>hTMrF#v43xsj$;qlWAtfbJR@#i5kP>O#vOd!pxwx#M2vk372ba1A z-T|?Zi;F8JI$H4~8=;=BWNm)7U$)ywQM^gUgDSsb06gA)c3RX~jT?>cZY#5Jj^6m2H%K)Q=Hj4J`1^kgV3vhz<^I}|O*F$YV5&t=@FwY$roXjg1Kz(t*Yega z=H+yLK|!`yss<`Z{5w}s1(!|-$QTTj`InxLsn8Gn-e*;^Zg}g~!@);BALHWzhaYnC z8Q!_mPYySOd_e-=Tl&zD5MyIw`qTG(thlHi!Bh98?O~$d=bFQ`HRwJppU%G^_Bohs zcc^BXmbBT<|Ck8lT;Z`xcFoDl19snlp9^dF!EtT?I-T)WzFskUatX)jE{BZ=>Vy@9*yhM}wPNah&A4?Chgw90P)bf5{v9!>

T!75cL%Vq3oH+?X zI!f3A7M~fAqYS;0>EU4r)eTUb(2G4SDhjl90dix=!7OrkA9y)Ai9&#j6@zzKHBbo! z#rNuJs-vRpr%~-cGa&wsB9%d4OWg)4TbY@eiE~J$P+eE|(RDR%EMJg|YXZtA-&JA?MCL@;T|cN!9t9 z9%w)XNUi^~SGny}rx43JqFJHa#ODn?RY5FmlQL83v*zclyy2@u)iman>UOto#iP9f zix#>nnn~!2e;&5Qc}>H1tycxhgt-{FI4&pDTtYf0?4}{Mwxr3?b*y*^`@y{3!Be+M zWs;E`mbS~x_g*$QzZ)U)e)F}`oCL#vETIqn%)R7P*uoSIZLYeerr7D%xc~^yp3v_h z)vO8`?c8!!Jmlrt+8V+ex`zj?uCT+jZubGd3e(F+lbF+Oc zZie2T?JEVG0{H~eXh$qcYwSh}01+O)2CY}?XC`vGAeV5IYQmk8Xj>4MQ+G$cszwR# zo?}iKGr1}~;`{4t#PjDj$x`k^!6=>B6su`?Z!?(r49NWL?*F}XhC5Ze9{3Lc@1iyz z5i*5(6vo6zY$;s3W??avA$D@hmhz;mtcK3c4@pVGK%dR3aisAO9~Q?Nwlg<(cA6R) zaVURVvX>Rs>DSOK8X6sCB_L@&xXXFD)F~V41`7)d94YVYCN#|*?%k6k1=U_!S}L!s z3}!PvNbBe2kk?buYO{=N~Ohb~KfhZD)kN$PyORsppS;1R_MN zj`mo=V1>qpjhBgSd5xgg^81vD2`w1%!pMUlJ4iGt;Z5uI}*+SmJM?DtKQH$Ct-*`oxNh@MxaX9Gg=7kHc~E04TZ-7-Tp?_>l@ze-W zHP9ZsAd0F~beVdaU&Z|I-{ptqoQC6Jx)uCKehXo1eAW2Q=mIh+;i8RA)|)q6N^kg1 zoPfdM0i~(Axo)2Mp&4Ir?g20Hr>|aH!R5hS<$|diu@nkBwO@604t03?I^p+4;3puHT5y; z6R?S$!`3^u^!cgl=~>;pc~&wCzDtiY9p-;fM6$ZTnh3v@K5J3R#GJO<0~zQJd-KPu zWVGCrC;f{QT75Eju7wY=*M`Srr`TbtmwHO_DG)lAhmJ{)Xfx z1M%=_6P?UMLxTF{J}7*D#u^Ne)$m@>_AL~)T5Z`P84Lss991OdR|7{6ESSdMz`0+t zpD;KT0rvglqq9hzMMHu-a9L159Laa`Bf?*Md-dv70N`*6)WrXTrGV!xe#wAV5oM@d zo+t5+SX?A~by?X#RGrV?2dv>5KaB<}omCU^AmO|L%3o7U%dtS^y}Jy6X+Y6f$x*>Y z-Mry-&9NCg7a4SblJbGh)wkL$BX@%2Mr3aCA8aAI#9Gkt z>h_5%o0$AWJyK$#_AJfJ%Y$-sl>g>~4 z?L%~ZCM4+Bgq)D`UXcNQgy~06M1|y$O?%J`+zrgO$*K=DQ4o5PClG_D; zA+c$DQ~^>54l3?K^R4y*j3nSjD0C<|KyEp*YyU>Gn=yDMq5A7rHY?&eqbK)nd!3tW z2gas#>Y$+UMQdwoc!x~hCMS#jEl<;Os;W=#!vZA~`1t=m=V8N9V$~~22*}R1MK2}~ zUOq_Cz!2S2IH^8&arDrn_Gb_;HX0^v>g+rXo6?!@IOw<|+%}FlL@&5O_z&(S1Yn5A z+go9Eh0c}>haGJyv^u_BeSkPej^dE1`ucV9U3%sq8smpVt(jg};QFN$F0RI7#X40H z?|L1I=gz&#$q5;GBJ~V$G-O67>&F}i**}VOq(D^Nm&j(2CEqN#Lb3gbGx(G?{&#NT z0b|UJyx4$k0XXuKg*A*{MUeX5;#alb0t1HD?II5MXj$MX@I;MOz_Zzc?Ys8&NxVr& zfNt{=2~tbDGtWW?o8Z&rwmg5VwFo9TX|vRnl#>DivZP|CPd7#aJ#MaZVdSI@D)9H< zt1q2aey4!%TmAr0DfFha<>I|jbX@VlaZb(;Q0(EhE3BNdrsccw#7Nw2ZHfFRzm!z$ zRoZ1{%K5&|O0*k*p++lZ@7)uu6X4{89-^$IG(0k*J_Rs=BaN^Vv@t>gCS?Yo0Rqom zU0of_pz36${NE|5K7~>7ngAYH!NlXTZHH@6m6-{9_w8F>Usp1x+Q+~U)7N+N+O-bg zwA2`LUzR{sjiKS;eDeK@1#*g6(|sx5=D1zmYlL&Goq*1FfP`@*7o zIOCRrf&%?l#pe*5AxuCe@fqtT|94R4LF|JWMKPAn9T|#LhYmUYnY=~_AP~xdyS$7N z7zB;$;n;;YdD)(K2P^AKEWzX?Z#^Y_hz(zP5uN1AN9MxYS@1g^4Ix z|M#^$_}=<<<|(E%mX;h{&VV~#Qu_%HH&(L4++O_AT|2u9q35XK-@&mk!PmdR<_$m0 zED8e@%iiO!C!Z*OmX^GdXfozQB(yOzHz)2D;9n?)K~hssyDV8liPXL&*AEE_ zQ&VoJ=^#q`D~K*T$5f0a;)U}B5_=7e4A?Op7ddg4{o8}yM#J_=EBVPr2~H;frN+!K&7|4dsmhe*&TXX$^8Z88#mlQIN^QxY>D&<12@r2osx10 z%pHEOnHLJY;YUykjvUdsaYGXL40@RzU;)a{pN4;@s>W^>TSOk?B%19m<2LwP)b2%xJuQWyrDka9rZ_%QF4Fk0`IuqMMK(kbHg>t2=rq2>aV(hsfh_Lcp%+3 z);@jugr*aw-MlLFF>t!Pv_#2>iJswMdEs*yvoyMM$EKhgBpE&Hpl}T9HDLlLXci6E zdnh@i@yPo`^{37W&XEI)0&rUQv;uzG_BRI&fr)^%pvVGW!SeXP(zh^WqW5Q z_2$>FDo~YK6u>^aFyGqIA>pzVup}ohzmMT`b8D+TI0i8`mAo)obnV6se+C2{v=Aao zIb)2G7P#rEtl`IlOJ43B=!J-7Hw?eb>!@fw4GmPxw{PBr(OGE{v5lWZ-6YO()zwKr zKY}C(pIZ59%Ft>b{OYo@+XExelkFMd8MY;kltR%NUG9+q!Due9DbNMgZHmp(;x4W@ zRG`c2PYIpJ(!>On^2Bsac{w5D7gWS#@_`iy_^x0>qL-h)cyZLbObkIzv?lKk0wyaT zwuJ@-d(FYUyOu?fU5XMCJUX53+)0X$kN5ReLUF`w6pTmKN?WO{SpNsApDkS88p4WX zV*a{j#{f&1ZO)xq+EXlVJ*f3$WMq;L6^h%94}rxtH?s}xXSUt#FVa!yz}Mn9TytRU zvl3U+IZH5WhvYxRo~-lPvs>P7VmDX_(>))%M(k|5)cq9&AH$?`5diG-LCzKup*L1n`?SA9tyNUleTE)58PP$J4zf z8Nk|YJGOQYM6TfBvvrrV72Af3~^c2XThv3TEO!q^+9(jv+8&V}rq{ zLqgAI`oo<-q7 z%j1bbD}XhMKZKkt&=BDLgr^?wG(Wm52Wb%-?)q7X{N&DFWKv2Q)^ktdVt5tBIQjTE zK2*c>&{dQ~fC<8VW7!B)xOwj)!2Igc9P1o%V5zpNH~xpz#u`>%VOxo zYzdtO7=ZJuz+gHXR((GL0P3l)+mV04a%U-VBBzg(nU7$B&A$i5ecoPMU7baF^Oi%j z=Ggyu0dC#G>ic-)<=Nl9oyg=aZM*whKtg(YPh+Eu_#IUEr4Vo>8Uu_$3G0hJxTvM& zlM7XjPFo7@5aR4xT-@Hn9w9H04}%!4z|jq~)_y}ngAK+^W@e};(i5C)Y&%xLwl0O} zlpf$dYh8fx3)%7uDn$4B>$R1M42^PW^w+>MJGhDksmq-t2fRqB&ynZDgvORJ1fa4q{8O>2GE2WK)eBifX zEAmM@e#6NIIf2+qtR-6N1g_jKyuZLH3}4*E7_T#;;76Dz11s`PsGbiB4_BZ)Dr5ZR z$)Us(5)uqY5Oh0Z{0Hw*${-68<+)1eDK0V4x-z%(793BP`tr{R8Z$E$6_vCd`<@0g zyMPT+R2{qeU_|ltsxyR<7qvL_Pwq`CEBBcm32C~&suzxHJ@eX@L)rL-*@v@1rVONZ zel$D`Pnc9xRbeB2=QyXY59R;4ph+VxT>e5nRA*pYWdbEn-nPMk0gvG)pkM(*y~x(k z@JN~QYywodfwaU#K}@0%0!m8UL5p%3@pV{{9_ws!@$l3U$LV|B^@?2zKwPmZ=(hS* zL}J|8);2pemD9c}`_6e}7)ZZLk+N_SRnAPI)_|wxYQ6mB!TQ`WFf_D+1fI0!vzc&E z_HCcP|I7(yKp9f26D(*Y4AN~7M;oF!EHsh3OH0|GL!ujatCe$Y_W*oiz&iqlU*kH^ zm++xL7uF|`+W>|NZq`5JEoL}HY$?mg4zos&t4t3HN1^0Rpc5-Ja7P%#YrN-V(Is+b z2&!x~Yg97026Ry*?Z)@NP5tPD$xet~Vf(d!`j0skDvHT7>+NTY1^aM~+R!k%wDNk{ zVD<-6t-!_^YQ+zhfJM{{k4ojYfX-at#%19JHk{LJ2(a3GLE?Y1>8J2M;{1Tl;?*}7 zHLqP$@=sAp@oECofejz+LpU3Q4#G#7A$E7fM=NO+&>QPY$_xtGqlrJF`^3O@5_P3X z(MjA-w3fJ_@TW?-J>%iyD}k-zBpMhaX!K}!otGP*m_W)RqS^5l^co}}B|}1S|Ho?i zpgZBqmvd>lvoR$YOjctqH++|}O<|QX(Pejbun)iX$20WF>bklr&f6SY~ARSz(_mz`}snGe~1@6=hDC+BO zM^+wkmQ_Nw6!|{+%jLG z11LKQn_P_8UH0lfET_@6#Iy^P8NBd8Pfrij!JGs&`u)`s}vd z#QBPi3sNiWG=oWbdBR}z%;>AoZIs-s1Md~!=2l5-xSFQ*kP_S)>5tTPwswrTwCK~nojS0RtU(`ALD%osr~MkG>hwfqWYQJ; zg~!`|0EeNndzW?Kp%tk9s_eV|C+L=JiT=iFrzgc>1G9()mz$=ho&HV7*w`>%Ne#D0 zjUv)*poEYN(+M|VrsdNCs<+VJEN{nJpvQ24`5vMy+hh!uE%+L=vOYM>9L;{Ij zBH3RVnDnld@PN!#kO1e!b)x=J$@E@1t6*buQZgVkv}OO66FeL&m?kP8Z-=sL(|iSm z27o|G+3GMH%qZ%3+QB&dq`2KB(6qv*9+WHK6-2XwT1@ANN~c2M=;po%3FkZjdYQ4W5dyb+FN3n5 zJ^KLtTeu!YVt#C%Z4Q8(NIpsH&46Y80XrfwKtyZ?P09Zzkep{TV-;GI z=p~@IFNsP>T(2?{IG`K&*8vPw@ezrH?GUNeLxICkxJ2#7LjoM^5}X=R9p)FBW7t+q4Nc4Yww`92Smq{8fXf)^($9QFqnWvEyvHhx_Wt~0& zkJae#@Z190%9yLBGxNcF1Hv#7;DALfgmDeVR;6E%qT6#!Xk@D3Sdt5Ky^B$<2o-iJ zBPtn~7%O9$ilbz09Q~p5KsnC3gU&o@JajGXFs{@RK!L!(ORH<*pf6}^Qn-A*$&Z25 zB|Hiu?E+YB-^zo3BTCPQs2xcS{@Qp^0U{=F?HK87^Wcg|vft#NmfVW{Xoz#};r?aYxO6R01V5_$?T+Qn+P!y5F@k|;I zJ{_}PlY?73hjivBTx1Wkvrh#YVtCd1g*hEvxc$%<_AAkH1rJG?MMOkg&T=uT#cX1Z z%Q2MCrZnjB*gzcRcR(D)^XC~)--9Y^(VTn;REp_&TikO2Pq?%9=atBFa+hvDP zHg8M{=7s@b)C<=()PP>MaN8;@f zolAvihae%MyQQY21k@~s=Rf$LF%8BudYA|Zk8}HJI3XSaUXsQ`8S7(f-7%l7z_rW0 z@6%T9-{>-@78k$h3<(IpAb7@`H|NI#FaPX#2X$OX2D5JMEiIwOjL?Zi6B3a<849u> zuFpR75qnFtOdd@FwFdln)Y%MWX>LFsJyJ*pjgw0c?70Xcx0HZhn|AEC-J@Fj$%AR& z+7@JbNt{DWMF8*1%X?`hQ0!wS)2au~Fn;$r6y8xdJ<3TS3jz6{!!y>HL?&~bg++h7 zIR&nj_jn+I48Wd(LM57wfofH%X75JP)NrxSfY zp^w{B4ta+@ zSk~V7^z<7SFFtsRXI|h}5LG7%ir33z1qT4M-A%>6>!mUn z-IpPah>TR9DiX_tw9pJ}3@8n07~R0a>}>UrH@slXbGqEL6Q}{rc*G84cMf(hbsfWz zT7$q6I>@Rm{%r-2Z}DUK7G1)4Ruj25T3_E|#1($XonU446p_IbVie@$0*;E(lV4JU zXS6F?irggPv>j(}E73Q=K4)+}OW!LZq609iCa(=VDa3(W3eL=6!?543gPn`NTPDPqaJ3NmYf6~gN;e~_ zSXK({94&K0sh%NYGqb3O2sFtpFiQvrLQQqGllL4{co>AM;e8x$di@N(wK`F)Yu7Ml zOzQO+M5a3F=(iUVIQm+`zMhl=)6>P~9jDxoF#^%^0NaEq4$pqUgVS(i!}#=g!>NN< zgR9LgEFdwZJEj7^qj#RMDvQP%25Zh*lAxaC@)a-XgS_P4;0;xVV%MH}g$tb^Oq5Wu zp3AZ5YDI+>7ms4pEPF$o2Xc3fy?7j1U}1$)_#eq&I%JeeKos| ziJ2KJEO3*5fJ=yp>49F%Yp8L^ajy)j>gqzH$k{6~$pugLBX0n{Rh;#q$LGkrK7;V^ zUH<@`!2wPL?vKYQNq6B1QEhteHuQ@CZ7|(upNIRWd~;GWUALNddHhYrl2a1Il&-F> zcN_;ucR)c$p1i#kIcT_ziEfVwx(nb6*%E&u<003l_J2kULtsLc zL#G_Ezkq*Z5Vr@)%xk>qD@VjE_z#PH6F{oh<(De{!jnM)A|qEM=U|w!wzoI*#8c(2 z=NMl?WmQpm0*C7+8F*z=)JtYZ|0^00=ajpe=(4<0(e?0J2U2 zjQbrqCc$znDGNe>eG5etTidF1LWQVPG*-Yf4M z(V0fER=sc`y!tj0BwltWo?MT?{PhO{RJ5wn(sPAtHF*1aZh1k`0Aa9!NrY zxg44%VcGp$oSgUPhkS8Xo<3FebjgMuJBie_Pv`~QWpLg=VjIA>OR5Gc63G`>ndX^f zLj*E3cbu*xKN!+9|5kGJ;qfDa&I!LQjt40xp;w`-sEF1*R_PsvFzR;BKoUaQMobu> zcZ|n{A^aj&GpyED1FCPc1S$gRuml!4&avQdK)J$N02MuTxcnE|jbE;#-&!OUs3-{c zINUyYVX6%nVekjw$4RCT&}VqH|3B{DJgn!vZU1dykvSw(BoY#mN`y$rEEGy8L<5o}r7|Q$ zg^(nXA(bW-nuJzD(xh31ObsGQbM4nh>%O18kA3|1{^z&<*^cM9pLMTW_3iU{zpvrE z&hxyYPi#7aH>vRFU5EG^z9=4KS%cx+eZ2(I?Dgx$fOiZ@SB}H(uOmOHUAPgR8aka{ zbI4QFXLO@x=(TGCz6K6XKhIlb*aYO;@Z$$)*{b2wdjC6mY3woY^MCX9`FVc-#mHCo z^ZDQZ&&wMld(43@$wkdx%_ri1=-US~SwWBv_%LC@l5yhL_U-$c`J|*I5%Q?Z8LAAZ z65CKUnM5|$SLH8uSgEJCvos-=3X@szyji{dwMR9<%VQ`|G}Lbbu8onPGjtgQX1>w; zqb1&+xYIfJQ(>Pj?vs;Ky!zqmxE)1O8eDFbdt)}6E z1wM@3?H_vX1V3hGrmUp&&XXEw7e9oLxaPFy$&jB z$FQNYat1OYzHwG>5{5boKIRU^MMc)qpdpW}-alm$xVE9O%i(J{^3kCZF5TVS%pZT5 zL5(acr>uPMua>)o@F6PZA)jkHTC&DNd(`?!lN7v$8j~^zP#aUzfH$6Z*x>hfQE~k$ zu%ea8#g7~vD8bf^2!=C#-9GGlexuA?B7u@p=IhrUiO2c7-K#ZKR4`&WD<&vsC7X0OY0s^!|Bk$ku*SBxz-Md@2L-=uOtzAe_S9B7E zOGgoQbWv+`!RdA6AV?Fa050)oUvv z3HJSMb1JdBIx?mo7n26Zu!?vzrqyTsCdYccqn^UqoH8Zr<;&nFQx~o=di1QrZdFh; z&q6`r<{!Wjp=Xg5fQ=9}PX|>(>6i7eq=wiN0%B;88Y&j+Lc|9t$X-o|$9|BjVEnzY z-`C^RIZK)|NaH8810+9eQ!XS#QiQyk&Cnuofut`w>e2N}&08e%*Y@T2%*U&>d-YB_ zPb!Vw`C%p0GUgtNlO~noc_+J-Il7J8sHxZ#Fro$fiCCj7D>rJ?2Z)?5XAT__i4EJa z#LljfU{N~#-*@Si=c2q&vF!S#M$!hL<1|@@u%7@)LSmm`B@4YRYDwW8oSQfFmDO8Gjb74&9aVIJkVlQ@>)Rdkt@9*Ox)=w)zi@(vy>Y_aq!_dU%6t= zWJQV!=EX1Sf4m5KZ?R#M|I6)dhqGc2s}^9F3Sud{6|~Jd&_&CbBi>UMUZD7?lxSh< z<03}Kg3>wG4ps$)pG4iR+Ri-UA1!}=dhipJcwgr-js{S+aQ8>$%#kAfIPU&fQ!|?; z#2zQS%S43c-*ZHnl7_>~yS>a8lHpuY8UPJkGBtkPc!RuXtyzU>o%U7+) ziG0ih*ngsvZ`$}~{Q9`uH&FPILS~oKu;hOl$eTv{pMNIsj__Mx=}yb_i97JA1SM;-3}zMW4jRz zv&B9EB}mcoA@4HFsh8;Yu#uj)F5=Mrw=_6(a;=8gn+Z z6cAL!sGsiNzt2gcGNdL9IhFD1RV&psvPG&|v{-AMojWeK>^>71_8RcSW5g`XDYOuk z@UqIBS|$>~DEeTwj2JOO@$MvlRav=d({K4HMnGw%|B?s{(I*p#0A;H?7@QU2t~924?=`Qutg{=%ZXB;ws!~ zX*(|J$k7FjfGO%&ZnkCP#!~PM6%`fv6<3#vf`<3%*^>s#{n)V-AZiVpuXB=t+L4(z zU_8o$2J8d!PVun-bB71R)Wb!L_JDJLR_CAgfX+}QS(-X2`d3G!Od`n7=LaMyANSw9 z%I|qioSPl}8GXfc&xzG?IYX_M*RVj~D9;&*OUVcIFpOEqJJBJKH1iJ{o0@(`z5@?2 zFU-gR2$E_BYjtpk@byuy-Ki;_;df(uhuXSj6HVW$AQfOB`X!anOlU|>52y^cPqso8 z(CY3_g+kB2K-8@8-ZpLRZWb678YS560sj$BqDhJyZ{mtrKzMiu7bmw(PfUxVA!U!W zk&L$J9{L^0=^S#}@VM0@iVHTHwUtBRBps|>o6pM?Nb2Lp(I8+Wy6wfeG0Y>}YVpqm zAeUs&CMco!6b#_7c!Rm)SE?1JWqWjHOm_GlqXJ(#pM3|)@ z`1hR(e;;-GFJ+%X zw+&&^s>=cgYGD_mJxaHvY+?+7Qu2{t%pR~E6UOr!omzhHbb8!hvvp3#i}uWqnI^@G z*EZIUI{P)y--#jiO$#;Dsg-5{VgKO*;53ev!{1&0S`tmkg2c~C`T?{qS^=jnyO?ZQ z`)S($dd`L7X#%Q%#0XUseHoUBRn0Y>A+_@Rpy$$&{_$GZfB0#Hul+1&A*wyB9j4|6 z(|JGBYD+=;(;C#!-=AQrH`jw^t zR8A-(I_}Eu6^t0Kul)M$TYB00$!cmB^WLNAhfiLfnj-`5mhoj8o~eiWy82HyzZ0n6 ztm;H;Bv%$j`|-c>2K{FqP@Xlb4e=5s#Tb{bm6i02wehQ(*RRItmCMGUe)B|PeRLh; zvYaPqC3lflqqCkqHQ{(c_F?iie&V3t%-;7(50R8y+!aZQ_;-P;$}jY@>^EseR2I;% zRjGLc@|833330CmOx(9Z6twlg@tyhRucaeTt^qn&JQ;`nYk!d;%I%!DwZ0lI)3PF! zi(ypO2)&$hez8UH1EwqkD;X*yvq?`6x2T?%bp?o&i2*o)146#DI_G_THFmvKw|_zW zT$jPj7PQ3LUwooSzWDvsfBX~=IR~#8x%VFllcAE5kM@44e<>X)^WFt})+=#kc=XO4 zDfT03Dhirksn>}TIyx)u^`H(g?jwsbVosu5tg`6?%5*o<)$)jrT!4k)N1+5{M(b+J z@IWzkHPciSgaOd0SI!rkMdvSa9?k}mLGs%*)!Q7P+ z@0Wk>HV?wEATT8|HA)ud5Gzio&US9!FixCDdU5%-4^>S2-M?)2kgN;}X_4G3%?+7h zZ%!H1YO~bJN@?epK+)JrO^eGXiOw=fkqC~Kn`CEZ+F^fW(NP_hAu7w{5U49)B5xP~ zbjx_%%MD;OpT1nbLvzycBe{R8#2*X>PEOJu!kdd2eSd6PNSgE_xpR0RsH>}Y>(OIx z{aV-olWIr1;3lYB@rj;Q<U4&N2GiFxKjwk=BO*q+bo=}7tmersXK3wsQWTjf;eA8T zzRK5GF>&GAwcaD(K2f?Ijfu+Ls~DskMWr)H3mJQpyVmv0^mKPINS;sR>(6vJ`H=h8 z`!s>=A8>Gp($nQS%DU*>%BBUW(>RS|i<{fI3BBh}U1)vmRmB6E@Q_JI1CJIGg}Eey z_s2LpS63O8I8P#yHJx=IzCsjj$j!mXuCCw!-T0(BWZc>(>5RghYVnv{zlC=p`w>x4 zYtqQWbCf8Y_80W+41d==W*>evpe4}{+ehOXeD0rnRE#Lzr;AG(Wd)qGmlt~V>(l3E z4+zHqcqx|s@Br{KRyn=$z=~`q^Xkv1oWWS$p z3Uj@5K?Fo)-*!lZ%>a9~wf#*=YW@hwJ;yl8;ORk97VY>b zp35r9-!Qb}`kk7XQ@*-2y^QA_7`Gyj^7_}cNe)eb+oiF47mgI8czNkAXx`oCVbRR; z6S7ryzlH9S^Ftyy@o8I?^8^J7*f!>8t}+zD@9FScf2K{odkdDLsmeblQ$p^v4T$XZ zVc#CzD;f-jnaEkl!^s9n`W?z(@IBsVVmNQ60ZNv>Sv-`=D*9!xLYqWpkXcwBXi+@y;Hntfpmw>nF@VHu3 z#guNpAzo4$)X|vSwOrPhy7cQ@I@fHGi?RVxaf~0oYO;T(Qu+Qfhsy2?j~f899-8Ne z7GCgF2o4tB&D4d&*POh(u$q<*N`9a)+BRxQQ>@!ahjvKp=k@(O3xFW=Xyxs3_iUT} z%&Hq*>zOs<0KpEQqhdVY&tJddDEO3U5jDoT^IG<;8MH3+b4A4q4?*`;@IaVyI2?{_ zj)}n*MX)lW{Ea#fTzq4~P26A*!oEm46WZS%=h@_0F4ojI0X-09%DV788J6K&dt7E- zp!<*BK`P=%0`-*-kZA!`$o&wD(VyL^H@GOWc-b;N$;T3US!1*;C6?~1wU+!IBqcpO zSVt~+i|)<19mV%2hCbVetI3S_xIH=oKj>ZQqqlzjbbb_>g~#7UkhyE`n3EN`Wud{; zQ%SE+dB)Jcc>Qo&s=Df6GV!kovv*-W*4v*az};cn&9VyRb)5&HyKoTbg$g=eubAd< z{-zkr>O|Ny{BI?vnl2q4j>^aP=+R^>s|yW=QQ%y>_I~%<1;X(POgTqiP6^-K(`JD96KsnrCet!qV;uwq=OnH@& zv6}(~cq*5BTN(4b=I8*?ZYtZn&Y!>eE956mDE9AaYL<)c!H>yDJ}*pVwu&+!~Q&qImyl4loxh6d?>fOo2O^^`yNweO6n6HH2|bt zkB{oz?TEiq^T{N(I-ru!WLT80S-Rt}xz=;uLesG`P(94vU!s}=WYepN0hVpG9{X`t zua}wK=JI>!=zu~m{OVMBkmBjrW?H(%4$oh_&`nr8pe<|C+W8D4?AV#|%Z_`>P}L@Q zNhs`xuZ9F>V7^a-Ye&z$vJMSm^?1$n{M~UH{Wgso<5+;Ra{G-oGT49cH8v zH`s6GxSKsc&????){nN%qmkH=9rdWT?^jA%$OXUFEm=}k*3pht--8O%op5i?7f&x@%Jo+Rd`DhWU%i>hpJhl3bxnd(TioX`Y{+KKoY}af`26eHXLv<|iz{(X>pAzj zs=dw*6qo{v`cL&A@(G1ob~&S!A1fk#1iwEw&-*m`H23;LuCz;o@98y%Tu{q9vsO~g za%fvnEOLJ)FHSoxD^E>+bj{ZaQq981?t2$4I_c@zf0<_P>5Ds8DV9b2ad-GN0`44C0 zI&NI7X~EE`IVk1XGo*5&Y8$HV^toup%t96vHKT~6q9CS$m;>mp%MK0l_039+Ms;A zWEPf@;VD00oPH1O3Ke&T2pm=%9FYJ4$YRit<+E_#S=iyw7^uAnTTBlTUZmGhBdjT_ruCj-+&*|41 z*NV@KpFb^olnaw?h4g-~XEOU7St>7uuh9z4Hti_QfhRxGU!Xi!nKGq`O2EQlf*fr8 zaT7|n!YlgrZJB5m3MfFfx9cOBKQ(j`cQ46Pdwc|QA|`&{dO!`JyWIl z`JN3nHor(BlQ%qkjJklA()wM(D7Uu0J~t<4v`e&k?qai@mT`B_iQRMVaMJgm0M-dI z)Vh6pU_o8>6eZdV@K(mC)sq7@t_yH0(SdrBM?CH+3m@M)oCe|s4L$f&>#!p{dCKEa zvM%~pKcj~kEBjAIMmTWLcj?I&7Mn@xPFelz=S?>mu~{iy?!fklwNy+zi={yEugNJ7YA3BTgcqJ|qsA+0S3Pct5AS3`$F~}hYDXXf^g7w^? zbyf%SC9Uv*y^b+|V6V=5J`AI2z`NI^;v8#PI$$`QrwMy45%Wh4m^iSyvQok8g?Ycy z7>gke&%o@c)922nXj~+R#Uk?Qa-FEE2iQMa(UPpxrJvq!{o#O35LCmQEk>vMZ40{Odck;tA0W^sZ zVx9|8tiy7_g6^R?IC$W@zFcblC|y9TZRd6 zWWYwcA21KQA6`qvToJ@s`%w&hvZ9#ynzkE6=Hdjco8jRrzAQzQ%Z`u85zsPsDC>+A z8|NhEhL>?qS>BDF{cixD=uC~ar>OXH3JYVYh?sR>bLZ*eN}A2nn=Swk9D``1nj6=b zl-{AfG+3B2*6YO%$5C3(1q%JV0;nTBWd*d+Lf8)ksMNPlA1>p^4@_M_l<7+Ib*j%Msu$ULkRG`SiL2%obig~23|8cNMu7&sG0FJY@dzI1~L|Yq`lc0 zCppv3iUIUVWf*(pAfQiQ^wm`EM5jvCpB#{gfT_P~nEktFKc^Ax!$O!a2~7Mxk(}2r zrIAm=Kb}gKDMEqgf(42aQB5Nm&8S?kBETc5`Z;zuc@CXc_``?mD(sNju&8TO@{N-z zAJC3dB;{RaJ%Ha6-8v0=8a|GapW;03ITrR`C?i`1zfuNfKMeV@?;k(PHT;E>P9G_? z)Bet97vBQHvCIvI!Ro=b50>6gxm1;xd-?f=st<*~KuCw;pJzhCbpT;;`i^) z^_6!nDzru({$e7D=mAolk{O)uG@MS7Vz&MO9lXG zIM$_4tL{B|;7M??CW}1g;^ahRmlcv%N3n@-^=i0fA#sN&kE4!xF}B9X>(m+rN05WG z6@cW|FhigsR@|vAYF3)i1TKy%&yKOw`eeahD_lF;Eo^xw^v3r>AvcgE1uHbj-9l4Z zPF-|a)q?+1gJ;RjI>?9N|4A!t7Fi~)@G?CeidJrB=8uMkGRioZHLkAD(7nzdm8Fr& zVhZf}{a=r}$pAr6H|^QL79^hAx)JCK_krE>q{`KIkpx;hBBFPfIf1$oxjA*rldxOa zXJys+*>^XSf@dDXf%#hK@bhYi|I69v`v1h)xPK!raKacM)--Rxn1}}t0=@c)FS;ez ztVxKA+kiOajj>)#v5d`aLf)r|(y0J}xQwM^brF>@+hT@;8GoC^0ucm)7iDQ&zTQ4{ z4+kJLvM@a^GHX#;XxW@&%WoG<4(1%FG|;T-6zh`05p}4^es$Ddu;6FZR5v&?;C2DT z5|UsIuIVUjF&&4pzs@_Js!4vvjG~+zuTR${7tvNT;Q|zA6#}Ryc+jT32f?`ML*T|U zl*I>PRaN<$Y3+`*Z*-j3SFVGt34yO<3B+t~}1@$Lx`5kIIXbNy)l?#6zBl+0^vr*DB63pW2*vxruW5IoiRX*Z(# zektE8H1VKU%^qjyFD8u}_wE6jq6ft6xzC;=`=LI(mZ2CXvlxW?F)7Vw0d8>OH@ zq{)0Ir*@Jc+?T<_h6VkqVSo$1z-;hrl@kn~Vb>YEleB4i87c4$ zj?q?R_eQjEkJ$@P;iNXnN3fl2p&Y^O>^tb(5;-<&VOCz!V|5hwgYE!fA*<^ARFP!b zaN+mG9t43xsCPS+kHwsdJ}rauFS*r{6vbeV*3DW=tBdT-jWTo70r%kuLMLYOI=y-E zcu2Nm#|9ECS=#3sw>D>plvF%C2OL81UDwiKN+a1SL8(v-&_UfyA_i4{i1Yk?>a0of zqepK6%|f1s3s6<9QQ1n$4;k}js7YZaavp|zxwo9 z9XUn@G>oz?SVtdsb)^!z7e#%h+1_{q&igmWW>=iQQR|t-&l!2*^l9;v+H|J^&I>e$ zwvbHtbv;xCp@!f811g;9_c|hF%(GM40Sw!k8yhp1U?OeiKre^S*pi`wHP)liL3*1v zkCY1b@>*>)DRxhJ_m18K!K>Y6^cY{m?x^T?hn%cp*U_V&^yczS_bt~SZRl8plQ&vT zA=Zg@b2$Sbsk-?Kqehk9g*tWQ`gO^M^RwaeDgo?;l=&4s+#php@D+dESQ)&!t`jC6!Fr?$+^_ zBL**hvjtRD>ZX7H1>6Vx;TaGUs{0n#5n8cMuV-lbFg~6E&l{z)>G}E7I30{hxDeAV z1P>q-i*R(-ZgR|x=-LSc9%{&kHR2*hj*sp7h^mbN@MSR+J@(AD)gI`0{IQHafjM%0b;Wh08=*KBfR_m0KbVtuEZ323fJ@LD=LOZ=m~S zJMSur4*J}PjG510xA!mflpuGDR;hc-YLFP@KQw0Ai!a|D%C@XG26N5%sePw zG##65`c@>tgy67>X`$r!xIF737eugedsp!9@op13JKya$)!z$@c#r}YvB85cP(6lz zu0H)QW#Y5+_}@X0PbaFVoL_*yBgPf(-!*^Ub`7idMWxsFg$uUD#KinW$0zSib4wIp~`}?~v?_`%pPC4Is?GSwf10-gp_!)Qi39QQ)Iq>8H zcS(F38X|jS%N=Ye*-yM1?V@OS|8$ZF1WCDox|6{nhn5$I8^ycs@6^L)-aOcvm}@>* zMkd2{ffT>H(WI=L9K%HWeTn9Sr|`*(S;d;Vhbu<(Z?1{|UV44dd}f*yF5KivU$qC`Vv_<+Ko>7v+QDqLrsj3!v9({?{NrX&J#jjq zd)-zRjCmzO6?^kiKrOG~rM2}U+mdG5!+ zFCd~ebHAD9(PPwbO8G@9>lG0Gqg5FpCI;)yz`}|Zyv)>>dX8OodClG*WMY1}s4T&C zaaRH-dp5S6)V5}be7|^P>K+PTfeC`csh^+UjT>7?cKjLq!1CW4y5MKeSJP)Wx6jlF zYnl9>lJ=3|tRbi-e@8U|Equ>B8i1Lkl$0-#1LX&~hb_~@#WwoN`fp#Tun$86k7_?6P9>9rO#i!4B(I(wm;4=n51Yl}0Cz6>i4zYUThw|pK{lkf_4Hi9 zh=FfHxj9fwER&vyRFf?NqlAA6)&l|CU3&UY+BwG3#Er&=q>kYO2P#7(q9$T{&s~EU zg^|La&1?_l&3*pz{BCIIQO1g0x_}^UHa31z1KY?7uVX7Q;cTcAs=k=4s*EbyREOZYw)SqpzEjLbEhd0Qp z-7>Hnc0y+V{`L=-Wb7X<324Om5?zH0d6F{Byvs?);u#FO^ybaG!F{0{W#g^{S$IX6C(BLem z)jZwv7X7HGEOd|U6A?Z|e`w^Ee3}&K+uyeG&7v?r{cB@g*jhHu>7`qNC0;^;gETvv z_&oQNR}scBZBeviiW1!h4?wR-s-?Fu!!bLB)MDj0@aC;ks98Y<8Ck`6{5!6cd^z^a zbQ8m1cBprb_Nl5OwGnME53N<*>LJjb`d4#dUit~<0Ex;A;U-YZgQl&T@dgC=&5Y$W z&QlliUMx?=!TxzMpPY$^|I~>5Gt=po2Fm_}+H2Ql=~Q7ZzwsxCNz{V4rxr-~te;R$ zt5l5io^B3(YtmkAV!(=uA-e&}qi0Q==w7zb=<^BF56q1k-K$w*S@>eBa?vFQvQo4W zH10bD_LkSt`#;Nge+tjgRkIPq3b0+t%Du^5{yA{yd+Iy|{ z^m96LSPxiPS&8=R_u1U*>ebg9E5N~N)8`cf*sQ;$L=ypVy6E*!3~6ihir%A@-|?7} z^9Kv!5YoF_%Lsm*AUZ3nxG}Z$Q7%91qwM3aBjl=zOwR9T()3{s&KFBw<%q=c`$dtMZ^!`;~9I5N!e z-bw*y-F39fD-2KMk8*+Mhg_h3b#ANLw|F6oHA_daWijo%#aZIlv($5UeP6}7$uzo|W@lD#_3 zxcA+U*t8!hxs|t^vj#Gb&CW;HqW{d>Kg&dFH=`$h{TUq_H_Xk&p*)YP}t@-*PX+$Q*wuX=FrUw!86B{^qFkHF8BStJ2r8>Eu5^IsGv%+X$?zZ#i1LomYR|e?6 z#%L*pSyk!vmE*23&V~QR!{VuZJvZZ|HV?s?v2E;TI*;GO;{l~9xWHu0E>t!6d)*SB za6Rc!fBqEWMd}_(A&@l1z6-bek7tDc>rh)FGuu7D?aDruObB^kpt&$ecD+mO zynBa=4tDVoq(+fNiF9y6%Ba@3SK`xR*D5?;X@qydxoSmzB*O>W{wa zZ^$R1M)CJiW)S98_S(=Pqg1babP+ofB->u0q2KnGIp#yo=U2`CXWN#|>y?^cD1d0( zRE@w;h-9(+)P%E@+xy+K{q4ur`j3Pd5{165ZY{!imW*R$g?gx@wMoD8H_R-UeK^+~ z*=uzp9lyI{JoB~YQ{G~$s;omVM@lZbJMNXnjj0Puon`Fj^WB9`YF25q*=mdzNDr)I z*ytT=q}XFkN!NQaO*TCTI?9q@ERQTo?;J>15(gwBGN_Y11dfokFp=*6KNIN-2*=0) zh%zCx)sV)b)ogFT_#ZxN^PpcJ*+h}ub;e%z!S2D6d{T-SUB8gT*qaXjY2~ywN+)#A z6j4rP|2m<~@pJ6rGn)LVX8fL(-95V5b-K-0v2+VqEx8do!IKKYtK!bD3mfM5!kTPW z`SKqzt$R^XWubcwPWy=A)X3tXbD)}7t-Sf91<}fWPRQ`_Ci86}B=!7$OqfYdYMWNM zdYa;lHw?epXWLkp8sCW)iPaue$o&M=14s!_9|CLjRY{3JPGe|)x72n^)cyOnduIlx zb&GV%M;`ZwI2)&3OS84O+zd{X1kw^RXe^3~_sPdmyNk+Fz*4q`Zu#6fBo!$wBb^Qu z?M7vGE0uhVGHGAzVnvChc^>1LUDbq65)*Z5t{9ur_OvpksOa*D4GB2uEOMGg&+T%C zUyA9-60^r-LQE-FS!k;KJ=*)kuqh_pzWIyYBYfkEl2!C7rjpIPe!4InZbuKC8hYdI zjT`g!&)YKWG3937t&Yy&@i&vnR>B~<9G4>DY?a01tY=gC=A;7%k zyLqwU!h)YPo#GF&3aPd))u~y%y6tnh%FK67W zVYrt)#T)=5(G3=wHc1nkJNRe{wbS{lv7kDi3pBJKOcO zEFt>@ET^5d4Gm*m&=5vEt$fAA{;SJf7~EMBv;`0{orKUS>~M`+)qk%?=kuF=i6-2{ zOCKWV$K^e{9ihm?26KRL3&6vLs>4XwO<}!fPitbdMZT z5)7x>=CiKjLKGvfe_sh8Fl+Y*4-qIWdHlOa7~a||u1!7Orhwn5iNHOyv9*9VI>Uj%V9BU|%qO!y!+Rn2YX&u@hKT9Ak zy;`&DciQA6@bPxRG9PTA2*In(A)ra>15sI)95Ceg(9sUdLfR-tKx8kTH@g$~*>inu zaf+*~_mu0?wF7?mT_1E0y45!2VX`+7gp-!gp{b;RdfP}zfGmPf z3#k4A@U5yle|WbrB3;h#<|FpchXl7V!A{r6s12VOQ}_Q&c(>A4S{r?%j1c=kGl>Kt zkCAIKC|+GMV*~for@M7I%q|V11^-G8`yR58EJ*07b>h~oZ8Rw+OIbk;NLrv@3kHkP zgB=uLvN#6Az>@^L9CWl;s{lUNP6o)dsp&7PJx&}!z*nLU=t?4e3dI(hjTIASS?t&W znRLqR*^f4k_STWJDeOnV*)R6c-@PR=R}1r`g`TB^b%GpL4+VN4&%no&pDI_Ee;Vl` zKr*dPNQ|2_GGSodyZJ((Y$(40(v92rDkbICwQF-~s>$b~!ut5t2OkrEB3rOsST*S# zQ{(7ES=0-3A!eXathi0#L0!Fa&lrWe*iqOu@@*3R2_v0Fy7`t43zjP(Zk9De1VvV1BGrLVb@`8gXrQNddD z^n(WvU|Ydfm}vnY;|P@ieKkd5<5`z8yqoQ&ruP;!Z|WJF^l!noW6l4}Yn!|JLV%D_ zw-Rct!Q~*qpqdpMjTC+7^p_q!JU`TME!EQz_G<8X1&Uw5X*dQxK7yO6uviH&6~kS1WttKmn=F~}}^Wq9B6{aSU2UdOoW ztxVL{X+rY{Y6?th9S=2wM{IE19y|c7pK-0NF&A7IF2O6@DQw8+AN;oPWEq8vz)HC zJRD5pD}p%M+|jcox{4CQ;+V3i$VfP0N@;pvU>=yn&(e^+NrI-l@i=)h=>1&A@(8XN zs+_-i;l);1eI`<2cvVzTb-_m`=BZ)ZCk#}`-CV#=f$ymjXd(f-q>5HB12buAw16GjrWTtLr*) z=XwjaS$UxtE39Ws4Iac%D<(bMo2wV8rfW5>zK2t%S z(X!RT_|x((KLw~{kZWx9t0t}q4$m-#)n`#b8F z49Z=?;%Y=TLColYI!P@s+#{Z0X36?GP7=*&?x#sichSj1S$YGZGyezSmgzSg85p+d z?%ic{>X-dzOr2Usa6_{Tvfdr$MC5<{&%Fx&{QYH@FQc|}yR0oAbY4&4e$JMZsPl1daVtM*c1%k;?RD~&Ns7g- zE74j8b3OICDO3hmDrg@QdpaOY%Rsh#YxVit!SYqXtMp$i|4Zbt=ForN_A>9QaT}da zwNKi)p=MjDhM%3m%SBD!{Q7E~8e=kipWnl`52r5L?xt|6F~9Oo#p!6t!Y9|}-HKji zq?h>cp55+OrBB_ohO7EHNwi%#edXntPnWgQ6MiP#=((`Wt+dzQS}pp&OTQ(mu2J23 zW$FBD11}Gi^cpn!(@k>)^M0Yy&(?X44^dSY0w42oQ)_-!l_>z>cXJP58ms7u_q&;{3{8v!WoxYaS zBBG4HBzd*ZuKnrWqcJ?!H3HY1_q-n&~aUUEam4AB!;&1XZB zMZows2|iAB>r1DeT>A6gyKQEALB><(?bEBDERaRT%Er{=H*eft3tT^}1gf{1AGoC4QY0VT7X*~Ye zTva%Uhi>c4zjkib6>E+1`zz;v-SP4H?);og3wg_nlV1;6q#a#*puKK+=#0Xch$Z6} zU!QnO?^gcmaBsZ}S%2@k9DG?pd;ZHsrzW`VzFnp$*0DY8jPBIYef8Ymd{}ecEi>-e zzCH76t3KraT4Qf!zi8XZV^@y_y9H~@XRXXt%AJxvEHmCwc0b!(Z_@ar)@Ez{^?AqbS@x58;!Nk(mmO}sCiMEgtrR+A&hFIR zYh@KUhRVyIg-_8QJEkJI>fS}`MF*yj-`?>{sXkLTKen#6XsKf#gxhxU^28f^19Fz+n3de>Wj5b<{`He# zFTQ%*Ff@ya^FN?zc)sMJC&5VOKhfQP;4lP(6Nm}?#&;uQ7wkPe=UVi}nEdSePQoIg0NZr6hK3-+de9(HS3|9d0E^;)-2c<|xnhq7|#q{hmCM{(^|Y42wbcRU?a zl_)F%Q(5-B^UNPyy!Fc6JNNEH2S?x1Uou>Ec+rmhmmcL03*N4a-5j2g@JOj;RHRbv z(rllZd#)Z5z1!#RXIsDGf0!!Dqot&e0 zgS_<5{cilWIC&Y=jyC~ zF8$!z_x@i}uaZ@k=o~stkzwzxKQQEi{1EHPs~= zQ_Er-9E_It3S4UIm110*9m$!r@-$ZVc~!hmxa&2B_a2T~r2YF_`-KB{_XgMhqxGhT zqS?zK7lwKqh?jVLL%&=2I;lq&7yb}EeQm(E0He0%_6NnK3q*C*W7I5n8t;(R5>5RP z7a8YubZq{@yPHNNBy79)DfxB(oWT{J&VHIbQ|9t@Ggs5p9>aD%^O`p{+$Svb)H?4E zzFMOt7dDh*`ujanv3)UXRL_~BJER=H?am+C<6woz+v6jx zxgR2mBTq;lb{N;*P@6ZmYT9?414`drvOfJyrp|Vvh)BbTif?~Fnue)?df)FEih8`u z>u|AsHRDxI@3mthY>eex>qh2^h-{u>GIZ$9ZjT*%j}nTh$6b`&RkjSBbn?~chY!SO z2KcERt#mVfm#ww7kK+90H*#il+X8fPYM_Tz7p-EExBmZr6vgr%gS$^Tzj9Ka<#G5X2eKNx{x3A(vwV0i^E4y2Sbrm_3Z!9jqX<~!$0eg4p{DDWN_MIl{az$d+ zlfgQpti#HlsApH-Ti>VarUME8^61|7(f$LM^q&$esdQ!Q4sR8Oj!h3XW%WNeU&Ay} zZ;J4qMMNIG)*QVM6psF|U(cR%MYB{AA$!LdxQjhiQk*_L7B`NOqAn{P92{VAz1XTH zTHDkL8g={T&5PEOXey{d@qUj4j2csD3Ffb zI_V#Dbx6FGS{_tS5zr9Sk|n#wF8Zla*3{2oj?D}sSc+8S3B5KCrN)0?mLq>oZh#i; z9o&HKNB>HWVDtjd(&bFrr)JDYCT)25V_)i%WkG9Z|H_<)s@nJxY*kRJ%ju>KA&_v{ z0y;{RWuEkVer%&D^QbC%M_K5~{)S`PyNixY14A4PM`}gYy(M~^T4Q~a$yM>CR ztMNwrid!&xz(#Q>N`3YW!$nBamdN^>C0$%yXa6qPf>Q%T>hRD|yks~6b_uXqH2MAM z&G|u~I!3gL&!3;r4@or6Zl_CwOEVf%*a{ogCyaE_Ij1;o9QG#<3_{uRcQ?gkJ#-bm zKMGrH#Tbb4N4(d3`b9?ezytZX;*^zrw^A2A8vPT&4_-5$5#C;VyOZDY)c00SKfU~2 zjvvSIbccxv2+e37B;ZU=PREA!1qv5x_-BZzNDz3HB_$=v$;oWl34of|;LP3^)_31r zd<#P~OdD2(@%d%*>7r@hkWfi(_Mx+V~ z=8S4=;~h6|e%$s2F92Sf5qAc@Ij%QY-103|CDR#_G5(fusGbtE1}ax1ZTCVMN1$Uh zHnG^|5F2_(e6zkBxToJHF)@n~RVpFHL%oxW_jOrvRAq(vu4&G7PGr43Ll4)EZn`bu z^Ow$S!>E0bAAfx5?%TdQtl2_$*mSA35_+^~xm z7o6L=Vnu(cby+)9%wuM-U|n5(XmUjCZYBuj-@kV}=^>L)pJ!;FSejVEj;J*X$Fv4W zNU-Va=Bgm=QCa3OQ>RWdJiC>7v}sfmR5Uf;^iS5%9gv-1U5G>;zz%f!U~@&FrCiE; ztAcN~$CG8x>NwShY)WkVUCd4qxq(?Kvs6`6K3TJ{+M}cGhp=7#b_MGS19K{DW?&=0 z1w^t3tH}AsQJDnLE+BcFS!U06I(RVQ!2@sOp{!hd`?lIj9ZkA|crP|3?NE^%pvAdE zSu$$W)3UNMqn&+{IcIMVV{{{SYt?iHrfO=>luqYV0IBbr;l~)3SvIFyUHu{N(ftXs z9XNOV*G5j9V^!#bs|P+0b9U}vz1BH7?quO^D~!#!XY%rbHU%*v(ix_*H_VE5Js@B* z2I0jO?{*Mg@Si{Hs=4SIHO~@Hrj}zXd2-|lNSnR8b&*b8Chw(jcPh9RTMI^v*rn`) zbg0l>TtM^}Xlow?C7t2tF+A>w@g+3aZ016x8J)$J( zUL%P<#xOLGx6&v1?a@nDmXD1mviF~_+b^}RygJv%E#<@E!+)_va2HDtz+Sr?o+IxC zp1)RI_LzfkK1Fed1zSJh~dLO)!LDmr2F-d{b;4`di?nAbG6M?RQ^Aj z4!Vdf%bDS~tMsGlw8L{Eh}%rbh;=X;uxkErYI2-~U5|fEY8kuI zxM{Oy?Ns(@=glFvG#)x%SF<_G^YntzEMH(E1DLFHE@5_4v~TkJ#**(&sqGqAzW1wS zzkq_6XtyqZd8Q6Jsf~lRuwzBD!79-3AEl*u4wSY3p5~I-H|KaK6OzOE?yp~y&yEhl zu-*Va(CnDSfuY80?W|Z*dK$`n`IMl{(-m6df_G ze#dVhbRlv~Yu!xzBCt_`BCiQ3*|mGe4wyiN5ytaiDY65Laizj)XO8EeV zY_vBL0eh7as^xLjSM_xCCf3Y35UT)gA_Z2VT`^{l5rF9kuX)ZzOq+ZpEw!@lXrRx`dt zWd%T;J3J>dFYlRBpZU5-eHe#C7JuV6z3#9;?~m0eWXqUB%LO;!5KqqwAuXJ|EC-EmzUqj+Hqz17dFv}9@)HlgGEdciGrHjXXygn^A4*DHdqFa4#~wDMPuen>7hf1 z4jPn`m33I`XG25(zI}&}7;)9t<^=)ReF66WVxk2{Wd;n89e5HzpIszaN8!+aLJZCU z`A*Gur@ehqh0TbWc4D$}15dV>b+kBh$CKLY!v|>fI`)CCz++X=)*-LwiS|6E<+C)e zxHu%If*MCrqPK4tzri^yVE^bKS7vijJJJ z&(fi;IQyPM-8;RapZtHX{<}xD4O7NbS}}&8@2bI00vc1v0C$oX^f_t<#G-Biq(mwX zYF}z2(Ic$6E&dx~& zp_t|K=gFR#v>o#Dx6z{R`h3GTr>dUh#uvaOl3Uc=)D#(Xo(bQsp8_9RZV}q<8FF&k zasyd}(5-uS_&6KG^BHQl`fR^CUQtn76!95e>MohDUiER1CIwPCjIjSIxSYzmz}>{( z41t27q3@H;?CDlqmcyKdXEEw5BYu1{sB*VK5l5>A(*%`tX(27WSIm)rI%w%MGNRg_DlJh40QT`QHr< z$Y%u0`Ls`q<<9k$Qd_!wd8xkof7cX?EcyFMd2Qptc80!C!W7Tyu&D&8991S>e5-;i zEi7_&sPJxKsd}C`f#ZY8(9cZcS=qHz5?xex z^RsQ#0}Bf5X@>?3)jYS`Ja(?yK#|9*jz`voBAjA}-{(Y5DCtg&Ff&SCzI(Eg%NhNU z;gXWp>e9WA9T~oVs&~n*?_a-0tW)HtKLT=yVy{SWPtzsjs(*7+A7am_8 z_@}Z5Q*kN5jaP}XH2FdnL#_*p$IREQnMibwi5Z+6fxr#J_WPe%4@O&3V>7cl1h9Zj zzk72m_r|_uJJ$7;C&a90`0=l5ta9Ia&eYHdSrvr5{U4J(EP3`$V~;6Y8nE@>wm-r^ zVA!>yc~PNpJd2Ey-Pwn{Qgyb@PZ%`!AHs zxI4tN4alnN&|@#wrltPQ*tAkg#7c&(Mm`U!gk(6=3h=E)M8L*QN${T!JxfZ9zWpap zQkp#Z>+FqN3i9#`MxC{bm)P8s)0~l!v3>jSE>_za&h|X=!*=51Z2A}mzP$2_N-S8C znx^U8MdZPJMTz6bj)RbH?&+2GiK|u`_V>D?BghlFc1<)o75+Eh*=?k#+VFuQ`&~zh zo|8*7>Kze1w?Opmpv*ImOCBqoetf;>;rJuQLp_pr4tTg%-DBRMF8h0?)}|ah+W*_X zcHqKCeLJ)h+w1(;kKN~f{I7kt@IP*y9xG!ND|od3w42#LGQCJed--l>IJZ$x6UBd`0z=p|0~W(7t{9-gpsLS62=_ZQ-<# z-V$Rv`LoGZnATZe-?UHG1GMZDi6f;%Dis_qZ{gema9tI$cn#DOP-f50NLxMbyTrUx82K7s%m4LsQ`wU$(=~64A0X6uL&W-Pn!`u5%Ye%7m**gt2%e^N(e6oQ@F=h-8c{SZwcz#CTK4;~I zjTj;L|7Of?dG+4PF7n*wDalHT6giwFDtxTAh$90}3i5uSE>>Y*U&%&9J|uh|*hxS? zvpZVrAWp$ox#Z(hYg_WfroU7jHz%hN`-wSjk2d_bW>&DD6&2}YHJgT~DHU8jw`u$U^`*f(A6K@c7>u)S;H z)1aeab1tdPQ?vcy@<7txNR7v~?^_*T=|Y-8%q`eMArh^><-Kv$IPu;F3J)I;sY`aD zG5Tpc|M5BPb6ag~)m)7`T9P`5{BMiLyFp!zD6~XW7gPML`_bz`K`;Ifrrta*r#NS}FC&+5IkEVlUgOqGjx^Trt*q_dL;8w!Ebbh-MGIcHtht|gSAh`1h~ z+`FTI8BF8be~2Q5WT|P><`#P|UL&(7Cv^XQW1$I`k6e?yRLM;&YoMVNZ}w!s7hyAP zS>ICETwrUdgTc7=y`MJ4&Il`XV81s-Fk1qjCFPa z@wO;lCwd>69elt}jqhy+{KCb?Xd=8U92&G!6>hh7tIJmoX1<{u&G>Ow5`-kzNe>en z=(bQpoPn6R!(vzzX64`z=RfUa5!*VzygF4FPnIT>^zPGVu1a)hXx|na8MQeeUHH=0 z$eOB17mkQz!r>YB+O$bnLK6HG2ptLWy2-~fY!+Ud{Y)!y!A0PJszG^pf4=%=Fjdy- zs!NBehCOfi-n~!ASi`L6s)e3}|riVi`jz(zqRE4?cXeEt!QUlu#|Ln`h7F z`X~3^#~knK=H@;Bu}r8juj7SlGCiV-Iop)5UkHh6?kUscB4%`bj@)$eRgc=%6D_4>EzOu@rA|NpOn`u+0 zmWk!Lot)Cvcj5@6)2fd|C1U$tRU&q_N1pwX2fw0XpA@Ihc2T%aS={@J=i|15RgvSc z30?EmlA&sInzP=rw1O#?$1VHUTaAgs`kPqGhD?%}lA=s!CL5B}wh&e*gfU!PN&QGi zMNOBj+OPzhOEtgV>A+{Gn76k76}zc(arV!W`7k07UDs~kepSKM?;rd4bJ6y$O>kR8 z#8p<5-(9a|kv?ryh$E0!gs9QWw7=O!o7dt>iM9k&_e!(xDn8lu?fi^RLa2ksYR;Xz zVMF3wc7IFIyI|WOAy;tN(hhPRpXWKq7h25p5A^7DM~52=ldhY>W|nMGySVRW_34#0 z&^(&awwjfl&({8ex+|#8O$vNc*}ON?DCqv_+7Q*S@#7|z+b1nKyC9PscAiVEMB4-o zcd*Ha&V)(VU@;@ZEMAiU~a^q_MLa;9qSBg1@l>8Hi)UW#a+o^uQW*=E`U8`3uZ6YO>zGKkw zygSRm{7mDqZr<)=&J@WEM~07&qjfiTnb`3?f+A}hIC8N1aL(3y-{zGSuGCZvUK^u* zY@Yg&xoX4G6)u_>8(R%Y{AM_O0An-DtW0_HznifGq@Cq zu<4loL1TM6cM0P=ql#0KlvrJs-z;$xQ;H#gl~e!ZfJG#(Ho;oMuaXy}mwMpX!9Ja4?hFFs9oq6bM!v$TiW#}IEN zd>vSt7@}`hyOqiF-+ze;vOix;OHp*f^@O8rqHRTSF+UlLa%ol7NGYiU2M@wSuXNBp zYBv7RJB=a@`z5-QCw~FwO4C@aCuccx<&J{-n4?E|%o&wIlOf*HlY8w8w^O^qTCV@1 z^#Lsk-iC#SI?B3i-3qwIMP_Pc2P(;`9eD6$r3$B4m$cCX|TYz{0gUg`0>j?H zbIO(zz3I~dKLK~ZE4kqkdM#I*0Hn;(^9OlhTh90)VZiC@M1va1i&kZ z1E94|_H+#GC)iABl4+{yMu??E!fV*lFTNSrB%wT_mrE9`)U^MD_y}vQ(T0;twTyGX(lTPEqAsxRw{JI7CJY=l zNc{*OI_r<7O5`vzV5Asi)VLwL+^zb$A9p)WdRjspXxv(GmTf+V?!JbjDK0Df(9)8P z@0cS6OpzCce3?}IK}sMMR!sD?y9*Xf*44GMvEg@+GLQ2as@=_w1{s2$+lL15LSo|3 zP~)>_&+;AaQMyGMD)1&>7SQHs&e#8ZpTmky&fH`1UuvV#vG z+|kWL!<+Raa#-iUOYAEjX=Xj-NC8BTbm)DjB>N2Cq_byxHA~2_=6VJN?nZgpqANT; z2)lLVEQ#PJ$ZTb$+7DBpfTH)9g`l;Vi%<(+w3*5e(AEYDovCPb(T1)pE$tY1?LlKO zJ23k`375L3@O*%E_dR`e$pWcQoGMHF=bdR2ycmeng|T!Fy`!5a4z@H8wnO=ujCPkL>t&-A|bO z-n$G{hX8&7NzpaQdTPm-uKYDS>*8BOIa@U;@l<>D3L98E@F2$X&!0ip=tOYjy{z{h zVsfm|CFUH(=Qup?&C-5RAb+Wrubpr zZ-z&RNYQrFUIngN7uLN$`)wUyV2`zTPwfe+$~?$U(dFHG?3iYKY;nl{Y5@)$J0@)H z=<}($Gfqlu^v|>IN9(U>UmBjVT*hORIhlmXG}RSDmkj@>W>Lg;t>&hsYU=jtI;?3* zNGPZn+I=pZTU5uRJ-zp2ERQ-nAYQZGwY{uslE>ov{dok-tm5JD4_|xw)appV-`clk zZ#TSlQ~Up+7par>%2o9gGt?KK`>ama()vZ^=xzqxax~lKOqHKy{m=XUqs^b^jNaNS zJuGZBEp?^E&UwK3y)nEam~Rqv&6AnU<|rk4}+ zYr-<36ulhW@|zT-kl^e-gt# z-`X)k8Ht|d7hfZfQs=&_Zv2)CHj}yV+RG#$>weuQ`%qoW11g5rmNDlH>{O8-7T15X z3l&#li>BuOoP&L2_|>fFICmqt2rI<{Td&&(DawX?_8dIQ{P|liKd(*=pC_MoJ$2^{ znW^~wP10y{{J7EH%<)M^!a)7>n}Pdn{kXk~s_OGUNYD02?K$o1uPl$-D(2S*JUqC2 z!4Q*Z`OYN8;Iga_>aptPUO)67PHb*$9~0a)X6 z;`(ROR63JUN)~;5zXa?O>E>w4yK@cr0Wq!4r^NF&N~SD}R*^E2cQ+X{sBXy6cjeRi z$?@H`l(mjASLUAa{4uVl=h%zl?J-7^f}aM~c=rtwA22}4{Os8N-vf^9lNz z%jZx3jLen3v%xsXrJ>D&BjO(zhMe5EpQ2UxqP?mQ`^E9{%U6zO)BW z=Vaz@y>4|i;8g#msbE-pbnF40sfxXL|S^4)sz zAnDFCr=}>6G+mT4V2keomxRAi`spvZ@IKw%JM!G{ao-<(zWaGu<+0`6^F>k08jo!^ zIYwpfS}s2!>g}QO!Euqk(qe|iH^-*iU%k1E^Qi5Rzv$#|DipV|1 z@4H{!8{zp{_nT4elU!51x%)Om)y2gr`JVjz$<6HWp5j%?!Iy0t2He;yB^Ga`W;e&n z<9PDUJ)eE&Er_0=Th_5c%Q!;b+e=S5>dxj8Clx78etBey*iPr`6&(>`JwggH4;tk< zsT?x$@76YRW;YA#r-$$800R8nY-BDy@k6{^QB7XAqJy(P^lA1}Og(>Q!P388NAEqA zZnssx=HavxPezQ%%-wijWC(B_p?JXliTLhn4-=_BYWzE=l@E=Q)%?SQUXz{qMtnzy zg{S67X=+%v9cRN8GnV(f_Rr|Cy1rYqTEXzUbt_fQT)s0MG3DyX$BOGw95v^@5f1`7 zS~F!>d6UnsyR{CwRw~lwD$=br!}gh+FZMh8s+-!)J{pcf&i|+Rvc1n6@r&BHCHJC~ zlk9{gWynts&H4UhS_>1Fag7tgyUnVL}Nl zO#HLPij%XrZ$u`PnUTFa=G7!+dlt6@NHJ!~{SQJ*htz*M(qa+3ebdn<^ zLP#6{(FG81uF3vQLJ-&?$thJN9(A;2&oD4(Iut4Vn`+}_L%`Eb&CEo)5mHd5(3bxx zUf_7DpMa@(d&^3MG}H)MyFZ{UTEfC7Peui&+PfPW1zD*Yi|ffnKtB47T@iK~-f3vR z-E+7nkrLXy%c<%%wH03JQD(tk}!2HUIU0ptCL8bahyy<8!?A@#CHcBvG~-{x1L9rt&b;LeT`ymKtp(a>T2)Tn9nBgnxT)oFH?TvCxH5xD|5wlO(=6A1SEw`W4XmZsf2TX^T|6di54xer0#e zO`pzC|5H&z>bF9#3q z?Aqd=8Q4?y^z8XMN;mH`4U5-|*qh_93Kp`ki z;JQzUv2GX44-@7dB9^`~>;ROrUtkN|Mr@E2?8cL~zRz2#twxw2FsmLrs-&Ss4(>VPVA2M#4Noko+Zk*eg61b0oFJbx_HBQ4jJi>5{S1-!XD%zEkXh_bsYrIsTnpvpP4gf{Jndxs{zuue_&7zetw7tJaD;@#x3MC z4gs#%bHng66aym-$6B0Q*PDOiB&aQHiFqvWV@AsEN=A zQ;C6ni1w>z&3)|ra7Q~|U*9=%9#OBr_=uARUbE=Yy|nFcO2c%wlobn4zgISM+di$O zzgNx6iN|i=nTi#(L@ToxSwv zKItdUt&@*@A0hWwcphlqv=N(vMX7ttdiN9S5pMc*^R9^=%k7R9I~gh~rwq|^%E@f& zJgN*FTYPg*&kDJLYpVb48SR}kVL@bs^yFg=wpq%D3rxQHeoJ1@Yb^|NcSW z|MA4d<2P?idz^S=b9#of9t=Re_r0U>yZ^OPMNZ=G>o#^Q3f+1am*$Ocj;NRiDK`3a z1bTK?@(la+t8mKTrJ~~x7qZVfDPMk-#z5c;%qV2HP^Ka6RwvnkrXtrvaSyTf;lqQ1 zg1N|^ekbPC=@QzT_`YSXxw(@0^@|rn11CS$+z-s&u;TZts;b1&hHz660xfp`?#bCW zW2(z~Ss59#XlJxB@NA_|r$kY&QU6f35k0q^x%TTZD3Rn z4WGd0Pr70T@P1>FCVG`|<1T`ZRV^HIFgzln`jN&9=gC#C?`8~jTj71gV(~iLh=hEP zjcZz6i*jVL;uJPPO6%!Axv_i7`gP8BkYjlE4By>N*QT0J(7pgjDU*|SjU0X3wd4|g5EzlRyNQ&sySuv42VmSri(<|W z!n=^^f%#UYSi?u@=xibA1Jy2v2%e9?Mz)I}{`Dt>7x{1UQuqYc0uo|T_3D-Da)9!ZXtFGJ=HqFS67*SDHhU`*j!>fN#Q==%`C^Efh6DIZAD-9}PEih!E z%LIHsS%K;0Ztm;WnNvlnx+ufUB&+`7jw6$F*|LNZS3!9RuZSw!ugC-dm2(PB?kkku zEn#ym+F$}1O~b3F*DfgIzdRgUUhV)CZJR&@|ADFv1U9<3j3E=S;O(ejj59ZG+(2~- z`=*;R**0Oxs3;oWQNd8^=ps&7z8|3B?kNZ3Hc?GYLgH6Pz*%nBM3%8;{#FqmMM{IJ z>V@;?--B-RDzHyEO;JbHWv441k^dQ~Q2KmuQ9%fx{+3R&|2Wc%?mIYdy9J z(waLP;+F{Z+%z6a#VO^2&GP?R zRxKTT!043SEw^KH&I;0SUJFqffUpMo&XW3y%?S^p3SCfIj*5DaX~NTPJPPU1^yS{a zbMM+ zGVeIIRLrS8PYR|?jKab-2SF)GA_AF$L;*D<{Vgsvzn*&Kdwd%YG;+ki9JRH!#JdlyHzkAc>v3=T`j(B{c6)Qb-A+Kb;NasAUCPW1L=1->uV}>u zH+Lo^J1q-7j4mj_sq7bl%HYp&4>~)e%ouA?%roSabo7J;l#N@G9UP93I?Re!0=TX% z`?j^S$~dAdt^cO{OS&g4_vGBI^L%IdYh#){#Eqb-r~$r`%YXl5HJU%|*l=L;AyiRT zj=p^LijMRdhZ)QSM`vpyL>UIL4A&c*?t`Cqg!b=fi7lGJ)Yy{QR!t@wQWBn2#I5XY zUa@#FD_JlCl%>Gc!im~kwBePzy+K~PzV3_Vjy~mqC6~&~Vo={Ql>JfiAvq+Oke^Ap zz+MBdyZzfUvkwaEFEfLpO(>fGLh#dG$=7^LFb*v;+?BcYKeJV6m46Z;hA)E84ehf0 z_Fo%)?qrZoDl5T*KIR~BVuZ~}|D7G1Q46CpM@JRAaB$8wB#EtQ%{0W1nrBHFlL9qM z(tzC3Ma!2Pw6%vVxCoE*7D9`n@&1ItXlZjIh}a{Z-jan4p}M9<Gogw*{fv74cn*S_ht~|3k5oMY*&VS`ciw&J1RLUH3mJD!?Y$e z;WK`IP%fJPi(HC6i1RTgapjBjzwWmgKa{PB7X5eMey)7y$pY!!*ja0EBq}P27sJfXS$x7$ zM^6u-=K(g#J$p83%O^D>@tgzmeBN(~0hUfEftDfi6q){w@5rF-!J@i0rRth+UYzRLe>BhTZZv~LK)IFsIJY!3CM-{1WLLBai zk=iw-rCYcx`~=<_H!eHvgcu?u(@W8TkugL{@tY=cETB4q5&r%}FyNe0A;b|)o%$2E z->6`O^3*(p{2YpGj=qg{Dn0$LkTh0u!9EK=?tPqpgvvuf^x<}IZ|s!VLbCG>w*5+- zsrch%N|uTB3)VXTlvFw@`i#5@mAH+#d^XS3KhA!)^3jtg=hoqa`~FkS-{{nVe33xz zM{X!|`3hOb#?fidt4o=`^3Bc{D*=h9pDfZjHjg12ZrfhHO(y$CuN=)GCe#Iwz=mb$ zjY(1RShZ>vGm)+(Ek6wp<- zZo?SV{m^p|@5JLTlu_76cK`HNa@LMT_cnLV90WleXNk7!i7P{1Nt_j~LFCt=B413Y z0;@P-zA@sV?Y~3{BHb*sCS%bNVXZ_^zH+c+l*+o~rAUV>69(_ibz+z&H`Zg`Dq%9@ zvnEQZt%g~Ax6!kgFI|$Cjtl$P*yxW+ z)H*qJ*Usn0uG&;%pMAojpM#av4#%>#tTuzzU-bB@VeI?c8EfxZG_mA?wUyP=?9Php zw6W(pvAw*g_Xbo5p@+m^_#53ocUwyR+uEMe#SN z#_7L4&1wl0?wZ;ag77h4M0V$e>(`?TjS5}NbvJ*s!2vX-NPkxJ8^lb1g(!(Tfuw=I z5kc7S@gref5~Awg@5QlktV{sF> ztzGNsfiVLR2Y?Ah$yzPM8CaC|E2b1QOAr=jm z3L!}WVIE;ypYcq3&wuOBu)3J-rcqJWYbST@77Lc*W0@hJD?vu*hQm)I7wkXz)9gx4#r(M~{@~;lXyDm3? z0x>fQnS5CRD5t4N01QNQfs^hwnq*+mxj83>Tn85|D-48tPJdFO^F0S?5zU)$za`Mtn4uzUeXKCG90$cob0_xcxfN{_M!B)YT zx`nnY-{r>WF=L2BMKHm7zNGonIeReGFaSMxAnt$Y;lSgpxs){c1}OEHc{C>#_sBFp z#fgV=)$L#m{AW(vlQVAOM8Ok?*bs#leIH*^MxYyz$m0)Tex9hFA|-v|xdelrf%zN(n38F!veB?=riL-ca~jdWeLbd zz^A*F_WnA+uH|m>a&pIYjtWu?;iNKXgB5a0@&%m6Nr9WDqvrQEaHFDaty6rYZ=xg^ ze+Y90KE9tn^Kx_7CBMS+{=oUV!tWpXS2J6eGM01r3cFW#6K4$G=yIdH&Xb(9n0aG- zd!rPDGy~TT^3U4MT`E{3GHbfjr7(uKC1A#H=Q*lmYRRPVEpz^cl&^&P~_`8e^Kyi z2pS|6fjl|egic!IvVY6$84>s+jb6Ez2>{3W&YSg%@S5TMzgmD}%I*(bZeRg(XYFjg zx9y@u?LU4TP^oWd@F!;5@5np)%d9L1yw`8PEIam^ERx!R07)k?g90V9Q_1nD;7k+7 zkRvVLY4+$@0JM0mCx&IRz!h^fBmdTbfa9kxAXazgdZDRL{r#BN>Z6RBPxdU)V{TA#qs;&ZXJyEI#HQ=|8Mow<<}%+HA{B% znrxzFe&KY)?VHapr5w6d>bL#)k-!nw5=P>U0omC;Yt}p&68`RZyJf=EfTmY}-ze9I zbs?ZnS(y1|Amv_mBBI1KxpYIB+pQAlZ6{y=gKfRY33!o1{K|Ov6i^Z!Sd;qUYm94#ynp&2$ zP_LV)*Qh^FW28j$Eg=?#$rosm7jtON=GY~VxoSK1lykVt2Y!2oAdI_`Kocetd-5AI zGdm3xWV+S<-uXa?x%;F%g&6p9}whRLu{n4)J0_C^L z+QGqHJC@l&O0d%dO5VEFn&+qAy_;meKbDsr3JQnj^xD+yq#esHl989rb?;W2zi)Lp zLkC}d0u{UMh#gTiNt%D_f4?ODyp{j?zuI^IW$*mY|GE#%`$J92yGrELwude`Jo5Ws zi(TtzTuaYdD^ngeYYgD+)gC44I60=zxuS z(~e(%==^-GRz$gaH<9>%pZKf|Y??w|xUHip#pC$uyqcQdY479KySsOBd^hEm`;R?R zK=wA|_E*|JzZd^(;Fw`-pfy5phOUw|iU;RUU$SC;Qvpm98bvwD8G&M*QqU zuZbBCx$Uay@qk&-s~zp_g6$hXW>vNppK5dXo;~>pw3&ml_`WrSzF-q2egsV>6*#<9 z9=?;FA9Oo_DhzzN|L38Cx0Zx2)3BfEkH3D ztL`W#sevN~0WziHHOl^$#>R{`t?sFV{=32VEQJ8&(9b;VWp5>~`dkkQ&dfO&UF_Z&%}*8U7eP7>9)TZ#BD5RfO#GDe~Ylxjx39 zB`8|7dzygtWsYr1vwwF1WBOf)(rTjM-hAjmlA0T&_)_}4g^pP^kC5&P6h zNlA&G#NNT78VD~>^cgeJHB_5t7c8;0&AX0A7(|D_la~$OeFK9OZE2McANJumCd&gS z){3q#M`E=%2*_09vALLRlq2H)z<@X+5}X2R5a66Y`|h1fu$8lO<@MDKc)u~8 zO)p=jBz~`;prEEEJ1J?9Og>4{&XddO!#(TEb8?iYP9==|*y#%}VjxVQ5&P>-(@v*O z034wm5zJv{Y!mkF+eb+S7sFP>Dkl`2tYG-~F?!Bf0G}ZyU;|viNsUOmfiZYw1Gtaq zUt8Y}F){dje=x{4Edv`%&sBgP?7I83y!>Ku{eDx?ojcvkqd}h(#SasSbP#Rq(&fu1 z;v8+jM>1R@gr<_?n1+<#CMJLNQKL?0WyvdHfxF3x!kcBcSBJy#6DK%mhxW_0NG}LC zvbMoMUgCOIHLTz*8)?6_wWZ&_jcMdh2-&PzJ)hK~n8ieGGd`0|27C6Hv9v2Nu=7M? zj~(g%bD*D6JW>EG4S_IW{CI9q8=Dv8<+QweHzsN}NXVv5B2Qg3m#V63f%(J??X$NT z08K(mly*lc3sx$`EIeJYN|7dW7*_M`BUT^0hVGaaK+2ZBp zx?w}|(nJ+=!c)|i-+r-D6NXC-Fn|XY`p6kSevD>H)-i@J_Ui<6&BC;jGt3D6!>?6b_ z2`ZOmv8M59i{7vsuo>?f6B+6kln-0CzI*dVOGgKJEQ}rwbl`6T4Gjp2#bU!b>NH2%=MF@y{3o~c+y8a=7a z)b6I_f7|vdio@29o_m;Co29JADS( zl_kna4qd*@c#tq>t>K@a&JLKKO{jveuP%}v{yMmN>-dF1ill;LUL`7<82=7E$oGiJPH{F-&@t{4Kd-(yspswAETSH|Hg6^18^O3x;!lSNFQ>mrvNK z4aD5V>R0(xQoS0kgmlLq%GCx&(6Zn{MXLxlQrYl4CQ5*y%ga(C&ec85n7;TSw+l z{sepy80984Ctvp94A{Sg75?QPRkC5rGoux9BZS8#^qs9;g#vTKdXz#wZ zQ*e$FBnSj!Y;4SB1fjWPr3xe|r^CXvR{-yrq%Dd$J$Z0x#BoEiIpo#Nbs+1=BI2EN zcqm4W9OUr~|~6PFZ1L zbD9(Otsuoeq55fS@Csu-A8%VI?-?rZyvAM5MQrGiDX&FR?qf@6ZwaR!*c@v(O81=Dyv zK83hX!UxV10;r91`0Ro~Vs#%s#z3baptrXVC|dlv=2QDG7^oyWSlQ0lnqR$@gq@Y5 z&n`uAfq&j6!P%WtNa@(8tZTNT3k)t&QPH z*tlg2zLZxK&JEhJtMa`4X@RDmxWc|sH*JyqWcFLqxp5!(-f;`2f})?m-Ax}_6WF$# z0g)^XBUL4(yA>7b0N(6UBSwQn3;v4-V&S=YhT<$Fn>uYD*m(An<7oj%k~-u8+i}p5 z^#QcvK3MOb+OUE|^@#NJ4#JzndfX)j;(gJ{`PToCA{LqdwXH2hr?%J1j6Z1h9o@m= zb}=s7eGNXfc%B_?!dj2zc!5r6Z&=C#tokV(17Z=j5gQsHVh*bum{G z5^{1IgeP`IK$N0*WXAO+U{NNZ`bduT>gQzF;QYc`~Q3o^A(xG&ckQ_c3J$%xeG>K5XzKRs$Nl{LY=#&vFS5s? zqN{%x+fl)Ghc|n9onA+rOA-w?nlM_&$#f9ku<2mXnwnUQgR1gXhtuiib&Y$Rze!IcWo@{ePbyr&NO&2Ryv6-YW&#@q_ z+pxSoiTQi(`C{rdu~ zHfd^Y7y)S3UMB1#tB~KOi6TnKtwu!E;JD*{=c&p+KDnDtuMH91e)RqF&AH=e+4jPX zV%>ghMAi(I?vd3##%T6M8=@J$x3*qa6E;gwtaYk=XI(AL1~X!pHgebse5lM&o=88x zeDMl5-Bf)2%Z3l$x1k_wwI|3*^p?{%5`XyCE1~3(=rdgb*+h3&+TCy&5a-uKMHDi< zN?b?E$_g+&UHfg)Z5Wc3g9*)=(a|`i^7(rp?Q+C)oHk)nKm;C{-(OPjK1Hw{vAU#W zGn-AUJ6m++nt%T)+D?Nmy1E@ckp69;yuKazXT?1^ji>|6b*Wc(QY~hy2#eln)HxMK zUY$>x@PdnMfgHf$o@1@a;9fbA_^u)SSb-inEug6;TOs9}8x6FmEJ`EeQ;)9tlfQqhadfOp{NjFiH9e+nLhi}$0>Pr0HHHIh?b-(`HPx2h z6j!o=>w}@IdFq-BH&f0NgzylM{nbbZgKo`YlOk4?{w^~B!9X+>lok{mj&Z$s`OL?U7b-3f`|Gc9(B=L6 zk8B$;a>HA%^62P}p$pHchOI8|o3$I7$xdys-oJefrG}VTd0!RA3u(Zd@36*eYLuf^BBWPt&&a@C$BulRIm(Oi5U*Wb>{G z%g6qhXC8h0!EdWzDMKl`o+5R(u~FCT)jzhFX;(;=>XU?w;g1NhCh|^nblNO^rhYyj zDs`{uwEwSNKf5YZ-p?!=d1e2KurWX8ZJd%68t{htiw{}fC1bgF@RG*+!-hMO=7q0yFx%XZ+&b6#MdGWCm18B}WI@|cmRYiXZi49Eec!=*4400ycF3)CO81}q zIpt|*^|-r4z+As#@LSunsHb1GWkBz+HETwcypK_|laxH{Sk~HFap+-7?)??jBWjk6 zxx*ic@W0#A2Rz>{@ul^w6@7QR1!N?j-?MhD?C>fxtu zg5^P>`;6?+D+ve-6#B;&zAP_4cJgFR|3Ghn1MAk@Q}(_1jy*BPPVpByO738C+t%Z< z?Rt)1kqWE=Un}JdW0kwfyH5VAK=bLM0e`*+YqG2RpH}RD{?~KUe};?y`Cpy?`n3Q1 zO--XejzKBG%1uD*`IFmX&aDf!0!ro(f5t2N=bxJ>xveK)xk> z${N+$7jD|iNY2oy37B$gVSfn;dt$gaUWH_1TU+g0#=O#BvV+71(UI+2@#{5}6jhJT z6)EZ!XYmw?T|z}dR62g*L=*9eORhVkWfwE7Es>jY5iq)t{jcZN9bQfRx4_CoOBR!OxGiIJ^w}2TU{(xYx>_+>>B*J zJs?Q&+g1bhv}l#TWMtYBR&;&@V&oO{8!(^>)pma>Lge;e@fR+vrLS)tKtsw8L6vEF z{)Was51j>xG9Uz34Qm5H+%2%LfqTB@%B%oy5X2Ci@KBi@98)y?S&liqgRNLQ%FhtC zUD??QA-Y`e>0cjD5pXarLPrNey|LsVv&O3xXLXzJIV}q_cBJL!FB~!yfg#Rl-#1*y zZ9Ue;;B6tr#3@NvoyF5an~Zg$;ChdpwRr<*76ttiN*%z$#i~QxU)`*y{IyqjWG~02 zKXfS8n>hbwz5MTegUV7jih_Fe=Pk6h)F{AZ@CT1M9tASDFnv3cx=KYH+B&nRWjlYbh}ZoaBS8HhwA zcbZ3^QGEo+jFZT_i)gFJSpV>?Ty~v6czvpt}Vu|aaIp246 zVC$f;#;;>#(%>VLiA<$`U;qN9u}xr!9osK0EG>tLi*XFM4p7YIDaXbpSV}kyK~S;J0J3{|5$S|iqh|YW1EUY*hB8S2xlGW|*s^I8NpVn(;!3-X zI6<@ne|lfEc~uihusMCt4Ehxq| z_OxTDM7GnR*xx*w*$K;%V9chjHx={^`axLpAX!?#6qr$z;J}3*ltP{0$6O`!bydYrLA8ker^-@OzpY zRutYNJS90FjMh3k8=qZJ*WbwcA0jL`RzXFK zM=`$B8bF$-%vabkX~%xymGih!F4kk`s>}=cJD_w)w_%IHs?28kQXv3s>rV!DFxU9grzLvlAfcN#X0VAh z!Gym07y-403wX6r5Ir%3J46&7KGT>qB z_wQBT9{d$@47}$*pzlO%>^`ZjA1|I~324UZf?)?A;u1Z1as_%c03j$O8nfX9$y8Sl z{0|(G4PnLIax&PM(VLp^R}w@IH*6$M4AEq_puKK?Ve&PGIq7awJILU$7v0!9`A1h)VP%U{n%0?5PYl z1?Ju*HJonF!vknQ%K}N;7Eezan%6_VZOyb9pKCaY(U%VLYx^(CgV5d+)Vem`46KZJ zqWX^?hYuRGu_Nc5SDLVno1~YeiFy7cUa~;p9RFwwN;)*d-1Ex8a6sS`TmAi++|FCX z9*&NtFb_Q*-a|8MTTqm8n!UWVbkGd6oVRY?tnHy?PEJy&zPzN8v!*N{#;J)4Mh}XL zUY42}e2C{x+972mW@t4;V02JT1}QR~9z1@$5;UE?<2-!-op|j+T-fk%p-h7&1I%$# z0LVgcg2OQ>5Co*gtQhhDse!wz>nL++1yf!px1-=in;&W5h7Ja_cZ@}hH^!)lh=KWq z6Nk+`J+^`8TCtnCv7rq!J$8qA^Y-HoS-Em0g$X@=iEC3!i^jNdeK`Z!rj4Wv_ZtJ5 zqvI)ut2(k0h}XywW#uA7`=r=Hl%TH3G3U7LcJDU9!h_e?&yTncg=szlpzmHZS4G;y z)D(>b#LBW|BSwsX;2~hUhhUJuBPP{vH&Lu~$7#q|wrp9Exi$IO+Q(0xPz08xxU;RI z74aRM#itK5pauBZsU3@G3P>pdk-fdSftZuBQLs?;NaSXUS6#Y0$Y}P}Qkfw`YGWjK z&YWp&!^=jt;pKJd;zcEMFUU2HH5?%1g^>&xk$6B=nD`_H4t!E1M9J`*9G1Wk%&_Ff zM1+Mk)>{X3G%apw66^$^j=@$-m%ch7hpj_y;Cqxf+>nBm&C+r@!6D>sVQ&frZ(&%K z89FpdW!#YhKY;%o@XMlyGVRRfiY#6)=)F3+u zIP{a$V&mdCc0;&UL5g5&f{y(9b@xR(g*|ff^bfDbGwInfu_L;&(*Dq#MQBzhAEPh= zH!&e1G~yWLen71>Z_L5}9xZm9kk0EL`;F`w?i08llKNSAtm;~w;kPu=hcHYYK;M!4 zxSSlOY0^^Q7f;pIId;4wOBt+(cMFo?8?b&F`5@p()AaNRae=}-d+wYdC@CsxNiKCD zv!3RN+6@oG-5H{U5tb zh|CAOt)|xiwM7osqWxM_Uyp+P73VajDpXwLsmaNKd_S+LiCnf=z&p1CE%A?1g91ZQ z_Dq<7l9S`*&r*lSYqi+=K~y~oO6*~j+X-#;!dNw~7SqYUdw$>vo{ zd=NU(UXn0Glgl#4Q&u0o|Gafe`%h*(at!v>@bQcbge-L;dnO#3lMLN~U~}BUa{$t)?|nHZcos3%05$QIJL`im7D(z5 z4)6M6{$((nnyf%RaV~*iaR7M4n7NwEahor{-APDxSF^J2bG0nHZWfpfWo$!9H^ z+PeSoq=l?4n6C6nGDdIHxuuCu9zL8TE0LL*$${2;my(v2O+v}*YlDm~fX(odIEmS@ zu`x&ZaZo)h2;!xt_M%B3_}87Ydr9lB_DwlCvsit;;Nmy;D}~vUkPqa@=F%y^C#aa` z-M=sFErGOWg@~Hk|C~XaC!|AE)xGXrPV7w zW}N`4wPsbQm?PLHxp9z^_ov#sA3wV0+Z{rptm6^)M;Vv7PNM($9W$iFcFw36@mO^9 z1yjY;sZ%MYRJV=61(Vk9F6blz=|#GjMRAXv+uo)Hqv z4rXSE)~N>E7J`py4s+t2UHFfX`}2k7=3QZI3Zm?@3;d|ku~#aKi-koB6Wd;zpCFARp)RsZN_H>w=M0{G=4-A|fa#TV5 zf(tLqi7c_Etq8pR7fS$MzC<t5Ov5??ffTM^PRoqVyMk_#dG>wF;)Lz* z(WtCyu0H?GBRF<3<9}#lOL&38-~b`0`S5D9Dw8(WQejok`uwW5*oVvv(|h;qN&C_} za`#YJ%B8az+ne(f=j!%3@Z`yB^Mk$Tjr29u)VEhPu}(cf#HGG`q@wurlNwR8JqL`> z(M0;FHVo&DfQVajv|%iL7H>9U`0$rkmhby5r@OlXMUO0yzD|UxX?S>EoDf|O&q!xOH%#LNVn*QSa%2$Do8*EO7w>v+&l>n2 zKlB-&#SGuPeanayY7CpoDMU+l3r8GuD^n5E_JAS<6hXt(?JH`o&e--V*hLnovZjhs^pDI{K$r*|z-z)zv#u8^8?p(unvA;66${v=%iV-frVKh@gF5XE2jG^k zV>`S5SmGU-qOQE!`PB7k_Q%f5zJI!J^FMoXwhwN9fS0>^dUbG9jl+66@1!z z-z9xT@s7%)8*4m7Uj3^khMjhocvrnx#e7tc^2>v_)?ix-HNLl|E3tM+t%u?*s@&-Q#`^7@> z*2_Hle)j8fS(qQ=QJ+73ItoXEyqIbEiVYh^Qi@7vN8cZ;0p1;I90VoVmU!^sU{WT# zy?OTzCIk&aguDUNGUJe-x}@%~#ELx+jP9`W-0HYd=p-OD7AM-885?twrX(j5IY%Za z=Kn(WW3AMb)AzlGLU>dZg7XkZDh1Vr=;VvG320T&peRf09Xhn!WMKQ`=?epnr)-^0 z`mcV%aLZ%)qVo9zWQOAQ!{){`&rgD6N5t|egaLvX5^{;hFsTZ!{FG-uXOV3&P=LQU=M~_#F#Jc?>u!m z3nFsn?=P(V_g4C{c&lHZ28-!*-2{|eA{RhT3mL9A%E$aTMl`f(FNMDMoNg@f(_inO z?&E1yQ)O`4s`A;>9WFOYDk@%->s_|0Y*w&Wl&XF5JYw^YQBlWo9EbLMQugF^pJ!Ty z*BgzijecZ7>JIjkse8OF$b*>8g6oZ9d#gM*|S!GM&>zn@SD*dJQ;|#)J+XNHw@=e3ypIs<%-Dq7ThzOTXKN+bJbay52 zJ}nPx4puEWT=af>Yxx>%gfn~t(d6?<_YIOAKK!0Pno@`CZGkgql1;z8F)9Dk$wRBl zf#PWV)6&z~G$K>_^VJP`62~EQrKGHEZGEWUbQZ!QEY4Wm=@_v190?iB%jwGk9aI*% z1qBUsQtaDq&40qrg4j7iYs_i@(PtWaz5}?-g1705nE(T&YX%x%eIX~bHF0E*Z@^imZo)w#nT4j@(7QepCt*fs| zgzPKVV;>$oyPrKhYKZy2eKU7U8G%i#e;RRnpZ#(Ps<5|n#mL{qRlRyl`nJojXZH4K zqjiH-t+f7?z0+%5hQ{I5-?th(DFySta-yW(n`7zo;`nEK_f1-w$OZsfP6CbBX$_~T zW^Eq}7@GPhJmC1@pyWUU|DWVFWaP+9NFoj*=}>rn03)s$x8&Ic^`rx1Nce*(3D6eG zkAZG*>Q`^x^nMsUn(kX8^P6;B)n(R`!QhWSgyO+9Z@&;n3@5#Ko$^S`}^C{-$$ zs;+MDT#uitvGG@-&Pg4uf8ZeWuhkOkL2RD!s3p8Uo>CNM1F_AB(rRUs3SF=xFy=c? zu9K_Tc8X3Mw2Evv{>=CZ6PmU!Otf8QV{;P}i(tn_wA<;E-eN3C-*DjXN8v4MgV}I4 z&oi;EXQ*7=rRFPF)bn?b8r0C}_OT(}{kMyb_LeVCoPHllwYd6Bfmn+<(Pv0HzU{pZ zTby7MJ94BA9p=lz!lu&fuD=In5y~gzq(g4wclr0{H)sY_{-aO zF~cui`xFr;^QtC&weIluU(<@xw^!xvkQ3T~Y8Bcjfiy56)y?&?Iu9ji}g zZjPoguRMTBNh*LN<Dsho9$VkgKhwT}Ve`~N@aLJhhMlJC1K>-vZ3wU6g$6$*QpC9HWW?M< z7h8$~{RdV)J9_oQiW7adf7uX0_|MFlGf8z2-TNT^^&j1@rF(wNxQKanzUPx5d7Iey zzS$nRPDzhVUcP$%F;#O?^?kOTEV6wyhB#cNxa-`Nom~g-_>lj^3$&t zNUY5pO?N5Os}*3`3~}_lwOe@_2AcE5b%)QS2Gzt3sH%$6HIDFn6j6s%J}7qb07*&F zo}o`fpQh?MkeG;C-M~LL@Tq4{M~v|2S8l3Q?rH-QQWQ5*k>04AI_&Vhb)Lt0Y(BY2qSME;!AhyR<@>ad9kgTMcG=348b|2AdH0W|^H^=SH^k(ud84nm zwx%XUOG|Hd?zh5SzRQ}Fb&}NQy?FdsJXe(yEka|{Tdpx6;PxJ6(7P*diR^DWfme25 zNt7m!<{={&TMkv>?4n;W^Mkvzy|w7)1+0ar_wZ6VJxyT z?Xr%u>)e`e$sOr9^Xu?5w`7-uRH@ZkX4;QPENO6#%%&3_HhZj<%8+UO?aZH#xGyX6 zJa=b?$AGM*JEqlo#>(U^gA3Ez+86sC?Q7MB%X+Pn>3H_mY_7b?cy8lO<>G>3LK>A5@IU95(+y`*H3v6BE>wA4$EJ~Vp@%t}Ye1xAOu1n7( zNcTt{b=f7rF27&R=i2+s4RM;9pIYkpi@jy+w^jfBh`(^ncSjA_)_)M+%~+Ij;nVVPAvOHLqjn;K5UUT2XE96(>SQ zP*1Db@1N)O{6j+s-tT;Y-^CPsHFGmv-9J`hpvde2B#x;*T18aLp5K~ntg>zDQ2z1A2z*@( zaH?Hx^Q27X)QYZvyN8$WLYj2x@qcp?_+4%wspIL)xaxw4pp}yYyii>QB z@g&i@(0Rv$_byCI6M7+bgi0PCErqEo>9-)ng&jONnZ#r&k57g&-Da-e)RPbWbNza? zNbvNL(_Q{fEUH*AW2<&2s21_a03Go|KhyFGvkQle$}9Z>Z8+byZrg@G6oDS=(o3P3 z3Ku|H`bBy9UU4^9SMzhL{$c6{8wj?BqxvviePyYJ>?8FPM>JSPYaC*A)txIVQgYGNfDb@umQt-g$G?`Q>j5W30{0 zm`iBCea08q8&B~8J@=UP-XT__Ndl~wXo@-*V&c8m(*H;}JF!)7CS?|zlih%Fe_CZj|4a1>fh8NPix zeE@ROcCoqQ&xF}u07bpXL|GBT38_4qZ093c-qyGu{}Jk@Df=W&>}^11$TBl z?HdRhxVdd$Pg$uwB=ITUca3F~kN6!mv2JWoaPZI!b{zzT-w};NYJJTd8<&jEaYz-f`=Pc@s zJZNOe$^H61hhb$++Bc3jsOP(M(Gb(N{kXVi&jJFK=N|;6{emj=65@(5*MS0jDxNQBy;L@O`Ux z!3Cs?w&r;oqnVx^JLY28Lsz7Z5zrF3P_Ag(moLqpnh>%B1ABEbs4=pE+Xt~54+;H) zdLq>9)I&{FQ1m!IV>-W|np?C^?Se=wC=lxmh9L{CY+i_`CZ_M%>n2CIc%5K|L@FU# z=8}>lHb>!>t+lg5Aivd-yNN26-Gu*ud7_N8wxJ;_OJ{I5k8a+uGr(s5+%byV0WprX z4rh?4Px1s!EG(|lkO9-e7+}yu>hM8%xJ3g;Mkc^BrFNp8Z&kcI^BmFDQGkW14 z4S@-LDB@p^w`;C{;$B}~e%3Te|De08YaiGV?1Jc~nwrMWCni>~=98ZfE6bf_>IVZ3 z7)oTvJAx&Z!q`pu#Mn+k*y2A}_g9|n$*=v)gP~65!Lw)QloyEKK0Gez)2BYzKx48E z*XtDwxZc#EJ4QKqS2RyOA2Z#s$Wy$pKL~1+n!UsU zY!$$`ImBXfI1A`}YpY<$AW$v2+z_r%b?q3%xs%Jh|DZhgm9af@0fE+OVsd_4`xY^= z{aG*5e#f6+ZtxV33TbH=+z`-FmI>ehf=Z;eBZcGg{v^CT5N_E$I`-GFVOV-W2E)}u zV476VVjjhMoNr|0%Vbz^*tD|5@Spw)iom052}aR82-YShHmX!(@7sS|brm;Ilze^s zEtv9^tF^6E_%NQiOe=vb18p!XF<-W?y&8RdpT?eI?{)C^#k|x~{ z{UTH2v11c0PqA*ZvV1sLQQ+vw-K@C6WC1GzOj7lJkin9@6~>Ww?AGon5`B_6}+{4LSw=# zMZR=Rfus6J?XAl($hzi9U?>wPCZsF{*rc4d2B)5yG*Dr32!J0F4%TID#X8t{`~_$` z;}|Ia1hrr-cwY9SB2OKYJfa_&ceD$_E^K^`tn|(&w#PLZ-9Lvgs5L~ej`z!QEN~>s zUkf2aNf)$$W6%YE2Rz_9iqm|*zTA)o1C$li)Vg@o{HG)^0duZW-P-ZBBxFqs?)jzZ z>yRzg)z&V>tziBjC8l`o?a&BumRg45w5SN@9->D%L-)-cts;geBPSdeb&=u{rKPsE zwQ$4%MY9`wZg=gOUEFp1LyQvfOsYAqOg<4o9R>z*_PpDXQ9%H6)Y|MskfsH9Kx!Ar z9LpkLsd2Pu#|SGk!(w<5qwpVaF3A}ZZUL(NUxc*K2?))*iV9vUl=e_+IX#5Y2vX9d zC7fRZw-VJ8#|7)c(!zp}Mc0YlG#@!U$J zNyEJUH5;)lLQ6+8_4lZwNOT%^9D%fZC?C_5CWndLevT3*+rRed-~Rml>`JkWPu+g@ ztpEC>>v)lYYP_*b{XhL)pB+Ja_g>rjeex`EzzPvrXJ=<%G#MGf!{9!+ywR5nU5Mz4 zjBUus>(!_`SkNe%QA;tb5waRH_E&6gSn_ddOwU>D7D7$ts2($8^L=e;B*P$M_-Y`z z07mMxxQ8)cN=kpfuCUxta(b`Z4$*keCH~C?$PBPKI&6bE(k%R9==3R=Q2hu2;wU0v z1~BMw_wd+XX!|EM?RG@af`{Ik7mMIaNKSPK5y|310lj0tOWinAWg6X}Mek!(@IVjB zGr{VDe|MvvTvMnvP*-Mv^UI5S-@F+^LI@RQt7BuOiDYe)@Tz+G5(`A%Z-uumIP$!2-aK{wLC<#$$fd4ay*dKM!KF*s0(#I4 zatLvRu>iONFrqi(=VVyK{}hRR`O+fHpqQjReDW}2fReyKT2k^ETSQvx?Up2xWC6&h zn>BMkK{tuKhWlA^{akuF9p+>0r-|@$u=ZjBK^#sonk6rR>fxyxwO+`~_*X-#vAsn} z32ozV?9`}gi) zY)F0{Baytkb#$%RgaX;MJ{KfI@U&?kkP`q2%FjA#0e8NGNeRf#qsDF%T``6F$aStS9l>l$94|hZt`1z z{xgpmB~R$s`A=O(1zPUjw{HdH9(p8S-(Q@df_9b)9@PTX->_j>OlUZeA``@h&wwZr zhw%CG#fvOM_F&-O0hiAM9s9oCJ(giknpLLhqD9ry6CV)uOfkgU5c{_6)#F7?9#tP> zbUJqvL}hTwlvRdoidJYw>Xg2@s`OWz5ITMR%49`7%5ao84k#9hMUfg_>?L50y7Q<^@hhaBSr<$1P~+R1~U`|Is-{a za|CqH*Vq4B0 z0w^3j=}f8wbpis#ssfd6(*OD#%)Yr^O%UXIZtn%Rn#F+9OR$QDVG2V>h-IZ9&&X)H z-tM$+T_Ogu@#fU4)rKw&?kQ&NJKH(?uf%;d<3L~~yPo6}`+$0#F}8YCN@nJFSoEK< z$F2!`TUU1^Jp6S}*MfKoC|Q3tawI1h4>{dLPzd$&7z+mLuQOMypaCsjymMxj#+kFq zCW>mNN&R#&6M-L5y})%m`#0Q7J`uYG&H^N@WxPbXiR6~*Id3XoRlDQM;sLvQd_7N{ z-&wuz%*m5IJ^GK3miDZR_Gqr-h|l(E!?6PY?&RXDYw`x*I@nvun;(9d)Ikg}eFodp z^f@o1Zy5igRTpNsx7SYQRKff6^?Z3gIDdrcp-V|RZZvI`K834PtABo>qDHB4#rl$# zVYn^ToFKXQ_;Fv}D>y#{h(W(Z@XugPa!zT(oaN!PLmY2eTe24vIr?>W#)KQhKbdY8 zQx0eL2btKeWn=c-VKG0ZyPa|q0Ui|%GK_=roHTx9HSfRw#W;Ef265ZQj_Ka5@n4IG zT{|Ayr5if{k+beilWyOsMc8L`Y>o&`D6i^5Oj}xyTazVr_gleH25V)zy5E|&LnmFC zOYd6rkCAye;%GM+sb@xMC1qt#_nTT+V3*@O++(Z6TTe10j7eyhW8owybr^+yQ=*#`;TZ&rSdOu)9u?ph&k*X*)FekY+Gb1{G^*| z$nPC!`^aguqcMN{)%E}Go%k*V1n|F?lW+?B&+GriHRDDOQ5ksem6Wt`-$53Iz%aN( z%&>PYTV*Z)D(IhGoqP_;BVA?}|5O643u_j}G2#+^1L%$U)*`a76RoVuOH1dQJOk08 zx~1;|C{1kfE6r;8rgY!OuewlqU6rx=g^BXA{_;Kl@Skw@g8v-x!*UnipK>tS;Jne< z$M1QogJs&5C(r*J-#56g!^sQzLk~>tsoUzWymm~x_rYU_j%|C}miOg&g6yj8Z~X5T zwu`NNmH$Aq@YsV0uea@v90UrBL+`A{3@kV#1o3&@cOE4GJd_n4>rR$5u-Sd_-UjC@ z=FhP1-BzuQSET=5$7qMn2m)5N-&Al>llZxCgu;#->BkVw_}KJGq;|zA>grQ2gJn2v zUK?&JK%5yC;CBAKF$ck*3sZu4{#<5A$mfFx{ocGotT|*zVo|+_tY#t5LmYg;MUR{w z9G%2`FF7r(kZB%*?zT05l#6z8{=bclefsmon*IBRP8F&{-8cHl#oAvU&*pE#`q?2DMcD=HbGz19z><{QBr*TLWMbTeS ztgNVndf3{qAqk_+I@fHWr$@|bgSZ-GL?48RxthTMcp&x^U!B$&yR*iWDC zsK3~~+jSjOf9fbaU;#iYTlNOQ07%6ID}seeP?O8L=@orBJZ>?p21|-4DoVJE93p`> zw877sLLtaqAR`v44M0B1s+&?AmF%4R4xR2Q0>3BE1;7cV|Ud2x~b9g+lvKitTP zmX{s?lpr9z+V=N;X5L^>v;h)1&v zb;#Pg{!X7kZ;xq44FBsd4Vzos%xAdM5(10<5gj(ZaI}iwMigqPs=9o5aei+6lcJ(2 z7%WpPzH%wAnbh4WP>_4y*fvX9ipV^jrp89%zA&Su^+U|ZwDj3&6HHcyOr*rzTjzy8 z09`-*@gNG>JQk+Z;K5-B4sam+WF|3L^w5C==eXVcd!XzeW?Jsc!!fm6Yp$-PmF@8c z>evRL7t8Rd? zPZm9UC8ws#Uor9Qdj%h1N)A3W6`eLiqSP`VU>XIsLJ9{LP4Gmf zH5R<#DxCb_Q&Izd+|mxt!kBfiwDc7qUy2$EMc*3b%j87?&Lf)H2J8dM^+|K$$$lF% zsU(HmP?XFcxpRUo(zaIWf*BzAga{n4cXz+YNQb#=QN4_o_r*J_T_398!py6-zJ8p< zZYu%o!3>YD0TC1O(B-n!m0H%zk4}6eJo|$O7qi1);l1g+eI!A3a0fsp_51YgJCx>1 zbq+`qg_T9hCGI>`EHw)ZDQx>ZzU1@#L<2k&7CQ42xKcbJ1NYp4UT3s$VR??9A52un zK?+946s7ji%)}rv;ASE!AZunD&jajkKp~bpfGDn>kiXIJe1I9cX-LgEOzH(#1}quI zWW0wrB5cw1? zMf4aQ7FPTI>l7wx$Lo}o`pOKLhe2`|Es>Bzaat)U(D%|(ujKuRJRSHZ47^zkoWS&y z=q0CX%_h$lNW)6xXk3v2GSgjN-`>q8{M_mCCYfc{)*}ZE8jYWobJZ^re;r?5 zod53RCh!N#{`cbSBjXeUZ4`qgd{;@&y$8d}8*r4zUa+jZxZb46lmh(J$&=!`xM2tw z>$>A!Z?Vg5)UsDBY)SoP2ooNWEO3{Q!b^pptEyR;l_2%n>v)}4taPdzc&1^bn!ttA z-889ilX_HG9T6cnfQ|#|zC$T)!tPt;?bxAH9iA})M3~F=3sDE^-`)KqCmtzyBHyoD zbuXjDO{{)eO~yb!_IG~U&;EV(ta7|yyd*tn(4nxfr7Ktd!Z@j~*uaQ|cUAYIZDSXu z51EFhfyv2`As*~#uV1fT<}=q>a?TTycrP|v4I1H~W;iq2=#}f}y$TIl^83VL;J`F_ zIIltL(E^nt&J|aezH4}v6{R%CM9=`Dc>-gG5Y#KS-_n>0a9bVj`)<9TuXg#JJ)`u- z>lXzg%b9%|2R>O@J=7F3AyhvV?>E(WUB@ymS4;=rD9SJvC-oHHh`Yx#0XY8?l-4}F zKWDwDD60>t16p_-)B#@{?CtAUOjPXdGQKMVuza5XOA?RQ0qg;?ijRkosacq=JbuX@ z6fC&KPSOoxtS%Th6Qx9ia?babm`)k|?fg1_QJ(vXr7lsz#|ZYdo(VE`aqoIo2{17r zD?`f^rWP z8d}fSUMo+#6n)XTs?l%Y_*mVEC$X4ApCioBS>%PIF3?Wpjr7~fb0=&((DC7uLoMj_ z%jT&XY@uP|;w~&H;$lykLfkYc`a%bdFs)1oAEr6#iTpLqseG}q7THa(MRa35 z@lcH+KPLXk74}3hzbut>$|ur?7tr!T0=iVViBiO#2a2K+>Uwd*R~~Fzb9y7Sp(wrs z-0*EiT>7IPWXA7XuJzkDR)~!{4&7NjP=dM>AORn*gW=)u?A@a#yT~xl?DEQ*&Ca@L zkht7xiZ!3{jh%XU8srX|IBVErVl0 zmQQg=h-@EOHN&y;@=PeQDn^KlpMV~@qM>B%WFA~zB8ExI1-_7#=%f%j$7p9moL4x+ z*^%xqzHe^4Su%dGY|_nW#Lu@mmMRxa7KM2DL(fYwm}XSSj6tl$0K)}O1lbSBLa(8a_p?Pyh${iUqih8iGzMUX z+w0RAZfnjOe)PzQ(FcXZ@i;{;gK3gFirM4GecwL#>-_TaXV2vKI?crP_^f%6`;3W* zJ46@8D=Hz+g8@f3FU)gR3^^#STjUNe2}iak>jmd_)@mQw$q{=K>N(xf@_$)5V1Ub% zF3-DP8_5))I0-v^n3HsgyafAx>_lUz8T=9hJZjI8p4I=ri)Cu>Qf(NbJMRZO$y2on zw|9n9{;a+ej8Gq+siQVW!OmbW(qm>?X+yNwH+M0}yV_8MLEH~}dx)%`+S;tip(f9d zjc`l-(=p2uJ1ArECvyTb1?a>=0_PR*iU|`8gEmr9p(+u4C|71Gj2gAI<459x1>*&q z7HFPD^>;&tZVlS?c3{LpIh3co4;`5@}tv< zL_rB>oM!#9z@AvBz_7Ayp+XTN-hfIq=F1$)Clw9Wt9v31WZ+trX_M_0nLq=L$pp&^ zQtc~;!d2#5xXI88`MkP4_8xeo`hZh{PE4Tcpp1KfYKx*Dw+PZ=j+Q#MwzL#AXaQSV ziQNV@MFq83^6RTzBP-YBEF%&6=+PHXo_rDlq;>pO>LbzeeHAc-5Q}IqeBTV!D_x`W zZ!k5B*dC|YJvhp|134>si9A;vgo6gL<)&|{BUhCx%`ncJ%8c^L^3VO0?I4i;1G`s6 zB#{t|*VF{50vZZDvT%Vys)|yIngg{KMWOKIvQt7_bfh5Qh?Lk(Yz#gCEkEH&LxaSC z2v1;4{6oP&kk_zR)=<{nnt1~#oxOs!<^NY?&%uMgbFb6wCRjpE1rkSkhjkLOcD(VO zm+J46xkpqXO3B$Op`(we)xZ)5GZZri$$As6d&Wgp?SNY1!OhylOFG%!}e%EZK# z4i-aQP6Ws`;Haei4&u2w5l0bBF>_mpDZe**m2I_0b=v@HFE=9A*s+s{CFL2i`fe2BIFUr z?3GkLXvl;pf}!qrFMMDj36q$a9=mdV-`qR0Z(oIXb|N}soUJK(5T7^|?K#7}vP%bA zFMjq+5Hl=MN-QdU`t$-LNOqCd$_rTEacV$xRF z@NdE2eEh=Kn|}TD0#z(_(9+c85TMm)z@t-SoTB2rM~^T);gJ&`@WN-#BW=&)X{_Zl zXRdx<2FbzGQ?MEpf8EsNJUL>0BwRzrC18-uWcun4cXbE?tef#N7`QBCon zW4%`8Bl_(j&mR}beE2qD&c!R$8{UGU{KESk!0nsIRVH-VF>H_ReZBgLDQUO@riLaw48G4_3{F%OX0rf9!11&YiPn|NbYy-yNL;rB~qu0;&c7EvY)9Y%fjD;j@H)64W- z{aC3z(Ag4-9s0=j+WG3+r9QL%2MOQ?hje%X+t9-?1zk-pf!Vx4TGOp zUi)V^>GMmJevL4@^QW}p@j9j{fDZxV;)FL|<+AUz_B{4Xq6~3TW5muRM_yvzNFB-n zZPKa0E7_QZ6Ng8&k1Y0{)H;;dYzB?lmG|3#BhEoN>9ID{l9HwQ|v|Wy40wibgaQPH1ay(Q@mo`qKW{rGDb< z_wAc(`b%wHwJlSr#l`sg*uh4@aX+?A9rjeF_w`Rf!7}D4UPoKe*9jBr)Kv=H)d z*|G(`hlDO<$AG+z%;A{$V0_225>Al{PyHoE zIdSg(RJR!!Zkeq!FQ2rJw2{WX{gG0?IVN4*%;j2r5yD?&@-j6RhuaPxFt16{y2{De zcu$(M$LiOoo11%uFWr6T$3HUni;6Vu7G~+6Z2fFnVV4dqfGS5~x3~4x*w_`_yDMa^ za8}iCYSeSupJ0Eyu3~GS^UBb>D>Q~Rp0m0vRINX(=FFZjc``xDT-Hn&(+>)t7ejzHSP7LxtmdPHdK z&EfI0MT->voZ0KE)U&dOVvVutibo!=SbN{~*i7esxo#Er2fM*vuB$DX>FT~dY+=I1 z<uE$_1Fz`x(APL|EWvmVB+V zqOmmkIB`?WS}IxUpHs_xGdrKp6Wa9G(~Xute?CWPv!0&&kM;#yw;tYkyyovpbC90^ zT#T2z2@?NYd&HVuU+^}tJq$IQmeVpw*WY@+?V10$06ObqjBnJtyU8$i4Lq&f zqtBn8HT{~zN-KNSD#ZKv52ge;d*6x(KI`oC(q_*#L<9mwjKB{}n zl$kwPL*l$#R&L5=t8m-s0b`pgRYa=}-5WS(F}mi$rE4?HA4=U_ZPWYLsjShtpL=Ov zESa$2!ypLw39Q>Kfy|qdU9A4|T#a{n&GczigTU6BLO z=HYc-lx1X7>4^=GOwb5H(Ogw!omeDHf1)h|B$mn?b-ja_{o?nNE8+V#AO#hTAF8ODzWq)2`aOT+PGX0xL{Ep>jAAZQ-ZPDaC zz%kRRv91omCFVvzdj3T}A7#TMZB)tf?Qd{rn(DZ7Nhj>L4-+%ydyNZrtDCS)E>!yA zUG3yWGo!bhdU|}>3%ko=OXvBuzlie*_-$%QUHa@5`JABWe6t9&bp9i(4(8RaII3CC)Sn)Cur{ zY9&B2du0GvG9fh>AXDNU%2MELv|pTW0PV zCR)((yhAV->PBgocqV>Pv)V^Thd7wE6;TxxneiUs0|#sL<(BmCuSMbzfq}B}5F#<6 z1);vRXW!!~`Y#UJnkOxBxLj7@mm|Q+Y^l%iy|n(@dvCRAQ1 z+L_6G`j>&fLa6kvX7Q{GG%VoxPeive#D^r6@?i!*mOra^inV_E0$dBHi6NHI zNC(|@LSDKsM!N$l;6g*gitF2E%HICn)xc+>O1$;r4Yn+bqet(wE#;g>>2=#713a6J zIlWYKbDCvIeKR9`e>&O z8}gb zYlS|{tvF4hKAW$JxnEQnI_PH^PPCLFN1_?j@2STkjZH(T|_KOC^|+B zm+I|SDtUcJwDj!ey<`<9x z{BfFcI(;Ed0_TnNTAT6Yg_(JT#K@64Tq;H`STP3l2eH=5*Aao#~)nu;N83N zo1#gExeQCJF-E-qb+Nfi1i$e|YbT?5wgwye?aIu8VOw*6A&oTw@C*>1!1E1`V=My* zMPiC2aFNv;x60hylx>r{pO_YIDrcLCxbLQ3|SfZJED5Yy-Zb&J`g zu0AYAN_?UI6i}l#sE@nU2P!ft$;k`W-y3L`#C!r$_>l0EI7j2J3jgHRQOWLeOo*yN zNl^IcQR?Z_iVTT3cI~1Os(}aAvYDAwHR&)`DUKIc><0 zAyY&L4I4(ExlUEOy!_AM-KyII6Y9YL+3@0@ysNLzS6v8qi!o{cUOfzpnEL~v!_~pE za$TW{#l`i2w6t3Lcklkx(vohGLNjpd*x(-Zd*r`ZYk-oSzj_*jwBtnE_$ zHyIQM6c4|_X+#4dOY`ab`T1Z3MqS=SHcT^Q^*pz-nOJ@`3CmxL5Qvm{@Orp+10^6d z@c=kEr9RdcrbZ)wuG*L8d~}HtTc?KmyG3ZAR7>^QtpH?bK4AzrX-_Y>K&sb)+*cHU z7)eU6t%G!h!L!IX6_xAWU(YPk<>?qWQ1(axgnpC-g3l5mK(Wa^Z&VL835{o1i1X%pY-q@hBwIA8l6wT^*JbLU!t?cG*vN}34$iemAQVoj+M-+?H4UpDr{=-?3;P4 z#9`8o9;;pi>BX@n0DHh~Vy1@I9II-VimoPPl*ui z3S8I0N3X5iPqXkc)=QR-T~QR~;RO6%14#qLn;w#!l*CFpPNVDJXAp0~749Po)XH}R z&f^QNIJasRGc0DyNZotc=AIa45;|HpXi+v36P&5*&`T08)D41mD%YH$sEJ z0FY$~>k{ZA;C5hOq~Jd}VAo=mBLahmX$12C=pi0ILcJMZGlmllZAb%P&utW+o zm;B2c{iOpnJe#Z86>hI~h4VsmIS?&2XDf#Bof**FfQ#SqaGGv#?khgy47L$HxxYAb z8N~j=@4D@;o$7x>r(eHWL{!v$Osj9)@6C^xTTT;30ji>dSPi5uL`GUHUHTO|VBVcO zd>RC;ZQ380ACF)rKqaI}6({Ix+-(f|{9|y6cw_kf?U|db%N$!P3#7>0R^^syY4J?` zR1aWV`Hm0PF{4D{V))qX>Cm81_T!3z!4D$*D*mvzxVV(m79eQgPVibho@G=0^S9bO z-goidK-rUpL&^ebrY{q`3aho{m7^6N^r`3?=1VeTTA~z?d74YF?owp`V{yLR=SV*+t@z^?e%SQ{!LhWS!g2UOg-*pH)= z{Z;Uj1kz{rMO8tQmB~`!f191oK?MwU1RBl?co;DyF*8$xxrMZX@HtXV87rkaco-S| z*f&f)@lc}uRU{~6oKxNbu6ry|4~}De4GUKwkt|vS%t2itcr`&ONW1={@03|oRZ~N1 z0Mq=7BdCkmg$Keq36>$*UGSDDDr)KM$muL0>C`kyL>9U$q*RbwUPK}&DcvtCYc~tU z7*)|`>c&i~)RG3l}=FAH)7Wr-DMfOuYBQrKidMG~3 zdyZz6mDk?&RljrhF0gCX>C^A9P`mv8CB=b|ye%fy;nUQSnvrq*fM3X?mGGny=tRfMw=)2fvV|7TYUBku#4~Vtw|MatF72kzdW#un4C52Jb(qI{#Iu#J7 z2$sf!Nrt%H+O=1L9nK&1Ixgq`dU`72k5?`@U596j5^1wPZ!yFw)8EKDgMkG<^C z7GpVZ#zkOc+^sjeB(ryuWYrp-0f|i$J?5lA2)oZ09B8gFlo}Kc{)E#h#vR* zRp(b(ek)&fZ}UzxaLvt%qDx0 zirE4Y*FTT?Q}hpF7Sc({ef8ExVH?MsNuA*nW2o}lkphgq&{Kc+o!10+0aaLA8y7+K zh-aoPE-8svY~ok*mdfH^$X8J-c^%I&JaEV9GQ^0-Y9t{<8zpuncBh6uyA0mN^N<5r z%{CL$@nKzR?_}}QpIckQ^Vc%jRF?Ab@?yy|P$D}^V)t3I22Ow4ydEV5vj@IVR4 zwU^o>c+oIr-&XxkZ~wvNf|||7q1i_^R39Y+gF*q{XTT)u z3ISH=dQ~q^Oqj9bCaVY%R0sH8irGxt`-dSxAxwc!!Dxv!!Gb0>jGHuN)Tr$Y53hk` zK73AdEg>U=*I7Ecp!8Bfl#y&SUqvR5E$h5;S=N}vL4Wn>>^s#cq{d&VoidPpIExZO z(1#-SM6XEpTvBqf4+Ax}%#{q**j@N3jrwNXV4&bwkblUzLXG>-j$ZJ^Z%E)NX~EB* zU-JA!AX6bzAdx9Mxj@gWs&q(O^Vl^y<$1#{ou8TcZ@xjRNO-bded9}rbq5X|8m;VA zG?CJ`Oa42_x$;_2kVs_09JwdZP{72f#F}nyqqT#&VMV=&Esd(xfNtFagP>IE>odh0 zq_FTPxDu4ORI5y^Y|@!LqMG220D9U;$YoWisELsq02L64xcu0$NRe=Rsh>Gkho|@Dm6_l6%Kjf0z7nTu#GfnnmD_jUru3xFaK&;(Kp`b*vpZqQhPw@<$$JEfY!nd zKuCSOj;Xa8rwO*xZz%UuPl(Pj(JXAyoT!QY@o326GJpN`o%Rwmm1agv?6~cOxob)u zM2L|P7mKMWR}g%tS1&d@6tzQgbN`H=yN~Rx)TE^R`}f^aq%1hZO-v@azP?Q@#GlTZ zIr;CLu6gy9{d@+Ng}CnY5JLKv(UU@u4j7Y*Z)hKzVIeh)2dy^lB^-%F44k^Nv$3%3 z;K-?pfUWnPE!8=F7Ff>w`MbrFUQKW0?&CF{PYKD{qi^%?)ZVsVlxpGd&M`z*igD-MG7--Yz!ENwQsGzW-iWdSGvp1Ej*Sv5+ z<90H$X4# z;cLdYy5yKq9iJ0&!U7QugfUr7*ZG`qNin-NF?j-`20pfeW9hSJ7k%2Cbc6T^^zVu!&}Vi@gEg0Oe;lANO_ zN0odiGLl%IaS!fht-AR~$#q}~EsS0t+P%MjJ+*Qh5kzrKux#l6n< z^_epp1`nQNXy{jWrAgYgnnyhp$71Ty%H3(#KHq<6`SN3{N2OO@u`cqz*}H142+JUQ z$Uv?ex(q?F|8Q8pDQlw^CiLh%p#0A2$PQ{PiQ{K_5J@D!huXU_j^ZCqbAI4jPWM5f zCcoEqfuZ5Y3bR=z*Y=C0Eoz=H!QIKJbCAZ@0=snKOWi6Qu&ajBh*L@YR}@e{M8vqC zLS1KU1Z*@Rc=dyfuGBaXfB-~T`x-hqE1Uh_!1m^)w#pEHIDqv$Q#1^nF)I1`XM`S zx}b2DRVvKs*HuvRJp;2wLEbW!$>R>zzIh|M)&1N&(w7jw+OeYebrrqnfl6_D#DQ__B3E>z#YwNJ2|XwmGT#ri`y z1w-#;{8iWj>tK}_dcU>e3h6;yrUybrd z6G-O5kT$oKl5;3LA=C(JlGW#5*rl6Do+@dm@~qhh!*toteybM!783DgcJ8-1DiA<1 zH-jtZifi;^TipMlt~0lQ5ZLquIto?4QKVY_;7|2C<4)7N^4t|3(@6JN77c8o2_>Co zB?mb-01sT+2*JG!Pnj(fYQbJIu`}a*}M zI6SRn+O%oIL<3_B0ut&uL}_)kj~)6$W6C$DC@zw~Z`yjMzzD$^p0lcs+3M z!UvA%KC%b~Rb;6i?eM@BPC!mG{`iM2K7h5v7Fja;hcsm~B+v$#E5o>fRGZ z^v^Aw<;SF4*{WeJ|CDF85<0f=ss^*fDXy>e5{oEW_2q>DiZr8Tqu52_x^RS{egtd; zr}pNPA&b43o_C@c{4Mheakr^ z(?hc8Ho-y^gS{ae1rS~D%x3rEg`(ctE>hD5dwVigsi&c@phdveI{(q5<47iMu2NK1 zhQ?c2SqZrV>`1p$A-ULe*|OA<_CI_2FHaE~UD>rbVAJSg;6G(bi&^?WD%6o3@8sVw;5r`qFm4#a*vtmp?thZmMRrhtuP7ce)()7fXlnHWj za%0D?qhf^Nj3Rdbo;_>K)klpw!5x7*=%h1Z`^@dy|4Qmqzd>CeBau&^9jNF=u;dj0 zZz8Gc>xor`wF-EkELFhw<(GHK&7+wEQDFeUX>sz@DK8(NUL#HK$gL!Yc!!QVPKfk$#)cF2ti5aAeP>T#$O9Ha$pPr(j z8#ZmSQqSf8aRHoAF;4?kO%NiT0eEnW#gVJ_?OPuGH6U~Jm;MKato#;HRIj=DeLr1& z+<*nU85|~b?}_;~@1%^!3BSVb^h*!78PSmGDKQKU47~B<2{=AaDeOIr_lMMi!vMER z=Jk3vr0Zbhdu*RY;wR3E9Ny=izj*v=x(X6)9i6IIE?>SElRg-O-AH5t+*!ao-1OXP z?)K*r7CX$56Rz@Unxqc0rER4HZA+<9b((MVz@Qun5V<(FMs|M7<17k_I}LKZB5MnP z#Xwz>C{oD5`T1_14oZufEAaYhN+fgvGdV_d9Lp|!SMGtWkDIl+glNLD7rnqd6QVGp`Mx_uhlkYscsK@^Y=&%?OGE3v)7n^W zOlL=o8bk?B<0de04M=u@jZ)`@?v19+O#h_4w%m>yuczhZ7nu+OV+?4v;vwdFobb~z zy;N}TBtHCA4&+k7Whwa$B^od*ef7xd(C&>x|0`}(Q5E2_Spsg2Y>FeYDfx**H9ds7-RfLyLKqPl8mu4-4!#Xq`HT|Hfe{))-1xZH!DYUN}8 z*zUvgb?(y8-|x|_+ZVC_jf{FXa_;|Zr-)JG6m4#LUUuyi*MR&CHCCZ0M{4Ko+tVM~ zy>>sCs$%ze$|=RZJGYC5z`p;z zd$(?Xcg|fRFzKWdVtluQ{)%X%EBkDc`=1ZBL2ph7;C{^3&-2;RejZ7%573<@@|{po zZ)R?A(*=D@f_-ot#U}E8E+F&Lb5g%G%%HKqgn2P6d(y^_HROQCAbZ6(1Lh*ZkU1pc z08Ws9pkMTb3hVph*<$chnMy2F`cM1(I1Q%2`+c^hIK7hR%y1&-_so^j#v`X4!AEad zAhO!AI^Xl@@{kL&wfL`q`m!=DXV2e!d6Ze~NSnSzq1_@ZWn0>mrTMihhVIi#Y?v8e z_E0*IsF+tS@EUv`xL2=-sr2%d%asZ9x?Dr^T%8*CD@g4@P~Ie&@iK0STi<}i$xH9m zRw#vej`CB`4Kiz3qWC~~vq2ShQ$UeH5WUF}+5GYJ5{vbb>oZKFHZ~90KFa@`ashm= z+zd5C7)@=~mql~0e3#(UX%@C+1_wqG0o3qynjhJhS-LhRNz0>+)UQ}uhua1eK7Tl? zGxm!67zY|O8oskeB~86;^QEX*9n$;fKRd&L;dD96>+w~W ziC6O$5&~~j*7@hADS>vLx3az$$hkLesoOjrvXau~nEi87F5I)Vi=Ml|L$vtAHLB!? z)>5%U-#(J*BP*KgB2)KhVn4$o$ykU^DzdskSPPw2+mhBQ6$pSjkIhL>sl~WOyC-sN0A9`OK0t+I1>YEpC~i;s)`dmDeqN zJpyZ!w!swfnY_7Waal)`vcEX9e)k!qv^41j>{ym`R;u3=y(5o3u5ZB0h~sH8*4>mb z4AVh;7$FWdEP|***^-bj_uED|C>%EMT5@u7#=FTM%4fLTsN#ldC@Kxs$a}3#MHMEB zU_63F+{FPzg^y!`7&R0P)nVnCe z^x=GxTVt)=Gc5Rg**Gz=ui|q;dW{L1q8xEwe)5y;4KzphLg%JDY50;oXzF{XfE~{p zzKm9Od*eRc>vd(;NIIXqPfpuh#Ad(IPa+&cp&~~)DfK`ZOqQTiU$1swdZY2#y*)Am z!xv2s{`Bq0^E?}`9v*%Pl$}6Gq-pM!8#wXE%yGd_90rdVv2&!KOlsf6_R;ei{T##! zHYXR=!&i=RK5g|VskmZG*1J|`WcZ_wEMmN-A0mTE)9KTv0lOiLVn;Rqlxe6w{j$|E zq~ueE?t`r}b)1Ck?NzE)AgwB?`mu$f$u)sKXmc5UB01cjXK#PL^2(EyW~~*=c0BgT zeQ4N`>oyx-xwhFcqn(}Sc}!b(zIpKAkCP^~zO=9t9z1HhQ&n(l&{@W6)nvAI@NCZ51BscU;XG>9Wt)s2lBQs+~%0J zcE}I!t7rEP|8j3&uBuaG&HTWGKV;hmdpTr@ZvJ}r{RQ7?E`D#;FIQO+ZhOkq-n=wt zt4L_*mZ*J)!={R@h>7Mh% z#D`Y4uph_2XvjI`I5BFfJehXp?EB~!bP;e zxka;cbGGi3?7K2$i~3ZPT;D$Z^9x>`!=IX2xIGb=_wV15dGX)o?y;`t+z{!&-NYk_ zigGeTI#%$1K{r~VLS6QL4`D;P-HSsmkX`_Vv9hI#2KRqAz>i{$+O}ba~-|@-MTuiD7S}ASJSk8 z;2)u*x3`PriYG~?m3O^CH_GU2L{tMwY0!}=4F>2 zArAWh)hl%=4^=AzL#%Yl@APyT8D48UxzaJA3v3g$L?JwpF`+8XDLR&_g!j{{^o+5kks zeQe@83o8L~Tq}Ba>TIfNXAm~#$dKJv&E3{&xNi0O@M8DJm-EZ>3}e*i7u}d&)7$Xn zNyW&EcZ$Z&s*+b+bn)Gvo(FnwZkEIuWBq{>eI$nMv&{QdX7v8{7Kw48V=UuRPdc5v z-R_ooBs02mPv|&DQaAo%acH@z>Ks4qwP>4Sw|mwm!7S=>aFeE)_QkWpv29)+qM~Yz2 zpI|yGzq&HT!rAFLX(hPWIF=1C`0SOo==A9`izHWwOqwp8w#4j*;>A>z ziBVr2%dY*fyPDd5JtsKcv3SYS;>}t=uN13I_$l63#|i!!DB6*cu^k=!#eTA%y~Ot$AZERyWT&?514W6CeO6>=6&fgfU2Xhmq{G#J66|$@Lc~_&ssiQ&2C9_x(bBTb zGYJedy;KoC%+at&^!wQf{;Hz6T!FbJGs4t=>>KPP<15lf7V?nfmN7UZFY(BBUvb1V@UJ=8&_)|spLgy*`>k71 z_^EJ%{5x}!Ys2PFt+tAs>96p!a^lZaW05CSRZU*UQ?0l3-0YE+S#EV+de~5djB9tp z9%P`+`S9WFyK4_1g8lfGrvuQX1yq3nkI)!m4jpQWM>rgG4UNAX%~Xyc5a)@)Dev-O z4Y*#!w_426bBIhh<8ZGx+R_Wk8(_QcOFL9paQ%AuE#1aQ%U;_S-|L+cr+DT}pr$uh zs;%R|_~Okgg60|*x@%V{hF#sNQ(QJP+CU>>?*!Yk$;mIvqDrrQe|_WBqSIen%{I;q zGnlH;XK>#PU7Nd?if`U*v}#-%4UjEz?)>n3hw)<2=4Ck|6=kL_g z8Wa*gp#SD9CrhVu!a5tAceD7&)ayaf7x(PE^Y1c{B)y4c&_DOx_|{Se8k4i{WNvlZ za@z0SM*ATbt-hH&J1A~3=hXG4U0$z4nR*E`C0IJ?{}4|EfOm-?9IsfAGEyqitg~?$C4lT9w%od!L_h(vH5)lz^y!G`U=%i%T`@M}=#{|FS z{QhmqBldTGSf|tP>G=gQ*$r2*Zox(2+C{z97;zx)OAgw<>Y>TK{E}+fDsqqZrEO~e z*b*O~zH7jp)J)rRZx!Dx=y;W;Au%weLgcwjZA*rCg_i5;x3~LDiB7F``}I0*+N9Xz zGgH*necnC(zN*GFKVxIvH`h%LXY!AoNh^F<`~FgjjMfaTX_qg)y?6QS-7gmbDDE6> z+op4*V7T^H&+n1(si~1?f~#%!%bZW$@bF3VxtUXK7aFbnXsl*<$aKrkNWxuq>>P7( z=p1)fAGYw?_AS1Z8`X~K&U*CdYNBz&E-~Xwr|}cN_1+M2%X-4okOjte`=cgbGBb`& zjhXq(eP{E;Yx5+oUQHbzOoE~9Oj25(TnY;fO;S(M=BRGj;?C=mU`amr8xMJe`*Q{3SwYn#c_mVT^!>y@qMu?Wk4ya=8DX< zClt!o`0L+pG{vOs?KzI_JfftGxMODz@j>))TzVv2tbOZ*iZ=uxMP@fCg+*lEW*=3t z41(ZZ#hU#-825uly|*w2!P|g+LA$pBU?s52(5)d^S>NIQsrui2`IP$W3D9G<&Fh@2dX}OixY6DAb^O%GYa_lAP$DvHr;K2@SAjH zWf+1;pqYSoz~@rik>|9I!-}wxo0$VF7li>P%9ys776C+XbQwS^f~YxV!iFpCFR23k z2xd1MFsT8yRS5ejveaqV8x&)tlY+^p=z~!JSV;GALylcNjJ(7dt84&lI_zdV>b9@m zhzC;C5}1F2!SP87|9%QcdgbL2HxHoyo&Y&l>EPzyGF550ox8re3f~|xs2R|Y>h0n@ zWGAXYzmGvx@N^sitLOM=#a$B{ESHZFUogbo#r>evT@@QFQr4)p z)G6cA={{z68b(u)eFqvOm)^<96j{pkwi%|9Pb-|9BJ3-|F;(2-tX1{X|{tl=%(%I5_0aslAdDd z8EC3ICP$!_^B^MmyKF2hR*@Nl=gvD7!x^z2w5hU%HKW1kzYQJsvl)Z;Jzq0aJxX8V zCt0Z>9Sg@3YOj`XC!6!U3m37JMARZHkw>jokJ zj)flc1)GPS@p$;3|0lf5W0pSa!O=zW_miJFS^k~SoE{Y9OIR@!rzs7ve=|S-O&a?YI|!B_5}He#d|XA^Cs9? zG!vHn=T8e`)b;;5n*Rd7ZGXT2cb7c2einYwTT_C)hc~{%#$jZngX!@9-AZy{IAf=; z|N53w?==HvAsIx*tjluuP*JQLuxcQKa|Y=^7Ar8wBq%97;iu2P-xUlt&Ul78Z^H>m z6_d?QH}W;b!q-+X@CT~>*m(U1mBDd~n|dDl6Y+(sdY$ zn!93D9|Y&OOG;z}Q4n5>xOBQ4a=1oQ1j&;O{{S(-ZM!Iuo)O`Hu7Jxc0QIr_yWg&R z;+6oRZFdrJ-U0H`!j_X@;008!f=)5;zF=I!5+A_{ZoK|02MBpv!+_ui#F$;HM_f?U z25t#JY9|=&n}Dncp4H++U}`&T*+?v_v2#ad9*xS%G99FMyh{5O$WW(~;{J7Vj!~W( z#|?qph_0`#Y#jaY{AL}nbsg0dPaO~fU55O7X?nP7{!ARcfF`kWr~PxUR5mj3_(v^q?0564 z%}0xGo{vep@TQC@of&jZF}L-1zEJrY#>h5*eDyX$?{ZhCEk}IB7TRhvBSx&eIEID8 z-m>3xP|I*^v=bHR6QqE-cvQAwoKBlpBS+kTR7=7(8E;d|ScjSCxP;-ptW3gH* zLiHKJ5dm$Yc%x9#eWE~d(&ghLaFG?8J$(GwjeMMh$3fp@(Wr+!QNQkfaiqUYUa~m5 zldam`#ZgNfU5&YQ>{0ZR3L>~bI>E>o(5OyUNg?ue-f+4zDO@8+y*%S$Tp)XV?5M`> zo23^Mc7RfD012a=o^f$Lgxl_yNU)Lk<8QaoC|tPPbpg+tf6Z4K8@SP}ACS8mkVa&i zApvF0ukA~id0^%J$5nnlo35JjeIL&m_vNa$@1(9=%ClbbM?bSA)3o>d@?(|u7I_)v zVv9IFb?Qn>YOt_aLGOc6O(We;*O%Ky#i$ugaVt}%Lr(hbX{Pm7(7$D@innX-iYtn< z)3fQM=2hs2e9v7u0Le0`0NIMF<(hSk$>@GdijtqP_jej2IsAu*6kmyDro=U|$&N~o zdQngGpX18UX%v{JZl=P9nK~ZQWs~b@uD0QXTI z?Vop8Juuoa0`m3CF{h6@rEYj0OxviJ(q(JpF+x0ZTN_M~OtvR2F5B>2k0XyJVtM;I;xUNGYqDH|Om*7{BgLVD-u4MQb}vlKa6Gc-)SSmnRI& zAVSXF=UbZ@M6edtaK9V2H{p%sse|TnYr0-oOW5hjHF!u}9^u^%bze#kD>Kic$nfbF zW95^CaQ>OY7mCvF4MdiWg@w5hP4T(MAm*j~U0YhL*OEBTsdCmDjpk$SyI^4%++q=V znm)gS4gle4#(nL5<)? zx8$3`3hw3~$lF-#l>PV4aCj$>@GnsQedFH$XYJ=8z@ERnx%ty6KArG%zmgkcC|(cC z;3pZ%aGX{(SpWIH1NYzh5^C6c|6Rk?>fN|}*S{%4_4NBncVLUlB)I5r`u;tXSW2Y- zy$`1wg=HWWj6So(@)ux&Q4Tow8`;>%VQaB=$fLmDGacx*xR$i1i^l3N zXjiiiYtwh%Qgq*f-W61a@VFs^9}^NFqiSBYwQ{_?g0vjBu6Q9{TR>}*DaBU`TsCtb z08nt66VjpJ*ljP=wuYcEr9)ON#P&nX?Cg}&4VhaaeCr_yb)!%7s1JtZAS_Rgj+)vQ?6tbE!!@n8td@Db})XqphI3wV8g z3bWGHeeeq!s~PB=KxhK|unpkhlHe111I;2LRFd`$fp;=hOj_}(y4owc+hC#pw3`<3}#hqmDG(jZB0E`|*v-lWli= zl_P-LV56@2=SShap3Q6ZMRdF*9K7bKzcU?%is`sXIAYlieNh+yrv9r+yGUFo>@x^< z=CB(pgAPMQIpXF#Ax!FuhFXDW)TP9En*9Z~{=xOmKw$o+DKob?$C5mGl568KN9c_g z*A*c)VL8BRTEBYJ*E1|PAn{?EA%m@J5;IP{?J%1+6mDw{E?z{&F_d3c4_5_VU?*jQ zX({TC2EK9x+`~}6=+kb+wX{0$^rtyV)_=9FkYpSQOCmy*_T!>80P{^)X<3yTipjeC zuopm2JV@Lu*j=acQ;yN1Vs6QoFrU6O+)ORdb&dBhC?nT0o6v|UQAL9Qr=Dvp$JG`x zoCxsg83P&!zj=)~sHqdaE&Z5Gg+_hgf8#rKo^X8-hu_l^cg+FX16r_QS-qBGq%2IX zg`lW7hu}_W=a#M)1pa3Tb8}_1<^(7n`w&)3gb$1e<$mBs$tKF@4SLQ6uUDY|g(J>T|KX z$3vn%!tN&mpT5MrsXs@j|t?y8ti{b-&#ytyu$Gh{~nd+OL=*jFeX|yN$bz7uLl@naqe9GG^`#d zYi`t%rWU&ps7qOdr#}WDI!!zrRzLT7&pu5Rs;QPf74pQQQj-N!$H0)*J)w%peq4>n z$lo!_8n;D!6nScZXUV{@nD67+C&7IDU!=`|V%rpEc!`;eVYa>JE>stm@P zTdpU5tul&{uc#y#=pK}qnI6rXJhVoMQs@`f3`9mC z=PH)YypZn$+lVUnvfDwEK<{tu;7ByjdC9XpV>PmvW3@WwWo(v{Wz_k~2B6DRKux<% zh9Y_s%7~_)MQ`MLHtEEJf{eD%p%P+3Yu8EQuCVvpmMU!qk;L;@eQAmllUE%Zv%xzegI@0#JvDRp1HJDNy#l-I()|2x zPWRLay`qtyK6VSeeQAy%x~E>GH}l@Mt{)m zQfvH;hj|}|IJvpdOm_M67m0M+WGuF($G(YkCv~l^J95O|hB0zg*)J5Eh`73@flA?w z!Q8i`4T@RCGRxg25j>%ppM^Q-SNuFy4vyp7^tJ~JM5vp-rGFxNcO6XKo z9kHS00P6q}L|YH63U&M8RKq`DSi8P==(;lumdboWG7>#%V&^buxck8jihud7JQaSO z8-X1qg{}IPt_V&dE+uj@9cJaco1E~Jc=};3qqPeJ>OfMIB=giF`1aiKT_d!h+-z*c zK-302k0H_v7e;E}^R2Bt;TJ~Y@sy7-uz$9=YfqLsS|aomUEvZD(F@XWnomtl1VCUa zL?pCn3K(AmJOs`_y-YludUUdFexe`~cHL#{9Ps*~aRTqkuHrjo0cpP4U3q;`R;Q!) zet!Vw)Egjw5adF>j4tC>-Pa$vCsT>>CAu${&uTbMhp(F7xik`#6?)0(`L zsrQJ8{PRUm{{-|7Hh{xUU$5iI|DP(h(}ny`M9T!<*OMyz@ZVabECjGJ_ABzY&?JAs zJuD9V|5P*o^LwX@`ah5`kACsgFImlhm-RXqDPmL@<0E2jpDxRT=u=u#5}77;h*XQq zNN@@Be~P1iJjt8G!?N($@wefcC_dB;Vn-J+YyaJ4R+0YKDcK4sW@jJ)&1Yj4X0OEd zW$v3IfnXD=5qXMi{rU;3!uW^zVIUpOK@I;(HPo9xhOhdCwlaGiFq}+K4BBEp*FUit5a-Iar`lww##BXuFp> zly96t!3zRDf)dNWW`u`tWBCw3fx1EM*Q#Hxc6w^c%yff1+S3iS2igCF+7bPC#rJn# z{tJJDeOC*8@l($4jp6Av#sDXF?1uWC|9#vs7yr-idqjN7YJPve^D@_Jbr|qqdU|di zs%6T-rN!HEQ-I2k<;fER;4ar$#(~NQ7{63RS8_bGu!Y85kTndwwo%9TU$67Z7(A1s z3=dq$qeJR9=#*CAXJ4*nrlmDLdb~6Wo_n6SV8eJ^&wp4CGY%@h?!LaQAsBe?3|WIy zfDFgovKWD9>tkfdPCb?5G8NnZ3HHs0tM#M%{iW3)Y8tg_p->(qqNp~HHwA%<_*7J$`@gb0! z!P1UBw(8{gpl5zl^JGi&l79dq3;|+q^}+B8*p$?M|1P*XJ8$D;VbQsBgvlLX0(IfN z#t@du3O^@jXL)(aR9R!k5bXj&|0b7_y97Vgt#$rR;2B%hVv+GX8bzcMhyZ(JsW$f> zeHHVtr#G1wZmMiQlR~f1 z7g@KY{3r=0S69)F$EddBL`Lu~rn#>2xw z$p(9sw4UrtA8piAz1S82%{2OXI(Q}Y(xwaPyy6wW-Dv|JFrK*a!_x>*2^j$A&PCb@ zn471(w6Nx^r~#s2$@JTRG(&GvAq3&8_#yVHDNLbTp{yXyNC0F}TUVm9vH)+mTN+__ z%h_*wZ+*SaWgt$=DA2oGQ>Ev{JPl4gc6ke%O}(u;b=}et>+p`NrnfyZjs?dxhR7n! zwybEu%fLn#$;fh(lwY6XXd6{kQ^@hv2Z%X(PiON&iU9#h|ETqw6M2tAsiwn^*WmFu zu>+(_!YKun`RVCK%5I901A|1WN(L+jnkj(Uh+BW?{5o~sNxkkm_{RgHz#}csNc=3# z(elP4&;Ef(3-zL6Hk9sIDR}m9a6ICovwq--SSUk;+WW+-UUgs<1(FtMg@E4%%oz7$ zm(^^@Q3ZMn7->g{rKYyRr135!vLNI6+pW4PTMP=?uV3FM3C>%SkxcCl&~w~#(P@eJ zW^8tEQ<9AIt6y?P7U4RYsh-JY^m@6h`habf234FXD?^awOeSBQLy!`v^TN3J69G`=OS!bu)l08`iJ>h=Tph&1Gwa=<>E>I9R`z`BYU34r# z`51&Sr&D^RxTR$jlv|RqV)Hg84+Dc6##_8uJe_Zmi{lXu23SQZ*yj($w zO{nmJE$(+iKh;|+%t;*h7}vk1Td;?8nyM0!(0t7tSxw1!NcPoF%ysno#&=@TA<9r+ z3Ca{-al_xTD<*U^nOURpnu{xKgLWlA!sx~;E|$$~GAdDVvCg=Q&F?9Qf36*T2BCTC z*n{6q_gAgmay1<-GK}MVgd$;|M^XJmN#=_Q2*qjKITD=c))gD58W{l#BcUGFi-g*s$md-*Q%J#92gLKBklL)PdxrvVAV$}16b6(*2t7x3#0)HT zbai!at>NWxUg6wZKrc^C>6WWiZ>O0vhGaBOR-0B(PzhwG_$~ z@M#bjk8jTZ{`^H&8CRecQAO!+2W1;t>3+F=*vv%8%Uj&l)x0(-d7}e8f?Jo6&>u|v zcy^W%#ksJIQi-tM&S3^fcPljvq{N`>R<53*`jqLIa7Q;Nh%^sG&o*r`_V#Sy>(U8v z+}7S~A|OW`dwn@q7*A$MCBhcijnfDHg$pQ5d%ID|QhTd`NRUL)%-m8GuUp-a0=IRV zrP-JHi@-JTdth^|zLS;Sfn2NBaQQ8vob`uPa$RO?}5Ep3_bLw7Hz} zRwHu?+P@kkGVGp{)=hJPmW8 z3ePeI{Zig}v9&H_k`^6NV&(VJ=6NtMGbUpwp8IY!G*d)MO25-m`e~VM7!$^F$R+|K z*Ose~qhk!4RoaM%OgsNCe>)S?UY6HW>L`+JSA(yrFLenSf zbZJe~gyJi-5Z_{S=MBsdI8|8q`A?OsBUQ-5&TYkc^kBV(F>fjlG$a5hF0hDXWoZ;} z6%0ec3Y`a-eyM2a+Vz{V>e9h2BX1Z1E8mw)J{F14+p8vZoB7E^81Bc*VZY|2h%3`) zWNOwf`ru0%*aP|xZ!YGjW;#56yw%i1xkK05T2>y%&yg-A4I|4eT!DeFFXeVeqxo5lu07w-NCNhxe1X*!rU4)VktwH6k}QP%AC-^F}?C^p{TrNxs7@ zgP8v)=z%pWC~`PC%Uwo+l#v+*%l|QXJQT;msch&t^P=bLwBp&iuAno50*nS*`-ek^ zb+O`ldHK&+M9`?6?QJO_VwK0eA+XZ=78_$k$56uJ7BN)jzofJEt9P^a3P+IclJI$8 zCy2f2QCy5z7pSWI+)LQpYf~(_CCu{4S2uS^7_I^ClDyrP6a%}F0^&@=LRw5)dtZ8* zDv#F9uGIX&7|v$KnMaKLnWi6GWtc9)NWY^U9q~}|6Nj8o571<_dmiAp<-%73 zGVn~+ntzA1SfRw8SHYw|qByGA zg)t!F*bLTYh%Eb?V(#B1jpcIDz>{VdVi*oDxvyRV3=Di@cfA4 zed`+XDUUv-w#Aq7eUPs{T$lrd%{Xp*)U@eY+}up+ho3HQ(K4Mb3)5qi@UaSxLWk?J zwdQW!9X=SRmQ+6byCS7W3ZFR9P*HtqLhfhN5vstNRvGyVfnw!cLc>@u3^ZE9pg#?o zd~oA(Jre+nkkPhMHu;Z`45%p~0W1{;E0^3m!4MPNTY%Sqpf}(kSveWR4YAa}UyPo` zdhIHjo_bns!+LW+Uje6S5CI~`7EBa4`S{FYX261_OWJh-=$;T308ECR>K$GX8Uw7f z`yTeO>LnFu$F73-D<^CnFifz)38}t-Rl9#9Se&E~OfIl&yjzwP4%UL*4--%J5*e#^ zK}ZIE0HY_zJAh{*`Jl08XhTqOK?zS@@TP;Lr4Si5gYP6UfdBA<#{wQ3$=?HGYC~=P zAeAn%1#(HDFb16q$lEZsqdUgM;3AEnrz2}Y_K+S4ntobXONnU>Tm|44VL$3>Z?p85 zeDSn`wLHFdgNHiSg{)Lh8Tk_w8(^LR!K}!Ga<`fvN;y_m8_>a*aNPdo083w8kie}7$L?-F*Pe+J9oE#^tmKQMmy=bvhj^@F$F_o=BbxOIg&U`;ut zLwfKFI_;f6bC(pu>dUn%E;ElIYzTEZNpSe1@hdYA_On>*IPGFs+m@e*mFL zz_`~pFvx)Lx?SrbB`4=2;rHW?U@$XPcb1gagGio_@fyW~Fq{gAb`3lIVZxW+Cj-G5 zh%X)AI{J*Zka#J#q}0Y z*Znl-(Y?0Ro;RFQzW0W4@#jrhX&7tT&9^P@RuuGCvmgum?5bpaK1YPxZg;SxVEy#+ zz-49;sdd^6vUjMk`W#jN=3mF#bs~4n9;1f@c4Ptzd`BlC?(q4YS)Up0&n8n+bVut0>@_mve zI_#8a^7{QJ8fnZqEVA>)K_0d~AFe=;C}?I;>yN&SmCpbmKz{|js*9v?8_k1y+=zyE zr}u?ggtpROak5nd%qn9In#fN_M?B|X>Vt)qFZ;g_w%R2=vIF%MrvVU1zDo=y<#!va zJ=19Ei5rvVy850}g7TAq545K+X@*R4_Ga(1OJPkfs;N$IZTZ6SB{Op+gJuU)kN6!i zxuuZc1(s8g8TSdvbwOc3=fvSQ$$`X53dzXHy8^1?wlv^o3g!92_Su2edeViBjqJVW ze?be6VhnVYS_GtfKSkj7cDzP8+B&~FS ziB!eN77Fft1BE#ms@GU|J|!AFlFqvH&s^Vv-e_?|)6WDFY6LhDeAlRc+QI+HNLg0s zVMWBMB&QaUw*(*o1bjV8esT=z+XLbihepr{_ka)Y zMR$;!gI^>Gb)GW~3W2u2@mePRu5`5KON2%lnpe}o=5y!d8)bGDsWq&1AX*CHkMGnw zf49mPZru<#5|cy7<50uaWcibh!kTgFJGb_0YcJI2PgpW0CT7bG2`1Bq;G+4!%W%Qg zv?GC!OpwnUQsP~bUT0@bKPmU}q79xP=B7D1x|&5}ztlWy#Z2az)UmA z*~~IrZLoU**J71i2CwC@*SR(B{e`V4hN_wx%Z)bmsw!HQk}wH$ef>tNEM#HYR3((p z#9n*sne3-3*&}c{Nn9XcP`t!^botUjCKgU!xi>0e;7Y|6+Tk){OK1A5EFjCw_ztqRz5RAZQtdX)^Y?dTMF)0n zPJ00wevRKx<%U3ZMlbNJrH9Bqe8eRODRj~AFSheUq9vxvKB^;6GqbX^ojFseGW+{8 zsQgfvaeKj~K-K3CLV5YKg?u!jW!GwUS`cuY#&Iw54-QU%_+89OUTj+N8|ms(a(Te% zM5LFs4OTK)Qd&B&b0jd{ji*a+96@iLDoY>TJ3CVtEs=wCuqb${xGoQIA|SbN${JuW z7s|=VkklSPS0PKgCO`jUn?9JrMy}IA^aI$@f^&g%(o3c0dk`WF-r6R&*0cz`v$Dju zyr0X2feTD)-m-8S$F!9l%``hW>>3e;YZO9*PrLSKJhDgE0&at{Zg&agy*mu3h(PmLPoiDuKrx`-4i(-wJ zB8A=DtCmc?N3AY-v*}Af*j+d3%GVlt8e_~p8^++0 zPjv?B;t={b1QDxN-yAaOx4d`q-4||53O_n-^st%^nl;jD3U%JeWwtqJc72@k_%Gw> zxg?+83l@=xdD>&&E_9g4jjEUF(g@3GS0lqR z7AQ{Z>N+Vp;t!j2De!hATjXz9?wjm=H^7jd!EM5+%nhgU4jln3 zqg%TxS(x4%ex>;j7l5U}U$Y`DyN0J`w7JC4H>Yy?e`?Mx3*IG6&}97 z&JcRZ*(ei!IG|Vdb8E95UVSWb8h!@z=Hkj1Rm*=$-V8R2X;4PJHTP_l>6G;R&D&?h z1|D8{<4^2Tk_f$R0Q+FnKl3H5Wa(E)Mjt+G)AC>m=1F(Suu5BYAFB0U9|kq);74x6 zhIgnipjW;~!b@YtshoH4jqMO3VhvcKCzD;#%ySN!{8KVuKvlA2IyfUGF-IG{jX~!O zRH?L?vsS7s5f*u= zPeF9>Lh3USnKeF6R-{PCtmvQ}aijIUVvQY@YTN^~Kt@V}H9jy$UcVk&Ya|^779>LI zZKlmT|AYNl zCc%SEcQL&0V z{xq}{E=$D&ZUEPK9a@n8T?)|)nC<{;0Om_jA$s8gOY)gkl?Fl)gH{eG(_6sU16jAH z!|~oM(gr}OO%;2!GH_hWy@SNuB&R3h{ArKbBn8s0##Vg?m^@NZOJ@|` z46^fwhc*UlItgsKpRBak9L3^keL7t|(M^9skFB{)!>!h6@ei}kBR988S5FsrpUb2T z59_{FbigLh!@s;=gKJRlU3)4c2>c@Sty(_<@0Tx58N~7LD*8OO4BRxRBN>kmQyCjt z^pY^TK^Esi1aJ#rJx?D2LnlW>_R8K&rL)$vkkE(s%0hUK%c@)}NP!sxudi7DJtk1n zl%-atDNs5sNdA^_k&>~8n)?q23O)6NhVfrtvs+r%W+t&kI8H;W$k-$VB`)cY#;YZ) zJUKFB7eD0+pH`OrDGfrYDuM8)ti|7x*KjNvAHtV9$&fF#WAd^AhIi`C#Zs70i>(~d zP&j1)5x;B2%U=!%&VD3i5FHTE80~htDanE}*h=XVuM7zPZtc@BSO~KDr$nM!VY1X! zM-yh`|6@+8_!^&e8nk6)zJ!UbjvC2lDuf%vo>H>P3i4qw!3(xs202?oC8irUeHFeU z#WGgD3{se;G>PgN`E8vxxE?;pJH-tR{?{Mr$=01f54b05m z>Uf1ObX0fsNUq_D9(Zj(Wd&e6(=ddIBe z=DO3AqhC#yG-U{`?|F{0Gi7gGCvJi{Er~I7KDELMRJ$h|?(EAI9sX!Cn1)rV1;r-y zN2W%1fA?hJuZg*umPI4^YE|ha76(dBEQZopIN!;e%!d@KHc(1lh>KpkU@r0kQp4l* z;5SS(xIIH9x$jPE+L_hFuV|mcGI?3E{!N(u=Ft-(ERS~NP>9fpM~KOc@IG6TGW2va$$D9lN`2^OY$bi z@OQ$S(3uzNd@v^%GChA^EQ_4Qkc&JgG}%Ys?d~%moPF)O>+R6tJfs~m)#W6YNhK9V z`w>{&5SMG2Nea1Dyl};95kw|52iT^n$Wv0v?KqLx#)~x#nr*O~lHbA}^XA}Ly!vha z@<48BqrbA?KOS?bvg=77cKZo!-nAc2ECZVWnGoF(;5j)2ZB@#%BrO7D7zH-0xY~%v z^K2qN1P6Nto>$P;8lNb=f0g2?`F%jV<^I@smUf_?+yVXlKzB zD*yOa7Gg3uV@&w$D)0wIlX@4RxB5JZ2*UPicKvIZa3*Wto&#Gg@o7ZSafq_7!XzHg z16#Q#kp{7@TR9p5)3B-)Uh5f&Tm}F9Z?*DD5lU+K0zN(I+)Pb>nOG-W^wu^I5CXyO z$L25yhluR1)YcHg7_hjIm51zR%`I0=Y)iOnf{=F^3_Brh0A`&2RiLSq#>igI-9`{Ui+ck#+e{#b}i(42lO{L3VhuoJ#Lj2$0p- zNIL9n*#OE(tEd3?45C1nRBbx<1~pXIfW3szD*+tSks+PIXcfr;)^g_^ll*7q<~ezc zWS#^hB#yI#Sz}lLDi+@5|fI-lDzn@Vh@Iv23zL8s#ATp;k9q$ zAkv3XaA{1M*A0P4PlD1&5CT08c|k{Z> z86soE3cqTnz%4OqRU#obr=Rq<55C40AJ0_0ke3IJy?r?v1(C^YxBcnEasFXQlRfZ? zs+muV-x=x|2ntpi*!p-q;hx`?Y?9lVH2Da`Uj<@;bdY`{jC27=T?N&QGM z_G=8^Z#sJ^{j%*r8Rh;$IbEZeD$o=cm~%3WnGx6AAD1UYw6vj_x|E;h+jbbj7k_b; zIvPBaPo2z)i4aXkF-vK9z2HhN`H|bJ=bF#w(y_WOAlc(Gy5do^-3MKdF3a!1!HP-? zFs&A>3v7^rHWB6J)xRSI6rbnI`-1qF#2;9y(%p6)O$1wZ8fF~#!IC0@dpKzyj*fi$ z`^!S#jskC+>jS-l`+SPRGxWwZptNfdpHU*jZnR)*j!IFV>@^5%lFq7ShVZ3#ZABFMeS-P(8o74yW7cRL&dXl`+ zU}rO82IhV{KiyB=x- z*7q7qhzGZA)fsHpf>JId7H_1b29H>(jYbMMB+Q=AGauX*V-fKl=M0*3To%*rE?N5c zoQlBc1LwuSDM1DXl9r@|miN*whNE0TlW2hIQ>}9+e<^y-5zeDY+(5PP_+oevEw417 z?(8Cg|B9hUck<@A)OIFjF^(wH!KK}d_pHW0Wu^|?uBIJTEA445?j(IFM%eU3`06y4>I2qn z)I1$E6NXHv6Bp~v;~Ooc6s7LCSPI)FthD5ugAo0=)b|lP_`$~ z4;USLU0tYlbxN^Z8a(JRoIlXuTL})%cHXI$%qv`M0}%}}^&VX7F$a+Xf224ySen*+ zHFtJC((TTbBmDHK&uRFU0D}2P#hXr7MIh~D37YPN5M#QBMJ|(dJAl4OB#0qk$rSzV zV$;2OwAmn%@xFnGAXL?Iu8;+h@>kohP*ba(e8lTv9c1>YL4Rgc(V6?F>doAt@hPFJ zrC$*LsxVzkOkOJ^J=q-rI)!+rTnM|eoA^~dAXS<pc`bx9YXAdW$Tf#bFbt#;1&KR{ zd9}rO-QEUmmBl5`$=17DHOKx99?0iCY_*>22Jv(t4%*p$3kXdL{PQFzR{#|=VXtsM zar+PL$UOaABs*xW6Ms%yL97*MYN0QfL&)}|hajT_&L}+XPqv^lI*A|MBNmbYZ0Q(0 zeyc!qFg~h|Y~Aa4=go70Cx<5h<(EEj-kop-LE?q!pc~k@fcY|# z*$B%$;dkC4))cXw4Losf4;#!wgCzz1&O1|+_tZbw&r2{jJQWZ>^Sn^Jka~4-UAyS_ zqdZU3-@~(xUUb(Fu2RS1o^3h{e?EVs@tL&5psS>~Yxq$ix;iGxdcr#k z8^`Bzx?1C`MMk-&xzls_z|8Z>J-e@ISoPrQ{Ud^2_RZ|rby4JL{gMh5m5s;`KPq}g zr{t=3@QMcNDG$#-@CXr(5EAu$a^kZ(*{C|8rXwfkvu^bkuw*Q(01M4Smwk~A=Xlfw zERPN0?@vUqY6&tIF7&TC2?<@$*FZ}1`{aa!uQ72$FLl)z*81{h;!qcA$Dky{x_CiW z%Hm?rgSVgIQyw9H%vl+@0U-}K)o*#60ny@Tte@)^?&o)$G7GKB6mKkU4p}d6+if~R z>F9xH3fRQkORVX}XP90>p^xuz(V0k`)^F?y$J3e@H^>}diC9>Em(5nsjG3gSPT6s* zU#5~E34XeI`Um`*f1%{h*z_^MBuKaS9-17Fx=&I?LH|UwY2$(r*F$>q=j>xCMQ9>E z6a17?#KK}w;cDxiPm(0^s+SmGbjmJd!Nc)$xJR8ELL0CDJEtccS+<4T^Y;xFA~-_l zO@oBL=DD$bC@}eOz30oeT|`U4_(w<42T@vTHf)D(;~QGu#d!3QI_3BL8=}1V$U8N~ zBjzR>2f65BF|}h^na^gh{jPLhr1%rANcbe>8mU0O;JawbX{-0EisiE;rri&$#}3ZS zeNYRM5G36km}*jRjF=c!y|<6u{wAc73uZo`QA zyHfZohvUi2l%1i-x%BYyy#JQSi0aB*?nSIwCZjNm@;KCa{Lc;kfkOT`aG=3}5}Sa6 z|DuKG8Eh{wl%0qm^gHvPpU|6)gYSwYqTK3mEzN?wl&SK?jdHa+4iyhu>L&3*dlMsH zGelZctZkqEl)(|`{N%keI9DU|8nkm#-ji~D_ic~TpbyuUlyqsiO&zW+_{A`+g}GE! zx2Tn=okT`>V1C!KTI;=_V7k=W;h}=SOS&IERIz$yrP${M*;~5jzdjI6Rvg7xL@fboI#Q78|_xFAuHfz?UisW|YkH#6yfA-G@PQ0aI+PlJTvo;I(!Gb>v zeO^pGehH$1c&XT`87Y3ZxI85?qKk%vn8m3~In7531FS}7GvoQ4tYYcRJjkR5|9vr0 z*gm>?80QQYKHH|kIRfe@kA$A_v%%jyu9jJg_AlM09g&YmLF7%oM=RdbF01nMjf(fc z!05|p)nvCV>w7P^{a%4KuN*wAT9H+y%P+s;dqoBAw1x_X>S|gtnN*!ryX-OvoWZ(R z@+Q$_+w?0REcyw*ZjdngO`lEp*kx18{W$daEv z-F1l=G`;ZNis6ltLe>u8$LL|RZJAP5A!a>JQC*vp{^@m#_OoYNW_xrwQ!u=bh($x+ zefx}P=+{#o`q4S-Mjsr-SzqxAjj+XgL@gTX%9oe?B2%t;aq>Gdr-Bz#09=M+l|O#` z038cWtfUo#oIEN=t;+4_$KHl{9G@$fjzp+u^2_^UC!6Ww19_S!^`ve!J0+#y779*0 zkk1lwQjn4|4Hgyj^as9FxKvfM38|pC2Th1|`2%^$>;-qTpBQqPp)j&5$_CX0`@nV>zR&@3!&9MUI9Sev&>@sMd%B8!#Yn+a4uDoXIntV$q0rO zc@2&{+_HiLL`fvG4bl}ciAX0fO7&v ztfmuoT-?bY$`F?EK1F!A3`~QH?4E!x2bj%*QhL_iru=)r-L%H%0c$`tcONRlD4-5E zt}-5KFZ327L4461E8-$ShZ$8z_;_FwybNB@V2_hHsuj@J+Zx9_nSer_%T_p|!S@?= zUKw@AsE+Of$KXbwFyn6d*)z*Tbmj%x_b-LUCt06LzU!W+lrQHU`mGY#bnTh zymoV+F0YAO6nbd14%&x3t4;KS3eKl;_*uZ;yhYGe^QNB0d z+>~*3J%Wzuu75+_xP_amy!?@y^sAl`$S>MGY6}cpdzHS8=L;s_HY+_#cG9uzOQGTn zKm^$9&Oqiv-VYkPu{fzxZ);OV}xCnv8Ci5DPn zvTS1;C{s&+)N)fGDs9}(84T)uqLO#Bvfo&?b4J1;SVm(|ubFnY2hHs{t`^c|7g@u> zKUy98MlAR}>Pr@H{iEsdhzQ6mT!IZ$badpzqxM^$W^~_!z$P;C_SC|{%Wt1ff(IND zb3*nVW`-m2ho|r%md9DI5hJYj9$WR$vIhm1Z)W`nuE|VEvF%7$+84Qb6(}riapf7= zn7Q_Nq7CtP&zS9U!X?CFZYzOliH=0XH2CJitkJZ=uN#HpkJYbZDpV~+sg&iffuV%4 zDX+ZpJQ4TypP--!!DI~V1&n78fwvz-!fO*VlwEQpvN#3zDpSkH=4egai3 z>H3m4Q35E)?1s_Tz}mHw zbt$fxn9XSUtKrVWPk-PKU~$T@JO5<%;lnL?`N!;LYVH%?Lr^F=YwHcL+l5%gb%0?s z4!iz6?Bizvo8*Qf6qfe0kOxvkz>;QVuykeY+xrttOv0@pvySK2c{LQ+orckxF1zFU z^_?4{$)I~{hperl4F}c1lHe5xv0d1oSCb_V`Bme7lFnzVE+k~@=BpPCrEAmluQ*O? z8rp1~0v%IRA~>(*Sw_7;oB#&TPtLsTY>H&W^#F{axLh0_;sp}2+3#;&!f!a3i9M+@ zAN}AOP1?3{9U^8#v9PiTVYxVUEBhuw?kF;Oj{l+$I56K^C7ftZMsyr*g)zA3ti?P zh#`s+-ONUp=jF$5T6Zh6&^wEc^Q+@a-db^e&AvWxUN{tj3zDv3`sXXaSnO;|lW{K9 zJuO5;d76b&jn=bnGf5vJcn=nfARHh7er=QpE2e2`{DtnTm3V}lRb1S6>H0A$*R&#S znu|*Xm}piIodmom4mP%Ft8z64$bKoXc%t^|v2#~)qqw-M^Y$S+RqvBwLItBLB!`NM zUdH1E|BAOyYp1Q+V%P>}uL_fk#K!JSfjDQb3$eswhCHB&BrYSSLpl{*pzh56L*(J+ zus@IU_wjt3uB1n!KXnu;_TrUTjVD z6U&JZic2Ntnr;*4!y^*ZQvv8a5dmlTcNY?6@oR9k+vD=u;|~<=hn~g!fSjC7Fv-c^ zp$vV191gG>s2>MsLYQAMR8PX&I}`uH zd#QnoS2P_tQIc?lXA~;$kL(Nu21fMUdV5ws2H$_p=Fc7#;j`!zcm!1}qm3c-006>i zD`FmpRYZ@?Lt>BCcM?c^kBI`vFAV1P9;Sge*bv8+qA}XIh#04qvk1EI@UL z?+jqoI&EuImv!OmRvxF#Qb=kc`fz9v ziB1dDErmW*_*Wo#<+|NcVWD!Gp`0>xbMyBVxAZTvZ*~+0VRpypw&o9Z?#mBv-RiG& z)Ms`25%b$*n`m_R$0O1QRAxE$gh;{v`g~zdk@=T1S9)K}=TeFyka8;6i>`rm+;AbJpfi7=Z}t#;wW z1D4zvbte(aPT8AmZ41a{^y@8iJXsPr5-CQ5Ku&lvjik?-%@VJi;gRL`gF}fiQ$nIXVVfp zF9|2^6CHfq;1BQ@>vpeEbEsU|TW$&A-Yukyj5OA1l%+|1absief&BDak5F^#u+a$S z=Mj43&HCk9b9{-dj?!%S4JL-1)UES;YVXTF z7S~c}f|zvQDGjg`4aKSN*TR#RCw?)sE$v!G8;uh)GjDES%Qjll;obfpI4o9H!HKD9gIA-9H?8U0NN)ABjY z9*UOGwY0xtn7u*40z8(QQAL%7ndC<*at{|a_GJy{?N`cX+a#|&yU#2XVfqgl;X+yX zUD{VwZ}?vQEYyzC$5Sir$jfP+-Ek(s>@7k<)kD$Nl^tiEn2yMbu@nXVCsut5`0@iw zB)zgS`05;sl}2y~l}o&F@%s9mBzrcUoCQ+Rf2Merb`FM@C6wlNEIL zQ!LY4;b1|wxySq!2a%MjT-L1cI`8Q@ODs5_QE}-C1VwjC9Q%B$)e}>+gTU_=f1qQrp zR&xnr>*{3e(_DP0sUdf^9|R$7Z>OHlu?RnWXxe2U4YT;7V&lI057zSXKT2!puhI2b znZ*tMuioA}oa+9MA3xnKp`xf0q7KbGT zPj`lClXYJ#D4-m+)acEAIp4|_$X1^E{;@Ed<4oMP&_e>l=zNK7$CQjNUv?A1h%O3c zRrVZ%ZF0jmRY7CS<>u1N*D1KUIM4h`wS4(D$&ZSGz`?7UJZr%(a15!?Y%qo7Rf>ZQ z-YN+uANrA&9PZyKAI;CP+H+ia7N&9dqw`{BmrFdliFf$vfJyK$nJ9XCoyvz`*sABd zQ+1%js&h5*C$0AlSy{+mlwNhFD_3cz=aMhu-oCFon^jVx9QhWM3J=0Wapd|LJ2qSe zf>NhBBtQgku6xjPOn(@o@j8H>Aq2!rx-OYL03y`v(o)MAX?2zS?d`J7f==XAf@XBS z3sW##^XsmKiBm@+r%$OUKDf+(^OEVu@11A4FZgpL6wCTapn?nY^cCpSx5)KqV>mQ5 zV;LXvB}!5G7#C_W4~@|KeC~GZ375oCpIs=)Ht#HQrGCkQ-wYahj1jE%yyQ5qULT%0 z(MRJH{Yj#D%r^U(??TH_dl1C{>S6PqGL(m@RM5 z9;_pO_rlnV$SzPb+Sq~KmbTk-u7$_YXem1^V9X|_Whw-X8kgY{t4U|FLNZ2Ot9SS3 z<2x@LPR2`k(L9BE?k4fmxpj{2(QW^5O5jn|DIdLg$-g?rM^u2^G({nxb)=+itk(S} zi|K=L+iU7$NiQkwKu^U$T@}^4NsW%2ZzaU_73Ft+BqxU=xj9YC=Y_+`y_qHqe1%=Bi3RoGP_a!Uqq}GclDeF1iH?IR&{mzOTbyrs+tn(m3-RMPdx$HrZLN_@}@0 zlRZZa9dPJ^K)j|_+w(P*6jw_=W$nOhw>9J~2R*DTE%Kghx`l2g3HEXHRP@}ue0Zm$ zh)OChWB4f(MbQ0@35`abH!OE63B9wFMH71WGh<$ z{`GKF6^9*P$$ydgdV^{qvba|F1b~iT6v3|E0D^%p+omCfo`~sP+X=hD0f|p2BpXSP zK4Tl6iW7quwxM@b4#MaN1TJzeH3L^30Oph#U5b{LOTdH&WcA<^UB=cG#Aw;K$#IYW zf;fToh~xJs1qeS4DXBIn&3))uALAfRJ(a75IlAoSx|8R$xJW|bzC0Q&4sm*@V02w6 z)pd4W?ZgbuZF&GkYs*!Dl>41d`RYJ%8Q`^!R1}+*3NY`Bivt}}XcwPf_H+gX+g<8; z@IUtoFna|Dam6NG_1hyoRa)ez_L-8$Ui;PB+WJ^`8Tka6a)$?j=xuES#>%5jVGNcf z6QmF`3xFRLr2!BEFmv(tTXsnN`pnB*)+Eh6W-A;nUEjhY4VYt=vNP+(zCJ3_`|w;Q zT7V!#12oeXYV|!1!AQW8u7!qPB_{qjbEWO=aBa_da@RMhsXwr|iJINRMGI7_RkQ%P z5D@KS4(l=5d3lWFmph7N(d1!|7y4K_lf4?j`LBYy7YNW{HIae~lQ9Q##U@M@OYaH* z$lyHFt_GB$(-Basa`|WqWXo3e?=6eI32Bp5)3Au8{xsz*Uv*0SLW~&#L90;V^WlwN zF!Ji|u5%)%61xP}7XpDP5IbCT6!)WyHzgx0#dWhngqg>3-+6a7-U)T(*&h3M{081^db!tnr6sH=|H+QfH=TqH?@Qfx zR>8~Se`)^i-S%Cs2f}WSlj~Fd-5Qx?&Z+N;tE%{7a+wJv%{BNHqXRM?Bvyf7o&qiC zi>`vt0utWo{kIEZATo>DUg7uJ?a;;67(u_j>S9-cO>Y&H)?+%-&EqE5cHC+sspx|G zMn;HU_<~oEB#9>el#`z?3<^rXJ6XN-&AIw<&}_uswP_!~<=^i_i6AeMSq zXa@2f4a1>{;ScFLz5YR5!t>=JT;Tg;&`Kuq0Ty4w6PR{;P_6~?wTU_fqf_eznma9n zgR>J1l95DV{%ML!-TZ5eOiUNf4S-1xA>y*Ckz%W1_JSdI2=zgnw*dSkC@Wg4$5aul zpi8Vr_o5hvNSkjA<;>1b0S|35hp8ufEGTp-J2`Cu4}M%++{f?l&6@#^$ZGdvS^PzG z)i`tWv`X&8!g!hk)F};VIdnnT30qnPOq$=GUj{WhCsQnGsow=T!=m8Te)#eEX>6oQ zSydGRPZH5HAV~Q8X&rc$s>;d)H(N2=g)QV*N3(+k^QMf;b=)agvuN6(YW1=8VePsi zDS7j6z*oKi5skpCLc3qE?rn|^sx>uIqoP6}L^APSzY%KvTaeXI8wQ$G@?Q#V#^cd* ztJ*hT_^RdaJv22fDl2nt4!!|%KGr-A;@PE)OF<0ps`nN(hYGw*8~ub|y*dLRona7* zbz4-14J~siwqvGm!I2eN11>6%pl|ml9}zvg3V~YISCU0~1Xxs{_lJM&B2F#8p_OJu zLZ5H#K8>W>eOd=PzN?dN0!hHE<{NM&@at@sr4Q@UB1z3Ivnd*Fgw&vQtRhy@)Z9Ee zRZ znBcDBoB=trk%0lXZw+NuT;s#TWll?O{dcc1X?&?&fqHSkH-tdhnk{US|G~NRSb2V* z$HR@yV3QMj37HMrD^(8?Zws)UYLN8jlAuf^cqRLT?Qv^qSsAuyYnQMHNbsOn*B~LW z>pqE$!7v#H7p}%%X+~ZZ4Um7G9_;Xrmbn>B!$Bu)oCxXks`BZCWK&HPJAR+jee_gw zNHxGDPS}n?p#2uXEmSklTut>Y)L?Zv)TRN`Fi@E6L*a)_&3ZGI-LABB3rnQ*IpyCU zspenC3G!=iKK~+$Nml}_pl#B-;%;VHBrbyTCi^`0W!r8!Oux6{+Ha-2d^MtHE}3nL zU3~pfv=fx!c&=FLLLiVbwKt7s(xK-nz%fyEX*Hc@n0{^<1P#SA|Q-< z^=b@uGJwR4SJOmECxMf1imxjO`!!VIW!Kakm_qd==*b4ql7~?UxY~ZnV(ZV;{l5Nt z+-42vmbIB7C#qRh4$B-X1rAc zzM`%p&z?b_Ben|}Euj;jp4$=l_Sa^xl{{CWTyFX$X4PJbIRCq-|WdLLL@z$w4eD_b5}^k{j( zShdSaZyGbozOr>rMnhF=h%Rx^d1YkF1(4Uf%%JtqVo-SRo$HQ4vOJG3!{ZwNF9B!&a*OZnI1es0<)j3sL1ehFXzmdT}V-ajea(Zaq5O$IR#+ ziAT$WYDTYF-3%ciAzO#&CSty~_d};cSRb}T6M^uBs$#^Pdh|eVuZ_CjBn$fu6ZN;| z02Rq~2aHPW1DeqhDwKV-xJuMdx3h%%W}~63Q>7)$v6a}--!a_uM`kR)pSzCm+fwx`geZCuQjo(Fp z`E{>}X2mLcWYl`E3|9oHd1kNWZV&PS91?GA+t^qA5e-tJ3Uyuq=Io8Oztb7nB`CGU zPG`KMV~qy9FMU55oCz5bQ#91H3MmAS%|95QMfjZ!t~-BPS=T?_2w@xfuDI6yj$GQd z^XzXyE}QjJxZdw}4mA58@yVfINhh*=qU>mTwAK_E{`U4$r{=GpR{`$&E!EM{KDZuY zI%m6BvvOb1yzH*W189NXqi+c^S3*dPRg?qz`idVr-3fg5A<5UXJ}b9aAjx5^eGTFb zs)lLmDtD*?0|Kz%jF1pjao>SjisT+OC8bCT4SspWtW;6JgG64*&A9(625+LA!-w&q zQz=q-Vo_TP;qAHU76Ij)V9jCc{gBsq=89xrQmb!msamfL=cnc7VxgKJgK*iLa#WP; zS6gz5*x8;GaXu+h(S1DAQurfbaWOCOYS*I0_sztK9FXMA$jES+ZC$wrcMyB7@{p2R zmepAOS0Q&os)9!?C)`CnkVX)JJagyHKaD>>AfjT_$97#x5UlnWL<(O6Km$nyV3FWk z!;CLl_T4DPN7~s0ufh7xYRCOxOZfa>Hd*Jq3t=*!Z;Oej=jZHn7PPRz?6HDEOcVqooUlLLZN7vO?4}Nl?gT5^rU>=_NS=Kh!hf1N@<1 z*z@!2c^5yO?!{NIVtjGq+yxN|Pug^)>oM*6!LD9CxY6RO!Y>~n5T^W3UoTZ1gHPsJ zWI0cNIun~l$duT;kcZ>j$Vk?#2E~*2-zE6P++e*GE9*64a~eU!AfOX!=DuT4hJ!#} zArJdT#yyVs796cA#f^o06g`(P@*zOnR zZy+yUL6AjBvK~7&2{eYx0MtQY>Ehjr8R5TkC^D0O5lOqpsq}O7F^1O~K^&S>7UBQRixi2_5Q#!Etiw55dBC&uE@)k9TyY4!Kr$8H2+(l@Z2NOCaB?SQF`T6j0ChKeguRx(vYA@qeZHO&?!m$U$$}PAn5Wp* z(5mcHI{*eq3E0nP@vfQ04c0>0Kek>K@NFJo;b394F*+PInu9k3*`5nnlQJ}$l)fL7RQm~*9n;-SNr-Le%1D1q5(1_&*;3z zucKt3tOEWAI3m&;GR=_RP*Q?IC%5u$QhqLN&3F}}2x%#8?SGYX3ak?smmEq<+w7(e zz+rtxQAROY@VE5s*9FL z>s6rrvQG-cqCKVric*1uxa#ACJdcdjyD3Id73ZA_i|#pb5r-J_@%L0dql~587gJMw z1xuuxVSM_>{v~E;^;i>Q9t# z_ub&lZTdHPk2#vL10rPd=xAf}IOoAqMv|_o@sD#HD8kxej$NtI?RZKULw1R6-O`(F zusHx@s=DIzW}w;K>z8B_6Q2ufc_BCpT5S&UT|;M(jhibFKo+9UGA4 z{$a-vdsihYQVO)VuLRaj*v3T1Wxs+kP3@JpFodDHk0Oj0qs7F1?5;kasdH+0au(bS z2~@;H%ivmhdpjdaISa}i;@!BLRh^3e*0Eol{-^hA<>}ceo;kGguUN{M4xj<<=3@+eo76quTY;=f8VWTE zwK{T(6pN)S60~8`mnw2pCGv2+71LE{W|j4-Jc{8L}RR^$W2@~tvPhA3%qA^Rk&VTjvOMzp4izZkROCIoPmTq0j- zadB~a`lsf-OA^iDr9b>U2@@`VkEOA03}tr>Q!q&X8BU zK@vI7&cnd!0?UY#Qz@0y2fg=jq`rMi6(MQ$^*tQRSg*>)$_n%szN@Hdml}KuT4gIf z<#)O~9(Go!FqR9UrCXTujEjFFai00{@y&s8aK3h++Z;|OnHc6fser^78W=bP2V@3> zL5K1+cYxa|na{}rAOKjp9$x~8)p>ynoA8eD*vkU>^FkY1d{jA)0-DY z=Yo!V);r}HO>IQ?-R#O6`U(g5&wU%OlhPHx4#h0?j+@#i#YWGl+XW$8c}37u20s6chfy-+Cp>pA=6!62I{`=G8upLRpx9 z4{Q>DJTTZC7iTMdV}a4K!iNno;{IXMgW^3zxSz%Pdrhw)zTFj=4RI9xmdc}LMlxDz z`I~BknUB?HzDHHT2t;_gx)L0IRMa56(`@}uBf8s7?5;ig_sX+A^S-;8ODCrGyA0~2 zw)bYQ7F;#)PKV2;9)iv|(fdSx{~iW?TIGeiqh)eJb{}^ieSCTf;Y;%p5;-&Wu8jWQ zp|8rzew3cU|B@mWssD`;%arm>0IXbGd7jQjeXQ|*+$a$`c&G7MD#<=gop$R=l6?PY znasV_gpTMV9TLljI5%??=J!DeB$#!H%?;sHZbUN~kJOxS|+xym@KL2IfryQJ{UJV-*&0`w8%5-ugL%EST|U8>2M4 z8^W`)>-wgcIm6DG`T5=y3&VykiSb^HGdlW{(1e%u`#he= zs;Qai5GHk0BvRAa+;%{0D>_nA|A6}?W=iP%B%!-G-tdqGFMD6FIFSvmOtx!}NtIrHJQs7(u8>dhRWrU5lnEm) z1$?TgnCGg7A8juo3-B7AB+|)>fzQnPIy5Pq>EBbu@X0xB*YT`{#%LzJ)?J@ZxVLkq z@d~CSV@bgkCvzPuK*Wk1D}S7d8f@u}-$;U$vNuOw&2N-Kes(3-$SbL!=hjmW3Iwz`9`I6BV~ z&h4rE-de8#o`Cd|+jq`{M@N9qFT%=h}P1c^9nBy7@F2PVR%e6&!w% zbr~mhl0ur?JaPRN?5Lw(YtU?9Dt0SJB(LSgiQXS*`l#E$N zYe=Q{_cKJT64Td04;}y6y)aZK8Q_nFfJH4Rl|Yf|ih8Zv7KB_k>Z^VPFy7xeps6ppNvm0i`ubm_rjrO~v!=GZ+@yhFQ&V6(XYOjLbH=unCTX%BY1cO%S zdRLr<*PE^aVVgFnsskd7MlQ|~bGXCJ#dW0@fI5|sBdMRPw;0F)>;*WcE^rn<7`om- zEkm=Pq^t2#p7dtm{LVqfmYPIVeC|VbQ}nOHixGLZaVY;_i5p^r^1FJm{1Om&uiGB6 z1iMCArL?HXzAf@jX=y3M`G9sTCr1c?o8N6K;5SuOdw>>Rn4kYzY8lgCdJbtn)uD_k zI&=6`VtJneefOajN8Gh2n!tH8G-fK|3(VuNORdBc2K-R$k8KV2h(;e8+$Dh`Xo=$C zJY#jJ+$Ou^(B09|fpu;{ycm3Azear&Knfs_RSVrnLPAo-Apy@;(|M9k@WTKv$~cxS zV`=Y}*XvD)D9Zx)lRdU1AKhI^C6!?g4vS_=Fk5$}d6FUHTuK@guYP0=PGQNR#MCns z)L`*ZLxSXneQ#amLUL=yxGU~h&-~b(8a6bad9NclXOBv)e|?)yKn%@*n%R7ZOq|k3 z89K(U0SgG(SgLT}rv3{4?WUFRICkTp(Ur2zm(r0JO{Y&Ltq#GxF`0Hus->&{Hvw z@(^c_G#>uEA_P#5FKh6;A&dvihMa07m9p{hjQwUGnvVI*#VniOvYhlz5CK--bsaZ%|dw=IN0aZ|c@WaO@P90EOgp z>-=hf)zNFT(S>Sxv?z|uBcrwR#L)!N<6fUvF(c|(ambINX-Jz8whJfOrqeMfv+5_e#;u}fJZc?YF z-BBr)In-$zDRg=vL{xCi-Q!Wbm?T!gdim+?M&wJXwpj>MsNm>tYTg1WnAI`!xxy%8 z^++nYeyh6CXyYfJ3uY!pjMBd#d2Mgm8FcWfg+na+cvg0s6hktry!i70-B9bd71Al*5lisE%?TxdP}JYBG?K8PnzXgRjb-S~~461oLwHo~; zTFg+yQ40|l$gFJB$el`R?g6OHLE#h<)+kg=2Xw1(oCyzE znXozTx4fP%oaicE!o$MGg4j&mQ%(bn9xev)hJoPyfm=&#O&TQN5(E_OnNJQ|-wel-ttVSEX+D zEs5rvEJvBv^X(@Vo42U4Rcuz*FlRqURrOKu{wxtam=EeiNZt z#QBBT7%#1>`%h?c7-~DT8tLA}-$V&_OA&RJI+JU{T@Fh-kqMx$m-r=*-+dCdXO840!*DY2)TW*|Y3L7IU6h z3f>=qu;*R`$LOWS^OH0v;{$<8Prv?wKOc%7e<=3+#NR~BV{;BcvBLvzSG1+j_J{b! z2gDE5uzngeTx>slV%$I4q+%5Pdj-%{BZ8udEqhiD1PP@$uMW_?NO*UW4@3}=V?R`N z9%pI08_-((lhB}ZVe#Z<_r608>IYTWl;C!yO!>Vl+-^o1{vcM>&6&(&K2(XF_7~7mq;@|gV#lEMUO^1C%5JAL#P7nLQlp}av*!IR73_S%cS;6X6 zag+gb@_x?wgm-`36(TO|b<#F1nyNL40a|Kf9b>2dj)(6>7!Qf#t@`-|LXaAF^9|-bXi8xc5^2oi;&du-$o2xNMlGGCttT!jMc< z$lty``S4ae#djE?`4`=Tf9%kp3vkid9NGG z|3}(^=mvBKZv3zvn*V)Vz;vMl{QKWbAjW>EY0|YxbtdJ*pNWot3j52~#OA%*2mc04 zk7UDB{`X#33;HbM=Fz5+I(oYKmBmRHu%5w=v9f9^NBI;JDw3XbU}1<~`%gTFRut@G zqMYR_-N+Qe2>0)eO+U3yj9Tvx{+V*#we#~}3ABx9)^Gco(O=XkI^9$rN1$y9<* zSXrQcU(5dQyh*@5PXHCuZu8VPprZbx)3Emc-tii|qc2VQ0ypX^4Qgi~*|cc!?@i6H zH`Vh=F&6$!OvvWa;Pk2Xe;3}semUy$Ejfl^ar9~~xgK-!-!*CA2MboDuyeWUdO$!n z`Ho7mLlxJ_w^x|Pz717nVtsjPK6<+9pubb|$KNNmVxP$46Xk)qjz&lRsGGg*&+un+ zpu{THofX^v*<&)#Ls)4t`Qfz6|K5fI`yplZ>>L`M;C@YL*;eJ`ae79;6Yz$0-hc2$ z{(hijq8$fIfy;kA!-~SrH{{8Ddu{rE%(wfv*m3o?GpM#RI8T`U@S4=X)xT>km#dzU%9vNbQj_ z?!bVUp}=Q(%P z{U2Y^7yA`ojsGrcO%G@l#E3)^{qJ3{3O$XXpV@~mV&u@Bnu{>-e@E{=GxWA!;@Ip^ z6J~NEu?6k4Vd~; zwnu)Ix4cLhCxzr!)W^=6{LJG?_In4#`%kc}w%ovsHmK~l%MAGcYb|(89oztH!i0KS zB?H76f@8j-!=CrNMF$H1yH4$)S?New(rJW8T;zG_%?G$Ix~&C|w}|8GPWletupFX{ z*oIGeEd2!0QGF_jlV7n0PamrUL0~H4kAvL68u{l;L*BRlv!yjkLP8ze^pI`;Z9)H6 zZ^mK0bO9m9`((oi)Tj1$)-cUUpxC$vGB=?5nc5WjNhLp9Hm4=n4DD($#YeN*BpT8Pler4ZUk6$}2^|M8(wcz#$&%sG^Mqp!@<_p)v#wE3S=UIWD&gg@j4I9MK(^(u8xi+5J#|FV`63o zO4@>)oJdd5G&2W4;#F$dpIckj5tR@uSc58h%v6|gl8^_z4-OvQi@-qhh=^lb;eNol z1*;Cwdzagc^Fb!p#%7h&Jqxl1X1+0wN6}%zM?B2Tt5Dnrl)X`Ii%`>NXc+IXHro|H z^A(r@GSbtnC+lj{4S+PLw)PODGp;jheN{SrY-0uAXd?_B+S^+4CD6!+YF{TNp^E!y zZQb2AU!ix7fSZ42dir&IeEDxN%(ZkSUaPOHyQaW`YHn`cUk+4|R$~=~KxE(7<1+E2 z1q1+$O$PwV$*f%!3~*>;|6}V3NfSwl%zpOl8K`??A9k?R*F4=VGHwYA4i@m(b8PgC zlIDcMX0E5-CDi~g2Jl31Pgs0tSy(24pSgbvOk5^EIY+ zUUd5<3wzbQIt7&*M)1&(C~a^Kv2rBezdyD;J}JF1b{W=!ry9H`y)fGOs^`z22bZV1 zqGEb>_8Jip)tx(M&zz~*p4iyffMQ%@6BGC)(ADFU3w#|KQuExW23lg68+{Yy;G_T) zR|Mz#w{NUKE%3yrrlw{Rs@_3nZGN~olRz|I6;Oa`Yjmeho!ZcWEPzXU!9SJN)j+hQ z%bc5^F9#Y5o`-w2?mKQftB2qHDXnfsg~25Pv(#KhpyPE1U|2lP?xdUn7t0RFF%k`gW+ULwf;9v*@SVLY-% zT=m#6V?9^naK?}bSd)=R2o|aNiV~8L&^vL>O&RQOuPi|h36!4UCx|>?hYy=&CThAzYGj;3JH0_Z=qefbjcnAqQ(M(f|tp7^g#R6*tpbwrd=`Z ze#i}uS%5Zs?OaxWulMhla3QXt_us(bg?@fT>dVDIBcF?k3XP+0U=aEGb=D~6_xcpMpxf7xk=g0#)TunYE4e*E~+aY@r? z0K0S$Qy=&xSo!Si>~xM>pF9IYE(DUKS0J><<&34Phh6FUvuD%~5@=nZc;M1aK4l!c z6Aza2a4bALJRl$dxG9h|d?uYpb5dARLomm--X#e<0byR{Jsgk_ef!o3#^EKk+{XHP zgr$Ih0L(vM0uZ~z4!#@v#kPW*iNan&l$2sSksA3ABqd+Nbeq^eLx$r*^3 zuUx(Av=0Ldd>Kbw+>@<>Y;0_h@2{(?bE9;1cb5tA3QvJq+&nz2ZczXMj~yitUd&Z1 z_;pm`XYb&UPD&%6l;;?8=j&V*fZKp6hQ28N2-`d`8 zG5gd=I$cRfdmh*vo;(4v&$>EKxEgr(2NS(T+_#sr^Ye*Ck@&s;oIcIO$ml}=x;!w6 zL<3ZERn1E^OikxtdMpx`!?*d4lV5nei{2akF>1kzf@lViJFKs-SK3YaO{Cuz^Gg6a z6P!Y*y9bo zZbKxxJW`qqC&f8`w-w&Ob8-;F+ufJ}4ugKPyD%s)e?b>GZaTV!(((@XF%oJK zQ8X`K7h&8eXOl0*ti9 zz>SgNVW`P^fMW-@PfbPLZh}%P09t47bAg+`K#}zMg_=9MJTH zy(HeDAmJ3y-+b2lw`MXQpaT}ARSO1!`Bf)FsR^faVQXh6ocs2Yk^yp*9~&Ffy+QtI z4vy5S9T1Peyn1XaUd3;j-bZolUBEiCALc;Fl~eEwx< z2m{AC=Gy|qq(H$!iJzI-W~My~b|u)?ExK!A+gF-`)X6zKow}!VKCCdX&dz0pg%PM6 zSh?J$KUK9kv76SL{BW`lkFW>@Xgxgzh5x9jshK~2O@QL!Qr(F>==u#?=kpz`P&Tm3 z4laFhx66+8yL59TQ=Z~B`sveyg8Cyqw_j$pY1sf%Pk-+DAc03wK|#+poWk?>ZBRQZ z?a6_ldv0$368`1O+-z)wqHs2@!Qmat0<~S!UTYA1JckE+E0qtD-AEG5A0k{|P#Yjf z&B~f@k76jeS@Y)@VI_w>2p3LD_yWmX)^Q)goZCc2Mc+0<66fvJCsYu(D=#a%CaMMX zHZ2rhU#gd&07FDXWFvFFtF!a1U(Icq7&02p2nMNwn=^BB65`?ui4|14%f&rD1VDQO zy$G9`o7&6B$OnmhoY3FR%`t#afkfA$6Y$(Wc+DzeG5Ymu>r!N!{1>ykRfiyr^eR*g zC`UTFx`4fScXJNZC~K-Fl;jleKI;+&? zfkw>fQ&MOV<%72MaK_uWQ((Q!cE+AQhac`1&8QC9`^Oh<1Mu|C{$sq`TvlIiaoXG4 zPY2|u|1pbD8gKG%3IZjw@-c7agk$>svTOP+Kg8bQr@4pp)V;f4+DoJTjki_490CE9C=+( zP>{e02C6z$yO{){7`vKjTW4;4aa#+HU~u_X`qE#l>b_N`hfO#kJp7I3 z6R;29@S`IN0!#Aj*|SevU3vKURwrslzZn6k$==QyOMxipgXq-o2n*}tu<12;gVr+G zH`mlprY;U$31&WAufYtqf8Bb|TCl{`3UokY#>UVXR4w2@bp3`{_+x9YD?Xn>ixOQ&vCvYK<|Ly>wYT*Yw96SsLB3u_27dWWFcLNsaI;c|& x86aIbIaIvx{(8()K7SbA{vSHl|MSu@=ij(>hlfqo94nwni9bNU6V-e6{{h;E0(bxb literal 0 HcmV?d00001 diff --git a/examples/sleepy_device/main/CMakeLists.txt b/examples/sleepy_device/main/CMakeLists.txt new file mode 100644 index 000000000..f48a36750 --- /dev/null +++ b/examples/sleepy_device/main/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRC_DIRS "." + PRIV_INCLUDE_DIRS ".") + +set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17) +target_compile_options(${COMPONENT_LIB} PRIVATE "-DCHIP_HAVE_CONFIG_H") diff --git a/examples/sleepy_device/main/app_main.cpp b/examples/sleepy_device/main/app_main.cpp new file mode 100644 index 000000000..25554b3f6 --- /dev/null +++ b/examples/sleepy_device/main/app_main.cpp @@ -0,0 +1,168 @@ +/* + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include +#if CONFIG_PM_ENABLE +#include +#endif + +#include +#include + +#include +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD +#include +#endif + +#include +#include + +static const char *TAG = "app_main"; + +using namespace esp_matter; +using namespace esp_matter::attribute; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +constexpr auto k_timeout_seconds = 300; + +static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) +{ + switch (event->Type) { + case chip::DeviceLayer::DeviceEventType::kInterfaceIpAddressChanged: + ESP_LOGI(TAG, "Interface IP Address changed"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: + ESP_LOGI(TAG, "Commissioning complete"); + break; + + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStarted: + ESP_LOGI(TAG, "Commissioning session started"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningSessionStopped: + ESP_LOGI(TAG, "Commissioning session stopped"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowOpened: + ESP_LOGI(TAG, "Commissioning window opened"); + break; + + case chip::DeviceLayer::DeviceEventType::kCommissioningWindowClosed: + ESP_LOGI(TAG, "Commissioning window closed"); + break; + + case chip::DeviceLayer::DeviceEventType::kFabricRemoved: + { + ESP_LOGI(TAG, "Fabric removed successfully"); + if (chip::Server::GetInstance().GetFabricTable().FabricCount() == 0) + { + chip::CommissioningWindowManager & commissionMgr = chip::Server::GetInstance().GetCommissioningWindowManager(); + constexpr auto kTimeoutSeconds = chip::System::Clock::Seconds16(k_timeout_seconds); + if (!commissionMgr.IsCommissioningWindowOpen()) + { + /* After removing last fabric, this example does not remove the Wi-Fi credentials + * and still has IP connectivity so, only advertising on DNS-SD. + */ + CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow(kTimeoutSeconds, + chip::CommissioningWindowAdvertisement::kDnssdOnly); + if (err != CHIP_NO_ERROR) + { + ESP_LOGE(TAG, "Failed to open commissioning window, err:%" CHIP_ERROR_FORMAT, err.Format()); + } + } + } + break; + } + + case chip::DeviceLayer::DeviceEventType::kFabricWillBeRemoved: + ESP_LOGI(TAG, "Fabric will be removed"); + break; + + case chip::DeviceLayer::DeviceEventType::kFabricUpdated: + ESP_LOGI(TAG, "Fabric is updated"); + break; + + case chip::DeviceLayer::DeviceEventType::kFabricCommitted: + ESP_LOGI(TAG, "Fabric is committed"); + break; + default: + break; + } +} + +static esp_err_t app_identification_cb(identification::callback_type_t type, uint16_t endpoint_id, uint8_t effect_id, + uint8_t effect_variant, void *priv_data) +{ + ESP_LOGI(TAG, "Identification callback: type: %u, effect: %u, variant: %u", type, effect_id, effect_variant); + return ESP_OK; +} + +static esp_err_t app_attribute_update_cb(attribute::callback_type_t type, uint16_t endpoint_id, uint32_t cluster_id, + uint32_t attribute_id, esp_matter_attr_val_t *val, void *priv_data) +{ + esp_err_t err = ESP_OK; + + if (type == PRE_UPDATE) { + /* Driver update */ + } + + return err; +} + +extern "C" void app_main() +{ + esp_err_t err = ESP_OK; + + /* Initialize the ESP NVS layer */ + nvs_flash_init(); + +#if CONFIG_PM_ENABLE + esp_pm_config_t pm_config = { + .max_freq_mhz = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ, + .min_freq_mhz = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ, +#if CONFIG_FREERTOS_USE_TICKLESS_IDLE + .light_sleep_enable = true +#endif + }; + err = esp_pm_configure(&pm_config); +#endif + /* Create a Matter node and add the mandatory Root Node device type on endpoint 0 */ + node::config_t node_config; + node_t *node = node::create(&node_config, app_attribute_update_cb, app_identification_cb); + endpoint::on_off_light::config_t endpoint_config; + endpoint_t *app_endpoint = endpoint::on_off_light::create(node, &endpoint_config, ENDPOINT_FLAG_NONE, NULL); + + /* These node and endpoint handles can be used to create/add other endpoints and clusters. */ + if (!node || !app_endpoint) { + ESP_LOGE(TAG, "Matter node creation failed"); + } + +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD + /* Set OpenThread platform config */ + esp_openthread_platform_config_t config = { + .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), + .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), + .port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(), + }; + set_openthread_platform_config(&config); +#endif + + /* Matter start */ + err = esp_matter::start(app_event_cb); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Matter start failed: %d", err); + } +} diff --git a/examples/sleepy_device/main/app_priv.h b/examples/sleepy_device/main/app_priv.h new file mode 100644 index 000000000..c23600252 --- /dev/null +++ b/examples/sleepy_device/main/app_priv.h @@ -0,0 +1,33 @@ +/* + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#include +#include + +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD +#include "esp_openthread_types.h" +#endif + +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD +#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \ + { \ + .radio_mode = RADIO_MODE_NATIVE, \ + } + +#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \ + { \ + .host_connection_mode = HOST_CONNECTION_MODE_NONE, \ + } + +#define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \ + { \ + .storage_partition_name = "nvs", .netif_queue_size = 10, .task_queue_size = 10, \ + } +#endif diff --git a/examples/sleepy_device/main/idf_component.yml b/examples/sleepy_device/main/idf_component.yml new file mode 100644 index 000000000..95ee7845b --- /dev/null +++ b/examples/sleepy_device/main/idf_component.yml @@ -0,0 +1,6 @@ +dependencies: + espressif/cmake_utilities: + version: 0.* + rules: # will add "optional_component" only when all if clauses are True + - if: "idf_version >=5.0" + - if: "target in [esp32c2]" diff --git a/examples/sleepy_device/partitions.csv b/examples/sleepy_device/partitions.csv new file mode 100644 index 000000000..ffe5f242e --- /dev/null +++ b/examples/sleepy_device/partitions.csv @@ -0,0 +1,10 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: Firmware partition offset needs to be 64K aligned, initial 36K (9 sectors) are reserved for bootloader and partition table +esp_secure_cert, 0x3F, ,0xd000, 0x2000, encrypted +nvs, data, nvs, 0x10000, 0xC000, +nvs_keys, data, nvs_keys,, 0x1000, encrypted +otadata, data, ota, , 0x2000 +phy_init, data, phy, , 0x1000, +ota_0, app, ota_0, 0x20000, 0x1E0000, +ota_1, app, ota_1, 0x200000, 0x1E0000, +fctry, data, nvs, 0x3E0000, 0x6000 diff --git a/examples/sleepy_device/sdkconfig.defaults b/examples/sleepy_device/sdkconfig.defaults new file mode 100644 index 000000000..adb802253 --- /dev/null +++ b/examples/sleepy_device/sdkconfig.defaults @@ -0,0 +1,42 @@ +# Default to 921600 baud when flashing and monitoring device +CONFIG_ESPTOOLPY_BAUD_921600B=y +CONFIG_ESPTOOLPY_BAUD=921600 +CONFIG_ESPTOOLPY_COMPRESSED=y +CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y + +#enable BT +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y + +#disable BT connection reattempt +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n + +#enable lwip ipv6 autoconfig +CONFIG_LWIP_IPV6_AUTOCONFIG=y + +# Use a custom partition table +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0xC000 + +# Button +CONFIG_BUTTON_PERIOD_TIME_MS=20 +CONFIG_BUTTON_LONG_PRESS_TIME_MS=5000 + +# disable softap by default +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n + +# Disable DS Peripheral +CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n + +# Use compact attribute storage mode +CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y + +# Enable HKDF in mbedtls +CONFIG_MBEDTLS_HKDF_C=y + +# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) +# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) +CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 diff --git a/examples/sleepy_device/sdkconfig.defaults.esp32h2 b/examples/sleepy_device/sdkconfig.defaults.esp32h2 new file mode 100644 index 000000000..81d7f951f --- /dev/null +++ b/examples/sleepy_device/sdkconfig.defaults.esp32h2 @@ -0,0 +1,93 @@ +CONFIG_IDF_TARGET="esp32h2" + +# libsodium +CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y + +# NIMBLE +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_NIMBLE_EXT_ADV=n +CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=n + +# FreeRTOS should use legacy API +CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY=y + +# Enable OpenThread +CONFIG_OPENTHREAD_ENABLED=y +CONFIG_OPENTHREAD_SRP_CLIENT=y +CONFIG_OPENTHREAD_DNS_CLIENT=y +CONFIG_OPENTHREAD_LOG_LEVEL_DYNAMIC=n +CONFIG_OPENTHREAD_LOG_LEVEL_NOTE=y +CONFIG_OPENTHREAD_CLI=n + +# Disable lwip ipv6 autoconfig +CONFIG_LWIP_IPV6_AUTOCONFIG=n + +# Use a custom partition table +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" + +# LwIP config for OpenThread +CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_MULTICAST_PING=y + +# MDNS platform +CONFIG_USE_MINIMAL_MDNS=n +CONFIG_ENABLE_EXTENDED_DISCOVERY=y + +# Enable OTA Requestor +CONFIG_ENABLE_OTA_REQUESTOR=y + +# Disable STA and AP for ESP32H2 +CONFIG_ENABLE_WIFI_STATION=n +CONFIG_ENABLE_WIFI_AP=n + +# Disable chip shell +CONFIG_ENABLE_CHIP_SHELL=n + +# Enable DS Peripheral +CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=y + +# BLE Sleep +CONFIG_BT_LE_SLEEP_ENABLE=y +CONFIG_BT_LE_LP_CLK_SRC_DEFAULT=y + +# Use external 32K crystal +CONFIG_RTC_CLK_SRC_EXT_CRYS=y + +# Enable power management +CONFIG_PM_ENABLE=y +CONFIG_PM_DFS_INIT_AUTO=y +CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP=y +CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y + +# FreeRTOS config for light sleep +CONFIG_FREERTOS_HZ=1000 +CONFIG_FREERTOS_USE_TICKLESS_IDLE=y + +# Enable IEEE 802.15.4 sleep +CONFIG_IEEE802154_SLEEP_ENABLE=y + +# FreeRTOS config for light sleep +CONFIG_LWIP_ND6=n +CONFIG_LWIP_IPV4=n +CONFIG_DISABLE_IPV4=y + +# Disable hardware acceleration +CONFIG_MBEDTLS_HARDWARE_AES=n +CONFIG_MBEDTLS_HARDWARE_MPI=n +CONFIG_MBEDTLS_HARDWARE_SHA=n +CONFIG_MBEDTLS_HARDWARE_ECC=n +CONFIG_MBEDTLS_HARDWARE_ECDSA_VERIFY=n +CONFIG_MBEDTLS_SSL_PROTO_DTLS=y + +# Use OpenThread MTD +CONFIG_OPENTHREAD_MTD=y + +# ICD configurations +CONFIG_ENABLE_ICD_SERVER=y +CONFIG_ICD_FAST_POLL_INTERVAL_MS=500 +CONFIG_ICD_IDLE_MODE_INTERVAL_SEC=60 +CONFIG_ICD_ACTIVE_MODE_INTERVAL_MS=1000 +CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS=1000 diff --git a/examples/zap_light/CMakeLists.txt b/examples/zap_light/CMakeLists.txt index 61ba76e0f..51f60766d 100644 --- a/examples/zap_light/CMakeLists.txt +++ b/examples/zap_light/CMakeLists.txt @@ -72,4 +72,4 @@ idf_build_set_property(CXX_COMPILE_OPTIONS "-DEMBER_AF_WINDOW_COVERING_CLUSTER_S idf_build_set_property(CXX_COMPILE_OPTIONS "-DEMBER_AF_FAN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT=1" APPEND) idf_build_set_property(CXX_COMPILE_OPTIONS "-DEMBER_AF_DISHWASHER_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT=1" APPEND) idf_build_set_property(CXX_COMPILE_OPTIONS "-DEMBER_AF_LAUNDRY_WASHER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT=1" APPEND) -idf_build_set_property(CXX_COMPILE_OPTIONS "-DMATTER_SCENES_TABLE_SIZE=CONFIG_ESP_MATTER_SCENES_TABLE_SIZE" APPEND) +idf_build_set_property(CXX_COMPILE_OPTIONS "-DEMBER_AF_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT=1" APPEND)