From nobody Wed Apr 1 20:45:44 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=yodel.dev ARC-Seal: i=1; a=rsa-sha256; t=1775063163; cv=none; d=zohomail.com; s=zohoarc; b=dkWtMYaJjxFopUyX6z2Ju7hmG2devJ6vS0W1LyzaNbg+UjcfmWDbeOhhkdV2v/XaSpTU7qNsQRtOUduh79XJNuHF/aq5cXMJjcfUORGZnO0Al1yFmUIAgAwNjeECf1PEGmwthRTsxPwcSvQJAUZSAN9yo3PpB/Pouv1GgbB+hwU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775063163; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=AJlzKuAkDZcYrX0s+aHJjENlPGBg3C9Smuh0yRglnGM=; b=CJ1IEpKEjJVFDMpco21cf/lSnnOVnypuf1iZo/olwjBojPAGWLeRP+KwPXcFar+vS17mxlLWSkIL/4PlFbj4c3scHUtQrtkLoVIeA6JazJlF7gkOiLt5da0z45HeWQEP23X3g6Gsuludv3Vemm3QEKTaqAVLtM1Ah4DyxIw6hnI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1775063163564324.0665580550516; Wed, 1 Apr 2026 10:06:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7z0X-00015j-AC; Wed, 01 Apr 2026 13:05:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7z09-0000pj-Nn for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:11 -0400 Received: from v512.v5f06b487.use4.send.mailgun.net ([143.55.232.12]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7z07-0007sm-AM for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:09 -0400 Received: from mail.yodel.dev (mail.yodel.dev [35.209.39.246]) by 657e51e36a66f18c38ea7955c08c805cbc6585bdd20ef3000326122a1a6815cb with SMTP id 69cd503a2c50a55f4d6cb994; Wed, 01 Apr 2026 17:04:58 GMT X-Mailgun-Sid: WyI4ZDFlNiIsInFlbXUtZGV2ZWxAbm9uZ251Lm9yZyIsIjk3NjA3ZSJd X-Mailgun-Sending-Ip: 143.55.232.12 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yodel.dev; s=rsa2048; t=1775063097; bh=AJlzKuAkDZcYrX0s+aHJjENlPGBg3C9Smuh0yRglnGM=; h=X-Mailgun-Dkim:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:From:Reply-to: Subject:Date:Message-id:To:Cc:Mime-version:Content-type: Content-transfer-encoding:In-reply-to:References; b=CwVlYMPOUNoEgWUY/HBh6nhPVCL+eTs1aZrWumY46c0Ui3EZw/DAUCz1Heiyr9Bi7 5RsejjGjMQkzMJfa/0tJkcUm+5Wk+0uzip5zJ3w/RuiBNhAgWJk9XWLvDLPa0OIr8G XMdQfBaRrx+jfGBu3zESoDw8X2AEYWInPI1ArSZlvfRNZXuwsFLl8O0sOKrubf/GJE u0079rRjhlZ1jifT4skJ0joDtNPVL0Xz9ykweSKFiqsKw0tA3seXwaj7Ui+l0Ta8jO 5xnp1XTOxdvr3iuUv/6g9gZrI14bNgxSWVajIkB3r38OfL9GbvEKU0JdEJayIis4HZ XmsXlxkOaCPUQ== X-Mailgun-Dkim: no X-Mailgun-Dkim: no From: "Yodel Eldar" To: qemu-devel@nongnu.org Cc: Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yodel Eldar Subject: [RFC PATCH 1/4] alpha: Define Typhoon instance_init Date: Wed, 1 Apr 2026 12:04:51 -0500 Message-ID: <20260401170454.32045-2-yodel.eldar@yodel.dev> In-Reply-To: <20260401170454.32045-1-yodel.eldar@yodel.dev> References: <20260401170454.32045-1-yodel.eldar@yodel.dev> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=143.55.232.12; envelope-from=bounce+0e9322.97607e-qemu-devel=nongnu.org@yodel.dev; helo=v512.v5f06b487.use4.send.mailgun.net X-Spam_score_int: 0 X-Spam_score: -0.1 X-Spam_bar: / X-Spam_report: (-0.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HELO_STATIC_HOST=-0.001, RCVD_IN_MSPIKE_H2=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=1, RCVD_IN_VALIDITY_RPBL_BLOCKED=1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yodel.dev) X-ZM-MESSAGEID: 1775063164273158500 Content-Type: text/plain; charset="utf-8" From: Yodel Eldar Signed-off-by: Yodel Eldar --- hw/alpha/alpha_sys.h | 4 +++- hw/alpha/dp264.c | 8 +++++++- hw/alpha/typhoon.c | 24 ++++++++++++------------ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h index 6e6691d116..247a52b776 100644 --- a/hw/alpha/alpha_sys.h +++ b/hw/alpha/alpha_sys.h @@ -8,9 +8,11 @@ #include "hw/core/boards.h" #include "hw/intc/i8259.h" =20 +#define TYPE_TYPHOON_PCI_HOST_BRIDGE "typhoon-pcihost" +OBJECT_DECLARE_SIMPLE_TYPE(TyphoonState, TYPHOON_PCI_HOST_BRIDGE) =20 PCIBus *typhoon_init(MemoryRegion *, qemu_irq *, qemu_irq *, AlphaCPU *[4], - pci_map_irq_fn, uint8_t devfn_min); + pci_map_irq_fn, uint8_t devfn_min, TyphoonState *); =20 /* alpha_pci.c. */ extern const MemoryRegionOps alpha_pci_ignore_ops; diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c index 2ab3c14747..ce2f8765cd 100644 --- a/hw/alpha/dp264.c +++ b/hw/alpha/dp264.c @@ -49,6 +49,7 @@ static void clipper_init(MachineState *machine) const char *kernel_cmdline =3D machine->kernel_cmdline; const char *initrd_filename =3D machine->initrd_filename; MachineClass *mc =3D MACHINE_GET_CLASS(machine); + Object *typhoon_obj; AlphaCPU *cpus[4]; PCIBus *pci_bus; PCIDevice *pci_dev; @@ -62,6 +63,10 @@ static void clipper_init(MachineState *machine) uint64_t kernel_entry, kernel_low; unsigned int smp_cpus =3D machine->smp.cpus; =20 + typhoon_obj =3D object_new_with_props(TYPE_TYPHOON_PCI_HOST_BRIDGE, + OBJECT(machine), "typhoon", + &error_fatal, NULL); + /* Create up to 4 cpus. */ memset(cpus, 0, sizeof(cpus)); for (i =3D 0; i < smp_cpus; ++i) { @@ -87,7 +92,8 @@ static void clipper_init(MachineState *machine) * the minimum PCI device IdSel is 1. */ pci_bus =3D typhoon_init(machine->ram, &isa_irq, &rtc_irq, cpus, - clipper_pci_map_irq, PCI_DEVFN(1, 0)); + clipper_pci_map_irq, PCI_DEVFN(1, 0), + TYPHOON_PCI_HOST_BRIDGE(typhoon_obj)); =20 /* * Init the PCI -> ISA bridge. diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index 7722d4fd00..26580664d8 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -17,7 +17,6 @@ #include "alpha_sys.h" =20 =20 -#define TYPE_TYPHOON_PCI_HOST_BRIDGE "typhoon-pcihost" #define TYPE_TYPHOON_IOMMU_MEMORY_REGION "typhoon-iommu-memory-region" =20 typedef struct TyphoonCchip { @@ -49,8 +48,6 @@ typedef struct TyphoonPchip { TyphoonWindow win[4]; } TyphoonPchip; =20 -OBJECT_DECLARE_SIMPLE_TYPE(TyphoonState, TYPHOON_PCI_HOST_BRIDGE) - struct TyphoonState { PCIHostState parent_obj; =20 @@ -819,25 +816,27 @@ static void typhoon_alarm_timer(void *opaque) cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER); } =20 +static void typhoon_pcihost_instance_init(Object *obj) +{ + TyphoonState *s =3D TYPHOON_PCI_HOST_BRIDGE(obj); + + s->cchip.misc =3D 0x800000000ull; /* Revision: Typhoon. */ + s->pchip.win[3].wba =3D 2; /* Window 3 SG always enabled. */ +} + PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq, qemu_irq *p_rtc_irq, AlphaCPU *cpus[4], - pci_map_irq_fn sys_map_irq, uint8_t devfn_min) + pci_map_irq_fn sys_map_irq, uint8_t devfn_min, + TyphoonState *s) { MemoryRegion *addr_space =3D get_system_memory(); - DeviceState *dev; - TyphoonState *s; + DeviceState *dev =3D DEVICE(s); PCIHostState *phb; PCIBus *b; int i; =20 - dev =3D qdev_new(TYPE_TYPHOON_PCI_HOST_BRIDGE); - - s =3D TYPHOON_PCI_HOST_BRIDGE(dev); phb =3D PCI_HOST_BRIDGE(dev); =20 - s->cchip.misc =3D 0x800000000ull; /* Revision: Typhoon. */ - s->pchip.win[3].wba =3D 2; /* Window 3 SG always enabled. */ - /* Remember the CPUs so that we can deliver interrupts to them. */ for (i =3D 0; i < 4; i++) { AlphaCPU *cpu =3D cpus[i]; @@ -931,6 +930,7 @@ PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa= _irq, static const TypeInfo typhoon_pcihost_info =3D { .name =3D TYPE_TYPHOON_PCI_HOST_BRIDGE, .parent =3D TYPE_PCI_HOST_BRIDGE, + .instance_init =3D typhoon_pcihost_instance_init, .instance_size =3D sizeof(TyphoonState), }; =20 --=20 2.53.0 From nobody Wed Apr 1 20:45:44 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=yodel.dev ARC-Seal: i=1; a=rsa-sha256; t=1775063145; cv=none; d=zohomail.com; s=zohoarc; b=GWLNq70cZkkGCea1mAQK31pJ501w8WrXmv0h8ADMmPLbUKOL+mu/65RjtAc7qPl6Z6MfLcKYYFHTlT2QDq4rJ2tOmWx9AGUNUCi0aYeA86OhVblmSRvesb22RSJBMuKQggR+RrKCAwq9ZSNAN2QpIU8IT1yL8+b49sH/EbXWm6k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775063145; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=sbl1/SbOW5RNXGHHar18gl/ANw6AoNz11ZBRCd42A2E=; b=OKM04x5Nn86h70IA8wHGb6KrKAgXfixVzdr9jwwv4bHxWKuDVyJCLEnWHkVvU4p3SQ6oJ+OAh2MHKfIPufgp4g/xWvRnP5ZP14Dj0RLuNgf+4oeMVYmTj+7F0gsRt4Mh2BLbaHPbzZABfqt2U2OQqjOOQDMCX+2gJlnix7TChGU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1775063145077709.5030879953591; Wed, 1 Apr 2026 10:05:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7z0O-0000vL-Pu; Wed, 01 Apr 2026 13:05:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7z09-0000pk-O0 for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:11 -0400 Received: from v512.v5f06b487.use4.send.mailgun.net ([143.55.232.12]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7z07-0007ss-A9 for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:08 -0400 Received: from mail.yodel.dev (mail.yodel.dev [35.209.39.246]) by ff02f649880f4c1d5d70100ea9aa6e7e10e475320cb5153f37db282a819a7e15 with SMTP id 69cd503a909492175f9ecf6f; Wed, 01 Apr 2026 17:04:58 GMT X-Mailgun-Sid: WyI4ZDFlNiIsInFlbXUtZGV2ZWxAbm9uZ251Lm9yZyIsIjk3NjA3ZSJd X-Mailgun-Sending-Ip: 143.55.232.12 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yodel.dev; s=rsa2048; t=1775063098; bh=sbl1/SbOW5RNXGHHar18gl/ANw6AoNz11ZBRCd42A2E=; h=X-Mailgun-Dkim:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:From:Reply-to: Subject:Date:Message-id:To:Cc:Mime-version:Content-type: Content-transfer-encoding:In-reply-to:References; b=DhaU0sya4y8ECW/vFKKDG5ogOzFK5AalKAx6xq+fISybhtbjKZKPdQKU9ZrgEoWoM X1ryqziLXsm0RFuOC4uvZ+p5hxE+SKt5yvp6QndFcc3LvrcUrqoAgSTCVkt2k+cw+S zq1POc88TbK9ejvPTMf/qH0ktHRzF1pXjO4blrJUJVVBORkYxU5DSHSDaHWdni608w 4SfTz6Jh9LxdMLOFZVlJLFbiaMNr/zVTKiqXYhf++DTX2z1k7mFH97e39SNQ4i8U70 8+Kz4gBbpvKP+93GQqZ4CBPGzlQL9nFkbXU4IAs8eWt23f1b0nJhFYZInBsEBNXsoq M+PfgLgo1Hq8w== X-Mailgun-Dkim: no X-Mailgun-Dkim: no From: "Yodel Eldar" To: qemu-devel@nongnu.org Cc: Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yodel Eldar Subject: [RFC PATCH 2/4] alpha: Propagate CPU index via MemTxAttrs Date: Wed, 1 Apr 2026 12:04:52 -0500 Message-ID: <20260401170454.32045-3-yodel.eldar@yodel.dev> In-Reply-To: <20260401170454.32045-1-yodel.eldar@yodel.dev> References: <20260401170454.32045-1-yodel.eldar@yodel.dev> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=143.55.232.12; envelope-from=bounce+0e9322.97607e-qemu-devel=nongnu.org@yodel.dev; helo=v512.v5f06b487.use4.send.mailgun.net X-Spam_score_int: 0 X-Spam_score: -0.1 X-Spam_bar: / X-Spam_report: (-0.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HELO_STATIC_HOST=-0.001, RCVD_IN_MSPIKE_H2=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=1, RCVD_IN_VALIDITY_RPBL_BLOCKED=1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yodel.dev) X-ZM-MESSAGEID: 1775063148102154100 Content-Type: text/plain; charset="utf-8" From: Yodel Eldar Currently, a read of the Typhoon Cchip's MISC register dereferences current_cpu for the CPU index. To decouple Typhoon from the CPU, let's instead pass the CPU index through the requester_id attribute of the memory transaction. Signed-off-by: Yodel Eldar --- hw/alpha/typhoon.c | 7 ++++--- target/alpha/helper.c | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index 26580664d8..5dadfa7691 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -74,7 +74,6 @@ static MemTxResult cchip_read(void *opaque, hwaddr addr, uint64_t *data, unsigned size, MemTxAttrs attrs) { - CPUState *cpu =3D current_cpu; TyphoonState *s =3D opaque; uint64_t ret =3D 0; =20 @@ -90,10 +89,12 @@ static MemTxResult cchip_read(void *opaque, hwaddr addr, /* All sorts of stuff related to real DRAM. */ break; =20 - case 0x0080: + case 0x0080: { /* MISC: Miscellaneous Register. */ - ret =3D s->cchip.misc | (cpu->cpu_index & 3); + uint64_t cpu_index =3D attrs.requester_id & 3; + ret =3D s->cchip.misc | cpu_index; break; + } =20 case 0x00c0: /* MPD: Memory Presence Detect Register. */ diff --git a/target/alpha/helper.c b/target/alpha/helper.c index 179dc2dc7a..bebb0e4804 100644 --- a/target/alpha/helper.c +++ b/target/alpha/helper.c @@ -164,13 +164,19 @@ void alpha_cpu_record_sigsegv(CPUState *cs, vaddr add= ress, env->trap_arg2 =3D cause; } #else +static inline QEMU_ALWAYS_INLINE +MemTxAttrs alpha_cpu_get_mem_attrs(const CPUState *cs) +{ + return (MemTxAttrs){ .requester_id =3D cs->cpu_index }; +} + /* Returns the OSF/1 entMM failure indication, or -1 on success. */ static int get_physical_address(CPUAlphaState *env, vaddr addr, int prot_need, int mmu_idx, hwaddr *pphys, int *pprot) { - const MemTxAttrs attrs =3D MEMTXATTRS_UNSPECIFIED; CPUState *cs =3D env_cpu(env); + const MemTxAttrs attrs =3D alpha_cpu_get_mem_attrs(cs); target_long saddr =3D addr; hwaddr phys =3D 0; uint64_t L1pte, L2pte, L3pte; @@ -327,8 +333,11 @@ bool alpha_cpu_tlb_fill(CPUState *cs, vaddr addr, int = size, cpu_loop_exit_restore(cs, retaddr); } =20 - tlb_set_page(cs, addr & TARGET_PAGE_MASK, phys & TARGET_PAGE_MASK, - prot, mmu_idx, TARGET_PAGE_SIZE); + tlb_set_page_with_attrs(cs, addr & TARGET_PAGE_MASK, + phys & TARGET_PAGE_MASK, + alpha_cpu_get_mem_attrs(cs), + prot, mmu_idx, TARGET_PAGE_SIZE); + return true; } =20 --=20 2.53.0 From nobody Wed Apr 1 20:45:44 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=yodel.dev ARC-Seal: i=1; a=rsa-sha256; t=1775063174; cv=none; d=zohomail.com; s=zohoarc; b=Bo2Sf0f7mf+IKOIFXxllaD1I7nS6yj3yxm7XEp2y8yOe/yGcZEpySYR760jgv/Cz7NxH7ZtLig7m7axjKucNx9oxKwB5ghcs0B/Y7wTJyyWGi2wEOu7rRzv6HhN99Cot9pY6jrDcoimyhb/scLBrYhHM1Rcx7Ond6qzzBbpwkNI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775063174; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Ft8NudYzcwgnb/NtMZjokqHSpfT16xJAGl989G7s3EU=; b=Od61E/0FxgppwNMNWOvcGHfMDtGfYLiLMTPmIrhXq2PqSeNYLcwLYRzyItNU7RXfb8XBq2Rc6xzepd6fswDCqny4r21DXvPJ8duWJz2HRNKoqlY+Had/GCAbHaXRCQplVomOWGNBE0bNzDrJkYsepgtdn3mJJSuC9GPXeIKt8LA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1775063174775369.8244384180001; Wed, 1 Apr 2026 10:06:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7z0X-00016m-Ez; Wed, 01 Apr 2026 13:05:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7z09-0000pl-O6 for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:11 -0400 Received: from v512.v5f06b487.use4.send.mailgun.net ([143.55.232.12]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7z07-00084g-AK for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:09 -0400 Received: from mail.yodel.dev (mail.yodel.dev [35.209.39.246]) by aaac95d988df8a5b7476f90d482c0863d3bd26acbd0c843086e3698f5097df11 with SMTP id 69cd503bbf9bc69ede7f1800; Wed, 01 Apr 2026 17:04:59 GMT X-Mailgun-Sid: WyI4ZDFlNiIsInFlbXUtZGV2ZWxAbm9uZ251Lm9yZyIsIjk3NjA3ZSJd X-Mailgun-Sending-Ip: 143.55.232.12 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yodel.dev; s=rsa2048; t=1775063098; bh=Ft8NudYzcwgnb/NtMZjokqHSpfT16xJAGl989G7s3EU=; h=X-Mailgun-Dkim:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding: From:Reply-to:Subject:Date:Message-id:To:Cc:Mime-version: Content-type:Content-transfer-encoding:In-reply-to:References; b=bu8sEM1QanOabgLcZus8CskaneuZFKkKKJyWZpUpwsBaiPu9KvzsE4SQ6UURokgiy MdQouLAGskimFVrMpIDNleuP0qvyLhr28ybrDF9C8XKvkup8nM0j85bAf64fWEV2eU eF/ou5PlQjraGvy3zhDTONXb7uDdIDEAJl0iX5cyfL2T8gdYG9CvKpFB6nDpnHogdW sX1AggpTucEpprgQK1CDXUNNs6jrbypvN0OMj6AaaoidBScYgH351wNIwIAwENkWca v9EFnRYzJUeemCoB9C6xAawqVs+y8G9w0jdb7uxdk3iFZnnUbKZIeAtk7kqyXo28kG 0KXwWEQihgtpA== X-Mailgun-Dkim: no X-Mailgun-Dkim: no From: "Yodel Eldar" To: qemu-devel@nongnu.org Cc: Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yodel Eldar Subject: [RFC PATCH 3/4] alpha: Replace helper_set_alarm with Typhoon Cchip MMIO register Date: Wed, 1 Apr 2026 12:04:53 -0500 Message-ID: <20260401170454.32045-4-yodel.eldar@yodel.dev> In-Reply-To: <20260401170454.32045-1-yodel.eldar@yodel.dev> References: <20260401170454.32045-1-yodel.eldar@yodel.dev> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=143.55.232.12; envelope-from=bounce+0e9322.97607e-qemu-devel=nongnu.org@yodel.dev; helo=v512.v5f06b487.use4.send.mailgun.net X-Spam_score_int: 0 X-Spam_score: -0.1 X-Spam_bar: / X-Spam_report: (-0.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HELO_STATIC_HOST=-0.001, RCVD_IN_MSPIKE_H2=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=1, RCVD_IN_VALIDITY_RPBL_BLOCKED=1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yodel.dev) X-ZM-MESSAGEID: 1775063176414158500 From: Yodel Eldar This commit creates a QEMU-specific (non-standard) MMIO register in Typhoon's Cchip to replace helper_set_alarm() and to move the QEMUTimer pointer, alarm_timer, out of the Alpha CPU and into the chipset code. Currently, PALcode writes to the QEMU-specific, synthetic Processor Register (index 251) and triggers the invocation of helper_set_alarm() as a side effect in QEMU, thereby setting the timer alarm expiration value. This works, because the AlphaCPU contains the QEMUTimer and CPUAlphaState stores the alarm expiration value; however, the timer alarm callback resides in and is specific to the Typhoon chipset, thus the CPU and the chipset are entangled. By designating the currently unused offset (0x7c0) of Cchip as the location of the timer alarm expiration, we can disentangle and better encapsulate both. Suggested-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Yodel Eldar --- Notes: The patch to the palcode-clipper binary that follows this one is necessary for this patch to work; I've left the diff to the source in the notes of it for reproduction. =20 Philippe: Thanks, again, for the suggestion of decoupling the CPU from the Typhoon using IRQ lines. In my response, I guessed that getting the CPU index would be trickier than moving the timer into TyphoonState; perhaps you'll find it amusing (as I do) that it appears I had that backwards (due to the PALcode peculiarity)! =20 The remaining CPU interrupts will be refactored in v2 of that series. hw/alpha/dp264.c | 4 ++++ hw/alpha/typhoon.c | 38 ++++++++++++++++++++++++++++++++------ target/alpha/cpu.c | 17 +++++++++++++++++ target/alpha/cpu.h | 6 ------ target/alpha/helper.h | 1 - target/alpha/sys_helper.c | 12 ------------ target/alpha/translate.c | 11 ----------- 7 files changed, 53 insertions(+), 36 deletions(-) diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c index ce2f8765cd..8e63b48a02 100644 --- a/hw/alpha/dp264.c +++ b/hw/alpha/dp264.c @@ -71,6 +71,10 @@ static void clipper_init(MachineState *machine) memset(cpus, 0, sizeof(cpus)); for (i =3D 0; i < smp_cpus; ++i) { cpus[i] =3D ALPHA_CPU(cpu_create(machine->cpu_type)); + + qdev_connect_gpio_out_named(DEVICE(typhoon_obj), "cpu-irq", i, + qdev_get_gpio_in_named(DEVICE(cpus[i]), + "timer-irq", 0)= ); } =20 /* diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c index 5dadfa7691..a40f690ed1 100644 --- a/hw/alpha/typhoon.c +++ b/hw/alpha/typhoon.c @@ -26,6 +26,9 @@ typedef struct TyphoonCchip { uint64_t dim[4]; uint32_t iic[4]; AlphaCPU *cpu[4]; + qemu_irq cpu_irq[4]; + QEMUTimer *alarm_timer[4]; + uint64_t alarm_expire[4]; } TyphoonCchip; =20 typedef struct TyphoonWindow { @@ -187,6 +190,14 @@ static MemTxResult cchip_read(void *opaque, hwaddr add= r, /* PWR: Power Management Control. */ break; =20 + case 0x07c0: { + /* ALRM: QEMU-specific Timer Alarm Register */ + uint64_t cpu_index =3D attrs.requester_id & 3; + + ret =3D s->cchip.alarm_expire[cpu_index]; + + break; + } case 0x0c00: /* CMONCTLA */ case 0x0c40: /* CMONCTLB */ case 0x0c80: /* CMONCNT01 */ @@ -352,7 +363,7 @@ static MemTxResult cchip_write(void *opaque, hwaddr add= r, =20 /* ITI can only be cleared by the write. */ if ((newval & (1 << (i + 4))) =3D=3D 0) { - cpu_reset_interrupt(cs, CPU_INTERRUPT_TIMER); + qemu_set_irq(s->cchip.cpu_irq[i], 0); } } } @@ -439,6 +450,19 @@ static MemTxResult cchip_write(void *opaque, hwaddr ad= dr, /* PWR: Power Management Control. */ break; =20 + case 0x07c0: { + /* ALRM: QEMU-specific Timer Alarm Register */ + uint64_t cpu_index =3D attrs.requester_id & 3; + QEMUTimer *alarm_timer =3D s->cchip.alarm_timer[cpu_index]; + + if (val) { + s->cchip.alarm_expire[cpu_index] =3D val; + timer_mod(alarm_timer, val); + } else { + timer_del(alarm_timer); + } + break; + } case 0x0c00: /* CMONCTLA */ case 0x0c40: /* CMONCTLB */ case 0x0c80: /* CMONCNT01 */ @@ -801,7 +825,7 @@ static void typhoon_set_timer_irq(void *opaque, int irq= , int level) /* Set the ITI bit for this cpu. */ s->cchip.misc |=3D 1 << (i + 4); /* And signal the interrupt. */ - cpu_interrupt(CPU(cpu), CPU_INTERRUPT_TIMER); + qemu_set_irq(s->cchip.cpu_irq[i], 1); } } } @@ -814,7 +838,7 @@ static void typhoon_alarm_timer(void *opaque) =20 /* Set the ITI bit for this cpu. */ s->cchip.misc |=3D 1 << (cpu + 4); - cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER); + qemu_set_irq(s->cchip.cpu_irq[cpu], 1); } =20 static void typhoon_pcihost_instance_init(Object *obj) @@ -823,6 +847,8 @@ static void typhoon_pcihost_instance_init(Object *obj) =20 s->cchip.misc =3D 0x800000000ull; /* Revision: Typhoon. */ s->pchip.win[3].wba =3D 2; /* Window 3 SG always enabled. */ + + qdev_init_gpio_out_named(DEVICE(s), s->cchip.cpu_irq, "cpu-irq", 4); } =20 PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa_irq, @@ -843,9 +869,9 @@ PCIBus *typhoon_init(MemoryRegion *ram, qemu_irq *p_isa= _irq, AlphaCPU *cpu =3D cpus[i]; s->cchip.cpu[i] =3D cpu; if (cpu !=3D NULL) { - cpu->alarm_timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, - typhoon_alarm_timer, - (void *)((uintptr_t)s + i= )); + s->cchip.alarm_timer[i] =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, + typhoon_alarm_timer, + (void *)((uintptr_t)s += i)); } } =20 diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c index ff053043a3..7f908a98c0 100644 --- a/target/alpha/cpu.c +++ b/target/alpha/cpu.c @@ -27,6 +27,7 @@ #include "exec/target_page.h" #include "accel/tcg/cpu-ops.h" #include "fpu/softfloat.h" +#include "hw/core/cpu.h" =20 =20 static void alpha_cpu_set_pc(CPUState *cs, vaddr value) @@ -203,10 +204,26 @@ static void ev67_cpu_initfn(Object *obj) cpu_env(CPU(obj))->amask |=3D AMASK_CIX | AMASK_PREFETCH; } =20 +#ifndef CONFIG_USER_ONLY +static void alpha_cpu_irq_handler(void *opaque, int irq, int level) +{ + CPUState *cs =3D CPU(opaque); + + if (level) { + cpu_interrupt(cs, CPU_INTERRUPT_TIMER); + } else { + cpu_reset_interrupt(cs, CPU_INTERRUPT_TIMER); + } +} +#endif + static void alpha_cpu_initfn(Object *obj) { CPUAlphaState *env =3D cpu_env(CPU(obj)); =20 +#ifndef CONFIG_USER_ONLY + qdev_init_gpio_in_named(DEVICE(obj), alpha_cpu_irq_handler, "timer-irq= ", 1); +#endif /* TODO all this should be done in reset, not init */ =20 env->lock_addr =3D -1; diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h index 45944e46b5..1ae1c40ce9 100644 --- a/target/alpha/cpu.h +++ b/target/alpha/cpu.h @@ -241,9 +241,6 @@ typedef struct CPUArchState { uint64_t scratch[24]; #endif =20 - /* This alarm doesn't exist in real hardware; we wish it did. */ - uint64_t alarm_expire; - int error_code; =20 uint32_t features; @@ -261,9 +258,6 @@ struct ArchCPU { CPUState parent_obj; =20 CPUAlphaState env; - - /* This alarm doesn't exist in real hardware; we wish it did. */ - QEMUTimer *alarm_timer; }; =20 /** diff --git a/target/alpha/helper.h b/target/alpha/helper.h index 954a5c8294..c76b20eb8d 100644 --- a/target/alpha/helper.h +++ b/target/alpha/helper.h @@ -96,5 +96,4 @@ DEF_HELPER_1(whami, i64, env) =20 DEF_HELPER_FLAGS_0(get_vmtime, TCG_CALL_NO_RWG, i64) DEF_HELPER_FLAGS_0(get_walltime, TCG_CALL_NO_RWG, i64) -DEF_HELPER_FLAGS_2(set_alarm, TCG_CALL_NO_RWG, void, env, i64) #endif diff --git a/target/alpha/sys_helper.c b/target/alpha/sys_helper.c index 0e0a619975..73f26a81d1 100644 --- a/target/alpha/sys_helper.c +++ b/target/alpha/sys_helper.c @@ -56,18 +56,6 @@ uint64_t helper_get_walltime(void) return qemu_clock_get_ns(rtc_clock); } =20 -void helper_set_alarm(CPUAlphaState *env, uint64_t expire) -{ - AlphaCPU *cpu =3D env_archcpu(env); - - if (expire) { - env->alarm_expire =3D expire; - timer_mod(cpu->alarm_timer, expire); - } else { - timer_del(cpu->alarm_timer); - } -} - uint64_t HELPER(whami)(CPUAlphaState *env) { return env_cpu(env)->cpu_index; diff --git a/target/alpha/translate.c b/target/alpha/translate.c index 4d22d7d5a4..cfe84f28bf 100644 --- a/target/alpha/translate.c +++ b/target/alpha/translate.c @@ -1196,9 +1196,6 @@ static int cpu_pr_data(int pr) =20 case 40 ... 63: return offsetof(CPUAlphaState, scratch[pr - 40]); - - case 251: - return offsetof(CPUAlphaState, alarm_expire); } return 0; } @@ -1280,14 +1277,6 @@ static DisasJumpType gen_mtpr(DisasContext *ctx, TCG= v_i64 vb, int regno) gen_helper_halt(vb); return DISAS_PC_STALE; =20 - case 251: - /* ALARM */ - if (translator_io_start(&ctx->base)) { - ret =3D DISAS_PC_STALE; - } - gen_helper_set_alarm(tcg_env, vb); - break; - case 7: /* PALBR */ tcg_gen_st_i64(vb, tcg_env, offsetof(CPUAlphaState, palbr)); --=20 2.53.0 From nobody Wed Apr 1 20:45:44 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=yodel.dev ARC-Seal: i=1; a=rsa-sha256; t=1775063144; cv=none; d=zohomail.com; s=zohoarc; b=EKIoKtQbHK6XOuDJFpaXKRsOF3BSjXnpS8nflvcXWZi0+2NpjSZgmRn0A4IaGTG/u5cdfjknaj4Zp70hCeijEQikIOupppT7O+W60IsIHpoiq2MGM5EjEwcOPY+Xg0HdJsjNP8Td5hafgvCPtu7mO65meMVkvzQ2QwtoHw9V12k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775063144; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Ly9fTN+k3D2tY74fXdeNHZPUjIqbnhD+eRKUBdNZrJY=; b=M6TMT/a5enD6CF1r+NWXOKlwlZ5PYRj325mC1zcwlVqFwPFpVpG4kd92wTQ2vhh64AbIEGBGFlphP32hvlh8NDUwV0xcbjGSEoUnO9qLzGwdSLrEhXiYnVrNVQ3O7JtTx08ACFe6BRlsXpd+bByO6wrdJ8yCcjzc9VGc5bDAp9I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1775063144704141.18729943242363; Wed, 1 Apr 2026 10:05:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7z0S-0000wu-LD; Wed, 01 Apr 2026 13:05:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7z0E-0000rO-6k for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:15 -0400 Received: from v58.v5f06b487.use4.send.mailgun.net ([143.55.232.8]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7z08-0007tH-8H for qemu-devel@nongnu.org; Wed, 01 Apr 2026 13:05:13 -0400 Received: from mail.yodel.dev (mail.yodel.dev [35.209.39.246]) by aaac95d988df8a5b7476f90d482c0863d3bd26acbd0c843086e3698f5097df11 with SMTP id 69cd503b9007a2d487a6f3c2; Wed, 01 Apr 2026 17:04:59 GMT X-Mailgun-Sid: WyI4ZDFlNiIsInFlbXUtZGV2ZWxAbm9uZ251Lm9yZyIsIjk3NjA3ZSJd X-Mailgun-Sending-Ip: 143.55.232.8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yodel.dev; s=rsa2048; t=1775063099; bh=Ly9fTN+k3D2tY74fXdeNHZPUjIqbnhD+eRKUBdNZrJY=; h=X-Mailgun-Dkim:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:From:Reply-to: Subject:Date:Message-id:To:Cc:Mime-version:Content-type: Content-transfer-encoding:In-reply-to:References; b=kmPE1djy/Uk6zck40ecJ+eLldRhc32BWfflpH1vpTWbPRNt+OgzQFa1uk6p/JZdeW rP7oFJBJEngy86BexQuEWx4QcQc8mzqpyTt5EnWkq43kcC0DWK9NnNl71oH6FnP/+P fmWksEqPckwgYMbqb9wX3C5qVeh2H0QOqdYJNKGwBJO/n0zEohuNvEehVkHmfEuzyu s0mA2LRYgrXfgAw7xaWmnq3gnjCi2kWJ7WzJauaeigxnACSDZ9B4fAj9KrDCtvJMeW 2EHD0IJGuUUNux4Cgt9LeUu8vrmPCVDhi7dmWs3lczjKPgyYXHW/e96nmMAM8Eh8GE n6r2YFVarRFGA== X-Mailgun-Dkim: no X-Mailgun-Dkim: no From: "Yodel Eldar" To: qemu-devel@nongnu.org Cc: Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yodel Eldar Subject: [RFC NOTFORMERGE 4/4] pc-bios/palcode-clipper: Replace qemu_alarm with Cchip register Date: Wed, 1 Apr 2026 12:04:54 -0500 Message-ID: <20260401170454.32045-5-yodel.eldar@yodel.dev> In-Reply-To: <20260401170454.32045-1-yodel.eldar@yodel.dev> References: <20260401170454.32045-1-yodel.eldar@yodel.dev> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=143.55.232.8; envelope-from=bounce+0e9322.97607e-qemu-devel=nongnu.org@yodel.dev; helo=v58.v5f06b487.use4.send.mailgun.net X-Spam_score_int: 0 X-Spam_score: -0.1 X-Spam_bar: / X-Spam_report: (-0.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HELO_STATIC_HOST=-0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=1, RCVD_IN_VALIDITY_RPBL_BLOCKED=1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yodel.dev) X-ZM-MESSAGEID: 1775063146349154100 Content-Type: text/plain; charset="utf-8" From: Yodel Eldar This commit removes the qemu_alarm function call in favor of a QEMU-specific, non-standard Cchip MMIO register at offset 0x7c0 to facilitate the move of the timer alarm from the CPU to the Typhoon chipset in QEMU. Prior to this commit, modifying/stopping the timer required calling a QEMU TCG helper function (helper_set_alarm) via mtpr of qemu_alarm in PALcode; now, writing the absolute alarm expiration value in nanoseconds to Cchip+0x7c0 replaces that functionality. Likewise, reads of Cchip+0x7c0 return the alarm expiration value, as mfpr of qemu_alarm did in Cserve_Get_Alarm(). Also, CallPal_Ndelay() now stores the delay value in the MMIO register, instead of moving to the qemu_alarm processor register and triggering helper_set_alarm() in QEMU. Signed-off-by: Yodel Eldar --- Notes: This binary diff patch is not intended for direct merging; the previous patch needs this change in palcode-clipper to function. The source diff in the notes below are the changes made to the qemu-palcode repo [1] that resulted in the binary provided here for convenience. =20 Richard: If it's alright with you, I'll submit the diff below as a PR to your qemu-palcode repo so that the resultant binary can be squashed with the preceding QEMU patch that requires it. Suppose the patches are approved, does that work for you? =20 As mentioned in the cover letter, I intend to fold this RFC series into the "QOMify Clipper and Typhoon" [2] series as part of its v2 re-spin, so any comments/suggestions on this and the patch before it would be much appreciated. WDYT about replacing the synthetic processor register that triggers the helper_set_alarm() TCG helper with an MMIO register in the Control chip of the Typhoon? =20 Instead of creating a register for each CPU, I went with a single banked register at Cchip+0x7c0, because we get the CPU index for free with the MemTxAttrs patch. Would we rather go with ALRM{0,1,2,3} instead? =20 [1] https://github.com/rth7680/qemu-palcode.git [2] <20260310-qomify-alpha-v1-0-4375b00a85ff@yodel.dev> =20 diff --git a/core-typhoon.h b/core-typhoon.h index 96a0a90..f4f4414 100644 --- a/core-typhoon.h +++ b/core-typhoon.h @@ -58,6 +58,8 @@ #define TYPHOON_CCHIP_IIC2 0x0700 #define TYPHOON_CCHIP_IIC3 0x0740 #define TYPHOON_CCHIP_PWR 0x0780 +/* QEMU-specific CPU timer alarm expiration */ +#define TYPHOON_CCHIP_ALRM 0x07c0 #define TYPHOON_CCHIP_CMONCTLA 0x0c00 #define TYPHOON_CCHIP_CMONCTLB 0x0c40 #define TYPHOON_CCHIP_CMONCNT01 0x0c80 diff --git a/pal.S b/pal.S index 8d55a0a..7ea4080 100644 --- a/pal.S +++ b/pal.S @@ -422,9 +422,16 @@ ENDFN CallPal_Draina */ ORG_CALL_PAL_PRIV(0x03) CallPal_Ndelay: + br CallPal_Ndelay_Cont +ENDFN CallPal_Ndelay + + .text 1 + .align 3 +CallPal_Ndelay_Cont: mfpr p0, qemu_vmtime addq p0, a0, p0 - mtpr p0, qemu_alarm + LOAD_PHYS_CCHIP t0 + stq_p p0, TYPHOON_CCHIP_ALRM(t0) =20 mtpr $31, qemu_wait =20 @@ -433,7 +440,8 @@ CallPal_Ndelay: mfpr v0, qemu_vmtime subq p0, v0, v0 hw_rei -ENDFN CallPal_Ndelay +ENDFN CallPal_Ndelay_Cont + .previous =20 ORG_CALL_PAL_PRIV(0x04) CallPal_OpcDec04: @@ -505,8 +513,8 @@ Cserve_Get_Wall_Time: hw_rei ENDFN Cserve_Get_Wall_Time Cserve_Get_Alarm: - mfpr v0, qemu_alarm - hw_rei + br Cserve_Get_Alarm_Cont + nop ENDFN Cserve_Get_Alarm Cserve_Set_Alarm_Rel: // Cheating here: create the absolute time and fall thru. @@ -514,8 +522,8 @@ Cserve_Set_Alarm_Rel: addq p0, a1, a1 ENDFN Cserve_Set_Alarm_Rel Cserve_Set_Alarm_Abs: - mtpr a1, qemu_alarm - hw_rei + br Cserve_Set_Alarm_Abs_Cont + nop ENDFN Cserve_Set_Alarm_Abs Cserve_Get_VM_Time: mfpr v0, qemu_vmtime @@ -534,6 +542,18 @@ CallPal_Cserve_Cont: bne v0, Cserve_Dis hw_rei ENDFN CallPal_Cserve_Cont + +Cserve_Get_Alarm_Cont: + LOAD_PHYS_CCHIP t0 + ldq_p v0, TYPHOON_CCHIP_ALRM(t0) + hw_rei +ENDFN Cserve_Get_Alarm_Cont + +Cserve_Set_Alarm_Abs_Cont: + LOAD_PHYS_CCHIP t0 + stq_p a1, TYPHOON_CCHIP_ALRM(t0) + hw_rei +ENDFN Cserve_Set_Alarm_Abs_Cont .previous =20 /* diff --git a/pal.h b/pal.h index c89a18c..c37a85e 100644 --- a/pal.h +++ b/pal.h @@ -107,7 +107,6 @@ #define qemu_tbis 254 #define qemu_wait 253 #define qemu_halt 252 -#define qemu_alarm 251 #define qemu_walltime 250 #define qemu_vmtime 249 pc-bios/palcode-clipper | Bin 153728 -> 154432 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/palcode-clipper b/pc-bios/palcode-clipper index aecb30403641e1f2acac0bfd472174d06fa1da5f..136acba625dc725f545ac915490= 15579eaab4552 100644 GIT binary patch delta 35340 zcmZqJ$a!EJ=3DL8KVhp*qF=3DHDeqYWdY<8)glMsF4_o&z7J3otVpOy9%A z=3D)?GGIwvz@JxF|ED56dbz*M^1BhouX~-M)u~(S=3D)J6NkcORt9;6KMeoN_j5pO zF`Vuwz*x_CembKdqy08P#sEgfAJYSc7|j`bws#6KuI6Mkn{Fz@c$>#YL{Y(!P0@*g z;bHc~Mz!ruvW&}^7}KV|lxLJ@Oq$NAz-Z4HG~H8yv7OOq`b7msaYpm$2c;Rsw<$7q za55g+-l@fC&&pE7pm2Hm9%e?9=3D?4TDIe2&->=3DhKZD|;LeXRMumMu5?X>7V{I14e}a z9)<^pp8_JxLw&WwyQ)1MkKTJteL0VBh1^#i}Bs~IyUF`l2^Y0N0icyszvW5&&b-(#j+!r>nFDh`bG3N5w|-2eZNR|p7FRFGiE+~ONrucE~B$X!uf z#Us!)Sz)PZg9F$ICq)&tZ_1ty44E64Kcu^IFlcVs5O97ABkLpgc?=3D7_EDCLKC}ME< z!o<+<#h$@l!Gb|^3lqbB1qKCs1qFte+Y=3DaGZr5PYOxdErV6R}npt(hf!CoPNL30a( zh`mAtgXR_vhJ+`KEdSllFwR$CWKdK%z}U6r1LLYK1x#Lwi&zsKe*KSs;=3DmBE63}3~ zq-R^Br$@tIjSL3QEzkMlRVFZGf-P&<~Q}^_#QD44(fAH+V9)2sG3#>EQ0%qVi4IV+N1s7ABVe?hANUZdt*jxkZ6- zr2-?%OZOK%nHpOp8fupuV0gJ@15f9c6Fiz*FYuh)@`ERH3j;&r5)KAMg~hC@4ooaA z)BVjD4MiCzD7bJl>{n#NhCRongPi(M<|2^-%rs|NkEb#T_V-But-b&X~*?IsK2oa@qgnra-K+d!`a%mv?dckpj66&SzD_r@WRzokGCkCiQJ=3DA3daEU)KlcX) zNRnB|sy+R_C8H_RgD=3Dy?tQeITji*~$F?KT=3DOh0PHsLgm{`bR6q`soQ)j2s%z|J#29 z+1#LNuf)J8uXG=3D31W1g5A#OPbgWXaFmjCY46|5N*z*;0PL$!dEyC5k)JAI)wqd4R7 z=3D{v0%wIyPpG7DL?9YKbD`)~h5;hUr9^agiEk!eZdo zhX6y|QVE8-rAFV~y%ZScEp1>ia+@Aw%_uQF#D-CT(P4V34WoX&z^A>+%q$<=3D%@`OM zG#d6Q{AHS;!0>^=3Dg@xgXGXsO`5;hhW2T@S2Wl+;#{9y0G$)NB7l-ogW5n%c6ZU@en zu1gqMTpSn}6v1kK{@Nv4CEu$Z!!1PvI#(Jg+AEvX}G0v<1@P4nd!&^fI35NX&d<+Ut4hY#R zEaX*mGGS1767btlA%S7P0tbV_lMO5oaXSWuCs+O%Dl{;_$QNq;t!??3V)a`C~z>ma0Z108^bf_zf1y33=3D9vK2rztb=3D36tjjT#eM?)0cPX7N7E`C7)yWpFlk^w}G+hI_CVc4y{;oV+kSgKq* zoza2OnJMAjbT6F8K=3Df3hWI{HVh3(HXIE~CjbBM zRsH`zR`vh?xvKyF*Q!QXtyP?4<)s*F)uWhhm95CYcwdo$;a@$tsAge^R}y4->kdjx zoGky{8UDqi6yqTA=3DYJ7mzy8a=3DU}SjUylAVUgE)i3mqmLO9c&pKo-7gt(_a>bDmn-< zD12dLc&WIE`JJO4gToUC20H~%_%JfWD}l@tWYKisWQln1&cGmO@dU~6$It=3Dwo*FAhrMh+o~}`J(O%^sPzB8rs5ie9zp%p zP=3DjHfncm>U7{KU0{h||NGE>0o>1NK1ag1Tpr#dsfuV;9*SNXvId&(RPc3T-4>{SIA z;W4fFmmhq!AqHs;=3DG^0*25pNw(69y7G!tG-S94?3GZ157c;>)hr*uU?Ude%Bp5>JP z@s~9j7`_Oxyme<}uvZdbdF^ifKmPK9PKu*8l#wb#M6R7|I)dRPY_+aNf->W>MAy#9<|9i@aDE;8h!}8HR z0qj&eB~WxTFvM+VEOc-IB>_-WbFqAKXB1I$0Y$kZL!5;JgPld-|M<&o;M(Ay{tIS# zrF3?OdT?%aV6f8w#WTqNAVZlxSi3NOuyr}elH>}~=3D=3D?waGB3*mcX0-WFN}Y66kHh; zp78zEQ8>X6ucXAF@I>&#d{i3BZGp%v;X!_7#O%L7RvHCSTQI( zSs2UeV8fvBMTNm$MU;U7Qb-CYs(_kojcf`YrVI)Xkj+^GHRsBI`zMSHTo#uR(NVAe zf;nF4KhzOH|Kl&8{xAP!0YAbKbD^3+`5fek6ma=3D39`Q!c zFO2qzJRcfe`B;1$*%=3DzXZbw+C4>E(1!Ao%=3DtDob>|Kavugjim>3$j2AY=3DT<$?Z5q( zmH+=3DARxA{C0JRGjnkzV*{%`+Qo~5~xM6R0;~-#Yh%_5}3gBubzzhI_O1!rlEr4 zSvEwDWdr9}?Ii*%uiU2xcrlhZIy~8{%*gV=3DU5Mo)xWp4=3DdFZYVH5_EH0+KukBX_JOHIXkfqZ-ycr#I6&U_m$Nh`H{Q1B97X=3D18jfGpa96o>=3D zPYiZSs~P2$!v8_i07&lD^o`z(;+h~WFaO0~egxAJYU*(Rzx@*-mjCWw!Ljz=3D{o%j( z%eSV#^=3D1_Jy7e#q^5y^XUtkTdLkCxNj0Rf^1BQFb=3Dl&sTYFK!Jyt(1g zbTc1DJKlmvdzBeKFt{x=3DRdC>%-sr<9Ez8K_=3D)ebRRWUp)zQCdE!oaX`0Vt0zcGYHtLFfz(?KFi#QYF*Wgro?Yb+ zJVBB2|G%snH^Vb$p%2ck!XF;EW?Bg-v9NeMFtd0&FtK<$WH7{SV_;Zf#KfR%Fj4%W zCl||qcP<7e13`w5&WdFU9;Rgryp+luJQx`4wj?mbZ4qI49A|EDj=3D^2&Xxm4FiG2L;!aQxzPQ4HFz#Sf)EDGbTAOGdQ~lF+6q#u^AZ3 zHZU-_Y${-|+tLSdJ-7i>z+kuJ0=3DUZYTf#U&!2#qEkb}WAi?#zO4KOe~+zj&E$^Z6W zU?B|hB%=3Dq*Yj@W3&E!A^;Z#nE92>kRmfHX0FY~iJaIgF?{{m!3 zE3^mzB~^y$PyHF?nI7Dm&KAHZ$8_M{bhQA+JjQ_OQv(?F85O1<4PdlqdT@6-TOgw! z(}cUz!vY!g7!#(q1~Te18cg3B$QaLb;m&liAjUk9Xb_`+y}+Hl%AgiF1B2s|Tg*xt z0u1&F2bh&C4l*l&y9Rs=3D43C@z6r38rDR|ssZqi`>Q12qbFkfLJi?YiB<|YdT273j; z4~lLFn3b$R`ao$B7D9|4^j!?UD|j)o7`lK$6eJH)528Wp7#Vgmt53K+JuH|p4&=3DOG zMn@(Vr|Ca}8D%mq+yc2PR)K**X~}VBMJqW5hi5058#NZ2Iyf;i7$`6>Ot4^JXj*cT zxkZB!iOs|?!9tiJ;fqnAgOkxWM=3DxfUASY&)A_q2xWCZ~hW+za7U|>jE!pxwkaFRJ$ zW4cTzqa2%o!5u1{wRXS8EV zxIW!2oY9U^VR~ygDE6;SKNijy$JB6byIKUJAEUm(RgiIa6&x5o7;rIcPymg2Ffh0+ z;b3^~%*b$D=3D@xU6251=3DK2y>DJGmHE5`H_si^#agR4HlIk4NNTV4$L3yT^JdbDli%- zI503IS%A_rNbdjtR*l7`ptKz3z`)RC!OoEIWs#|p!$)wgbz36DV6Onu2QuRwI6j`+bw2ia03YDU?!G>ZXgRm4h0zsa_9kOXNyHsl^j5hJ;2;- z@$G;7lLO3;t;`t$z@c)Bxmg3EfBLy7MhUA$8cR$S9nLc^w)p;k{u2fU0}XbTbcZ9% z$`*_a1{w?u>J|(PYD<_H0yNGsJ6bTZXgIJi1Zc1^I9g2q5WpzPczL>6G~*$~EzI{7 zt}y>sxXLWA$i+|qwu;r@fLlAuGMBB)_Z2#(OU5u}GcrtXjbXHBI&g9Nu^2`*##7VZ z#xSZ|9{3IEdM%V>01u0mgBxF-OBBT!Jro%1lmrYI96()FP$|X5plAT{C&OPwg%8sM zV;RM#=3DfpC~$YestFu-Y_FnG0%APhSwrD8ZO8eP=3DAA3!7k)3-gEi?f+vL zRT-HQ&QDj1XN+@YIKNjJ)OJ;15KscOU$q$poj~0Z9+pq;pmr*#eY%jd$dQlbv%3Yu zzpbElEI-R@cV3p)?x40TsBNn`{cJp=3DG=3D~|30=3DW2`{wAJLqTb~j)N7(D@Szn&!4}6w zoG%@<862MIFhYi01X

J22R7(FtsD)MZ@lsPnDSQ`c~TqX6q0cSZ&uC4PpLjsh$J zj{pCADQYr;t0jF02D>F7?;5iDIPx+)1e-6!@*dpGQG?h!y*YtVvpxV?e}WW4;{KmL zD2H5ywsSz@ybKE+LAA_NaKink4=3DRZloZYKz0Pe8GD}X`+6cP&<>=3DbxdKDdKI0OWIC zP(u&ekz2uFw`~JM+_oJIb=3DwXw%-eQ?Vc)g@2D|z#pkx)n5VwJm;bCzYgTfO~$9+qJ zmm)t}j}Fo`eFOFZufYOGZk9LhufIY<5adWk25k*ShHgcWIWC}f^HvpykN@qTfYgEd z^$HC2N-Qk@-5D9YH5eJP6&V>G6)%>p*LToiNO-ciR>y&hA>oVSL>&iENxf*gl7kw9 z!xKjqEzqda0!EgF&Y;n3SO_f^RdZOxknm-(teS%fL&6s&LpN~NT_o=3D4Ai?19L{U)9 zfs^53F(X5^hN57a12eqq+5P^iu!{R-l zZYj%KP}G3O0%2{$=3D@Z-;IT9~G69LS73%9B`K>8v7^g-QxP}qZp7S>rADuKej7it5@ z^o9TbAC6#%TM)otw}e^1(Seag$svNFZbK16!xIJu#U&D;;jrl+Qy8u5xfvc{RT>6X z+PGAQq2a3mgS~=3D3gPoE;gPjG)Qw9ujN(`XR8w0OHCDcuTXa)c|jg#Sl^9ryYu=3DB!D+@}e(bfIK}<3n(t3*y%VhPrJq|8B4{RMKI6 zb|7zNZE7#IvKKK`Ho6*Np{z)-IQN}|co{Kde~xDe#59eA7tiUu9VH_lQJ zr|E&4av-p# z10F77jSegJ0=3DXSwpzDS||AUlR7?vu422mE4J2>%!^qV?3 zf%;Vp46YU+Juvl*3>y>}7y>N*{|{1P3|QbI1R9f@u)yWQfBPpOy$}Dp+katTKp1)o z9B}{iVFoNTb#Mat_$4UoFd!TUs=3DgPRJ2?INZ~x@l|M+JQr_W4dlnyasaCpMWknjZL zW?cq{cMJ@H8lXNp*nS4k@R*|o(+35YAOGXOEc)xtV{rJ=3D1a(8YxTAwJTc88T4Gat$mvAr`DzUI!bXdfy?8LyZ zWD96I2o#~92xMeYcX;qW{v8v`V|Qj2XD3BgB~7qXU=3DCnlIHbYKqU6BH;H0pG6*K~W z)Z*9w`Ab+osP*Y&?|NnNu z35+ZFw=3DG}{;8zN8W?*3W^Z)+`2MB$^0z&IpLTIL}=3D|$@q^|&S&L--b~6C1^*A6U;Q zzy(uk!2%Ux6FJ4kz`y~X4H2+~s9(Vhm#pQ2NgjY&*1`mrtl@!4GPpo=3DPT>Gaept`Q zE-VC-Ti^qcTZ1sQOcW*=3D5CD;!!4J}SU_B!nx0o(W^279x8yHntCxZkgHj09Lz$Wqo z!~;7wAOWH`1?D|A?!|gAy$7ZjZe&yy5z>bVTu6ne_F;tCBoYmmR7i(N_JAcnY-HrE zf55=3DNAPcgGoq>S?5t1Mg2xd)TWME+0%*Q$tL_gqVy~4o2!1Pd*H5)`f5@iMXo6(Aw z^$-IC1EV!BUqNyb1EZ}lC-aK+5Zm}Sfn=3DP;7!){}85$VDaVoF~B<9LKy=3DD`m9Mf@z z>2o$Q>eQEmjC{k(xPpm+f$5eQqYj9^A;wqP+?>Si+MoBSQr@?jG$sEP%(Z+ z1_mprSOru}ijjdqm64elWZnd*7$h$;FsLztg=3Dd&BFibzPg;6+a4pad&3K+B)!FDcy z3ac_QFz7(dS^^b=3DDbg^dB89Aqe zSTc-^oFM-)iZC*=3DtObcoV`O9jWd+6#Mn5evlM_t zf*F}vmV-pR8K*06V-%^cXJTMrWnkoRW@KRC1m|E~1_lOD4n`Dwkc8IC!oa}V!^FT~ z&&zt3k%7U6msOC7fx()GYY7tr1LGA&254ajavn$v;~Z`ckjx531#3v+yut_)XJBBQ zBgx3Xz#huTP|r{RmFs3?VA#yZk;urva04nN15wSeaX$kC12ahG4pc@0D&xw)QOwA| zpaIGP~i@c7$}P8d;u8*k`l3kgg>aL z0?8UPuz^CezzUjAL3I&GoNRD_V z85kZwg^^Snf|39<7I_#z_Jf_uu$~!`4nYopq(e|K2TF&CIu_(a1_m281_mx@O~MT- zrWw207C@_7SV%F>VFsnt@C18^#~nbnf-PbKMQj5T1H&4yRQ><|(M${sbxcg{ObiSU zz+(UZ7cem}v@Oqc-fJ%S@-WzPf1gHp_ z2`iw&u*~4X#K6Gtn-P+8wLv);T!VmeJt*fQ8o&@|w{bEsu!u1;Fl^yt0W|?1@G{qf zN1{p_4-iCRnf|=3DM*mawQs+0?a`~ zga|XEK8T^q$jJB&WS%-BBO@0`M3Iq^Q5nRLW@Kda2c^c@BFv1jAV!!7Gh;G{;ULS* z=3Dm}z&i7+#Sut6gDFEaxJKRAN@AWejN21G9g;@8bw3=3D9I$vRM$?1m^@bsXs6VctfHK zQ50`vWMJR|5eZN!YZeBEUyQ8mXIU8-U}Ets3=3DCTs`458pFUp1x&u3v^sE-$AWM*Sv z$bsr_VPRlM;$#FVTL2YW%)-Es%*4RFl!bxe0#po^1a>iUgT+5U#bGJtFe5iRsQTss zbw~dE|G$off#D(}w;Uq_1IG_W1_rozJqrUv8Y2$_H%PS!R5i@>TZ}=3DV>KCK|T?($p z1F8qsoO!_52GfHs1=3D7O>vZny5XD16oJ;Mt|Zm^S(1i>z1VBk5y%)qdbk@FEV149<0 z0o04Il*%{309AX7 znSp@|8ZTR*VlbBlG4e35t!8FmxO>12Y;yhoACP3nz&OW_nSp_KG7AI44~X1_C@U#KXWhhlPP50P6HUW(I~QEZ0~OA~Ts87-sUTf-(!p;V^|um>C#?IT=3DOk z*%%l)pqh6wGcW{*GO+TnF)%EEiou*Po0EZoO`e5;VHYgF_`usEpiIRA3M~at74hf) ze^7ODgR>Q8CrtP{69a=3D1GXu*mM>PFkIr@08%T*#=3DsB&6$c5+a4~>0LIG6l z1rr0qK2fkx2UO?-69dBmalT)y3=3DBF@q2Ejl40{+sX2C?5m>C$vxEL6OSwKl*8KZ+2 zIOzYM0CfUEq0cx66zY&*gUUT+W?)#w841z=3D4mPMTsP6*`HZ}%^8Big9Q1FW~fOGK% zsF)NB1H)=3DgMo>VWfC{OyFfgp)1gp9L6*2(j|FxV9OglinU%<%7lm%i;V`OCN0Wo?Q z8QHp+85ptyTp7G%)n5{&%w$7aR^LU5*p2H3=3DBJM=3D{Ezax|x}Q!BLcf6;vXwfr`NlZV_Q%x&{iV zC`Lx6Ss;ctBO_B4h+)IX$YcYGJq1Q)rf?8LijkS=3D3rI?Yk(nugg@J+Tod`2iJ*c_F zbX0^{1lC|;astV<%QB0C$`=3D7>(Sj&-z$K0XR2Y`8K}8$GJWwuWVC3j#Wnf?fS27Wh zN`?V38V2$>14D`c0|R>&$ewy>J`NUE1_qYbJe;8M8^$S&3w$B5y#`uDG0r&(YCNA~ zWMJ3;mHN%Xz%Z)~RG++IWMJ3<6%}P=3DU~m^;-~uTR0M&1Q{{PnpMd@r-Mo_cj4phvZ zm4P9Nmr;O;f#FF#RLq~1fgz6_tc(RTQuF8k|0q@lhJ0RTkTM0R5Gf^%D~Xt1?m`p%!7$u0cCn2W_Bh9hCfh+F!$*(GcbbMS0|w2FIgEFdc+w)?W8kM zp`WY_41MB^_5VOU5U3a*8w0}xP?KRcD8U3UGO{MJFfbUgK4f8F&|=3D!h!oa|+AkNIx z1&TN`ab_lNRt5$pLkVW43m_3431+5GAcndKGt(LnLrH|0sRG216=3DCKEc?gyc5FO?E zWKeGvOF!I72_PRkH0{Lud*;OSn_}aTL+pv z?y!K92g4k3NLwhKje$V`GU8bTO{a)~S&)$o400k24D8Uh5Id;V%d~}$9n|b)dceyL zYI`z06lI5we1g+6vos&O4Lbt^%K||jHxNBTmM&@f#C;Kj+K*v!IVjYb0H4{LrfebKL~I#FgP(WUjvPcIEtZ)%QCVu zFnNkGFcd%)!-@!3CT0$hAr)xi?o7J+us%%V1{QFDL&dc@85nM}GJ=3DFwK!sq=3Dy~_y}-hd{2A0%AQz_15R{2?cU5XhZJpyDvk zF~%`5GlATQE&&R82DUsl1_m{z0B8aNja!1!FykC4P}40!jDaBnD)ozlfkBgr7o1#b zz~w)v0}E2j0Ltd93~W2t7#Q9$GQ>c9jA-a=3D0F?kBqd1^aog54d9~oJ}M(IGsV7~sw z$O#s=3DK@;$UF73bjZBDh6}FC8$LvQ1Ms}28L^lkTCOr ziouGjTTnAfpyDty?m#`)5Dgu?gGtD_O?(Q}`6^KHJ?!-i3^N!x!HR95f-wKjga(!eRQxzQ1H){n zg%MCOnA$neFw8*{pU=3Dn%PHrVo@k{Is3=3D5$4Edhyv2k$^p%)r2~1R85QKoUr0;!>!F z18CyQpyFqs;;>Lz0d>q9s5s1#tD)+@Ac=3D$OABHuIoD6JB*clkA7z>~w51Qo#Ig4@5 zCr}K6N{I@nR4Y4Z(gITKG(g2Bu!Fi1tYE+PK*eUWGceRK@`J_ZK*g4^GcYtT@-eV2 z05xtI4I)7H|M~wP(I5-qWMBa2S_`O_Ds~2jB51JtK*eAgte8;O|L6Zl6{{PQs2Ti&_su2OGQLw8Q2&Y0vQXSQn1+?#yN+$7$7aQ3aAvM453l2HJv2$7Z+aWgQ0%YO-|lrzZx){Ly+y3GJ8 z2(!!vDsF)$ZVMH6KohrPWMv8zV_@(=3D6SrsN16vva758IjU~q(*Q6B>pge4sZs6+}> z9Of7&P~iS#V_?u_JP-y+QlO?jBuQoPFff3d_<& zp%O39#EqchAJD{&q2fQ##7&^$3~1gk1$pBZI|G9{;{uQtQ27HJWM-TLY6ydaY6VE{ z&;S1x>e4E%A7+&y6axgI5WQ|~DU^s9f7!rPnL{QGpz`zKy^aNB2 zrvDJ6dvXOT4E7kP{67o{t27ggeOp8un7zd496h`ynza@ zVq;)90WshMR0w9k8HfQtpu!xW_6I29&$2SGO0hFAtaO0NG=3DN0G$st+*>KzZL6wEuT zA!da@g<+0a!wPnK44Uv-KCo~BR2b%<`faS>Zd?UaypxTAVLL>q1u8U!je%hg#I7Ew z5KQ-Oi0}q9;fZO*!`T=3DZ=3D6?XqjDebIp!yHwQN}rs1sE8>N%03% zu9%I1VIjnL9yD_nL3}8JCcKy*>=3DPBJa2*>1!%~O=3D8c-pavzM?kuwDX<|1<=3DF;{VV8 z|Dd%+5Ql6LggRsa)FByc3=3DESX9@+sFf|)a!6C9>{(1fQzgik<)Vcwq(am)o2VG{<1 z84&N>fQrKmp9v9ufF?YPmC+K8PH@d7mEU91eOpkdzP4}p+u zY5;N|I9)#$f~M;qP$^itE`=3DDy0yPTe&N4_Q&y02PM0 zy^@uI)ryUQA?pCtM%Y>##yK&vJ{+hR6b_1ZV*yC?pu?yby*)RRvVaosEGZ8e+^8s1VH7cu2yU0~W6T{~u<2 zq5!zOTmu$I3@D^PqHqgT7^XUnm4Wp*8v}!%0aOB3Au`S>5rGDS1yl+a3;_@axj=3DbuB@VI0=3D9X!Q37UF(Cvh3^D-}03oaltUuWq7+e{k5{N|!FJX@1 zfJ(s};|?~eosJust`AV#GGfc%eC04TFEaDm3dnGGelW`oAXPl<4W zhH#jUituOVl{4&?;0MjHY!l}Ox5Yvr#Q~`E0t$M@IoHLYEg21{6wE?sODqB^3=3D5vS z^^ovMKof^H#d6SuA96BqgBlhMP;tb{BxiA`#T`&7n8na0)C{QbR-`5rNC?z&Jqj8q zgfy$RfW-d%|9^oE+=3DSu=3DjbJ7~+kJ=3D_Di()!Kr*0GO6&{_pz%u)P}8>oDu_@IZVY!o zg>~5(7(k=3DA43!KF46H^Bj2utd85o$rGfkk$Akcc1570qVSY7Z%nSp^(hl7D(mJFla z^p^XK+V!AudB&NHjOa=3Dk=3DP)FK3}#^DZ~*nW!RAha&J1L!FfcF%b1*Q>V~pWoV3^Mc z8s%TW0$N(k#LdOY%miAp_vinACeZW+A0sC-QxznJnLsN-1erLQnX(`P^$eiJo1pcY z%^VC2EMQyaLTy1T?gk|a28N|73=3DB*q91ILh2K-FW|NnhC8B!P)GBAP$ZhaWjI2afV7^^uL7$n$w z85kH~*2lnyj~GCc8z8rS1r3^l-MS3w)&tO`<*+8LjXDDZ6KK5%qax#h>4Fa#rRrfy zVEK(vm4|_4GRPzeMrH=3Dkvc1_s7i%%E91 z1`DXz0fvWMJ5?`H0b-Q9+M^ zna@g*(VE**kx@Yrv^YeT!BAL`QHVW4kuj1xe0u+5MvDLjL*XFCP;rP5Hv9!K|&4^Rgw%0+;`U->1B8nF6Ofm| zZnBpIg#0htMk z6V`A=3Duo*m%@L;rNg~cW>vNG;)MShTJd>}!XRUknI27b)A6M%%1CMa+r0VRkWP@s?# zf(x)(aw|;Fea>jM{rGdnX2yDC8=3DxLUN(e93>yWEu&{Wk36dobFl)e zh#ITB5-X1?geR}T%FMvT!l=3Df)l2L(Gi1}ol0;{wvt2{He0;?cMxsWQWq%12ZNDZ@q z0z|PQtF#}hAajNus|2&20;{MTtBe|}gbb^=3DBCCWxtE@h&AV|3ZE0+SR0yB>St0V&x zix4w&36v|Z2vIQo_ghAJF=3D=3DLL1y(8MLFX}bJ7#3H$sM0Oo>&}0A#bY46BqJGp7QpyfUi$6%i_tYy)FMiLc&I9rXv$z7QC3A${bjSCMTB=3D|XMFmz?W-C3Aacl|-AnWy5rP&NX zni-jwG3re}`<}6kX*1*WKt3h~P%DlBoD`Tr`xO|#1X2Qku7zh-U}WX7XJwRS7@D>Rm@;VgMpM$;)F zD8@1?voe-3i>5&g76BP7%FOMB;My~DqVQzBSeb2E8Rc1-(^+|#H`UK$Wn})!FkS8=3D zqgXu;b9a3jD;sl;9xKRP<~GJO<_JAz4Fy(^OcN^`v%4P1BRtGz6Ij`pWAtE-=3D41ZC z01Ct2dIgB`3as4BFBm|H zQxq)22Z|aER!-&$1r{b&ZsuM_1y&u9G%HAg`F9;in2WiU5hTV77W-2NGE0hC+Xj^O zxS6jrfV8l3p{QUL)nJ|O{E1Oe8my-U@h7#JBf8K?K~F)66P zgPH}j&YA&CfP)&mHVhoz2d1C+!WdJp#42IM%A>ST#)y@j*>wW*0Z=3D?MFRAxpWoN#_ z01Ek)^){?rk*xemtn8rVCDH_+5YGY;RU(=3DKlJUX{?N;tnAFf3aot0Tzag`%o(8KfKNJtm6!pO?V>#_34fRjWeQ~+cE z7jr4d9sy?V=3D}W&cTGh8Of|3g(^B-_ZWM)RD zElkV?oWfr+D6ld!TYwzm0kW5ed1k#HD=3DV|I9;-0Ob1GodelRGo>N1Dx)w41)Yl4)4 z<(NC_L2hJb{=3DootBuG6$%eXM@Q()y})&>P33-f7^MIZ}!m>m^Z85LOtn6q|)o$wcA zM?It-V!lvU0v6nWVgV5kP*!CUaXAFd|uN_ ze=3Dr(@ox{vr2=3Db}`v$z-7*h~QhOj-GvJLand7}cV*D@}enk*hNSRfJIoyU-7@YYynb+4V zK&)ZDz@Wz}<_F=3D(unOCP&0)?hVHIHZj$mbEUS1FJ)k$!!U}WA7^)r}X&k7a*MLIJx zSOgx%kR(M)5HmB+XGA2xozUEPoI!z=3D1>|&HP>R!pBw$$j<$&aZo%Pdsele=3DlAFqXE ztDQ^`+yB?_ z=3DQ1nsu<|ocscmBAU|z%IHGSPLMh#y*C02gs&UzbG4(5LhUab7gP2hNJVN7FXWR?O| zv{`zr{NR=3DjBlA2)P)t9n17+L}Mo`Hu1`$wT0#%dSrYrnrR77gOg2!&a1ZY7S1E_}$ zX~}|%!3EQ^elz;9>aj2~Fiqe2o6*F8fr*8MSt5d!3sNtdG8ce?Ta8%))KFq%1BIC> z8*>II`Kp1^<8;11jFaU-y6nMvSQ(jbGU%~#GW*SA(c>iYxoHKeSHUbf5X+c>iG?YK6mEVgD20y&18*#N||VRi)R z=3D4L(vt}4nESUELVm{_fuT@+Zk^jK|}3l&(cnfbwSXsy7)=3D)lU!Y!1@M#q0?(2FkNx z-c=3D7Whm#pnjzeUbk1{B*N-DF;fV{xMycVQndd6QyO-_(j7UtUw3e)HQWmKvMIg!~G zWUL9ZvjVFPNE+;5h@drdxEHIHF}NX|4^m}pz`_V_)iX1H1lJqZpi&qtUjmZnV&+kR z@>n?`?FMd;^VpfIK+-nM<)AbsqQGjUz-r7~I9>N2qnth{BIF^;trd~Y2T8DjavnDu z^UQik61l_=3D?&D~|t9Mq=3D!cqn>0j?my2?aDT!~jks0Rhvu{$ngPWbOkec}R8e37q7) znE!)YRJ_cs^?D%3>N0mC6iv_n&)8(h{1U7LqHQ`j_i!=3Da0*i4ouYzfN0u}%(nrg;W zV#w@g!zu%6nuEe$7Ze*TjF4K2d3U`6D~}SmxIK)d>ot=3DFs7cQ(15pMFEG}ksP*DI% z0+8Yt(yfY7fGC;n$jBrKX+=3DdbGATh=3DHH=3DJB{2ZWgW6lNzoG!D9-t;AmObJ4~%*CKu zM;BCtGqQ3r=3Dh#fwVq($(b+#C_!L@k_D57{kJr1w|)6RzWpzM~6`wTuJ+Y(kry@!^ms~@&-4v7mA>T0xJ(hu`j66BFJnB zQpLsW4l)wrMH7$+H#1Jdz)e=3DL(&>Mgm~88zW^jXB{2*f>jo@?O6w1xKsUGS8i12x+ z@J3YO3t(Xu=3DKb{wth%692Dr)t+ro_BL7|X}8luz!;&yO}40RVtegiolY|``%%uFU2 z;V;O-q|7Kf-IRq%jZt)Z42Tk&-ps<}0xsZ~KSMpyTd&8e2lhk>EHL=3Dm2z&BmnW z1hR!0VjK(e<~q3dm@hHvL26Pta01&@4GF&g4AF6OCVF^JLcU^->NhC-ycnLjb=3Dv5JD+?uG33xnPZ8 zapuQRclLqBAQpULQ~>8M4n`%2w(0-anWW`dxtV$OSeTgK*Mb7nk$DOesG{Wpg$Eb& zqv<9bO!4)Jptc-1_?wt)z`+J?Gw3q^18V|#lZm+rET#$-<7IATf`&TC@nB(AU62(J z*EBIHu=3D0RPN>%2+wV>1jHw5B1ko^!%+{{dcdea|pFe&k}GS32AqRafX)@HgWCzF~N zD;G#JC-V{}Xkf^L-N&rJ%Bcup$%7Nc8?Z|uc7wdg2`M;VA%v$d;bc>2&0XLB(rSury2 zWwK$F1;rY~+)H3{!2-U;*ZR z82TZy5dAgWObRaM@M_}>lOEI^kkTJixT`X60l8R#RTUINoXqFI!K})>2`mcJI{gnf z6STK&#lvJ!&&cKls`b-ADZ>WDQUI|)wYD`Ib3=3D^+t0~Ad&@dkpa{~)V+?2VYMvv7R zQW7vXv*@w%n6L^Ou<|Og3d$;iC>|MBenov&UQmxtkGZGT1~gK@`~~bD7UrH>1y(&h zR$XaUJ!6*X4|tg5{6v{A*4nVLf&xVk)KX_*WHn@NWL98hR$vunzE-Qp$_lEj^q5zI znl7yD%w5b85RdORjO02q|z|nySOn2a8G6XH2fexmDrmPsirhr+Kr+4!)DXPM)VgXGy zF@Onhn*=3DiCz{9}F6p%3eA|I1%y&Wr$4lA26cz{ZtRYaMUONW&Q%wVx&<@9D{k!Kar zVP#Qb6_GOm4ejx~U}cwKsdvZSAhEopiwCBI3x4QdOcPS@Te4w5AxIlaC3ZJ z{Tfy_Lss@kRyKJ%Ru0g>Ef2Gz0xPE{D~}>88}n*VA5)H%gPF@qPKgyXP|73^E;m^~ zxr3EY86pPCxGZc6teh#JCO?}3NP>e|OOF-Y?133J6VxzZmQ`Tpv0()_g_ut>*s!uG zvWlp%3hA?o$g>K0Lt6ZxE^n9~D`yxhhZ0Buy8$a_Iw-_AnOE1BOkXX)Bx4TBUCOMS z%!Ycb?938gP-Pq$tn5lM5L1|WB0!3mxx838nf-0RJ)!97+Ja1q_V5(N1ey|L02AP5 zEo|D4S&@;InYoIQl?yrm3kn)WMJ7fDMn-nV=3D{kZ;NMpcEpvgZ5Fab6MHqXZ_!N|x8 z9%oZwdR9P7{ScRFhyy~GMT+I1;tZd9;daNR#(Jw|dR&Hi*8&GiaD6z6DL(GO+ z26l`BE0+?hFw8(M=3D8_0jPUb8HRxV~S1y)fdn6cWdY|QF<;80Uz1Z_LxU;xbrvoJFL z=3DHq2xWSnj<$i#~nP-6m3Trz+Oa3H{@D4C}-GP24EgGQS<6< zugt2V!YZi%6J)aho5*MiDrDHe@sCs(vof+VA7p@88V<6J1yXE7?c`=3DNU}dRfWtL@S zRbrJ;WaXA-l~4tdAa^q|bApR_wh~aXf*8vVVk$5(P1g}-(qRg4o*pI4w1XohKfbsm zv8ZIapa@gMbWc$xIX-v4Pz7g0a|J^aJtIAX>6b;A%BH7_GI>njA1_9qU^>sjyn=3DnlbSYUTLomZnmPuA~ z1^WedmMiRc*cn(ZuwP+kxx@a1oq^>I`wR}21sqE_7+7X-EZ|^S!m(lc6j`SF`Z>%j z3z(mr54Hw&mKOF2 z>=3D~%mKhv#>Nyx#I@l+$vrJ(>!_L6c180IxU4xs&!NVe=3Dz`)|*!QvCa5|hGG z(ZR^T;^4v(fZ$DGoWsa+gz*d`1Ir7>H;gP_7+aVaSavY&VPZMJbb^WH3eyiJ29^^{ z7noQYm{%|}upD7-VPTn2&oYIDWd_Ru7LdRNW|k|=3DEi4Qy7nrXwv&;dDf|*-b_OLLp z%wb)?%CZFHtrM(gSXr*H-eF~6xxjjbm1Pdw0!UynuuNf_!v+bw6>MwRz*9kRZ*(wC zU}9Oow1kOe1Jea&mOIQ3n1xw3u(Yr;u-sw!z{2u{rGb@!g=3Du<`Jd;oT7p5OfEDM+~ zFf*_`V0yyD0_87ZW?8|!g_&g!^8scCmL1G{m{|@mpI~NSxxsvgndJ%d3ucxN%nMjh z`Cph>et^BpGKGbKrGsSx3(FLi87vGeFIZYwSvpv!u(B**UBb%1G6UvChI*C@Y**M=3D z?yzkDB_s%Q0fGrm2QBR22m{4n4?D{Q_8II9EDzXUu!Cb4l+adiu&m+Oz`?+>fnx^; z%L$GP91JWMc&_lUJmGo4!_vUJfftqE!pqXZJB62J4)20`UIvyKymNS27Vxg%WnkIB zyMvcy5AO+H29^`N7kF82@ZJIG<-Nhna)vyn%LA4t zEDS79SYEKOya6SSA1r@ZSbA6|utF2!9@Yb(G9m7+4N4 zA7O^1;Rno5KTwbJ!QKvut7C!Op;Pg5wMa%LL9ToGddq=3DWsHx z+~9b?!LopJ1t$Z`6OK0=3DENeKoaDqyjIb1ADxYlqnu*~6F!o_leYXLU{%LT40Tr3~B zzHqVp;QGVGz;c7@0T)XHcLz5E%M-3QTr54@Q@9yec5v_EW;wxKe}S8UWd_e29+o9M zYj_w~cJS=3DsVL8HchKGUW2G1Q(nta0pPhAgq8CW{_diYo-@J-=3DkVA;X9hmYk5-x)pz zmKTup(ZJ8ZvVwmDKg$mO1N;muFZe(3vwY$I0}>V3Ai%OkV2=3DO;%Laih0xU-aP6#lt z>=3DCFxBEWJ%;EDhP%Nc;XG9rTj)X9qi2V^`X%X)bXJF|N?-6I2AU;K$fn|#L3~`n@;tRwXSayi-5ob9fenp&t z<%jqmah3@Z^;0AmSpJB&NU%(im?6QkKw^ai%La)p5-fWpjz}=3DD%#m0i!LmkTg9OVC zi9Hf5CnT;&FtBWp+#$(wLh^zn1Iq=3D;E0QcXBp*mJuso4`A<6Pa@`EG;%L~ajk}Mx2 zzeqB$bV&6`vCNQKBE`V6LVANV%MR%i(hMv;G81H2rpPRiVMt?HAh$%0WsBS%IhF%* zU*s5I{2g)(pd}md{MrMmK|io}aDb}K59}-pI6rVQ2!fYpLDqk<@CdLxVC-RL$jr+u z(Mx8~FHFrX)h$TONzPA6oqj--Nq+hhRi;T2E~!bGiFwdUUf0l46Uv;}C^!9&8j}o@ zMCNuWb*5>Ij9aE})L;^qTww%R?gm@9s17>+lYx=3Dp#Po+6Oy!JQrblWrsWZw>Z`5Q; zmpTJg4BL+eZfr3yGVmBrXVPNwvxKguWB39!gaNc-`_KRX;BFEF0|N(We>npq1K4Yz z<#(VdPzDAD$?1h!OyZInP-zE{&yl1pr!NFagU*R$Vqj!AfF>P1{h}6=3Dcs=3DNV6Ogon z5X48Y^{Cb01$m4N9#F?X?PTbH+SUOThwVz90~HT|ibEoRfnfzyJOWL83q-u0ApuR| zBt(KC15F%sk_5=3D1bD-j|MSvfm>IpkxVD(E&6?tZ`bCg5=3D-?iZ7Y?9FpPbI9$0RNZ zItdCS?I3}w`}K4~Jtpz`KTyLDph@$Bjtl{1F-cTya!_#xG;w{XcmtZa162F~ns^{Y zeEM-cCPB$02#3Kz3e~dW=3D^sH}0G&q$^1=3DbAG$<-T31rfAMSUi5NzmD3AZZ6_h;CSV z-!eTABz+WW_yMRiENZSzZv;s{g-Qz;LUhA+;r^VyQJ+b?o*lG|oPm*{0aOh9LF56@ zIX56n4?x9XZc>D*2cO`Kbf%p?RNMz@4Qx}YHB{UIbmH@$|Nmj;ctOOcyBjbGN`^x? z3v=3DvVO2$HUaN*_Rz?whV? z#3U{W+II&IN+nd?8>R<>qz}S$qe)+y-UyO@43&0JM%Ddg`bHxr@p@KvNDv%AlNN)D zGk}5~DgM-<;tpuypbe=3DYM>e2|dqUM8KogIGh);JnW)hUlhHw}hR8ienGriE5NnElQ zDt!P=3DdfxPfAnEl`X$R06K_sUhn0^r?eGw{s08RSQbVd^<@%qnDX$Mg207*9sXmvd( zlR?E{>01;kegI8e4Jyt6+B}714(MLPQ zBxof**bGh7@adWU5hOhqrW;Lq-E>7$CUMFAP-zFy2osXaE=3D&&uNk4!}A3&4-IK9!7 zNxYtk6Ouq2v{CIAhKe_!iK{@x51@&gLd6+Cc>~E6ZcuRtH1TkV_;hhICPB#z2#4VS znxe|-j%G~al3h?~2hdVcB(rBvF9b=3Difl41hlioXhAxQchRN6rg)ra?|Uo>M9um1p* zK7c082->(0s*UtfwFyDR9ni#;q2di_;wDh>1JDL2thMUQ#lXPA@NxQdb0$GaFD?cK zM$pmSpj`%kK=3D+P<$}a|n;OP_1nZykvL1uI?GN2#EodpsH9Uu-mj~1z>r~qqAYywGx z+KQk??4SStVJG_ZL&ee0*P9O&hn~?0KcaCBOdK?1_2>V8*dda;rUzOui8Jm8+s1f$ zdZPuCxa3u^SC|fyJEdbgL^XLD6nDmF~4?$-A1e;aQ#Ld9K z)WL|cGeripLxADqe~^L5Sd|;ZV`O-c0kIUs17U5b_!%^D1E{z_CaQW_233O0|P@WR6Y8kcIhDTCPoGZ z#5vkvlZrv&U5pHn-94bwk)SqLK_wKRhv~o$|LKE@qi<$h2NG{$WI#WGb_Ynji;)5O z5J-^CN1@^F0d~#E3b3mf80JskXw4+%p$y&l3F;MrWGo@#^$h4o);mEY7|>5H_koI|Z{>@Hio=3Dcsc7aA0=3DmZK-{y;xL zyaJ@2fsw%l?BV+V|6z^Lc929DBLn(jC9^?3V_;=3DyfMzIIy&TKMz#zoH$N;=3DkUmJfiIL#~G>O4N z!jcb^CfFDjpoNeNNIe51g8(?F|Nn=3Dzj{QL5pi?9RLH_^q|39db1%*-`R04b;2~sz< z7b=3Dc^E5S6VIQqfp%c0`v8*_Jq#G4qAt`Y$4on>HPI0BOBVq`$yetQ!n4l28#K8975 zkD%hPxj|Sx_7WTtOboC+mkfL$Z!s`@2C462WI#U_i>00)5;w3Jc32`3hKdV7k2i%C za>^iakb}_nJZgc&LD?0$(;jw=3Df(t(=3DYM2;cyF#I}I}E-caRycf#|pGKi-a14en4gx zNW6)W;R9MoluS=3D_U=3Do+C07-W-GN7Lt)i!;i1Cw}tH&ogn0#eGr`j>goJOsNs3FiF; zQ1$4Wgf~OQ(a+r60~MbD+UN|b3_&Mag3bd0d6S8$o&mP!l>ypwy9m{QeuB?Ks5tsz zC|{uB=3D%<2+2{14SH83)4fL7-q3KZqC0-$hbW?%qadGn_pF`Q%s($K`nAb?ig+JVFw z7#V7yc?DJudxFHf7#Yw{uZjbSgYqJDa}q3N7Jrmb0EZ~3E7Sv(KtKI|CRBXF zc26fJZbojul+>KW%6RAeyprkO&P=3D!X+*3>99diR31$ecJ!ZdwSF0G9-`K?52q4PiRQ$omk~90i3D2v2VeWfGni#w5Xc z@gbz(J~v%4jLBSdKIonX1_p);pe_bTB?yC6Pj3igl3*$jojxm!$&T}bC?u+{OjitN z5}$q`oQY-npD-pF&Lf~JRTvl;azW*_rGWjCdX#o_>*qF=3DHDeqYWdY`gB_+MsJo6+y_2R7hq;In7)UJ z(TDNEbWUc*dX^0cQD#OTmI-jK4GW_WO970#eGdzx3%9@w4u#9C4Dt$p82*83J_w|TAz zD=3DIj$DLOGQJj|ZhsJ7inmT?&qqtEo0@{IC~9@9A$80{G?rh6(dwlhjhzo@_{&L}(m zpfscSHbuq`PR146JGB_?Sy>_&6fRHS!^~(hy+NOmWx9_6qm03C2Kf|*hX2(+8RSz1 zSp*$_Gkh$E^1~l(VC5s zVYj-$pXt+#8Iu_APXB4lD9w0yx~K``X2Iu74wo4i{^`T;^658C80G8vxgf&f9`-5@ zjPn(mY#+FTlmrARDo8MNZt)GBud>wC!9h`6#Y6dqGZN3=3D6(24Rvss#jxND6T^OmsSFNJG#KI)7!>Rk6c}D^ zPhfbt-GIS!ixNY8h=3DK-#=3D9V*z_Z0#dJhw22#49ke{CAIF@Z7@2(C~zjK~doVwo+c2Znf+fCk$oJ=3D+>RJsS3EWH5McdCnKFGJ&CUOT#9o>9xqPU_5Ba4y?Gef)zh*tcj=3DuyF=3Dx#jfqN^?ea#+B0- znlmah>Q6TXQPZbKnls9WivRzA*q*^&!Gb|^OUD2IhZ!d*xNtD+S2$Xt=3D<**bo&*wS zj91`f*ss9EpycxZpOXR;gToV6hW!eypA=3Dl`q3R+)>KJybADI5toH3a(c6y`*<6_1g z)Bjp9Mzh9z+pBzKI-@0{_Vf-*Mjj@GZ_}q)GRiStn7-ALQJ?X`^rx1L{@gbhAW3K; zYvy!&D@Ic$hp*GitQeITrKiudV(ey|FkRJ}QJb-1dZ0C9{WM!f7Tp*B{~wlT`43KL z|NqM?D12x4c>Le~8z|v1Fv=3D@AKurYk?@o8LVH9V)K0VTgQ9B_7DzlJP+Yu!D?Z5pK zg>R0Y$Nv963^VC4)T9PgdnJ%*i=3Dlcz>KR!6yYK%0|1gLx6yV|}#1iPXiTRVW!gqJC zt^fZYp8my#QGxNpbWvMI{rUr+_A0Zmd~i2oU|{&mRG`4{fx(5D;jyy_1H%`MhP?_b z3=3DiPm5McT5ZpQ!uu1gqMoE;b#6g3z>*t`7vZ~x#2Q;Px%!xLvF78eHw1||)L5ArUI z4ZpHMj(`P&MuV*a1B2rdX0TpmkX~h%zj!o*a=3DOB&>ECP_{TMGyceP`zXA1Z@{g@r& zJpTAV4E73a3=3DU5=3Dut3E17!9|j?f>s9u`)cJzT2KrKJM`n0frCGTnzCF>?}_m7#NOQ zF)%z{!p`!-fq~(RNM zUxfJ#4AU<;G78myMG^a_4^n#vN$l5u`4@}~51bcmRdl%UKmN<2y^0Q}{>Oh=3D_*LIQ zfI;C4BZH>GB4#}YNd|`}4h(e)AU7~V{lmnP>A=3DbI&|Q$_kvjtelf^A0bDu!+XrMkf zgThmgCT50sB|(<=3DU=3DRQQuc>$*N%2i+G=3DkKDFvtQyme*jlN0HQllG5}5XT|_V|LF^z z8Ize5-b`n6VT@xeo1W^z_`d$atG&t>{@+vPV6fZD$Y8H3z!0}pf}w7!0>iwm0_ydO zJS-pGH5m47WnhTg&dc(_J>amWqDDikA}cf|wKyOJA;=3DA&T8DwbYl#5MOLuL<1jiHx zB~YGrVGK}k`SRcX3-gElu8q?ddNMN9s|u*wE2c0c@mVZ1Rd5J6oUO>kpzuXydZ8Pm zu!RtknZn?(@LB>gOMvCIyQZOnBdCmlnaRMQqX8=3D55*U;$rW?31N>4xU!pJ%OfeWKb zeXlskE*%AseY%DV96{FTep~3t%d*fBWIsDnSq5_dGj@bup8vOh3h@iXPLTZ|d%ym- ze~Geq&Q(@*v+hN@N)VwH%2`PJ_d$opcHvU094M; zv+VdEe_4)!;R(pWGSeO0894;OVXuB49JZh^<^TtU%sM0|2{RmkI_agmp5Xz<=3D@Z-; zMP!9o-nug~*eihoNAQ3A<%Oa04*&lvDjeWobh!npM})JlqPk1n;Kg3$84a--8~)!@ z2E{ihuDMt~xP#(40qjIOB~W?*r31!72NzJ>gVF#u%O`h65j7VBhI?Bb8R9G)80;)u z|HohEWO?Au%fRr2f#v0NeK$r~u#f6NAqvaqAodGpd8J$=3D?>I2nX&5p%JZ1b~?E(rM zsLd8yP!p9H7``z6)lu+aPkm_FfyF3SL9`R?G9>M@Ua|p1XWugN5CB9&7kmwfk9UbWGKimMuxSD zC7{q_UFZ1Yzx)%B!N}?z8SIom4rKlxfB7T}gUdchUWFHAj2~=3DW&LIW!Cx&`Zl)Q3} zhx+FIfB7$87(w~@zdOjnx&PuXKl?BLLa|WPVNofo0|NuM1p~taXOM#znkzVf+C^3j z3SSgHayTe{WAp&YEi_klU|~>r;=3Dp9D0%|5UvMG2NGAMjtWO!|T9nC>6>Y3w}{)5xS zD|b7nBhLMo|FVD|;fR`l@t2SOmwy4WJOy0XKpa>0FaC0a1cM7B1GmLNsKGtrjh>7Q z+6rG7?p!S9WL!8ooCQ$nL?>?i!*5dlV_{&eAY8Hl?Iz0Su|3rx8zx!8k^!;}~ z|1bXXo&WM*KrMQZ-VXv0y$TF=3D7AOA2>tDY5U;axXgS`Ss(-){FkiiH4#a~8Fl^~xg zJf6PHhtZDr!K1y(j2{@>K;Qqn)Lr4xUgZh@?-P!XT&k;s1T5|NlV^t;7us47p2~S&|$W7?c+ zg@K{|>@tw=3DK)wXE3tX)PlsG>qxUQV4;HYev;2_3w$VrJY(E-%=3D5n_1cti@^LRT&tZEOq|JU*=3DK{Fi4f1spVFg-MYQJyK_ z{`9f{MmZ*f`_rcdFy=3D8Hn9dr=3DsLwcIx@jPzJyXEF>1Bb8eoPGarXLGr)MLCb{VPaz z!F1Ii#&{-&yVKi(81q1)L5%+O4R`h`LwX&GOKvecY6vjID;!{Uv^dD@sKN9h-i42W z;gPd|f>YBs2aj9KjT+1!>Rm(_<||BOadtVt+-RY|5U(KkLDB61v!WG9A1E!t(je0Z ze;32=3D3SNRNN^TH!_9*JWEdqu+(~ku+#xX9Kt{TGV$TY!WdPWGNOpL>An7bU89A{Rt z5@K+8X7tU`in64ViD9^ZIx@#z-Jm-X4Ap2q!n5XB4G8)UkQZdXc3=3DBz2PBJHJ zFf%ABOg|IKXu-sAYdTvPqXXl@>F!~SvP=3DtZPEQMClw)eRIlT=3D;C)}LA3`9HJoPI2f z(NE~Z4UqY^3Ji?#3T#~U3T%AS)xsI|7!OYm4QG^Rns8%!SvaE|Q^1Ys+d#Cyjp^UQ z8SNM^OgD{Sv}c-deR^30V;qyg_3hUp82uQvA6x|)w^zY|LBJ3+R>HvGxL?1v87s^x!B)UvS%lfgyE?QkjCs5>q7y_7Cw)prz{s~A-=3Dg$cRWrhg~APdhhJ8Q7BWH^A* z2-Agl7YP#wmnN1QE+GCPW@igQhIj=3DA26qdP!=3DxDsJT#bC!W|eGk}Q}RK4^gqV;6Yh zc8l3r1C+F3q0Gec(1nqqMS;;k0cIP1BN_*o4^MB7W;6~sq_MRA z(_h9gW;0%x9vTaZlS|X5#WJcfKAOHamQmgI#&1Z!X`v*81ISP13<_Tq#X-#!&m{r| z3=3DRqmc1ob~iwjnzFerjc1ctwg3h$@O#xaUpfO-*(ACz5~8RV5fLFLjAtH8j(w7~&P zD{V-J4`FC60i`35HK6vw^qe?G3C8&8t#OPlOdo2upO0fyWn?nAF#TIRW1Q!O^Lv#K z{J*EHz#yOmYQJhT3Oa$>xLhnB-9hbKP&;-ZXOSZh%O`hGJJy2X-&Q`B&+hyzuiZiI zTu{3g)NoXvJ~M$)n#Ghs;mhV1XpsdW#u+ou{^^-dzLy!_L%X@b&7Dq=3D=3D8^wbWQKRrOtO1)X z#PZ%9)=3DPDQ*gHKqkx{eW0b2io!UC3zcv$|sqqp!I&h1rJ0Qc(R6+k`)`E&z=3DodT!_ z2lFMU9tMRBD3m}U0}6>940hWNFvM*;!BDsD0>iv*HyHM9OJK0u0!nik3~}`v7#SWG zM>8lq`TyS*+Uc)VO-ayHOi1ujP-|?_bR`EZ28Sn(ESjJSb^#;HLTAumH7tY{iK>A|85YT^IhZpzd{Ht~ z182BJ;*Jh73=3DU6>1l1fEL1}>DQ!yh$kA{+9n*$5OlVVWrUS#g*z{lVK9+;4?2R9Y| z=3D`%6pXaq65cVuMfQ50ebauQ;2aZ(aYb6{b3T&yqX<^qVU~yPj4V&wL25z1 z0F4-cqR)u2*HMrK8bSM!Q02?=3D4wN{TPd9O6l&H60__y=3D{ zG$DY(?K!xO015NB1a0uR2Pn*!LrnvjG#{yI1%)lBRSyfE42HM`2@G~im<1fcZIpb5 z1y4W&KN$>l8wwZ{z)jY820JBThR@FN40iPv0?>%YWk58;f-ejVjtf8rD1CGE0BO`? zaDW>W&tPW(O5zR-a!UXH#b4%Q;BzQPa$p97-GT&$xFsNmgPIhK0*Vd{42za#FxYJn zV5xuWu8x#vgcu$;!@?1yfset@DHF-(iQvIrP-@!`YO5A!{{Md%-N({kA1_=3DAa_~aQ z1&%HZ3SXF5-nxSve(8VwlLQ7kC6L)*4^RJ_!pL6F%<{=3DLiI)ft749P1640X#u&bs;kzaDrr7wjH}fBGQ9K+S-q(5?~#gCaQaL7mA7|Lvb7 zOn;cnXl)Ae&J?H;4EtE$I`d(%Yvc5dsf^0?3Jeao6#MV`6#W&dBn>-H?Id z19O0bi#$WZ7p4ggE~X3)UlxCNaAIP4=3D+4cM@a4z2`@v!6IKR?e@SS0Lzltf83RM02B_5mGM|ybQ0f1FM+>G83NAnX$A9_p z|C5pw!-H26A0N1JFkDpn@&BL#6U#^UNo5bb#8_@Psj*&kU|`s&Grc37(L%w9^^-Gb z=3D#Y`c!Xbz)+=3D-LH;T=3De|5KEwwBCDap^atsTD)r0^4*zta?)dpXo{;?ttSlehg&7{a z;Q08!Wm4G#4-STn3Ltl|vaE1`*pC>oWnh@NgoD9QiJ9f1!y;ByCkBS*EuiTsP=3Dtb9 z$H<}~=3D@7)`?sWTq{5vL=3Dr|v>5u1<=3Dqs^Hk4ekYw#K>*Ys0bx*7f`WMZnheIA`UBkm z{~Pf9|DV9~|NjP_|NkHG{QnOU`@jvML2N=3D;0jh_PIxO=3D1|3MZZ@bqPwj1d!?gtm)h zF}_ocQf1I(U|`r_^8derF>bs7k9+`BjsZ%8%sF8E|Nr)jER6cx+aItno@Cj!fH8ny zslkbXf#J{p{|*iiy1)WLpMlcrGN%`Qsno8Ag~*B8%XX3(_ExTfmYZHZt85tOuHuJH*0nrb5SyzMThoY=3DW3=3D9lRk3?BP{${k|Wu3{$z`$tD%U6(`#K34P z%*niBJ;XNtl?)6FjLu>V3Y^Rg4UFJ86_^PUb7h}ivx!lTX&&SBIhz=3DD>hnNGzTstL zVP;@px+TU~!^FVAbVH2s49H47KE@!B{1aZrQV{)vm+>n|{5vmW1Bm~Pml0$kivusW z90LPGBI5*ei2XO9o?)C52vUEOnSsFrnuPKh85n9AIT*PAGcqvv)-%EapnwIUhj9)_ zHOD_@1_l#oD&t{bUlv!SX6}Is7cej|wD7ZOvoJ7h0nJ1H`TxI*fq|h;2CV7jGvK#!3rwIVFHN(DMkhc zRYqoJkX{9-7$h??FsLztg*8kV7^WZD!YCZ2162Tx0tPKcu$=3D}_VO2&31|6tbCQvb$ zQf-J?HfX}S5Mh_;hFclMBs|b$%^qF>=3D_vuIr~8AT!xX66Xah;5k^LqB_NS$ zjEpRoL5eyU8Nse+%wl9@c?=3DRsVPs|jm3)kmjLa;DK_bD7%q;Ujy1W^uD{o^IsqbWB zU|?lnjjb(t6#Y^ z8F(^4zJWSN18M~0Mm`QurUl9IK;=3D~Gp^~nQ3`{YM3=3D9TP30UUZ%*VjIj){R`A+rJ# z1H&w4AtnZf$&9<07#MmO`Is3PS{d`0K>7YV69YpTGY1m`Lq6j%CI*HK#t0?`hD2sN zCI*HGW>6ppFy3ThU~pyhXJTM5W}L;uz@Wu=3DfvKK>L4ghAVFOD@Fo5g_xruSkW{_h+ zQa(^An41(B8CXgf85jzn;-F##qJ<3<7!6S24v-iqs^|O#nFNyB0+j+4Ss+3wiz$wxZYBi#|g$UHLGB9vM>l7YPfz8;>_Q4(!ju<3JXA-%FqZA_CXV_Z-Uqt0~H6Qj#hRCW;0Rpn8Mp7Fce&!CpqO`Uy}qFe9s(Iktfsmr&tsP^#_WbpyHJA|nHX0;oXx z^Z!4rNVI0*1gBR}Rr}}v|5lK4XAY(lpi&YlrU3BiUw(%3?d>#m>Ii43|&S>#vl+wosp3- z4a87nWMr%dF{Bw88CQdXd$tHO<4zDGOoW+nKZxNV%gneG#4rJf#C+{4Unrru7C+IV`5-XVrF1=3DW@TV# zfGXX<#K3Tgml>2h3ebdQxER3cY5`Q~b|!{;hJB)7u^mvc{h;bdT*!x&fguJebP8nc z9)3oUaWJuqObiTSTnr4t-JlR(#`wV#62vD!;R{OUb6zkrFfePdGB7YeBWe~i1H&rL zbs&d<`~VTI|Nnm#GXp~~B*D8tm4Y&GfG7hvUnD@qPBAkutmb5lV`X5dfC^n@W?)#u z30Bnr6?(wTz_6B+fk_19tObmWOvga>O=3DDza0=3Db8=3Dhmn!v88ZVzb_1yL`t$#P{S0`Z zgEB1G!4sfzpx`d#j|G_oaxhHzF%#UqSD-3CGchm(h(f&k11k29iGiV#e>O}vOc>PC zhWggTm4N|VX)A+TNTLj^AipuVLIM)jm?&Wd3rC;{*Kjf$vNABNfePy}GcYvrv$HZl z!VD&C$;`mu0twnDP?es{3=3DEE<46LB?<&P`0a|^SqMTCLL2;|}@Mnz^0Vq{=3D&fJ)6} zVPKfm2FiXP7#SEmprZBLSr{1H1sJ$M>K{M_FM?ujHY+2j)m`HUG5H~=3D>fvPuwU^gG zg<#EyJa(|kEl}Y%EDQ|!5S0g@La?wZU}ppwa0M#-orR&Ep@Ic0rU4rJ`SbrjD4o`G zFoN9p0qPuaRtAO;ez1@LR3|8Xhw*`hM4&>BtPBjH{46&Z85jbfW(Be`Ftql8x(FcS zV4{hv3=3DBF#%-l>23?2TUj`5%W|6vZ)V`gA{&d9(J0X3nJm4Ts0oDtMwje!a^vNACA zi8C@WF)$=3DRg=3DVudFiZe7C%%IME`X7dbuSA8gAuDOD+7ZTlN2ih1G9oSGt)Cr+?k0p zGlB9Klc5ANlMZV=3D0|S$e1T&K#D+2?Qx(G892Z*60!pw99q*_*lnH%IISXuzJxIw9b zaZWm@VF~h<1vHt!no&@%r9g#|e8vMx4h2y09Ux;sWenpSu#a1y;^iz143<3LkUanu zs)HmEhSlPbhEg9J1A`zqse+n5Aaf9dwICh?L$nYB13S2#w3&|`)F5Ws!p9D35i>pD zWrvQ2vV%uM>mP}N(=3D@X*ANve;1_qV|g4~Nh^bBEcP#`kf@(6*(E*bTh7!QEjWq|va99ux>RVhju#prYl^|Nns;3=3DF1B5UiQH zxf2%4${@o*ngpinon#cR2RT3hss`pWuo{rpB+w-MnV5AzeLIjQbUBdMcvkZw!);bZkkE}dwA^)<6D(1agyGVp?& z`2{KtbAKEYGZV;(=3D;9zJGO(RuV_;BYYJen_`v0J@Nl?Hu&XEMQIikfF7&;(w|J^tk z7&Mu9!Lh#vDh6|s785H2n+Q7t!#hTUXh;wvT43v07#NsACRsqGuCg;Qd}L$=3Dn-l{T z1Dgc$|2IZXutW~B1Oo%Zcc^#?n)pvfR%TG>RY1iburo0HgNoHa#a^?6hVLQfwm`+e z7BYbQ7hwB(qCvSEscicTHDnG{11kpu10xf}kULN@m?3OX@i%DV>`a{Cu$O^`7c5N* zGC>?|02P7|t;Af|HOARIHhuf#Ezp{t%2b%KsvokQfgnCv2Dt3yU zf#DS+D+609I|D;Eqe28ETtNe{kc0pl?gIyf22|=3D38v{ch)CV?DF__Q#q2eAeaZs)W znKJ<@5dxC{2{JG+OoWQZpovdn6alB%3^eg6Q0JFG#s9J~Fw9`&1gq_Viot?yCL<>^ z*#9%25*+Ld46~sYu7HZc6wiT%{T?*&`HY-k-yeaB3$rsYEPz`01u6zJV+kmp#26Sj zASo8q5`y@DDO7_1LIUjnWl(V$s5mSbS3n(O0~Lo^uo|k~1x@`~MA8 z>^U0)Ljxlp1KS@~(8NUpR2b2i^5=3Dxw)&Y{L|MUOoVRB9<314A6tBn7A#%%pfm)_Sn- zG@ueNs}rCaOrYX04T&JDW7rrN0vQj4LE;fM@4`4|FBb!(d36FR1uHf}pn2j3RD2d2 z149_phWa~DL6{YxP>DBa;-JQxa4)C>=3Dgr8-$o7Jbfx(h70jda^m>3x6%;ko){Gd`T zYzz$6jI7|AtN|(pv&#nLe^B$H15Lsfs$l|}xE&)aQ-~M?!wfWWdqzHRwX*^$-p|Is z;0QHi4O9%4avY%ITfpM=3Dh`B{4P~e8LGcf2f3V`MQ{|7b7AxSEkhk*g?2MMSYEO7Oq z#%VysVSY1!iW{Jb8$!h`Ama7#sZArOgabqZE^Z7J_dpXjfrRfUM( zG+t=3D>j(|!zyNND!sKA#25q<2cR=3D;Pq6gY;oq#3` zZMV)r6Mo1EN%AYu#DzeCa30hdWIPZ82?WI4r7a({O?e^&I_?4*`e1{WKo6kmVG+p=3D z6@P;!&cVpayOfWC;RjS4G{6W-E1Zmw7CB5D))#rj$_Q#M2|!&6&Fb|GZ#co?3Q%#F zweKLpI%vWlK=3DVmYSQ!}pE`ZvL80#qHV_*QAwE`*y3+w+p46G;E85q7dKqX*qVw_VC z@&Y)5I-qh;hcWzQW#H%IU|@K`U&_J2aFcZlD+9xUfM7^qA`(O$Kh)9)s1!{9AxJQ! zK!sucI?T!f3Wgl0aJ@Mj1H%!1u(J!GVz8ue3}QkFR2XK$afk^uP+=3D!F28I(50~(-0 zFayp&4CsIg!wfjf%D`I2&cLwpLJ&0mVSQ`HIdK9|@7w^*8X;9gt087RfeORSS_6sI zH)z6Z`M^G6fZ7am&^A^UP z#=3Dx)%(w%dG3c*xv<|3~USx3n4bn z0gEAu#6=3DL_EkP4r%n$a)7N{^c8w0~qhygpGLNJFcVP#;|1GNVQpc0@(LlB2-7X&$^ zUW|dk04n#Dm4RUr#6uoXA(%OnA-TZ^O?V1KI07mRi*u~1gD#*sbP}~4jZvb*2 zXgqSxGa+aK?*L2HBc?=3D3A!bbhiz9~V${^Wo22}VyD+5D04>)ztfeOJKQvoqx0aO^~ z^h#C+)@f`E3|RqC3D{IHk@H+r<#h?F>;Sx~#W1Lei0u6=3D}P&rsI1V9{g1u6_PD-aSV zcc8*2Ss56DAaU{lDg<*(FvNf-P+^z>A*>9np&SehuJse3GO(d^#yM|bj+p_Kf;q+=3D zV%8F_2G))23=3DDb-P>B>!`3s5@#yQJGArZo$ z0hQa%%D`X%F~u-rc8)!SAaxe>_4YU_fVVH%`_SpwCVQBm8 z51Q~pP6jSe3qt_fxJUun3ND9&#KHE~GcZU%X(I(LewHBQ${9%Qv9Hd29>} zpg~=3DRO3?Bo21X8E4h9A$@Blq*NtFV0MKr8lIIqaSz}UgTz%WaOaTW&y!)$J5Jx~w` zi*hnwnC^R@QJNDp3ePx`kx^lK;eAG_`V3Hq9Bd|RnUkXu0|VoF4hDvKj5|0O80IsA z#_t!ffL0PSadUApuWN_YMNFWX2|h+n=3D5-+V{rUf&3A7MIkcpFdT_!{Y!*Zy@SA!PN zfGt@KjTG2Y?s`!B5+qim#K6FG0pvjgekSOu8dlJ37-J&q1yB?4&;S2Zpb3L~VU(9;FccPK6k?B1WQ^nv2ld4D7?}C26dA3#EfpCR zrh7hSw6I|`6b@nx6^E!%aC=3DjKb5uJZ21>F7S+zZTiyZj3V`5!xWi7rYR^g zGcd4&G=3DNP2yA&kE0TKdP1#uWR$O%wWL6(D@$%W}mZWE9P!Opaow2@?B;L&5Smt^L% z0t57wo*g6sbF$(y zrf@~j#tS`0MEHWtageBy1R2Z;@(oNi*kCS@2uKOkDv&B}NVqUsvx1^Wk&%Ic2h)qZ zU@yvoJp}P1AF>}op5~vP_mWYUUOHtbuG1gezyYNXbVKGn9nDL9l)LOGXYRM#Jd~ zUNb6cf^rHIqdXHoD|iP9m;jZS4C){meGtLQ$iT^@F#XkQ#-!;1Zy1}WUw^~sSlDERaA~uMvYZmmQ_Mgj#YtKP=3DQr~xln;sR*{uUiB(pPRZxjlQh`;0 znMZ+DUXfLhxmbZ!l3BopRe*W=3Dp0|u5tWq+pA_mi+y=3D6?RS6~%TU=3D?HLRA80XXO+~D zVHHzim6BzZRAm)cWR+58l~;y1L`;cQTAo!x38Yt2iG`U}fSFg1g^^WWmQ_ZPRgAe@ zfmK`?EX=3D9E!pJJlT%o`!qsqd}Dq+OxDbFgZ$f_yN!pO?We2PJj)rdJmfmKS8RY2C3 zg_%{DIS8ahirG+s)kvO|lUV{32zS2UMVU9%E3ir{u!_lo+$d_mDy>7OJ+a4=3D{oNj)s30O6@3XZ1f`5zcXHN;pM6&+Z499bEqp(L9htDrI~t3IouC&+3+YcM(e zzz0T|dJ&LnQD$y0RxS{enWqHGP$&UKIiox)b2=3D*@Gxt1JMrIj3R%YhNU961E>Ixv1 z9)!imoSnwX!~CMoif4Xy%5{wS$UW< zZCGX5m{s&xnUz_km<1-V3M#NNGXG*I5ocmzU}XHvH2v;JM$pbk1_nqdfR=3D$WfC+G7 z2Pg3ao9VKj7`2_5Ki4U+GU^-Yu`sbRGb@0iRFpYdft62#l@pX2ST$IfSh<;785LNi zn3vaku`(;Max-6NP+-+jVC4cS=3DbgU)6QiURb4$GfE2AP<^=3D}3*RvkU4G;>3}9;>Jd zE2jbr6RQsM9|ovCPN)u*=3D@OqARi`_CW^|k0{h3i`y5AQ@vFR5-Gn!B5`NC)i;;J$} znO^#ZG0WMDg^^W|*#~427qbb-b~a{TFpq(Wg^Af1Bq9iA`Y5n6sMN7ft8C{4;&@T@_MX1GAvB2T+FFZ0Z6;=3DUj zegxJm%sj6iq)wOF8l+8_*%icNW=3D53-@gwS47+D3Fzt(wy(=3Do^{F1*$$uyQhM>#_1M z^MH)hW!45+z{nh?z$(m~zlN0&RLaXRr=3D)>h^OgY=3Dsvy@yfccP66kvV^weAUnLOsH7 z&+0%%axp&v`+)}<_FQmR$0)E0sjv#mu=3D1F(GBRId@M7gS&C1Wbu3mwa1I%S)<_4L- z%$zj=3D>Z@IFU*QTtN#?cSDAr|u1a>SpvzY=3Dbhc7GRmgyQl8I9{fx#ff|Y~$2qUP@+g2aJ%FitA1=3D7y10wN`qS?l!`ScT+S zB^6nDY*@v%u<|pNoeel*j6tcJ5mK@+GsAg$ENP%Z63jC;Vnq_f`PKOJ}_eD+lvG1}|1V6;^)ce{~A1 ze9TRZHc&PPa|@#aD=3DSFqM;)lz>HtfD*qqG0j0)g#$&GpX!qLR0Q07^{$-pjVGmZs z%E){Z9QB^_SeRH%nf<(`Z~x1vS#J%h*tkH-`I$9Anz@+6K_S4*tg6S#69%fw|6hIv2UU06p1{Fh~ zMqUX>9T$kl$jZ)Kr8hnPKck_7JS!)tezsNwYyAk$#@x&^>us1o?S=3Dw=3Da0G#d2Ot#( zD|iwFOn{>W982IyGjJ91z<(+yQ>iNh6ALqQA0x;+!eI6%NVx@O{|6^PUNF10UJpcr zT%ZeLFn1y}O(U>EL9`1y&5IX&70#!R%G&CP9iwu%_urj7%ktU}b(b ztTG@5DD)vVf~qq{R!Aj+GG71-u`utiR{#}N+{}d$L|e{mp}@)`&B{7`E-RA`vM1E1|6*lQ zVicGz%f_U}C@|dxLS?ftxk!N1GZQNdC_S_4fy285?343sOm~G@7+EEl_b}?Q@`607 z%Y3;`Z~8`drT`yBRz^i;aQl**c}*QC@31o8VFW4SW?oVU_s%t_&?PlN?M+ z^~_Hg6~OfmvjIdH%LUj#WmT zm0O2Zzz3X&CWG~gF~0`ME3k5^DY1%y9SjN%aHS0i9xmpoV3nNA??5W2&*fy20I1QO2VAX)0q@lxs_O1^+D0W{IynLx+OQ08mJj3!@LBnoQwHR zEyzTO+m|qTf&3#6i43Se6d^o$kQpFZ<~K+>rZ7QOAqt9DsL~*9P%Yfdvq7GozMq?k zH-(vb6_XdMD9A*3kTO37>jeuk&xRWf2}p1hfs{j4L7WUy#i|Mpt_NVvtjvqSKGS8s zTRUBxhsmDNVR|?Zlad=3DV^Ij$!R#}h<2n#QP^?(JL*C8wfmx2fjA*#TF(>L=3DlCA%>* z?_;uIl|nV^5ZElRAoD()W^763&XIH5701A7=3DO$h--ziUnGjPv64JWH!-+=3D7yRyR&aBl znYn=3DlR7sjLH`M5{T0`saW)?kG9urnU16E!oRzXl=3DWMS?H`%aMg6O#f+lt+e@Us0cx z*MJ37BK6ejv4T4@yv$#~j?rTV3F%6+>KTLU)4$+|U&qHJnjpY@u~v^&RDqQh6b*Wy zCMXLdt08kEvjQu#0;>S?wOR#MQ9YRSN^rXX)U#w}?qZIBgvw5E-;h}m!b?TrO&8>6 zvPLdb)uz|*Gl?_hF@XDi;I2NT>kpoS027FcTLC&9!90_hk(I|Tid7iYzXjKUOgdoe zn5O^YXEKy#V1SJvfM*@RCV*LUn5L_LWmHgwD_{Z77=3DQ_IQvuS8=3D3(GuYKWiSEx;sO z@59O?$I9ji9_Nr}6;Wp8(g6+Wh$yqN7_f4Bv$Dvuis-PiD6xvjfm)IxN}zEb9u6^9 zW_eb|3|3|jRz@XOcII5rfXZF{`Se)X znWYt2*+8RKob|F09w&2@4J)%ZE2l0imnEwRsA^#4&}S87=3DG9~6)n?_BXJwaX6;uUv zRd|>WGH|4^3fO{1u>`t zgAK@Q9Ez-5`m7?%D?ojsdhn157xT(`kP6W735X3Ew|M|=3DsjjPE!^&pJ%I?j|CU3{e zY0k>Q%;&|*$*kbT%A?52#=3DII-bt^LS=3DrNaox_8DAtenhZUaUOItTGC$JPNGb%B*b6 zQ$RJhBC`glv3{DthLuf`Rm6c+NS{?i-hoxfo0Z3l733&ePf4Nm5MVXbI`6PoLScw5EXC%lxb~#oK zJ63ijR-QO!9xteS*qB#>I(%}h9L!u^a!RbK@}MA9Rbb^)W>uAC<4D5) zmuKel0yjgGr{57`QUq=3D1g0w=3DJ!1Fs`0^IC`&EYUBGO{v*2V<%j!PPILB6M7Z6EqG5 z?sHrMn}rw(VFFL+fC;c!u(=3Dy%2}VX%HWfow9Sv4CJyv#gRyNSs4W|N#<_8V4icDhV zR%GRuW#utqWm7g|6*XYxQDWtmXJu1m6;WbkRAUup&eDU5aWSXqv5MM(bnqy$>X<3B za)Ts=3D6j?z7#R$@bRYV@7MMs&Hii zoG>dRsCCcE#2lxu<3al=3D^tdh)-IACEe zQBYE5RZ#(rJ@YBEvRSb*IkGY`A7q%v%ETP5qQ}az8{`p*N>*lfR#qie2}M?JX;ukU z5XtJq%4EpIKRrj3Nr$PyY5FWtrXACx#hAjg-2FlooDIzt3=3DQ=3DR^$Zn^42%p7%nVEw zqH`0AOHzvzic-rmi!<}{6jD=3DCOe~Djj13LatSn6oEt67`jf~9y8w1M5|F@>QNaMCS{Qp6Sq?CsU}OOMkmU*E7e)q_6-;ZGST-;nU}8DK z^n!_jWef8cW|jt)78aHcmJKW*{sCr|Bg|iz8CVW5A7N(c0gHl}OIX&hFtD_+cCfPa zB(hFmW!b>Gg_UIw>k(E4mL05nSXo-wCV;%Xgbfr7Ezn??!8V5td|Vschi@1+FtO}` zIN<~n%N*tf%q(k|Kd>;cEMeKg!m@+q2n)k?#_8>fOg{B3%mF13FrQ&&xxsvgndJlX0v1$$0}D$J%LI^{S$bGlrm)OlVPN^g zGJ%z40qYr7ICBFl*!2u7TUd9nvK(MN!OFn$fb9tz%Nw>W_3SJU*k6Fs0YqQ}8h-*i z%MA88?4Z;$gPmmo`wDgjmI)j)I9LvFoZw(!xxjmcm*olX3tpB6z72e+{0V$4Gx+B4 zF|bVGo59DjfNupK1Iq@!9egZ%_)hRKu$a zdBgvOpXCSt1_71}0zU-N1)=3D;8AVq)pTLf5o1SSYDu)N{_0Mhh_pQS~hLx5$9zybl5 zB?2o17+4kvED>N?A+Sb(fu%!miXh7j!8w8qEJp+{2(sv35xfDiK=3D6$q%LltwJo3oGlg{q zD+9|C))lNQM_5m=3DvfN<3!^*(&gY^$6?R2oQ^svofgQmL+%vYFMUNFC5X8FPVhZ!2Q z515}YvwUIx!OYUa(!s*O@`U*XDBhtdn1N*h+X^<8BcY%ibcXE?8%zMgzXHm5Y-`w9 z?ttR*1=3D|NU29`B!8`xO3ug6+-pL{%oq`WKvUI9a}M{^4X``N8#vi=3D~5m0yhK84emSKEKj)Ka5J#{ z;QqtS(!$fj!@x3wXATd`5}q|Y3@jbI6L?u>@GjtGU^&5ih8LVn7+8Mr{^4b5;p^dJ zU|GSpfsbVe-vK@bmKS^<_*j1MHSjaAtl;0k&$5Mo4?hFT3s7W!sptR0&%gqXXi%Io zuz;g`g1{6325_XaOc9tPz`$}s;0!3G+z?=3D3nIbqxkY$D78bJn@9fAi0S&j&v5M*F^ zBKSg(<&EG6K?ar?!gGXKmI$vAX4xRTMVNtQf$$PxmOa7;gjrfdCWtVwY!Tig%yL5b zf-uVs;Rp4?EH8vV2s5x85k4Wzaz*%tFv}C+7s4!GgntM#uuKq{A;PjoWP=3DFH7Lgqy z3@kfD_K2_?5IG^jz;Z_9f(XkUkq06yPefjbFt9ujc_PB{N2EoRfu%*XLzJaQbc!eg z%M8&uqAUwUH-MO8bHrFyh^-N0U|A!!L5yXK*bXrUmiirHd&F1{h#e7QV7Vc7M~vl( z*cUMdmKox6#920oZxLr;nIpbLoMnsn4sn(P;wQveE{I?M8?p?_;PoWXth9#x0y|3!#{>?RH(Xn|8Cbrsw{Wnm;cVby5JXnS zBf#>3aSJnpenx(7s=3DjzpNrrx5YHq21L1IpFeo87sW?p8AUh;HT4JLUO{gT{*>B$;Q zlhfV(LN)17XHRUDpRS|HB*SzfW4o6o(=3D^n8YO=3Dj35hzU@N~s^YTm#j0_3W z1+|&V8GWXAYBQ-ba!%i<&6F;c0#yv#YXdqRkb!}bVTsXnBON9`OVBhhsG|G=3D>c%iI zGJpdJX-g(6Xdf>FBf|lGh^4S~^CHtP>M)5*f)4Hj+1&sNS0rs_(;0P{#3kLKx*3EZ zx}mF{7$T+{>N1Jfr-PRYfew3vNP`>#!k{zNK&Co?7U2H*|6c?o$iTqR0X2>TDh`Ql z28Jn6aRD^(1yFGbG;z@RO-u}oQ49)b633t#G|;I6DrLhifT9Lv=3Dor34rt=3DHq3RpZ z#NR;051@(vg^DwXp_&gmK!k~bar$+ACP7KiSzaK^8qgFOOlLG;5|?yjhK3Jl4GL1? z3Yu;Rl1_$7H=3Ds$EOiu(!w?d^EK-)HubWfW;5hT4FD&2r4y<_@8119nMlTc{}NmTdW zf{Ht!iG$8f0(%8b{0~(90W@)5(Af!~{3eBJz8pk+dblBzprk&8!_a`H$YFY;A(ObI zA5@wFGzfv@!}#eNLDHb}PQgw>lWv^;(2z;IeiBSKC`mTj2OZG?vi<;69Fz`0iT^G{eG~(OEX3;|d62|why=3DqEsKqb`fsU*I z8RP&}4>O1jv~ZV!k)Z)94s($3^ovGJ;*yF`X$H_>3({ej`qLSWL5T}0-GCR>7HO&TZHPHhpi3wiKquzG0uQuj0;HhK{YJ9ni$TK*bx-#97(FK{9>0DU+b27=3D**X02;qTGE{x~MN=3DkmNeifS1DdqwbVf5K zamgsCG=3Dmyy_+(Ev1WDIGr5n(sd#5LYq(M97K^_IKxI?mg{q%`uOycziV7fsSKT^WJ z2o*noCjJO2&H&m$f@IuhsJH`~I12|j92gqV#6=3D4D}< z;*uUv=3D>|||97#HIdLu|W3o6Y3nn*>GuAaUTB;5m*Zh%U|68W6z56zjx>(@f18MIMD zcOO*T0ZsfoRJ;LA`~g(_0Gjwms5k>Cvmm*Si4z{K>}7ohQ2>mPD~)G{(m$bjkwaTypGo@|J?wx+P~`|xzXB=3D_+4)xg|37FC5=3Ddef zOagke0IWN80V8P;;6DQ@j($A%a;P}^$r<|~;`I#ZJL)e&BpA?d zYPb&)2aO~^o6IopzXpjnF)|cD3lmt1{mKh2i5M0@QzlHDfscVfh=3DGw|1vnV%p*unu z7#O%f5?zc8=3DzBA@pyKG~I(S0G(T`~lf{LRb6rBteN7>2SAPo zO=3D826%z3Cd?7&A@*18W82SovN3m2@{@(d*2#mIoZ4V{4>>Y#RzQ~vz_4>}|VqYq?IR^bqKsAtf6C=3DX}XjH=3D*6b4}P*cf1!i-3w8kZ~p;^<9h%Xs7QmIPo(u z2rz+<41#2NkYWY~26u@1dIt3KbF`p&2zJX1EI?u)8W_+wTINH=3D(T*ZysDO&2pYzuY z_5c$DWV;~fbO2}&_ChtFAB{2>Dvo}%#0IGN1<>LEP$38P*(H#810zEMw0Z|oAgP;R zihc{e1LLs0M}Y2VI!B8K*yRWx6>1xEqt!c5Zj3LjLIuVN424 zCo(3^lAC@Yj7fm&1jvhj{{KIbvHeyU(=3DkR~@R%IP&mcVAF@i~W`hf^02~LSekh=3DBT z^oJ2l=3DAwLWAY4UIF9@U*gdxfuBAFzZ41}jgMKalOZV-l4Xa*o{;?o{jnI6Qq}B$N1bp9m(7X;DlPoQqW<;%BETMlqRl7JzO=3DU|?X#o1PfOWG?yu%B=3Dtm lwlIK7C&$6K{Vz}e;CDN&U7Sbx>Pii8UR@kWeorT --=20 2.53.0