From 91b86711416dd526c97077e07d24bed0ff601516 Mon Sep 17 00:00:00 2001 From: Roland Jax Date: Tue, 19 Nov 2013 17:47:53 +0100 Subject: [PATCH] Data type of struct commands.s_type changed from integer to char[2] --- ChangeLog | 6 +++++ NEWS | 3 +++ README | 8 +++--- contrib/csv/wolf/wolf_cycle.csv | 16 ++++++------ contrib/csv/wolf/wolf_cycle.ods | Bin 23574 -> 26080 bytes lib/ebus-bus.c | 7 +++-- lib/ebus-cmd.c | 20 ++++++++++---- lib/ebus-cmd.h | 7 ++--- lib/ebus-common.h | 45 +++++++++++++++++--------------- 9 files changed, 69 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index 04f972db..e3db988d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,12 @@ ebus Daemon (ebusd) - ChangeLog =============================== +2013-11-19: +* Data type of struct commands.s_type changed from integer to char[2]. Possible + data types are: BR, MM, MS. (BroadCast, MasterMaster, MasterSlave) +* Wolf configuration files converted to new version. +* README fixed. + 2013-11-06: * Specific vaillant data type "ulg" (unsigned long) added. diff --git a/NEWS b/NEWS index f371b8e6..34dcfbf1 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ ebus Daemon (ebusd) - NEWS ========================== +2013-11-19: +* Data type of struct commands.s_type changed from integer to char[2]. + 2013-11-14: * Initial commit on github. diff --git a/README b/README index d71e560a..235d875a 100644 --- a/README +++ b/README @@ -8,10 +8,10 @@ Features: ========= * ebus - send and receive ebus commands - - send Broadcast (BC), Master-Master (MM) and Master-Slave (MS) messages - - calculate CRC for sending data and check CRC of received data - - not allowed byte sequences inside data will be escaped and unescaped - - it saved data from specified cycle messages + - Send Broadcast (BC), Master-Master (MM) and Master-Slave (MS) messages + - Calculate CRC for sent and received data + - Escaped and unescaped not allowed byte sequences + - Saved data of specified cycle messages * telnet - multi telnet session (listen on TCP port 8888) The available commands are different of each heating system and provider. diff --git a/contrib/csv/wolf/wolf_cycle.csv b/contrib/csv/wolf/wolf_cycle.csv index 477fb99e..3092a165 100644 --- a/contrib/csv/wolf/wolf_cycle.csv +++ b/contrib/csv/wolf/wolf_cycle.csv @@ -1,8 +1,8 @@ -# type;class;cmd;comment;msg type: 1=BROAD, 2=MM, 3=MS;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment -cyc;broad;date_time;Datum, Uhrzeit und Aussentempertur;1;FE;0700;9;-;4;temp;md;1,2;d2b;1.0;°C;-;Aussentemperatur (Wolf Gastherme: Ersatzwert);day;md;8;bdy;-;-;-;Wochentag;date;md;6,7,9;bda;-;-;-;Datum (Wolf Gastherme Ersatzwert: FFFFFF);time;md;5,4,3;bti;-;-;-;Uhrzeit;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -cyc;betrd;regler;Betriebsdaten des Reglers an den Feuerungsautomaten;2;03;0507;9;-;7;status;md;1;hex;-;-;-;Statuswärmeanforderung;aktion;md;2;hex;-;-;-;tbd;brauchwasser;md;3,4;d2c;1.0;°C;0-2000;Brauchwassersollwert;solldruck;md;5,6;d2b;1.0;bar;0-100;Kesselsollwertdruck ;stellgrad;md;7;d1c;1.0;%;0-100;Stellgradanforderung;kesselsolltemp;md;8;d1c;1.0;°C;0-100;Kesselsollwerttemperatur ;brennstoff;md;9;bcd;-;-;-;Brennstoffwahl;;;;;;;; -cyc;betrd;feuerung;Betriebsdaten des Feuerungsautomaten an den Regler;1;FE;0503;8;-;8;block;md;1;bcd;-;-;-;Block Nummer;status;md;bcd;hex;-;-;-;Feuerungsautomatstatus;zustand;md;3;hex;-;-;-;Feuerungsautomatzustand;stellgrad;md;4;hex;-;-;-;StellgradKesselleistung (Wolf Gastherme Ersatzwert: FF);kesseltemp;md;5;d1c;1.0;°C;-;Kesseltemperatur ;ruecklauftemp;md;6;d1b;1.0;°C;-;Rücklauftemperatur ;boilertemp;md;7;d1b;1.0;°C;-;Boilertemperatur ;aussentemp;md;8;d1b;1.0;°C;-;Außentemperatur -cyc;sollw;regler;Sollwertübertragung des Reglers an andere Regler;2;03;0800;8;-;5;kesselsolltemp;md;1,2;d2b;1.0;°C;-;Kesselsollwert;aussentemp;md;3,4;d2b;1.0;°C;-;Außentemperatur;leistungszwang;md;5;d1b;1.0;-;-;Leistungszwang;status;md;6;hex;-;-;-;Status;brauchwassersolltemp;md;7,8;d2b;1.0;°C;-;Brauchwassersollwert;;;;;;;;;;;;;;;;;;;;;;;; -cyc;solar;ertraege;Solardaten Erträge ;2;50;5018;0E;-;6;leistung;md;1,2;d2b;1.0;-;-;Solarleistung;ertraglow;md;3;d1c;1.0;-;-;ErtragTagLow;ertraghigh;md;4;d1c;1.0;-;-;ErtragTagHigh;ertragsummelow;md;5;d1c;1.0;-;-;SummeErtragLow;summertraghigh;md;6;d1c;1.0;-;-;SummeErtragHigh;ertragsumme;md;7;d1c;1.0;-;-;SummeErtragM;;;;;;;;;;;;;;;; -cyc;solar;temp;Solardaten Temperaturen;2;50;5017;10;-;3;pumpe;md;1;d1c;1.0;-;-;SolarPumpe;kollektortemp;md;3,4;d2c;1.0;-;-;KollektorTemp;wwsolartemp;md;5,6;d2c;1.0;-;-;WWSolarTemp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -cyc;solar;regler;Solardaten Regler;2;50;5014;7;-;4;status;md;1;d1c;1.0;-;-;StatusSolar;mischersolltemp;md;3,4;d2b;1.0;-;-;MischerSolltemperatur;raumtemp;md;5;d1c;1.0;-;-;Raumtemperatur;wwsolltemp;md;7;d1c;1.0;-;-;SollWarmwasser;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +# type;class;cmd;comment;msg type;ZZ;PBSB;NN;D1D2D3;elements;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment;sub;part;position;datatype;factor;unit;valid;comment +cyc;broad;date_time;Datum, Uhrzeit und Aussentempertur;BR;FE;0700;9;-;4;temp;md;1,2;d2b;1.0;°C;-;Aussentemperatur (Wolf Gastherme: Ersatzwert);day;md;8;bdy;-;-;-;Wochentag;date;md;6,7,9;bda;-;-;-;Datum (Wolf Gastherme Ersatzwert: FFFFFF);time;md;5,4,3;bti;-;-;-;Uhrzeit;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +cyc;betrd;regler;Betriebsdaten des Reglers an den Feuerungsautomaten;MM;03;0507;9;-;7;status;md;1;hex;-;-;-;Statuswärmeanforderung;aktion;md;2;hex;-;-;-;tbd;brauchwasser;md;3,4;d2c;1.0;°C;0-2000;Brauchwassersollwert;solldruck;md;5,6;d2b;1.0;bar;0-100;Kesselsollwertdruck ;stellgrad;md;7;d1c;1.0;%;0-100;Stellgradanforderung;kesselsolltemp;md;8;d1c;1.0;°C;0-100;Kesselsollwerttemperatur ;brennstoff;md;9;bcd;-;-;-;Brennstoffwahl;;;;;;;; +cyc;betrd;feuerung;Betriebsdaten des Feuerungsautomaten an den Regler;BR;FE;0503;8;-;8;block;md;1;bcd;-;-;-;Block Nummer;status;md;bcd;hex;-;-;-;Feuerungsautomatstatus;zustand;md;3;hex;-;-;-;Feuerungsautomatzustand;stellgrad;md;4;hex;-;-;-;StellgradKesselleistung (Wolf Gastherme Ersatzwert: FF);kesseltemp;md;5;d1c;1.0;°C;-;Kesseltemperatur ;ruecklauftemp;md;6;d1b;1.0;°C;-;Rücklauftemperatur ;boilertemp;md;7;d1b;1.0;°C;-;Boilertemperatur ;aussentemp;md;8;d1b;1.0;°C;-;Außentemperatur +cyc;sollw;regler;Sollwertübertragung des Reglers an andere Regler;MM;03;0800;8;-;5;kesselsolltemp;md;1,2;d2b;1.0;°C;-;Kesselsollwert;aussentemp;md;3,4;d2b;1.0;°C;-;Außentemperatur;leistungszwang;md;5;d1b;1.0;-;-;Leistungszwang;status;md;6;hex;-;-;-;Status;brauchwassersolltemp;md;7,8;d2b;1.0;°C;-;Brauchwassersollwert;;;;;;;;;;;;;;;;;;;;;;;; +cyc;solar;ertraege;Solardaten Erträge ;MM;50;5018;0E;-;6;leistung;md;1,2;d2b;1.0;-;-;Solarleistung;ertraglow;md;3;d1c;1.0;-;-;ErtragTagLow;ertraghigh;md;4;d1c;1.0;-;-;ErtragTagHigh;ertragsummelow;md;5;d1c;1.0;-;-;SummeErtragLow;summertraghigh;md;6;d1c;1.0;-;-;SummeErtragHigh;ertragsumme;md;7;d1c;1.0;-;-;SummeErtragM;;;;;;;;;;;;;;;; +cyc;solar;temp;Solardaten Temperaturen;MM;50;5017;10;-;3;pumpe;md;1;d1c;1.0;-;-;SolarPumpe;kollektortemp;md;3,4;d2c;1.0;-;-;KollektorTemp;wwsolartemp;md;5,6;d2c;1.0;-;-;WWSolarTemp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +cyc;solar;regler;Solardaten Regler;MM;50;5014;7;-;4;status;md;1;d1c;1.0;-;-;StatusSolar;mischersolltemp;md;3,4;d2b;1.0;-;-;MischerSolltemperatur;raumtemp;md;5;d1c;1.0;-;-;Raumtemperatur;wwsolltemp;md;7;d1c;1.0;-;-;SollWarmwasser;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/contrib/csv/wolf/wolf_cycle.ods b/contrib/csv/wolf/wolf_cycle.ods index b1c62c1571d6db7aee149fff8cb023d983631f9b..bb30a8a719171c8dd9747857ada67c0ef0e9ee40 100644 GIT binary patch literal 26080 zcmeFYW0a&#*ELwK>auOy>Mq+>mu=hbvTdWwwr$(CZG3q@&x`M!S+fSer_Rciu`)v$ zabll+_7x>B1qy}=1Ox>H1mx)`6lC=?oE}j8=k?D=*5=m6PVRQb`gV3!=7#!C=C(Er zE;dH=w)&3dj`X&6#x_Q_hR)W;Hcs@8b`Hk+Mvi92#!mA8qfaA$yL~5OAfSI+|3l+(^qw_rzr!Jq_cqL_vtK%l@41<2=a(G{_%*l z`0+^iKPoJVyx6Z6_QWzaby`l{Y{z6CZ+sZh6l$pHoiD`Vd`J3t9aA?cDd}#uJB_XW z9MchRtm=6uImU~AY16o$T5)l7q*1NQtamg*n2z83uH9cJ)+w@RJbm1GW7tC5YCw-y zK8HS_ldo}U&!u5fV94P!^u&Jp7-?0n3%oXk^{$tAALqLaw0QoyPTgYR(1ejFb4DT_ zhU{Eya{USr$;?7}r~18t^SrgV&u6e+keVVOu2>l%-=xv$mrcOMg`vKuzPCUB&Q8YH z_8fCro=ri4`G<6|4Qe_b#bp{#JwKA*y~F?^@3RD)Ni!Msktze3VA=daF)+4J1EaUv z#*xF-)%2KHid!n$_x3_ULj&96_}e30D_7j!l1QSFUhuJ}Y7b~*b+tBRau*cai9n-B zq5Y31N3%56!ga>xl3=`rHrPGrjaGy!_;)&;r(S_prD*f?(7z{f1i90ioH{Ax)A@3L zy>*S_`~0hH9c4Y)@OV87!d&P-+e+2@6d+V(``jWVR#-oH zx*Q*E%e&fMo_YKO`y^G%N^tyh_AK?!%JA1+2M4E=eV}hEHL6o=#)_6X`-f0<<8_RwthU=(-6|fg z4!>!KaB}du$gh37YSmq!?f&Zi4zv*`S#0a+Puzz8TR?2tbP-3P3k(=n*2+U##fse4KY$J*k_Bs}ri$&8JrFD0 zEoJED#$7Uhd)@zg11~PA1d2{2!`aDE>HQMx90<3xBa#|oAfVt zS58vNM9&95(uU9DuMi{GwyD1BOY~(~e2>?U(s~vHzTswiq3xY*f{l%toC@5Tr$%n~ zMxrQX%P(sP7G>+T+pi=RXD+a6{H-d7es=XpIweKj&Vg?lruT>>>X_~j4hHhUO?!R7 z^4zcCd~;tMU0o@ak~_t}-HF^PqJ6zCJM;XtSqNrTtbA?8n(*`2_UL{p@2w1$7M*w! zF~EO1Io_R=x(uE+@obt_cB_e}qQB{2*X`}Yl&rn%p8Bjfj2+FOcwB}vFVwiVWl8O& z`dsr&k;@5tlbVh1YB@*sK3^aOG(pEWaZ)y_jX#XX-{^doy4dGZL)o`E|Icw_`#&{A zkNN1{ho5N}J{y`t)k^92RS%@|Wd$CO8-XxR2A+~qVlL^F`~Kdq6qW3^$^I_FVZMJx zoamU;3-0kpslwgf<~+G?u{;LxIGCv@=6<~^$T>LG{IR}lh=9hRO=LPZ>8|Xn1Cve4 zTeeM>$TKS!7IROlwyFVeopj%fUf2<^vK0V24F2XlY8OeuZfat{&#?1n3YP%1vaCG} z>x%owU-g1V?7ch2)LQXzv`boCU)N+VqKC<~^db$AG2C=4eGUx&y$*SL_Sa1W(;Gal zM(uLP7nz@7o3|@}U?LTy18BUx&g%fjS~BsreA&3BzTObwNQ_ri<@^SGI-X!-&{x>) zbOoVX=j~@iZQ20%5GDC4?|lp#NV`e}#>>f5(k08+isKjr;PjbH#CTPdE$zZ&H{#r~ zeQ^-n{PnfcU3@^$HDY2)~Nsc10gF5&y$hQ$>kP{lb%tO zNn&_5!k~$^)8&rv&$|8tv8m}W{scnSql%}=x2tj4lJ-pd(n~j4HTDwqi|?~B8OH<| z@B9AInZNdGcFyyGeD(NeBlpjo5~UW8J$?Wlt+G!&R5o>HWe{)yMp;s;lp8!d!TCHl zAM;OAsu~a;w9)}VN~zT0qj48}9|U*0vek4f{+$(HqGadK!uC%K>#_ZoG8ryCQ0?`S z!ToZ!Yo}*HEA;zBx!)RW!w`?M5(`uF7-E_mGWgwz|E@=^j;74aXo%gDu?}vxc3Z>XvJ!b*N?+f7HBWsE zYvnM#pSy9{eInTYk4NlA(zb^2(kK8 zjf^6%ZHYad-MYa=YIdz1-}MC;zN4ea-pdcckax?8feZ zR;a;6rQ79oz17+M{q;^RlkWAjYFZ?f;&ZbjAS^tvtm})1hxhq*UOk=8R_^=#Rnh~E zN-1BX*K57rB(VKgHcQaj8!$x_3R$n`O;=uC-ZXNjlbJlJ6nZ=^my1o;?LmJX9UXsv zf6u22fx#G9uh+wr+uPgzU^p6u{DA_o7<78Amz3@gaIt>|85t^+NSGnq*$)7RfySVp zxKBt=_qf^VH5d#Z92l5LW!f*V?kZC#7T2y+4%@Bc>74r*C_j(5ATjHxm?WBSPen;LH_l(}gAsqL%N-uiRFun4 z%Jte+%2h{4M@^VxVE29Fh(&C+I!@2eEk|2^Oy;yZ5-qO%pl27A#pIJoWdwG{UsF|f z!z{|f34g+{Fg)`wEK?~rVU}f`Kl#a@g^!PK_FNkUoQCQ5Xg{6B6~YBZ$F;6rYcLoL zhXVl#Ssyc=!eB}i2j`P3;4=fYqXhy2BG19)VwdI}YhevK`3rkqty)Jw(=3{YhiARf zlEZq9)yWQr%>rz&Lc1M3OU(>^a{~s0p4;c+Ws)Om=~Dy}w0DL5OxCPcC2XRH`|WH5;>nO^qw>UoDtw`$4#wd`>O;)(Evw?gB1)q z*GMQXGVGj8OiT;C#Ud$; z%|EUeD@Zsvo&ZNqqEY+0=|^bs@95|#mQD*;A6Z}LqNlgn?F)(_;6u-n`yk+Uvnv+e zo6O)C)We|H+KE%H*2zjsZehOdZsy(rT@#smT|KIQv!pdUwbYDqu98On157 z%pji&6fIap^Q$NnE+|?Y;N%$i_|bO*zF)P1LC^-s8637p+0>Gt7(dc*nG6O#-=Ezv z6ANu@nr$}2d&Dt{{6U5#!kENFMeFVul!_ylG<|OOz~9k{WXh;bTO5z!H5d=j$$DJ3 z+MLhV8ZBEk6nC5!tJLes2?_o9W<*7JOeQcy_rK1_PT&e6qUIY!x_Mx#Y7C634i9aH2+4kv?7)4 z9T2xG{f#*~$2wJ3Rd2x@tn2%UW;|$Pn~8Tv?i2B81}u*v#9>x(gXGHmO-bf2)yJc9 zMPgR3KM84qV65(6FikNy5v8jg**)pL)?nW60o9ViC@LuPhdTHXkx)up!Bf1=!XEqN z$BteX1|2puo(MWNHnn#V%z5-imv_6>>ch6ZvA3xfnij+Yhgy}EfN}|%@Nqo=HBBOg zsZue+$h@ikI?XHAv67M6Dq-wna^kRCVRG2uwnxn>?vtduT_xuGXZ&)e2Fbk=E{OCe z(eV0GkQ8)){!L!QcyURmox17|jR_v@q8px;)XiqQx}-+n82PYW>Hey?5r}QEP@>T8 zav3jJT#kOJAucZ7?el4ukzd-UBCr|OgvkTzgkMx%mr;~+zOB#*z4O|08TNGjzGjuW~ z<#7MNDtKh$b!%q+ltiu~N_(pU(_nw>Ul1pga+#cQzQPPz=k1bdf3oG1G+;;q((zMJ zLUKtJfX{~}_7XdcXU8YWF19*xc=(^7hXI)E^Lof9)mG3nmcz$~O2+1QTK0Hzvm?YV zYhXa!7TKmNQ6n|Q=a7Kt&8%h8rF-smwcX7(uOvuD2fiPddq3$Ko?HwDL8B3&a$bQw z(DT#f0&`n*JX!~u-6=~kc;z}ieuo2MI*dJGjghul-U4u<2SfbYn9j4^Y(O1^X{fIR z#IzD|gS*!XoU*+t0oX0T<#ZxnU;KH#$_2APQ?fh2Q{n@g{R5FYzhI5eDE4069%^fA ztHScSkCLg8MpI$Mn9!#l5EO*Y`LRQmo#SOZcB0c+EqU=-Y|6yZC%xJMaVheEKbb*S z=R@^Q0q^c8uyLe5PBrP)Rs>}spC9dqbz z8{f^qAphjk!^6V?Wqo?O+WY-!4ot5yjPA96A|rOfjwuHaP(F_`Y~8{eEti+F2_2Pq zxVZxY0^9@v_zB=n6#$5kl!TUzRq0p!VJC%E8hTum5&lmY6LlaYD^GT>r_*TQbiX5I z@uc;bHxog?T~>MUNuk#sldL63(MBwXAHPk4>`^t2(z<0-W1asL!QWlNTLQ1eMR^eClER*hLu z0v40Vlh1H+_QLH(OSMZdJ(jN;qu_`T=}b-}6)HIeZmv<8B;;S7PqYzAticUw`p5L{ zYw+zrg=-Z(xZJq< z2wDK>;$et*bnStEfh&zixA9owE;;){Sr$+QTdngwRT^Lk06;`vT;j>;sFWxEfZ`?y z0DUo1K)m}0+GTSpU5mLSFvYW*KpB8bm)INN3q|%JB6z8NsY%nS@*$&r0uDa0-8Q)$ z41HJfO#u`2`nVll8*$!L-pKbt_!D|Y&>45TKU_e6eAQ-SqG76cDO?9qnp^|?pw5Kd zZyg-<1BINE2B%P?4`Swf_xj-{(!aE)H7nsf=g7r?e+g1c>;n>gNJvNktf?85Y&_~h zW)~=HgfovawtqEXQ7vP8POAB#SZQsx{JZIY|Gv1^1{0KK(O}S<%ql?H5@!y3ye;Au z^LObGi|vnue;l1_K2?89a?x4$N5+3kT$VVswY4WiH)Puy%{Dw%D~!h`ryQa4s@g8O z>uLQgA{nga#8ssUo+D#g;(uvf+MUl;wb&xnbv-W|8yXtwjK}LFoY%4dd>$QP;;BtF zsnPdR=&p0AQj_BAhGI;^6GJVn-xc0?C5tp% z-4=_R`R_4y77i`hc~yXO!-m6^!Ij)ANX;4(caa8J+A%}<6UYXpi( z=rfbRIM;wYV6)Yc0xbM{g?)u;??ol0NW`z`XL$m-40HVob4WEZ?WE+QEP5k3l4Fr6 zr~v|SQ1DyQyG}{-KycwA4Do9Cfu{uDhxsHL%Zsn4FBTen{o=;=&e|H*7Y99HdgL3_gfe=SPWghzLpOKv4@5c|4>qgdGfANi2k}@zKY<7q^1J$dmA&?w z+qkgGs@g94QrJ@_C?_UM+Rm7@*S47tPX1qsz5lmr@c&=o|DkOD|7D?Gnk^9UekG=- zpY88EK3%K=WQCs`a$x!s-6}XZIP2BA-2hhKeLuxDHHj!-B-v)6*=T`=hW0p0k)zix zpC<^&F{h@`1Tf>O)&Su)C?rHKl~I2zk!pV^%F!hmiWp^1MYF|j7m(r9)G%5RaM}S8 zySP+A^@Tbu;scWXz95(=Y__!~YfUq=lKOgK#I)F|wH)8CR)IhW%-F?B&E?fsqRwQ%J^+qeo_qOl1 zxBWjk_O0(suE5YRy-o)wKmtjF7)KQwOeiN@ToVP*LUh{Seo;L=JpgKv_zwkn0_5ZU zAqcunR#@+pr)&}8ao@=RhSCo}-fTYKFM#$iJUonm!(JgAh8%;>qtRkV1O`w(F3-=` zTkH)P7#N;D+5uXM0p`VOt)ZBe)kUl0v1*l8T52jLAStrF-fRznlarh74TM}SQP_Wb zJO}6_op!r@ra9iKZBD0<2>5`+3olMCo%P2W8p%e7`#qp)1R4!G3JMAm((MqAEnyfS zp$Wege;sHx$Omv57aR9AXh0P8dD#uo>GU8YBU>y}8Q9XfUbX=@zn3<8wf}F6~EFMn(=8#iR{4Fe`)o%MI zOG11bi6gPE=^Lf-ycAsLb7=mVs8L_kdus8oI1%L#jN@V%R4k)!h8-~gQ>%XBJJLPlmVI3oiGfhx##|B$7qwMMlnKe^B9{B0k6s2(NmV zAQoz@uXK8Hq-%?#w`nz6ES9TP&vqmx!0@p zkefE;efo5+9-LS+@7bG6t!D zltGaHgXHZ;rDij_;Yzn}_Y2Y`=Q_WxAcunR2>aXf^|Y&jH2EM29x+)N`hP!x!_nD)e6M@R_Akc$0^>gmwh6kU^h?C;laU1v)Mg>->vXEpD6>x0>A-w z11#Hh*E{^`Q8G^c8{jb7UxXr&08$=Xt5)FIs{R|)ZHs;*4#4*GEC%7Oy2#7V0HlwW zV^nl>@+rIIi;}&;h!koSi>(g#xqby#SJ&CqfS3Pb<`+jt!94k4L7&O6Ij|au%tKZ` z5A^>n9SCmCkWXa(yw7so(hnm(0vzhSbwFYv(7WLvqDAOGErLqC90=&J4sW1Ie&Wi1X{6-=D0H%mHUKVsKif0wC7{w2a_aqser( z`s9Ag+|#tqCp1Wvx059~aT0$&Xn_!S_%}s7+q0?$@J?c)URb^VK@C zbX$B_9xx`s2POLj09DlOa06xvBVS5oGHj6x<^r4S#6+k+WGoSU$rB36U-EjnAN?Y}i0t1ZX$*wDCf0R#vSN!vMXMosn_I|Ii#+u@ded=HlV!7p(b^3D8w}ZZ)+b zVVv`t)GS_oO<|ZtjDr~g=ZZnS&gdMr;!rF+WZhxyFYX5W`$<8}3PkfppWslA}>I4hL1XbRbUr^ZF`%;w&O8 zoJg;Y{X?RY-&CLXemI8U8bGN(-yUnDbVz>X0wg=6ZNtQxYQ{woF0^UsFk?^c4CifQ zKm|m4QBwE`71=p}_6CrIYcByCIW#c9YBtl;sy?P7u5?RFE=jB1D9-UF!B|0rW-tc9QoO&bV8Si~%fKt7^YYiUw_fA==K zeRHl4$jHHE)h+?u{-e|?)N7ZNd0dr7A`~<{`+i}u%zxOvFsl~O)JJE$@FQXy8-#n z0${YiI>xg>f?V_(^5pgU+*sr3X#)Z|U^2sisTG3S3*AlJ+%NKwEC1QTk-E7F?uiX=Yj_T{jU+j>aJkk zdZ0_D=D$awneQih22hiNpYiaCAB+(uWoe@qRN<^>*D1O_ySlf?C^*(IN|hlYkOX!1 z$S5d)r#nvF@p>Y(S4^prMOo8{R2Q#BsDF)MR?h?n2M6=8kI)lGGmU;>MGQ~7E|sgv z(e?m@a5DtdPsRtEwEIGw`t!W3aMQ{G;s2r9n8<`2GpEFs)0Su@VUf)!ToN#kyjC2L zwvGjisiY}@I5_?LR>rNb)mUbz&N6pA;5G@6govzgm7re0zi+BQK>_Z%0B*nh^UZ($ z!2$}7#!gP=Hl~jBZq`v1KKO!cVh#};97QA>I>*F>=;60%7T z_p14*Fj9zBXe;;oUkDo{x;j@=sy%HvzdLX2Odznt616B>3CiOA2a4f|6JU&IY%@O; zeNw)E{zX6-2__3!^M?%M+?9uF4Kh8j?~^(|gdx)_6b2US5cY#~mslY?6RP7;^=NHx zKyK=)?+KM=Kvje4PMn-Nz9+cAejRm1i3U; z@yEQ(BVAjUCM_zSLArqIuoAC{pxdhpsmAB00EkDPHFL&#o&`oYs(LyRr*Bhw-Sx&f z3;EtipS&sJLus`Y#^78^L?~2IMYid7fERQNIDzo5k>?SlE8Y{WFVo$J<=K}MM464w zwsAkIO#E=)J>YLJBuM()dK#Fi=XP^vQ3y;;{CuWN-Je_*4!uUOl!uJO4moqIV4Jh` z2!$fNiVu%*>#B5)a<@XoIzQZs+cbU=5|#t+CvGZ4|CtEcJ_1pCn#@AaC558eZW+tquWQC&PY`9!>%Tx4W5~;3aJMy zSnHksOD#_xKC>X&K2y%kZ0ODEhR$`%f0Lz8GEg*`1K1rAn<>1DLJbml=K?*5C>V zZ5`3O`U{S=n3yJIF7f&t;D(aECI*^20?>Wv443c(CUe_djxTQmLhrSF9J*77*9X*3 z;Yvm6Re087efGnK`i^2WgXHe&kMsZ)df=2YNPMP~4`dL?I;TGmT2MixS*SDBFV=*N z#5K(iwBhauSG+zbNOL4T*Giyvz^-^%!X}me)h{L;iRoaV4yV^623mER(hzGw+q!WC zKel0LAtw=Il=+BmKF5aPve-Jh_&b_Oo5m>xDJPl|Hj!em8taBin;w&He;ApeJmC>d79W z{vptIy?^K@qzVc`I-RUyPN+AYTCF&38XFQV(IMHMuxOFmC=b>i6$j4A%~eSVvZ6@U z{&v`{-pEp)K4@%NV`n|7^~9}Y{aD@LVx8;T+-);;0iXSmUPNcYKGrDK58w2c*QM;N z?!M$$$EtJrvFU63;I*yl+=ju+`Jg*nO<1%(FWTcRUy@qNPFH@ozuZ8L#(~C{>}_&r z-p$RM1>Z&F-JbQ@=`-zeR4@y(YJPy_oN2l7Zn^A|%}eZ=pwerQ0AYR5Wf`Mjmo3h1 zezr5G{yrE}>Y}}CYJKswLuKAplm=^g{J!*7tP(gnw4g=|PuI!1+d^FW?Sw7Ru)Pg9x#Qz!y z7)QE^b>_a-E62;?%s*Gf?~)MjrOi~}FHw8fh~Ty6vbe7DQIYbHmjqdbA+2USBUM$Y z3iv=Ur#lhVa@i?6DV=cfxpH*&<^Gt5tT(rM@ZTV0Q4pfs?Z z%M-W$RoRWPV2HdAs09t4BW^rK^}9>*a|pKg+gIpJLgIeqx^ zV?=WVi#aTYqP5K8jmE#+(_AK~SgWw6+aGPzIFIf1ci-|-kWghU4bzd}KtQeJKtTW3 zC=LTaaYI`hr++Re{sZFLQjYta@m<%|dM$?JCI*ts1Riqj>=)F_PFCwYc!y#P zIo1`s6sI|~kN2c4%S@r2gRe%M$T3WF_`J;?roJ98yFX5%hmT_6MXwkeN>NyYt59nA z(4Lz15%&IKnC2bBYVBow^$@W?LiXD2OqJBTS;o@xgsz4A-UgaVy*!rK-Cg?mzzFLe z8LMrPA?(qK1tr+VaNm)>F*A(+VtajCLGymiuw@&fKX>*N1#y%Kw@p6f*2$C!)MMx5 z^Y!qs;Kh;c!%dW{52~txT#0)DBXOir) zOweo7_wqb$zR-WjSHeVh`~4mqNx$<*UP-f zY#0Z&F}m>{<}s{jDiTLm`on1mn$>0%!smU7JhEJKS8nNX$HW}zs$F+LH;4M&{0dx_ z0xYP#>5MJQS=t9uZT>O@4O>NSokV3&DgF9%S+K-fjW@f4w9w`%;q4Rki02bW?OBUz zTfwbIlqLGF2XB%Q>`*y^>DPLQW6t2c`()&es+>-3M0cx}uh+W}CX$DtR9JIE;gIC- zr(w+46h4~U?bZzp)0Aup+DmDDy;e&7jHUaJ-n6^Rx`7GUVA#xVhuIeLYqPf@qYg}}Vh1r?KA}*)__XtH=Sr=QeSMMk zkCG3M0shX&f?5I&$KbdII_OSR*g3#OdhK55=;LE$d|K%3Rdbt@&@l?x6J$ z76s98>70>;L)b)Q)7MA}Sam*QW4IM!koT-@{7Dk<$Te7}%`su@Qq1w!n!D-St6ltSDlo3B}*qro!96Evse+7cD7l zzJ^q}cqMl8hg^9@{q(^eRq59a+@;Kec( zqIZ`}wO;9BH*i^PAv=}DYuA@_ZaYD(2V4BZo+FbtWa)!rah{+m*F+qSnQ-o(o&JN* za|x<)I=;4qFP*UU<)aCnpwHJu6xQ0=8#o&Qoo`$k!YL$A5Fz>qwW~($jeI`GNuKjM zi#i^2=Qwv@A%@b8t7qf$i87vAp3w9PDuh(?Gpz2sW5tuTpW^jo3TivQl`NYy?&Q7Z zi`Vc2nlsAiYlnB;lq|7l%SuUmcSGmRT=Hdln6!4SmR z9qD}=(W%#!GL5vw2{w**5l zSJ-!?o2AMZ)!5NxRpHU3W96e5q>=1wH~!&gqmh-n#LVw5%I$+p^ESTrJS`U6!Su`%+~bok*~7lB4F&{VP(p5ro0RT2%Cwi1SH@!vPq5 ziSZg~Px@t+iS5%5ru$9dYk?(eSagSd=%{?*wq9hKeoIqysu=o1>;&@Y#ofko98s?r z%BZi)rL76-VJ$(cAoB!Q#>tJ)r%nUMx0iftzzG{2&r!O=jmz9O<6_KmlKFP zZ7Out2bGXpEv~RrgrQAeFAZM%JnjVPyAw$|EnKF!7TNS`~*pHMvp&^b(WW@vs_@PLj;fBd$_MB6mGY#cuI^HAQ{B=zRzPo0jOC zE)He-L-2<{{)K99%{CmDTboP-PZ(MlI#I|!L(msV8&TVcX`>kG8ks@vnhljqU26-q z-e*H)#qiNAI-91+D=MPmF~ekn19YZe2;urS{?-sGh@D-`Ip)dXC55YObh7CD>3F77l%HeAX%XV^< zn~@M)Nn*Of#T$`$E{4m~M zZW3DbHU|eQx}BJ7r&3_tEd$Rd@w0y$vqa~LC@(!eF*y{xTDbWDzq zq^1&ReRn_0qM_G5@m2oaEDc?xsTpXLECccFZZ81YOiYzR(XnQJ36ApzLmGl^R1V)1 z%bA$0zS^F-U1_j{XnND#GYH~%;+GH?8eF?{fi;|UqvL@W0b1rkWm9xQn}y8TK;-qv zxC|9ejI`8V1+AuE|J2y8kVxsR=x4N^(*kgD)vn`cF9=91c!1eVAC7t;@Ah7C#wP^I z9bp@krXGzfcjJ1wp9v=;afQg``U??pqKdW8?&_Vttai!Es9kW0ji=}EbOEJkTjOqL z$y(x}<$5*@?g~-y(}~^cl@Gi}5%+YW8?zg#x=D!BFbNmUg+ZGXPpSUxA&Dl4@OUwo zGO${_i@s!1!#Ov-CR6qcq)X3kuurigL}*ARr65t%R*P?Q%Vd7%G_G_Zmt`n2Rc|J@ zo6ggmVw*KEva>U-D6zOy&caIvX1qF-Th-{ZPdNa`wYq&!CdRP1Cf2(F@qmiw{-aZy z^x?ofXfBQ6S)`eLyiVJqMIi?apR@4%n*uupN_z+;vS`j9x>$a*(vMZN0;B)DO-!eQTh z_`}`X9cowFmK9pML0xxK&O=8BRyxFCQoyt5eAB7wbeHCRdW{goY zVpOd3xKa{L!0%6CJN>P#UZ=3+?)dO7SrMynd>`qsW(xFk*O^fjXJX4C_WjoD3*(8; zk}a_5P)?iSrEfcKiTJRAuAJ>iLB@=*oNdTyg3mK~IcXvXf7Bvs8kZm&^laQBRt7nz zj`wCp;`*TX^rq3j-};ob=`q|nmcA<3_};~#8qb| zOE-KCAmMd1iwk-}ffK&YkNJ8k`=QwYNhp6-4feT6x)iW-xtHHv(1oQA>+Cuis!@9~ z=c|U9t4>_APMS9Jo5J(jt$15Q@yKcKPPeexDw8`&fEGWm%0@o7Y`< z)quD*y++BJ9ye1XEGP?~wY4FaTWVf6XmE8Amh~d^)&9(Da%j|5^i@H2p7e!D+G;urZCJjD_71IAVK9g8uy z<)omeD2vX#nil*#lGo(Q!kSvw^*HZ}Qu5d*j^S(QZ9=(xM7T!Anr|iL{b#2d{~CxV zWgqTlDcpUtUN*plrj1;g#a<9p};Y_oC=I@z{5(-W(RM5TiK>=8*Y8soN4`46i(%TH{P1 z;WJ_DRTZ6~VXm$A1M)W${VFZX!Ac#{*0d9>e?K^z3LP~ z$fzem9!Q6=Jwd9&MGXV-Y7XMnI#fl3=Ix)giSu7#J&GfGv~UJ&VR{%MZvDPi`GfCa zNT!QPMU)hHp-7mf#O!aLci6aSs_Xbz!BXl<$Tnj9GRL zkCs4?Jpt?!k_Fqo7~a0F)Wm|*0a$tPRFEU{U$eW2EXmw>@E?l-ya5;YX_Eu35SLLM z32F{BJI3oxY^dBoNJHbyCEG9PWyK(fYaBHv6-Mff<}XT#ljOGTG~IHtnDek}z`y2d$Bf zFJHopJqV>JrSxeUqs`IZv5%DZrcVL!p9c(< zd{TOf0s)YrJmpB8uGG@k_D_6;&H#J-H0QB*f!{mG#PkfXVptBH$M9@9#oKz1(H$|= z^O@XupY#ec&GdX&Supz?1aWGO$cs*4kY&$Pb+5&$A0q4|?(CbhY)*TbxWWm&9soc7 zxCw!oQX!hL3HtE>)ZS>YjDZO>QyH;)jG4>fTw5IwN`r0<9qVQm*#EqOu>Iw!Lh~orM(%_l0M2We65Wfo(%6brn z5rwG)4MZdNhLJ*0w=7vi47dH?iWKywa zf5$wu$Hhj$AtuD0AGrA%a|nqUW5}}>$}C?1W4H_Al%w|O0qZ~6uL`hb> zOH01FEV^CocLd6f+xe5+B~Ie)IJ74VS0c0$aNJX6^YwLgtjoK-rQ@5}tNA!8Jx4=k z8^+dDmBp)k#z4wQT2qGjd(W=1qhPU)#aSh%yJYlFS{3Wh?|V5llNl9hvDVAm2`yh) zwA4BY((cjpPo{$HNqeUx=Qey^(4wdpkhAukL*GuKcU`}X!ZbI?QEjOxI3{`C-vdqN zPy0(d9A{v~MP{qh>k-EuPxn*&uU_AlPxV*)tqq~3Bt$~U4w=|>PLZ@8ZPA^4wNx5MYC#7S1{bQLDT49}(z}3KInm7_n$v|C{ZLgRM)zC})Mu(CIl~r~PXBF5n8tc8 z)RmO|+sEtG`^7BIE)pyfOiK;~g7=GFw1=~NBgY4Ut5o=x=r3MuJl$6Eda471gFO!i zrW-6DKnY-4DO-PQAKO!7!{frwg$Kn(1$Ht}!~}ThYxc{u&LjQcw6TFX0JpI_EMRG! zB7I_C3mOk9k-u<{6z3QD1 zq2x%kCY`44l{2Oy*@lp`0>e}5!kCW}81)ar_mhxH%U zO2|qvRd2zl)(^Rr5Q6Y zn8Uy94jcH@ycnOKkO4S$xJ~63DF$qAD@^L!OPs6(OfD0UooEdeV(wLPB^4YYyL=6( zO6cZ*g9FG#DNWk*06w$R5lPl>R1lb08QBOKKMDwO5OI)U3gDf7_0O!>co;OKR-{(4 zNl+UZU(On%$z;I6}Uu?2%HT3EF`_}lJ?-iY4Nqq#-cqP8bH%W=Plz3_%26TuL|CZcjvjx z05OZ9SVA9gO1$O*2Y7?$0q=1$3ks#>3h>#R%?u`k@kjfHO-=~p3RF-bnjt#11LXoA z1O2s{M05mdFljh?`|X&v=>nyzQHXR~r8KhFL^M+RJJW30Vo$7he66{> zu|A;uo&N9aqvyj}fF}HWZDm1?xUH#iRzRjNDuLh zm&c@%M>6c4&ZTUAq^grl9NCpR_(K<<{-ru}`Cm_BEl_>lWa5dE@>= zm%$J;I%TKAMjf8Nh?-nQ^XwYKKWO_`2WyABwpkXwl6(33AP(?l$bHpIT@{QME;=ov zl3YKuI{ux)(F!&B(Rx}PrODdavy&&wrM2AiXV#vtcJ+O85$f-(kuruv)pEgpip;+D zuTFT_M3&gfW(HqIpX}YXfe3G>6)99TDVHkXjv_iM8LC{anTNPYMOoiqbM3IXfLmM? zGPz4d@x)=z%hwkT@j69)V596{v)y1n7A&j)Za7$#&H^oqAzhBD6u{do|7y`D;1@-@ zMro6=bD9&GIbC^cT(1teKAoSzK+>94DIf|sA6~++!+NCFBX4=aB#z9e7Inia?}=$# z5PR|Y^ZW#NQ_a3(N{WVgPJKec&5O@Zu>09gy+hKm9ry-S5VKPc3Yv{3Pe8-P$JBF7 zQAs@^C*Mtass`f)F~9bS_W9)VtHs_?fYYI~lZ`H#nRF?ZpnTKi=?OCETj!&M!H-fX z;>G7DX|32{Y=5Km8CX&5;1dOZ+1zS6hopF_??(Zu!H0*ls|vJ$58w`nLC5me`8Dtz zgi}*7B_eW=Mq&m$P_|R^krNW~(EqCJE1=>^mcIvg2?Pl41eZW?pWwlr;7;(tArJ`e z?k>SCxD65@xJ+;l5+G=BhYxmNUb6eLd;VX|nRD))>8iffefu}JYO1O+p!V9Jqm0D) z0j%F_Wb+tlg0@qAzCq7#qm!Y^i=p{i0X~NHvD!g_p-uEA2u_{0TxSztx@~zDm}dD6OE#ilX~2-As70GxgF+rg!A!kiZcgS3SRALG(qe=)Ca)X6=f?~^N=zqL{i^V)9sttWmNH8kNe%G?_)GdY>HZPY8{*W0W#}1?5LYU$$P$z|9F(PxNE4x)1&EQQR_nZ`m}H;u9GrnNmB6_bJhn6!1^+ zP}6K^_Db^PmI{J7i94!3NrUx*%???N8A)-zk1XAOf@dITSbKN2vO6g)Q(o_--7tDcBvEGqP3PP? zFFXgVK^V%gjW#aX(D3K{1g5lMc(e`l-^#AE3+lnShJktsE9^d1KCYq zKq`WM`@%O>d+{O`tls8JK$v;{9b?1~*xq9S_pY0o_G5g%!eXLyoCCigEOdqB1MJ>4?h9VLK0^^47aK_76AscP|z@V@qLjTa!mE$za+kCXRHf#5MjJT`j9f?oE7y6Iph7oDj zBVYM0B@Lw{?er)&z7$|ER(r{JNc2C)Di7PzRB?~o5~*w@D>nlr#diTS93nrQS9}g zmV?B{wS0?b6#~MkiK{uVOYVAyROH}V$$4D@IhJCQS=#3r zLrTgU@O1MDuDmB026DNe=3}ybOK0s~ZE-G$)YIkAdK|*SzVs$IE&kZX9B9eumftI6 zEYN?Q49+qZx)_)p0iC&rxO}F#dFeiIe!Gh2h0!-vI%Ldrgp(1p12M{2xeO(Xa73S& zSDn$lC`Z<8E6@0pAHUYJ4LQY32h6`lYG-k|K3Z+zntEBD_*SlP-myH!C4Ux_o={iZ zcLJ^2*yp-7Y`Qi~JVy6zi`}h5wy5Q$7r|I~5c-$Lr20k-==qiNX+G2i1_7W>TIsjX zCDyY}>FcP}(SdCdgIn0i^THaqN$K)KeY%Qns$7nJ9=-7#$1BP73}%}E`wAK09a2|K zJLAGe@b}l!+g0_ckXZ(UUCdj)`r_%e0nwf4?5UJ_YQ4T+HdT?808VYx5 z(A&W9X=dOcH#1(JE;F=@BW#nt<7IHz8VgQeIBZNaD|Mnuzdf~*zq~u%$;lcMIn=pZ zgP)2ZfIBJ^k2IuhKz;>*0ESOaNc&soq1Xq}J$kIJmP#xHHB1)3_Z7~%k>*BE5^`Xy zglKc!DA_K&pd%$FE=cmg-X>0>-Patav32-e%~b{FBg{vKOyQbmUDd0O0#`vbZjjmn zJS|6^vP>LpDTCZP_gy&#OB3fnjg(^Fr&CAlEwYIcf9-7S5Lmkj?1T9%cL4xXC?N241 zIo!0}-mHVM7Ea!H;#~IgP2s1;o=Y7m5$-S^m6$SW;V0h?QjCOu==;88$?qr9-nzBI z_+7M#cGaE6X__k0lVxnD5CK~t;qv=Ywj0h}eN;i31@ zVN16{4{>h91_@ym_c3k*?J)lm=k`afJ`+cShak7`SVh}Z*2n%!XADtO>PA+Q1dLgq zIb=P}Yo&(rTE)7Yi`0!I>gZR^JLe_Hn}vKUhE1OsAD81T-d5w@!hepCjfW&q zV8NO~FF}3s3P~3%q~Lei8hORRStr6h;_%o8FRmKfWwR9dv6&<-8!xw?Q5dfC%k#Eu z@l*a7wsm8U73EERi5M#2m|HgCKw}eUdwagQq{bCNs|@5VJcR#t<|9&J!fpgxF@;~W zmb)fHZ)qX;!$fY4ElpG6=`p|3vYtEs{DVQnNrYF?ucH(#< zyvTN~-ImhNQcx}X)Tnyg5^&5rXjnP|VVitfs zC`XSzHnU+n(6@4I!Y9<_s9Qxl?g>_hel}*I2MwK1fi2DSJgo0EbLx$Gy*3p<6|Tuu z%W;>h`1XE&5fI^*SG}8{002Lje~W8;D3a*l=w@Z|M{N36oo$;rZrs~8dGf;cEI2ht zx6Nx0EQD@ngzD*h+F8dtb}S}K2`&W?(a4BrhG(&740Tbc6CSl<-Hz$Iu5NBk zg_;kd=t>5@D&?0IwYy7i>_^EKq3Q&1Qu)GFx##vHmB9ep=}EJPLe}=u%z~0+VMG-U zizD^Dr7D|X6RpCkJVEE~Y{`%l!^tGgCFrg&cImXh{z3iwckii_a6{R_zNlAM__1DO zW@LjX`nHB2rx`u5reJl-Bd5By4Y#7gJmBLU6>V9?b0ay z4)u_Whp?v88zCdLV)i~A52Do>xB!P`?Ps&%7M=yHm=4F>^gJEuv~H8XExM+-IAiU{6QqTpWI$QyCftrRN#M z_!-t});fMQDzt9n&bMYM4PF_P3bTbX5p%rr(wt zjL>@~e5@BG-blcsAb=7d7|mo#n=H!o-)~2w_dAC>*Zpqk!|cvoZcf^Uq$h+TL~=mH zaD6+X)puyj_>TA;Ca*6QrPm{`2Hf)EtncSw-8$%Hsk|%LJG9$cOJ}oyb*g6qK4lx; z$o8KDvU3NV+$g|Mkdz>(WYm4%Njc`Wdp(r8xAM{gy{5E9y&z)a0U zVGFU7d1kF16H}B97PN(SM_^^Fc)toZlulxm*}R>nVPc!gTej8fZ;^U$(m9o5q?}=K zHAxSWO}#zv=dJmuyxm-g9zFm`yP`;aqu2!KGA%K8d6VFH`L*RTA8iE{|sy*PK@MluQ$)2>sYd z^VIifX9lT)Uju6vRe$pCYUHhQ1RTwFNB}cD_V%c(h^2>X@PTQy;&*vPsUoeul4@IH z5`=RL*Mg z-)CCCN%|K-40F8wY|lzr)j(ROfE`*esjG`43=ONSY6U z%3M9y8;waLW!8!uCVNxSQ13onh=Q#%^*v0MBjuSilgMu(pC6$n>rcGe!`_*gN$i1@ z@!>Ilr-}!(>{;iDY^>{RqN{qlpBG((f0<~NTh!gXAKJ3Smul|jsjHXKke|sZoX`o# zDZbtGq#o52A-!7SKFDv21mx`K^W;%w(y6)2Cy*O=KYRpC@)B9|nJ(rGJDGqPWL znJfudx$Z)V(J1&PL8j-K46NL)tYza?9>(!~T=m8Ulrn98dfTFs&h zGcBj7^ii+S*SP+dHb*;FUUg40k3tW43Z7(QgdB9t8D399%`3Duc$00E?8oJ#Evd9} zze-{`_rG|joW!ElIZsv)ts0=B@|Dxc@XG!oddX+GVLyMJyQ5=x7CAYAxRQ_fjFe0m z-#>DejqcjO5cy2S2m%bp)@VKL)gWhirHtfH-c^N-;%}p=)@fi-`*pL z7Ibfdb_jfbvQqBh0)2Y>DJNrhztq&03sxV<!nD8qbJC`ck zW_pka|Mznp8pUs|ub;Ln75IX_%Np#iy_4I2b}-!4RD0 z`Vqk2VA$8Bta(r@xJzr}e0j-DIMwTfK=5L%SfHFUnq{pepzzF#ek=W;CBIKl)kF4a zwY+?C$teeOPk{jXWYA|-i4N@4k55MXiFwn}dn$2d% ztaeE9+^G3Bcj&XuBFuR*=ClRR5Z6;(N{tz2UrPt+#CimA=QN7M5cTog zpFd_}{g!on*R2vDP%~)l%3`>QuM?hoQYE)odE9?XC&=&ni=85})gFdiJBOl)cYBCwm%BB7Nb zU>sF(2eDa~AuW-?YWgmoEfm*|Abt#|+#jC99HT3I=lgQGJeul&t4Z`$YA80l9qt{H zj3ix=JCs67VaKdJ)6{xNLkE;dKLt0g_A&YLxC*8TWj4i-*hTO+Hal+9iWKQHe@ugCEv#tPGtptj>DUwA->_O5vA?Q44PMDYEX-XVjq!yM%4mR zvyBsB#;+QxTUudZdCgj;_RRX(MXE6_CA3pb-FMC$l(Ny`m=~E#@u<;+bZ0@I6bu|e z_hId7%Z5zUG3IQMKok~6YSs8&xIE+tio+7x50CxqZq&&iO7^IaNsUTDV&D49AeBizrZk=LnrLQkmSPn+j- z>EdMY{t>s;?%$q)A2Kwp4Qwn-O&lDVLB^&-u|qb#teAfL{Qf4x)50upa3I?L#@Ctc z&jU2zSPoOL7F#1?)fDrJw=&09%f;E3B5G214TyR}s|q_*IE?71`z6h5zcKJOGdI4U zK9j!5#fF|oFTtOQ3)O0*I)~OZ<%nOtg`#7E+g=j&Q%wXS5=pqI z#mU+m0-oU&BvW-o$L*{rw=*(<&;{P2tSV%KIwf#m9a*%Ga5&P-em_TFq9!?+ZuW#D zMV^lA-IX4F@R)B7zy5cIh>_{VAk_S?x?jMRd)mHBZ{p3}_l(?~#<~xdDC6|gp6$tR zHS@XMZQL@C+~Kd>C%V0`5+2SqyNueXIV4q;sCY0TYR=3*!`+(@zW+5Lew25=AF=-u z!Tk}?*2dJr%n9^IVRwgTERMFeR(1w9CRQweE#dxOruze;-|*RiY|TI>4i1I}pnu`~ zU5|FQc20Kp_2ZrXh3}zg{O_*x-+TKV*F#7D|6Hb4wg!$SKQ#MYvhdU2T%m!Hk%^Vb z{m|NiSd5%Np#P+xJy`Jw59T`Hp{)G_{qsE* z+76Bej!wVK((iP^x$jg~OhtrAN=}^Rzw7JXuTZ8UW7A27xo}^3Vy=JGR5hDhQ)LV3 zGmHYibCkaDASQJ^OGKQ!>ign}o%O3lBX|vK^bRhM-Zcv66*0k3_|Z>`%hSP;yB=5c zoZH>>PaI(|x2qxJf_b5H!7+*wzzB{MK;Fz&65z^Q24H*x*3C>}UJUnsufdYSu=It$ zrdEiwVgh*3DjVREu5cz?z6=1fGm&CDe#~1-f37_+PU7K)#c1m!Esg(Do)3WgIwEej z+)tikICiC)4m-jnuR&j2LD>rz10uTBB*ouJ`UOG%S+bX zegEBg=%%}BX;n>kt(sa2(vVP?U|?`yU^#~NLV-4%p$uSPV84&IA~0J^TT_s`gQ=l| zgN>!JA;{9+4&Y*E!eDO*v;;EPJDA#;*c&_Bn%aRFfDTTkh9*D@Q&W(_f5?0j^REy7 z+m*1rotdS%v(q1GKxP0CWC(Hw8W}nP{^Em!gZpF4znI=GsQwF|p|P>4jp>^hdnbUg zvy;;=yU2)oKsA}Vv|9Lr^ z9~(*$Hr@UsGoF`!fs1=}1%Iqme#Zo3rugV8DqOpK&8r8-D$ZZ;RPptNNa0$u$ z4^mcAveEHeMT;rug5TglzWO;6U~P}TaF!Cg8wuU>m7!Dd;vFm}FHK&rwkT`DwRt4-U!Gf{cKSbpXdFvb3XH+W(B4Ei~fdt>ye zOs@q5u%UhELCvH)KQi37TLOQ5C!n8bnzU+qd!E?Uc~K8b&TcOFR8+$v zyMeNPSMA3~?#K5prk%XXKJeAKWGXiLpi~7E*U7Nf*6@nVXK1wy6*yN$oifLsPY-SS zsId?0TfvC;rDO-9VEd(cxMiV4sN9t}Zo?O*tt*h%KW(Qq@No6d|T*02~ z-7Xdo{A^sj<^Rxs&du)l%ukOK=Ci~wA4lx)NHVb9XPxz4xj|E>xp9SVNlK7nvUS7P zxLu}JJ3F5MIxInvKJI4G8D{z79*k^7+LFS_$HZ72;x*ME3^usVr)pr(yuI3TUCQD> zz0(7Gm-xk1a<;7mfS)FbXH<3WQ(APAKC%}6s*wU`v#n>~q)*V)>KRoXJjjdVKuHrX zJ7%4Z<;w~?37jZ#UfEyDeqwU08!#)3Ez>JICl<7|FE|ZpV^gqZ{~~D97BIk0y9X-7KpvhB#7eIIWCO5RQ|o z+8PsE4KnREP>HC4D=0Aus$u+2n*)=xC>2KD#O#FDwRoJ1DTl|+I>{~7B;>I_dllbF zy%nrgyCQq^LSq8Qo5zbg2qy&6A?MN_1EjznY#MO>8w%(^VW!tTm%Xo>w)Sa1o$*GCkERjtP@^ zi?#(Ku|b^)!D3ojx!Dd7iq-`mLV}n-Tc}*C zN%1#iGj^KfBEM&kXA)`EI?88;v!9~L-s3BWqxAVIjl~51U<&J(^sP$aC%9 zlL3`KQY!UyLR#&WDRzz=)Dpb@nXoCN6&kh0lBSVk{*K5AaTBhUht0{J@s)QwG0wsH zxfLAmW-?ApT-VngETR>ux~wG5GoY_ADU%i1*~#8P?Dp`?;aV(Wo?v;Jx4RtCY>Bvi zYOvKZ1_aCVmEe@s&|y(J$B64L!?EZe$h zQ7C*NThizWw^}-j6v!Ldm*!DR#PFH+-TSCdM>A?G3RItnoDnoE3o*Q=4lgnVRuw+D zb;PCsUvfsC{5%uj2`&bC0B-&HYL%CYRj3HQ`^YlBMpXqVJk^Waqwl8hRBc>ItbVje zIkYoa)kIM*v#Dv~+=;iUaceWMF5ytoYI(X!!}-}Ge08*rq2xErTz1EKG2VGJr|6`| zz1S1#IJLSHm~PT;o-}r^~ucp->^g_nP&^bw8cP>xcVtq?_qIRdl=H z&|tA_LOzF%;9#!`aWU^m*mgsQ7NwpU_}oPY+*a{&Jshz8BK&LUsi==CoxaI=v{LDt zc$BPAUR?9X_w{72gp!9Ikd3#c*gYV&wc26-8(I3NwJ;H)Gx0Mmf1EZB!vKr99JeaM z2QVNo*%=-v=2T%|`|Ka@b6@gQWzL0~&{2jof>V`a{;NEry}o}zkM_L2h&Z{cAf<{v zb}W#xGUjgiLJD&~k2X(=bECJ&VMyxAq>=sp^GHj~feIa8eE!Sjz)&42@@d{hWicCc zEZn&T7o_2nq1A(o_$CZa+rAv+5a>=S>Pyu2S%Lu_$c8nt#;sAh%Ok12EJPm8_j;sa zQ@xcP-l%=V`rM{*#$=WEB^h};vziSHGj*g@At$i3MoNs+lbN=A0Tp;L>B5 zt%bm!`K_7{(JM|{)J}ERZl)KAaUPwz`%HD9ZOe20eL7XtBd&23bIDk0^mvp0-uJRV zPBdj8n=IH0(hG}w?E_w0P?uf3==pCrAD*io+hB&=iZY74LB$D|#-$vgJB$qXH)uGK zu((~R@q(;sH_lCyNPnWeL1DnKaK2G~8<`LT$v=U)dbvm@!Rb@!#H7JbmB{3%WP8Z| z_lXh`B*G+diE~bR?X*w5kG2Nh5~Jt61o)wbhrq6!yos$K_)F1#oCPoiPGU|qFtdJ3 z?txxf3rt1fRZm&wqq$+P45U_TE|Dm>`)#-slnHH^^6($=KXL-LlD`usCMfC^L*Mmr z>*_$kURBOm7@7RRwhiumC508jIQj$HgM!~FU!2XkvZeG!nK%)?Fvplb)M2FET2WV8v~LjFq!lvA;y`lwqC* zyf>21_wFuWOC#`3%yt5*zr=A7gc#dHejMSGg%mU!9_7 z(v?Q_%q(&%v^17qFo@eU3cS+I(13hVVL|ZhGBk39i_s@>U2|kVy$$&aRVP(iodNey zwiOA#4B;u#`RVKBrt*x_7!IJ}c1rQwEwmB#1P35YxKXW4Qy!ZL&k?)x8!6Tk@`IgL z9R=e>-%xA+<%~6jzS>%8`n_ZjVc?RPLSQN(p)RHar22;~Z;n1fYxl^9s$k?O({v}k zg|_6a_$@a~;L;tFt2=l7ytNsWs0t?W+Hhy}V+5cxLzSSh(7)dcKz&EuwC+47eNwuA<+l$kxV*R%+M>$J;YS7R~@;`l^Ic&NIG+N0LYhTg}y_Z^VDT@ z-jn-97=>%p9~}WlBMFfd(?YobY=PJ}eok!<`rTe_b)!RXrnbs+2lxuUN?t_3uZ_I0 zT#FoN_p|L*V~;bOQwNJ1cl+#e#g&(mGc(lFm7i0a#4p`jHtSKGsCwQw5Ry<-T35Fg zB)%T6V$Hy^?3){pL+c7%bBoAPGm6a)Oh)gQUn27}o!_v_kOPM&p?J6{SI1A}pK*Em zgX6wltKd243rXj$hQ+5OM=SXj)WwlVuIWlJhm13K_T@3RqdmgK=-T7N$H5^$4SP8%r9t1y$A&b7)9y{ta-Et!JP z=}bMB{mA)T{e{bs3E##a|G3!+A?NgQcr0J&5rd(a-pp%IWtWAetQZ?x5Ld{31nt|5 z^{HbuzuN4o_7olvBU?H9#GMbZ4MDpbw-4n@<~3XAnuflsxi@JPV1PE{eeW?$`~q?^ z8_zX8)OXte{AOeg#%toN*PVrQ&MwC9%sm45ym*#Di9?@vsGR8Zp(d@Zmde{%bxVj> zYhrkMzshnL%W}-HuSBw~s4Z=*XiVusiIw=4Jk^@hWj@Fu)?2u&Q;uQdjKh zDY1^?M!98mIeUwuv|^24J`?$F_@|-Fl@pmvyOmi~H|lVt-SkBb-!{4ebUz!w+nM|7 z>GrJMXQt_&<&0|6-ak0EY-=xF1tPr!96@DT_qdzf?4@yBT)w$^A-%IQEt&X4AC;7W zthO%4-acV<@}zc>nTDTReq^noyW~+YF@FJVi0s2im`ZMEJy$YwT;kmP9Kki;fN$%j z7_w9|Qd;d0bqMVo)iFx$&b&PkO=a8?Vh~Lg7eF<&(iQiWn{p9_YS-#;Y=!UymceZ{ zRpta<-fcv~iBkslPRm=_IxEF|5cQ@e(CL*-gU{s24bw_b(OCHrfJM>P?h2I)uOSQ$ z1Ra?qw<{{_!lt+luU!RFMPSa8>3{Zuzoa;v=?z1>{uRXRE5xvj>wWogw-PZwiE{Y9 z5cjjG102ryvhV9Nem4E)me+j)q!pbL{hkcZdHyqO#9i_maQ&mwW@f|CMt&t~@ri}h z6TuQ!?9CGn_caM|wVC4rPo}cB%t#M#vCW#0yC2D;kUv`b?I-W!CPf+(MvRY97its~ zInwmE?&iBpHN}?Ljc0se<*Y zt$#ne3t*i!1rqX)+qf!ZNY71S`;~ipvp&CkBHjDRPB>-8+{EV$lRDBi{DLJrLTC5z zwGqiFP#5jXdp0J2#N`2pwwu$ztl+Wsvf#UlUGkzv<6!H2jPsc2skru*EVgaWYU+Eg|Ei_ND9o zF%U|egEY`F?u}E(hFdt4M2I-f*X2kKJV+wqMpdwvV{u) z^tvSeHhKE$mn^R@-b~b@Q&o5d$c6~X`3D-o#={zupih_Tkls);k1Qos-pCJ)O&Q3X zCVU<5%IwVhFQ3x9ve&ENLeaVErz#&!&II5B5&AvBYKKfsO?N%)JsOa^Th^O49LGUTvkI+ zLcik?I$eOD@GR-RBFcCXuaSF08-H2f&8XpVdO#J`;N>N}o3nS8qEdH1x%br0me6OQnXt6sX55IwLmMJ|HWgTkXHZ_b77CglVeewOP8^tj9M z18Tz6=o&$c7}R3BcncDOHzDKtprCt9`FUfB=`qz%Bb`FB2gdXuHq+)l9Y_T3aN&}) zpno*be@aO6SDUbFV2jqFl4rYS^Lai{Yc}*D`6$oS<*!npS)%qj-_3})DY-d-g%i!+ zpC*eQ`|B(5S7Pa|s46%}AwTf`h`EY2G^R~>292t(+24}QoiO5ddQCX;Swt61#YDtJ z)bPo|cE*c`zEO~ozhTHm3VS>}Jmh#fgf1yvjf~lbjD<0OO2kB5(1aMTR}PhoiLB~J zv<3rSx`vshYumjFJ~~=0;XcwhuZyZ;GAt|1`77{sC0Am`j$I|& zSA>t9WkT5x ztO}x>uW-nT^lNh&Lbf$2GoGsu|Ex z##~ZbU-W(PWeeU=ojtnl$NN|zf}^koGxmD%uvr1eA&H^gR%u!vZBx|cXE}r0CI@ZE z1-U7`IfSt}q*JGjp`X7a%`$Gqd-9yte65_n!_r#tY&yk~Q?Rl^$zOb1J#xEoN+whAg7yu`_INkAe2Ib9g$dhV@4(%S@E} zL=U6;jr;nSfS!C|G6S;psSgI*CufWh`I@YC4 zImBcZq)cu;lFH>hJUc~7wqHj4d$_&8yE^=358yzMruIm>bRRs;9TLdAOdF%sse>%g z9B;J&=b5i;o45?TPsDW2jP84gBOoMi*7HG2ZVU!lT zf;^5!JTXIMuH6{j7^b^l3CQ5dzG9Gl)j5qPk0puyh$$(+o$xK=TPy2$Wab)D5D|pg zKVZ8JLTAMI8^kcf69f3wC_VG%qT@1u!;6u%4?xx3m=XOg z`HW+^8@UCg1%nYn)^uc6!3~tL`jMlMmo#B_SL!4>^Qa$M)VmRS%I-eCchKummq7!EAT5rA*a#3J`VI@{7~goGXeSFBA8SnnAcXv z-%{Ql?Kx(hTa00D6J!%T1C!9_8b6ww6~sg6L+Itg=~HLsH^4@K&h-#RRe=`eA8Z5* z;t0{J6ym?`ufrXHJ)`-N(Y?b6{|i|t;lw*ZzMmcc;9|=EB8P{_&mjE|owf5snTzLyI~&6-ALerz=vplcoO^3!_zPEDuojLvi)Ti zL=MIe&rG*pxHNwnsY$XxkOg3n1t75-kB-LH4II{a|$|!dw0%h+U5?7}>M=O}C`0{xeRkeUdc} zbkdw|WX{p;{tRcm$y8N@jz(^E^^aNq^sF#~%Chp~Ue_$jh}aF11DONo-Fd^pyXyGQ zMfk`zjRjev!1+P`Q*9WHxdFHVxQlRyU*_@NBUa*BeyHLfv_H{kGg=i`A_-h<9KyD@ z#n!Y5K(?qK!((lrWB|9|wWqU}Q4CloJ;OnvCK;c5dn~7;dfSG0;~yglexRzd>ewZE zX$%Nulb5;50THTdm9<7Z$g{ecQ+2m_Z&u`5XIGf-IOzmVCrqA_@;vrbgGN>xXB9l@ zZ+rd@;NF=a&VTQt%shZfG8ZtmEgBN#+`?9wa+HuTbXpx};XI9L_(O3VcLrmIXDlj92~ia|@og{hkvH zE*Q0WiwIR!*$%NbN%AqJxR(oxVrnKNAogIfdoJlcs3x);;0%%}$=R|adWZ%0T(^eg zik+K?X^D(1b_RVJ3bbXO1_Zi&DF+~f>MZyB#;0-t1Y$V4y)bR^iQ@8Gp7)$?)ySZ; zT*vn=p!Ydp#C>mZMyMT-KWG704SMgG-4OP(SI)p1>RLaXO}RbOn)+NSufklS_0lpt zihTvN_1KO0#`rbs^W{UAyt@4;+t%gou1<;m>M{|7D1pntrT%MiX;D^%eMJJ>%~sT4 zsz**c(<+G#gGw7f^uGxCQ=&TLys5|9N zGW-DFp%qt8`GTL!{+YMVuVjcWd2w&Cpz8K*{>JVMvp6$-8))R{+1Y9kYEVMIu9`cj z<#DT~sa)%VywUAwU<_ye0I4n1U{IUkRpqb=T@sO$h<;jP+jUx!fc>qMDO@I(eSCBj zy*w4Nj*XEqU%cb2m`nq|vh4NcvGzwDqYd(`())X8fZO6(7vYqzp%3G3=7{H__L%w4 zIdMTGUxfnU;{)7bM)Y|ufGqj475wq|<4--pCT^_y^+WHyn?9k|1&QoK7~G5SWoOsg zqFMLH_dgfFj%c|VyiYnhX|nCxLVq&Bom!rCz8VTJjZ+Avq+-fvrR_xk!!fnL@xkso z9P zMa>3l>)qxjJR!_-vOf%eT8QD|F-5|3BF6EEumns7sVvBNhLQQ`fDyBj%#Bb_iSnbh zgjTf+l15PIV`hBH8&@Q^vYpp;HGY9ko19j_Q82d?&T#j7NjmRHW&yPdhN$hUbr40* z>QqmR=qS`-HbFaPo?Uo8t{P9h+{N7U!KCaJuwDO(chprlMmJ3PSTb*n%_J7$smNsY z5%HZsJs>}`&05oGHuOdI$EH8W34iE`O%=oiF%oxeIBCt5AgQyfERQ%PfOnq-C*;P>VelolK>wLT%~MvQ*hOM zo!tSU2}GD*3wNBK7*T=1L_@whpH%<$F~UAnkpbo!(O2s+(*pUdP(*S7e@dTJC!;MR?HsxLUY&<5|reL-+cRMY(_8I zz6aR9z#(cla5%A|&|=M!W=%TsNeTE`v1L{%GG5JJQNDTRH8xUltJv>TwtX~r5o>Qd zg~NP@T8`lc0d}u-&tbp0!_W7+l{DB~6i0WjO$6Z9CWBiZ*yYeF%UCO30V)SfJ9{IS zSZklL;&Zo=l>S7`7Y26Qo_N&aLmAJzH23SRSC^JJ&P=%!7Rh`}rLMt_**2l+XWC#h zmMr?WwFLn7`}f%A0KI3jUZ(d`ZiP1gv%GNo&dhc1U4GliAx8K_FzHO~_*~j-p33oz zURqIAeR*#+|JfJrZqK9EGTlMCt=hF~=@T`T0XFXwMb#(!mHC=`#0cjFsE^R8Cn&|h z1CK?c;_q)Eymtyx%}uH;SN_Ph!;p$ans>@Gt&(t9nh%+mR1UT>F+58rI_3>udRjBB zFA?8sT{%$wSAyIKAz~PFhF{c|^vtK7=TcIBt%9=e5MNN*pJ9s0rB4SQ{PffOeMn!( zVcXQEV9I~}`Lz~WE6e>TzDh+WsS%(Zw$FBQe>QtV_OL4kyv^>I!{aavbNuv3ZeV*7 zli?s>-KCib);WxV;8Ws`c=Q$F7iJKu1~t}zceX*5tME{;U6x-SFUhuk-a+Fti#<@2 zN2DJmNULTC+l`u{CzzTM*CHvAjSKv#&ANzrF-m!<*C`^3C4x%Zd7-3C>4W^nmZo8alfSjZHE=u5(2VGzQh@Ct`RGEzN2e!B1y+UozioBE+!EAd-IbENWi;aQc zd<#T8Kueh6>fs{WV_77<;j8PU{Ms-cxziw{jljHl05k zdJ?2!VFf+9&#kHac>c5$)>%?l=Q&rio%$0!O^d)e2`xqItL%wK_DS(cIQ?kvCoS$S z-tf=IrQI$rY~C+>lah>uEOT9vaYvYBJ2uuXy@O;Ab;nHMA}AUk1Sp+awv1^>pLhNz zNb9-eFU7(gqNC(2xP5|uwLT0anV$a|8}W5Z2qEy-th<%51>s+F4g)WYd&_krL3x<=lWpNil5wuUy$ z-KFZ$d$_&Qf1Dz%tiW#CYRjq?YwVNK12jD@e_xvbB8ATibyWAx*{|>3f*!4NtN22j zP5!hOhR0gDIr5!^So^i#3B4hfAl2$)j+x^agQ=SEAR?da{2FIqHgTyfd*3z4a}IU+O)tsEnI#B6?NIOP4d z%raodE1@@0qUtWt|DVe&i_zqz9A=$T-^h-8$1WywQ6s zrLv8hX_l;SuLKjVrbDr~N7nCZ7(Wk)`wHGxyFiAwe+E7pJO86>PIBT(sAruYE-G<`eGHK z1@lpQSXIVtpZ`?OAZFdLob`+<#_89t#K4Zl+{S{MelD~=QM=ljd=!OR3*F_{?h zy$%8RANK3CF#A@NXh)5#A8=3mM0;hZ8SaKC!^5Hsx!Th2DnApyt*b&a(4|qZCoGBj z2(VMr5kRb@D^+KA4`exl@I5Fad44>TIt;n`3E)c?s~f}e<;gYicBfA235w5tF_YyV zR(&K7wSx3KzF-2)M=qxSj=MOD0OiuGRP%>$Dat;AC(X^#ndjlu4}=`v1#s{ptQX5_ zw2Qk#)5>F$Hs!-+lV97rL--?l`ox_JJh8oCyR*}yc<`Vvd1b|bTaOlVeYPI&K7DIH z-q%R!JcHq!PG(My5+dC1+`i377hDk;^yXGR4Zn%-u(2YpJy|Dmlo3&JYrbck+7Cyf zM4Erkv9g|-B}J+178mm#*vG@YIN2ayowh|lxb^L>*XjBD`XqLTR?d_STkK~N?(Ruz zn1|l7*0k_f<_g!2?yO-Pie#2epUbhuCsF(Efc*jl0wkW($0YNKok0Fp-<-f(>Xz2b zhehi-ywse1$!n>z6S`m3dReGHJFcj(J&TcK{eARyeDI;l$rs^UsH42+QrB@Asz{(+R5`4F^MV>m$J|3(|#VMimQlejSkr)I;n?L?|IDox6^J zjn5j0m;(FJ@c~ znqSuYRkN2c`Q|u5PJ+e(StQ3?q!9!%Zx~RJse=!XPwQU20Hb*%d#%PrUPn0D# zNb@u#6{WrgY^pTit1#{KmxLWRKlTRD__-hiC%aNGx(LP zv|NhaRMw}B}wP?B+-T2RTd`3$oyCby|S1fL>;di(t116J|0DEpty)u;b9qNY%rd5(Gfn}Dn6GT5fVuN% z>AS81qpeR#pzbXug-U_^adbOvMRuBo3kfffnq?vwd&v3(7hh8009Qv?#|%T&n`aa) ztR{!#lq(S;c~d3%r-nOCI|WcwfpiZ0mxrY1Ch2xtz~u!$;3w zxrCU06G0<~!E;y=5o@^sQ9on(N(7NUar-Sjq|Fs_sy+?78bvGp=c(#mkMa$epyyY4 zCo#S3_vbYoM=tn$rel;yBF%F0VEs(;Y&tAsViKra{>j#B8KkYvWevv7kHxDCY!m9b za0)mwG$oBUU=0{k`cm5%`wLM@rxHy^uZ0NLFs3m9C99=TLLiXtRKn6^6#A<$&E{ zVpjb9FVrU!koiyAbggoi+dpg0FeH_MI^I|A&kFeUTE^`^H;+UL2?)Fu)t@D%1*l|G z3JKbKE{{|c4sVY!O&!{FL%@ZKX4tz4=sM&Axnk(Uibuq!KI#h!wp-ku=|`~-MPW`4 z*;)s*;u?;W8wD$a zB||OPU^vp2JvQxFTVGjH3scGiEu?5wP?T@~aj5Joe}4rP2IkcrJlxK>8S(v~!*ucP zaYJY$U;p)zsM-5P8}i$LWlO!8N%8CId>EsElaG`(llAkbUIx~6a1G`^x) zyvnO*J3|brtvKavIjlQJ(c|^Lunl0;H_!k`FTVpz_fZiZI#PthVz6p?K0sUNQtOPu zu=ge~n!7L*!XTTgqLpxo9N}XItAkQi=*R+RU)i_?_GJ48_<663L>gP^agWGK5LVyRqS-Qe`d{<@CVGQdhVzko%QeL?%@6${RIeSA+6p`6EIR zajP6po5{M_8g*q&E@_MfG8@kEMB+Bc1A#}Go|Fcmhfi4$Yn&&Qgh&O)di#Do4teIZ zl4f*8n^a`Qb(=9UjHBu;$X}VR;W;HlU1zg(+6ZOaw%<(V@x8@E?`->Qm||-W99{SQBno!CKP4OAolddh zcMY4?<;^{?c}5rT9Jfd%EJ*u>jZPr%+Yv#>qyqhHxJ@gwaSt*PoHF)C_Vy+RUO`jr zM*>8OuMF>e-N*7{MbTb4mIZJX0mQ__XV+V47a8mQaN=#|J~H_>RJp4AZHxz^b&}$* z2!s#`ccBA>ssYk0c#Oab65&o-^Xs?Q%4gCvn@5Tl289UAKIkdRsn^sIW0`M>vudm2 zpl(vT#1Bm`3XCFlxy$rKBH}sKalZyTLldp3V|s_&o5H`%G?~e;0*e_&4*HYB=QA`A z#2TIyC86>s)8e3?=Ne=K8M@^4+J^k4CaS-9A=jsmRezai#qgI0M7g#;0lkL)n&jrT zCr6jP&0$CF|97?vX2+-^ZVX9#fFv?Bu#Mq+Ab zY;R&|XUz^zi`nPl-Ly|XEJ0RCzRlH=*PIg>>@`1SQ z3~fz;Tp(kve@_hJ`gdxsKZ^b;akH_sv*snU0D&C100384R|Z!W274!S023!CC*V&l z+25*6jQ>UF;Ou1chswkl@Rt7bJM{<%U}9hb{6qWO!v9;Ne$)QDN%r>k|5EhZhre9> zqmG%8krnXQ{Xd$_olHz@{zd<94!qH_0L%dp89>mLRddPWv{Cbr)Uzj@es0RL3}ruvsb z_D+@{4-!#3b5ol?6#rEGWrnHAoBej?^d^62i}5M2h^R0zO0clYvT-W^ZNvYI=s$Ul z-HqSEIzA4@|3&_H`Cr85rgnd2lJUt{8abKD{~7fF76z6NGM0AEZY2L!s{fXM;cZ@u+b850vT+uz0ZM!z-wQ^80E;N$swEOPy3`=7giDf?6WpNVhrV|^L9 zcwk_^kKZX?Di+SRMs|jlHb4OApGyV@JM*s!a^lDc_`gG9WJw7TrMLg5U|`^2aKH2E zxNBEfz`*dVB}D{P+|o}n;8n2tGJ7kmNkq1scp`HgIjz1cvW)dJlTob$brg6Qcv$V| z7(T|L<3y99XNHmwD8nlL3?Z|cj!7{`bNoES!v^?V*zln*g(?Ntbn{M5tcS%uQgWJV z^i`=UUung=wH}Zpt=_h_aaD9$Ui{*EJ2x|Pdt{|$mg#E+*|Av)S6O@If&|8j6wRyv zC4u)5A{Pl0TnQ!=j2cqZFW#R_U{C;^#Pl27|KHWk@$Ik5wl}$a(xL6&51QLcOlcVs zk8zm|?E>rpyp<`%ub~Hw-Z`&xx#pyVN#^-b~hI=DE8AZa0$Elgrz zvhh}61z908O1)<>lP^LebIDo)SKG}-c`$FXlb_$`&SQSNKcV^c8RV$A7>}c8^Gob5 zJY;)hva|rzA6;o1#Oj0Bez?rPhmw`%SfBqe8PnOH;Hih2c13I+l~@|#>pZVv4}CK- zGf3VpX|u3Mf4PwFMNZR>N1vr^To zLImywna^f69~bys=eu3&#a}#b`CGZ2O?$|>Fv&5hGkHARHnwc_;7h&MU{bxc)LolM zfV=$h_&t_2I-c*iZ;4nPdr-7!2frN{CtdcHY~4Kp_R8X&knnj=T$h+%uGZ>{`KyWZ z!Mn(_7BiJt1P)SZ&0o$f;VGULU6~gJPRfoT#YOIGEa&zr#D4|qtHn?3I5t1L%K%Hw z!>DwX?1tUYHDV_`x(GwFtOLKDrKpLyMa`K1u4)~6kF)hXt={5(do0Rw<9UfgkAOY$ zU61vy8$~67YJo&*{9O{VB+4eMRypri`|uPwTONQZ*0Iv*g9q4(PGqTPaK4vl_3lXf z>)KsKd|+n?Cgi%I7+dxwXi}EM}&YZe7dS0M9ct+wEM)x=>I@ zwPMXQxz)svgnEc0cEgHGg>$2cXxtkhY7iyC$y_9 zn+V|2;(TnR4{u+AQCu!w8);ixQoeB#x;X68yrI(KE{d7d)?qbo-Ou4fZ=7UCtb_Ha zCGn*m0x`m~!e(m{_V!Fcd_u%FQvUnL0Ln<+!DHA@FD&nkZ)W3oo}aU<4*dNX^rgg2 zPxpqJ+tGRKAMyGKzOfsR1{d7Z9l2GtF;l!y8Y0UURY>~sM6n*xgUIJ7J&^G-y&8hv zZ4uI}0{tg6*Xy}q|9lg^*Qmt{V)RjmZRhlCQMT2uOl5vx1e3&C1m0SC3cLXRthzt={IYH(hUxr-U7e&0(8Xg}X-`Uw2j7lt* z$>Tnj$y;Ym&oPBzuc=<9m5`Q}789eWt1Ej?T~H^=LB`L|Pfs7ArAZ^CI+DrzxL9kA zg@sl6($v&cTwH8Al&I)2lt>Q=i?UshVoLxBs&Tv6TxoX2!NgRk6^|l{h>9ZSo*mW( zi~d1YTCz8oKr0-CwDAniKq=Sm^DHGL6@*Ms=l$sNF4`{4P9zwGP@=D;zxykOcsTCG zW*ETdZX-C$_l1*Qv)T+c0kJSRLf}N8yWpEO@(Kc4-`w>CE| zq{{N`(Cc&$iAr@EFL#pk^Fam%21Z6?Q)I!SLh8@}ia-&r-GevtE_t1>Bo>M*Mq(5)|ZeG#jDT)7?ETyOy#j;;vYqoH5_kYyJmC+qk3{fx%$7oXx(%MDQ(hV=vGPgd)LFi_FS?C>fUkssV#gMP1c}` z3I^$@sj<5p&&%`Of8gP10WWc$y0EL^s-4f%QB@U9(lAW`h;xZX^*y@b{v_D;rXA7(BjihmS-W*focM|(P zUBpu>FV&&d`BqZ1& zaWdGfCgmyetEBJW2Ckx_;)jNboRco10@*Y%^tC4EFw8oiXAh;yhFPeXm>Bs?o@{Tk z>fyIBe2AH$m})viQ9VdFSCAcTG+sNEep_z?BbO%4=CEHUS%#!4q%7ro{u6d{v8IOA zitXlfWvR|q`=s>ktuR{^AU)lGk^dtA7Bzq9B@EE^wqf>qyk~1~ui)r=wb;mgt4p}< zASo$n?&4?$cid-MT3T;!?}BOJTeYV6yjsdS!3bE%6j!#jlk;Y=eeUXGk112T&JA!+(WMto^lNjDgj0@z` zXY_c!I}eZVGC8#rWss#zGVCWBjU?i>G+>=*xmFTSU0s2!JPyXs*Ya@aGz4_#BM3MS z%bl?f6USvm4ry9$S3TckwF380R?2Mf|E*c%(m!Qi*MFjm+A7=UGKu7LSO=?RE^U{K zt_uwf6%kHm5ITezC(OEXy*<^nRP($DnXQ_ju-bN;0#X(Ino&O?Kd;S8R*KNM3bHLe zHdKUkf4H)Aw6wLQzjpq}yi&_R%G>^HVSU}8Dk5o^##JXPNGSAYzZ}LhJ^aKzv(w^- z;9)$cqmAmbX>$BdkmT`VZI~AEuBCK!B!I}AK{1A0JTjfv^Cl;X&q<-WgrSM^$~Qa* zG0fS-Us_^C5cL^Je9UB%uJ+U3SXTY>bWZ*%%~-T5YSv6`k}ZDLf*=u7mGA3oR0l`# zLRHwR!oGA$`FhaG@EDW^sU8$IJfnPE6NvQp4Ecwu;qxUpB+NKD39q`Ob**02jVc`zebi89-YEp^945(3b^^2!R`g(9w(N4q#vaqr$4shjc;4d8^ z|08=>PjJFxU5Qr--7@F&J@VV*+3R-2b=W0Q#@I2PHDGmI+;qkxqpS;k1L@FYphIx|+My-u?fCE3kx~o@Z z!gho|gfy`BThu9|%^QW>ABulM4Yk1bz`0uM-+yA_;`|)#;v?)8sC2<^=EuotYHE6U zJpuDdd7^*RlCrg{M9CWG67u_ay*%AhQ&WHa`c>wtsY{|lw>dFAz0|rDWlNcQNw(Q5Yq`vUFFlI%1$8=K=;3hB3J zA2puk%galy;)FRnzS#fM%yoyuxpjLbBErGZOLU?{Li8?)sDokDPm30Ph%O{Vi9~N< za+C)m#HxD;nS2+({^g#79 zT|=YAyrwk*1vdQX;z)mHa!8@6IlJ^h&S2^00=K#vSaaYCr~9j*UEQg6nT*+0Pwz7? zzf4)Vr)GR=v5d*}jom@TR)uTsv>1^dzA#y9%wNqj1811DUn(svrE5Oxv6193Ky1y& zviEYUmyId&*|V>kD>(504Il!T9fvvpj*_CF8@o7BKleJZ0G#dq6?Yc=h~H1t=TR}s z{Wy#L*Apyr zl`^~$#pi9lR+(QCpkX`e_^X|MK8ISl z&jaWh$WC^G^;V-lb9a`Vx9R(>4wDtj4zIawN1|BQ|9qPL|9A)BKhd-$NO@V=@<3s) z$*udU23kS#yaey8VPdpbGXmw=3AAltUV3`e*+ka*OOPwV!VP!V9e}LBd0{z#Ks3q{ z?dj=xFL(x>Y8695ApII7%gJdC#QZA_>y$c;Y*YjnTkSaXA~-@~KN}DTpBJV%G5T(r z>5{H$1HfW3Jv$p28L8#!zx3g%|5ppa!+}C@RjL!CT#CARbIMg^fA60jHo1MK8-|Kw z_22srbshp5!dom^8df2Em7*(=vm6jvxnj$W z3=R8)dl5iR5=u-8K`t#V`7RFA)6wmJYojtK&~_du=!s<(m+~0Dw=s{|-rlaTL&4Do z5XgCQat@_?GI!Uefz|c(u82hq=dfB-dko{scw>f3hJ-T>6{J+_{PUU`)3Krqbz%ro zs5D{qU~dI6BI!Du_{pr&2?KcgAA4Kt4gphdqj=O}zpby+uG`H=aiGAgQxdVdcfymFSkoHLV$gN`CGOLc+e7PVsboz#90`<}R@xv&C>&8A|3Zr1KR zhKIe-G?ng}nOS;`zBG`+oj!D?4*5uaJ z(#pLk_1}RLIT=~4=jXG&mI7^=vffT+$9YnnoD~9z{4!9ux4o?pyl+ZztyD`0VrC}f zKG;J{BxwG0rD-odudP2cG!(x$NenLGnnRlJ?|pwVE0?w=O35a76GBN&zBpR#;p@9u zr2nF*4Dj<;dirtMuq;Ve24Av^+E1@F+NVRu8)S!GmBo?ra2xZ{CrK^LVjciJ!p+G0 z%qOO#v^kiRnpWJ~@d{)yuXNIPa&oG6$FVB}aMJ&|-q(|rmMQOF-q4Wg{zIZ3810~~ zuRtO?var`zQBg5y4-W%oDQ{~;#2KmX1!d2v2*Zpkwnh*FV2M8iLGpgQ#TynL{^fg5 zzlEs+E9mjvJgu;>u%bh>Baj7K85pQUjg481BAVc3P1QOBDg0o#TV0iAg{D!IDty7y z8O8SNJ|gH%u%Sc1;2%<~em##?H0gfB|Am*hM`n^7VB@jbGpM>+jH4 zL_`=77{kh}1P*1Tkb`|7`+ocOCYnd~U2cMoYF?n})Y1sTa2SQ+mzS3p6-`VlHLDVm zmX_w>c~MuF9=$SxcqBC)&vylgmFNpt3%JU7E_0VxDI(xi^wCIhK|yixls&)XHsRe5 zd7>3G?yl;ps(gHWLqkLQiuw8Zl_kLH3j79=rO~GQ@~O70UMLzEVE5<`t$n^_wbc1l zxv7^OXrXiI>FKMVQ7P2LWYx|W94tA^*It6NRpdb=plHFVm|-JKg=dHh2vQ9!t#5n5Q*b8%REEf*#4@&K3`&;glu$qAQ-+Mvro z>IQ9rykP@b5JAq$9mN{4f5#eA!ii#iHq)I+Ca_1TJ27jFmtdUtn;d{r)}_HtS+-hUghu&FS6j6)1r% zB%NPSbN8V}cX#Ws1*Ck)*KP#{`j=Gp?%lic{$Jnq_7>W4l}T3op~R4!CoBgZ!`X~H zC8uX%5}-`n;1+HmqrKR7zm1tEu8jWC!)Tdr{T8aO$XYq2!J>2FmTiiG8_zpHLPe~# znCqg|{=cT6>H|xa&I4j%V(z#)BQrBCFg(xNvy5!pR3l^6No!P`QHzE1i?4-Pznk)A z|67BvEg*0DGL_kdZM_%V6m^kb{z~|WOH53B`jn~Sx%+fH)r}W6Ffmo_lI5{lalslm zydR78*HZNHa2Y6ws|0oc@W34~+pqC5&mnl^OzHlBvrwrF6_FkzAcLCS#RFeh;MaTQ z)s@T#xsL0MqrAam2NUxJ7k_E=UtwpxuPSW%`hi>xu$?n#xhQl`I8Wy@$eGko3ov~A zx?1|Yl8k7-8_VB#=SV-RWR09p&1b)e%Pk&lAqOm;>jnPyxp_$T{%&PWB@&rd4yya; zgRP6OyA@q8uaF^8f~kL9lqu2g_QpzMgtu914KSxyr*MXihR zR0d982sBl7ZKS8V2Iw9X}R50Cb`x&L#Jf?_J3@P40nB2L(Z&_6JhBT`o~4bFVO$ zy(rKpc7LI=lj}GJezoA(QFy>HCzEZ!s!a-=ASqvl@SBPNg_EcIn(hHR$4WOkZVO@P$X)t9x_i#29dv(4FuPgGd-LHZW4k zxm=($`-MYZ&uG^AHNLE?Oy@WaHev(xpbCl_wPL$H>m9C%{)7oO(tmiKp-(W_hkO@lDCgPdU-qdJIP3cpX|nMC>`Yt=X56{O*@-biI37gjA0L9yI2>q zFZst#9w*-`{l1k>dYd#<(JmvKMtKKKJK+=3oT5g?M$70e&j_^k2<)KwVRlAQ{Wh^V zhCX7R_6_4qB>(qnd*&D${(sRJ=r!4ndCe%OvE@SM3kW%~8B`7;=XE8ui^*soC{fSy z>+>W_#+(fm=Ir|@jRBK~nS(42`J5mfj*ltMN$+ZHC&p)btuEtuKyZ~>cBtFg`~_cq zhiU31FS=Jgsy}XT)NSUF)UQ{ZsZXir+?S-Q|Mc+(!%{SfysJ!U_xh}{X@z6unO8ms z)@*PRF)1Ey1lQjBwDc&YgSoYJ(P%$Pp76Rkti3_jMl3w=?z?-$p*e?ZKL+22A2J&m z^|h~ga(F$EyAjDv*dq#1d+k*YxM$M|d-)Alg%w%Q7F%vvDz$D(Qj^}4R4e6s(4T8S zxEt57N&n(PX`H;u#mgG*&G}3fGOGnLT#)NtIo+M5=eE_{6JSCJQNm)ZJc0?kV5}FK z{H>T|C+Az5viE#6T6+sb1om$d@a5iarA-}<90i4D20!93VRB1g81P7ZzQ)0!&Uo*7 z7)fxi>{{GD=@||Ut?jH{=uFC!_#BF47~|6Yw2mjr<3W`AiMUq!B|Twy*rWNkhiM5+ zXrXEAmZ#%pKJA4E9V3tLuzpZCI4F@uMbnE@G^MfW1;Y^;f07lVRM1f$nBuapG}-aK zziC3+IZ^=6D&~g1s>v&bvy}Uovjnh@j)ABdZzd%e(V5)3WMuUf>V1efNEv@Pr?I;r zmySt3XX|>XHXlf2-_qD$zZ7kjuvA@aBH%FS`9N8Dd~(GY6(MqOZ8yRz=*bkFCBX*q z9&-^Rj3faX)kk6qmq&wZxP%3;zF<$ZmDgO)&LiWRz4cwvjcDRqlaED59qVLDbLksD z1Y6oVvpd3&q(ugXSSvE0!cT$i>^z7Or-t3Y{G?4w@L>qPlv;-5rnmYT;PjXGsLJG@ zN~!4q2c)BFc>S`bu9^tc#@*TBw)anB)~ZyH`x{Z}$gNE7H6_pPlIU|9WrMVR#1!wT zg?IRRnOc_@IrSk%hJ906itHhWub7n?UWQ8!vGX{u$gPekM4iuCYxGm$R~lZ~j4{3J zNKUTnkyN8dRnpLl!B)}=)(sOoyRez&r5P;}*Nwll$9V23HnXLsAr^?nUBZ2JV^Iq< zppHSp04$l{mB}dF4zF7UR&V{PH9zN>7xZ^@Q-ZM4{Ej_?dMaGp8^CTW>E-S;^HkXG1%7M|FBINVfdYXod?FnJ9Z$Up*Ya6|#@+2IGf> z0dD(LkC1?%j}$*7ghX@%zvuGBuOG*9#O!-o>-Y`=0zB>Pu^0lEr^#|pa`*oI^pjKK zh=3Q*-g_*uz~yP2-*EZ2hZ($ zEc*Y1^9$4O?~#5rddxo{on-#~JF(zl|FBNCD0rZG!*xU-a+b9RL6T diff --git a/lib/ebus-bus.c b/lib/ebus-bus.c index 5b326514..f194faa0 100644 --- a/lib/ebus-bus.c +++ b/lib/ebus-bus.c @@ -901,7 +901,10 @@ eb_execute(int id, char *data, char *buf, int *buflen) memset(msg, '\0', sizeof(msg)); msglen = sizeof(msg); - msgtype = eb_cmd_get_s_type(id); + + msgtype = eb_cmd_get_s_type(id); + if (msgtype < 0) + return; cycdata = NO; ret = -1; @@ -1048,8 +1051,8 @@ eb_cyc_data_process(const unsigned char *buf, int buflen) id = eb_cmd_search_com_cyc(&buf[1], buflen - 1); if (id >= 0) { - msgtype = eb_cmd_get_s_type(id); + err_ret_if(msgtype < 0, -1); /* unescape */ memcpy(msg, buf, buflen); diff --git a/lib/ebus-cmd.c b/lib/ebus-cmd.c index 3e7ded24..44d15c50 100644 --- a/lib/ebus-cmd.c +++ b/lib/ebus-cmd.c @@ -69,7 +69,16 @@ eb_cmd_check_type(int id, const char *type) int eb_cmd_get_s_type(int id) { - return com[id].s_type; + if (strncasecmp(com[id].s_type, EBUS_MSG_BROADCAST_TXT, 2) == 0) { + return EBUS_MSG_BROADCAST; + } else if(strncasecmp(com[id].s_type, EBUS_MSG_MASTER_MASTER_TXT, 2) == 0) { + return EBUS_MSG_MASTER_MASTER; + } else if(strncasecmp(com[id].s_type, EBUS_MSG_MASTER_SLAVE_TXT, 2) == 0) { + return EBUS_MSG_MASTER_SLAVE; + } else { + log_print(L_ERR, "message type %s unkown", com[id].s_type); + return -1; + } } @@ -119,7 +128,7 @@ eb_cmd_search_com_cyc(const unsigned char *hex, int hexlen) for (i = 0; i < cyclen; i++) { if (memcmp(hlp, cyc[i].msg, strlen((const char *) cyc[i].msg)) == 0) { - log_print(L_NOT, " found: %s type: %d ==> id: %d", + log_print(L_NOT, " found: %s type: %s ==> id: %d", cyc[i].msg, com[cyc[i].id].s_type, cyc[i].id); return cyc[i].id; @@ -141,7 +150,7 @@ eb_cmd_search_com_id(const char *type, const char *class, const char *cmd) && (strncasecmp(cmd, com[i].cmd, strlen(com[i].cmd)) == 0) && strlen(cmd) == strlen(com[i].cmd)) { - log_print(L_NOT, " found: %s%s%02X%s type: %d ==> id: %d", + log_print(L_NOT, " found: %s%s%02X%s type: %s ==> id: %d", com[i].s_zz, com[i].s_cmd, com[i].s_len, com[i].s_msg, com[i].s_type, i); return i; @@ -664,7 +673,7 @@ eb_cmd_print(const char *type, int all, int detail) if (strncasecmp(com[i].type, type, 1) == 0 || all) { - log_print(L_INF, "[%03d] %s : %5s.%-32s\t(type: %d)" \ + log_print(L_INF, "[%03d] %s : %22s.%-42s\t(type: %s)" \ " %s%s%-10s (len: %d) [%d] ==> %s", com[i].id, com[i].type, @@ -735,7 +744,8 @@ eb_cmd_fill(const char *tok) /* s_type */ tok = strtok(NULL, ";"); - com[comlen].s_type = atoi(tok); + strncpy(com[comlen].s_type, tok, strlen(tok)); + eb_cmd_uppercase(com[comlen].s_type); /* s_zz */ tok = strtok(NULL, ";"); diff --git a/lib/ebus-cmd.h b/lib/ebus-cmd.h index 23e76172..f4ddb7cf 100644 --- a/lib/ebus-cmd.h +++ b/lib/ebus-cmd.h @@ -40,8 +40,9 @@ #define CMD_SIZE_TYPE 3 #define CMD_SIZE_CLASS 20 -#define CMD_SIZE_CMD 30 +#define CMD_SIZE_CMD 40 #define CMD_SIZE_COM 256 +#define CMD_SIZE_S_TYPE 2 #define CMD_SIZE_S_ZZ 2 #define CMD_SIZE_S_CMD 4 #define CMD_SIZE_S_MSG 32 @@ -80,7 +81,7 @@ struct commands { char class[CMD_SIZE_CLASS + 1]; /**< ci */ char cmd[CMD_SIZE_CMD + 1]; /**< hydraulic */ char com[CMD_SIZE_COM + 1]; /**< just a comment */ - int s_type; /**< message type */ + char s_type[CMD_SIZE_S_TYPE + 1]; /**< message type */ char s_zz[CMD_SIZE_S_ZZ + 1]; /**< zz */ char s_cmd[CMD_SIZE_S_CMD + 1]; /**< pb sb */ int s_len; /**< number of send bytes */ @@ -126,7 +127,7 @@ int eb_cmd_check_type(int id, const char *type); /** * @brief returns s_type of given id * @param [in] id is index in command array - * @return s_type of ebus command + * @return type of ebus command | -1 wrong message type */ int eb_cmd_get_s_type(int id); diff --git a/lib/ebus-common.h b/lib/ebus-common.h index 1fa6f4e6..73f1767f 100644 --- a/lib/ebus-common.h +++ b/lib/ebus-common.h @@ -30,33 +30,36 @@ -#define EBUS_SYN 0xAA -#define EBUS_SYN_ESC_A9 0xA9 -#define EBUS_SYN_ESC_01 0x01 -#define EBUS_SYN_ESC_00 0x00 +#define EBUS_SYN 0xAA +#define EBUS_SYN_ESC_A9 0xA9 +#define EBUS_SYN_ESC_01 0x01 +#define EBUS_SYN_ESC_00 0x00 -#define EBUS_ACK 0x00 -#define EBUS_NAK 0xFF +#define EBUS_ACK 0x00 +#define EBUS_NAK 0xFF -#define EBUS_QQ 0xFF +#define EBUS_QQ 0xFF -#define EBUS_GET_RETRY 3 -#define EBUS_GET_RETRY_MAX 10 -#define EBUS_SKIP_ACK 1 -#define EBUS_MAX_WAIT 4000 -#define EBUS_SEND_RETRY 2 -#define EBUS_SEND_RETRY_MAX 10 -#define EBUS_PRINT_SIZE 30 +#define EBUS_GET_RETRY 3 +#define EBUS_GET_RETRY_MAX 10 +#define EBUS_SKIP_ACK 1 +#define EBUS_MAX_WAIT 4000 +#define EBUS_SEND_RETRY 2 +#define EBUS_SEND_RETRY_MAX 10 +#define EBUS_PRINT_SIZE 30 -#define EBUS_MSG_BROADCAST 1 -#define EBUS_MSG_MASTER_MASTER 2 -#define EBUS_MSG_MASTER_SLAVE 3 +#define EBUS_MSG_BROADCAST_TXT "BR" +#define EBUS_MSG_BROADCAST 1 +#define EBUS_MSG_MASTER_MASTER_TXT "MM" +#define EBUS_MSG_MASTER_MASTER 2 +#define EBUS_MSG_MASTER_SLAVE_TXT "MS" +#define EBUS_MSG_MASTER_SLAVE 3 -#define SERIAL_DEVICE "/dev/ttyUSB0" -#define SERIAL_BAUDRATE B2400 -#define SERIAL_BUFSIZE 100 +#define SERIAL_DEVICE "/dev/ttyUSB0" +#define SERIAL_BAUDRATE B2400 +#define SERIAL_BUFSIZE 100 -#define CMD_DATA_SIZE 50 /* 5+16+3+16+2 = 42 || 256 */ +#define CMD_DATA_SIZE 50 /* 5+16+3+16+2 = 42 || 256 */ enum enum_bool {UNSET = -1, NO, YES};