From 4f049d72f92004b3dff5f52524e26fcbba1f3543 Mon Sep 17 00:00:00 2001 From: Sue Wu Date: Thu, 6 Aug 2026 14:49:46 +0800 Subject: [PATCH 1/4] add the new content in zephyr executorch in CS320 MPS4 platform --- .../zephyr_ml_cs320_mps4/_index.md | 69 ++++++++ .../zephyr_ml_cs320_mps4/_next-steps.md | 8 + .../zephyr_ml_cs320_mps4/how-to-1.md | 110 +++++++++++++ .../zephyr_ml_cs320_mps4/how-to-2.md | 150 ++++++++++++++++++ .../zephyr_ml_cs320_mps4/how-to-2.md.bak | 13 ++ .../zephyr_ml_cs320_mps4/image.png | Bin 0 -> 20888 bytes 6 files changed, 350 insertions(+) create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_next-steps.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-1.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak create mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/image.png diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md new file mode 100644 index 0000000000..56506e1e25 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md @@ -0,0 +1,69 @@ +--- +title: Deploying a Zephyr-Based ML Application on the Arm Corstone-320 MPS4 Platform with ExecuTorch + +minutes_to_complete: 45 + +who_is_this_for: This is an introductory topic for embedded software developers who want to deploy a Zephyr-based ML Application on the Arm Corstone-320 MPS4 Platform with ExecuTorch. + +learning_objectives: + - Set up a Zephyr ML application development environment for Corstone-320 MPS4. + - Pre-process the model for NPU delegate. + - Create and build Zephyr ML applications. + - Run ML inference on the Corstone-320 MPS4 platform. + +prerequisites: + - Basic familiarity with embedded C programming + - Refer to [Port Zephyr RTOS and run applications on the Arm Corstone-320 MPS4 platform](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/) to get knowledge of Zephyr RTOS in Arm Corstone-320 MPS4 Platform. + - Familiarity with basic machine learning concepts + - A Corstone-320 MPS4 FPGA development board + - A Linux development environment, for example Ubuntu 22.04 or later + - Git and Python + + +author: Sue Wu + +### Tags +skilllevels: Introductory +subjects: IOT +armips: + - Cortex-M + - Ethos-U +tools_software_languages: + - Zephyr + - Executorch + - GCC + - C +operatingsystems: + - Linux + + +further_reading: + - resource: + title: Zephyr Project documentation + link: https://docs.zephyrproject.org/latest/index.html + type: website + - resource: + title: ExecuTorch sample applications + link: https://github.com/pytorch/executorch/tree/main/zephyr/samples + type: website + - resource: + title: Arm Corstone SSE-320 FPGA image for MPS4 (FI101) + link: https://developer.arm.com/downloads/view/FI101 + type: website + - resource: + title: SSE-320 FPGA image for MPS4 application note + link: https://developer.arm.com/documentation/109762/0100/?lang=en + type: website + - resource: + title: Arm MPS4 FPGA prototyping board technical reference manual + link: https://developer.arm.com/documentation/102577/latest/ + type: website + + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_next-steps.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_next-steps.md new file mode 100644 index 0000000000..727b395ddd --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # The weight controls the order of the pages. _index.md always has weight 1. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-1.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-1.md new file mode 100644 index 0000000000..5b1c8543c2 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-1.md @@ -0,0 +1,110 @@ +--- +title: Set up the platform and software +weight: 2 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Platform and Software Setup + +The Arm Corstone SSE-320 FPGA image for MPS4 (FI101) is an FPGA implementation that runs on the MPS4 board. The image includes an Arm Cortex-M85 processor, an Arm Ethos-U85 NPU, and a range of peripheral components. It provides a practical hardware platform for developing and evaluating machine learning applications. + +Download the latest Corstone-320 FPGA image and review the platform documentation: + +- [Arm Corstone SSE-320 with Cortex-M85 and Ethos-U85: Example FPGA (FI101)](https://developer.arm.com/downloads/view/FI101) +- [SSE-320 FPGA Image for MPS4 Application Note](https://developer.arm.com/documentation/109762/0100/?lang=en) +- [Arm MPS4 FPGA Prototyping Board Technical Reference Manual](https://developer.arm.com/documentation/102577/latest/) +- [Arm Corstone SSE-320 Example Subsystem Software Programmers Guide](https://developer.arm.com/documentation/109759/latest/) + + +This section describes the software and development environment that you need to deploy a Zephyr-based machine learning application on this platform. + +### Zephyr workspace and board target set up + +Follow the [Port Zephyr RTOS and run applications on the Arm Corstone-320 MPS4 platform ](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/zephyr_cs320_mps4/how-to-1/) to set up the Zephyr workspace for the Arm Corstone-320 MPS4 platform. The Zephyr version used is V4.3.0. + +### ExecuTorch integration in the Zephyr tree + +ExecuTorch is integrated into the Zephyr workspace as an external module located in `modules/lib/executorch`. The module provides the ExecuTorch runtime, the Arm backend, the Ethos-U delegate, build scripts, and sample applications. You can build the sample applications using the Zephyr build system. + +To add ExecuTorch as a Zephyr module, create `executorch.yaml` in `zephyr/submanifests` with the following content: + +```yaml +manifest: + projects: + - name: executorch + url: https://github.com/pytorch/executorch + revision: main + path: modules/lib/executorch +``` + +Run the following commands to fetch the ExecuTorch repository and its submodules. The commands place the ExecuTorch source tree in `modules/lib/executorch`. + +```bash +west update +cd modules/lib/executorch +git submodule sync +git submodule update --init --recursive +./install_executorch.sh +``` + + +### Set up the Arm/Ethos-U toolchain +ExecuTorch includes a setup script that downloads the Arm GNU Toolchain, the TOSA Serialization Library, the Ethos-U Vela graph compiler, and other utilities. +  +Run the following commands to download, install, and configure these tools on your system. + +```bash +./examples/arm/setup.sh --i-agree-to-the-contained-eula +source modules/lib/executorch/examples/arm/arm-scratch/setup_path.sh +``` + +## Pre-process the PyTorch Model for NPU delegation +The ExecuTorch [Ahead-of-Time (AOT)](https://github.com/pytorch/executorch/blob/main/examples/arm/aot_arm_compiler.py) pipeline takes a PyTorch Model (a torch.nn.Module) and produces a .pte binary file. The ExecuTorch runtime uses this file for inference. + +The following example shows a simple PyTorch model, `add.py`, that performs a single addition. + +```python +import torch + +b = 2 + +class myModelAdd(torch.nn.Module): + def __init__(self): + super().__init__() + + def forward(self, x): + return x + x + b + + +ModelUnderTest = myModelAdd() +ModelInputs = (torch.ones(5),) +``` +Run the following commands to quantize the model and export it through the Ahead-of-Time (AOT) flow using the Ethos-U backend. + +```bash +source ~/zephyrproject/.venv/bin/activate +python3 -m executorch.backends.arm.scripts.aot_arm_compiler \ + --model_name=examples/arm/example_modules/add.py \ + -t ethos-u85-1024 \ + --delegate \ + --quantize \ + --memory_mode=Sram_Only \ + -o add_u85_1024_sram_only.pte +``` +**Key parameters:** + +| Parameter | Value | Notes | +|-----------|-------|-------| +| `--model_name` | path to `.py` model file | Use absolute or workspace-relative path | +| `-t` / `--target` | `ethos-u85-1024` | Must match `CONFIG_ETHOS_U85_1024=y` in Kconfig | +| `--delegate` | (flag) | Enables Ethos-U NPU delegation via ArmBackend | +| `--quantize` | (flag) | Applies INT8 symmetric quantisation | +| `--memory_mode` | `Shared_Sram` or `Sram_Only` | Vela memory layout; must match the runtime build | +| `--system_config` | `Ethos_U85_SYS_DRAM_Mid` | Optional; selects Vela system config from `vela.ini` | +| `-o` | output filename | Saved in the project root by default | + +The `add_u85_1024_sram_only.pte` file contains the model graph, quantized weights, and a Vela-compiled command stream. The Ethos-U85 executes the command stream directly. + + diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md new file mode 100644 index 0000000000..a401856cbb --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md @@ -0,0 +1,150 @@ +--- +title: Deoploy ML applicaton in the Corstone-320 MPS4 platform +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Port hello-executorch for mps4/corstone320/fpga platform + +[hello-executorch](https://github.com/pytorch/executorch/tree/main/zephyr/samples/hello-executorch) is a ML sample application in ExecuTorch. It deploys a model using the ExecuTorch runtime. We port the application to the Corstone-320 MPS4 platform to validate the ML application workflow on this platform. + +### Change NPU region configuration settings for the project +The `ethosu_config_select()` function is a weak function defined in the Ethos-U driver file `ethosu_device_u85.c`. It configures the `QCONFIG` and `REGIONCFG` registers for the Ethos-U85. + +Because the model is preprocessed in SRAM-only mode, all command streams, weights, and scratch data must reside in SRAM on the Corstone-320 platform. Therefore, we override `ethosu_config_select()` in the application to configure the AXI regions for the command stream and memory regions required by SRAM-only mode. + +Create a new file, `ethosu_config_corstone320.c`, in the `hello-executorch/src` directory with the following content: + +```C +unsigned int ethosu_config_select(uint64_t address, int index) +{ + (void)(address); /* Not used in fixed configuration */ + + assert(index >= -1 && index <= 7); + + switch (index) + { + case -1: + /* QCONFIG: Command stream uses region 1 (SRAM path). Value = 1 */ + return 1; + + case 0: + /* REGIONCFG_0: Read-only data region uses SRAM. Value = 1 */ + return 1; + + case 1: + /* REGIONCFG_1: scratch/input/output buffer uses SRAM via MEM_ATTR[0]. */ + return 0; + case 2: + /* REGIONCFG_2: fast scratch uses SRAM via MEM_ATTR[0]. */ + return 0; + case 3: + case 4: + case 5: + case 6: + case 7: + /* Other regions are not used by this model; keep them on SRAM. */ + return 0; + + default: + /* Should not reach here due to assert */ + return 0; + } +} +``` + +add the `ethosu_config_corstone320.c` in the CMakeLists.txt as follows + +```makefile +set(app_sources + src/arm_executor_runner.cpp + src/ethosu_config_corstone320.c + ${EXECUTORCH_DIR}/examples/arm/executor_runner/arm_memory_allocator.cpp +) +``` + + +### Add the zephyr configuration files for MPS4 CS320 platform + +Create the board-specific Kconfig file `boards/mps4_corstone320_fpga.conf` and add the following content: + +``` +CONFIG_ETHOS_U=y +CONFIG_ETHOS_U85_1024=y +CONFIG_EXECUTORCH_METHOD_ALLOCATOR_POOL_SIZE=1048576 +CONFIG_EXECUTORCH_TEMP_ALLOCATOR_POOL_SIZE=32768 +``` +Add the following settings to `prj.conf` to enable logging: + +``` +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_PRINTK=y + +CONFIG_ASSERT=y +CONFIG_FAULT_DUMP=2 +``` + +### Build the project + +Build the `hello-executorch` application by following these steps: + +1. Activate the Python virtual environment for Zephyr. +2. Set the toolchain environment variables. Replace `` with the directory where you installed the Arm GNU Toolchain. + +```bash + export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb + export GNUARMEMB_TOOLCHAIN_PATH=arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi install path/ +``` +3. Build the sample application for the Corstone-320 FPGA variant: + +```bash +west build -p always \ + -b mps4/corstone320/fpga \ + -d build_hello_et_fpga \ + modules/lib/executorch/zephyr/samples/hello-executorch \ + -- -DET_PTE_FILE_PATH=add_u85_1024_sram_only.pte + -DSYSTEM_CONFIG=Ethos_U85_SYS_DRAM_Mid \ + -DMEMORY_MODE=Sram_Only +``` + +After a successful build, the output file `zephyr.elf` is available in `build_hello_et_fpga/zephyr/`. +The ELF image contains the Zephyr kernel, the Ethos-U driver, the ExecuTorch runtime, the generated `.pte` file, and the ML application. + + +### Run the application on the MPS4 board +1. Download the board files from [FI101](https://developer.arm.com/downloads/view/FI101?sortBy=availableBy&revision=r1p0-00eac0-2), +2. Set up the MPS4 platform according to the [Using the FI101 on MPS4 board](https://developer.arm.com/documentation/109762/0100/?lang=en). + +For the `hello-executorch` application, place the vector table in the FPGA boot ROM at address 0x11000000, and place the remaining code and data in SRAM at address 0x31000000. Create vector.bin and app.bin from zephyr.elf by using arm-none-eabi-objcopy. + +Update images.txt under /MB/HBI0376B/FI101 to load the two images: + +``` +IMAGE0PORT: 2 +IMAGE0ADDRESS: 0x00_1100_0000 ; Address to load into +IMAGE0UPDATE: RAM +IMAGE0FILE: \SOFTWARE\vector.bin ; Image/data to be loaded + +IMAGE1PORT: 1 +IMAGE1ADDRESS: 0x31000000 ; Address to load into +IMAGE1UPDATE: RAM +IMAGE1FILE: \SOFTWARE\app.bin ; Image/data to be loaded + +``` + +Copy vector.bin and app.bin to \SOFTWARE, then power on the board. +If the setup is correct, the UART console prints the model delegate flow, similar to the following example: + + ![alt text](image.png) + +## What you accomplished +In this Learning Path, you learned how to deploy a Zephyr-based ML application on the Arm Corstone-320 MPS4 platform using ExecuTorch. You learned how to preprocess a model for Ethos-U NPU delegation, develop a Zephyr-based ML application, and integrate the ExecuTorch runtime. + +These steps help you validate ML applications on the platform and provide a foundation for developing more advanced ML workloads. diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak new file mode 100644 index 0000000000..f884b5592b --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak @@ -0,0 +1,13 @@ +--- +title: PLACEHOLDER STEP TITLE 2 +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## PLACEHOLDER HEADER OF SECOND STEP +YOUR CONTENT GOES HERE + +IMAGE HERE: +![example image alt-text#center](example-picture.png "Figure 1. Example image caption") diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/image.png b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/image.png new file mode 100644 index 0000000000000000000000000000000000000000..365e6035d24fa0c8c1a3a44d220df994c048f40b GIT binary patch literal 20888 zcmchq z2w_HK2M~coAP^a0F9{@Ugs{T=PC~Wz-ro1V_kQp9{b9vG=*cd#K&t%k zEo@0CBSH4-Zzo?|6*KwqrQ4N#V0>eNdw-}W1y_n3UY%X=e-_j)mq3UxmQCf|5uEt{(sQW{EG2Xm8C$GFs|yyAQ9v zm_nmaHtJNTqFy((q!y=Z#d`AJH4J--WJ9T`N_ShGPt+;LLhx0xzSn%T32+NDO3L+}R4b!8Vl;t11oUDZpa z)$5L`a=2ej)4HUoZ?+C$Vh~AaH8};UeJjz4fA|nWe=zp1Q`g-U)U9ap^_SIijzVa4 zmV&JP>4~{d?>N)MM`VZ^ml^CUIZ+TT>OrhXoHz(9)irZI8mSf6xS8etjk4>6I{%

