From 51cedf1964a934659cebf7818e989e1539d6962f Mon Sep 17 00:00:00 2001 From: asterich Date: Fri, 29 Sep 2023 17:45:47 +0800 Subject: [PATCH 1/6] add article: 20230919-elf2flt-elf2flt-build-1 --- articles/20230919-elf2flt-elf2flt-build-1.md | 151 +++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 articles/20230919-elf2flt-elf2flt-build-1.md diff --git a/articles/20230919-elf2flt-elf2flt-build-1.md b/articles/20230919-elf2flt-elf2flt-build-1.md new file mode 100644 index 0000000..982fe6f --- /dev/null +++ b/articles/20230919-elf2flt-elf2flt-build-1.md @@ -0,0 +1,151 @@ + + +# elf2flt 篇三 使用 + +[TOC] + +## 前言 + +在本机安装完 elf2flt 后,我们就可以使用它构建 bFLT 程序,并放到 no-mmu 的 linux 系统中运行。 + +我们首先需要一个 no-mmu riscv 的系统,这里我们使用 buildroot 构建的 qemu 镜像来进行测试。 + +## 准备 + +准备工作主要是 buildroot 的构建。首先我们进入 cloud-lab 里面的 riscv64 实验环境。 + +```bash +$ tools/docker/run riscv-lab +``` + +等待片刻,我们就可以进入到 riscv64 的实验环境了。理论上本机并不需要 riscv64 的环境,有交叉编译工具链即可,真正需要 riscv64 的是无 MMU 的目标环境。 + +而后,我们在 riscv-lab 里面安装 buildroot 。首先我们把 buildroot 仓库克隆下来,进入到 buildroot 目录: +```sh +$ cd /home/ubuntu +$ git clone git://git.buildroot.net/buildroot +$ cd buildroot +``` + +进入后,我们可能需要先安装 CMake。如果本机是 riscv64 环境且没有安装 CMake(例如我们的 riscv-lab 环境),buildroot 会自己构建一份,此时会出现与 libatomic 库有关的错误。 +```sh +$ sudo apt-get update +$ sudo apt-get install cmake # riscv-lab needed +``` + +然后我们开始配置 buildroot。由于我们是在 QEMU 上运行的 riscv64 no-mmu系统,因此采用`qemu_riscv64_nommu_virt_defconfig`配置: +```sh +$ make qemu_riscv64_nommu_virt_defconfig +``` + +最后开始构建: +```sh +$ make +``` + +构建完成后,生成的镜像在`/home/ubuntu/buildroot/output/images`下面。我们看一下这个目录下有什么: +```sh +$ cd /home/ubuntu/buildroot/output/images +$ ls +Image rootfs.ext2 rootfs.tar start-qemu.sh +``` + +这里的`Image`是系统镜像,`rootfs.ext2`是磁盘镜像,`start-qemu.sh`是系统镜像在 QEMU 上运行的启动脚本。由于下文需要将我们自己的 bFLT 文件拷贝到磁盘镜像下,我们先将其挂载: +```sh +$ sudo mkdir /mnt/buildroot-nommu +$ sudo mount rootfs.ext2 /mnt/buildroot-nommu +``` + +然后我们启动镜像: +```sh +$ ./start-qemu.sh + +[ 0.000000] Linux version 6.1.44 (ubuntu@riscv-lab) (riscv64-buildroot-linux-uclibc-gcc.br_real (Buildroot -gbdab4577-dirty) 12.3.0, GNU ld (GNU Binutils) 2.40) #1 SMP Tue Sep 26 00:35:20 CST 2023 +[ 0.000000] random: crng init done +[ 0.000000] Machine model: riscv-virtio,qemu +[ 0.000000] Forcing kernel command line to: root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0 +... +[ 2.438788] Run /sbin/init as init process +Seeding 256 bits and crediting +Saving 256 bits of creditable seed for next boot + +Welcome to Buildroot +buildroot login: root +Jan 1 00:00:10 login[34]: root login on 'console' +~ # +``` + +至此,buildroot 的准备工作已经完成。 + +## 使用 + +elf2flt 的使用实际上非常简单,只要安装完成,它就已经整合到我们的交叉编译工具链里面。 + +bFLT 程序的构建过程是将源程序编译成 ELF,再将其与同为 ELF 格式的运行时库(例如 uClibc)进行静态链接,因此,理论上只要是 libc,无论其是 glibc、uClibc 还是 musl libc ,都可以通过此种方式链接到 bFLT 程序里。这里以 uClibc 为例,讲解如何用整合进 elf2flt 的工具链编译一个可以运行的 bFLT 文件。 + +首先,我们以一个简单的程序作为例子(`hello.c`): +```c +#include +int main() { + int num = 0; + printf("enter your number here:\n"); + scanf("%d", &num); + printf("hello world from number %d!\n", num); + return 0; +} +``` + +接下来我们编译源程序。理论上在 buildroot 外部编译的 uClibc 也能使用,但是为省却麻烦,我们直接使用 buildroot 编译好的 uClibc 库进行编译: +```sh +$ gcc -o hello-b-gcc hello.c -nostdinc -nostdlib \ +-I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include \ +-I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include-fixed \ +-I/home/ubuntu/buildroot/output/host/riscv64-buildroot-linux-uclibc/sysroot/usr/include \ +/home/ubuntu/buildroot/output/build/uclibc-1.0.44/lib/crt1.o \ +/usr/lib/gcc/riscv64-linux-gnu/11/crti.o \ +/usr/lib/gcc/riscv64-linux-gnu/11/crtbeginT.o \ +-L/usr/lib/gcc/riscv64-linux-gnu/11 \ +-L/usr/lib/gcc \ +-L/home/ubuntu/buildroot/output/build/uclibc-1.0.44/lib \ +-Wl,--build-id=none -Wl,-elf2flt=-r --static -lc -lgcc \ +/usr/lib/gcc/riscv64-linux-gnu/11/crtend.o \ +/usr/lib/gcc/riscv64-linux-gnu/11/crtn.o +``` + +注意到这里的链接过程所使用的库有两个来源:gcc 和 uClibc。很显然,来自 gcc 的库使用本机的也可以。 + +生成可执行文件后,我们使用 flthdr 查看它的 header: +```sh +$ flthdr ./hello-b-gcc +./hello-b-gcc + Magic: bFLT + Rev: 4 + Build Date: Fri Sep 29 08:20:22 2023 + Entry: 0x44 + Data Start: 0x99a0 + Data End: 0xb2d8 + BSS End: 0xd420 + Stack Size: 0x1000 + Reloc Start: 0xb2d8 + Reloc Count: 0x1f + Flags: 0x3 ( Load-to-Ram Has-PIC-GOT ) +``` +可以看到,编译过程没有问题,这个可执行文件确实是 bFLT 格式。 + +然后我们把构建好的源程序放到挂载好的磁盘镜像中: +```sh +$ sudo cp ./hello-b-gcc /mnt/buildroot-nommu/root +``` + +最后我们运行 linux 系统镜像,并在上面运行我们的 bFLT 程序: +```sh +$ cd /home/ubuntu/buildroot/output/images/ +$ ./start-qemu.sh + +~ # ls +hello-b-gcc +~ # ./hello-b-gcc +enter your number here: +114514 +hello world from number 114514! +``` \ No newline at end of file -- Gitee From c6c8120d682066662861962c8952605ff9683026 Mon Sep 17 00:00:00 2001 From: asterich Date: Fri, 29 Sep 2023 22:59:05 +0800 Subject: [PATCH 2/6] rename article "20230919-elf2flt-elf2flt-build-1.md" to "20230929-elf2flt-elf2flt-build-1.md" --- ...flt-elf2flt-build-1.md => 20230929-elf2flt-elf2flt-build-1.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename articles/{20230919-elf2flt-elf2flt-build-1.md => 20230929-elf2flt-elf2flt-build-1.md} (100%) diff --git a/articles/20230919-elf2flt-elf2flt-build-1.md b/articles/20230929-elf2flt-elf2flt-build-1.md similarity index 100% rename from articles/20230919-elf2flt-elf2flt-build-1.md rename to articles/20230929-elf2flt-elf2flt-build-1.md -- Gitee From 840f16ac91fe5ed9b53d7aedef018d5b9d9ca9f1 Mon Sep 17 00:00:00 2001 From: asterich Date: Fri, 29 Sep 2023 23:08:02 +0800 Subject: [PATCH 3/6] edit article: 20230929-elf2flt-elf2flt-build-1.md --- articles/20230929-elf2flt-elf2flt-build-1.md | 44 +++++++++++++------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/articles/20230929-elf2flt-elf2flt-build-1.md b/articles/20230929-elf2flt-elf2flt-build-1.md index 982fe6f..924651b 100644 --- a/articles/20230929-elf2flt-elf2flt-build-1.md +++ b/articles/20230929-elf2flt-elf2flt-build-1.md @@ -1,39 +1,43 @@ - +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces toc urls refs pangu]
+> Author: Odysseus <320873791@qq.com>
+> Date: 2023/09/19
+> Revisor: walimis <>
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal: [为 ELF2FLT 完善独立编译与安装支持](https://gitee.com/tinylab/riscv-linux/issues/I79PO2)
+> Sponsor: PLCT Lab, ISCAS # elf2flt 篇三 使用 -[TOC] - ## 前言 -在本机安装完 elf2flt 后,我们就可以使用它构建 bFLT 程序,并放到 no-mmu 的 linux 系统中运行。 +在本机安装完 elf2flt 后,我们就可以使用它构建 bFLT 程序,并放到 no-MMU 的 Linux 系统中运行。 -我们首先需要一个 no-mmu riscv 的系统,这里我们使用 buildroot 构建的 qemu 镜像来进行测试。 +我们首先需要一个 no-MMU RISC-V 的系统,这里我们使用 Buildroot 构建的 qemu 镜像来进行测试。 ## 准备 -准备工作主要是 buildroot 的构建。首先我们进入 cloud-lab 里面的 riscv64 实验环境。 +准备工作主要是 Buildroot 的构建。首先我们进入 cloud-lab 里面的 RISC-V 64 位实验环境。 ```bash $ tools/docker/run riscv-lab ``` -等待片刻,我们就可以进入到 riscv64 的实验环境了。理论上本机并不需要 riscv64 的环境,有交叉编译工具链即可,真正需要 riscv64 的是无 MMU 的目标环境。 +等待片刻,我们就可以进入到 RISC-V 64 位的实验环境了。理论上本机并不需要 RISC-V 64位的环境,有交叉编译工具链即可,真正需要 RISC-V 64 位的是无 MMU 的目标环境。 -而后,我们在 riscv-lab 里面安装 buildroot 。首先我们把 buildroot 仓库克隆下来,进入到 buildroot 目录: +而后,我们在 riscv-lab 里面安装 Buildroot 。首先我们把 Buildroot 仓库克隆下来,进入到 Buildroot 目录: ```sh $ cd /home/ubuntu $ git clone git://git.buildroot.net/buildroot $ cd buildroot ``` -进入后,我们可能需要先安装 CMake。如果本机是 riscv64 环境且没有安装 CMake(例如我们的 riscv-lab 环境),buildroot 会自己构建一份,此时会出现与 libatomic 库有关的错误。 +进入后,我们可能需要先安装 CMake。如果本机是 RISC-V 64 位环境且没有安装 CMake(例如我们的 riscv-lab 环境),Buildroot 会自己构建一份,此时会出现与 libatomic 库有关的错误。 ```sh $ sudo apt-get update $ sudo apt-get install cmake # riscv-lab needed ``` -然后我们开始配置 buildroot。由于我们是在 QEMU 上运行的 riscv64 no-mmu系统,因此采用`qemu_riscv64_nommu_virt_defconfig`配置: +然后我们开始配置 Buildroot。由于我们是在 QEMU 上运行的 RISC-V 64 位 no-MMU 系统,因此采用`qemu_riscv64_nommu_virt_defconfig`配置: ```sh $ make qemu_riscv64_nommu_virt_defconfig ``` @@ -75,7 +79,7 @@ Jan 1 00:00:10 login[34]: root login on 'console' ~ # ``` -至此,buildroot 的准备工作已经完成。 +至此,Buildroot 的准备工作已经完成。 ## 使用 @@ -95,7 +99,7 @@ int main() { } ``` -接下来我们编译源程序。理论上在 buildroot 外部编译的 uClibc 也能使用,但是为省却麻烦,我们直接使用 buildroot 编译好的 uClibc 库进行编译: +接下来我们编译源程序。理论上在 Buildroot 外部编译的 uClibc 也能使用,但是为省却麻烦,我们直接使用 Buildroot 编译好的 uClibc 库进行编译: ```sh $ gcc -o hello-b-gcc hello.c -nostdinc -nostdlib \ -I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include \ @@ -137,7 +141,7 @@ $ flthdr ./hello-b-gcc $ sudo cp ./hello-b-gcc /mnt/buildroot-nommu/root ``` -最后我们运行 linux 系统镜像,并在上面运行我们的 bFLT 程序: +最后我们运行 Linux 系统镜像,并在上面运行我们的 bFLT 程序: ```sh $ cd /home/ubuntu/buildroot/output/images/ $ ./start-qemu.sh @@ -148,4 +152,16 @@ hello-b-gcc enter your number here: 114514 hello world from number 114514! -``` \ No newline at end of file +``` + +## 总结 + +本篇文章主要内容为 elf2flt 工具的使用,由于其能够整合进已有的交叉工具链中,故使用起来比较方便,但是需要注意编译时使用的 libc 库和头文件。 + +## 参考资料 + +- [https://gitee.com/tinylab/elf2flt][001] +- [https://buildroot.org/downloads/manual/manual.html][002] + +[001]: https://gitee.com/tinylab/elf2flt +[002]: https://buildroot.org/downloads/manual/manual.html \ No newline at end of file -- Gitee From 36a28260d74496fbc3264627590c459a6f4a1926 Mon Sep 17 00:00:00 2001 From: asterich Date: Fri, 29 Sep 2023 23:08:28 +0800 Subject: [PATCH 4/6] elf2flt-elf2flt-build-1.md: commit correct result of tinycorrect Signed-off-by: asterich --- articles/20230929-elf2flt-elf2flt-build-1.md | 33 ++++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/articles/20230929-elf2flt-elf2flt-build-1.md b/articles/20230929-elf2flt-elf2flt-build-1.md index 924651b..62d62db 100644 --- a/articles/20230929-elf2flt-elf2flt-build-1.md +++ b/articles/20230929-elf2flt-elf2flt-build-1.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces toc urls refs pangu]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces codeblock codeinline pangu autocorrect]
> Author: Odysseus <320873791@qq.com>
> Date: 2023/09/19
> Revisor: walimis <>
@@ -12,7 +12,7 @@ 在本机安装完 elf2flt 后,我们就可以使用它构建 bFLT 程序,并放到 no-MMU 的 Linux 系统中运行。 -我们首先需要一个 no-MMU RISC-V 的系统,这里我们使用 Buildroot 构建的 qemu 镜像来进行测试。 +我们首先需要一个 no-MMU RISC-V 的系统,这里我们使用 Buildroot 构建的 QEMU 镜像来进行测试。 ## 准备 @@ -22,9 +22,10 @@ $ tools/docker/run riscv-lab ``` -等待片刻,我们就可以进入到 RISC-V 64 位的实验环境了。理论上本机并不需要 RISC-V 64位的环境,有交叉编译工具链即可,真正需要 RISC-V 64 位的是无 MMU 的目标环境。 +等待片刻,我们就可以进入到 RISC-V 64 位的实验环境了。理论上本机并不需要 RISC-V 64 位的环境,有交叉编译工具链即可,真正需要 RISC-V 64 位的是无 MMU 的目标环境。 + +而后,我们在 RISC-V-lab 里面安装 Buildroot。首先我们把 Buildroot 仓库克隆下来,进入到 Buildroot 目录: -而后,我们在 riscv-lab 里面安装 Buildroot 。首先我们把 Buildroot 仓库克隆下来,进入到 Buildroot 目录: ```sh $ cd /home/ubuntu $ git clone git://git.buildroot.net/buildroot @@ -32,35 +33,41 @@ $ cd buildroot ``` 进入后,我们可能需要先安装 CMake。如果本机是 RISC-V 64 位环境且没有安装 CMake(例如我们的 riscv-lab 环境),Buildroot 会自己构建一份,此时会出现与 libatomic 库有关的错误。 + ```sh $ sudo apt-get update $ sudo apt-get install cmake # riscv-lab needed ``` -然后我们开始配置 Buildroot。由于我们是在 QEMU 上运行的 RISC-V 64 位 no-MMU 系统,因此采用`qemu_riscv64_nommu_virt_defconfig`配置: +然后我们开始配置 Buildroot。由于我们是在 QEMU 上运行的 RISC-V 64 位 no-MMU 系统,因此采用 `qemu_riscv64_nommu_virt_defconfig` 配置: + ```sh $ make qemu_riscv64_nommu_virt_defconfig ``` 最后开始构建: + ```sh $ make ``` -构建完成后,生成的镜像在`/home/ubuntu/buildroot/output/images`下面。我们看一下这个目录下有什么: +构建完成后,生成的镜像在 `/home/ubuntu/buildroot/output/images` 下面。我们看一下这个目录下有什么: + ```sh $ cd /home/ubuntu/buildroot/output/images $ ls Image rootfs.ext2 rootfs.tar start-qemu.sh ``` -这里的`Image`是系统镜像,`rootfs.ext2`是磁盘镜像,`start-qemu.sh`是系统镜像在 QEMU 上运行的启动脚本。由于下文需要将我们自己的 bFLT 文件拷贝到磁盘镜像下,我们先将其挂载: +这里的 `Image` 是系统镜像,`rootfs.ext2` 是磁盘镜像,`start-qemu.sh` 是系统镜像在 QEMU 上运行的启动脚本。由于下文需要将我们自己的 bFLT 文件拷贝到磁盘镜像下,我们先将其挂载: + ```sh $ sudo mkdir /mnt/buildroot-nommu $ sudo mount rootfs.ext2 /mnt/buildroot-nommu ``` 然后我们启动镜像: + ```sh $ ./start-qemu.sh @@ -76,7 +83,7 @@ Saving 256 bits of creditable seed for next boot Welcome to Buildroot buildroot login: root Jan 1 00:00:10 login[34]: root login on 'console' -~ # +~ # ``` 至此,Buildroot 的准备工作已经完成。 @@ -85,9 +92,10 @@ Jan 1 00:00:10 login[34]: root login on 'console' elf2flt 的使用实际上非常简单,只要安装完成,它就已经整合到我们的交叉编译工具链里面。 -bFLT 程序的构建过程是将源程序编译成 ELF,再将其与同为 ELF 格式的运行时库(例如 uClibc)进行静态链接,因此,理论上只要是 libc,无论其是 glibc、uClibc 还是 musl libc ,都可以通过此种方式链接到 bFLT 程序里。这里以 uClibc 为例,讲解如何用整合进 elf2flt 的工具链编译一个可以运行的 bFLT 文件。 +bFLT 程序的构建过程是将源程序编译成 ELF,再将其与同为 ELF 格式的运行时库(例如 uClibc)进行静态链接,因此,理论上只要是 libc,无论其是 glibc、uClibc 还是 musl libc,都可以通过此种方式链接到 bFLT 程序里。这里以 uClibc 为例,讲解如何用整合进 elf2flt 的工具链编译一个可以运行的 bFLT 文件。 首先,我们以一个简单的程序作为例子(`hello.c`): + ```c #include int main() { @@ -100,6 +108,7 @@ int main() { ``` 接下来我们编译源程序。理论上在 Buildroot 外部编译的 uClibc 也能使用,但是为省却麻烦,我们直接使用 Buildroot 编译好的 uClibc 库进行编译: + ```sh $ gcc -o hello-b-gcc hello.c -nostdinc -nostdlib \ -I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include \ @@ -119,6 +128,7 @@ $ gcc -o hello-b-gcc hello.c -nostdinc -nostdlib \ 注意到这里的链接过程所使用的库有两个来源:gcc 和 uClibc。很显然,来自 gcc 的库使用本机的也可以。 生成可执行文件后,我们使用 flthdr 查看它的 header: + ```sh $ flthdr ./hello-b-gcc ./hello-b-gcc @@ -134,14 +144,17 @@ $ flthdr ./hello-b-gcc Reloc Count: 0x1f Flags: 0x3 ( Load-to-Ram Has-PIC-GOT ) ``` + 可以看到,编译过程没有问题,这个可执行文件确实是 bFLT 格式。 然后我们把构建好的源程序放到挂载好的磁盘镜像中: + ```sh $ sudo cp ./hello-b-gcc /mnt/buildroot-nommu/root ``` 最后我们运行 Linux 系统镜像,并在上面运行我们的 bFLT 程序: + ```sh $ cd /home/ubuntu/buildroot/output/images/ $ ./start-qemu.sh @@ -164,4 +177,4 @@ hello world from number 114514! - [https://buildroot.org/downloads/manual/manual.html][002] [001]: https://gitee.com/tinylab/elf2flt -[002]: https://buildroot.org/downloads/manual/manual.html \ No newline at end of file +[002]: https://buildroot.org/downloads/manual/manual.html -- Gitee From 465d07b395909ec1100428a5c6d98aa6c7582cf5 Mon Sep 17 00:00:00 2001 From: asterich Date: Sat, 30 Sep 2023 23:42:40 +0800 Subject: [PATCH 5/6] fix article 20230929-elf2flt-elf2flt-build-1: remove all Buildroot dependencies so the compile procedure of bFLT binaries depends on just uClibc, GCC and Linux Headers Signed-off-by: asterich --- articles/20230929-elf2flt-elf2flt-build-1.md | 72 ++++++++++++++++-- .../menu-1.png | Bin 0 -> 31434 bytes .../menu-2.png | Bin 0 -> 34911 bytes 3 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 articles/images/20230929-elf2flt-elf2flt-build-1/menu-1.png create mode 100644 articles/images/20230929-elf2flt-elf2flt-build-1/menu-2.png diff --git a/articles/20230929-elf2flt-elf2flt-build-1.md b/articles/20230929-elf2flt-elf2flt-build-1.md index 62d62db..696fef4 100644 --- a/articles/20230929-elf2flt-elf2flt-build-1.md +++ b/articles/20230929-elf2flt-elf2flt-build-1.md @@ -16,7 +16,11 @@ ## 准备 -准备工作主要是 Buildroot 的构建。首先我们进入 cloud-lab 里面的 RISC-V 64 位实验环境。 +准备工作分两部分,一个是 uClibc 的构建,另外一个是 Buildroot 的构建。uClibc与 bFLT 程序的关系会在”使用“一节详细说明,此处暂且认为它是 bFLT 程序执行所需要的依赖库;Buildroot 主要用于测试构建完成的 bFLT 程序。 + +### Buildroot 构建 + +首先我们进入 cloud-lab 里面的 RISC-V 64 位实验环境。 ```bash $ tools/docker/run riscv-lab @@ -88,6 +92,56 @@ Jan 1 00:00:10 login[34]: root login on 'console' 至此,Buildroot 的准备工作已经完成。 +### uClibc 构建 + +我们首先将 uClibc 克隆下来: + +```sh +$ cd /home/ubuntu +$ git clone git://uclibc-ng.org/git/uclibc-ng +$ cd uclibc-ng +``` + +uClibc 依赖于 Linux 头文件, riscv-lab 实际上已经自带所需头文件,但是还存在一些小问题,我们需要动用 `riscv64-linux-gnu` 中的部分头文件手动进行软链接。 + +```bash +ln -s /usr/include/riscv64-linux-gnu/asm /usr/include/asm +``` + +链接完成后,我们打开配置菜单: + +```sh +$ make menuconfig +``` + +配置菜单打开后如下: + +![](images/20230929-elf2flt-elf2flt-build-1/menu-1.png) + +我们进入 "Target Architecture Features and Options" 菜单,并配置成如图所示: + +![](images/20230929-elf2flt-elf2flt-build-1/menu-2.png) + +然后我们退出菜单,直接构建: + +```sh +$ make +``` + +至此,uClibc 构建完成。我们看一下其中的目录结构: + +```sh +$ ls +COPYING.LIB extra ldso libcrypt libm libuargp MAINTAINERS Makefile.in Rules.mak +COPYING.LIB.boilerplate include lib libiconv libpthread libubacktrace Makefile Makerules utils +docs INSTALL libc libintl librt libutil Makefile.help README + +$ ls lib/ +crt1.o libc.a +``` + +我们可以看到,编译出来的 libc 就在 `lib/` 下面,编译时直接链接上去即可;相关头文件在 `include/` 下。 + ## 使用 elf2flt 的使用实际上非常简单,只要安装完成,它就已经整合到我们的交叉编译工具链里面。 @@ -107,25 +161,27 @@ int main() { } ``` -接下来我们编译源程序。理论上在 Buildroot 外部编译的 uClibc 也能使用,但是为省却麻烦,我们直接使用 Buildroot 编译好的 uClibc 库进行编译: +接下来我们利用本机的 Linux 头文件和 uClibc 库编译源程序: ```sh -$ gcc -o hello-b-gcc hello.c -nostdinc -nostdlib \ +$ gcc -nostdinc -nostdlib \ +-include /labs/riscv-lab/uclibc-ng/include/libc-symbols.h \ +-I/home/ubuntu/uclibc-ng/include \ -I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include \ -I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include-fixed \ --I/home/ubuntu/buildroot/output/host/riscv64-buildroot-linux-uclibc/sysroot/usr/include \ -/home/ubuntu/buildroot/output/build/uclibc-1.0.44/lib/crt1.o \ +-I/usr/include \ +/home/ubuntu/uclibc-ng/lib/crt1.o \ /usr/lib/gcc/riscv64-linux-gnu/11/crti.o \ /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginT.o \ -L/usr/lib/gcc/riscv64-linux-gnu/11 \ -L/usr/lib/gcc \ --L/home/ubuntu/buildroot/output/build/uclibc-1.0.44/lib \ --Wl,--build-id=none -Wl,-elf2flt=-r --static -lc -lgcc \ +-L/home/ubuntu/uclibc-ng/lib \ +-Wl,--build-id=none -Wl,-elf2flt=-r -o hello-b-gcc hello.c --static -lc -lgcc \ /usr/lib/gcc/riscv64-linux-gnu/11/crtend.o \ /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o ``` -注意到这里的链接过程所使用的库有两个来源:gcc 和 uClibc。很显然,来自 gcc 的库使用本机的也可以。 +注意到这里的链接过程所使用的库和头文件有三个来源:gcc、uClibc 和 Linux 头文件。很显然,来自 gcc 的库使用本机的也可以;Linux 头文件由于版本与 Buildroot 所构建的 Linux 版本不一致,可能会出现问题,这里可能需要自行获取 Buildroot 对应版本的 Linux 头文件。此处本机并未报错,说明没有发生版本冲突。 生成可执行文件后,我们使用 flthdr 查看它的 header: diff --git a/articles/images/20230929-elf2flt-elf2flt-build-1/menu-1.png b/articles/images/20230929-elf2flt-elf2flt-build-1/menu-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f31279cc70fcda60f6e6649211a47b46f457ed98 GIT binary patch literal 31434 zcmd43cT`hf*De~Rseo8P5CNr$f}nKiq99!ar3VB7=^#CnfC$JBrPt7Lp|Hr!b0JS6h8;k>HS1ltg0H8jZ{qPwJ zr1FX>U>AYlGlpjX3!i4 zu@gvHEJY2nD3V)^)RBGZT^s$pnT5;K(+)W9*u($kQ_33l zZUuH>I#o}eH)(`#+z}%A75ai)6e9;;stdIzHMH1*yIk5LJfaa&+W6@kki=5Y_X$6PVi`vMOm*|#-*;b^l@@tesACx5nz7`Vu- zFVAHpHQ+azl!tF8N3Ru`VtG{QAC}*mpmvrGXECM=3OO&R!|`XL2I~*|U6!aInMSe`~re;(@Jna31Oh_y_8Vj}l`$B%@o|>hgi|LAtD>c=~^E)N&p z0sx9b?lheV!MsxEg^LuSEKh`DVidn&?Yt6ec+)Shhzr7hNXf5xrbE3TRF?a9U8lQBwvZ3PUrxS;fzIOuR-=B z`m`KL;B^ew;<7<@w{~j*wBK=iJyivM@!i1k#H&Gy;D%Z_!f#OCC@3_Ka`09e;q*HW z*Lkn62|-%mdNxy=EnFCBOxH8_Ctkn;!#XKPEi1pW;bhR2!A!G$B@@urg|U^CzZ*q(&ns|noCT+rUn-u;M; zvlvP~h%onQ)r-7a%jG&&pMymp4qi`&gRSVBK3&c(w$e}&9Qo5Va&XllOno#rzEFc- zQu44870P9cAz71s!>Zs`f;(JLXXB#l!sXK`p#fJn4s|a2x_mfhH74ZTcKd+ zNQ=&%+Cw>ZzJnPfC1aJ-(H3V&tY{FBz7^_UkW0cPD2@29fxffhxPD>yI*)t18+pZ% zRK$QwLHGU%=zRN~jCqlS89SaKafZG)wB2I|4G1K8P+8E|fjrsk{wCJkuJ0+?BG-JV zWXd`b=iwVm;um|qR&m$EIq`}iSi}OU0$aCTkr;Lo0Qg5-UTASQmcL0cbAlE19$fhFJWy9=c zY4h?T`)WAa;Vrv;#B?X5I=u_nH>i?rp|@Jp^|Y4mY9_?-cB~L);>By))-z|~xpYg? z%_?pA8$v{PTY(T+01|u)lnyc3Qzv865C`Ee7sSek%p(?R;2X;M=h<%^14Je0ojlPB zX@BO9Aa-ffabuj#S>2Owr(9xw!y$5H8K*ofNd5+p)1a>HS(1}pdaH(Th0F41AMg)_ z*a@*u&2H|#-FGdtCyI{C%lYZ(HJXk&f0kFI`|b7OrA;7|H6T`Pvwa7LHY_hotZ1v{ zksq+>3)ny(H+i&45xpd;RvNzHd|3&1@u}F#b7=P2`?dy=&qzK+8tW`#ouAE%FKhLJ zG!E1ttb7k;NXR?T4GQOW`dZ*vLvQNuWQn7+*F>w^ad0lyUE*L1Xd__%$3)at-Nxf7 zR9ODmG5<^bX$%A5;CPPdI5u*rDUFPsIgHF*P;ks)4Eq z7iOabAz;T2>5w6Nk{Ss(ZjQ*szS%Cba&K?F_k$|1i9YS-<+e?Er?sdwKJFjFGrWhu zsNz_uIc#~W73GN*i7%M*Zj19*S}dLkUFJH7RYX(`Sl~PA4U`cH3GKi?i`j7e>xHMU zSWsLVm(Cgv;$B0uP45E@jy52jz{9RN8sG_{n6If26Fgf4*DOc(tGHP?_WV}bmev#U zX=L`kGtZXnOJ1?DcV+vMC@>G!yw`qVn>7<}n^;eJ$97~rJFXnxAID+Z|<%68XA=EF`f@U}zR1l%r?FQ~Dc$+V$N zwbk1F>UKEiA8{NIb^aX2xqEk9syF6IYEt<_{rp>|F*cM4tH6ohZYJ4fq%T_!QPbq5 z;E)=rm$W-yPc9!YIGDI-{Se^MbKN{yR}WS-DHqyd(&Y{1yaNhkw7}t%@1J(lH8uZo zwWxFYlxYShWo$BuCr3KRA-yMA4B{j$cgLyg>gicu6NV5XD76akh3!(WlD!JNC!MhC9^FYD?VcbH@QmEQ~SA@w0vbs+3rqJ2HlD zLC0r}O2n($?XWd3_PNMDf=uOM5py519yGw zibZo;mQ;WFD0+7W+tCwC``5=benSRRZu#}61r@L`arSuJlt7x#?MftjfONtY(5N+i z6j5N`bGJ2uBRGG0oCV;!y`Omu(Cu3r{^jQL{Lpvg$P*vuPu{XiMMTCQDM}Bq36R`f zOWnQ4Umfd0<$QkAx=Y|`M4E&|OgE)Cv75H5)zmAJV2c+nb3Cd<>C1j<3;u@(8a{q_ z1PV1PjyezsbC({nuarjwgTszgM!p4iSgGj^{d}7O*4tjI!Fp`_2%e{a1t_{fG?eOZ z4X?%>tN^tdZbz!j) z&JJ*>U@WsJ-nEO~;*7Z$#!^W9@tO1kI!*tT>=ym)!rg|8ajeYEZgv#RUJ;_p{gh>J z*Fx9iE4s++M;de}5|4AXiE1aF$6QTDn6cMhqgos=XiR}g&S%fzHgTy$+3$x2=h9oU z1``Ft7OUqZF`^pb*j<-C#nnWY=__2!?(b=;FDb4Ms?o}{r_eKpo7tU+wwHR5{TU|2 zb~5!|(@e}c1}bef#n~`Pcd-%VsqBT?6M;cg8!xSWKblP`&*-<&J5FUdSs&2pn?4NE znDpcDFx=;0x`<|_82pl9I=VSJC_6137U{e5uJC*2s10I(G;6E%6g|Vsp;OVV(CYqZ^_w6y50>HqQzFH~%P#d^)blbP{-M!~+y*wBQ63monhzJ<4G?a;fll z?>CmVzoKTT^Y7)XPfV_DfI+_-vW;CaDGNxafq;#cgPdYNV3BYcRwhZ*4giSN(F6co zVsF02IlSzg=^b}nwX>G+I(4(>m8%!LXD$&bFa zspLSmHg4%=aLMO&(Q2BvR>`YRn=jul{x7~zfdvW@%bXKf`j-a~B21xqeZ+C7)U~*e z-zPoRWKF_*PRH>mwu2wuYY#cbnwlK(zDTDChE2ITnxdP9ll|40tMwQJI>rYL)8g)D zI95>~yP+I_ZpqQLuhyj>M!HPZMeOTJr#<|GSKlf5*z?i8fB7PuM1`mJYw$K1vWdvf zsx}l(K4(3pwM64(8Y-RgVx`wA0wB|vRQ$*4*#Ic@K)7laVtHkL9xr|!_6OT1Nue<} zb^e9zehfB#2l;c`#CgERhncE*!18*}b@C)IM(=+k`&X2pkJdW>CWW($YZE<`SBkik zlHrnocKz(in41Up`d9X{1M*85NWZwhp>%vEuv;;~o>xeSfuaf)#izJO;rH^M-?-#- zs`b^c&ze`mZ~TE_u@$A`#{+l)fD6_W4li~h3Z)AA;gj5EJRCBu>c;@%ZyBMLsLv`h zA}ThGp%-j4?9aEKH#}Br0_YYQb^eQe{|$dRS($et1S*D!z$;%b{W}2j-*8*=H2z1Z zm6u?9aHEG)Byi1QmM|aiU3F$E&?o9bJpRcn^N_J@$kJA5PVxM^kDVsmENEBt%cRSM zC$~AM!zmd=E5hLN9Hw>C`+1mp{w^_pSs?-b!z*ja>ZsMof7&tYqO_3jRMwMQS-Baz zi7zjuPq|pRS?>uvn#+*)s#FtPbGK;*PXeoct-WPKW8aPwt1@e0Bj~xe8=rTT=SP~_ z`$^ShTF{g(6?-cf#xVykCn8o4CsuqS!`21&W!D$*h_S$~mZ^(fSClgMw)hnr`bLf5%35d|74QyEm$j?vc=;3cRD8E>wHYxCI4 zJFYOI>8o+$%ywa@!NH+bYgD&!hj6B>L4#*)=AN-e%i#%NU2bNPz21=d^?PgYH~h}_ zs3Mc#c(U-S!odm=3Qj3O)U&R|P7YlP^@09k>AI}czXdAsI*>mp(VsS%fq&S0`_YHD zGewBb%!-GVT~qb~Q$f!mq5};^{*R}}M8D8I4?JP>ptbPeg7zB6?FCdThd1u{=Ii~O9H;bX ztAL~)*v5zl*!35DslU8*cN|ug7#4MD)a1M@OLM`VU8cw#!N=RuXzU~q#T0r@URuX? zp~CLGi@0r(vSfir!i02du()uDT0Cju{DJC}9;r{taKA7~mOvAY6v%JI8M0(=DD+)* z2kZ4Ke^V}-&)$v{xQFBP6MU;O!UzIAUWfShr->q8!M%1`E{Epx5{g2{{rTNJI8)b> zBGmNNMGCa%8Wtmyyrt=pHTNj4m5Z)-zb=vpwnmeDSNvx;1;50Cboo4PJ-q$Rzvsfu zr<&c*tvkk3c16?eU2lxJh4IvwXw)TAJrur`BdZ~KwBdhjDtKHJAK|9&B>RG{-jXyg zZ`3#-D*bx!%L_c;h32yCY?#LswSCxOs^qcMhLmv45|Y~3<+Jb}v|?s7sU>^Fb|Nva zp$@xe;RT|~o}OJ}3S7Vx1{3`HUxu{Js$`W_c!DC4aVjI7S?l(4%`KbplHOqYUNbV{ zx;aw~FTR;K*X86`^GC?d?;B~Z;HQnZs2=Sm>1#Ks4MBBM?~>YFke>!;-=a#-m)IL8 z27dJ98b2;{z^{XxEkgx(4SBXWszbHIpNT~zZLfv>1VOT9p3jvh8bd1FHqywX!Xx#w zbX8A92u*s$sjF63IbLtTzd)iBY~it>CVQQr(w`lG?AIHPe|>m)SXcvd9*W8!eiE@Q z67N=>n;dRqA>mpn=tw zv9+i2#LBWx+H7;j`%Dj>D0jIeFF|Mdu)9y0R)^mqo>M`7f{n1$YVtH)e!3M?Z;NBQ zyXKB7;WG4{PIbCXjvB4+-6D7ph?_BQ9+DffgY>8dX&El1Zw#{MsO)nxpKAOYp3_O? zUa|zsq`Zaw!{eTdzF|84f=s;;1%w=LMyE89SRDVNtBUfv6q?BPb?KcC1rm~RH&dVu5cG%Q* zWEu5w5=#3Q$zhnTqf8!vBVU>ro9DaI{HA1zY&w(oR*;Or9|(=~D?-9h0r|aHyT&X2 zybo!gby@>8HEXdbiKic;qJntVo!jf@)?c@CzIJyqbn#}nW>P=&>2`UT*)J%BtyFtj zUXUDT4pRK2zb?jIX$H-M_J5klVgh@1@wcC}hwOb>13wxz`ZR5c!y5>@Hb3pH!LnV~ z`3V`^pS6|a>68wToVlYt954ALR62*tk*MQp6Tmzs^bB18c+7KCtPTOu>vU3!KfCTK zsdru9yFys;`?Kc{ag5n*DLw(eX}pQO?$cFS-Qtr*dRQV811}=i&x`NSvB19EiNFFX zzafyBC|xoTvEZ!xykjI|EuyTI$S+QnC$4k`Ek8e@DH8E#SULEIlxk6L(S%lORWVtX z*WJNiwE8}6^}5ELyhNoBD~S0Oe1-JV?|8}*y5wq6UlvIYD|E5UNeS|bh}rMzqW5iM z8Y4a3I)&j6@5bxp+b^I3W=ORH9;MT;8m_dWz(x%o!^WS?%${QL(zcy+op=8Tgzn#F zjLx~+Jds}|XEF1sgwM)WSy!fiaB1~jj_1zblWT`5?X#$Dm48gv2#K4n#K27Q&alJ? z>X(|*?`9tS91tvf_u$IbC;M)8`SFwdiB|@0hnPKdxcpSk0NPWQ~KZ_b16kqSukzn*&H^T zEL*S|YJuoqCKQAgvR7F79Y4NztoTRAo6WL_2do{O9A9=k#WgUP0q?wwXxpR>Zer(^Gs}oijsUnpIWLl>87= zo*(LH7_WWap_k(|wdNPC%4aL>25#ndlIc#ricGujEj##zn&@a_@wN^L9Iu>zS6Xw! z@b1iYsuG*x?IL!XXP`wNPeI}RgNk-t zmAK5M+-KD~bC^+#lZ(~Y@CDj~nfswDr|=v_#4RlG97 zL=e{)c~-qedrf;x{`T;@^XwWmgz0GYW4v^5@XjnU+82!gk#+!cgv7d5q6KbzCCg>@Va;C-1jR zSU!PF+3@_(=}5!K#Kf-=A35*8*cG$*2+fIjAeb2OaJ%#+$VrA$&;8=miV2-CZyyiQF_56+v(Haf)l`)f7J>VDUKzWvyv@WyVu_OX_p+sr!1_&GN( zfia8cVe63SGL-39eJ_xtGX?@J00kRMhsnYLi=w`7d#_=)W+s<_T}~l7Lez} zuVDi#U`1i#jsfH{Vm|yOIO%QK+WQ1DD(62iB}0w5U35VM85iO5@LUJ7%vpHTWR)Ud zgHd472*&?f^tAH$oIWCrZ#O=eTT_k~3Dw|oL&f;%w4uN1b%={EuoYa>z?s||qlgx0 zXE~dq!>i9~j6WSFc~_rhOxNka7PbB1n}k3Y6Ls_93b*llV0Qm!P>qnjiP3@bw)*%3 z_)MtRN26s5p!>wmF>#NjU6J+Q8z*R??1^SnyC>JI)0^5Jje2ag7V(DYXhr)T@iVE9 zXR&I*0$-b8u+P37GGbt{eCBl=J3}fsfKlxE@5FEPJNNsdFCBBp3Xw>*;B`?!C~y;pIy>vmPb=+o}EfBBST@lt$WHdIWvZeRbVq%kf$ zuC;hb3P4D3EUsK!RezTJ#n9=fR${-?H4SsDln)mSK8auoi2DA@c_V=r-BdQaVW)eR zTr>Y}-D3!WSkI6*(Lo|UgyE`HN#(2B`KlC|A(yV$Zd!*0n)aCY~0()mpJb+a_#uHl6OgnM55TBxD^bi}ZVB%9-X%09-#V%c%AWwNzjDm&M zZR$IHD0+6YgC5gJ`MFtZ__c|@OP5uEdrt0UkK-Fu03+bLZv0FAc8+e>ZfBNxULMW4 zv`n5{XzoWTMyTAX@h24A7Nrz7wa-VRR45wMtVyotp{_t~oY6<=k)gHE3kg`NAI3(a z->B#w3v(I-3bWWvbVP?g+fSYRaH16=1X0+`>cW9Nuau?dP*p7_oM= zI6v=Iz;z#X^Kn&RDJs})J}e4#w)~x{M$6G+m)xsMcl#UGw9CchHDsK|G$$twM*=$I z^HeDgf*~^m{^2GB&N_y<`Ru3AOH)C%kd4DKnDIG%R5$(b`pYd6&gTwA7Qe<;u~_sv zOT1R){(}2fUnhS?D3~xu^B>>AzcBjQ-QI5OE87Dz)|Zt}^%snpvDPlzu*0U`jZYns z-WJG}^aJ~m8zqZ2u3Z_5f_Yeo&fBNmUkm#dth>c`NFq~}b!lHj!1Fqb~T|HBl7Xf(ups1+OW@{ARwB*7JO|Qmcq3PJJ zJQyNjL0hKb&yeRq1IoHuCD_A&8BI^T_Iv_BOtu^PLsH{z6V^PP8Cg?do2!HJ#)w`e^n}Kky^hZcn0`2FVxZeD1v& zc&bA=&&k?N;Q(v-D_lueCOg=6OZ1!lV=~IC1R9EM;9FNzYb&mPkRZVKuSGz+MrXkp5^?AvZ z4nCM)z5R27m|);TgEfRR>FcFnpV2jgu$o%Rb|T%8FC!$<0Ow+JZI`{m!F{Z=ejfZn z%0rzWNSFa*vpmM;r&F$2HHY4LF%>S8Fg zbaID@`JGl~z@WfKuF=lpQMvcX-*RZqZAA|vDiQ-E+j8zb*rbU*aO@Hf59V)ysg6-U zOj>$qJ-Id(kpnY^lb`G1Y{`?F(H7!1C-%xB70xpk^<-rsDFF=6<)uE7&8c!ewa?-8 zyaY)7#pq`sDG{j7%&s9Ef$iltn2ESX;5}#+Eubc~nTJulVs3zPLpQR5@H&O|eXiGL zd(~Eb8pd#s6`K%5waW)Y-M|%6_EMp(+=Dh&zX?N*8?6{#*Yx}gYinah`wc&&uUu~P zAL=_x8p8s*rjUz1+F@*(LrBh=TkEztZi)H^nBI0sw? z;^ls5X8!Qo5=@zgS#niAXlmXB@>*Y3x{s{Y85gxwQX;^OI@Zia)Sv@$D$%&RM*ihs zN$VKy@D~DPM-A8NZ9^lz+7NV-R`{nWC#bcp?8yHiXOiQFf$*D$tbF)3N3y5R!Tf`czR$aClo4 z)6##yk!A6%4d-t*4$hJX&+c{Dy`|2mu^QlLpNUgak~{q$?|L(#v5%zeO)X{5o_Ql3 zV)U&$yT&-WM^=t+9fdaiM>paH`Z}p6=&Meylg)`-=~(MvvzfEU!lZnqCT}j>b_Sg? zP}i6Tb~LMv+E&d`9tC>o@A@3*@vn!ua};r%WEJckPP(J|bFKNA$F~EP+-Hy?(K}q> zH_ts$Qd)o;&0u;*)F%Ck!WtHfUk%2V79V0$u!nc%g`F6Q^&y(%FIl@Xr$H$)O;j1P z+@+Fa<1XNK^``G!Oa%p4n5C=Ddt0U;i>pHg>AMu%ZN3`QRxyGL)`dR#x{vTrI^vat z?)z($GLaN5;IGzFx$io`gDMMvMg4ZSR~ofGIH*5oPb!&mxh7PMG=|)yTr-a}6CoiT zyDaDM7~9Q@ZhKwDFe@ABGap%q?y~-vHetmV8Vw4Y4oU_%h0k+#2~hc}nkQxRdywmt z9d`fnD)}qC8g*{iN|x3Ng&La%qhGzm^X@5JzvD*YnenlKq^3)RuvPhss@eH2#?P%? zN2@|*+{jx>?t}7NtnH^POV{vqcQ&Or=6HsW^~$$hxm#oMt6iY-_8R6q99jaX1`(czK@{ByLTEG|M$z`2dhWRzBjHmy_L;GrC--`Ee!sXG`!(X^JCp;q zsr+fThZdBKjE(M|I@1tdky6V+DUQDAb$fZ79GY_n5f(UM7{Hsucgt}&X6WR<+m((x zx$@=USWnbg!ljm;<_oE((8pz-F*7Hn?`5heE%vOIrE&peXsy{iOq3`;8MNtE_S1lE z)_440l+K(A6}tTo*DsKInTc->Z-(Oh@PaJZ&JZL>3*b@|OV}J27({xK5nJ1bz8ZAZmL^@DsHv-vF3@+Rt!Y* z_BdI&wdWeI_}$gRz3VO4ZV3ds`+Eb+#hM67KeTV?Z9KfZg$r5nI)0g<2QGj z=aq9_ZP&J-78MRL1lV|Y^YVxtR=hkgtqdlhXATmR2m^_Q_uZT2$kz^g5+l_S?a$Ey zOt3+nM*!32uxyNH$}lWBe%yKhYSHZF?@$2Sa%R8cFF!rw{jic=XE7?zlAh`E+i%>K5w*jA9bYK`VT9UOc=D|^nf zve`MQHIl!BXImxev61YzVq!iY;RPR@GEg<-Sdg?i1I>$_=&o1i}<>hg&3^eWZ^ z_QdQL9v++|2} zbH$@Zc$a;nsXE~kJK^i?oJZD`3<>k99;z3WGhK^kU8?vB(mx2YEdl53a&sRzIrS<> zqs0E)5qU}>PO}s}(W2<}W9|-A*|(!PqKwx!{8-52v}FG|Snfej(1Txzy5N6m+)wH2 zA5{p7Y%urp!Zw;Mp&|Xs?(Z7yb4VNAafH?9Z#8Pt$7B=lRJe}0dOFqLI=8-;a`yni z{)(fiu)?5XaqxGf0^@x|xjoH~ikf_Bk@uVSdcO6TO_S(swe{g|W)3g+Ia}WMCc&EI zhS@jMk)&d=`^ZWEu#iCu9W1C?4^XUBAA1z0q2=B$r@#_6{>pVFb-;tp-% znKbgN;+;XDGY)Ml{F4oFB5vs3>km;SWf6U#8n)B3+rFRcJ#*4OOlHk@Y~rQ^PFC}{ zrTuHzV^00Jr|IF{w5Kt(g67WJjB<(gV;YV*f}9?0Uf*4stYrok5u$fFz`cGp4({z< z9mivMEG>7|ylxEy7011dn7#1B@Y(m;4g~k7&bMmD!fu_Zxuk`=N-6)a$1wncAi{S) z6<JZm_5X5U9Q0upSZ616XF~mL4QW!97rFLzkYb$rk=w(@cN9)Cqprds zoFVYIp21UekTFMIA3r<(N25jietUL4C;P`wauclnV|aPGBL0~9qaSlj3SBa3<;g#6|cKQbRDaQ5seS`WzYRNr)QnZ zWZu&-mfcZ>d3}1&Q^>V~gP*CZZb36wKIU7cIh##-5_i~Ny7jxUKc#mKU%16gU>zyN zyj5+jS^Vv+9RIitQWc6Z#fAs9Zmi@(y+eLgt98SoLgK%QfC zOL9fQLczI5%Hv61r$0IQNz28IpwoU>0=JI9(8CQ!kyX>p`m(8cH~l7VyR@WPds~Qv zjS?6CP)|?0jbra>s>B(^GTzg1wgd<}Ql+-Q^9G>s)>iZmPUUXo5lna-?~>>$Q0Pr>NPD($*w*y zyXDXF)TZv-25|3Go(fXugN%)h2fsu&mq7=6fUVXj_XQQEc~-}y#!k0W%_oryG@-b= zFA2&b1z|JwE8Kay6q44^e5UMeHoiuLIdVNhynINRQ)zR@V6z!Lpxo$Vwn)_1{Y4$> z6#5)gI$dRio@BCWSIPgl1D$mvhHL70hf0=%L2Ow-{V_I;lwx%5#PQfe-)`*=z|>+dA+9p1~i@K(Jwa&T$WsxP_NQPhqz*tM;&Q7KtkEzIsQb?HYcgPdB z+K|{w9q$~xswF`@BRxWT3(iSFG)qSIYc(3cu=Upk7~HnP7#cKr0WK);;_8{f!}$sYU9JnyK~43w zfNZ&_f||@L73@9qt^imr$N?NQ_o~O6=`8HBroZzc4JwSfx;i(WBr0JCLe2y$Cc%Eb z$+#+*X4ozfA#)-n>sC8FEYu=sCi77ZqWRp($s7;GWB8}%I8>(wFX#7k2}qiV2fe!v z;ADN_5&uDxG2Q<4JpbTJ@o2a-!9dD@{g~O5ExX*&o;aeoX{oNH*-W@CoAjoX zi3CjNw67~WoRQ@*4X_6u;ntlJmXqK3uwx<(-gNu*6=;vORbDaJR6yZg>=V#zjKVDy zr<+Nz@P`esxs;I<;VtoUt9>3;c+Y9t=ZLI;j}sQdcb7ag+37tbn^gRg`>5B@d7t8M z_r_|uK*pl9X#)VD;`@Kgd&q(OA4FUlo8bcFDB;QQRzZS_H^Y%>Mhlj4jT^E5#?JsN zy7tE(dSDcJT*!xvNjl|_YxSSx28=OZsj!oXu#HB-0VE*&fsP)e>72laL0jl zX!t-qx$G7b!=8#9^dl}FCE*(0sN-#0OE;!{c}SzzG(2{b2~q0#S8jsis83q>RL-`gG{d9GDRe}(aHoJ(HI^ujZ{6Y2-o)xmW~KTT^$r@&W#V|U)uN> zTohzLy7`TA@tssFb^Hv=zTpP1AD$uM8oVk5D1H=))d+{q(V;%|0 z<0SsTPrv<<*EM@e99#$^<_h-RIquHgWKYS5uUgO_NB-!PPWE{?TiBsEPx^k-TfI*& z=2%Pk>Q~@hgzuMk+e1#Den_u2b%a-`J{Ua-@O|}1?V4b`ZNW-kSF}&Dkr&z;$UjWV ztMn}C?c6){3V8LNhY;AZcF^ZAVL+Nb@$O}ME_s)yYvLw<9GV0lrR7i1yKBN?@+fK3 zebgeJP;%aCw$JU@11)QzgGFbuSRuir-9GJRFuX_QRwEK4Pa01$v*BhY{^;-<0Kl=|WPfmsl3!I2 zJ_K$Pv(F}`Sbwmmac(DS+}cjHr=*1+h^FRww@puWxs`n3o&n)PS(+kcG}-y0txXtx zq^)D|Ve?5AXZ)yvEIs!%NK6$n+vJz4KD7fy;S{1U2;X6$@+?&0UM-S*3? zJN^Wv)!CJJ%vu4p14BfTlA5IP{69zRzFzr*b6>HhbM-5kFl4L8hRBFX_HM0-it|l) zMTCI&omgi-3J)CU`AoSE!LvE{yan@t1)aTW5WRdb5AE`#A9=kz2!oS*Xb}gZjR--+ zk9^ygpgy~fU+aDl53lGwvCLp4zJ`Am;0?qLy*x>b(8~=ISl0N(-c?ZOmxcj1*(01iz1@Pk0j&4{B)u`4gKVJYIlY_b@8x4E|3s9k6d7Cn~jr_qa#~D^K6G+AhT9M z(xYL&!Z9$7mOIEj(J&d5T$*(^Q4$L*bK-qErl8xI6_*(lse&3(^Iq_IAr(?g39EKe zXM;u&o1Xs;jSa#x0%lzQ{Bo4J;giR^qKA?LZ)JA|>{WC(~}AydtLZ z&=L#=mWV`LZsw&hL+M&@1>NA9a5pH1`>M3ZuL=cnX!;Tw5pQL0C`b-Qw;* zzM+X;Qcz1yU(4l@*&*|7JUq+YJ#7@e2cSe$)DYo^X z10Kn$SX%Yo*{u@XJ|R$vFho6bu(Ab-*>%Xz7a8CNXkQ013&p$H zpS}prc03LGgNuioLQ(g{DUC5sr4b=FG2f{PTC4Ah1?eZ{0Tj2Zsvgl-2KO1II#EAe z*^W7Iyk`|3n&bHclR2i0X+NxrPpme2A7g~^fR3woz)my1&k-1Z$y4W*Qr8c3L; z9ZXcarO7o$ln(1!;Wi$XtF-dwvwc6!AbSG|4AgdP+qa^0KS`xxC<-47gGg_G9oVd% zCR?-Tn;PxTR#lCu&v8x|`?QJ{w(cH6uns&?4!k#E3$H!)#yhUwFS1|oe`9CD4q@8h zQT7>qW;0X3P`qL1-j=@K?!g@Co0XZ_b4W4DHEk7@P}xC79L>*jiqHshR&0_i9&YmO zulp2`$>>lUW6eCej#3Ll{w)a+x^$+DWeVinVL_^nEs2!fPMY9Rbbf}Cs!|9WN<))Q zLH;;axk1NXc!OA~zcfpnC?rqTa#U+e}asU?74gWmf#_2!TXJQObz>F_POkjD{=;1Vi3+?$uOz!O_yhF z9_Nu>ar7*!Dp|JRE|_`^l^K--=ZYD@kL!|*RdZ^6b~Q|1$aghO4zzqC#Evxx@(!r= zh>;u^b0f9}(~cKdGs1R_2p{{(8drS??fBYDqfb|SI@@MIK4CXnk?Cht5#`Qi_q>yq z_#G!zDtn>}BJVp?T4heQMe_B1KmJL=KJQhlMTY=~dfD0+=3e{rd>G$;M<(8D^Fz_s zb!5EQz1{4_;T~fuch4{Z0B2$uZ}j*K0342r1FwSc>DJ7!eIDNm5^>T>CIQVJlHirX=TD69MTG!5Lq7AldCT%znYgoFjP)_`PPMQc_7&{A4?|-}0k$lE8(!o~-Ur zwvMYSc55%l@n1n-Z3JFKGZt6M>pzsVjZx1tNL#}st3~cuuoU{UO!P!AKVG#%ea!bO z?`0_BY>T;%1 zU1zSp@DY^*k4`c_DDR27n6B|a0L$p>g+FK%YX)BN4kdo{*cMQX>{clXnU?x}P&sS* zgURSar7db1B|k0FQ>>S+h_sM1Z4Ao&QO?q3^53bJ3xEDGMLoP|ZAd+5abom0&zu2f$#{0S z>dc=6Nx7CLgBrbNJuY|3i&}yDDHO=?Q0&i+4qnbkj@)NBA*%l=S?uA+%H53+__uQc zxXQ4*f42YWZI~IcA=v3j5vK1*N{Rtz;6Iwfu-`FA6Y2)-PNKdn01(w6%6Z6WyzMn=Dvq@pSNfrR#{Q7iiXKtOJH~yO|6Xcuf3fXogqW^a zaE>zEXdmSNzuNoGsHV1dU8E{VQE7^xfCU8vrGp6APytbq79^l-Isv3gZz77)m0lF7 zBE1tJU;zG zTC#S6wdm>zt{2$wrDw8r?VY3^__{5ouD zG4^n!8cxqqDqCABcbg9PzG7{y&7iB`n2ljU?b{0V)0z67wYWk_o<%((EY(`3to(X0 zJm5bft1Pq|v$ul$y(4n#h7S})9SC!FGLCsoXT{=uSO$ywZPpk)0$MHooHLE?U@w|t zdgV~Y6}C){wNo%{`R(mRLsUVgfAc_shF1IK6EIAk1^Foc&U}-nD6e5qPNQID4!k92plsm!@M)I^Kdz)it>G`uUAky zP-`W6&%=(f!oWM%7?o%8l~XZD2(nU&QHHSye1 zq;kHr7q=PDjI)oSQlD1h+GVYayVgLrvPrl(rXv8uEuJt*ua$MbS4VF^J;S^3A{E74eW-r6V!e8_5 zARJNJ?@C(DTPP8(sioAyHFh5x@U`|`RW8RodX?quOgCQdH!o5wf|osuc5&X{yLk3T z)P*| z8`8ke`>B!DQR^?x9`If3^1Qg60b@L?o$Avty=a%jSMu`vANeFugjOg&h-LaHBM)97 zWm0RKI?#Zg@b|{Z7>e*dDliE>Z8EBYshX6ieG()SRtv)RN zMtn{a?7f<=(q`jfO5nbw<3(xfg%Wc$0%yFMiH@%Ui!8?3dMwB34&hpoJ%wtHS{?Ix z*$LwUY7TH21GhS*&Qn5VdrEAP)Tn>Y1#Vzf?2-o%xnNHgV%3^<%@0it1ef7j%G@ks zJtHgSv_nVg%rtr6ly+4dj7keT;5oh@EKVv5c9+?0iLg8vw>u@fr~wdpBc#v zq40SvyRLrhBZS?8{N$r)fP9DRmzJ6{NXzwos+5DjS7zE`VtUu^F;YdTiGyj&2!>FG zk({XkJpI@okFt8nnH-(w+Tt4zCaKip2!P_gzXdo5cT?wxHk=OJYz_sHPM!nn1P3+3Y5ZR z$~Y^3Wx^*&U+8xOE`I~z+D^%4+-q{YgI3n-oQU45B}UUsJ$Vc;!42HjAm&_N;w-}C zYb^_fY+PSd^9d{LLbJWryTaVN*4C!#+BhrsYX@*}8enMC>NjzehzvE&nrI0(yY2Q6 z#N%|%=e1+Oc(zD_r*Jbh5S27V({C-6RytG4$*sD%sE*J$kN=oUE6Kg=mm~8th_BM% zifzVrK0IQZ4=LhUDhfJ?-S32GxAeNr$+@T38^~G}xYV3pzsIl5l>euD0{t=Yy6AC_ zLA~-N@6764cMW~=klfHIVMmxDu zAMz6(32%$_xkC76v{rSnx)FCV+~%>$r;L*xLdcAb;qW{8rM^t;54oy+OdeV{FTQ)s zIA@T@;XB`r>wLR0z4aBA6)Z`1ygSDz{v+QH6HS+@v3jlJE&nNwVX~=UT7Tar&3$5q za)>v`$pMZ5esgzf&<}RdkMHSHlUNPQZI0ed)V0M+yF;LAKoOR1tINPclwKeX|4?1U z#m7~(ifQIIeV5-b?DRvpq3(EyM2Bkj33?5N`L$jiAI6WpVci!ZXoryLikEFSBW*4aLRCK6NVvj1@L7U zUX{Bk?@lPBi_%ieZMgO+z?HxC(aaZ}J7JC3{&H2<l`X&yi7`TBcUHh-6ajAwZ>Giy}uf zw}d^$#{0v-TX&E8-ZJYHqHPzuF<13~E!nc}j&b+4yQ#;le+5yBM8vI2VN^&?24%~5 z%tofvSV~S)JU!>o(+#cpXH;89+-PvKavM?u1E>)f{&v#@rXof0_Q#ItsNqq){ZE@g zeVmHR=h>q&gr9USb9-Mp3_;XinRSzwYH@pzaxR%#oVTRR$?7=;Kyu*bxSk1D69nB0KYZtw7KNX&lYy3)?qq_Q~OxLXhaQ%ynprPrQw^Jo_-5+OhhVaeK{AVo?uDk>&6zv}qoo?%a+LOb`D?(N5h1I4 zGQtAp5|TQ?=p$~|uz)BhYga(k12=p}9J75t?fzACOm7o8CH(M!N;(YXIWD2_%@d zCD0>I`xqvv3Z7giq@&2Lmv%YCcsYY|2aSg|-a6&=9i97>3$I7mR-WkzEt9#$B{I3^ zy(RSyTE?3;=bf}*D%pd~exOVUS+EUd1P_foHjqvTc|@lv%Dz~tJ|OB|+D{(6=3l)% zi2a4gM?NRn-7c-182;YuoOo9p9UZMD>PS}bj+(oPCQ$PG<=%@GjPd2sO38%ujgvFst*9u^-+k!ohT9;p*+W1 z%TYqKSHZS^azkoxAhP~##o57cHJ|XZt49Z)o`F#GT%+6~?sP|;)S*8)ue$gMFnZOY zIo!VZY!sN}=LqBTGFPz-q0Mo@n??Ww4H)fsz_@lZD)w%Q?3sB-x&1 zsL%;6l%Of+&4-Y&lFdj|y0c~Mx<8scn4pne)>`S>&&+3@uh6h~^GQxHv*Y^@17zRf zqC;VXzP#c?fW@W{1|MVxeK`gFYCT(@oN8PVi%^ycL#!nzcr(4gGd01w#uPFzImE&; zBlDrPeRAl;?GesP*{`P8Vp$k(nN*`dAMzk%30Vp31qjK+VB_DB7zHS6?qpf zXf;!l=PK(~=6+*fJlM_N_-ksa`veyp=Jqop#T*m4Eq50`Vuxg#EdmjLc^U*0j0cSjoitlulrmN4fqbMs#XPVZJL!I2S?V`=zsXFhl&ryzZXs zG=`!^!+nDJ?m|BAt%uedd*Wx8RYA+=C4#uAH)&o7wx3El@g-$CNC6>{zsFdqw17L3 z>YF}{nJ05CKx+e^f*QxBZ7IL3I^C7}Wk=wkf0Y1yPCjt27?x{8@y$@9sxWolr!F)P!Xn+jC=S1y_8o#jTLC*YbUT-=&$K?XlDU@E_&aRzI;YiyDMTydBxT*_ z#7}uBo<7@(GfEZ1ce>EWfpe_oIhaV!x@Jq&;QJX+j@oyZmEzTlgf>HSxXH*FsSwPS z9l-5$Cu%W=$*&uT(cRP4Q%^x0OSsQ)PHDLm=>h8-y7q{z@eGlL&C)IO@FlEK%{b9K z1OFmPF>=x*j=5AcO6T2H#3)q7HIxgw11QWgys_`Gp@H*CzoqFD9gpy>AfGoVDT^gdn^);`IwJ4hSt5{!5U2a}Hd? z{xGytRhOsq?D}ZcKKou9;+*k>f_b#U_yHKcy_?;O)K*_9xk?oyO`+XJX(k;yoCb@s z)#t>QA44m?d@oGG#MTt-rM@boI!OGntH{LEe*>Ust!I2=N$H55wtEw5;+o84>0T+9RN8WzaYOsbdYq!F+l1X~KP*5{);^otmE0NJ5=g;qE zphXfvmxN>>b$zC?F*$mhj|_IOilY)YX}D_q%M!psw6*j`@_e;3hhnIWhoBhh+B8$k z)#J@+&pSO{QhP?Uf@fq5J?_{$xGiC711XYiRd-pnkxILR3$Q1R?0Tk$Ivr&5cDjs} zk<;mg8jjgvxustvjRGq1wr^@m0UXH60p_XxZp~}~3D>e!KvcMq2Zl$t>U$=vB1|w{ z{`ZZyb-JthOLcYAy|}$t&JR`98BCuT{KZwoSQCwhVXLR^52`Cfm+atD%HyaTD^2l({{aVS85|SX^=;ckyRm9zU3-MNq%bTcZ0CgrRyFJ@j@m z@gJxYI2Sod74K&L>hgG5oQufq%}ly+TjL~qgtuqaH@WH| z4j_#$C052ibl>D0&hV*8{3iEp3USDiDFz=bm!C>63Z{!07@C&104p{)zNj^4T%WND z$hFEb%7S9RikE8ga!I}Sp*%2Rjj2wH`;4S)L08!R1<9OF`57`+$bZIuQqO-T>i+!Z zlsFM#h49WiWRQ@5xa;(n-{X@EN3Omn= z1cV~;f(c?4bM7EL&OWD98BczsQMLo?1Hp{Mc&oPNCp8mj*YV!s`h6%ibH)I411u~2 zvMo#kVO@xQYL+*pDTjJ=rVu^f@nu_xQ@u&)yhXuC_I&ywG@XY-vl~k#LAptqFYqr8 z4S@E>pCG?3QvGp3)Cb?PLOrenl7vuPsQov{63*YObm6iP2^*F_8PeOb)u^8>W_Dh7 z`U;9Rs&6{tOT~1GM_l7j+|Q0J{@=TY6Ol5`D0L0R~`T&c9m%JT`>=;N-HLVat7{l`{Z zoQet6Gcl(u6K*#iZVG8)6QLd4u}*Saa%e}me3>|1a-vuH=9;vO&KFGc?c}e?lF;ge4R&sCO&%&hL_RX=p*RIMtuNVmR^?S204J&N4yxs8u~=Gn|Fz^~DpZxht2nUFN7vao}CIv45W zeS0phL_`!l9(vj`VN1drCb5_=@yy%ppsnL_{C>EYJhyT58klKmQ;5e4wm*VxVwNDs zMeKbHmN+VrUxA5J+-#pEUtaf9O*lqfS2FlZ+A@9`%L3a!Vx%BTjE3My|KDJY+fOT|G0n=Ae}yY>(!Y^{ z@cM?G>X!U6EOJhg3G)2-uJD5${V%rC(0GRtj~-Md>TJ%fMqtnTjthb_?14m6sFgW2 z5jKR^aD~6?y-~jW{Bv8K7-P#9xq}GTYtu3=SRQae+W%||Au%^SoZ-`@o5;HXfr_G3 zTg@$#m{^>Ay^^9$KCyS*x)*=BJbAag-mTtilb{R5#Xi}vTexUbfpSWn{$8N5O+MHD z4OLTh9{&|v=V0gYs`0QMUm};}0>$%#=Z|N$jlh)%!*W#J0e!fB67*OP82xmFHuK~S zrpl#`wx5o}Lwusu7~w&O_oY~~&M)x%xN6QS-Kx$3Li8Lc5k-hjZ}(ptr^FkY=WD;4 z&d~Ku%t5SA(`^#Uc?5cT;dVX@TVIJ8Yy-d-OH~Mbu{g*Vo6K2+^uw2?@dDhD;>rCyQlQw?Ak z-&?xVGo?KN31Gv$=Kw9Bwz=X?rwInn+0U)d^sg-Uoz9Jp&Xc4;ccatrlS$;zTT|-E z7QVMiIkRej^w9fKYFIjJlq*)F9@($g%$b#Cwf&O+4R-~%yH9ADe1RzYqbqMr#ji!7 za_Xy@duL}1U9PLnbA`GjfF~p*2yKw~P=>{5Qt~CSJnydw{2|H`&N7vLtDK=_FO}pV zS4@p9&4A(i!o*JbIvKsXkrA02eYA2+Yl>eN#gwhF$eah-5jRI8S0RG^u zia>5gGmWS^xW~^ozW>p#$%gYQSQ%eV*BD3;UMc;GZ6+7ebK>-0*E9i%vE~9(K#9UN zM@MaGq-fJadS??>TBcsO%uB~b!@h=KeNK!1a3_(77ehvoSLsaX0UP>0sq#yJmpuRt zVl&?EovUH*K04qF5$VQfN@Y|4E#Nu)Av9}#(W&Z5n%05g&qY2id%x2)`Av8G{}@c z0gllD#}QS-XPGTZ>~=10MfX3Mtg2;lju>zN zwV3REszTmRI=zxrx`sJG$yThbdvh4i=+EH!YLt3A3Zd*jBOBf#}-_f6_2W z*3&Z0?BCDfzn7clx`1=cVCx;4p+ky*8g@Z?rSurZs9q#4vGQj)~Sd zSBR^UerPbhls6!MR&83zXrPd`yz)`b9dn-%kEnW3moH?BQl??q8G2TnTXvb*QG~cd zJ;P_7Y1vB%dz^P>nq9rPa`+~b|6G196{gO^_njYN31g)iPH+@oo~A=1Hm*el?v zHSV50G6cb(MkbowV)shgXD0f-PYzCC~4?NBv^ySsd zpLXV2KJ_`~w*s~bAf3w{xWuvLz^4|BP0Dz9Z6@(MTVv`>^4L!6!M|hHtB-iV6hZ3D_r$jcy7W4|N1kvIQBiX<>>KsIGGyAIi+f zzrd}{wSQCIB96DI8uOdn&~sRV?(hE2>D#zX!HU7FxkgK0$9aAFu z9fjyrS0NJEQQ~+jb;g|GBLU;wm@O(GZ%g%E1vi)>G#~2t)JIfu)DTRwHjs{%l0x+1 zQZfY5_k$zTpdKMLdXU^?D`6QI@s_m^gtY$lwmPIa=zdO-?9P1s|CnaH<&sY z4t8Ba4~BtH)8W{j2(*{#77WUSiqrJ6GO``KcZfWWz|m!&y3p*k5Y=}E0OD=H9jV^5 zb-G(z_e`qZH{BZ*GbQy30l3{;+W(336T)!i1OGk2gwA>UXDuNB_z+h zv)jW0DcjCIAk$1r=0udkeLj!1`)*DX=SX~RilvV`?{{_H4U2nAmvM+hOU2CrIxW7J zqW7AzHoV)0)*vpDeC`gf3a3PAq9)DWyyCKmMN@qpQ~k6$@@Z_YQpvkR6g@jXB}k{2 z?`u%xk9RzAagKC|)bJ{vYb<$PbuvPgFTz8!@~C}s)b2%lFG|?VkibFB{6-SF(1V6b zNC5EopEKs(%2!CW22(Rw17`Z6txngUC{UB-2VUN5Woa_3wKDKV5y&LeZdV3s;inQ- zYyx|}`z&cPNIq%UsZn!iAv&$nkWW0YPnFNDuKHL2mN{+&6p;@$ja?IYbM#i5SnZNg zQ!^-Fg>bD1Yz)CURx>6hQ`tvCNr@6-8^Sb7yNfc-Vk4`F>7J41%-!ahDeQ=gPzr2w zM8Jpa?l$OCQNR6hAIxO;D(!x@{VgbljRz{CJ~HwM}gq&C|IUC6+df(MF`_ z^;!kV{25`fp9WW+ZO#@hJ$tRWmh9OV-SfTbmbGRXC=z3K8NqMAu7Pqrwcma!o4Ma} z{L_zq*Pnu{&%S%*uKSG7pR0657*1aFLYVWIPbFOtYB#XEXRL60AcycECK`&ePCO#5 z?rw$0p$=nTes@ep=}OUYN4=>g;4>(#%x7 zVkSP}x>i!M7^Uzs$x-vCD`j|l%0tlPA$;JOWoorkmo;HUjmFYx<)Yi#irSeb%x~Bh z_2wX1@Rd9Hjk_ceZnd;~Kt@nVUNHdkxXkosgQVyqcWPxuZ&RSWWa+-|r6%TAP_Jt_ zI(*-8>`JH=;qoDt{5;P1}zHTSA|eCi@hr-Uz6<0Mu~Q#?{UFQ#%ee{W2Fr$EM8&EGZmMG3;bJGuNLx;U?xH`o=Thh98mM2Y;bzy1gdc)& zQ300DJw_B!&8{%eKKB)gsjoI=h;nzc%4=PtawJr6`Nk%1t_`eKyLI?|DM^fIMNuMg z5Kx#J`O1FppTN~4w9+Y6xy<0w(Qb9Y!d`7kbhR5P@o?~N-D3~!X-F$p05#@iBtF`a zd)sahJ9@v=gdFgEa*dCWx-YWuky2#(I*4y{*5DtTj8~b_Y*RXzKIOBm>obe4U447m zI&!(YX34(vQ~7Jra=3dhd-kRMX=KZqZ+TaQHP@SwuQKEmQ6w^N9$x}bm$^^mFtHGciQN|xM4;d0LFpC0uL zP$pi|KL??IW4~>2gWsFNl0L;s-cBK!8CBYJ-m~74@j#tfewG#D?2_4bP_p@l&9N@6 z$%d3?sF-LJDf}gU{*`e7odM?eq~?QTXK>{s{bDWdfxTJ|OA0OP3JspIy=!kAZZMH< zKk1ZruKAD%&HV_-t+efu9OL0V<+#ctwo{{fOVeU?WTQ@W^&Fze=WF?O%Cte*lrKVi zRA!`H>)B^tLGX(vlopt+WIq%0Jxq@DU0_)9fqRe9Hn6p4lrs!+K;=?p8|U2T3(ro@ z_ZPznV{g!(R7;T;#efEa|L7_nJ>NDKqNu2ua`DE4+&H+SMh^MhJwklPyJlFLBEFRU zhp|~FG^YcD77tfe+Z`S|*WVsl9jbAt;~{xXaY=j$NZDn`x@?7-721YyRtYz+o6C6; z5gw=Ha#gjTuhIGn@B^hsvV^sko^H}vrg_Gjj9%?9l^_hoOls{4EF=9$$A9AG*+$25 z5GThX^_{vzWmsj3e15u@ZPzi&{H%<Rl#snpJ`HN5KpRr6_#;>5TK zO#oAd(B9Hr7N(&xgD>mSi;(;46>58U)=`_oT$7YhZvCMAcY{jHAd3+mvLm`!I(3t* zbZKOMcR+c_{Z6CgerLh`B3d7u$);Py0ZQxVHz$>u0tJSm*3Ex#63b2@K3^oi^V^-O zs@yJNs&^Li?vqX@s+#Ijek{PQJ^St9Q;uW$p2m|aBB)F61Jdv!Tt(61TJ9N?pUU4X z7NiZGjCZp9yY-`bT^l|}@gEmIGAC#Ml(L43Ik9ykU-LEnXLmGNBfeUTFQze{Hcy4r zOdTIeKD46!=t|4RdUk5(T3%4K5pTN=SAu5W1rD8)8j+pyYs~`pH`y}l<_=Ij4V}=X zhdkzPs?^jHFFYxjJkUJ%)32yX+5+W)L%&%eD^O?8TlxW0FpQGGZ(dSsUjDy6K(lxjeQm8=$i=UU?M zsQvr@>w9SaC(_O=^a9~&4wCygr4hA_!V2%*RNV59+Q+8zHt-pSnVZ0Ai#u;kx6tepLFXO|n9i9RZ9 Rc@8>q`^Metc~_17{|_lr4#WTe literal 0 HcmV?d00001 diff --git a/articles/images/20230929-elf2flt-elf2flt-build-1/menu-2.png b/articles/images/20230929-elf2flt-elf2flt-build-1/menu-2.png new file mode 100644 index 0000000000000000000000000000000000000000..85fc852c97733713099232286deed150328639d8 GIT binary patch literal 34911 zcmd42XH=72*De|#6l{p1fPjFCH0jd2h%{*`BGN&mgcdr65D-x;G?5ZIN|i3Xgd`wJ zFVag$g3?O}1V{);;DqP>zPmC8PB=$%I>q>Y z#@E0q006kqar`>b1^V^^0C=}+cwhU;OM5&$;*-Rr)f`yMdgIh|4bA#9uMX~q_zgks zA@^C#RTTZfNtuRkXKDj`PSz=0gkM6(yM&ZNHqLyo^Fc)a7QJd_=bHYZ9%J|O;-5q3 zzq*2$8;+&ir#-yb%I?l^cG`K@Ip6xD9d3ea(7=mR>Y*&{y>GBPS?X3PR@vY?;_LdB zLE%~-$0|xU`qh^gdP>#Ja@4^XJe&I7N5;effLD*3N!?Hq?x^=r;NOm9_Q(_eUOe!6 zZ*#^cNnZ-_2pdMUXr?--OAA0&vTMQ+nL^S%1iLV6%?)f}OjUl9)8zc&VIinnpFdnr z3T{^HO>|MrAr6?jJqE|Sp_62Jfi_3Y9F#flDt`h}2!m7k6tQ1`G`&4U@jF~QM|8#& zr60{h?MKc40D7{tij!KgQVd^`!qr_S0c0vL5GgQrv3D|=_uj9 zz9Vie#pGYS6Wb@(D4Wt}uo+(F)Rp9krpI|I1VTZ2&lZn zqRP3T5W06&;$(UR>SgkktTZ}ttTV};PW!8U@#OE-08lsjcQ#>uNby?4Up@Fyv=iiU zx6*=O1{p_*4%<24U5o-pF*$YI`2e#2I84eNq7l%B$$hN?gh&du5dd&hruYc$ufi94 zQr7W3qeC=aa{A>!LH-TRjh5>zA@t2(PF$lP19Fg3%VyUZJBhtQj_l=I1%)C192zFF zhWv9hu#6IoAWWkEj&RZJwD@iuk$xm~eyZGI1HG(mb#uCICuQ--_3>R2&X!@tzr?KHnQN4;d{e4)BF+ zLz8m`4^>%4Wo_x_&nLlXvkmNPeVC=D1E@x2=+5Wtn1ee8kh8R(o(ns!d=B7cwSj7_ zri910#?%l8;cIZgw{-L*R41I!SCvSfCHZ@0BEcWL_-n`x><$?*n>KLUUh>{5bj$%X z|L_#9jOmt;><o$WvR^H z^g9}oRf%ySF&p-@Jp2f)1b)jtC#$tOn(>uSU$QG15G3sIn^CCMsqM`rw<-aQ*_V;^* z{O|Z^P1dDBcYoVNor?Pz=)tr&q6QK91G4wCOT{1u?6k~@N*p-)+LvlSymS;98)vk}oa01itx`NXN^RXLoI^}RktJ4QEPDoU-dcvshoqQ@gV-=EbZkBo=K6-d zY#xYX{*0=UL$O>=6{lryNW!L7usht9>e5FC+PC;-zK2B2|8r|~RpOZxL+_ScSeO}G zjrK|95`Ae$BvG6>T;Px^vFx1LVSVejBjhF;Z?nEohDh43TA3c&t4b6&OK?IQ>NQK_ z`OO@x`@wU|S|yf0P&Xs?7eVQ4_L8997U`!#J_N;PGqa8Uo*@*Umpm=AIO=j0Av8*@ z2VsIO5}}Dq`oqjVC-!=ELj$K_s7FEt0SkED3E;GUvx$!)m6qvnXe}f9^qK1;ok=@0 zRlM>k?I?+>Z`Q$-#-YqmSK?&Sr@AE@CV9AuyIVN)yj4HSKpV|Iu%rSfl_y274H zoq{nVlLGk3SpW3Kd4xOoLYaGW6O6G+!7j|quOUM3T6s1rGfs~33ff&TqtfcY)*fUptX_k%!HcU8ZmPnTY^P=H(HtI$7T+wHrYq<-2#9vn84?Q6=D->{vqqWYsSQ#`tku-;E- zUs%k;^|bpPNm6LbH0p$ z6n1pBjGeE`K=#;_54@ctb?&249q;qVx)<9%Lk7(wew0a+E8M_i(gN+Gp!z)<{(LO= zrlr?N>|@vb;i4YV2@B}g{;CvfSI3uA{^`^68Uv>nRboq$&jA2w z${>o>kV9^;;b zJ-Rhf7!fcq0o$@Cgnuc;Iht5YwKl3{y?*85%hm+SX*{74M_;}?-3b0ixf#h~=7;NP zL=0cZfYIb%oyhS|@0r*5Gu7W=nM2}CXl=xBn@e*605S^LV)k9V$oRl0)}|BhXW>Z4 zz~|M1R`3K<bqVM86JAqAi@jwchHX4k1kZJOsYg(Tn{z(7S~7 zNPN0WUeND&WNu9s$Ap6!SlCb!W~GYN=qjqR4O`?+HhauxLSa3QfI(yrkw*6T6^D)gH#S}d%x-*(V?9og=Y>~UGq5y3>Rk5 zfHZ#=18tS_d#zvuOcxT8f)!|g{{gWJN+yD(xf~8<)O&Ym)G2rrmg{ZK3%|~9xd6ai zIT$1aaGhTD8Kku655?@{pn&=6L&b;Td$X=GEdSmj@dEeYU)KyUSg~Ql_$NkdYu0!C z_u>`1pv=D)cRyUZn#Kby+EH8VVettdBsHPHD-|`HnkQ-o?jgQzGWIZF$73V%1e8Qf znz^g2P;u<(M98}cKnxlqU}4>ep|V_#*}5lJ-?GI14_XO)HnrECfPRR76{0F2DF85jWE0#5}l?Iy!sBg zZgEpYIz6oQ7#xRrOQ&;Sxz#QTsD#ZE!A0GlY;glrtgzx$pVm zVbV=rEx-KM!7viT*ID8D5Y=}I`EpC2D0kE;2|-YQdz*)@3VdPBkJxU7BneODTnl?- zzkjI2vg%LSDwebMiFCwz+U9TYjzBSSQWbRnxI(SR!cpsM9~N$i5uCsxg)Wwy8tYeJ zgTC}_`o0b~m|Q4i^4<7Au6uMc-4>=vkgPRa1j$H(6Veyd!=|9&qdT}yTp;-HKtg4J zuZm!PYgEhi>cF?T80fZV37Xo`NLhC*H@+F9BvVOSlr%e*CwMW`*2#Czp^An&HsaaD zZZkNy;QntWrS9b);vJ|RR!WhrG~oj#GAIoY8O*`yZ$f~ZQPZG3)r())-h1}#z%c$b}{@O%_XLsF|2 z5rVR~m9IX!=Hstwa>##YJ@E66Wvlve6motD?R@>V`;}i+IS0Btr%Ehk=Odh}ChT#j zJ1-ABT$}KYD%8UO&?nr{nbD^A1?xI&t>)O;FRW>Ey)GziSeUNr2fMCy+nI<1DX{Z>c#0OrDpXvK?P~y)|=t`Rpz5$axPN!sX!7j=T`NGEoLGb90vJ=Blq2` z@QF4Z5K#6RD{=k>7l;-gvOJm^*yLb5(5v5lM~A1#Yjxkd+I~kywqiQWdBrQMFJAUM ze@jVygM?b;xirlD?pFEGT9rtdc0h&^)iM7U!ps3T=l@7-{hDZQU64q4&Xd%qw`4x0 zrQRhr&{mBx`Z;x3QpHVU#D44IVyQUJtD>JcxeA7D*#4n2*IPc|4~vXU2%{(z`SI2c-Rmb8>-m#?`lIPuGQQ33;A4}}Ejd|n@`Q%dZejKfUCWW*+GV*4+3W2QApC&wQO zoIlDkW?t=wEog4tav0{s+>PpX`#11vR)2>+$0K63{?cAETjHJLGp}8cilx*U9wn8VOE)ml^BY z=1Xg2U*QbcdF33sK1xzW3z9G*0R z%#aK`J0JLL-D_#AGJIuGFk>+(#NJPqS~_o~xohcY&p{L|~IfKR=Qh-o!7} zwo*mKC4n@%vC+xZG9&CAUdZ7rGDyIR8*`uo1aDyi1{jPd_V`B6x6QZv= z&uyF{Yj-UoEx8#z06;-TOxr6>*df{UKDITF=>)U+uB^wuzkErfG^PA|1&AFta6Yeo z==ck9tZo265~<^e){WrFZRT%BUG^@HsMD;3jKUh1(Zpk+=@mo><2$ zwY#yeOWZWj5A#sp4pM4tvg*N=SF`T>^5osfEmOa|#t3RUZZg0#V6zAk{!nxKHzqi= zD%^KRa+A*XV2_h35-^{jMXl-PQ%VbKl{o6E%~yJ|^9@~dphkR3MymUKN@xkqH{Z#b zgb&G@@?6=+t6^uwm&r)qATLWwpH0XKzSLht!u-)ZGc|-+|Dt_WUU>K8 zLRGIMaf*KP2t8;)iKT3?VD}nB<9_b@N0N~QpAy_^DzqKC(okYa!;!^Cn*<72^QqEJ zN~?hoA`&HpqxKxRk8&&tif2cmS(i`6)z~a7SJ?*vq4hMH>qVIl$B+dkeo7`kd~AKl z1s;SCUeBiQp~*f7tN(&4t)Zx}_1MV|j(oWEN3Kb|4(gJ0Xr_=DoAreQ$}rp~vA4Lg zg|Z#g36s0itM=_2yN&*CtrpG@i&e|ngSj#AYLzWcB!a?FcNso)hO{3}$t4_qpnZc| zQ$7sXEU+wOgk2BD(I*!pAWs$|z$>7hA)Ev;-HaaLJ^8{rY^u}d|AtSM+ADh-xoLVm zWs49H7|}Y9uQFY^nVmKG{YK@9b8tzyw{Z{Fo6CsHgy7X=*rKHt_X47YBaE}4URs3UB*NEY94E2z-9$m zzfu_M|87dt!SW~u>WR2c6eQzrD1Gq!)aTIWkk-(Vn>iFQhX)y_{+|})pv|cKvxfK@dJVMlX@W}IgHwf&?oZra< z3p~}s%8fpLau17BC5Fqe>W#iXPk@4eR&M2TwNe}w@)6RutRot4`qgiZbMe-(g9&hj z6Z3w7ul2YbWgHJ*haPdoSL-z!-A$qBUVj}IXVZ0h0SJ?$Ye}$ z(y{A1SX(w^IA87Aj_9d8kyd;za45jxJkJ>)zJ~3WeIdI(;-@FMjkl>;@1BnU2^r@a zxfG{}_H_O(i*2BT0?nmtECV2qi^Heq@I_tPh&5HQj{JQuat zo7vP2e}Dg=^ghf!jI>VVR-3YlfN0O(g77s!C?{L)iY(m_Bv=8rQ)AAFs_(cDif^ls zI)3|?k6OY8Z$~I$D51RfyFI7oZ`ejmMG1lUUoZY;^@6~A_;ApJLuf!hT^xVOuWJC& zHu$|Ok<{>A!&`HjVC@9?d&_&sd5U4f`?Ycy;li>3Xs){3V0GsGYEV0Jet`Ihk{34T zv86chJRNvH=bj@FM(C=X7Vp#|P9LRZmh`u*Na-JS6inIZ z)&GJZ#!fzNU;0mFjHx9cn`^uDpMS zKU_~{-M^I*mCDgIc%GTrlr)fF>uF{^!buvMp1GrC-38wP|A+}|;8J?tWmO;KZuayC zu(4ro$v8bHkjNBm$XlILFFi3p7#C70>o~bs6xWAXJm}BrH>GAp23)yr<6ISCI=NPv zO=%vt;%odv@xebfDjmq4YOW&90iW8mt1wKxmYbB!cid(-@hyjyLQoL`hx2s0FFixQ zJqtpDZ*$594DZ#Qc1qkdXg{DP2Jpt6ZJacFu>mTN9D3fj82htPsV-08KJlu9RKws_ z?>#;1nwF;Qk9YNWV20>(lZ_KsR>xomJA&(`5^@RZ>+>Uos^&jzCYPt!l=cAV4=M<*B0{bUjwOC>6d_b=j z$6un$rRbJ%DdF_uEU4COX)FGJ z4r~l=1h$B93O#vi*=Y>Au2$p;cSZCqz2y7*ZZzZ?2Zn%Mtdpo0Zx-jut~0LfEnL~Q zr$KIpt8XY|&;^#nCf6SkWzOiXrH>E@9+LZmu@9&NXDDl7JcRJA4OBby%4P_N-oIZ# z{2HEfBH*))95`mP3V3dP^!xJp+xUUe=3T|trZ0(KSu6<)ow90D>W*AbJs;!m^N;i>Mu794x(d5Z_n-Cxdr5JQoAUnr!zMPE7`%=z>_uF3R6;4HGWE zXk5M4Zr0XCCMZBhwAZa>jRV0;alLvGvmY03)RsfL>Z)rBwQkxarQXQv5bJt0Oy9Jr zL^$)j(}jQLQpa{}YgE^G48HlXm!*r4${?Q+dpsnc+7jmE*aZm>2)(lw#(uo!T0tJD zkgAg)^*a$|Vc&Aii;Ly{5VjWNol&eYD$;S(LGCAipvlkK(MA<+BHq*7X-XHY_FCTe z2OS_`XRooPFGq=?d4&icsER`&HIo}z>j@nVDn5IVy5bea!hdx<9El$&cUFxfhfS7u zJz*+wz{Zm~--`wwf-m$xal8u>T)~Gq*AIWdm|lddItQ=$++t5rt;!hbRjN2DRnb;W zWD1y4deKaNTYrsu$7r-x+-&M+$l-b{oy@YaC6kYC^1 z$d8Fln{t0tVaAJWzee&j6n#YJqoWEhUG z{{YKSZywOuV-~owLmnVQivn>X41M+^PJ)ZwF(yfZ7ynR?HCb=uPW(Z7?Ph!#OF=GB z^nN&Re1JUQ7$$ornQOi*u(3wxH+`>et{lA*SqnE6; zvZGGK-#j)vh6`0Ive`k%GN8A7W`ok}BU_~-a64E=E%F4scAn$e`k!x)M$ARDm%2uu zas&V*GQs*R)RBtvzS51pNdEIGsJnG1g1!wG6}AhkMGBZ@|Ik+KSL~3An5h@#Ir)eu z`z*|=QaUc|uDA4R+cSE!eL2Dcq#i;j$8A{j?UQ3EU_P&9Nb09vyoBqmc38M_n5ef8%lu ziP>_-KVCE_rH7{au%pG1gEzZ6jI-I|x3bmQmJh7*qS*AJ{s}*%&-HaQ?O5)n4F({~ zQ1d`sw(j7$!Kmpo=cg`5KCQYlZAcK}Zq0VQx@n*5UUN(g_c@ktz7EX8R6`bENY>I|^hV%3x%NCyVf&?Vcm{YRHHPVu4Zd^~;eVZq zUkr2LbmeP6+rAKBm11mXM5*l6m7YhgnjhA8x&0uFg^IZ}F}=5$V2ni&POVR+T<~3;#kn0qgffUXr_SRd&qQ2>G#?I5A|e`cA$nt5HgK ziqIbGICpBkPg3)kj>J(J13pDt{;d-o4qvjfuxo_u# zyXkXfmpjH__w&QwT~WvJby1dEGt%2$>5ZFapPuUFMrAubJ9u_J?%A|KQhMOS*zb=m zjDJ-%iYpQe>>^rBlA>?qZ}M>0GNm^`9?IVeV2vD^i{THArEIj)T}1 zpFXm#U;^CHn6;$V#Dd>dPkAb(n-BszytDSWPU$I}lVFP$;NRj$=h%HOysZm2|=t*JtH^rmud6V)2(-FRMA zZmwPT0awLRi7<;QXqR`Q`u-IS{+dCS(O9A#On6;wnyRtVPi#KCwNG5`)5!rF25FAJ z@2X4jM`n7w*?GM)*Mb&!xyC_OZR`@r8j$kbxtCjLrLw_RBda9;8Hk*7CjXonnt7br zMFX^*-n}mZ5+q5u9|Yb%%8To4rdQm)gs7=EPajrQ#s@GDK9bSdKfJ~i4>XFpF=KPH zfDj|&9nK&_Jric#j* z*8tz`t_1n!$GE-JT1m@}!Ige)Do3GeXE8xD$D_=}Zqrp<8KZPn95Y{x1jAL<_x~L) zq$&S%OnU(U$yfiIo$?Z9VnVC7{p@_n95C_-0*QM1LPL5~hvf?Qo>i$!XSlK&xX;U$ zD%zu*u$su{Mc!G>F+4xFG0;nXWAZM&^Uy|a9;cB+W4${5EP`sZ&-*1oD!bY))V0$B z7N~&;P2NHTeb2US{6XN#CT=D@B0G$Ptb*mpk&uv*Rjns_pp z0)1#mz0p^`@y<#v=@=GVDVNmUywo`VR6eMO6YSZ3OD~Pk&YC!Yv{nM1mMvxeqVdiU zGU$KpYXw|a(iBC~?0~1uF7;ML{No*d7w#GG2sV#POiW@{ikoe_`Zq17u&%$Q_8{l# ztp3-Ej?^caYIJaZvI0&ceS{RH*=TFMzL_m6Le;J!2D8M6kd7#gH9-<()PrY;qA?h! zOR@jUB`S0VS5Y^=G|BM0!Z6k|ya!Q!j^WBbx;-D?SI>e;_bN;&bopozBL~?S;YOf< z>M*!?lqX$ju&i^lH?T2CjQx*&s&z$X7LE~1+(+IWQZk@5`ok)oi|7%ozIt zh!bO)o|T6b@n$VtnPwyXEXETZ*A64s`Pi-WHy-?KYZ>h|)*`3Wo0Y2zqR-{`4$mvu z79OPq=js=&cK@JhGjn*cop0EnCq#zv_!3v}kq+fSIcl47;wqVbU{yBvm z4eV-HnEt-W9+X^=5;P(E^vPe%-cR5QiXUU?zRf;J$WuYNB`2*k^?J4Omn|&&BpolT z3~)Oq%EbMMW3CV4r8QL|AoIXRsw`X&#;cz2B)GXh+q$3lHcJbT{&}Yu93zaGU?pqU z~JLE1HRYQ=_PHiP&P*TYes61RnF&CR(RANy)AZl<7o$M2CK$}a_FJL z*83ocJ$(AkpWk!p^vJWLc`Ukt*zN69df1DMuEG`xLiQl~Z3gg7LlT5_EZAfQwywkX zs)QmZVhAs~uDTb~4y!X9wXPi=axNivoU*D2!ozkVr#Z@)hX358YG(wg%#5jLwxEJ< zWp+VER??DKlXU4f-rIk0|6tWfWhbRrJreOw+B9;qVn)a0_^u>$jSLrM7k7aIM3fV^ z`9`gU{~W|CB*r1^pFn4+4PkH;Y;s?BVq}11X&Fupy4Nr5GYPsvxKTK-zbQOJRfuJ7a!8R69=z+Qux@95a-lq zO)ewAMas%YS?jsBohuP2Hpl8mfcD3?|FqC zN)5ia!PY-o=AP}|F>CjTmx~&;gxpB_T=)FYMnUTn5O-;&V)gsDg4XLEt%p&q6r1Tg z>+B^CimXq}H{%e8J)TzNj-HfCdWciKFoy0u4YPooF|)!2jGagg=H3yAX=Np>0wh%=g~NnNSg4?w7xKI`ojJK+LPUAr-|&n@9e^K@%e5tn$Vk!U!-UnsTR43Nxn_%)LkPR zF%!bcv|wYK3C$70BgE?p)~AM|WT)O4DkiD8{2a7Vj|Ztb-RXOMXKMF-PE@Qc;BxC!?I^B>LFrS}8#AYQR+U7AB&~3lfy=)~m-?v4l2QcSJ4)Po z;I)5WDf|Pa4{Z7Zj&!4$*jq~nS?KGxH#_ZzKPiq!F?^s}*QaaON3vtuSrSy|H%gP* z!+HWWv|0}4odv-@SmivYgN`&87laE>q1A9lyoy-ger7C9Y{0q9rt#9$3e0Ym9Ci3U z$b@G$!CFY+Zl<%=ixNF4Clj5Qc^gHAp{)|7^%msb-(^ucwyWbSE%$lPjA9$Df;0sQ zxpXI_TP!C@lPb6DMuemG~8G ze1K1DP)C(CY`c)m>X5mLlo}}#h6lL6cE$eYKy^a&XK{l>sQ@kaD7%9b#K77Xf!C@a zvi8Lrrz?rBcosQSHv#`-sQqJaH#|p4p(DU*rxCvu9P2lU5qmbhru4e2^6_edvw}C% zUck4U?`h!Wn=+rUfXw7b0lVy*QC{wWGBjI#1^&GSyZpf}NT1?b)=WS*O?j+EZN&8S zoM(q;3G!Nj*yMDYRzwRj*cyT~R3rm}65RG{}GkX!+RT<(LE0+%t;s{3D1iB~Mt*>s7pb+tRXGbCbIt`Og` z!ToVI0<}+u%z(P;Ts8&0y>v%3+;dQUwWQ&PdgmXy;on8kU0W}yJ64jSO3Y!qjro&( z&uI*jP>V(Uwg!PK@cPk`HN)hMJG;dOgnWF6#n?xl|A)92kol9#Nj z-&;)S_RxN$30x)1Io_t%$V0TA%wQ_G(#Duy)~8dkE#?kmP6ggm+5t}+ynZ&rQ^Pqb z8k!~W!M}sV3be93?GVJoowkAAT*ZZqnMI#p!SzX7Igg^~pL|y6bHkNh>A79|2rF%_ zA3+i6Dj!_3bqEjMh{0p#n>;G1j&q#YJWt2|YF03hJi$lP&41JI_}!(BYb>R~<7YSJ&ZSO@(O#1) zv zB+4GOEY@AVy))l1`yuSc%7?TKR=!6j1G!eY!I(7+ug6Gj3DbOYdr)tSKztpeQm~yq zmrw3k<@i-V1NZftPavUnK8KZ)g<-1(9*K)#Ve4KF z9!dq+io5Lg^|FdZ&!G9|+rzI4_z3;$-aB@>1ET)B zsOsmX|H=dWWTbhH+r#I}nhdrcdz!i6H}H)caBW`ZqdHr|ivO}Uwl%?1AUnk6wiz_c z*m|TynsIyE%WP^}+dc2e3sb&Rr7dQIm!J%mw z(>F(ae#ZSAjCUU`AB9Qr=34A#8Llf=z`QekuF8k=7xY{F?QQpY<~7x;S-5^Pd}}5- z(#xl}CNL^`vp2P_#ZyOPQqG;$V8?G9MY%rZ8p!vjRtqoxeY380eHmFp+D_Rs_}n{M zys@~d()oNncHt}Ht2QjkfPWrgHIjO+Kzi9+If60yyM_Y{_KcUhx2Sq#Je8fm8jkA`LGZrY^A0ws2J~02- zE|tu@6RiEz(++K*KE-8a=O>_6Zy~+x3odv zpV+J;f+pe{3bDYSJR|i+k|l~FunMhL|bU#)4 zR^2n<8~UnU-YD-oE45!5FQ>^jZT^!oCOfVA7?lMbA1|}^lP+?+=aOxe)0|SQj_69W zszPY|FfrPTCE}Ypk7W8RZquvfMzY$gkBbYlSmYEt@8(aQYEr^a%(i~X^o2Jtj;8pA z>b!hRTfL@)M~1gHGL99DCis?RFei>r0-{fdyuRX+a7$v2;07*P?GkdKee}-YEIRAX>>Cf{W zsezM3*7B<(dK=b_E<6Tw8|jZ8mJPRUwQ^|6c8+X22wcr7IQkpU$l|6xX7l_Q~BhH=)$?$?2j9|mCtB5;n`5Bi4MQ2Mn z^HJb_DsOrZd2_p30{*2tkwhR3JAT}V+xxi6sOT4$lUw!X`=dd`-q}g64-o+OhQ450 zOfUI)ylN8z4IP0}QhbJzpE<`f-GuqvW&3e5ef6I7#liCbD9Bh)qt@1#_-2q#f|l|x zYTk){N$;QQm$~&2^T*F3%8TeOZ0wBQgr|LytmzfI}?zlNE_9JZNP zHBB~a9M>k@-YjO+KfH*Dz#;ynedfZHH8q2)KHAvY##ZR#xSVEao8!Pq{^p@Wh-+kI zyYaupOt0GHnV4o7*>*-duD|{N@WjFYIg|y-M$fZ7oh|#zoZEBSQIWo-rR85`3fXnD zUt~z^ND${=1#oQb^yB{r&{odt#RxNQ8fW4Vs`wc}@^r+i?ElLY+PHy7N$`bLHjJ>= zI<_n!qC2c87rjbdfMJ&3@AnY$z4ToAw!Dek7G!<~&Bfz<96L4u({&BjfNMXsXb&PJ|zF`>k}3h5%{}dnz*0MhJ}1 zZAce3vn~P_v;w1oDQfqT2YIu5iQ=0b-zE5z2yVC|Mao+n)ByDAo)WPOMO6VGA@3gw zuhwd}<7SETiQaE-u5#NRp2HLul593j&f+u=7TK^u^-82srEdoOyP!_1uA;c(T)s=& zRVKiLbq9JMAyMsU(gwfV%BVT^T+E#zyIsC=HBPZ5Clx*`KXtKcdZ>6@bf?(GzHapO zKhkzd4rg{kc6oqD1>K-9S^$C;u6^{KtVCxf;h;%C^@zQyei|rA4SB>#wVLp659du& zx_ITcnlgY2dLh`)4g9m8L+bHd(tZ^OOzn>|H=f@U}tOMerl+gV5L=MJ=;s=ZmK zR}3F4e~XqhL%gQ%vY>_}$%>SHYQ0Tp*mOZqymd|sts?Xnb(H?)mEtv!;!)VVIPMef zwB{vBg;rndJ%N^A1&inOrF+L=_kF@fQeI|vsFk}dpTvAfU@_g3wn!Y=s?;n#s**NmCj^d9o>AeVuym5Aiu^%KkFcdQdlA^ z7be5Ejfh<{4_o$x(W2veK7`U5JE@h@3RdN8uE3ID%V#D!t6cr69c7g*IaA}a-Q#OF zcOQ61ASi`}0as>TCD?mwK~GTv!PcO#dRw|3eFMF~2RcZleMEDGq%*tDX!6vnM~Tln z5bU-aNVzbsek~>J0R{oM@1sS5D*pD}>$6u%%L(kOh zp0!v0()6H&AELfC><6LaW>2O_aK;cN|6=IgLsKx9rh|Bf94 zTzW%xiQBvmkm)e?lZqb?rj?p%#Ju(o?!>FRn??C;G z_)HMEm#PYhZ47DByju$?M^NJS`!X;3)CIc2!SMU4#PjHl%YW z7-S~zuWD8-Yr+|VP?l`Nt2tx>J^^lS;CHdNZy|luI}36U5te4(6Ehtpx0ToZ}abR zVY%}q41PYAgYo|XA{(as=k;Jw>(K&yV#p8&IM7$K7;$Fy*-69K;-&49XWWGKRo{)n zQM3wr*?Pz-$4WbO|J)WnKW{Nzxe03)?$GMljGiQpqjs5%Uu)xchoN-UZShdvU!v6M zjeM=|jUlsF;H-1=0@sGFCq{Lqupo5vC)XW2-!MI$(H1e$)L#o?0K{X4t(VcV?GWEE zJvyfph6&;unoAv}CUuCH1^Y9R_xRDNGG?n5E52K`?O@$Ef}}3Jde`d(Fvb7 zbNCFJvXMAQuwpFWe8~TX8t0WCjZICWU0q$9e6OtbI&vUj0eZS+vt=>nsJn5tjQa~& zMmpjhUiPBB-%kfoSB(ghD$e}5P{ zbO&*2DgMHf;`YdDb<>)k;Y8{J-{iWijB}LNKY&+q?TkE4>) zDz5$G2zjK)989buceIW%s?c9aF#MJNYu>v+wYtYv@rVQ@f3SUNl=tWsCK!}eFytCp zROZ-W+4ubW4Za7NjStcFa&8|Ou#jH+Zw?}+ z<_YKl6!<9k_Pd(;J2S0@Gk4;a=P?j4n z<;AtCKVQ5PZG^LO;l$(=sU!#W=}2TJ@^e|C`_{|X8AG>yW4L)~Dl@-ABP`(Gl?sBc z+Pbi!A-c;Pg>i!iMEixas++Nan%&pn_|dFZ;rs4MGE%W(zG1pD(MGgA%~7KH(UFB}L;1FaUY?{72G ztVR%bJn}JTJ1t?c4 zqLBYv4)rxD;T(vSRwoAUiO{Q^e9uQOZ89hAAFMHx;d1zkBLB7Z9PuJV=`LG`h7qShk?FhKrEIIbVDx-RH z1D{>=Z!nT&j~6hUlGGge!awDcvDmS(J@D1wm>3!FT_3Im{PB-5(tn)ab-d@q{!b?w732LV^mCDAFW}3Q-JFooyO=n2%=LW+>7%o$!4UIZ z$L|B>|0DHV$QZMY)j;d%j~a`2iwh5GuIWP*aUWqf~CtHbDEwEs)gaWy6i&)P#34Uf&$?89la2q=d%1brEdYk(-} zv7nQz2(R$Jyvb)7C;k`%w;5b$h++m7)?9-)jK!FRS#Lu3d)};$jx?_wy7$VP@#^OB z&#bIyK)(nmSI1?oT;WWkQzM!0kGQpQ-wsnZZZiO?0Q)+vEv;c5bn?>6*h;fWP=Xe& z^;#D`v`j4pz_7r&$Ed;1=M)j-AkaLSd@z!?@#KPw=dS^Yx&PYyJ?%sA>+HJ0I#$e7AoiEp}9k-V<`vS7PKi< z%)LLM6B#$N4@OETnv62S(S00VNi}xnseeaN!}LYqCOjlx`Tc@y_$j%H{wH48xfC-t zoa*IOi!pqI&0sQJ+m}PJ#cL$IyVlkVw^VXjrIIMjqsUf0RFC99>vv3GzK(L2i~?7$ zEx!Eit$Wm8*$15yhpmLi__!t4Ju3=Z8~Kb`IZ>MG`FOp>d6*XWAM%Qf1gn&nH!=ts zj2Z)Q&M~|J!Qtr1!?o&b4Lqc^CK7))#K-=pAv)`m!$(_hrDF1MneU9jGu4^8oeMS= zz|E7aHyB2%noA;Ns>br*M>Kq}Od1Yu8QjdUE4E)8B}0lZ|4)1G8P?RcwvA!~8(>3_ zfG9anAc|U)OoZKPN(F<{a}WcX_6n11Dvc%hv6!SlH`q36;eg_iwv6s0tJY-^v>! z#D*X`kbx|nR2mB@r!nNGHkgm@&5nbrF50PN>#0!V0>iMT1`@4QS#nZSEYVQ@T&PmA7GhJub@`8I$dXKmBxR z%vj!!yt2=(+*r7l;2*=+A3Z8iFFW0FY|KZ*l5)^A6VCV4hX7=P^smes$;fZd4=JV- zCHvK&1vMVcci@+AqxniZj;`sqn%J_J`hWR2B!@`YyM^0%Ut&UhYP^`LLTHB(qo8s? zC#%apB&k+30m~vv=k*zpVT!T*%!YW~CtNIrHFwZsY8rEynsB&5$MB#9Is5cZPmj!> zKp8PM5rz{J5!%?`q@yc+34*7+<79!E2lgdtNYHraG&PL_&FEl}s<9rPeDaOyA&Ib0 zrXGiCAG7PBR6ZE0*678KeO52>!p7S0hS~J(ww)d_S%T>x+|w8PKdk>R;|N+Y>Y3w z!ps`lyFy;>ME~*lY=Udg0lENg5KdcdAbN#)g{doU(xSB~-zZT`Y(r!jxsm4UVP?7F z1rbkW34WxHDz{QoO-^GQ%s@evySBE!mL=SyHBw5`XbkC4a ze=!y#1A8+~ng7&p%>4VhRrN3J_W=l&S7B>XJ*Ky?KT_o$;wp(fxb7yJ@UYI(QCMsV zIenzC8Loz`m_E>+`Z&(`{Nc+;k3Q0?^V+~AHhXlwhuWASJW9Q&UUMpxf5U9f}3P-44njC+E{D5}3GbA;@P_3PO#a?rfMTy$l@Y3sU4FLMUf6-1cvsZN#suS##_(!`Y z!$m@Z$|Bnf(a%q-GDV~xW3}{LZ#{*$=|<4fb`{hihvowk~C4HW1szIPni zd=0gKwGn4bDJ>shI^Ck8lxr{QsAjFdw9n1svBZ2&p_Zpl#9`l4U$w2hF$d^6>Kmm> z|MC+Q$~&j;#GgMv*H!-#-lapq%$8cS>+`Y79d$Y$#H4)`{Dl{0$61Nf5PmJLW7R_r zCqW(DAq1+suKL)5K*yaiNiV~et8Cn}(ewwA=bu^$Z;jL?Dq~YqUL_Go!Wuh|TSmC7 zoD4S%-_m;ktH-}tjN|2r>%J#{V^MUqVC&M>y~lqC-JFjw*p>FH>^4@HH(7VYte%`! z5-?7uUrZ1GiOWmA5-S9)g7$x#?nGZbalQi5&sM?(kkA|88?p1X$?Dn93nqvTAe6Afn;Zfo9{h~OEOuyNYvztM4|4B2<1v(U+ z^&}Yg;%&zMmewHWmpdU}hAe50gIu{K+BtI4E?|!AUbxR1(<<3Tv{k&3zZk>r>?YX# z+*;BhH3-|{;IR=Zh=3X-Wi0g#w_z}1VHH7Y-Y+CxV+q4a+?=Q_NLRO-MjHOLhz?JI zNl7_tSA<_&Fs$m4VfB?Q{^HFW<%u~R9cBt;5x1HgyNwFf3u?G(rQGzSq^%9B8{reR zwP&B%Bx+00Ala^qwDTz-*Zz36x@Wh-&`lp!=;$fD4hb>0!^k?sUIxM?_r`^XEifK&#OHp5Gk|FU68yZ zGduYX2=)AZ^%M4Aal=xOK4?T*J<|8V6F9%Yi@d#Kd6Ekx7`iUM{oSU{<}Chu%jHKV zpF@zq^Z>HLb$_sTug@We1MUmEx9LIjQS=Dt328|3j*4!hTlTery=NQmQd$F{t&&fw zhKtOZ%Fjs+jUykB50-X+sa*AYEpeC!ZcIwGL_|qbv0H9^)B~5S2Z+M+!Utx_rttxH zkuEP`W^vEZ6tg$<0U&a1(yG6z^>jq7{q7#IF}bT@(4~LAYcPN4^+Upi{)Z*!fxInE89;N7w&NO^!d^@uq15*$4>YW)T=fu#pT^Q6{?H8x|fJ^Ta_|Y zP50r4#thzQ>>VS>7ta2GFo_f}2Ee-;^>Wo+pd@~E(XUzJ#1iox%B=y%g_B^E^1u&= zdlb!9Cy8>ZJG?o6Kt?Q$^FmLSB#cMGp$Y&q4@H0%M3qnx_;Pm4bJjFp!?x&HeR7V$ zs2g3we63H=zO#Z$+!$GzcMK0d`mDw%ye@(a@rg6K$$`?}W$tfE)lgSyAvK-b$UNSF z%?}%vreRAf&?v&{~!gZYqe8Ysy{}i>~-wfg|zR3UrQ-BMtI2o6* zWc?9VPUXdv@1hc4S91E8|ttwmAo!6Cbe|+PL$VeDnv+SPa%b zS%FqQjyK)fM}nBo+r!lQtcIH!8Qj{JuW!8V{l=H=u$PJI?Z#A|_A0`fZ#=%IavGZ! zjAd0m&f%p$%a^L|vkqdqg+AyZ-WvnY7K73aTtSu2i-16>mjbc)5o%8yI7g$08#kF! ziTrq6FhjN~qOxk5hD<=^I4(ura6m|A6|=@PE-x4Q&P-*N=U4*~OX`)tYjeJ4MG@ed zn9_>MC)P`k^fy?ob8&w)C~`WKnwtt+J=m4EPStxas6OE-$SlFItFhna?cZNIHIVpl zHA)*?veg&hk`)`(6-}CHslb(MrnzoA-XC#y**_LrGpx1uz+-I<@AG(xBRl;k2{&gC8Rg#{rz|Qm zxaJEkVjN^A;+k(7OSz7Y_}%S>8<`$OWUHbtsGiLqky)K-{4s|b+0{TdU8Wue9VRWu z@btDc?0$9+fvGKt&C838uI_{n#JgucE@v74*h6sBQGh1XcVrb|>Js_a9}VMYjr^-n zD&huBw^t27OhuH|#Eo)R4~zB1y-y$>?>*7iVj^8@-GskrA|mWRRd56z)=E4tQ&o6$ z*O;{rt+$G^udL-Nza8&LI8>qhvw8TOu$}pz-@|XgYvZ@MDb8Frs&iT%>N=Kvm1vVQ zP?}$z88(}hp(U$>{!n$A`6yp+^;y$7&~7A0^Z9bIVEqNIFlP{X05`|@SNXq6&B$;h z?93OoF>qTQmq`0rO_jr4H~o#7hz^uL4jY=6V=;BK9z^OUQ5zuw_k^xnm);8^#Ozv?A&?&LgR|$xW%;a?bvsy{Uqyehu@ei54TbFCwzF; zj8YTR+->>r_~@r9av^=PLxt?a+=8>?ZI%amK@2lpOih{UcCp% z&?CP>ByKX8-=S*0>LU&ZZ9zC*D#p%bY?$ecw8ueZTF5RH3-+M7+TDIAFxY|Na28*h z=q)5is@NlsZHlc$hLz{L%pg7$&tey_QqPM_D?L;YXP10FVcU{CCQDGVBhK1ZzdBp*1)oklM^qq3r4+my#Bey;rc6sR?`E8 z<&fj2SVeOB)v#rZ6O^_4zTSh<<8e$vtl8p%{$mB>O!RYcjKd2UGlBm1*ihH|%sI7Q z5piWq`mD2!@%6VBT>DncVsNsemNFg!CDOOap-6A3w(2w5y(=B<%3}(;cPQp@&&jmS zsPK0bD2-I%=dJs}-~(L;1Lu9;oKrBl`_cR zNcE;{QchBt0SY7bD}p9S)x+J!%2Y|Edwo^_95niZn&ziEtd6cEFeHL}*X4UZW0gmZo{Jx=Tu9@J(UEhlNX6xGjr)Ya_kwg$&AV+T zMPX+hS~)0?dVn^K%uBzE$Qm?FUSwGjw`KP-g@!)RX=$TJa5okjKAd$e7ah7|6mL&= zCA)Z7Hr#bAZ2M-fmF9s5aP)c~eKZ{%o>p2t5;kX(bKz1XN=?+9Vyh})HH!>2Qx7da zq-}a9)TBA0pkMe*p>4qxAfZZ4BD+-Kt};eX-u3)c9y|W%^Do0I3457|+bh(ZMN3ee zB^m6+gA+2S@bJuOGbWz$Js&Tp)e?$1;oWM3f&=U+R!vmL-1M&afDF&3U{u%r#lkr2 zwQfT7I76LWCNOIvA2DEb8Dx~98s$`lL_Q%Z?iC#4%oXK}2k!dK=HaSgG3&{dNwj&S>)FDZ#6B?h zGBqO`Z&80`aO^W&n(vroZep$0O3iV)0K;3f@3W@AU%p;ZX0ZjQ(+Vs;?{H%UZwA@akG_%AU0ZydBOfmKb8~)&0wO%zzy$f6 zT{ynunqZIdMVHhgU+BLVm!D{k@xsx6G`mWYcx(`A7q1yKo>ik}w4x>mZbADg)4BG~ zSAt2g9oyFGe<4B!8qahxft#@5NjCDePox#$i}UWzQM!g&@Kjp}>6dSXy?Wbsvz41M z5NMS3yb0|ep-5u2;3P}GryZ$AKj>c|5Nbl+dEJN~eg|HXWVb_Hi2Z)QTHSUfCQ)jL z7;7gjy7bv!r^S!0=2sfQ1J_j+x5;FCa($HS3b8BjD*eZ++4m!g-;MT0GkJp`CP)jg zf*1{%!-n;;&bX6=^+j{?;zv_e*9)bsgG)~A)<2MU?|lAFe$BzjRxoT)jOJr2?oD`T zGlu3#sW35bXW_V9&2{t`q~~J4#W74szjjEy2;-IUinQ(6RQkv7*w)!(Wfl`6j*QUJ zwFiPi2>>|ye*!p6$pFB?95Ug#ICRfx;}n(TQenUpTvgTpWdCmELtF`3WfkJ|^Wtb> z=7VR(WT&g@WnhVn{f8mmif777_!#v>dIMew$EyuHnH#;v`76{_OYmY)rW+37+h8OJ z86~pDfU#N%ye}baMeI}jdUY1{3XtM1uW2Vyg8NLVISlG@;qF08%ssA3(*{jT<@|Cu zhg_GCWm+GJ;x1O{REH1@$S|17FkN#S@HXrwy()4WiE_+5hGaVa2sw3bCDzbhV(((P z!BfR2hx;ExK2EWC84PV5mLqn)kLk)sW)c-AD7w}ISwc`O#&=UNMmt9hJGjiqtBIzW z=17=)*R$#&eZ_1tRzA0s3atpYVJ8z)RiEvr6NCOOw@l8PF0Flggh0|IFw2~xYG?gK z{TO?CeJq90@G`eUefKp~?DaI`qhGj9j)c_yuHci4eTnA}xM-sbO_P5-;y9V%H?faS zj48;$#@GBMbhXAH#}q!JKoymzr%UlavSF7_sOYpsA3P++0ekyp<)APTkQP}+ALMHY1|4KuXpf;kde-at*Llo)+IqZd@KN^FG zVP8)+{c0CBM^@hUd`r!8Fju`u#ygC^l^Y=;;8&|cKl(rupUT*#!1gw0u813}GAz3G z5b~NeZqNKHMp!`bmX!9)5>~yH=X``zferbwja3mWoOjMwn0bEZWmLXDb6yvC^1Sy?j zA@x_t0a5B{<2fUS61n>VV6RppEYtI5bM6_@6%@xWQ!HHgcMo7+J z;{e_s79P0G>l?>ij%vMD=RGSMUJ_osJ7?1#S^op&KLL2^Qd-snnWU)xvuPQG@(xKk zpFr63`(<}}ZcuLw5&(P!q!kO1L+KbV-3T{R$HMh^jGcswq^5-bIv%wvQ)5@`c4HJHkb5rikkj~w9Gl}V@^Z;u;Q?i_jUQUqJnwi-lf z^l3alQKTCw!J(52?AHFwp$5o zWjheYUq@1qCT6t`l4)vIRaMG5ZP36&IT@Wh@y3Rd1u?UJKU%D4dBx&cGUEbr2mOli z4=aZwiI*liq+TL#j^%!1&y>0J0-qe8HMTey_{`2!zr+8JeBYVq@(KQCV{^^(O*>UZ zv}|S0scGz3B;DdyDp0VVvd*U}uk9@0ANfJ&d+kdzUYg8y_A+g-DNVh|77|Ru=!%6{+yKuR~_aNp_aI<<<{_&Y>GU znd-b=F_uQyv?=-K4sjc-vOX(;nB{i2nvXe`pX8J(Dg$JK`0#S(&CBpR6ArLUvom!n zKG$I%Sld1fID^MdJPgDN7b|$K$fWHV$i8|UaE|B z+sKEmisJ6yQ~4f;s2eD3u6`Hnv-%p3QH{MTxvC#l`aZAjy4TX=1(a4+Rp~`p>}~;D z)3s*S=!&!j2X5%*Qm2d6#oGs%%YPXxC-Oo$m}iuatXOKcypQ?b0G(&vwJo%E1G$t3Wl4jCDSqq z$eH6xpXL?%)ET&s_b=qx3M46V-V;lzM|y2NRVBur=n8QZMgJM1(*KV7BMUR{>KsL4 zcmPs4Y&vnJAea{e zCulU-_-T>0-!=v#(g4XJ>*$mg_`@y{3m7LQ7!S{1Eg2#zE`qkiBI*AtXmp|TU!c+S z4lN7Fpufc}@r?A9`}g7I=fZ6BHh#7f z^emak_0(EaCDCjjUCXaD29zeUbnVNIoxZ11-Y$#kVW9HR8XG)(o+|DWLSeudCs?wfzynQ_BwsO`d!@Fpt z7B{(Hs5`$pS%2=K{ix*&2}fy}iu{zB{pF5h{_&D+fW8m9e50R4K8Ldvx){t{3u~4e zV_gFB3<~w>`BCx+-WwY9hED7V4O{^_cDXN6+7*{4O9 z851OA+~5x%Ae5va@SDo>nZiVEFcQQ{h#&Q=+F{79AKE_mK^SsiQ%4}asD@;um#JsI z*d2j?9%`L!aHW$v-&PwJRwxZdGEtiDxp7|;t*LQ-0=R~=7_%ffFQBDKy1(IIWXSqG zZ#A1Vl*Mw)Z&0Kxb8Os$+-F+o;oVq%&q2^UfFH`mXv%PG=!mKRgE5(=v}3*A>{ymM zH*dZeFY{uVlgV?&j-l)J)+j#RdID}AoeC{fsIASo0jZCV6d_iYC@=O*_6y<{)lixD z68Lb3d*q+fMCQG8gKrt(Ga&UVveq(EiP>8R)TZa3bcZmD z8>Xej+B=Wm1F49iom9t!y>)hTJ(rK$W1jL9N5Pq;!hFWKc^1;ohlIx%jp$epf1{|d z5}0c4>RUOt-I==v8E;9cR=a+NNxS5edLBuAmj`68IB;3VChk%BP};}iatak=)>E_g zz54~JEkRxQ4|Dt+O8l!^VvVP8F65oAlOZQdJIj}@3uL6x(K*xF5MFOugs5L15RxO{-0lgw1%$zZ>DFJl@$(LvFZgXAu=TO_q2-idHumo~Eu9hZz zim`n#TMP|favFU#nDjt)bgARi*T>wDus5?8w>T3G`F-$-*I*p$gfAs(8|`d$K*L1a z?BCk;_g*^xJ5M&bJ!G!Q78#UvRN3Fp)@Bb+Sa-`BHBL``Jztt<@ReXLJ*;gycod<1 zo}nP?kD6X4>jdX>55uqZ*H%=!!OO%9FyQq9A21~b3Rvf=AhE&zutB+_uJ`oDr)o2B#M~>p3!*2l zk*7!(Fa^L2Cr5kHg#e=+kp^7O@r39$?LvBkjEXv3jO_;*j8@$<7^26quCweXs!V?N z$zD`;sccn_$nl3FR#T$lj0s3PxUxH^NF~>CV)H4HQhWByDllKuCIieWjyF8&&~5t? zc}A}`-{tMV=BvplMDo;#%5;fh&r?W2b4?`csA}}}@N9p3rd|jS*g1&Pbt{_b(%$kK zOV9WJsg9kyiwMbwnwYGa^!7Uvpc|udx8q_t>hpCqL3RQaBhjMqUmo)6KD72^tPls9u z^$ql#_e6MczOT2N+3N7y2?MUsg!D+o=&sI}0mg7yxJAp&AZn|DjaR+7x28Hp*?e>C2AILXxmpj z>he*i=CTwWAKfJK?`6Q6qwy9W0^0%rO9uk!!AfcofA48|PRaD>>vY$Rw|rBi>BRF? zcC_{fc>PC&lJ3LpD97nUehTHSW5@>}R6YqVY1J!i5Ucdc#J8GXCBVs}bP4+aN{uy+ z+iITr_9Wp@{1SSa^TcVohQAO>_TPp?I=!0~v|jN4*$lF`Gs%6@`!X5CfZ4I_Recr2 zycjcma`ALV#N1s>UAPk#jY&9lkG2nj9MowbqZPMh#-;S4I_)`Bq^Z_Vu44?^wc4zQOxfevc4tFS~t8x z1XBRfOpyR04=ANoqH4%UBmnSQAbm2&y_q%3IR_%Q`obS{l)o@OlZ0}_@H_Mu)tvEh zoKu${%BravGIvDub_`nd|CQXr@VncNp2n{=Y!!tUHv5qh5E0>E;ok7AFqCPo_1DMr zt3|_3;>Z1swzCb>#^%FCJbY^Lvrpc}+sdUbtd_Ljf$VCiCcCHMuJw*XHyr=ySs`NG zGx|NNd%#uEJpQ|XLSkK92f|QXSjkPLC!v8Yr_DXmzd@R4+O6<#!V-|K=0|d*=6pnh z5d%ZUE{dMh#ehm@cmL&797SizjKq28T&#(FIV6&(;>Rlt-NgJNYJ`6iH5vDP`{Ggq z<<@4@Lb?ag;w!4RozGMI5G?^;_^E=_zr$G<(;~d%Y>~V>15<0pF3+YXCY+=B zhg_NT-O3JU-&{|p1~7sjSJ@7%v=&T2H0o5iMz1IbMc>hh2&8C>`wdFJB^Gj__-C*^p!r>;8Vd@2i*_1X_!k{x?g{9agN~hU_sszvqZASN7aikv zeGKJr@3p~<>2w+Bdfo#%MlVfpu+Gh~N)R`-<$4d*p;8BZ08^>%3)TZxL}H>%A-aYs zft9E}r4fQN5S^+8cEV02uh)9Lu8RRLdP}sE4W4q{@Wupj=JyE84mE%|s0{~AJg5hB zP~XkwC_jU|szbIG+M>*s_lt44N^GXyt-UXK++l>%A>7X5%PAS4Q0=?FZRSojG=3I5 zeSTtU`^TW{A}_cj*8d3hN6f% zru4vhrmIRHyVcyEC}5P0Cp-uzAbuwpC}cA`Yk6?EJV=4U=T%dGN~Qk}pSC zo>@e{5KXw>{tg7H?X{{+TA%T`ikUuPQ?~OpL3?S_OK*fGPGZ_}rkS%Z!BB&o)q!gr z89MDKW`83Y11v+U>shM1e##wO4yOdT&zrxh|-vCjcX6dwMDdy}-`+_RaNNO zM3FioNvl(_%}+h%GI3o&m{qq3N0_}Db>_l+p?yvuY0Eq0Hq5L}Fu7?4MvH`xy>wc~ z+r2e1{YFs`tzKvK&U6aLRey*u57suPT_V_`X4&CV)}R4@3B^I*kX6qfUhH)Mb?f8m z%20gmxAvkfFY$g0GD~-HR7|~?LsE{mZ?575-++PQLnEVW5l}Gl9YRZ390chsBV#wR zc7HV0#!9?Qy79seb!#P!*u?=57XY=L0D%of>gr7OoaTkXcS*f~mmsR)#YW74I9B>8 z@{f!PwMyFf9{3BXk&l}gyUKGdlePLD!b6oMXP@bcLpfA=5KdK@SD_fmbBhC_Nv{*V zVC}GiQ8Dzl4a>6*J#NOqD11pfsNFN?E*coJ_LxBY;2>Z-p?(GIdV|)>>wHU(&c#WQ zf_D0JY!Qv58~S}KtV4>OdXgo$=>nFT6oj95ziuXY*-5}{5MpMWvjj_gE~1KSCrD~m zlGl5?3xKPD_fz>6V=%2eR;9RoYNgPu*GgZW6@ZDS7O6mjKWefid`j8HitFV97gA9S zQ4VDvCH7lCw=~RzTdy#tBAu6wMz1m6AP)4DOg9J;;og6c1zI$O<`luX}S~u>t6V~!)4Kd=Y>t{oqaJpEJdpDvl#|wer z{XA*o(Uqurp)@2&oy!*iXUW>Hq800wd^0IlcsOfB6TO}_jtv0NNth@sx_2I5Bh7cb z+Wm=<1JLabeam#nv8inCAEvlyWkB zynFUpiO|mSK3BPyxI1RzI^USo*q=Du8zMsb-&gN-z&Q;pD#{<%cxYV5DQTn5^GsPd zE5~R!MnB5Y2`8>oa&o`1elsy|d2Fr0eo44jNymw*^kXd|--_?5e>icUc!vYWIViyC zrj>yMLj*YQ7kERX5D~`-5>W^o1EY%c(M>>3a2uSk%7{-^ugRE$5~$^@h5b?%$##v^ zE)t)Rk=`SVEq$k@RD71!@G!e>3Fy#xiE46jUJkHP(A}s>N!B)fF3p(do^y4EcuEwF zAjw_XP#|Oz=Lk7KSS#tzAVX*R#AIK;C)R#m$w}s}&yV}($E?0GU8-OciqA87J!5PO zl*-EvFl>zZBmT3rvb<~S8m~ESy*O|zh<{vvZDfs8ux|SbeCaKAf&?31*yIq@V_l;qCAWbf)Ak+W1&4@6(710=AfqSO^ar#N3Y|LFu!L2KU|{` z&ndCO>;!J&YQ;GWagf2|`Nd>`8Sr+JKaw7p=1Anyu7>;+RJ5V7l5u|E!EIsQrdr28vpZWr8FqMKq_7Mt5N)~2y-0)&CSg? z39aATIAI^K$fKZ1pzWot|KTk({ab_10t}}%6U=+7JR6HX-(|szv?jL=O-y2@r>!d8bsgwRCE2bx(04cY><8jT~PO(Lr<7&nU1(Uzl`KIKaqXuOGXY z$DW?HxglCzbpz#uf1oV&bUrRWklKMrT%k&Cw5V?hHOd<^w<$Br^OCDaed*@TZR#9Y zUsaT!wz2dy;!<2AV*eg!$(s-*6b{UQU`?IT&Er0A9J30`JW^wN0Q-T&j0ksz@~O z=K<3T(xW&0F>igmiS=)`H-e~99sY}} z&mWME{)My%^Vo@>Kj#QblS40eOW4oco7xs_t!R_=+ZF-ycXoaf=2@=yt3ATWb`7ij zsKloUj}G_|yX7xMC_p5B23^0|Gjexns}Q}eINYNA!^7*v{?FxbAvoG?Rk?V>=Un3n%K}tV)ULaV|WChf^T(fHh{<|Be$x}lrbzzJ?&c^2%Kkknz^;M*4dvDmg zX<1DXs#RGCE~GkMh%MLk?;Fq z@v^E|<`%hl+t0R&c8H%7%cLIydth4mhZ7F+8p2C@Xhs-qUZD+*0+~yPe%hOdV3&Ax zgj$)amk;@2(k}0YZBL?Rn>|o>9VN()wd*x-9j;HCL#NwI$IJF)-DPjxm#$k-*<5ce zIMrV=L8>%pf^b+}@MhkS->BDc^qV^5brZ3x!y|B_KXMCSTE$T1>4jqzMAz@sGhp}O z7g_XPd*l6cHr4{aJ@!Sc*5JP=fr;U>#d3EXe-<+{SZ^Y@&h%awLR7WJ;?DQLqm*j} zsi`os^s}IrrOuT?kK`@cmK`w!K5^!=)QYceyNpZKA1S8bP747)&*V17-;A``oP#&0 z`yqYP3hN@MG;IKj)v+_!U8?6>!NW$=4wlE?94VO4UM@bU-BvozxaS7@(PUY+r!M9m zh+>%nA*MUEk?p`3--aj5a8V=VTGw)In&+C{$`?+LgV=X2?iJ?;8!3Qai6_eYe6ypA%-)?0V&J*^p z=>zDpF=2(DUzciQ=RzX$motU@rvMDyoO$;CCBxy9;*vkMzaq$;{p) zP+qjku^3CGd_Os42>ue_R2*py+!+s?@EH4yQD4yHu^A`>_|ryxqU29lnc?UKxY$*>1wHIlq27xxIzh#q3S_$E|bu z1$k}yxA%*ply_@3d{oZw^$}N^HW>Wh6I5ro6j#VI#pYWlH~cjH*0|7Cd!&iB`X#N1 zHpSguiy^9_)Hr30OkKL#{|!f;4Gk{b%h=0+|Jr~JCZ{&{4zwn>$XImk7STRc{f_qS J!dn(E{tp{bhMoWb literal 0 HcmV?d00001 -- Gitee From 1cdc2922ec37de7672d23ed262a6ba840b9e6783 Mon Sep 17 00:00:00 2001 From: asterich Date: Sat, 30 Sep 2023 23:45:49 +0800 Subject: [PATCH 6/6] elf2flt-elf2flt-build-1.md: commit correct result of tinycorrect Signed-off-by: asterich --- articles/20230929-elf2flt-elf2flt-build-1.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/articles/20230929-elf2flt-elf2flt-build-1.md b/articles/20230929-elf2flt-elf2flt-build-1.md index 696fef4..2d179ba 100644 --- a/articles/20230929-elf2flt-elf2flt-build-1.md +++ b/articles/20230929-elf2flt-elf2flt-build-1.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces codeblock codeinline pangu autocorrect]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces images pangu autocorrect epw]
> Author: Odysseus <320873791@qq.com>
> Date: 2023/09/19
> Revisor: walimis <>
@@ -16,7 +16,7 @@ ## 准备 -准备工作分两部分,一个是 uClibc 的构建,另外一个是 Buildroot 的构建。uClibc与 bFLT 程序的关系会在”使用“一节详细说明,此处暂且认为它是 bFLT 程序执行所需要的依赖库;Buildroot 主要用于测试构建完成的 bFLT 程序。 +准备工作分两部分,一个是 uClibc 的构建,另外一个是 Buildroot 的构建。uClibc 与 bFLT 程序的关系会在“使用”一节详细说明,此处暂且认为它是 bFLT 程序执行所需要的依赖库;Buildroot 主要用于测试构建完成的 bFLT 程序。 ### Buildroot 构建 @@ -102,7 +102,7 @@ $ git clone git://uclibc-ng.org/git/uclibc-ng $ cd uclibc-ng ``` -uClibc 依赖于 Linux 头文件, riscv-lab 实际上已经自带所需头文件,但是还存在一些小问题,我们需要动用 `riscv64-linux-gnu` 中的部分头文件手动进行软链接。 +uClibc 依赖于 Linux 头文件,riscv-lab 实际上已经自带所需头文件,但是还存在一些小问题,我们需要动用 `riscv64-linux-gnu` 中的部分头文件手动进行软链接。 ```bash ln -s /usr/include/riscv64-linux-gnu/asm /usr/include/asm @@ -116,11 +116,11 @@ $ make menuconfig 配置菜单打开后如下: -![](images/20230929-elf2flt-elf2flt-build-1/menu-1.png) +![menu-1.png](images/20230929-elf2flt-elf2flt-build-1/menu-1.png) 我们进入 "Target Architecture Features and Options" 菜单,并配置成如图所示: -![](images/20230929-elf2flt-elf2flt-build-1/menu-2.png) +![menu-2.png](images/20230929-elf2flt-elf2flt-build-1/menu-2.png) 然后我们退出菜单,直接构建: -- Gitee