From patchwork Wed Dec 21 11:27:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shahab Vahedi X-Patchwork-Id: 62220 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4DE96385828E for ; Wed, 21 Dec 2022 11:27:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4DE96385828E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1671622064; bh=fypQRlEQB/w4lwB6bRwnVav8SyjUkgLc7VPEImtekFk=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Help:List-Subscribe:From: Reply-To:From; b=G55fvjRYR2UEBxlvSKdH7tuoTxgU5rkybUsVehOivvNlV1fTcRUld5x/u9JYOcS+J oiCTVv7XcY90kqyaO/bWnreosgr4pjiHHZMSgs+73FCfQfm2i2GxGCrrKytr2lBfAP t4wxGnXlWA7P5zHg3jioYL9WJhGhskKeN+WaVM8Q= X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from out-22.mta0.migadu.com (out-22.mta0.migadu.com [91.218.175.22]) by sourceware.org (Postfix) with ESMTPS id 1F0FA3858439 for ; Wed, 21 Dec 2022 11:27:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1F0FA3858439 X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. To: elfutils-devel@sourceware.org Cc: Mark Wielaard , Shahab Vahedi , Claudiu Zissulescu , Francois Bedard Subject: [PATCH v4] Add support for Synopsys ARCv2 processors Date: Wed, 21 Dec 2022 12:27:05 +0100 Message-Id: <20221221112705.22448-1-shahab@synopsys.email> In-Reply-To: <20221220115627.10483-1-shahab@synopsys.com> References: <20221220115627.10483-1-shahab@synopsys.com> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Shahab Vahedi via Elfutils-devel From: Shahab Vahedi Reply-To: Shahab Vahedi Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" There is no regression in tests for an x86_64 build, while the new hello_arc_hs4.ko is added as well. This is the only meaningful test that I could add at the moment, given the features supported by this port. $ cat tests/test-suite.log ========================================== elfutils 0.188: tests/test-suite.log ========================================== # TOTAL: 236 # PASS: 235 # SKIP: 1 # XFAIL: 0 # FAIL: 0 # XPASS: 0 # ERROR: 0 .. contents:: :depth: 2 SKIP: run-lfs-symbols.sh ======================== LFS testing is irrelevant on this system SKIP run-lfs-symbols.sh (exit status: 77) $ cat tests/run-strip-reloc.sh.log runtest hello_i386.ko runtest hello_x86_64.ko runtest hello_ppc64.ko runtest hello_s390.ko runtest hello_aarch64.ko runtest hello_m68k.ko runtest hello_riscv64.ko runtest hello_csky.ko runtest hello_arc_hs4.ko <-- [ new ARC HS4 test ] runtest /home/shahab/pahole_pkg/elfutils-git/bld_arc/src/strip runtest /home/shahab/pahole_pkg/elfutils-git/bld_arc/src/strip.o runtest strip-uncompressed.o runtest strip-compressed.o runtest testfile-debug-rel-ppc64.o runtest testfile-debug-rel-ppc64-z.o runtest testfile-debug-rel-ppc64-g.o PASS run-strip-reloc.sh (exit status: 0) Signed-off-by: Shahab Vahedi --- Changelog: v4: - Add EM_ARCV2 to valid_e_machine[] in src/elflint.c. - Add a link to ARCv3 elf document in arc_init.c. - Update ChangeLogs. v3: - Drop libelf/elf.h changes now that they're synced from glibc. - Drop src/elflint.c changes as EM_ARC was already in valid_e_machine[]. - Add test for ARC HS4 in run-strip-reloc. - Update ChangeLogs and a few more cosemitic changes. - Reword the commit message. v2: - Add ChangeLog entries. - Reduce number of changes in libelf/elf.h - Reword the commit message. backends/ChangeLog | 9 ++++ backends/Makefile.am | 6 ++- backends/arc_init.c | 59 +++++++++++++++++++++++++ backends/arc_reloc.def | 87 +++++++++++++++++++++++++++++++++++++ backends/arc_symbol.c | 81 ++++++++++++++++++++++++++++++++++ libebl/ChangeLog | 5 +++ libebl/eblopenbackend.c | 2 + src/ChangeLog | 4 ++ src/elflint.c | 1 + tests/ChangeLog | 6 +++ tests/Makefile.am | 1 + tests/hello_arc_hs4.ko.bz2 | Bin 0 -> 15004 bytes tests/run-strip-reloc.sh | 4 +- 13 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 backends/arc_init.c create mode 100644 backends/arc_reloc.def create mode 100644 backends/arc_symbol.c create mode 100644 tests/hello_arc_hs4.ko.bz2 index b7ec1420..033ed278 100755 diff --git a/backends/ChangeLog b/backends/ChangeLog index 5813ddcc..13afc116 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,12 @@ +2022-12-21 Shahab Vahedi + + * Makefile.am (modules): Add arc. + (arc_SRCS): Added. + (libebl_backends_a_SOURCES): Append arc_SRCS. + * arc_init.c: New file. + * arc_reloc.def: New file. + * arc_symbol.c: New file. + 2022-12-02 Hengqi Chen * Makefile.am (modules): Add loongarch. diff --git a/backends/Makefile.am b/backends/Makefile.am index 0824123d..f373e5fb 100644 --- a/backends/Makefile.am +++ b/backends/Makefile.am @@ -37,7 +37,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \ noinst_LIBRARIES = libebl_backends.a libebl_backends_pic.a modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \ - m68k bpf riscv csky loongarch + m68k bpf riscv csky loongarch arc i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \ i386_retval.c i386_regs.c i386_auxv.c \ @@ -98,12 +98,14 @@ csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \ loongarch_SRCS = loongarch_init.c loongarch_symbol.c +arc_SRCS = arc_init.c arc_symbol.c + libebl_backends_a_SOURCES = $(i386_SRCS) $(sh_SRCS) $(x86_64_SRCS) \ $(ia64_SRCS) $(alpha_SRCS) $(arm_SRCS) \ $(aarch64_SRCS) $(sparc_SRCS) $(ppc_SRCS) \ $(ppc64_SRCS) $(s390_SRCS) \ $(m68k_SRCS) $(bpf_SRCS) $(riscv_SRCS) $(csky_SRCS) \ - $(loongarch_SRCS) + $(loongarch_SRCS) $(arc_SRCS) libebl_backends_pic_a_SOURCES = am_libebl_backends_pic_a_OBJECTS = $(libebl_backends_a_SOURCES:.c=.os) diff --git a/backends/arc_init.c b/backends/arc_init.c new file mode 100644 index 00000000..a7cceceb --- /dev/null +++ b/backends/arc_init.c @@ -0,0 +1,59 @@ +/* Initialization of ARC specific backend library. + Copyright (C) 2022 Synopsys Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +/* More details on an ARC elf can be found at: + https://github.com/foss-for-synopsys-dwc-arc-processors/ \ + arc-ABI-manual/blob/master/arcv3-elf.md */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define BACKEND arc_ +#define RELOC_PREFIX R_ARC_ +#include "libebl_CPU.h" + +/* This defines the common reloc hooks based on arc_reloc.def. */ +#include "common-reloc.c" + +Ebl * +arc_init (Elf *elf __attribute__ ((unused)), + GElf_Half machine __attribute__ ((unused)), + Ebl *eh) +{ + arc_init_reloc (eh); + HOOK (eh, machine_flag_check); + HOOK (eh, reloc_simple_type); + HOOK (eh, section_type_name); + + /* /bld/gcc-stage2/arc-snps-linux-gnu/libgcc/libgcc.map.in + #define __LIBGCC_DWARF_FRAME_REGISTERS__. */ + eh->frame_nregs = 146; + + return eh; +} diff --git a/backends/arc_reloc.def b/backends/arc_reloc.def new file mode 100644 index 00000000..dfa30629 --- /dev/null +++ b/backends/arc_reloc.def @@ -0,0 +1,87 @@ +/* List the relocation types for ARC. -*- C -*- + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +/* NAME, REL|EXEC|DYN */ + +RELOC_TYPE (NONE, EXEC|DYN) +RELOC_TYPE (8, REL|EXEC|DYN) +RELOC_TYPE (16, REL|EXEC|DYN) +RELOC_TYPE (24, REL|EXEC|DYN) +RELOC_TYPE (32, REL|EXEC|DYN) +RELOC_TYPE (N8, REL|EXEC|DYN) +RELOC_TYPE (N16, REL|EXEC|DYN) +RELOC_TYPE (N24, REL|EXEC|DYN) +RELOC_TYPE (N32, REL|EXEC|DYN) +RELOC_TYPE (SDA, REL) +RELOC_TYPE (SECTOFF, REL) +RELOC_TYPE (S21H_PCREL, REL) +RELOC_TYPE (S21W_PCREL, REL) +RELOC_TYPE (S25H_PCREL, REL) +RELOC_TYPE (S25W_PCREL, REL) +RELOC_TYPE (SDA32, REL) +RELOC_TYPE (SDA_LDST, REL) +RELOC_TYPE (SDA_LDST1, REL) +RELOC_TYPE (SDA_LDST2, REL) +RELOC_TYPE (SDA16_LD, REL) +RELOC_TYPE (SDA16_LD1, REL) +RELOC_TYPE (SDA16_LD2, REL) +RELOC_TYPE (S13_PCREL, REL) +RELOC_TYPE (W, REL) +RELOC_TYPE (32_ME, REL) +RELOC_TYPE (N32_ME, REL) +RELOC_TYPE (SECTOFF_ME, REL) +RELOC_TYPE (SDA32_ME, REL) +RELOC_TYPE (W_ME, REL) +RELOC_TYPE (SDA_12, REL) +RELOC_TYPE (SDA16_ST2, REL) +RELOC_TYPE (32_PCREL, REL) +RELOC_TYPE (PC32, REL) +RELOC_TYPE (GOTPC32, REL) +RELOC_TYPE (PLT32, REL) +RELOC_TYPE (COPY, EXEC|DYN) +RELOC_TYPE (GLOB_DAT, EXEC|DYN) +RELOC_TYPE (JMP_SLOT, EXEC|DYN) +RELOC_TYPE (RELATIVE, EXEC|DYN) +RELOC_TYPE (GOTOFF, REL) +RELOC_TYPE (GOTPC, REL) +RELOC_TYPE (GOT32, REL) +RELOC_TYPE (S21W_PCREL_PLT, REL) +RELOC_TYPE (S25H_PCREL_PLT, REL) +RELOC_TYPE (JLI_SECTOFF, REL) +RELOC_TYPE (TLS_DTPMOD, REL) +RELOC_TYPE (TLS_DTPOFF, REL) +RELOC_TYPE (TLS_TPOFF, REL) +RELOC_TYPE (TLS_GD_GOT, REL) +RELOC_TYPE (TLS_GD_LD, REL) +RELOC_TYPE (TLS_GD_CALL, REL) +RELOC_TYPE (TLS_IE_GOT, REL) +RELOC_TYPE (TLS_DTPOFF_S9, REL) +RELOC_TYPE (TLS_LE_S9, REL) +RELOC_TYPE (TLS_LE_32, REL) +RELOC_TYPE (S25W_PCREL_PLT, REL) +RELOC_TYPE (S21H_PCREL_PLT, REL) +RELOC_TYPE (NPS_CMEM16, REL) diff --git a/backends/arc_symbol.c b/backends/arc_symbol.c new file mode 100644 index 00000000..be69814e --- /dev/null +++ b/backends/arc_symbol.c @@ -0,0 +1,81 @@ +/* ARC specific symbolic name handling. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#define BACKEND arc_ +#include "libebl_CPU.h" + + +/* Check whether machine flags are valid. */ +bool +arc_machine_flag_check (GElf_Word flags) +{ + return ((flags & ~EF_ARC_ALL_MSK) == 0); +} + +/* Check for the simple reloc types. */ +Elf_Type +arc_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type, + int *addsub __attribute ((unused))) +{ + switch (type) + { + case R_ARC_32: + return ELF_T_WORD; + case R_ARC_16: + return ELF_T_HALF; + case R_ARC_8: + return ELF_T_BYTE; + default: + return ELF_T_NUM; + } +} + +/* Return symbolic representation of section type. */ +const char * +arc_section_type_name (int type, + char *buf __attribute__ ((unused)), + size_t len __attribute__ ((unused))) +{ + switch (type) + { + case SHT_ARC_ATTRIBUTES: + return "ARC_ATTRIBUTES"; + default: + break; + } + + return NULL; +} diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 5f9ea552..3226cfb4 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,8 @@ +2022-12-21 Shahab Vahedi + + * eblopenbackend.c (arc_init): New function declaration. + (machines): Add entry for arc. + 2022-12-02 Hengqi Chen * eblopenbackend.c (machines): Add entries for LoongArch. diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c index b87aef19..084a1544 100644 --- a/libebl/eblopenbackend.c +++ b/libebl/eblopenbackend.c @@ -56,6 +56,7 @@ Ebl *bpf_init (Elf *, GElf_Half, Ebl *); Ebl *riscv_init (Elf *, GElf_Half, Ebl *); Ebl *csky_init (Elf *, GElf_Half, Ebl *); Ebl *loongarch_init (Elf *, GElf_Half, Ebl *); +Ebl *arc_init (Elf *, GElf_Half, Ebl *); /* This table should contain the complete list of architectures as far as the ELF specification is concerned. */ @@ -152,6 +153,7 @@ static const struct { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS32, ELFDATA2LSB }, { csky_init, "elf_csky", "csky", 4, EM_CSKY, ELFCLASS32, ELFDATA2LSB }, { loongarch_init, "elf_loongarch", "loongarch", 9, EM_LOONGARCH, ELFCLASS64, ELFDATA2LSB }, + { arc_init, "elf_arc", "arc", 3, EM_ARCV2, ELFCLASS32, ELFDATA2LSB }, }; #define nmachines (sizeof (machines) / sizeof (machines[0])) diff --git a/src/ChangeLog b/src/ChangeLog index b679f092..e8d8aad6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2022-12-21 Shahab Vahedi + + * elflint.c (valid_e_machine): Add EM_ARCV2. + 2022-12-02 Hengqi Chen * elflint.c (valid_e_machine): Add EM_LOONGARCH. diff --git a/src/elflint.c b/src/elflint.c index b9548862..b4eac32f 100644 --- a/src/elflint.c +++ b/src/elflint.c @@ -330,6 +330,7 @@ static const int valid_e_machine[] = EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300, EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA, EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY, EM_LOONGARCH, + EM_ARCV2 }; #define nvalid_e_machine \ (sizeof (valid_e_machine) / sizeof (valid_e_machine[0])) diff --git a/tests/ChangeLog b/tests/ChangeLog index b656029f..9cb8a2cf 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,9 @@ +2022-12-21 Shahab Vahedi + + * hello_arc_hs4.ko.bz2: New testfile. + * run-strip-reloc.sh: Add ARC HS4 test. + * Makefile.am (EXTRA_DIST): Add hello_arc_hs4.ko.bz2. + 2022-11-01 Aaron Merey * run-debuginfod-section.sh (RPM_BUILDID): Use buildid from non-zstd diff --git a/tests/Makefile.am b/tests/Makefile.am index 356b3fbf..c35a7c33 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -285,6 +285,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ hello_ppc64.ko.bz2 hello_s390.ko.bz2 hello_aarch64.ko.bz2 \ hello_m68k.ko.bz2 hello_riscv64.ko.bz2 hello_csky.ko.bz2 \ + hello_arc_hs4.ko.bz2 \ run-unstrip-test.sh run-unstrip-test2.sh \ testfile-info-link.bz2 testfile-info-link.debuginfo.bz2 \ testfile-info-link.stripped.bz2 run-unstrip-test3.sh \ diff --git a/tests/hello_arc_hs4.ko.bz2 b/tests/hello_arc_hs4.ko.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..56ccb3c494e84450c7aeac5f57f94aef8336f8e0 GIT binary patch literal 15004 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 z

