From e1d418a34a633e24e27606f6c89adb25230ad982 Mon Sep 17 00:00:00 2001
From: Ali Shah
Date: Tue, 12 Sep 2023 20:54:44 +0800
Subject: [PATCH] Added CI related code
---
.gitlab/ci/build.yml | 41 ++++++++++++++++++++++++++++++
.gitlab/ci/rules.yml | 12 +++++++++
README.md | 17 ++++++++-----
README_cn.md | 19 +++++++++-----
docs/_static/matter/apple1.png | Bin 0 -> 113143 bytes
docs/_static/matter/apple2.png | Bin 0 -> 87068 bytes
docs/_static/matter/apple3.png | Bin 0 -> 27904 bytes
docs/_static/matter/apple4.png | Bin 0 -> 31468 bytes
docs/_static/matter/apple5.png | Bin 0 -> 35730 bytes
docs/_static/matter/apple6.png | Bin 0 -> 30473 bytes
examples/chatgpt_demo/README.md | 19 +++++++-------
examples/image_display/README.md | 3 +--
examples/lv_demos/README.md | 4 +--
examples/lv_demos/main/lv_demos.c | 6 ++++-
launch.toml | 38 ++++++++++++++++++++++++++-
15 files changed, 132 insertions(+), 27 deletions(-)
create mode 100644 docs/_static/matter/apple1.png
create mode 100644 docs/_static/matter/apple2.png
create mode 100644 docs/_static/matter/apple3.png
create mode 100644 docs/_static/matter/apple4.png
create mode 100644 docs/_static/matter/apple5.png
create mode 100644 docs/_static/matter/apple6.png
diff --git a/.gitlab/ci/build.yml b/.gitlab/ci/build.yml
index 09c15a7..39d721d 100644
--- a/.gitlab/ci/build.yml
+++ b/.gitlab/ci/build.yml
@@ -46,6 +46,47 @@
--collect-size-info size_info.txt
--default-build-targets $IDF_TARGET
+.build_matter_examples: &build_matter_examples
+ <<: *build_template
+ variables:
+ IDF_CI_BUILD: "1"
+ script:
+ - pip install --upgrade idf-component-manager
+ - pip install idf_build_apps
+ # setup esp_matter
+ - git clone --depth 1 https://github.com/espressif/esp-matter.git
+ - cd esp-matter
+ - git submodule update --init --depth 1
+ - cd ./connectedhomeip/connectedhomeip
+ - ./scripts/checkout_submodules.py --platform linux esp32 --shallow
+ - cd ../..
+ # `|| true` below ignores errors in the process, it's okay, since we are
+ # only interested pigweed setup which goes through as expected
+ - . $IDF_PATH/export.sh
+ - ./install.sh || true
+ - . ./export.sh
+ - cd ..
+ - python -m idf_build_apps build -vv
+ -p $EXAMPLE_DIR
+ -t all
+ --config "sdkconfig.ci.*="
+ --build-dir build_@t_@w
+ --build-log build_log.txt
+ --size-file size.json
+ --check-warnings
+ --ignore-warning-str "$WARNING_STR"
+ --collect-size-info size_info.txt
+ --default-build-targets $IDF_TARGET
+
+build_example_matter_switch_v5.1:
+ extends:
+ - .build_matter_examples
+ - .rules:build:example_matter_switch
+ image: espressif/idf:release-v5.1
+ variables:
+ IDF_TARGET: esp32s3
+ EXAMPLE_DIR: examples/matter_switch
+
build_example_chatgpt_demo_v5.0:
extends:
- .build_examples_template
diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml
index 1fb6d3f..1c4f26a 100644
--- a/.gitlab/ci/rules.yml
+++ b/.gitlab/ci/rules.yml
@@ -10,6 +10,9 @@
.patterns-example_chatgpt_demo: &patterns-example_chatgpt_demo
- "examples/chatgpt_demo/**/*"
+.patterns-example_matter_switch: &patterns-example_matter_switch
+ - "examples/matter_switch/**/*"
+
.patterns-example_factory_demo: &patterns-example_factory_demo
- "examples/factory_demo/**/*"
@@ -53,6 +56,15 @@
- <<: *if-dev-push
changes: *patterns-example_chatgpt_demo
+.rules:build:example_matter_switch:
+ rules:
+ - <<: *if-protected
+ - <<: *if-label-build
+ - <<: *if-dev-push
+ changes: *patterns-components_bsp
+ - <<: *if-dev-push
+ changes: *patterns-example_matter_switch
+
.rules:build:example_factory_demo:
rules:
- <<: *if-protected
diff --git a/README.md b/README.md
index 12ff31c..95ed013 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
* [中文版本](README_cn.md)
-
+* [Promotional Video](https://www.youtube.com/watch?v=KGVOi1Mrjb0)
# ESP-BOX AIoT Development Framework
@@ -34,14 +34,14 @@ ESP-BOX provides a platform for developing applications in various domains, incl
| :-----: | :---------------------: |:---------------------: |
| [ESP32-S3-BOX](docs/hardware_overview/esp32_s3_box/hardware_overview_for_box.md) |
|End of Life
[User Guide](https://github.com/espressif/esp-box/blob/v0.5.0/docs/getting_started.md) |
| [ESP32-S3-BOX-Lite](docs/hardware_overview/esp32_s3_box_lite/hardware_overview_for_lite.md) |
|[Active](https://www.aliexpress.com/item/1005004441701974.html?spm=a2g0o.store_pc_groupList.8148356.15.378130cf2Qwt87&pdp_npi=3%40dis%21HKD%21HKD273.50%21HKD273.50%21%21%21%21%21%40210318cb16926755466344763e3593%2112000029194032303%21sh%21HK%213721963538)
[User Guide](https://github.com/espressif/esp-box/blob/v0.5.0/docs/getting_started.md)|
-| [ESP32-S3-BOX-3](docs/hardware_overview/esp32_s3_box_3/hardware_overview_for_box_3.md) |
|[Active](https://www.aliexpress.com/item/1005005920207976.html)
[User Guide](./docs/getting_started.md)|
+| [ESP32-S3-BOX-3 (beta)](docs/hardware_overview/esp32_s3_box_3/hardware_overview_for_box_3.md) |
|[Active](https://www.aliexpress.com/item/1005005920207976.html)
[User Guide](./docs/getting_started.md)|
## Versions
| ESP-BOX | Dependent ESP-IDF | Branch Note | Support State |
| :--------------: | :---------------: | :----------------------------------------------------: | -------------- |
-| master | >= release/v5.1
commit id: 22cfbf30c3 | Latest developing firmware
esp-sr components version: v1.4.1 | Partial support for ESP32-S3-BOX, ESP32-S3-BOX-Lite, and ESP32-S3-BOX-3
Refer to the Examples **README** for more details. |
+| master | >= release/v5.1
commit id: 22cfbf30c3 | Latest developing firmware
esp-sr components version: v1.4.1 | Partial support for ESP32-S3-BOX, ESP32-S3-BOX-Lite, and ESP32-S3-BOX-3
**Use menuconfig to select board**
Refer to the Examples **README** for more details. |
| Tag 0.5.0 | release/v5.1
commit id: 22cfbf30c3 | esp-sr components version: v1.3.4 | Compatible with ESP32-S3-BOX and ESP32-S3-BOX-Lite
Use menuconfig to select board |
| Tag 0.3.0 | release/v4.4
commit id: 2bdea81b2a | esp-sr version: dev/v2.0
commit id: c873a35 | Compatible with ESP32-S3-BOX and ESP32-S3-BOX-Lite |
| Tag 0.2.1 | release/v4.4 with [patch](https://github.com/espressif/esp-box/tree/v0.2.1/idf_patch) | esp-sr version: close v1.0
commit id: 3ce34fe | Support ESP32-S3-BOX only |
@@ -83,18 +83,23 @@ ESP-BOX provides a platform for developing applications in various domains, incl
## Developer Guide
-ESP-BOX integrates components commonly used in AIoT development that you can leverage to build your own applications. Read more development guide [here](./docs/development_guide.md) (Updates in Progress).
+ESP-BOX integrates components commonly used in AIoT development that you can leverage to build your own applications.
### Quick Start
* **Step 1**. ESP-IDF (Espressif IoT Development Framework) is required to build the application. If this is your first time using the ESP-IDF, please refer to [ESP-IDF development guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/index.html) to understand the open-source drivers and components provided by Espressif.
-* **Step 2**. Next, setting up development environment. Please refer to [ESP-IDF(release/v5.1) Installation Step by Step](https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32s3/get-started/index.html#ide).
+* **Step 2**. Next, setting up development environment. Please refer to [ESP-IDF (release/v5.1) Installation Step by Step](https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32s3/get-started/index.html#ide).
* **Step 3**. Run command `git clone --recursive https://github.com/espressif/esp-box.git` to download the code of this project and then switch the ESP-IDF version to [specified version](#versions);
* **Step 4**. Take a small step, you can [build and flash a simple example](./examples/image_display).
* **Step 5**. Moving further, please read [ESP-BOX technical architecture](./docs/technical_architecture.md) to understand the technical details.
* **Step 6**. Going deeper, please read [ESP Speech Recognition Application Guide](https://github.com/espressif/esp-sr), [ESP RainMaker Programming Guide](https://docs.espressif.com/projects/esp-rainmaker/en/latest/), [LVGL GUI Quick overview](https://docs.lvgl.io/8.3/).
* **Step 7**. For extended function, please read [Pmod™ compatible headers](./docs/hardware_overview) and [ESP-IDF API reference](https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32s3/api-reference/index.html), to develop drivers for more extended devices.
-
+### Cloud Quick Start
+The ESP BOX APP is built based on the commercial mobile APP architecture, Nova Home, which provides fancy UI and better user experience but has limited openness. To gain access to it, customers are required to contact us commercially via email at sales@espressif.com.
+For developer, we offer [ESP RainMaker](https://rainmaker.espressif.com/) solution, which includes publicly available development document and API guide. Below is the pathway to access them:
+* [ESP RainMaker Get Started](https://rainmaker.espressif.com/docs/get-started.html)
+* [ESP RainMaker Programming Guide](https://docs.espressif.com/projects/esp-rainmaker/en/latest/)
+* [RainMaker App APIs Definitions](https://swaggerapis.rainmaker.espressif.com)
## Contact Us
* If you have any technical issues, please submit issue tickets at [GitHub Issues](https://github.com/espressif/esp-box/issues) or forum [esp32.com](https://esp32.com/) for help.
diff --git a/README_cn.md b/README_cn.md
index a61c14b..dccc929 100644
--- a/README_cn.md
+++ b/README_cn.md
@@ -34,15 +34,14 @@ ESP-BOX 为各个领域的应用提供了开发资源,包括离线语音助手
| :-----: | :---------------------: |:---------------------: |
| [ESP32-S3-BOX](docs/hardware_overview/esp32_s3_box/hardware_overview_for_box_cn.md) |
|寿命终止
[用户指南](https://github.com/espressif/esp-box/blob/v0.5.0/docs/getting_started_cn.md) |
| [ESP32-S3-BOX-Lite](docs/hardware_overview/esp32_s3_box_lite/hardware_overview_for_lite_cn.md) |
|[在售](https://item.taobao.com/item.htm?spm=a312a.7700824.w4002-8715811646.9.4048605fNqggSF&id=658634202331)
[用户指南](https://github.com/espressif/esp-box/blob/v0.5.0/docs/getting_started_cn.md)|
-| [ESP32-S3-BOX-3](docs/hardware_overview/esp32_s3_box_3/hardware_overview_for_box_3_cn.md) |
|[在售](https://item.taobao.com/item.htm?ft=t&id=732842971319)
[用户指南](./docs/getting_started_cn.md)|
+| [ESP32-S3-BOX-3 (beta)](docs/hardware_overview/esp32_s3_box_3/hardware_overview_for_box_3_cn.md) |
|[在售](https://item.taobao.com/item.htm?ft=t&id=732842971319)
[用户指南](./docs/getting_started_cn.md)|
## 版本信息
-
| ESP-BOX | 依赖的 ESP-IDF | 分支信息 | 支持状态 |
| :-------: | :----------------------------------------------------------: | :----------------------------------------------------------: | ------------------------------------------------------- |
-| master | >= release/v5.1
commit id: 22cfbf30c3 | Latest developing firmware
esp-sr components version: v1.4.1 | 部分支持 ESP32-S3-BOX,ESP32-S3-BOX-Lite 和 ESP32-S3-BOX-3
详见 Examples **README** |
+| master | >= release/v5.1
commit id: 22cfbf30c3 | Latest developing firmware
esp-sr components version: v1.4.1 | 部分支持 ESP32-S3-BOX,ESP32-S3-BOX-Lite 和 ESP32-S3-BOX-3
**使用 menuconfig 选择开发板**
详见 Examples **README** |
| Tag 0.5.0 | release/v5.1
commit id: 22cfbf30c3 | esp-sr components version: v1.3.4 | 兼容 ESP32-S3-BOX 和 ESP32-S3-BOX-Lite
使用 menuconfig 选择开发板 |
| Tag 0.3.0 | release/v4.4
commit id: 22cfbf30c3 | esp-sr version: dev/v2.0
commit id: c873a35 | 兼容 ESP32-S3-BOX 和 ESP32-S3-BOX-Lite |
| Tag 0.2.1 | release/v4.4 with [patch](https://github.com/espressif/esp-box/tree/v0.2.1/idf_patch) | esp-sr version: close v1.0
commit id: 3ce34fe | 仅支持 ESP32-S3-BOX |
@@ -59,7 +58,6 @@ ESP-BOX 为各个领域的应用提供了开发资源,包括离线语音助手
* 可视化拖放式 GUI 开发:LVGL SquareLine Studio、Embedded Wizard 等
* 丰富的开发框架:ESP-IDF、Arduino、PlatformIO、Circuit Python 等
-
## 开源内容
* [原理图与 PCB 源文件](./hardware)
@@ -83,7 +81,7 @@ ESP-BOX 为各个领域的应用提供了开发资源,包括离线语音助手
## 开发指引
-ESP-BOX 调用乐鑫包管理器 ESP Registry 中常用的组件,您可以利用这些组件构建自己的应用。点击了解更多[开发指南](./docs/development_guide_cn.md)(持续更新中)。
+ESP-BOX 调用乐鑫包管理器 ESP Registry 中常用的组件,您可以利用这些组件构建自己的应用。
### 快速开始
@@ -94,13 +92,22 @@ ESP-BOX 调用乐鑫包管理器 ESP Registry 中常用的组件,您可以利
* **Step 5**. 更进一步,您可以阅读 [ESP-BOX 技术架构说明](./docs/technical_architecture_cn.md),了解更多技术细节;
* **Step 6**. 深入开发,您可以阅读 [ESP 语音识别应用开发指南](https://github.com/espressif/esp-sr),[ESP RainMaker 编程指南](https://docs.espressif.com/projects/esp-rainmaker/en/latest/),[LVGL UI 界面开发快速总览](https://docs.lvgl.io/8.3/);
* **Step 7**. 扩展功能,您可以阅读 [开发板 Pmod™ 兼容接口介绍](./docs/hardware_overview) 和 [ESP-IDF API 参考手册](https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32s3/api-reference/index.html),为更多扩展设备开发驱动。
+ESP BOX APP基于商业软件架构Nova Home构建,提供了精美的用户界面和更好的用户体验,但开放性有限,客户需要通过电子邮件sales@espressif.com与我们联系以获取访问权限。
+
+### 云连接开发指南
+
+ESP BOX APP 基于商业版 Nova Home 应用 APP 构建,拥有精美的用户界面和更好的用户体验,但由于 Nova Home App 有限开放,客户如需项目资源,可通过 sales@espressif.com 邮件与我们联系。
+对于个人开发者,我们提供 [ESP RainMaker](https://rainmaker.espressif.com/zh-hans/) 解决方案,其中包括公开可用的开发文档和 API 指南。以下是开发资源访问路径:
+
+- [ESP RainMaker 快速入门](https://rainmaker.espressif.com/docs/get-started.html)
+- [RainMaker App API 定义](https://swaggerapis.rainmaker.espressif.com)
+- [ESP RainMaker 编程指南](https://docs.espressif.com/projects/esp-rainmaker/en/latest/index.html#)
## 联系我们
* 如果有任何开发和使用问题,您可添加 [GitHub Issues](https://github.com/espressif/esp-box/issues) 或到 [esp32.com](https://esp32.com/) 论坛寻求帮助;
* 如果你对 ESP-BOX 项目感兴趣,欢迎到论坛 [ESP-BOX 版块](https://www.esp32.com/viewforum.php?f=43)交流想法。
-
## 贡献示例
我们欢迎任何软件或硬件相关的开源贡献,如果您有任何要与我们分享的示例,请参考[贡献指南](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/contribute/index.html)后提交 [Pull Requests](https://github.com/espressif/esp-box/pulls) 贡献代码。
diff --git a/docs/_static/matter/apple1.png b/docs/_static/matter/apple1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7d216799a6caf07c96420a0ea6a3759f57e7f39
GIT binary patch
literal 113143
zcmXt8V|Zmf7rnJ@yEC;lwWhZ1c4}LdH*zuqSlHRynlU(=IGLH*IsdYExrFEu002kzcYs0pMp9(}~HzrX*bC6@tVVO8|iU?l|tCG{eJ%lQmebhNA5P>K2Kn2?FSVU(n?
zKvc?tqaf3RGzhQ-NzfsX}`^YZ;wsmnLKRH4_b^bYnPkYUp*%ki4%Dp1eDQZ
zXoJ|hNYRAANKfXs!l35^O#rB+M4!+AGld^Cf@yp;;`xgiy*rgc*IxH@@Ue5Gh4TfI
zeo7}Tqe%+`ekvp0RM573a|pk5Sil`FVBGp+RhLu%h!Mh{QB!3tfPaNsjLV7^V#X0r
zLI9z@w;lhmXAN+uYQ#evp&E6x1eSS{n!AD8j+wvK3;^I?g6tviKvHz3c3R8%)gk!G
zYV79~#j0Mq;&kvlBA}eMozrwE?OVu%FHzdpr`KAlfXSKg?_83ZXbPo7&>gV}p?X(fSy>4lzI?
z9cd$Uf57rsDp!OB%)54=DZLQ(J<3JPn+K%-j;?6C5Q-YhJALOS1Azw9fjzH(2?B=qxf-tK)rMN1du{zB31t;M7&CLG#+ukM
zhM!=4tB$@KMTZt2g|&@fey1Q9;BN8TOSf^MMnxUwYDl_DveIw9#9`E%)m700DOk-d
z3I(cDb#T8bUv&$gieqnA_rwq+oU^#4Vbsx86~h@mORF8s(JiFx)e&nUy25j)m9ge&
zh0ikH8qXoiDc)4-3q3Q14nv?9OmBgl+OHFA3o8XQYMoVAr($@)CSDIKn#36}R?m*M
z-=e0FLJN%}<%oJ>J_$FCu8J9H_B*fb8L&y=cga4S1@~onqFp+)D6&*(2{2P9605^Y}SD_2CL_KHU6x;BLsPy3*orN
z;F(a`4}LsPheHMK`1CrS{-Yvq7Js0-jMqpr=UsWwDv>I`f8=`-!5jx$cLm3?vXLP7
zgC+N!EZr{kfo1HnFfXeAnjG(=_0Xe*_(O^aN`Nxtne2tGTyxRTKX*_|!ZS^Ejgo6G
zRVc1Q#^?IvIMwZu=gR2cIQOBhnJe3HC?Oq(0({LA@LFBGW&KOiaBcg$nTVGQo->UC
zB3s2}a!colkD9``=hL9xTHn<%DpK`+J;Np#xH0XlR}c>y+!kasgA01<&)|R-f-u}t
zg&<4+v@ui6`l4nuj>V@kp051zi)wi{4$Rk^nU}&HKdG#GFW!}oq~4IWwk?@o)#GCC
zPZXbm3gx^Kt2i5_;qZQcE!WaN3s|E7e-X2ixw8GmaW#dR*;4`2>wi{eX$xr!@S&^I
zo>vJOX6WFs*Gs{NtP@%%F-H`)5Ke|`nDwFM6*PO_J(&4@5I;Yfv?Cl78eOd!V##r-5&56xFGOr0d
z4LGSGNbOhI{XX^9!?rfg#s7V@C%9He!?jL>gp!h7HTn^o>lc9r6P1Xy6qhOPC;}L_
z+Qr?AK~0STk@fiq;(%dwRRP-9T=!+g)S8Ub)7_u8wWon)3AkA+T~Zfeu4wHOmxw&)
zSO96GoLC+>CGOyeq}U^sWCFG00sPyr%7l|A?U58gJbJ8LZ?vR^6Mp)>W(`*`=GH8s
zL2tj9cW5{vOHn#rH7
zDN)_Z;;8Yk^(rBv;zIcqfL}Q>zntF2&jnOC`+40q!N-!_uZ}ObqH6qqc{O={^E(RN
zT}jU9MD}-|#+-1@n{xhe^d7xW6YM7P_dHGtDDr8U=g*vbH?u$Q3ABrlBde(~mPSr2
z?IFs9uy^|G$)Im|Btqmk7j#I0OYOcl7f&X*^as~izm}x?y~DsYt|8S`pJ5EVtB~g~E^F4AXHTj#WJyh=ma0-W>4Vpw0qHCU~jA=7_7
zoBO)&6bx`g(t<c7zTO`d!)arR50-+hRHDO=FV7^K7z#a4_4C8BIbjW)`tGiT
z9aHL07aWfk*semN!8LxrYQA@grf~lQ1~1fDFEZq~`3e2&Z#yFxTmp(pDAde(IBroB8>ap
z@r*d1#POO$tNq03m{boGj3Vn5y9#4ZpNB_;J_&qh`diP5l(IO
zS3kQjtQWt!i$u5{Tl)l}T;iB$SrBz-&_JRKR+Tz01Y<^_VE2qONWYEuk$#+bqk-qO
zN+uOkkfkgg9{f4*dn(<
z2y@;F^rmjv%CI;<5x!H~ql}&A9Fo(suI6F~*{O8BL
zW_wi0;tC~~ha32!p7nxXhE^dEh=ap8)Zp*Ovr*#K$An6L%SW$kYbtBwe0n3?k3|3a~os~hvI^V@4F
z*7DBHZdGr6H>Bloj!N~_l^5wnosj;q0?3u*B=f#Himg~
zu1O&)yH#Hd5A
zOUrCDzDlo1^9lJfsi=U|2QRQfWMt+VHV+f8XC;q#ID7}u{6**lWVae=@DCzyDOWA`;nCL^b>C@AE
zgD)fO(@ErI#-F^^-h7_?b8sPh=>Xx7F;G2yD@;9C|6w
zPSx|a`Ox2el+bg}YyAoG(oFh&yc8%Qu~^nX$`}KVP(7|O+sc3$Cjk%r=;IVaU8I)g
zJY}7#%ZzO}p46kJeYvWK#2l~9rE(psZ{Lq6z~J1)amU+b=|;~yy*TKB+DoX?6_q9i
zhtC~%HSddJTd*KD6P<3iioWDLS!zfw$v2MbH^TGQ4#C^^1k&xQ;WzWr=^d@hLEi<+
zVsAdw$_};MmZW5h_(T(|QDNmeYY*mUhS4@toGl_OhHnFUByIB44OT~^j}5J6v8}zM
zyA4=o%(RRz7{(C2eoe~aj@9hzYhCmB@OnA>Wr}GFOTiZUiO+hXd85bYxpXHDGiFM*z$XyM?Ex)F>p~7
z6*Q*-Pgs6YR2HzGN`@DoWH!*M`vVb
z$h1842CN}vx-+Wz+2Lu;_cK4`g-((}-JXp(l<5dV¬((fY>nT5CUn*g64P_~ncY
z_4@_gKvaW*=QG)W-Vc>K>?IINM
z+Gar!Ry)3c#icyHl!8njM`LPu(<|_w0huF{(KSWFa^5}0_MmzSQ^@e!N>U0}I(fG%
zXcr0GhtK-iWOhj|EN-^08lm?lzklz(VAkocnB~3LU5EAZaa3v$WhAwll70)KFoZ4B;GE&?3?PWO9
zHpgu2bLj_1%~o{{`OAEo(mhFCZ_#KX~L}X;1Z=g2tAkDy(-?$n;)7#a6Ki4D|#BO
zqkObfda5u`01lii(vUmdGg=ilv3zZh+mzr?c7y#r<<#9WYQlE8i=q76ECw6i`EB=GWGuJO31kwLsn(!ZA~NY(mP
zOujyayU_Ei#!&(5{IFI>2og{~hXPB*ahxkkjnP`4gsvbCdd|wr2;f|t>8x^sts>mt
z8$`K6p-w!KEf!v#nuLhwM&T_tlj2r!JIp7dP_^92?Y*m)Y|5NCNR(XpLtT-$6>Va`
zErym%-Wc-!j%gMrUEjU}Q9DVuw|7x