From 63b07ef4ddc397e29dead8e3488360c5e5375d61 Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Wed, 14 Jul 2021 12:04:04 +0100 Subject: [PATCH] Add CPU temperature readings to UIs The CLI now has --get-temperature and the GUI shows the temperature in the status bar. The GUI refreshes once every second. --- Makefile | 4 +- platforms/amiga/build_hdf.sh | 4 -- .../amiga/pistorm-dev/pistorm-dev-enums.h | 1 + platforms/amiga/pistorm-dev/pistorm-dev.c | 38 +++++++++++++++++- .../pistorm-dev/pistorm_dev_amiga/CopyMems | Bin 10084 -> 10120 bytes .../pistorm-dev/pistorm_dev_amiga/PiSimple | Bin 17676 -> 17804 bytes .../pistorm-dev/pistorm_dev_amiga/PiStorm | Bin 16512 -> 16816 bytes .../pistorm_dev_amiga/gui_interact.c | 33 +++++++++++++-- .../pistorm_dev_amiga/pistorm_dev.c | 6 +++ .../pistorm_dev_amiga/pistorm_dev.h | 2 + .../pistorm_dev_amiga/simple_interact.c | 13 ++++++ platforms/amiga/pistorm.hdf | Bin 2621440 -> 2621440 bytes 12 files changed, 90 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 797ba6d..733a214 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ CXX = g++ WARNINGS = -Wall -Wextra -pedantic # Pi3 CFLAGS -CFLAGS = $(WARNINGS) -I. -I./raylib -I./raylib/external -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -lstdc++ +CFLAGS = $(WARNINGS) -I. -I./raylib -I./raylib/external -I/opt/vc/include/ -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -lstdc++ # Pi4 CFLAGS #CFLAGS = $(WARNINGS) -I. -I./raylib_pi4_test -I./raylib_pi4_test/external -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE @@ -52,7 +52,7 @@ CFLAGS = $(WARNINGS) -I. -I./raylib -I./raylib/external -march=armv8-a -mfloa #LFLAGS = $(WARNINGS) `sdl2-config --libs` # Pi3 standard raylib stuff -LFLAGS = $(WARNINGS) -L/opt/vc/lib -L./raylib -lraylib -lbrcmGLESv2 -lbrcmEGL -lbcm_host -lstdc++ +LFLAGS = $(WARNINGS) -L/opt/vc/lib -L./raylib -lraylib -lbrcmGLESv2 -lbrcmEGL -lbcm_host -lstdc++ -lvcos -lvchiq_arm # Pi4 experimental crap # Graphics output on the Pi4 sort of REQUIRES X11 to be running, otherwise it is insanely slow and useless. #LFLAGS = $(WARNINGS) -L/usr/local/lib -L./raylib_pi4_test -lraylib -lGL -ldl -lrt -lX11 -DPLATFORM_DESKTOP diff --git a/platforms/amiga/build_hdf.sh b/platforms/amiga/build_hdf.sh index 91e784e..d746967 100755 --- a/platforms/amiga/build_hdf.sh +++ b/platforms/amiga/build_hdf.sh @@ -21,7 +21,3 @@ xdftool pistorm.hdf open part=DH99 + write piscsi/device_driver_amiga/pi-scsi.de xdftool pistorm.hdf open part=DH99 + makedir rtg xdftool pistorm.hdf open part=DH99 + write "rtg/PiGFX Install" rtg xdftool pistorm.hdf open part=DH99 + write "rtg/PiGFX Install.info" rtg -xdftool pistorm.hdf open part=DH99 + makedir "rtg/PiGFX Install/Files" -xdftool pistorm.hdf open part=DH99 + write rtg/rtg_driver_amiga/pigfx020.card "rtg/PiGFX Install/Files/pigfx020.card" -xdftool pistorm.hdf open part=DH99 + write rtg/rtg_driver_amiga/pigfx030.card "rtg/PiGFX Install/Files/pigfx030.card" -xdftool pistorm.hdf open part=DH99 + write rtg/rtg_driver_amiga/PiGFX.info "rtg/PiGFX Install/Files/PiGFX.info" diff --git a/platforms/amiga/pistorm-dev/pistorm-dev-enums.h b/platforms/amiga/pistorm-dev/pistorm-dev-enums.h index 8d85197..15fb424 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev-enums.h +++ b/platforms/amiga/pistorm-dev/pistorm-dev-enums.h @@ -34,6 +34,7 @@ enum pistorm_dev_cmds { PI_CMD_SHOWFPS = 0x0118, // [W] Enable/disable RTG FPS display. PI_CMD_PALETTEDEBUG = 0x011A, // [W] Enable/disable RTG palette debug. PI_CMD_MEMCPY_Q = 0x0120, // [W] CopyMemQuick debug thing + PI_CMD_GET_TEMP = 0x0121, // [R] Get the CPU core temperature PI_CMD_QBASIC = 0x0FFC, // QBasic PI_CMD_NIBBLES = 0x0FFE, // Nibbles diff --git a/platforms/amiga/pistorm-dev/pistorm-dev.c b/platforms/amiga/pistorm-dev/pistorm-dev.c index 84cafa1..6201f44 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev.c +++ b/platforms/amiga/pistorm-dev/pistorm-dev.c @@ -17,6 +17,8 @@ #include #include +#include + #define DEBUG_PISTORM_DEVICE #ifdef DEBUG_PISTORM_DEVICE @@ -56,6 +58,37 @@ static uint32_t pi_dbg_string[32]; static uint32_t pi_cmd_result = 0, shutdown_confirm = 0xFFFFFFFF; +static bool pi_cmd_init = false; +static VCHI_INSTANCE_T vchi_instance; +static VCHI_CONNECTION_T *vchi_connection = NULL; + +static uint32_t grab_pi_temperature() { + if (!pi_cmd_init) { + vcos_init(); + if (vchi_initialise(&vchi_instance) != 0) { + DEBUG("VCHI initialization failed\n"); + return 0; + } + if (vchi_connect(NULL, 0, vchi_instance) != 0) { + DEBUG("VCHI connection failed\n"); + return 0; + } + vc_vchi_gencmd_init(vchi_instance, &vchi_connection, 1); + pi_cmd_init = true; + } + if (vc_gencmd(tmp_string, sizeof(tmp_string), "measure_temp") != 0) { + DEBUG("Could not get temperature from VCHI\n"); + return 0; + } + + // Trim to '=' + char *ptr = strchr(tmp_string, '='); + if (!ptr) { + return 0; + } + return atoi(ptr+1); +} + int32_t grab_amiga_string(uint32_t addr, uint8_t *dest, uint32_t str_max_len) { int32_t r = get_mapped_item_by_address(cfg, addr); uint32_t index = 0; @@ -605,7 +638,10 @@ uint32_t handle_pistorm_dev_read(uint32_t addr_, uint8_t type) { case PI_CMD_GET_FB: //DEBUG("[PISTORM-DEV] %s read from GET_FB: %.8X\n", op_type_names[type], rtg_get_fb()); return rtg_get_fb(); - + break; + case PI_CMD_GET_TEMP: + return grab_pi_temperature(); + break; case PI_DBG_VAL1: case PI_DBG_VAL2: case PI_DBG_VAL3: case PI_DBG_VAL4: case PI_DBG_VAL5: case PI_DBG_VAL6: case PI_DBG_VAL7: case PI_DBG_VAL8: DEBUG("[PISTORM-DEV] Read DEBUG VALUE %d (%d / $%.8X)\n", (addr - PI_DBG_VAL1) / 4, pi_dbg_val[(addr - PI_DBG_VAL1) / 4], pi_dbg_val[(addr - PI_DBG_VAL1) / 4]); diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/CopyMems b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/CopyMems index 70c845e4316385a45953507ef044f1d07404a748..8c48396c4ca15a10ff9aa8e8af3b28664e89f5de 100755 GIT binary patch delta 1946 zcmYk6ZD^BM6vywAHffV4Y2F$;Ytz)aRz=&+s+6q^=V~i;>pJa5C!J5zyfm44Daq3s zU7_Oq(230I74d_NBK;sThFcZfC__Xx8U0XP8D+@mhcVocB11+ePWQW+vITz6z4tul zoO{my-aNl_PrNm`%6(M`5rNG@6#XWI`ReKQx|TdW@x){+o|({Y6?vM+wA$w8kFVjB zY`MWRKGS8kXnv=t{fgC?_6N_ruywO?x@63bBi^m*_szI4gu2`%Vok?>_RhR;8ts10~;?v|d?nJ8l_x zO6p>H#rB1ETn?5UFxiXc&9Z~#_tx#`JJoe`XjFyRr(~ObNSl|__U$HzMc%b9<2N(s z$Y|P_Y%BjkTaqrlM44LOQpQ)^5Xr#mEgJGeNDx9_GnvV zzvncmmpz-Ytnt34EzKP8{%z7`WxxN_cmw6BU%wC!Mj`wJ`bj38$Q)0L2Lhn#90OJN z4IxUY!^)mk(%Du+D>e2(8h(Za%GgV7Us4J-XM_^=!!fvyoxJW|pft~`a8rnY*M~DV zz{duDcK0Ke{~W}q4mg0iOct&EEo&ng@}bD6NfhJKzjlf$u4qtt?-| z4(8opgCOgp@R)feT!496L%~wovXaj_4Ck?Cf3jvH>nz-6 zjfN#z=6$flSrS;bf+o}OkTVQGKTx2f6^;N!Io1K2I?%-N0L>`Gi6lsci|X(4kV~Rm5NJ1C%y|DrXMcJ zwyGL;TnJ&(d!pG?!eGh=A&GUVV9goXa7bDGv+_b!RrMrOvp$^AhoXj_hMW;HMsiq% zd0H-1edwNNYSM>CjIc5aTdy2g6CUqnTCCz;&kP@aGn#sPBoRKyq1y^}J(<^I@mMyK zibYhAaNgrl^gn-=<|Q75%!TdvAh9miRct5{i6uir|Jt2gFk*E*nok%xBa+Av=8ent z>OH%Xg%rtXXf(=9ShhZM4G)im<55+SurBg2>4{v(Fb*?ys+LW9ERq?HqN6Cc%Z2Ku z%@+&SY$%Z{WO8uh{}U#his;#BZX~Ic6XrSD9H`M+Wlx|%Ym@mvlRB_MiMgl|&1Tb7 zDD3lcHqgQs?LlCl_DHtZv~2r81wR+th^B_4S;Wq&4b9vU)qJ7JWMVKI$|j=p@1K;D zHJvYx@s^sy$xNX<&l2k*y(5v1^oDY(ORn~P`M9Q2TPxdxb<`FQ*4NvWq9&5&4h@dP zI6LkMVf&&+$4EMCBr^2x49Z)<7VWxR2{xLXLawi^d+#`Ig~L^sB6o<^N3jUAs>1xN z#&9N;3Z)~-M7p4tm3v%JARIp!8q8#sQ1&SvCOs8OD4jW-q@1p;)AI6mZNodtzmL1G zF6$uISn1!b`el3x)Q`(lqD~mU!YMZMziVZ!{FRpYS3F{T=3kPWXeevnRwmfqJIFvHJSMU delta 1902 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 delta 5206 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 XF|lq#zOZZ^MEJSfe0$;rPp$O-*PUV| diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiStorm b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiStorm index b1a791c82330275de9790bed2c54b9b05b465d2f..09f238ddcd21d0534ee82c637cf4cb78bdf14d85 100755 GIT binary patch delta 5195 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 E13RP$ z_wP^TpzRuwX*z0*St68C8*@CpYQDifH`a;SCs|pBPt3l;Ix>_H5A6H%0peoDQ#>HY znr$Ac@y73nGKRQGEqK2(*fc^u>4Qi3@cC$<>D{JxL!-t7hkckK8;uKnwB}_?870le z_i>rSgKLFW)TB!2w{*9Ukvv3uW0dQpEeD0a|4|m!o&J77p$Hky$Rp%e2gyPKR&OdE zmrziVC=fM{37Fm=3&t;@M}{75c%TI0^{s>C7|7*U(jW=A)wB`ZQEu+mEAiWW-H1HhhJ8_YNfeR7Rf5Dy5FKICiYURJ$ zKw7)_RFD>Y_4H`|nb5q-w?xL$gi4`N!$n@w#;>VEHF3#&VpEx0_nl6So?jp3<&6|W z{_WIEXv2&I{R!2C?`G8mnN!K!8&2W+47W-a=$FDbpXLoKGF$VjLpw(;-8%)pe2wQ^#4Jp%gkgj7LS=+YsK)MjpcQvaCHk#$e3MatwBJBV}qfUrX?ZM)eEB}BvivtI_^v zYty^j&B_?uERGO;+ea&}v5xFL))h#1@i|)}HFqxQitcu3RQDO1$#%JT-M_t_uM@4yY|!4!N}pKC#{tQiJJ#=noEZL&>&$*+w+oVW z-v-V56xc**WhHzVm2(0Q@Bu#vfO-%F%^(EY*xgEBkGuDMrV`xoH}=4}-I|ok`8hc@R8?6Xw>R1+xVDg5*B(^f+-Qx>Rk@!` zN@XgLlYKWef75#UqF<U=IZ-6g|o-l$zFoUN$>{wv80E-sD(Sn;qg>b5Hh^RyXo%l`F1J2Pnl`a!) zF9u<799$$SD*;%r>^y*?^&6ZO$dp6598oCfE69ejhQ}EJ{3^4VfCP{Y8=SL2-c|~F z!E4|GxQ*W<2_o+plyZO&KK1h|FBaczckS%^e}bJ=jrFvO;6 zipHUB?1sh}umEXDWy6*17H|X_tpM{`pMWLg<|^_M1qjPN2ap###w%oi)hm$8iqqga zz_HW0OO4c9P~UyP!{aQR*o1diAaf>8j&{8y$U4wk@Oa2An<0c=;E1iYUBSfld( zIKEc#BS8XQfXJL}01-J~1#f|Qa1(qE9uieKKmde5H$cj(&VY;HLjZd&*mJ>Amj~1X z*mU&*$hl?!9B^F+G=MAMBf!VtSoK|SACVy@FM{$GgEHU)I{|9v?ZhNL{3PIiHtY{iUe4tI%E2cu zFx$JcOce8)*;t@o%xhyyfd(U`nQf#(ko^&L7eJRrXq z8#*xj!i!$7mo-)%U=#HQcA)MTV%`LstLrb!JBed;O~BjWqrcz_9jtVod3M9*3>)H2 zg3av4dRJ$2>l*|y?-SOs2cwH@a?kDx5+g*p$S^;O{F8^|{O}RGg-H@-^$mJ~J=~K! dYkI0qG&oKpPWDWrnrZ96vBAdivhl{6{{ROzbw&UH diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c index 56e998b..4d3f098 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c @@ -19,7 +19,7 @@ extern unsigned int pistorm_base_addr; struct ReqToolsBase *ReqToolsBase; -#define VERSION "v0.3.6" +#define VERSION "v0.3.7" #define button1w 54 #define button1h 11 @@ -39,6 +39,8 @@ struct ReqToolsBase *ReqToolsBase; #define statusbarw 507 #define statusbarh 10 +static int tick_counter = 0; + struct TextAttr font = { "topaz.font", @@ -227,7 +229,7 @@ struct Gadget RebootButton = #define STATUSBAR_TXT_SIZE 128 -UBYTE StatusBar_buf[STATUSBAR_TXT_SIZE] = "Reticulating splines..."; +UBYTE StatusBar_buf[STATUSBAR_TXT_SIZE] = ""; struct IntuiText StatusBar_text = { @@ -434,7 +436,7 @@ struct NewWindow winlayout = 0, 0, 512, 200, -1, -1, - CLOSEWINDOW | GADGETUP | GADGETDOWN, + CLOSEWINDOW | GADGETUP | GADGETDOWN | INTUITICKS, ACTIVATE | WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH, &QuitButton, NULL, (STRPTR)"PiStorm Interaction Tool", @@ -446,7 +448,19 @@ struct NewWindow winlayout = static void WriteGadgetText(const char *text, UBYTE *buffer, struct Window *window, struct Gadget *gadget, int gad_max) { - strncpy((char *)buffer, text, gad_max-1); + ULONG newlen = strlen(text); + ULONG oldlen = strlen((char *)buffer); + + if (newlen < oldlen) + { + snprintf((char *)buffer, gad_max-1, "%s%*.*s", text, (int)(oldlen - newlen), + (int)(oldlen - newlen), " "); + } + else + { + strncpy((char *)buffer, text, gad_max-1); + } + RefreshGadgets(&QuitButton, window, NULL); } static void updateRTG(struct Window *window) @@ -568,6 +582,17 @@ int main() { closewin = TRUE; } + else if ((class == INTUITICKS) && (!no_board)) + { + tick_counter++; + if ((tick_counter % 10) == 0) + { + char buf[32]; + unsigned short temp = pi_get_temperature(); + snprintf(buf, 32, "CPU Temperature: %u%cC", temp, 0xb0); + WriteGadgetText(buf, StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); + } + } else if (class == GADGETUP) { if (no_board && (address->GadgetID != GADQUIT) && (address->GadgetID != GADABOUT)) diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c index d476b5f..1c24320 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c @@ -232,6 +232,12 @@ void pi_enable_piscsi(unsigned short val) WRITESHORT(PI_CMD_PISCSI_CTRL, val); } +unsigned short pi_get_temperature(void) +{ + READSHORT(PI_CMD_GET_TEMP, short_val); + return short_val; +} + // Generic feature status setting function. // Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG // pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h index 0cc08bd..4cef879 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h @@ -12,6 +12,8 @@ void pi_enable_rtg(unsigned short val); void pi_enable_net(unsigned short val); void pi_enable_piscsi(unsigned short val); +unsigned short pi_get_temperature(void); + void pi_reset_amiga(unsigned short reset_code); unsigned short pi_handle_config(unsigned char cmd, char *str); diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c index 2a07fe8..3ff1268 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c @@ -125,6 +125,16 @@ int __stdargs main (int argc, char *argv[]) { } } break; + case PI_CMD_GET_TEMP: + { + unsigned short temp = pi_get_temperature(); + if (temp == 0) { + printf("Error getting temperature\n"); + } else { + printf("CPU temp: %u%cC\n", temp, 0xb0); + } + break; + } default: printf ("Unhandled command %s.\n", argv[1]); return 1; @@ -156,6 +166,9 @@ int get_command(char *cmd) { if (strcmp(cmd, "--transfer-file") == 0 || strcmp(cmd, "--transfer") == 0 || strcmp(cmd, "--getfile") == 0) { return PI_CMD_TRANSFERFILE; } + if (strcmp(cmd, "--get-temperature") == 0) { + return PI_CMD_GET_TEMP; + } return -1; } diff --git a/platforms/amiga/pistorm.hdf b/platforms/amiga/pistorm.hdf index 068139ed54a6df1a719ccfa001244b6c4d18f686..c3f2bf1ee0d8285ddd5ab1d3be6bcd0f168bb509 100644 GIT binary patch delta 25361 zcmeHueOOf2z3$q3J{VvIaae3dKpck=5Rn;?7$nw=1aX3NBuWf5L_lB$3?CB&g9HVU zC`}9!^|)+m3{7e3vBpk)h-1ArC0>$x($rFGb7|_6(B3pPsWslzq{a}q@7goKpgHHc z=Xvg*ki4_Le&6f2_g;IgZChK9(8kdrbch{_4rPa`L){V7q3Hme1f(&~8tR()G1Qa+34|z6*M7{B z@@cV<#X9rpm@we&e28ikdTWa?*J}OlYapy%+|Pf#T?KTvqIG3`eOPs6M>nq3u`47wOOyj)9d1ViTkcVq4OKZ!kE6R;!bu~4p8s}|E4Iz$)$42ab z%dnbjh}JE5UL~4pBIX)56Q$#<@}QZlZF3RP;rKa}j>OBV>&H&aq6bF%56W4P>(-yZp^}9Q)UNN@6uo1&fZDml2|hb?ir*Ku4O9x0hH%IMY1R;E?4ihrywh zZP56~`DnR+^k)7(d5i>%J>)o$zb|X2Q5d(f)zRoy_@XK7Ml>}K{9|l{8!cSd+K2+C z3?(ca8?h*OUrdvk6z)Uc6^p{&{Pn$#1DwN@#m7X0Po0o}k=>SLqUF7YrX-TjInKlI zCL&lA7LoTy->}Fbq^+@>R2J9nIKU&2+Rh1Pr58@I)6r-Z>%~);7bhXd#5O|4#yFkO zU=+uFaWop&A{lz?g-QP$jgYUjH{X7mQ^ytYvHXBJYQ<2SJT$8H&VEdhd!$P`Gd0Xs&d$i1j^6-_BpS5LfuZz^mKw zFd_E8S&a!ATqFjIhG+hq4#)odeP-fHL0=d$%h!rSD|n(6j+TO*E27bHqo4YEbK6`W z*_%hNPPB&5`ZK#(MCUHJFwyxwIwxC$X!VbeIiZ1*bnU(c<)MyyeuJaFq&5o_$K~*iGL(V06#;xN8{H9TTlfXtnWHZrl1d z9(;qW5azP$kI`!q?o#_LA_8!qV?TaNQZW8j#3&PW=L-kFv}@?GJONdocVAmt>mS+iS}`Z@EmCY``?@B z98q7(lx4JAG^DfZIZ_HA94MnUUT$0^C3sWH=^};D!#29;^MZ%na8U!b7MN|g_S;-V z_9i9asvtVHl3Ij8mRCuabLPF3)WFMEDrvtsb0e#)q8r888g`+Iep`5lNtVqIAVtLb%o$ zd$ZcCdgSW|*-A$vzeW|;OD^&eLwaNuQMku^BfgS_)X+}z94cF$DL*mXYe7pIR(_@# z$=Z)A+u--*bPY{s*J^0AXlh`ZTAD*k#&Erzu!LGd%ymR7&rb{6R7=gi%WC+F(vy}|Dm?n^0lG!nu*%O#H()yGb5p#|A-E#cHf6ecYp^PEIw zTXBsDS#@NI$xaPgk;J=*T949-G7jZJl*uTKD3_pIfHI5aG|)#|&x<<|hq07pL>aD9 zs9i+qk>(RYuMidFE3JZ5x`^uCRUZ>U5?1`32x7w1fSDpT$Fs#{cK zD((OM|62dMEQ+RY;!r3j`zLE+o}$Uu67)*Ducl~P(n6H~>r+x`yjLhCs>&J?WMjRJ zG+9*NV1teHq4=IOn`JerOtK@Q8CiQWgVHTziAE$Umu9PQdbf*c(pdIZx=_eq^;_wp z;J&k+s73lT_0y|6^c+Ozsol9L&fBH*^0F-e6fS?jZH_3f{I%3j|= z&1qlX)(XT8Ri{vvV?A>TWffo7V7{x-|1!!Nv};jrM(JcPG|~7KPLS1M)(@j>LOF!8 z5akG0U~M5GS$kI9Rt;tChABn&+eoHKV_j*=UiVyrg)DaxMJ^j{q6>7jV%^x++zUL5 z)NIK%I(P1eYxi1|5B6J#%(IPZ zL`64m(ALosMfX^b@4v~~*T)pyzSc+il3}u>gVXxB$epqJBOR;fDGC6(qBSjP#pV<2O4YH+Q#_j6|2* zNKxIHIVI$)jqLqqtORrJ&ytx=GyPKt`_cO!;JL+v?%awnhp)P=*nMY^5z7}ln> zYm#TKo@YbKMRa}em!v?TkKY`y)( zBff0C)z2<&$0hYu0=vB(lbp$-chI@BKSWYx@~dSNxpkPw%|$-HYF?ey2I;5Sh8;9@ z$t^W57|;EyNhYpS+`qnz&3XWK#q!icnUTBFrC(wp8Sk#l+L@-fKZj(Lkbhlb=XTIU z;W*2C)nH^@|06n{&1;R4eX9)?# z58~M6(&_ASC2RK7f9_#c4)BPtiYwc0K^QP|$^b0y-{p6l2kV6|e)K z38^HcHM9`#W4P-FV=y!w$ihH3+L-_p1b0FBHIyd^(J4_vU_={SE+Iq@L-kM^0lt~1 zfUAU18%nfkJD^AX3dTJsVUPqPqToo>dw8l=1G}+;HNbkq1*|YMfC=~z3;b+gKb8Vv z02Iv51Dsfai+~wu04`!Nm;e+2Zvi(5G4>H+vI8)}v>Sj?rhYsLlYkOJ%y81|=Fd&Q z0aP3C1257#fG$E7qrDh}WCI)Npu6URR{0D78(4^MoQ2r zVWbLiR7t2GMb@bSDAY9oeE@`NUIAcyDCQsnhSM8x3WkJhfOIHK1`sm+M;M3Bh$8^x zQ^*g84E+U^yU}(c!)9Ct^C&tvlL>%;@Z(^BM-+q+C5X~;L;#Z<*#1cRdVfDy2x z55gqWBln_ALtj4Xhf(iD`3l;Q5rxP^HKBbJfSxD~(9JU}31KV*K0|iFbHlqRvw%au zd7uG+l35TmYc0aP2@6Sh9RuO9P!YNT1{#_b_ zRdWh2hME1l^r@LJ97OKM2H)K%u7#E4OL6S8@6wg6T!5n3T~&;?vtlQ#LE7*>WpQzJ zQ?awsSzlM9St&K9{HH-G}X^;NYE#f@7^T@}a#1lrGAT3+s~E_L~6XM7>k z78h4ERW)pBD6gtRcEB!n`Wb59z;~x0iJRcx*TG%uGe1X}yRodYqU>=rqcCN#plVBL zL&G*yXS^e~o#l1z3IvygbM0cWzlGV*u)=3)>hf4bAN}>ERa;;qqKxS#s&TK&YRZf2 zE4DON^N11^W&^a&C+n*kIC1n1W?d`AiOLq1zgC(ZTG~)o#p#HlglYHE1xr6fT`aDt zsM%7%1z7v>qbM#$tI=KTtg7Zw+3V}$ofY-B>SS!Wr#jsEJ(iwU~6MDqrveN46IzD~Y0v7%pjS?=hq~~Z_PAu|l(v!fqYfM8W#xRd^ z%&V(5)tA;+RbV<6m&+pSEBrF&P}aRpiele?j#~6FK7G!z>N+`AG?ra?4zG@QFEe-1 zWXYNbX1G^eRXZ_}`UY0sMHBDok>$emCpR_1u6XW@->*j0ja)QmmG%0PYW5B`*hS;` zE6$BBMB^sARUpk_5A37H#|Hi6PG@!F7VZlYpbtMtL7sBl^SC1XD90yq%afSLt>_`j zGx!mUi_03exhskhHD6-*JNP4>_3xw62~i^GxJhM|kC$$$tLGCKkDC*CYf7tlO5skK zb*P&r=uLbK6XA~wiRfb)=wHvXnBcmRMHS-Kz;n&vkMbha`Cka`i<}>Ha;}3;&Sfj; zxgVfUyNJ?H9~tZI>!uNc?g;wumv)Sgv&u)Ld%dCiX_JB}4$%nlo`3PZ*`w_AA-t8Z z@Z7yQ%cyJar{L$8mk!oL9Z>=*JQHTXactIxe(KFQOdnUYwpd8%VR?({11)hhI-cOb zrt0z}3rWWkF(s*vBqh`lvvIXilWTB}ba&>onTauPvXwwix0fZ`o5=>FqPyKfe7}}Z z^yC?p>)I^DB5(Xfb@IKu5(Dou5z}fegAIM3MmvIz;nm%g_d!c6_Unk_iFsS*C8s8D z!8Vc6$ls>}zLbo9#CD)Me=VwSO|aU0tg35Z&Bn+H7?_mzff9QKY~Tnj5F>7|=ohJ7q;_xl zi&P_+LaX^!11viE^^nmPe}RyoV@|c3mXM(1?t}+!hnBFeqcl?tD`amUrB*SlgN+=e zCOh|Vv^Rsulxprz;&6OFvaD~#myjV#m7|cJWW(y$s{Q#G{`j~vBkRXmKejgqrE@Un zOVp?i$}A;cy~p;xM5AW~rJ{ZohSOZ|IW-n-DH+KrT(g7y@+CT_RjoJHk@S=#LV0Pa zL{cm>@gBb$qr1-`pdxXqcL*g!HH?-G+skfQ*k-=_5p)Fc3b8EZHEy{6!~8Y5ZO&X? zPp!m)y9DDNOpS$<^X)|SL9~r4J|+1UjbjmrqB_yh#^*?BwrF{&=*DolMN>*{U*#c( z;!3y8gZCp<35)H4+1apmnKg+dxN<#s(UpHiY`5P=ONG5-GfM122$d+YEiddq8G_f> zPf&*9y;O@*i?R@97|IhRM0t&SsQgIwtX8&u0M_@*wJWHdw=N@N{dJ_@-rs8Bxn>~) z!^mEHv+6uNu=!n*J@S*jYw!0{zUQa(_$hngyi6(kXMl{8{tdLXQ4LKxQgic{b@g-KMR4xO+}-hy9vgLG7Yf%*&^kfuWEn5h_;pK4$*nFB4%xRM$I?0Z{BG_~uFbXF zFM2J=*ZPcu8F!=!#_Ay>7c#DL8fs@JU#98&y8Q5EYTc-!;2Fc{6+SB8U}#Amzodlp z$r}_Ljkf6Q&C2V3>Y)kh@RB%;Y~%D8zcf`EtN$Tg@MsS@`P>hW&l~C=S~O5P>~lfc z1=cPu683$A3(6Nt$-hD@7J+aYYDZ1JqrsV5Kcvd=|-K56TIL+u^Mo1Wqi;9KThJb=naqA|C@J4Y2$l(a2@kZ&%3C^d&~_ zDyL+uChNypM)x8)(w*eXD;PnteR;~Lb!m-xd_0K#;79b=52-zp-oB;Fg=_G>&fnHGPNkcaYkw- z>;a3$&qP>=#}MOPbdLT=j0`&AbNGSV#K@lv{LUW4{{A|(ED1X13O8|!j!nd56W^+J zJhA4}v0*%Djqo4?54m)sSgmzS@?EFXD9caEZSS#@v`-<<>tq{G(Nr?$cQJ zdD!4XhD;I7;nOr5D{Vu#7_r`)dWM<>ZN&Nj@{K>2$=_OM$N>4F0z;wKd=^jSl*CTH z@12O1Um_l4iHLmS0DvcR;yVCVlZlssA>ax-Qea49OMZ!Sh%?OjOTKNzp7|wBOzg9^ z@hM5O5H;Tlnlmy8BQ^VNdu>XvZb@tQ5xqapp<~GhR_;s6Yru~8P*kC_haF35Hm>)73t(Rn@ zCm5AJ4Q5;V9i}kr8+6fPAFD=YO}~RxGtO#mpQ7_17#GR*^KPTxG?Ps)lL>U(C)2Je zY+t-V?=Sl=^cg4grOSeh{wTt9S&&gXZcloLtk@qsj6coWLbz|79X?OL)%yQO(N9U% z9jbmxa^xP{9mZr$v}I$GjM)<%yJd!)iS{1ZTD`B$TK*@UdrzOqR!{U|+D@ZyDvZ9V zkdw(jgLfwr+d4qw2_!TS!VjTS*L_PjJ4 z>%o`;ECEKqjCx2l0QyiErPBaVr~|KV7z@p-SUl+gDB@d?dSeSSM+YT*+kT5_%Xlwu! zstzH{v4}eXkK^F;CksE<(fVUx90*wS32{SLDUxLljFo3v35dgBHQh{a!F%N*Q=oGkt zvNb6QzH9m4F*SfcUPW@)+O&&I515iTB`y7FZ7;a6t%K zP#Ux!iMAZ51_pq4fExgESBD7bpiBpklp>U%49WnC z5FN~DP(I*B8odvUB8Aj|87P3a%K*rXY5yX-I+RDKI1jbD09+DJKE&qi{fB8b!P_faO3Nup1Z#K0Hk01I>{)vS`Hxby1T~U$VpFL_&2;QMTV7E&Z zg}Jk^s3B?zj<|yBr;<0<4ABmzcn>?4tC#XmP2&W%3SYmRNc|M>n;d8HHIPkkxF#VZ2kBI6&_?dP@PGxG1l$qKh13rcY)6Pg|uh`MX z?T8jwTB6iAsmbd}l$=U&Pwn{V!l|PR`RIQ<$ah^Yu}{*Z$Ar$iH(eJ?u9-*@QV!ti z;+w3hK9-a&6${m@GhG@LLzLdmd!&JH_$0Q{o4Zs}3sM-Fi*+1n;m>1&O*j6k6c)~$ znbQ238{%)to4EOw5dLwI?i%aKl$Ovid}BEGnQ;dGEgcv>$&@UDkwxDpCC*-EZwe=l z{i)|LuP6)mm0ZUMWOKP_7_{*|=~tpqz!H{A9cumw6H)R{h<+w?@Gpqwu|4-oOGT}c zf86zLHp3>x&A1x)F_N~2e~je9S6#g}X^E&)vnw{~IvBh-60Z}47XDG%?{Od%o-N%2 znfM%S0ed1_ibYpfwlrTiIQcPJgxqCdSF)uDFy6?Ps!(iLDZR$|bEMTm8Y{|?o`*7g zhqe%%v8$vN!mt-#p?xh1=U7p$w68T0F7Ur1JZ%9ru2r=IxCHbAnE-Aa>Q1D%2;gQC zl!HewXyns$q<$#w4WY;JRKd+jexB|{Ie?I3dUd$o_1QSuLBh|>LP&>D-a@$*IDxf6 zgc5`3h=5Q%ZVKT&C>v0w;vox03Bt%@?BHr?mnsD*lE-56q-arfnWg7R_q7hgwCm`` ztwePbbr7rd0B$2{ZfXm_P4CCk5vBw~Z7?Lt9|2^*%tD|Rcptb7OK`j4XZR853oC~e z8vxwy!q1=|a%UC*uui`mIFEys2nu4P3WWj*+9kwGIs`aj$zFc`T-TZg+n`tV3~&^H zeAQb3!m8SYu!D^sJ*#to{eTB}8#Y6i`Yd2W-2sFEMzq_25!4O95nvF$A&UIz9}IcH zxUB^rMn9sdLA^ET3M%dB>_I02r5Qr`1=>&)d=9vPHi8&bk9r|6jQIp(=q&`L7r2Re zj01`Q7^uqtngJN4GXqd6pPS!6&|pXyViJb_FdKqYfMrNT9~v(M?*I@Q4rMd#z;O_y z0wn;V6M^W=XhJ_cnURZjGUyKj=K=79e*}P^f6Ae6!#L>lP!ukrj&Yg=V2m2khS78_ z%26naJctH}BbNaA076eMpeIi!G}GMBX$ zpj$qnd!Wv}?b{VK4>eZtvs`tE+<(_0bJ$h%%LmeadNftT_z5_84#8Y}(;;&hl1e_! z3pivJBPv<;L(=M%)v}E0iqfqWs1bF#pElrlIe18>nK)h!>z3OS$ICOc?D9jBW#P+m z_rz(k4tYL#27AY8@;m(Wcn&`O!{KqFu#6uW$FKuyCCaBuHa6f)SUbqigwsT6kRJ-K z6K=EYb<*N{HV4X|dd90lmVDD0uhh-YbXU!5!7vW9$4@Qw!)PmtbE;~~3re?O8t{h) z$OuRU6U#1;;$dlJfs~M-iA)92(ks7>na*@8f(iMs_KwUVMaDkAT7og8V+q! z#W2E>9+u)~b%634&SX_BzBAWgB(Lmvz?mz5Q-QXLGgoyr>xC$xiCuVDN_?1e6e8t$ zhHgUk@(FMtbNT!P9I*!RIR>3Pk5*i68Gd>mK+s3to}>?|_GYh_6hiPj=)<3Gh~+;b zMG3dPIAwiO$rMFWgs5EQH55sK>j&m}Omd0``}h*zBKv5g^hV(7p;&Szi_gpJgU?vV zv(k%!gU?D%gZOq1=X{I3-z)t`;NXuWXR4@;8ebj#L7K8U`U7-|mkfNZk?PGEl1itn zj{b>hlgdL;6F*u9inUAxZp>lrU-sC3WEP=8Xqm5I$F#}|FK|vv~22V z86Um%;P|L(>Zps4e*L%?-iiW?emv^AK&u{)a)yfw9vSD|K9zSn=l$JlY_5a0dtYda z(gk?LJUcP^@v?E&T~k?ian?Vt8Xw&=b#xCOJt?pK_!{)tsiV*G(VzU9t8Mn~?~00? zqIMrf&p*%o2@#m-`KYG@{dqphsTHp^jjMfWs^FKn;0+!wc(?cH%Td7rg1w#}MmZf~ z&}^O;@3QNkMg2Tb@IRxR3F7miTy2=Z5@HNH14m;F&Jghzy`1$lyO?13W8h$-!MQ}d zPkCUGGTNKA(a;#6lzEB`PVw)J}c4mNY!&#f!KL_In&RW6)Wnxxf%N>|9Krum;nL1 zgS>|DSpj#U@;#oJv%H>}(auxi{6n1SBQ`n^{qKRA-;8#O#aI2g{8n^8F2nX;MLP?` z!^=76D3fN#JU_|l^~{cWRB!Oz6!H6SIeZm3{-sH;KCMa4qdq z%-$9A$jtA6N%S%5HrQ@#sqsy`TK6d8uz_W~7E?E=mU&)_StS&DZ@m^1s*D61Uz5qZ ze<*a1eZ1?lrQF&t*r+uog=Ib+QxnMhw2$}cm>JSc{)`CqtF8KY*Z(;p^M&Z};ghZ& zc!CXCV@!96c+n@~MJ|G`e*6*8HU75ojkR3Fd8U6lCds60hm4&-8-R@<-40+ofG4f) zDWI8|s~|sTQB3KiiC)j5m`AKLG2;^<=~}2e_Rx4p_JOgBWt0Vm#Oo=Gc|j(?62d=JozTfn7XH3qT<2l%FqY9c zm8X&G{2q9)rN{qtFKi6Ic+q$Dgy^sc(0!kGvW%yu@;w!^PVKesjrzSX{W~3j=?F|m zU^)WR5txp^bOfd&Fdc#E2uw#{Is(%Xn2x}71g0Y}9f9cxOh;fk0@D$gj=*#TrXw&N uf$0cLM_@Vv(-D}Cz;pzrBQPC-=?F|mU^)WR5txp^bOd}6VAd4rr~el{7s1p3 delta 24792 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 PnDl_x1N{F~>&X8FrGi6k