a!bps(U+yB*kqcH%(0`2lj+8+E+di09MexQkkgby5*ZTUdB%uBsxvPFtW`dnk& zt06Aij7$2Wp>)v~zz+%!P5xpO-Vg2f+#$oZk4Ps&z!bA~G?z#+rv#4dsdl$vVpa-+ zki_-ZLk|)Wvv8gVCK*RqH08y)?3 zHxkkTqz8ZQ5at!o_u_kI5V3Y)1!uv7ydQqXW$4FLC-h z(im)NH$_Dg%Z^rCA!SSHs9NQQ5B>a-y*>F@7K-trPL}N}UfZ;$jb4mMe-ieMQj&FC zI~Z4#4E4x?*h#xbwGt$V{_4qzo4Gmh?77uy;gu~H{jeYpj1aaD7sm&E2N9wPQgSfyM%r}{Hp9;bxbs?Gev6zkRGja4M6WnH3!s-|gqf)CB>3x4^_w?Pb8wVJX+`ujIfY zVT3dhV8L`1>!v%*OZoId6`Mq6k^i#by85hHeL?g#C+tHB?h5_7HBpRD0cS9|HiHEU zKjE8`p2r=Or6c1sx*5%3fCwHw z__8mRtlN5CCdg$W6g3_;Uv>w+{ARrBTZ*EEc&st~?XO0G zKGa^o&Ja8vCS)@jXCc7@KD!w$&{Sf|A*)NjiFfSxZA)uReN#xQ;{%S=ui^Pq!7Rj# zjAF>+$g-o6(ZO5;f0{epGUEgTcopDQwBS5E^cABYGm-Z%`f~Z zrAm-D2B;nei)4b>$q4=Hq*f?T*zz+kX?yZKC}wJwy1@c!+yQG-8|~c`i~BpWgQ2H1 zupf)7%FQhdT;43r+v1PrrHL~TnY1nGtaJ`{0z&Wv($EWe^#Q$C7Vf%n4c13Sux7jl z3^6)W?aEdMLXG1yn^ZF;>eG6y&kC&Fs(Jbbznvw1SC)1VubltnnRRbnF$`5nE`WHt z`R>*GhG`j6K53n<_>k9&1A5gaPKWfkxAx5XWz_KSi<2|FNM+$diz`2iV5#U=y@3WAeRu+5j2knvsw zerKS|IZ;wkL^pg7uQG{Gcm;VG3atHLl+>)2bO_PeI2 zmR*?R`qT4_Hf8L9auGygC`{~sMsFwW_(4RMVCBH{u5GD1J3C+KeD$tFh*q$1={M%# zF}M4UH|7w&7J4wjT%?u!D<>mA_soFa%V#aSvd&h&r=~{(mQI!j?RHS(LK;d1?cfBk z&x>|hT0cylm=*n$B-nLG_vt&0C)wh@9`V)Fh`JuzkyM+0UT*sGGhC&BplFHH?}%~P z$KPAZ)a*ssLFCgN{?PxYV!(Pqj}2LX90DQ$19rUb;Op+lBi(+v>+4S%X7Qp%F-|H3 z^C=>nI257E&CxZBgDU&-UH!MwxC-Y2pEDQm3%#tdYCB8cO>K9_Hx7rKyhyW($H~Pf zJONkkge26uaHaIO5!9PV*U za-rSEz(HPTWznxp5jd|5F2u)aca)I&-}Ay=DA-pZB;|=DWT(9ccCK1Kz0BBMrLW}T z=8&Og8+>7MNP2bxKnsErU zque{zOs~}#s^U$07@eH1ZIyk*_|N2HTCXfvpdhgOnkZXCOCqz?7 z$*xphEbCRmClIfTIXjIWY9wpnB!*`Z1W_cZys|^oLUB??*i3Lt)($20oKsK*Sm+CP zaWcAKb0DAN%Y1z)UOjk`ILxJg6fAL|h90%L0Tu>G1JLyVitP3cRmguWAnc;c{Q_eB zzviO9*R$jYH^^WZDnjH=%kI<6L`G%6a-_@*cvr%IMZ?Dhmw(WK58_U!L?^r|EcgbB54Qx!>M@~U(bQ<)h-08mi_Ouh83TyK=v0q=PX?cWB^`>#I; zwySf`TD)`fsIq**UN&j%nFBDdN{da^hVJlvQXt8Q7nc=yo{>Nn!gdm)d-qb0&AR4 zehY1r&yA|8@;zJrb1?i~T=QUrGFNMPrCVYC&mn>xj`>uYRSyOzL4d&CiGThAkjb(} zL3V#6D_0oJk2dzz#zR@*FBSg9COk@V zs+O4~mF31Ga4CNJ6B`gPMFxk?LwT*Wm-UXTZxp7e#k?VV^z~5l`BzEs`;BY!w%%VK zrZY#ix`N-=zq@?}R!Uo@e%Q?=Wj}Kⅇ$;Yx}n`tRj+g_5HUVsT%<&XI}*D78+^n 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 hS~lbLXV}0>E&7O#5qemvf1}$;irADSP