From c839eacbdf854aa1e00623031b6dc15dd13c51ee Mon Sep 17 00:00:00 2001 From: oliverschmidt Date: Wed, 29 Sep 2010 19:44:01 +0000 Subject: [PATCH] Added cc65 target 'atari' for Atari 8-bit machines. This addition was triggered by exsistence of http://www.atari8ethernet.com/. --- cpu/6502/dhcp/Makefile.atari.defines | 1 + examples/email/Makefile.atari.defines | 1 + examples/irc/Makefile.atari.defines | 1 + examples/webbrowser/Makefile.atari.defines | 1 + examples/webserver/Makefile.atari.defines | 1 + examples/wget/Makefile.atari.defines | 1 + platform/atari/Makefile.atari | 62 ++++++++++++ platform/atari/README | 8 ++ platform/atari/atari.cfg | 44 +++++++++ platform/atari/contiki-conf.h | 75 +++++++++++++++ platform/atari/contiki-main.c | 106 +++++++++++++++++++++ tools/atari/dos.sys | Bin 0 -> 4625 bytes tools/atari/dup.sys | Bin 0 -> 5126 bytes tools/atari/sample.cfg | Bin 0 -> 29 bytes 14 files changed, 301 insertions(+) create mode 100644 cpu/6502/dhcp/Makefile.atari.defines create mode 100644 examples/email/Makefile.atari.defines create mode 100644 examples/irc/Makefile.atari.defines create mode 100644 examples/webbrowser/Makefile.atari.defines create mode 100644 examples/webserver/Makefile.atari.defines create mode 100644 examples/wget/Makefile.atari.defines create mode 100644 platform/atari/Makefile.atari create mode 100644 platform/atari/README create mode 100644 platform/atari/atari.cfg create mode 100644 platform/atari/contiki-conf.h create mode 100644 platform/atari/contiki-main.c create mode 100644 tools/atari/dos.sys create mode 100644 tools/atari/dup.sys create mode 100644 tools/atari/sample.cfg diff --git a/cpu/6502/dhcp/Makefile.atari.defines b/cpu/6502/dhcp/Makefile.atari.defines new file mode 100644 index 000000000..72d71db8b --- /dev/null +++ b/cpu/6502/dhcp/Makefile.atari.defines @@ -0,0 +1 @@ +DEFINES = WITH_DNS,WITH_GUI diff --git a/examples/email/Makefile.atari.defines b/examples/email/Makefile.atari.defines new file mode 100644 index 000000000..7f438d1d1 --- /dev/null +++ b/examples/email/Makefile.atari.defines @@ -0,0 +1 @@ +DEFINES = WITH_CLIENT,WITH_DNS,WITH_GUI diff --git a/examples/irc/Makefile.atari.defines b/examples/irc/Makefile.atari.defines new file mode 100644 index 000000000..7f438d1d1 --- /dev/null +++ b/examples/irc/Makefile.atari.defines @@ -0,0 +1 @@ +DEFINES = WITH_CLIENT,WITH_DNS,WITH_GUI diff --git a/examples/webbrowser/Makefile.atari.defines b/examples/webbrowser/Makefile.atari.defines new file mode 100644 index 000000000..54380b38d --- /dev/null +++ b/examples/webbrowser/Makefile.atari.defines @@ -0,0 +1 @@ +DEFINES = WITH_CLIENT,WITH_DNS,WITH_GUI,MTU_SIZE=1000 diff --git a/examples/webserver/Makefile.atari.defines b/examples/webserver/Makefile.atari.defines new file mode 100644 index 000000000..a17e2c1c1 --- /dev/null +++ b/examples/webserver/Makefile.atari.defines @@ -0,0 +1 @@ +DEFINES = WITH_LOGGING,WITH_BOOST diff --git a/examples/wget/Makefile.atari.defines b/examples/wget/Makefile.atari.defines new file mode 100644 index 000000000..405794c09 --- /dev/null +++ b/examples/wget/Makefile.atari.defines @@ -0,0 +1 @@ +DEFINES = WITH_LOGGING,WITH_CLIENT,WITH_DNS diff --git a/platform/atari/Makefile.atari b/platform/atari/Makefile.atari new file mode 100644 index 000000000..aa3726caa --- /dev/null +++ b/platform/atari/Makefile.atari @@ -0,0 +1,62 @@ +# +# Copyright (c) 2007, Adam Dunkels. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# This file is part of the Contiki operating system. +# +# Author: Oliver Schmidt +# +# $Id: Makefile.atari,v 1.1 2010/09/29 19:44:01 oliverschmidt Exp $ +# + +ETHERNET = cs8900a + +CONTIKI_CPU = $(CONTIKI)/cpu/6502 +include $(CONTIKI_CPU)/Makefile.6502 + +LDFLAGS += -C $(CONTIKI)/platform/$(TARGET)/$(TARGET).cfg -S 0x2000 + +ifeq ($(MAKECMDGOALS),disk) + ifndef DIR2ATR + ${error DIR2ATR not defined! You must specify where dir2atr resides} + endif +endif + +disk: all + mkdir -p atr + cp $(CONTIKI)/tools/$(TARGET)/dos.sys atr/dos.sys + cp $(CONTIKI)/tools/$(TARGET)/dup.sys atr/dup.sys + cp $(CONTIKI_PROJECT).$(TARGET) atr/autorun.sys + cp $(CONTIKI)/tools/$(TARGET)/sample.cfg atr/contiki.cfg +ifeq ($(HTTPD-CFS),1) + cp httpd-cfs/index.htm atr/index.htm + cp httpd-cfs/backgrnd.gif atr/backgrnd.gif + cp httpd-cfs/contiki.gif atr/contiki.gif + cp httpd-cfs/notfound.htm atr/notfound.htm +endif + $(DIR2ATR) -b Dos25 1040 contiki.atr atr + rm -r atr diff --git a/platform/atari/README b/platform/atari/README new file mode 100644 index 000000000..0aec8bb91 --- /dev/null +++ b/platform/atari/README @@ -0,0 +1,8 @@ +The platform/atari/ directory is used for targeting an Atari 8-bit computer. +Most things are shared between the 6502-based targets so please consult +cpu/6502/README for further details. + + +The following Atari 8-bit Ethernet card is supported: + +- Atari 8-bit Ethernet Project: Use driver cs8900a.eth with address $D500. diff --git a/platform/atari/atari.cfg b/platform/atari/atari.cfg new file mode 100644 index 000000000..7b4fac680 --- /dev/null +++ b/platform/atari/atari.cfg @@ -0,0 +1,44 @@ +FEATURES { +STARTADDRESS: default = $2E00; +} +SYMBOLS { +#__STACKSIZE__ = $800; +__STACKSIZE__: value = $800, weak = yes; +__RESERVED_MEMORY__: value = $0, weak = yes; +} +MEMORY { +ZP: start = $0082, size = $007E, type = rw, define = yes; +HEADER: start = $0000, size = $0006, file = %O; +RAM: start = %S, size = $BC20 - __STACKSIZE__ - %S, file = %O; +TRAILER: start = $0000, size = $0006, file = %O; +} +SEGMENTS { +EXEHDR: load = HEADER, type = ro; +STARTUP: load = RAM, type = ro, define = yes; +LOWCODE: load = RAM, type = ro, define = yes, optional = yes; +INIT: load = RAM, type = ro, optional = yes; +CODE: load = RAM, type = ro, define = yes; +RODATA: load = RAM, type = ro; +DATA: load = RAM, type = rw; +ZPSAVE: load = RAM, type = bss, define = yes; +BSS: load = RAM, type = bss, define = yes; +HEAP: load = RAM, type = bss, optional = yes; +ZEROPAGE: load = ZP, type = zp; +EXTZP: load = ZP, type = zp, optional = yes; +AUTOSTRT: load = TRAILER, type = ro; +} +FEATURES { +CONDES: segment = INIT, +type = constructor, +label = __CONSTRUCTOR_TABLE__, +count = __CONSTRUCTOR_COUNT__; +CONDES: segment = RODATA, +type = destructor, +label = __DESTRUCTOR_TABLE__, +count = __DESTRUCTOR_COUNT__; +CONDES: type = interruptor, +segment = RODATA, +label = __INTERRUPTOR_TABLE__, +count = __INTERRUPTOR_COUNT__; +} + diff --git a/platform/atari/contiki-conf.h b/platform/atari/contiki-conf.h new file mode 100644 index 000000000..38b1cd280 --- /dev/null +++ b/platform/atari/contiki-conf.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2007, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Oliver Schmidt + * + * $Id: contiki-conf.h,v 1.1 2010/09/29 19:44:01 oliverschmidt Exp $ + */ + +#ifndef __CONTIKI_CONF_H__ +#define __CONTIKI_CONF_H__ + +#include "6502def.h" + +#define CTK_CONF_MENU_KEY CH_ESC +#define CTK_CONF_WINDOWSWITCH_KEY 0x17 /* Ctrl-W */ +#define CTK_CONF_WIDGETUP_KEY 0x01 /* Ctrl-A */ +#define CTK_CONF_WIDGETDOWN_KEY '\t' /* Tab or Ctrl-I */ + +#define BORDERCOLOR COLOR_LIGHTBLUE +#define SCREENCOLOR COLOR_BLUE +#define BACKGROUNDCOLOR COLOR_BLUE +#define WINDOWCOLOR COLOR_GRAY1 +#define WINDOWCOLOR_FOCUS COLOR_LIGHTBLUE +#define WIDGETCOLOR COLOR_GRAY1 +#define WIDGETCOLOR_FOCUS COLOR_YELLOW +#define WIDGETCOLOR_FWIN COLOR_LIGHTBLUE +#define WIDGETCOLOR_HLINK COLOR_CYAN + +#define EMAIL_CONF_WIDTH 39 +#define EMAIL_CONF_HEIGHT 19 +#define EMAIL_CONF_ERASE 0 + +#define IRC_CONF_WIDTH 40 +#define IRC_CONF_HEIGHT 23 + +#define WWW_CONF_WEBPAGE_WIDTH 40 +#define WWW_CONF_WEBPAGE_HEIGHT 19 +#define WWW_CONF_HISTORY_SIZE 0 +#define WWW_CONF_MAX_URLLEN 80 +#define WWW_CONF_MAX_NUMPAGEWIDGETS 20 +#define WWW_CONF_RENDERSTATE 0 +#define WWW_CONF_FORMS 0 +#define WWW_CONF_MAX_FORMACTIONLEN 20 +#define WWW_CONF_MAX_FORMNAMELEN 20 +#define WWW_CONF_MAX_INPUTNAMELEN 20 +#define WWW_CONF_MAX_INPUTVALUELEN 20 + +#endif /* __CONTIKI_CONF_H__ */ diff --git a/platform/atari/contiki-main.c b/platform/atari/contiki-main.c new file mode 100644 index 000000000..08ebba4e5 --- /dev/null +++ b/platform/atari/contiki-main.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Oliver Schmidt + * + * $Id: contiki-main.c,v 1.1 2010/09/29 19:44:01 oliverschmidt Exp $ + */ + +#include "contiki-net.h" +#include "ctk/ctk.h" +#include "sys/log.h" +#include "lib/config.h" +#include "net/ethernet-drv.h" + +#if WITH_GUI +#define CTK_PROCESS &ctk_process, +#else /* WITH_GUI */ +#define CTK_PROCESS +#endif /* WITH_GUI */ + +#if WITH_DNS +#define RESOLV_PROCESS &resolv_process, +#else /* WITH_DNS */ +#define RESOLV_PROCESS +#endif /* WITH_DNS */ + +PROCINIT(&etimer_process, + CTK_PROCESS + RESOLV_PROCESS + &tcpip_process); + +/*-----------------------------------------------------------------------------------*/ +void +main(void) +{ + struct ethernet_config *ethernet_config; + + process_init(); + +#if 1 + ethernet_config = config_read("contiki.cfg"); +#else + { + static struct ethernet_config config = {0xD500, "cs8900a.eth"}; + uip_ipaddr_t addr; + + uip_ipaddr(&addr, 192,168,0,128); + uip_sethostaddr(&addr); + + uip_ipaddr(&addr, 255,255,255,0); + uip_setnetmask(&addr); + + uip_ipaddr(&addr, 192,168,0,1); + uip_setdraddr(&addr); + + uip_ipaddr(&addr, 192,168,0,1); + resolv_conf(&addr); + + ethernet_config = &config; + } +#endif + + procinit_init(); + + process_start((struct process *)ðernet_process, (char *)ethernet_config); + + autostart_start(autostart_processes); + + log_message("Contiki up and running ...", ""); + + while(1) { + + if(process_run() < 2) { + + etimer_request_poll(); + } + } +} +/*-----------------------------------------------------------------------------------*/ diff --git a/tools/atari/dos.sys b/tools/atari/dos.sys new file mode 100644 index 0000000000000000000000000000000000000000..12c3eaa56c08043318ada38adbba20cf93c90d0e GIT binary patch literal 4625 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 literal 0 HcmV?d00001 diff --git a/tools/atari/dup.sys b/tools/atari/dup.sys new file mode 100644 index 0000000000000000000000000000000000000000..2aa1ba4fa992e4c035165c104fc134830c4570ec GIT binary patch literal 5126 zcmezWpGTh6*wt!wt&3-{w}O9wYmj4zr=Pn*aAa_ZtFMBmr$U%(P_U=JpTdGo>$Wa% z_78{*@^tqIQ82W$Fi~&}aSZZQaP|)h(3?HmQBMJEh>K^Ct8<8dP^5x_r=EhFe~_FxS~GdI~PCKCU6IU^N=SnhFX&a1}oOjxMuZ^%R0!{TzKEDnLdk z_(JS<3{h}&aS3t_4xa6%r{Lr7>fl z#s#&NTAKP9nrqa5sY~jfQd{)@Mw{S^zWJgnnOcKZs<#F&72s@W73k%=q);ZgcAw-) zpAY&g8G7f6t~|X+LE)^p&mM(Z&%EN)q7nrc|6m0pJ%eH$g_6pGRE0=|OGmFxE& zN`c-law{uZB~~i5O0MMZbzxp9-|Nb}GOgExc_m}7C$qvl!$tpRz3A&#URk(EQDK?n zN{8NkObV3-Cue^+Z}HO6KAtGG&pX!UjVhenmfjh2T(U4+YN*^Oe`>UeDDFcQ5dg~bF_g2ZCw7MX?QfqFt?A%(}m3nh)WM8~^(Z?via`xP6***sO zMG6Wx3>6+5DC{>_$-YQnt{3x4=DAMHegEVXUK*}tl(%@xAb*ni1GCQx)pZQ=duwD* zx?K3|vrQGAG<9`@T^)m*JrsfiT%C1%JcC2P@n%0eS{dvN1BD%GYeCvRNUbzpqy+O$ zh=L$~p6E%x3*0Le=Q=Sfyaai9rRySPg$;%)8G4!I7b$=xR(_o8!n{&; zt}F9Om)?)EE3JAz%dV{jd68+QVeco|MFL>QuVe#xqXwo{;iciqFEGwZ*11m1D;atj zooOr-t z@L{DMh`E4k=NH+zUt~|bIKXT0rH?^=r9DV^Dp)J~bSZ&Ie#J!sD|zNRG5fqU42cYIRZxmlQV8*fW=TCgz1c{a z6CA#?LHSu%*Dc83S4Sbl-+s1#KnSQr@$(N+aP;x<4|jE$&A`H9W@)bA7Ub%x5DYFp zf@jZWU{C;;1)hHHy1Ke97FHmGjE(f1{e3}_3=9l8py&cQmq8vJT^HCFF(_Qp`@rm@ zue!3Kw_kZBL+=C-F;RJu03?J#31uZpFoOeE1Qe-lzHso}1Z9}i0;ZjFly4@hT;S*s_-fD@92va85FFDV z7+3UcR$j!kfO+pE<&z2@SY~cgKJnrK*M$!dzSv4VkO+hWmE^tfVdd5ftOI74{n_*yw>`%KL-ON#_q1CtWXa zEMn;UC+D+5^&gZM@${KK>fLzP3c+&a9`*rg~ zA2?p%IO%fX$x6-(Oe;ASDS$!*6xn_ML8Zb;B2DWs#rj!Mv7L9+bhtp7i{XTlZgX%|E%F9?Ww+n0I)@sV`7eU{?3x zSNsdMaite1L8;GmWu7tD3zVnBJv^N~6kLKpR)_e53TR))5c}E4SskfPS1_9GVq`UY zwfdUB`&X{&{k#9{-~AWFSB64aygh&SubdBdfDgao+CTd*d|b8m@BR<3LCT)JxbRt_ zOmZdLq9+UD6=I&OWMA}TL6Snu6CWW-KYvhaf;1Cmp8$JH-bi7;L90}o^jc>5lPn(s z6v`xh6eK|n3Q)fxRB(;(3=RpNeN_Vz#tQoldcVnW8uV&w_Nr?t1Z%G3SfmLu z30#I2t^5QwcO^3{dqi?2YwuCXl|Oqw>#r2<{h`0oxc8W($I8;)2TUs!dLJ^K+b7{O zTi=IY5gu#k%@I(k3lal0?fhKB!A%8F(@ zH7LkGNI@5z#bND2BWM!Qo2^iywf2kbNv026D^0;c;lr<(uu@aul)*}db@N1f=ZQY> zyTE*Io+zjoSSk8|;e*fv<_|10d_EekoDJ3h$jwLW206RxfQl_h zE(k_SO`dKF{@x(tLxWuv0)qVAgB*Po9D`gPXFEHFf{HjR1xIj&=;;^c=;P_)7~&eN z08LGLvscQtx~=@u>bmxuT&v^E5ZP44V}xet1av{v4Pq`Pz6@&=loe!;Fm zAqr0ZAs%241?wn)^KOu9NNAAX?3HngbReo%vi7pcuQcvumtXso$>L>0FN^%zXG|{{ zdRgVyvdEuhlV8g!|CU{T1J_DFuoh7MxT~|0p?98Wud@y)vbmUhf6A@pX72qZ2daaA z%dKUS@BJgU_McquUpb!&ZLnG$Zg~SPgslpaItmMQ45W4Di5jpe9M|#b(^fdEvzCR~ zv!R!T*?{>SE3?8r9Z+kAL-<1&$RRAC()cYa^M>PV=ZPAuJ~vMkVq`7YRSJ~`Yn^p2 zta#_Fv-UqIJ9?`xP+ZF)EWortX)PDC$69V?kClHFnAJ0SxtTM1xtM(_wAaoP71*)% zKPVEuw7P;~MZpvj4?g^g3s`o#=(I}h^wepUUc|6a%46qGxkjmsnLp(^1fH&Clka6= zUdt}u%gUU&W1(;BrSoXK?gY!pwgf;2CW(~ z)$sk3JI5q{LGT@;Jg80l1)et6{*z01$Hjbs`5iZN!rE_g5))X~{+F}pWn@+;Vh5+D zgryuGWLD}f(gL+a1Hcrd$m3Ya(8|#}Pdp(b1JpbRb&&ksz}XCxrhWaxTw@Z~ z{RW^~+T{bY&puU9Gec)(94OV8gR84cdKXw%I`}+MUc{jA0;LH8YPB--a>@5{%P$fD z*RJ5I6}eJf$quUL!k!3l9RSsw9}LfN$uH7bSqm{<=c}9mvyYVCB83HaMOeN0_#mr<_~f!x#vPFcd+%y zbvMX`pw=s>qrfG9L1+=&XF6Zy448cqbzvoQ*b|UV0tf{P`wbvf_fn1zqS%5r3mUvD zSzD!68n;S=^A#&JUm5qZg0eN6d@sBF%36tBHhEC?W5{I(39Mz6Kg%vZf$PFkP>N@h z-*9&=yZi-?m9=NtsDtYwq8cv%ZFh+Q6>K@(PfX_Z=j8LXWr>ah;m4^xmg>OCykcSQ1m$p+?g zQzStAqmq5cBrV<^mhAnk-}Uy0b(z``W`azJ_L#HlK>YR87CdVbp^CV2r4dER&rcmTFD8iKfzJF@*t>Ml>}9* zY_Rsb&OA{8{*^2s?qQfLsFoF2`4c22JlB)?p9k{==6{~dYY$7#bzxq61Z05EWC_sV zf-bnp1*$}JfN4Ci&j4atgr) z3fl}5RR-!(`qu%V{xw6dC-Wi(g|H_F8ZI!O`zn{Pk^!P)tp{`OcR7V^ zhHJmd34q(({EBP8%bjF4;99wAkpU=X>I~K{kxdBjadixKg%sk33O=qOA+ABQL5Y(= zll@?Lcd6_Jp>q&Ljsi+6U1rwEo)C~a$1H!2S^n-4*$;2eG0Q_lS6YGO zz!9`}iR{c8*%v2H&i@ z_p*Y5bMF$_cTDmpXMfN>sq;ZyVS$l>)&gb;Jyv-=7Woc=Z@jD^b?2Dn1um~FT4V(A zb;63Ztn%wvW00e- zD=303UK$wipX4&&wRp*XlFNYQq<{g_%Ks-B5A?hebv{8w~wiU0oDh3>88=f