{01UyI*3sJ_#PeTSl0$eOkMKNz4ZC?3feG--+~GF3 zZRX50K?-E1AJe9NJrUHC!3K4>hx5YMWTE4y^U~R6GBF!qwIp>>J<*tma*g4u+8wQO z$l`66AyaP73N1j}m7x(I))1HL2;AcHZei8bcQ%){oy$RfOwm^3ov|I;EM}St%6PM1 z6@lT}gu3r+IQMo6RYg;Unxhb!z3}nVhKyXFdsmTMaFuz$(YjZR#P?VUnF0qD+Y=i^ zos8^6n32ik8F`eXqGu=j6xKNnSrHH&pLkX1Ny22VkisbRhbkRGm%Uxh<-O`tqE!1V zi44a=@#OSG`IX@op$c7(U+J;QKT6IBEZ_Lmu~2S0LrA(*O4&qf5CW;OB%N=aaoMM$)H9N-IwxQ%C0w@m!C>m@Lg<^8Yl?9 zm14W722n(Sax?q%hlvsWFkwzw+(x{;%?tWRKOAnWmHjXXYiHy1=N;HE5fa zwg4+XKV~0w;ww$J(5w9?*sm9{nf*srUM7}C6U~+vuM}{4R~3m6s7xCw-@6nIqTq5g zH!0_bmWt4?lRbtii*{^O>@+=P3baqKZgZ+7Z3>FI4X&G?Hhf5LleFL{wg%_xj3_u? z!GyrQuFnm)3asojY3iWz?S~BJ9%5KuLC8k~1$s`d1b*jdEsnsHC)RliKiqtiIGm-g zTz0kKRg*ksNzBPLZWOvM8N3d%exD0*n)V$<8B{-efaq=8CsPpJf5lCIT=u@yPKRVm z$gh4AT@#cRAB#aTbLFf3Keui!4BYH18cPhQ+z1T&jwqgy_rYk|0Ruv!)>b7(V{X-x zl4o)jonHALg==xZB0(ZVorLgeBV~;PxeqUjtSVWsO~zYpY3OBw^*Rc>4=Wzoh_X!R zXmij8gAdF^a*HyjPM^KOd~bO%1HOHuvra!SuS>L>5c>eMmjerBUD5(wJNklkXZn{d zrGULFcYbh}0Z;d0tIU_7)`HZW#bcHzQTC}W`4&?8eYq@hE<#xhhlQx7PMO^exCRyv zN|_X3AB7z6&VI055dh4t$<1{xqVDwOoASd!U~MTKNNq23=&o_n295jNAwFS}f)Ass z79<4->a7CZgPfQF^cLEdiFm@*-S$aQkN7wS$IlE(tSgvPaGunHaNdjDZx8RV!Nbwr z^}&ki($8|?QtR`Fg5<#R?GJk2T6=iDQY&~~St9G?nvL4Xr?s{LZ)x1zF4uJH|EHd^ zfooL}^Lv#Sm$CSys|_Z@NwJ5=7P-K}fX?CMVt;0Cm@$-L49v%(LAue7+$E0sjJhCY z;69#Xw&k?1_(1S-E#6!=MBDZ$`@=dgfw{L2*MJ5(#Ftn?7ky2mw3^MND2{faxufQW znQ8K>oeyoKx6UY2(-XEdOX_Zsg{RIKJ4-wb;gX`wRPmW60lE5dSgIn{d4kYrmfLAA z74xO7Hz;|d4uaara+D3Rx}>Y3+O6c_W))&{KQp>B{qAjG$g&F`76unu38Wa6l^y*f%bqm#jdYa3E==i1SrAMU; zrjjxCs*F$HMh_GSGqpnIMtkC35l?s&g*ctb?Ef(%HaI@67;iDI*o=k-7+jKHv1qs< zt0I=Jg1Ka-x+wK*sO^dIIBYx4UL^P?sVo+hg?4#PnKD04I&)yPEiw>(X?hH#x6a2K z(|wM>iE1|<^jqu*h>yH6*PFHQf$5`QNn@bk%#cygPq#Vd$?f@;MRS^2ubxGlvg?@( zYlw7BNHZ4P*dlw^Txfl+UF zlRf_;X?1So{<0W{vQU9=FjAjSs$JF!YUvcnXg|i4xs01X!z+J5^**^cGpKHZ zM!|8W;!9VByvT|k`&0FD(8qeFEAP7gd}`Kh)ITNU@pD$zE3vqIzY{rC`79n_>z5ox zM0pwt`392Y9EVx4y~UvK4&!#-BdCN1)|L&-P! ziI?WCkDoqU@-SWpllQs;tm?h}9^svmXo+PIO-SjW9I~N|Izx%#WS$D#G~l`df}UFP z_f@B*TEsm2{DbcmQLDZnsIB5Tmm3t%cEo~rQe6qJJZ5xmK=||j@Q*;n;x^LG4a7SM zGaq{f#{$2Fqg)MA*{x%oGIEmgPVet(lwj>pS>B7Zliq831g-`71WU9wiSTtRx-*CU zx>85alE6RY2W7}|mt-XkpL5Wz3&77qVs}Oj7rhs2z6%rZZ*!T8#I{vE=)UiE(dH%+ zL4C|^y@@7IWu_%|S9-5%4piv@hsEm9+zJwI8D1Nu4&d9kR)ab)8b!XA!K@Op1)4aB zaw^olep%rs3lBr4j}+UeK} zRyU)wBF#8YXr1JASxyK=)C2~4MTlbTGVeHWHQX(ZUxa(kC|++vtAFAe!>cmd9@44J zoZZ;Q0;Bs#UdN9^6sY5w2!{FZ-}bJ#fSFz@k3nd+6BEl?R`4X8hjP5y;`ruOstu+t z#Ic-hdamOgbzN>2YzDeIO##JnP3k1nhCPyr50(|{q}JX#cuONpraOO#WsvwxU}eX5 z4f^-hke%iW3!>Ln%&z@boG&v+_Z>$q4>0@*{+MHfI$|$gDRt!r9acP>vV%9IiR%jB&(krSBlAdYtmbuhq$Ti49n?rk{Q;w8xbBUM7y{$~#wVV6cDH zD1MDQs(<}w_wbmvS93ONuh`j_uug^kN~nDypDxxqg(&ej387{Q1!f3n$ju>%Qqtvn z4-P-f8iL5G`emRWAd;}dl3BL#CEvpe7J1!bnDU-ii!VRcqTCok=o!D>!WFUO&k8z( zTKBr%G^yK)W@wrRfTdco{8B9rZ>ocQlQ4e!RZlC8ws*sRJ2yMBcZ&Xn^IE~T5tE_ePBwm-g!pn=y^>v`W~*~)Cwk=5}G z)movk8|JQP9f2H4NY_b9>l=!8cn$?G(EViDzk5hB7tVtSV)QY&i!ycba+dS-WKo!M zdLnEnilM{1g9n}t>#0Y&C&h-vU+-m4S*DY(7HrZba_}Kp%6}hZ@R*07W=7%+%=wTxGeCdzzk=q{1a5k@}vW8?r5oIrw-?fSh&Ai!* zPI#e$X|CS1Y{*VDxTNQjrBLpBVCKGQ?2C2tK1E_?`-Lo60I5Y~T%L3xwcXM{-1m!j z_m|sdMYnL&o*3zbk+;&3Mmt$pmdUuIu3p>??_PKwZ2X9R;DN4d4Y#fXA6%FRYUr=_D4uQh<)8eLHusf_YG%a)wC>>lA107(O_ zn(YOQKie5!Wqn|lB3TcXb*JtrpL2l6U7r)EO$4K{5zFGIW~H;@?7YSdjT)vj%M$&L zmlNPVJR}ahp9@@)s4*c*Fe&Zax23fWz8SFX8^0EuzlKti)4Wg=w$X5X$L7eQ}vfjK)4U+w+f+z!ku) zzW*=}s*icLOWay+dDlL_%|c48NSOzmIS`U7o-2NPvD4qOl-SL9M<|Y6>X~#z9|i~X z2zB7~TyX?b>+{-j9cu5Ch&o-!VyBCYBVAwWBg}6*?3+nX{KCbcU~`b1Yp)Z72oVIG zLp%{Lw0%i%?*BoqHK&OOS7||u(`>BBi`PQO>?D?IW0W{jPI2MUFzZa|)wAS&*C;H3 zcNQQiJd|7gCEDzn3a?}&5JLjP5>mTg(w-LGMyz?re*vc8(if(m@!#;EZih=N9aRMp z4i0VZ$JXloXxf)zPe<&+b!sqJCy9X1gEg?3^d;@*tT&s{xE(j!r}3#JCjpvB2|iL2 z=5e@RO?pSM@+Dn~y8bPvqKc4>C?U!^=PV#!Z@1KTR39+s4ffWfl@;TVPC_97K-)@jtk33>zPPF+_&x z*jnn#G&fc&8aor6;ziB1nhBE`O)(Ogd0oO`^&|db=?fP=r`EV;lYn#xfF^}>J6d>< z*ZSG3Jj?VOFvJh?ZJtQo@Z_YBl=Ac=rl70MH#trjY4 zg^-Qk(x4O-2Eq!!QY#gSyj$XYrk?Fj4dAd9bV*w&@x8BDU2v8krN0sS#;ayA4IS9n zzm|n*C`@#b4#|=7fP-j}T66FS?-Yoix7%+b6Zm+?Y(~3&bu#@nK=$LuQ=wb{^iI3K zq8l`viftHA{qV4XsYZF$mHj{}2kdGZ&Uh2Dls3e8rxifMRwG5G-vjVk1mRPVh34=< zFXFS&`s0cj(6sot_kSF%SgL$oz^T|2DE)j;eJ6op5WZ$YBEleSwaWaYTk$y zb}6$XX+eq2WDO`L+m9I%a548Sea@_HLJYMsL9*v+1Gj^_>@t1X1Iq?ODxLm(X zwY4;O9UM>K{$fP4sL$3cwCqd;2&rYBm3geGGHfW}HpUF~x(Cw~B$&(;q(*a1>q0B6 zC+;>ODu5m`&+4YjOB1mp=3!pm1ZuXb04+hY08kNUcYqIs|GrtOUh~D50c&=Mod#N;Bq!gT z9WXvD*f)5i>ca3!z3bQ2EQ{rq1^+zY$8m`}qtBhj_p#^Jz8TqGlc+kvAQ3nF|E3+o z0IiPBpO@F$X<0b6=sGJ_Pzhb(;RPIhd}$t}62^>CK_Q8pq6%mJ&p(D^oOz9gGq>4S zGP^n>ko{|ICd!o0O*pQ3U{@X_jcp8*S``=e|3mv8shs(IA-`QS;-O- z$AiZOO_$EP-0pr2oEffu=uU8BNdNx{8$CUID{M^OndU=J56(<00Q(IfGaa5-NV2jZ z&_rU((!=ZpFYWnsfOUJB z*ZIlnaow__sEUAL;r#Ai*UWR6_{`Taa||uI4+}MZ5#oz~K(c!xCWx_2wXfp6M4InxWSa*YyM6$$I`ES8%PUUm?9IWqB9m77%L6*DfvVr{DuF zVKou}PBVl#E-rf&8JcNda50|h^R63^a_*>J$a){zFeO7IONy|m{8`#}aok@1XtR%& zwHwljb!Y2*SeLnOh5*A~GB>=+?cI@|7%hb$OGBF-7oFVFhoC3CGBhY`KiP4?)OW4=ZT_z&WlUuYe+ULpe?KE&Y5}{ zdq9BRF;eSix^1T9b_AUSjulX%9r?pldei+b$nUw9Ue0iWdFZdwe*59EsAGN;tA}-Q zt8duAK?lp#lbpGCS@&t*SBiU~`ItrD1VwHB6*5M}l=pc2%ja%!p8_ zQKGvl{ul4pc`Ovu!B?00}k>?ZFOUTyHF#L$I(2 zILJzkl~Q(9Ja+>Gr(cg+jEwnA+!cy?MsVY;acX$S^$!Q`1jeAK0V5Z7}6`q2-EH`%hpIGi2 z6X!$Z37b6586*TQ7cQ;hdolDoWNS!*Wlo_|U~Rb_D05$s=5zVn?z{(@gFI@*o9Ca? zUHZSKyY=2e&EgLL{Yl5SwsG;RT$CUjJp3txz@sRNfwll5=63N*MV=LFI2E3}8er zd>YXPcS0QGT1kt{0g{m*3a|INZ*SbwT1$cH@!W;NIRnF)qNJEUeHZZg`KaPa7oM;k zc79606>O(E1O}W_oM!0OCh7e#Mof)lxMu|N4)vr)(17*_XB0ux&OEpM!k`9czI^5E zG^O<@3+!|pEtls4bb@t2O_oB;MOJA1ln5#co;D=$=40d9r&dv&450L#S3N+}ko~an z5cn=iIC6)B_jE)Xet3RDf?+LdTQ~!FWj$+uIz@w(c^1$%caJ3$7)zoUdE_t-IixDvist=QeHaU z5|*=A)0aOn9Szd=jg)&+Q8iZPVH8J|89+i3BE1=E99X}?wH7l?8ugV+P?ujsY@k`m zV?@jbjkY`qA)o+;|1RiTw&doZZm?Q>ex7nv!HO&@g~98}n&5Yr-#jh8irjz^4!R8L z>_>R(1-E>ui>Vh>T1*Q-R%lfE1m^dpqTTy1-NqG zj>*zVppSx%guq&htle^Kt>j`5Qk3@)R$8lz1&L-Z+)+`Lp1BE=i*ZcoerA2d2@n+% z+w`mBy4p}Olu>}RG=pHln9>X9rVQ%-AUS3Sm+`od`>{yK06nx*%e9Dz7Gc5&Whtv| zcFq!!fG;RXA%&lo`B@mww zC(Vkd!ND&JzIVR9h$~ul;sC}3Ek?d;FMti5QZ4OtNbuT|gEUfe)z_A&%sK5lsLJWh z9@3XjO0Gf(PL`A7c+{%Vh)e~C=VU5s9FJQ)Wh-kzhiZxz1GSnKRMCIw4s^QC zk@?Doj!#so8n~~KdJFl;uF_USj*}kv6T8<+2EF~h{6j3eUecWX^Yf188E-5)RWslJ z9BnNBrH>I`q4_&o5E_%V^l8Gl>G<3XUA3fLAX1l%}PQ*8AMZNUm#=f)t2vs&y&eBgQ&-p9ZMN=_>HY)|-`Z)>Nm zAJJcr@(5MWcleGVYy9e+&&=ThLlV~eP;Q$5)dc-g?Qv;FF}@`zA%|*K54tR5xXeAw z{-IR)rW3jH(Z;;Yi+3Mv4hk9OHMg<%cQukC!?1r{b$t77($kVI@Fmu>nvoL>WMh@$KA0l=1kHi z--Yc}ZNA~Tw<`ze?I$Ld-mq#ZWe$c)g{%{c$Y8tzYbcFKFx7GqBc50>X(_N~M!(H- z0n4wHXLw7dlkY4)+A`=*3`ly{HZ0KXj3yh&t!w=-|ORcw-H8;$Ny)pe}y%{3o>6$8f4KxJcX07CX2kIgWMYLbDq&|>Eh9>=G zK#_Qq3E!g$icq5Xe+QLWH5TY*b#(1#i<3Ka=&5xt^mbxFEJYy05epi=TQTxeA7db! z?}y<0>OV7HlL2j*51)bm3?%981ZS>GSS%mSTT8l|i{6gAGv0D%YXoNrkBuy@7z4o< zk)|k#TGrZ3V%{y`8HF3v(rcpj9AqdXrhOmUXv7kjzPw-bu%>ze(qBEFL2w7>I6wnv z=K*(+r*F#E`48yz0fLU(Nh)9RWNu^B5U`YZ0B`zTf6}tj^bG{4r zj;|`ouUiRoP6KbILja4i$%#n-sU7Ela=P}e!e);4Va8<==)p~v!3^-6lJs(8uJkSq z1WetkH%&F5;FWYwXjt&vMBv@^tdTQ8>pt$eRv%k!u|@ojfflO&2&5XO%W6($uphGV zJVt>5LCuCFAeU_R5JLVcBi`R@ajvg&Ea3fs!;G6|b^AMcwQst6Qp@bET9Wp%DP8CE zst@TH^GSaEd|&~X=k#2t`i2D%Z^+I6kv+FyrN zNK6!C!K@GwZ5}cjutwC}ZBC?_> zqi-Um)`_$E*)pA8dK(tS4?jhNDr4e@5pP5LA0fV%ABSnJSB`kvrb-@hMVn{>afR3$ zs2d?S<>N|4LSrI|+g33NRE!)El4G;vSBrkLP+~5v8sE)OYY*Q&dw$Gry6p4auPHd? zarf;{2#lur2Q-F#6t|t(B*BqgE9PkkAQpJd({3~IXKI6;o|m6f*PL72%=lYta6TAI-IjR7fJ8rOjl!@;KYei(S*=JqwRzSuF zP*woZH3z>9UoToHc&W5O_Q@@Dp*7VwK)ba1R+bpzO%--$P2FoA>-Lv6!L6Zm@3Jm% z`GncF*mTz$je(jR^u`P&Ess^D7^b!@sg1}rYB8c!_Dw8*fj)kXi>qn(0t5&nXCP$oR;K8QB}eA<4s9NaVw6R$xg0?Nc!-9Be>lfx&A6Vc_E1o$`hFbn>h^Um2E_m= zHkKIA(h!$#yP@oxRiu+)Z?iH^RWxGUlv+2vB->crrq^ER6h}?IGoEJW3^rFq1X&^P;KCcMD|kDddv#UOMqF08N{F zEK{%A1W;X~t*_%=$BJZz@^rc>8#0^OBS^x zFEVw+;RJBk7gCidWNrU8Zk+34wC0FE7~x<$25C1u3^@r1#jKVwIgu6bACyfGcz#9y zMn1h~{@LOa-+C!Y1dW%B`l?o(vB`R768M=DW6HgHEsY50g4ZI-#l?T(xi609vaI2^ zh7Y49S@5zZF!g8Tc;gaeGQ+uN7em;YYn|6VBQ6Xkpe`<-$^ z7(W)<#flduS{?}@p6CMRF*vO2yk7dNXWBzu5|78-E?-ZuyNia&D^V{xLuC~9Ps1R; ziWZ4^52Aacxw>Ye($An71i7=q~5* zTI@7mPM)zGPfDLs{dqj4amqhvLA?MwYByc*$W_(~UdviGvMDwq=qGpBgQv4vC4u9_ z1la9{pTM3pij5&U)I!}*!Ge?eerf>|Aig;OB$m_HirxF?dt=nau;K~37P?s?(Q15u zeCr}IFnjTv2Ko<+P5m^7CkeH-UU4p=Jz?s~6Dtzts#YmL+<}+ZxZBQ1 zjLn*QDMfGHF%SvL+q`afM`{kvi>9oyR_RX%O7j4Fc4pcw-4j+fs~EvGna7mQZ|DJ@ z59F1Ra)7jaJW0aB%>C21sas9w^E=q*;%2YpxQwdxBLSPX$~cQ%qgS93cs$GB%GLC2H*(sOxymDT?Ja+ zR3|jlp*b`oY4t4|pDF%RTYft{tar%zt zAlVPOQ(jo%Go)ebXTWPQ;4)ie0lwnAMdChXi%Rrw8OXQL<6zLr^;)#%bNH?XMTU9h zrc+|9{h8?F8j(6j061scm=Xvy%?>8eFTbtP922T+OWN%Xf38tKR{n}<>HBIA6(LSs zh$2bG`yF%HG)AhdKCJ#eUy@CiwL7Vpw+Qx`xs@8PXA%fCs{#Vq@iO014(FuKLoqw=$aC9y5J3xyX z`UCm_v?%j;5}esjqIFo%y0U|RTDt!)VcAWX{2^^Rv_L+7C$7*I?|Cg))?soVh@vr7i* z#-yLjoG)gK7iX7<4VHcV&&HDQ$~}}hr*6A4;9@ED8L@F{guHJ?9+8??{s8iY8ZWYj z(5MNk9;2Q#C$WOK|fIdQociO!FGuQWt@hrj}(@>T_Ucqyhu*+(FJa>sQ>SMfS z*^pk-?i3tP>Y4L5IHKnQ?X+3uTMkYe{fBo>O`hAv8*VO@u1|XXTZ4C^{^qF8m(nc@ zR)D_*)-EV|uxu@Wf_IO*6wV_bpw7|pv9-axtH@0P^2VIYqqK%201OzCB^OpZ{9`4b zHc8y)si80a9_bDEOQ5psSknBV{O0RHFjw+bnz-jzJSP%NeXkyIB{aQN+&5j_D+6u~ zL|N7k6{$iO6t;vRTM~I*7V<@C?FG#fc3)FTGq?7}Q9aZwhm>C1);wq%fUZBpP^MA| zcn`ze>s1~gey(8~FiwYUH`4;sTWRDpDBu3~)Q^eTm%)!BKWjp0PE0S|L%o)g?DVQ} zKpzGyrw9&$U%0c+77MXaj+(M(OTb{%>rkAYD>1eGo(oyHD?8A>@5Gc-kA$19_g2nA z;gCMXq**-^4Y!>K`;OKi(vskMq@h28m{)=zKv&ZR7?P{`tc641Z`kw5yv zn~-s2HP{U;6aV5>-1b%Nbahx!4w{)tN}mdTdA(R49t(cyAwO6aCu=o*C~4B~L>G`z z9^M_(4C8K0`4>FdC0 zJJ}&GkTr_0S)VZZ-BPLo4-IYNWI6vyxPxEj$FDgz`3!Ep#W+tOnAjD3wnT=keQvci zVFnSnW*StI*^UEZs+;k!1sax9himOSB?7D<0qGFgBeBl3$dwrxa~Tesn^vv0D)U%m znRpxk6`9#(O_pJU

#wML-iAKh?oADrL7#+ks~E(qPm4%P^^8k^jZiH%LBd4}vZs zXL-92K!@;rKiDsmrUh**+cxfR48kP%vE9=+hhp)D zhg$;B)qo`}DTHk^Q1)B_KbF83fao~iYIN=yU648*2Y5_mPr>f#8C5gSrK@Hmmw(7d ztps1#^`^QdHabjD+qXa1Bx+V44eM-Jj*4HfAOQ9e^e(4vOL#@Hiq)O#hFq9ZP1?IL zvlKn;zY+-izjj;9!dvCkbaAo&sl~)yvkdKkTi;=lgbpUG9x8-$^z^6Ob?q*IRh2%d zUXF#gNkY>W;}dF^>jGq3X8eH&3N)7$8x^7<9&W9S42SrHb?LBmUvojVF~JA{lD!*lFoQ0tNIQyV1t&bk+Y z6d4RucS9Qu1!cjRv001y(+?0ghfl$sElcaNoS=1xsDPv4Qq9-!b^22l^%ChMufvLJ zxV&<)=|@{xq#;xJyWEMoz^wN@XFNqw2MZ4fvd}&Nb{*qKQr?T-MSl?35dN^XABhb* z0CArKvt#)2GUT>y_mKNwt5#RebbF(A4w9qezj?21!GWq0Yyd>lP;wtrD$k!dRf`ft zS?5L!9h09zpnw2q{YTDWzuch<44UIZ<7ls9`fjR|e3EZ{0V`eAdv)kJNe7k=_=Uxd zY$^h~76D@EL!*|l4o^Z=ikR7&xi0;GZ=?#wA*f1GpmY?LqfItKIll}6YGc(kWRQNZ`q=E&W&#v{T4Z!+DzUOX;lh%3b7NB z>!8xZ?goF?({T_(M_DrT*ZF&L11Z3KTwS{SYE3`pS?l7H2=Csf@;Mr?$AFM0g8sH! zU$41&Akjh- zyRBPyk+}&m(7wUFve@uDcoD11lM?cyl zHQKCC%(YARK>YFB4)-*mFB@bKJGXdg7JX$tJOpA8>Jk2FJyl=V@%E(Z&gK7OV^IGQ zXbiDEE-6S&ATlNqY_394lOlT)%I{LwJov~f?meFfl(Tt6p!(m0RfcJ&cwv=TiRMd% zt&%n%%E@s0!c;PDFa2ro&?!ru<~l?^tB@GG1OpTTOu05s-49|O)?@94#gbnB*I}`X zsjfjn;raDiA>Guo%c5B7k>4mvzTn-H% z+GMErlAD|eV{_Wn_tu_>tnm{Pvp?! zkBQIWJ*jL)%NOh6m3mOG(0HKVkfV(}({T@Z)z-kJ_*fLXKP%ul+O!nz77Eo<(z^!l zjSsQa>^h0>o(*vWcJAWDwSC_s`d}qmB~515(6Efyz&d7=+pqG@DWT_6-2r+1-&frH z>%q8bH$91+E5iz9pIww)vvnc%_{Eg*(<025%6b;w#1kFwuu@Z3@?%32o-$3Fw`Kb6 zRcrsWQW5b~l_mNZ4?)B>JPTtv=%!P0-Y(#tPNyZHmmEcw-*w99E$_2y z2@ueMFap8)RKE7h25)&k0^3Y>FU0u)vK5!< zCADbDNxD=QAOct>Yk6u(c>ub=ZrFOxm*+Vynfa|ew*R=cgt+vt)|Ny?>op&pWl3y6 z!9aKu%;U^Jhy50?|LTPr<^&}9P~O)&MC~6qxz$eqlCQUz)@jDmWx(ht!uWPjnnY3=Q`;- z^I&|vrQAJq>qs<+CgWc{#?h}GwUU$LM6SI6<@8xeo{+Q3M4Y3?l)}oV2vU~?Ww|O8wGUSId&6BrCDR}%BD|MSzX3I~G zn=>5?jTp^W%nCt0furk8|1&3UR09YQNJGG~hKQ<{%wxg8LLvz%wN7X&xm(T4o`C$u z`4jK1xM(P6y6&8RoZz3vFlY0pOMsdg!mn-ecxo#G*e#Mk>2+Q%0@QNeNnZG*>IQ29 zBhYU%3P^I;G**%i=dYCW1H!n~u@7MoPM*IZP5ll#0L{6xJu*i>nrt@?0QZ9Lmm{cu zZ-Dhl(&EH9H#Bql)ZW2?Jz)^5^`AEhc`>jJJ8Fz<{b4|8=*v z2LY+p%h>K&tmmtPe^?fb2<9%C%nY@@NcM$^rK$g6_z|UY&Wa{{|8ATWWYr1;KzrnQC zBYaFN4N8c-kpeDrz!+z09Z3CbzHNWCqv8aUp3DJqOn?t~7}zXbp~!~PfZRMloYfuw zzksXcXrg+F?KSUYq7<^0Qiq_cEa|1Ye-XleUcp=wKZChX`P3$>JM#Jm8IeCvVP5Zc z2cRJtyujtSe~@@W5%JUU(dG$BbtNs7nx_02AZrI{Bzw#wfE89W zxrZbq-;w{4K?0WZw19>6%u>aYMS{J5YOF!Z;~c4V6FUY!d|z3#yGKMMv`eE75ILw7 zb&Z0t>+57`KVWx2_r|6|2zG?1*1lWjb3DTh*dd~*TkrqF{My|hQd_sOjf0-uK)FS> z`Ac?MrM90xx3P#2d*O1yFm2H?Rz@BRlk0e=_xOcncDBm#@NIm|GDfQ48!Ey!KhnCZ z?Wt<#B{S6KlF(+`W+lJwyv=!nEyfDD&O8SwSaA8zF(YqrflBxf7Z;us6cI$WB$8H@ znsu>@xClTV<)?RM8ER8!yPyrHXAjn`10@?H#Ct>luyVM2nkugYPaQeC)tRz&({lW; zxF9tboz0$i2mgHcZ=!y`cihbwP0Dr~PngEoLIiv_c{c(lgqJ4~j~*1d0BFrs+B2i; zZeHX$9FUFKaPq2ZwFRT?3seM#qVl=|62Jr{Y^|Xw#$CmqnMzMODly!`U#kJ}Gb!q; z!S?Eb9q`|ss$+WX^pOs1+acsK=vt{L0Wn&3e>_Q&x9L}T6cKQ+OEX-FvUao8QcuTj zF(CcM!kHsMp;2K{MW5l9|6f4m{V9=d1Kt!VT=>uf7TKcT`pA(gcQ=M6Yz=T>_ToCw z@IOs2`gWtQ0d+HP5FE-|6JnEoTkv~s<;=TTK$Jg9#dX@D^=~B*`D52@55PBUc28oE z&&MrW>DL@`MZn*}yjIx@A|4lVoi4FV+WdSRx7=Cc!d1OZ<2FvV6vxm<=z5zN%!98xFhy` zYW3fwhi@JILp6zPWu?W9^-UlHH06qC=pjJxwqh+uG<#H}oP`fUZBZe&tX38I+oKyjGN+;Z)Ku;@09jGhp_6h7m(`7dD-^9dof;1Kv7n2|3cU_- zq%almG+r}(H?w2Rv#rS{Gq%6j^L7vH#k-N=Of>81~jVE_&W>90^#y z9L0(%;5i~Gd!>(HbvxeeU`j-O531T3B>@A@aiX<_9LJ?c~4#MBBWa(g8K_V-+DMW-YUc$S5e^k4m|7g zQkcnPN@C89s@XeZkHEpb-&bC(lVF+k5lO+U zqP*T2>sCrlpJfd#ayJ^)zca%}mUW>n9<=K?O}zzmn*>uAAxPRwMJ*uxn?9)FIzGI45 z#@mGj%W;s%7MTC|8w4l{$TAxb9bctRCOmiAd=FmQ9k%as5SA%>oLyj=N~*Xn6#c6SAb_ z?rZ0)Avi^|#5B<%m}V>vh&xAaOdtXQiCz-Hg(;sYSp>^VQL>hEHvwH{(>Vu0EX=rxq=vrY<{cItk`x1MF@r zF^AoL21-K|Q>J9#oMS|%WIOGEVcx7ePr><(0Zky7IbXd8!D|8!)ZZwvWB zo#$Tzj1ub26tzLuy0D^{YC&e+tn%A}Qv>EBGL;;lXQb|%mNn(vl8a$K29{6`@p-1m z*&0dg(8QB}%`+v?_UVAX3y8w03gwwi+R;iBjYNeYi{dB8d5=A+@J1eG4-~0OAzPVI zeJN~@1B_-&LXg#WY!=hsyhW^n-BH8@+VOSG%^=|g0kGXEhu;Wj_No7xfCAL*XIt(U zol1q>E`WvfS*H-aLD1+{P+d9@Ka?#wLXrSkD`e!@>RZ2Hg(sg(--V-f~Fj<0xL=OyC(ccYv@0IUWS2LK$_#r zf3s_y~*9?_vM-<7965lE1#ag#7dfirRfCGk67(6zPM!Y;2xfTt<$`TJ#~AM(Gyaqs^D2UV%D literal 0 HcmV?d00001 From cb3d7fb3a121c89275819a354d9c82bf889cc472 Mon Sep 17 00:00:00 2001 From: Sue Wu Date: Thu, 6 Aug 2026 14:54:09 +0800 Subject: [PATCH 2/4] remove backup file --- .../zephyr_ml_cs320_mps4/how-to-2.md.bak | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak deleted file mode 100644 index f884b5592b..0000000000 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/how-to-2.md.bak +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: PLACEHOLDER STEP TITLE 2 -weight: 3 - -### FIXED, DO NOT MODIFY -layout: learningpathall ---- - -## PLACEHOLDER HEADER OF SECOND STEP -YOUR CONTENT GOES HERE - -IMAGE HERE: -![example image alt-text#center](example-picture.png "Figure 1. Example image caption") From 0379e30aa8ea0f5f4e5bdac783648e846355c094 Mon Sep 17 00:00:00 2001 From: Sue Wu Date: Fri, 7 Aug 2026 11:23:57 +0800 Subject: [PATCH 3/4] modify the subject --- .../zephyr_ml_cs320_mps4/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md index 56506e1e25..c3b5fd6360 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md @@ -24,7 +24,7 @@ author: Sue Wu ### Tags skilllevels: Introductory -subjects: IOT +subjects: embedded-and-microcontrollers armips: - Cortex-M - Ethos-U From abcf0becc0d621fb123aaf71d030d7d5078685a8 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 7 Aug 2026 10:27:20 -0500 Subject: [PATCH 4/4] Update _index.md with valid subject --- .../zephyr_ml_cs320_mps4/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md index c3b5fd6360..7106455e21 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_ml_cs320_mps4/_index.md @@ -24,7 +24,7 @@ author: Sue Wu ### Tags skilllevels: Introductory -subjects: embedded-and-microcontrollers +subjects: RTOS Fundamentals armips: - Cortex-M - Ethos-U