From 4e3ff774e3827cecf06cc0bd7b421fa0f616ff97 Mon Sep 17 00:00:00 2001 From: flashmark <15078748+flashmark@users.noreply.github.com> Date: Sat, 14 Jan 2023 21:00:32 +0100 Subject: [PATCH] P145 code cleanup,small GUI changes, documentation updates --- docs/source/Plugin/P145.rst | 28 ++++++++++++----- docs/source/Plugin/P145_loadResistor.png | Bin 0 -> 63076 bytes src/_P145_MQxxx.ino | 17 +++++++---- src/src/PluginStructs/P145_data_struct.cpp | 9 +++--- src/src/PluginStructs/P145_data_struct.h | 34 ++++++++++----------- 5 files changed, 53 insertions(+), 35 deletions(-) create mode 100644 docs/source/Plugin/P145_loadResistor.png diff --git a/docs/source/Plugin/P145.rst b/docs/source/Plugin/P145.rst index 01011d9de..3a894e2ec 100644 --- a/docs/source/Plugin/P145.rst +++ b/docs/source/Plugin/P145.rst @@ -29,10 +29,12 @@ This plugin supports gas sensors for which the resistance depends on a gas conce The analog value of the sensors is determined by a resistance (Rsensor). The sensor is typically used in series with a load resistor (Rload). The voltage is over Rload is connected to the analog input of the ESP. A sensor and gas specific conversion formula is used to convert the measured voltage to a gas concentration. +Typical MQ-xxx sensor connection: + .. image:: P145_MQ-xxx-Diagram.jpg :alt: Basic circuit to connect MQ-xxx sensors -The plugin can be configured to select one of the predefined sensor types and tune the conversion parameters. +The plugin can be configured to select one of the predefined sensor types. Various parameters can be tuned to adapt the conversion. Basic algorithm ^^^^^^^^^^^^^^^ @@ -40,6 +42,8 @@ Basic algorithm The MQ-xxx series of sensors contain a resistor that depends on the concentration of certain gases in the environment. This relation is typically provided in the datasheets as a curve on a logarithmic plot. Figure below shows this relation for the MQ-3 sensor. In the indicated range the plot is close to linear. The plugin uses a conversion algoritm based upon a linear relation in the log-log plot. This results in two parameters parA and parB that determine this linear relation. +Example MQ-xxx sensor gas level to resistance graph: + .. image:: P145_SensorPlot.jpg :alt: Relation between gas level and sensor resistance (Rsensor/Rzero) @@ -60,6 +64,8 @@ Temperature and humidity compensation The MQ-xxx series of sensors is depending on the environment temperature and humidity. The datasheets often provide a graph that shows the relation between the Rsensor/Rzero ratio and environment temperature for various relative humidity levels. Figure below shows this relation for the MQ-3 sensor. From the plot it is clear that this relation is not linear. +Example MQ-xxx temperature and humidity influence on sensor resistance + .. image:: P145_TemHumDependency.jpg :alt: Relation between temperature & humidity versus sensor resistance (Rsensor/Rzero) @@ -107,29 +113,35 @@ Hardware Sensors can be bought as a component. The internet is full of development boards that contain the sensor with load resistor connected. These boards also provide a comparator that compares the output value with a preset value for a simple digital output. +Development board with MQ-7 CO sensor: + .. image:: P145_MQ_hardware.jpeg :alt: MQ-7 development board - -Development board with MQ-7 CO sensor +Schematics for development board: + .. image:: P145_MQxxx-sensor-board.jpg :alt: Development board schematics -Schematics for development board - Connections ^^^^^^^^^^^^ The sensor analog output is connected to an analog input on the ESP. The digital output provided on development boards is not used by the plugin. You can use the digital input plugin instead (P001). -See analog input plugin for more information about the available analog inputs for each ESP version. +The plugin uses the standard ESPeasy mechanism to select an analog input pin. Selection options depend on the type of ESP used. +See analog input plugin for more information about the available analog inputs for each of the supported ESP versions. Load resistor remarks ^^^^^^^^^^^^^^^^^^^^^ The manufactors of the MQ-xxx sensors provide the conversion plots given a set of environment conditions. This includes the supply voltage and a prescribed range for the load resistor Rload. Unfortunately most of the cheap development boards put a standard 1kOhm resistor on the board. For most sensors this value is far too low. The plugin can handle such values. -However such a low value for the load resistor decreases the range of the output signal and thus the accuracy of the measurent. It also uses the sensor in a range that is not supported by the manufator. -It is advised to replace this sensor by a value fitting the range advised by the manufactor. You can find these in the datasheets. +However, a too low value for the load resistor decreases the range of the output voltage signal and thus the accuracy of the measurent. It also uses the sensor in a range that is not supported by the manufator. +It is advised to replace this resistor by a value fitting the range advised by the manufactor. You can find the correct range in the datasheet for the sensor. + +Location of Rload on many of the cheap development boards: + +.. image:: P145_loadResistor.png + :alt: Load register location on sensor development boards Many ESP8266 boards use resistors to divide the analog input value so map the 1 Volt input range of the ESP to the 3.3 Volt supply range. These resistors are in parallel with the Rload on the sensor board. This shall be taken into account when determining the Rload value for the plugin. diff --git a/docs/source/Plugin/P145_loadResistor.png b/docs/source/Plugin/P145_loadResistor.png new file mode 100644 index 0000000000000000000000000000000000000000..522e8e64bea381dbd779d93b7b7e04d318566075 GIT binary patch literal 63076 zcmaG{1yfv2v&Mou!QB(wg1apQ3liL&;O>jNli=>~26uOYv%w{}FYdeOUcNtY>(uF~ z>8h!k?$LhwnV4^?04#JebT~LTEJX!b4LCUX!S`Pb74cnDhmhL!ULe^>sYt=WH6&rY zn0JCN$yk*cgdC*}e=$n<2l#ml$QaSH$r3Zm+vebv5*AmXpk!bXHsX;qk(F0b zQjq(uZD4F{s-~jyRZVw#ZVeHGnuK1EmWfYLP)u7>ZFFjmnO&4u0Kg$;Dkm-RGdbGZ z-JXn^LtI>z^I<01h5GJUqOK*MD^M zpV2Y!ox&P?6MIyxb2S`)+lBWz$Bzl|^N|yOe0zlybdFL{kf9KXn)$Z|W=z^x7++uR zW1ykvC<}`4GDHNq%uV;BP-v3#yYq5$((vl;?<}t@O#JC@xH#LozX3zC4@{NxL@>T54;@gd%*;$s~ zNqyYmM8T-9Z6jkISl$Ouh*=vlPijZ-c$^l0!_-OgU#rmdp{_A_L?iW6hrsIBZ)& z$87P+%3dGlpI_HOuP+x5JzKCH@0n9dha=we_`EFO#nkJ=2PA!BuB2S|{G;xf)9$yS zAgJeSNu5zwkP&Rmez_KQMg8Ut!|bc=b9#+3!FwyIdly6huW+*m^?}+R33nu3o(Ok1 z8y@s^_4V`&^xwJyn%*1NEE|(6u^MFO^-$&w)I%ZA$UeH4oZ6lx?BFCto5mFiqA00n z2sHm)OI|G|+kV#QDjUFOz!W#R*R)C@9JK?zyxItogSP46zDB>g3bGLuT<#BBHwbzN z=d?gFU`zjN$cCW=KoK6DNt`)E^T8C)VBHsK$`hjC&$DW=DCt{&@0Ur3Lv@WUpNKA7 zqyo*MPyn1jQCj9Rb35eFYa6yVo-z zi1}1~K9Mli!9I`k&~=;@A;G_^=2SWCMA03l{sGvdSwp2w-Q74;H$nmX$K01DFDUOG zF=?jpEnJ-yG7Y3?kY&L~m*XK#nkf~z)e8_Y;go>Mz=uc;jLIbD`y3I&^nh|uccKFV zi2j=NA)tvsx|?8D`f8s~d>M4l)qmDkHc*Sp^ z6vu|hmcW1pg)xMK7$We*$`SkpFC7mX3kwU|Cw)>6sKQuGSRXX$j&-o$eSidmy>{x) z1f`242akrMeGReWCJ(MjIC?o6Hc|Gp26ieyvJs=Btcxf8$3p^;gVawUSEJkL!>Y+}q1=szke;K0QX$_%<%RLe?d`(-ecLh((qE~5Cz-I# zci)P!Rrmb0RVK>&@EI|IV2B>BgJO)v$00pVN8c|}_{{QSc;7ZuvW$l;U84qb0x2BD z;oTd3fva%h!eOA@n_)xljG5ioex!(a61*_Qk`Dh;MoTM8KnMgABT*IE3yN3CpdF2h zqX&z<3c74`X)ZQ9J5fgp=D_C_lbVnG?vP%^(u>wqabk5Ba9mrqW|J3@PWoRYGo8D zRQmJ#0CC`8g2u;VX4Z}lPSVN=Mu-THWZ%cLj^**tYdboPJvXkb0ORUwsW4i5I!Yz>vh^1Es^Cpr5t zW#zWU)_UufmPNilgtn>Qv;R9jcCSdx?YdKf{e7RCVOAC~&lid5i4Gmfte?k z9`z@@sY${<$}6E;U=T>s!dS9fqvWf2uHT7HILvtR&s^-E{S_ho`F8UdSvpe}MxLx+ zql7YimJQwJFO45FP@<4IkN9jxM*;SYtcFIyjf)?KI$Uc!y(C`Za^>X#rvy#XU%sk% z{M|{`91RQtQ@`qjce$PpzV&p_N zH9n4wdOyW(&jE3(v(;wy{X=*UGi&=4RNd;>y~)X{MOuR<9B?w`nql%(0fUJS8WANX z^6_VYteb>rghr&1!=}@|mPzv$jGA)G#@yEsAP@chYdTL;eJ1mENf7{hU9TJq>`j=q zQuMWm@s}EXqhTaGwFh){;uA=JA1@0TP0AI1cc_WSs;z~u!| zlOSeQ=D<$9uLG0ibSpN|a_#FJtXZPP<#b>s(ar`?g27;(T(Ax3Fz1fLO8mw8v3&8n zC9w>YoQy|{sT;D1GRB2?=EB7mE)C7Wk$6c$J13N1>l5p1ZdKdZxB*-NRiOzUuwTqJ^Cx; zfSkdMdrK;s5+5;+Z-SiWl&RSBt|V%m%Y1mKOev65jV*y2&YB z^Ua#-ZB+JnEYimu;O%BU>7(r0mw9<-Cr|)pyUe$U?d;0SdQhDSu)#(-TbPN#`Y|{$ z@q`74XYG0b_Iat>gSM=Ptm`65(kP>xMlG*90u&y@4fAyw2xErnLSzpQ@PALTp5(!8 ztn#70FlF;%_d;ewP&A!3g=2@s-?qb&B;Jn0aDtxUts?s#Yx@3C2cnSg-K_-ZIM%o_ zann@`y*xC~M+IFUX7zm;?9ry63i}6Y!H4iZw%{8W;}md!E9PzXF_dY>%SFcX9;f6I z2@1M~OQ(f6dGdq;%Ja&mTYC8U`H7a6hy*Uyd+g23%o3=*FZI@&>KoeqA)8`3Jwc2k zJ%!?S+aeJTB4kmZQ7n2q?HUU?Y5vj0e_Il@JtR{}U#YSio8EiA6GbB-0o`7ie%1*J z!>yC1KnkY@!l6nahf_n}W)+RE&t5VcS|7akUV(T!Lh6$^s_PI~l$3%8DV!xnMBy!i zqg%Fzq4lzah1oKr>qqbFJjPU~n6#eie_0l%cUAMiXGWXe%prHLR&NhkFQhdrn)a)! znFMm8r9{Yu-g-;BH}O(Jm%uh`9dVdHXvb@qW7}r5)IFHoX%U^)?nsIVkKiX0;mGix zc0UG7J`*PdpR16LA=AwP$fgXCIuI`ZcG%|QP*R=ozl~5p)~q z@TcPFXw=^RpEwwz3HUO4MBR0NOpQwWf>?cwP?c*l;zZzTE&u2yG+)&Rm=n`vOicH7jLM7T=CJ%w7+}l7P?GF(7C7 zp`@*-XsEa@tr--aC*Wx7i~-Gh^zQagEx)87E_E7Z(DQoD^IPBDPI+GueT!+M4}}3R zs4o{}f84O^ea-%Ft$N>&S>NCvUB&dcKG)va)cKp1bko)rJAsIS9%6#MBzPuIWXbzN z6o_E5A?cJvP2VMwblrEUaRo>1qv_MsYj)k_;96H!l7^Ttbl|2NK+Ax`MiliS{nN+W zaKlJegZ*W$nAxP2&2QYI_~9}tW>tkcT)uFzeUH$wBM3JY5Yr14(<~6R2oHELpQ zoj%hp2WTH9{Hfhaz~SQuj0gY|a6xJ~p)(YRPiy4w(3Zo176-u}ci zYwKMPM>2aHscrAgV1MOP30S!<`zU3Kio3Iu9}zKaTj6X;N;!Tp0O7xSg3QpDh9H#RDEvgu{Z_h<;RdCMsuc`6f@ zQ70iR?H09_+?JHI-Uqt?j9tC{){&a)29O|Z;NWy#@)IjM{;(O9mj~huxCC_5a*8ms z9C^6>IJuVLhoPdf+p-}8`paS%@r5>i$jkp6>jZSk@tSv$c9gVF&n}I5pHa6Q#m726 zZm6Btop*Q<7j5Y2GRXTJ?c9E7mZOO|o!N^J`6%7*8>UZ!Gmx=a!nFn`!zG(zFQH!a z@52Q_sy9;loZaFeI2urQ7*tn2UVt;Hyz7Pkfc1_^XW z9$K!h;IM_EC?GfsEeJ8(zj_sc+lXQ3erjbEGRDB8uU1pyPQKwJFZok3?;zEw>K7~C z%Dko6bC$zl{syF)J!S)5B!Hpx?@NBNnzz^3MwuvhBZ?hDutY>UN&~V;j#yUJvM_Q(eAb#2#uEoKAZ7!v5C7M z-erL<`r5xfYNU=+kN8B-+=byN{0O1d@>c%HeS8Yt9)H4`-i~en!?_{+D4x8poDMc6X>h> z4`(ZXM~Ik`k`iA(vjW!A;2ybm3}WD0IFDEpK@U6(_9u@Tx76Y40)m7`#{hE%;_ut2 zv^quLcko3{;_?VmAmeCybE`3=f%i2ez7>q9WPFC_UA%z7w`}%3!8d#{g;H-#a$z3i zzMMT}ofe4sg?L3{4p;&2E^3}DfHDZX&mx%DYIu?S8uQ58Lti9d&ySrqlPc=dt10l} zRZ(I=V20%M!W3TR&#Vx=|>eI6!fu2#XKga5sEH;I604|mdugla;a$=w-iQKUFcgJD4c(@{ zm5#>U!49?%b9sI{DhLAJ@(%tz16(hs(2i+db&n{rzrZ;&pqF=WdGUFQNzRBkgscCjBESRJqbhWX3b(m@Y#XmoEc{JWd`Bb1k zbEmr|V%#M)Jn?fBWFk>vIZ26+rYJAP=C*^K#z3b4o%a6po8go5i{!608Zq(-+{+^K zEi3r(f;2<`%})i(WUebc3ff9lWL;{Kl2dW#zUrIGNg0{@+89k4gLBt6ls#nb48hm! z*JO9x57Vg!ZG9bX2d@yE-b>hkvqbyT4biukv#I-M&N>ah$l>ANV^?j%_r;~O+R=%G zRM?hDaN@6H%~f@E(7S`l)$41PmNjOE#iI--hS%S?`i*4{-!Naz70q|!bq!hFPl#s( z^^zV?4^n{*=ap0C#ur@k^vVA&H^Y#s*j#pK(LynjKI>xO#Kd=8`=m@9_a#MoU!0AR zO-5Yu%J7OwyAUsWs#I{V27vqHmB-%W2lEgGxR7M{B+T?r+_bF4q)3Mc-(AeKe7qvwiunXVijg;H!H0q94UU$%{E5!1Wu3)cQ;H3s$r>sC#xjp zcY14ZN#Bo{B^5<2+KzB~GOAUp-YVSqgUqhR4!-Bte08+e??tkLg#}KIi?^YR>^|!7 zE{8l_ijMB6(Q`b^slR1dyd@qLSyV!rTtn#rYa7nX^leVbB1w&qvrT)ud!(g3W}Nc^ z37|CQ_2bV`EooPq>!K_|VGVa}n03n5Yv#g_%7wki4-J#{%MWXU!hc=1@+<(v?;(#e zD~fRYOeTq4ar~(Dxx3QXg#9IZFQzya+8`Ml1TNexYKu7^H}w`rJeZk^)_8-vDM{Q9 zHu3zc_HlZ#g!6Aks*l2}Flq*lM5o{G?H&#lg({l3?~TvN_q!r$ndAV-hIieQgG$mA zBu!^ffDQS}f7+~z**gm;QLYku84l{uI6VCo*A9=`+;Q?W94jS&PXWpdN2+iPR0}uQX^a{%dj$C6 zLCIhAx8Q)wYz|oz{83<2ISVwJKwLDi2eKMl%GZH1r3h*D>>xviwJj@Ih4tfu@&T{Q zFoG~<=S>(?27gMtA4_sQxz8_RH*)aT*{7n8*N2iMMagb7Of`x!hbwxvn!o^#Ww%Dg%M_L^%nTv`usqB+DfV`e(dpiyy)UIq4IC0)X~vGgQLY}i6;L5@Ov0Y*{khy zDOfg%{u{}3$YWzUMGCLOk(=U%{KQzY4%~*^&0kPe0O2bVK<60&uUDISQ8>igj!xIy zu4Nz-ymVC8oktluna|%5Ju2x0^f!KvT3`Ex{rYhs`fl}(j1OEqh}h9iS@_>-zM>6} z5F3Bo!7zcF1rm*%uS4V~q6HgcOI0nO1u(CT>LuF*Hj4lJOB}6TpYQF;Xdh#wf;7nk z?*L*N#T#-PEwHI6nHE{LiL#h;gtCGaM7?%ir5OT~-2RK0G)y z5G=zF$|F-vMKB=>9!#1t=3fzZ_Q;`gngRYXrl5 z*-qQi_?{(j%3`NPkK~OzNK9=K2tl%nYTJCxTw!CvyXvb$kO+s|9K>0)T}X5Wy{t5# zpk$*A#PJW1O{oJuwdgwr>mRuLK=b-!!u=n3tVGju2Z*@jcs=y`v}W+`S5D;19-aaI zxnM^(Ax*jlb3GHpz7EvZTTA$av2H4apHZL!2|k0hL5u1^(OiE_#gW}T5h!`ToXhGZz>;w7b*lu5o4S}DN9HUKE@eBJ zA`iD#6BbN6UN(qFl?d{X2-j+9_#N|~p~ZD}=>LLQ=Sb72v8$%jWeEx7w{(`p0FV3Q zD$RcEr3M0Krwu=kTXCd6$%r_EIZWA=Uyv{tW6usZyS>H7JfFK{+EIRC0%#i3CIsEG z-21d>OeY_6)r%5G$zOkMZEOuS<$>RtgRVER>T^5F%5?fKX+s0d52NLyQ?NGs#qoCb zjz9&4jqp8)){v{~AsrBm6Rz#f0lX>z>RpB1>oi`x&QJ*F4cVaKGa_(jV4x1*UF~2X z*X0}?9A+dFSJ}#crmh-GoD%$1*xS7)>n%+i;X-$WIdX+gR24&N?)N6{`#eU06tw*n zZRi=Inbey!ackjGK+E~pAEDP^G-<0Z=;i%PJkr3S#_)CFpb&UP$-&+KE30&%uhN;b z9Dxz_^0tY4vDy>G(MmAc5ei&Y7BHEx9`~0Y@zTJq=<73Cpl{ksoH#HM@9{o=T>q_e zj5M&@f3m$Z{(IRrK#L*3B0ZC3id~G^B=lQ^iLYGNhCu(tX*mZ+ zaI`$#L8tI`P6)g&+j}^lm}4;27hZztZL^b-s9rN!is||^0e^#fG2kw@g6>eSD8+NL z{mx`h8t7?F!g25-S9)zTZ5MpIpvI;DjD+`L-f6_C)FbK(oaKriruc>2J(_bsln1qPPOYH1ob;WIM#IiJ> zq7&oUf^dkvGXghj!79#lI}q*6LovHg<+#ANV|A7#o#Y(=HGyL+4t1a`_se;r%m~Xd zppOw+E4}XzS?IdV_k&lI7~v#bYFJpAbWEouw zANOzR+1$L1^|{(;hfCY3n_Cx8SJ!(NrMQg@m#hhvDLq;|(nycCFERu)NRb60oPk&H z58=kX1z&MyDHJ7#g{Pfi^y7H&pKXbE#gmGGLiZO{8Jw!PuLv)Rc_PTC6cJalCm}wF zYbMSn7R5OV+9q4Nn)4dqdq?f3tu*?Gf?+8Z&)u=IX5i<*NWjl=zxFxxRxb5*=QPy( z7Mn=+3|&KmW)wUg6gMOX^qM67s}I40YnWft1Q4Rolk58ZLoWkjp>W$7CSFY;`C*iK zL%SH}Bp$-#yZK!Ff6^wc8p7>_`@;Vuo*h#f{1tM3Clss2m?lBF)e@!tS2t9hH215TOZT6Aj-^@DGn2CNZ-uqq( z;m}JK3x?km_CkP`Q6bWcVq(JYl_I4-Qbwv>67ehj%j1cA;Ejvo2?y zt^n*$Y+`zD?iE*=MpbmR?H$DH{sWM%?|S52K-Q`_MaW-^-E3|tu1MxW=d>`4lJg=!g14v>m!e=e{=^%eR1`}YUVz6N9_&N%e2POe{9BR}$&gO6({pzP zPeYXcjo^_|?CFNYWpJPN%RMS`KS7)1U?Em9X($?%xYxyc5t7l?K0|hanZ+U>|9|8; z*>_JBcYVC!M;4YE<)&I+sY&WjQ<^Mufidmy`5yUNQ=X}}|8g%jON1`BVD~@;bpY#oWv&DLP+y4+&Nt55w zHJksI?p;8-<0*@Zdr1wa7=}r!gVTZUb|$F1T0=lff+Q8Fu}OdrB}k$YLq}Gke@Ube zigY`CLmNYf-|BET$wdVDvE9e5Kcua$E`q_24d6vz`c_X!4Y>E-{^i5t|8s}O8-IWQ$;ppiK4p)FuKMdYWb}DyLhXsAM zD$;QL!zuafsmkxC6fmLg{L|7Bds1_@Njt{14ek15Mt$boFiC5B!N`RT2FkvMYhUnI zm<_7jhN#VTOGHJXY$w{!*DYKTq)-wxwBaL$oS?>FGhFu=W;Nq5c;MsWvT6GaMR^V7 zd?L0y^Faetn!@970vDY@qmK`_!0Ano6g?UktAH6ay@mwi!_nbP(ls)gT^T$1uc1|i z!*aD_VcJRiK~ z_X%kU33@(T3u>q9p4iSXOxP|eyDm2ml@1sEHe_-*lnO6{<2*xYg(uNR{=$;8WlL;% z9#(}pCnVWEgv&Qgv5gq7u|f7H&K~*$TZAvr=A8z zfbmFCt95utd5Se|0`StpMv}ngOiA$tzio1GP;J^J$QfwbTRc6g`+VPtrgka@dRaEQ zncMe|)DYup=oRTrVPa#qlzsswT`{FmN&}(dw5V6ol0S{hnlbjTqH#o-hK1|<=&NXH zgR$S9k*AVw5@3_?5Hczu5PrforMQRh%`@9fZ0m^w#;b z&IGtx!f<715xQZ=J}h4~s?(^%Zg$5$Yjgu2ce!M{hN5VPDTN5}-H`Zf$39PZmz$eK zmOcc#`2XeF0I`sXzU?l|vMS0%CakU|+$Yp(*AJ$BH?`waU5*9ra10lO{gqaHW=Z{8G9SUywS) z@G+4?$8aMQS%j`bMcTF{)XW|UK2eVD)9#POY3izoTjo;YQol-FLe{te7eRIRjVlx^bXf zj_Zd{ko8a8<50k@hn#r4tcl!?adWUo) zB;zt)7@<%Vx5hV|jcd}PEwM+?ZI>uu9RTv97&F6%AGo^eIP)tnD|5PHco~hu1xd-; z^3-JBG0jHk-aTdTxQ2(mO;YVj%LZl}FTz;UkYOMG-D) zBS|-jfI!N>qHm0XYI3Em$_BW&cv%^(px4wc6ey_JZm7Jsu12X3p$^)B+!5^z0(#*7PKBT;R!A2iU0QxW|=OeKp!eryHJA<{~lU+VO#jqfQY6zV%3kdSjfQ zet1&(Rxs+6C+N99+@M*ZDs`+BVG>%p2jymqi!>Z)elrZ{lFbxf`IQyxc~Lqr4Nkb% z)6HSBtfbDNCa1pqVb7KL_9fOD#BpP4aZO-zvq@EiWx#agKC=CmyN@rTS1dV`a(`QD zh*q${x#1`_|KaUSBpCIwKM6Wlmw&MZ!$QcV&;I4oY$bf@?N_Fp{_K=;F1!H>&w*@cXvq9$ztN`J~xZ z{!fL_${O!u!0(7GU!!6tI8g^Hbvgfp-~O94PXAz%se{=h3cqE;B`=xC=v>Pnczf3< zrkbPNzLJO{Zu^YMGD*JFc)fxM=*SC`u8mC|Y-v{r3FslSM^njWT+G5>?kObIvRAV6 zjZh*Z^)wm1ni9YR87D^uU5Dgnn>TuIuF;T-%?6KVH;NOI<2fjO3|dW}%-e*tXJ$QVcjbY1PJQp#EScZzr~tbAFcw{Rbh5o>g6NCt1iy_nACH>&5GN^<<*BP3MORxR(a zG=q?_rK)`d{24hQ#KBrrQVzaipcD1|$@P+}!8g!$Nlc{{n2g>U!PrdC8AIITiGcs8 z$so|3=7+QrA?o9@JwP0My<)TMOvPOF8ir_+8|Eo^zkmqZU0wAYI{SkjJ)5A{qmEN- zy}7ddcWKEwH=pP=x1?C4BH&@OskK=@;MnKrqK8~t$zv%=XunO~7G6DWa%U3o{J6pM zS&3$ElF=|F9^{yOfgH*!BCjwagQQT68@h97TztT-df{}XF6fw7mj<6@f9y+A|<~0Jq99P5)S1t z#`CQH1VI%nh zrdK$7#~;B%LWK}GOZ4Nv#GKzo!zqT?-bmheO#>R)B*PB3?GRte_8U0VO$jNl&%ybt zZqz=h^h2c_yme8(2KgKjIMFF8D(?R*>g|9S+Ls5{=4NMSZ?1ccys7_%0bLr~++I># zpi8KfQ0^7iF=9yD{p~8It9MfPNLsYjD-T9gYc0?`92bMO?D#Q}Yq;}%Sq&oLZmjQS zJ+H^cG@UrJd%H^Utx#G#E}}=tAyVPwFl29Hp7rBurs%NDMd3Fa1`4FxuKixnzdG*e z8`Ot0`P1~es{;7f<&L9_(etNVgv>42aUfxw*D3M$cS%0eddx` zX?3uJJFsw`p}8Uuntj0+R~l3w%?1VZw~xSo9VckAf?e=-BV*BaR#xs23#;1v+E>tr z$d@DCoz1SLL~ZTFq)X$jXP=buz*z9|E~QcwHTS{$tWmOQl5HgIcn9a^IdNU{{M!u` zaGsxQ*a4$}s!yn@AK#e^z^KHJe0C5WRkZ?PktQK8+?GrVY!f!G&;{DaNrZ62S_KOF zgnJ)mS`L|zLt=_bb=HrhdT5#5&z=5divnKFb&t=TUccI~SGd=dnfBrhMJ*@-e}I&g zJm7~8=iq67DtedClK(j1F$z5Q=^0Kt`*&nCBNQmKmls$|C0DcA$v%`$UIHp4KpZ?> zR>Nlxi=l0y+K})F{x>2bwwlY$o(5BpH$p(W zD~iV8183WySQmS{a8{<=k>c~eeN|zhoUQ4Md-rpBz~x$eVhKUsV`6Ni*x`r6m5qeF zuej1XiihFX+pUP8xP*HUNirwU=LaLpe?p>c;`)S@T1UG}VItc~)zk&fM!(s9 zsCc`M+dEh7a3ROfKdk|!U;*dzT@UzZQ5REQtrgsq)sA`riEj zjl26_-jjbq1*!FC(e2gMf}ql0dkoy+rF8dF3S;Eqqlt_y)pat~?cC;k+57^gc+X*F z%&5<>b$8|TgqE^{Q2O1jF4I03Sd+sB&8o2Hb-kGV9KZ5c?o^K^|>oh%v<_40HeNR&0w>@Im~;c6l2hK_`f7siYiERkr|?&I6_ z$UN-%X(ktqc^Y(my)8}f(9zZ9*N(M7M$296sB7@MO5v_2v+y`CK8Cbr5wtv`aB#b) zcFEy+3+5B?pS1VRYW1fS3P}G_*J{Gz(x(6={Qkh?^P4v9YD=f7mw$DeZiA16tmg?+ zj@wA*$i;?F`>?m0 zn_Fv}zM+TYwDsk-WYdef%5y6!JJ`b@9WK=`W~Hhx|A@iW4gYH2Ey`bPuY}iH;44u? z6M)Hd9=sxGW&^Nsah-~T!%7|@x*wCJ!y_{J8@Rg}rV+7tx-KZ^?&X{9t?##$z1b|R zEwTnm)oxw-$Y|V|4D9fkRQt;{Z(3cGfgztz(5wHnmNjXkzuDB-;_XrzLZ~ksXPbCo z4AdiJKd+w^)u;at5eb(odxGG;^KHfBLf%PijYb}V}`BYY!Q2hRW& zepv!zv8B(1Qkq95Sqt*N+2CHt-6M1i?fEB*uE<<;Z><9H(%JP3dV2E07&psqEXH5| z(Uqe4A&H7dZHWmB51r>{fsxGyQ|BR~WxLznzfeAej%jjiBS;u9g$>v=C@$0F7!uD| zyA9(@%!=c*g?Fb{x+qZnDt)LLQ&9T{QT2D_hE9W5rwQi+a^ffV^mt-v(&}z|7IbsP zJ|}>Q84_n0CKzwBUfs9Owm``;ZY*Z=$6m_(IaZUUy!g+t`pbTVczAdxUIH1h1G`1C z#F0u4r@zJ=f3VK}c16WqB9DwF%oezC2CCu$fu{?fqwP8WM)XShi-vp-Kt04g+NFP) zmtU&5{{H3fyaZPvxq{%nP`u(BJ=B1z$U)_U_w%mYSctWxU{`NPr*J}!ie-p8f@BX6 zxXyRQe1>zSr!U^?zPFhWF=7+!4C8gl?FTJ+VMAB-_10eQnoHZ_BN83*m6x{Y4_&NO zUwOq+IVH}mZ=Of^t0VarxcYIaZA|Y`+bN(k8S7vVC_O@VappVutph(R7<6<~8iO*A ze?!;A4gK7rU#73VnR$Wp--1Ywk2wP0`iW0qMneIp)IGxMrnk5zMqFphL(Vepmk7;% zT$wrd@{H@w{oGrHGDiTb4FG_mM0RX2uAI|QIRhFJ;pCCT`tQ@UnDbR*(TrG)=R`f} zX_3Uhuzh9nMBQXaaxBtvdCC20|^Q=!h6>YP7^quPMOQ5`_g zOGl5jOe)Hxh>w@sEa~0W8{_(zuNdGe5abNXr@pibP-1Ova<|+A*S+OCaVuocQq{|( zEMyBM%8|y>X4?L*t@L-?@^+hYG#=};T2GmqIj&3s$wh&*1`id^8!*_SYA$o+ZCJIe%q z^FsPW9CG$fZN%kthdSY0KJc+lN(2!u8qk%xKF$H*u`|H=;FP%$-j>uXwM)H3uW3`E za#$BB+$TVcnbmuqe}pb1Gs>u|n1tfzR6+_=(Y&YO0Y8fp$ipJ2pjj516d$i7NOHQf zyQ8x#peOX@OT+h$C7mt$3LNu!(wLb{(KpSn~JGQpW=+Q#q3qZ^xzmXV57nAEuEL&#y~F zN54mvPcQN2(b~{m)Iop6EV|N&QQRFNYB@ltD)Z08I%kLY_%^I#Ke$4}^mMPWBj`0? zrA$ zvW~!BaGgm(j*_%jxHkD;<4fUhd+94jJ10BKA+J%ojFfy@e$2Hp+SjBFgOs7e=mR%! zG-R~0az6f$k(j-s898svV~?1aIep1??z!~L6+~%+Z5$^nb5B&iy1rllVkcPjNb&R~>UbF*Zg4Ec>1z!>`+izd)o9cSkV3^NNCMDM) z&!s|{ql}l2d-oZ%&F1bd*%exJ&srS2v0VqaB#h~*Esi8Fe*1;u4d&orgvZ|6(dGZJzKb#*-{WthawTy0NXnC2n0e(MryqRBOYmICBh=_oIK9wQy zVUobJ3e|O>$r1AuhjQl+x!l8p00@Xy$~>xSJAA7L-%*!Zzn~_3#U`5x z$wtxDIy-s}?0Z{FTY9mybT~gDkPq6~39BoZPML;V$2XO}YieD+C3tz04)^ymXtcu5 z58gT-KD|gEJ1{SA?;8zWU4m0%7|a}iGNx`j9vrJ z^VQPj?tE}c+VJz@i9(RhWysPZ*e+MzxbCNtMFb|N*_!0}%9ui!Du;9B@;$19cTkS* z!WxOYoeAJlpU#LOv+Ddm%4GDB)Qa6<;Q>abjhUIHfhElj@RUYT{e)ZG4hy?SCxF#>TZQ z?4Q{_qmGSL+Ow{$XQoUiwP4*z&QTN4Cog*^NK#qxd>QkZt5xq zYc{f40aGAx#**EbA&1U88g|y#h;#q>ksTbRMqmjMj;~h@8`;=i<#7wbM;Q{vK0ke(o?5GLf~Uqk)8-aUnUSr^#MIQ*!lME)i0XBks1&oRz{~y0DNP*OD3NgmC@!F?p?cg4Rq+j(l=jy`E;2EH zY(cmHKs%Zhc+bDIY5%R{jDuK?qp@T?@*XKqEanN>5Q41mx+A_o#N!Gi0y3~%EC3so z#CRV(6o+lQ&0#^&fy;%NCCST$zz}Q@-XRof+S3KHo~{`uKF89rUoT=Zbki#k7F+Av zjN_xm*;*%#u)bd=qSI`6>nm%GB478o$d1Xz^wzbt$<{P?Uw4+fpjK#C*Wm62YRP3l zpXQrZ=jT`N;hhl?*`DR$rfaO6h|Gv+ZXy6L@0|5LJvfxGufx!k^8-IhIa0Jjvm*sh z8WM68&sP-Y>EsfzSklul4Mqq6S3y{U^6KmBs>#cRSa_2J)5Ex_nEDdd)dK|K1|nQt z1!sz>#fqs*z~<1MotNwv79QF=fBn^0Uw`xZ`NPGB&ifZ>OeUJ2%}&Vr#Sreb6FKpD zPE3)UE077;Fg7~B+BUy2&ZV*Xdn6*BEOE3h&BNu=rG0sk z<*hY!=>vU5v6s9O>*`&78+4bXZZ36+E-o$&lWD&0?!F#*c^TTIYISH_L}YQ3qD-5i zfCzXx>dfgkXMG2U()ZOE2BY36($CF;6cs6z+M^sj74iai2~)BpQu$1+ae5sC;R<$r z7{_ZH+VINW^h4(!eFm95wkm=Zg6U%S{(~lvFow-}&}6G76F`Ive|lv@>cDi~|Mk~T zzxs;c!$z>VxmSy9Cz_qDrNvI^>@Pk>`Zfq1nM{^gE@w+b9J-x@m8~u47d8Vmh**e& z24i?)X^b$&JJv5DD>V9KRCri$aPaNI<=eM!gV8Mq29hWU9<>x*X>wV6;zg&P`Ds`q zrs)PQoi5*)tUx`PPX)cfq~K5wnX8@^Osz3Ke40H!yVEDU8ApiV@rE$ z>;+w;y9>*;wZX;RrEx9M%iFK9BT}U*sIIOqC<{=Y2`|%X$|9R_`i1$-ebi}mq>Ubp zhM}mPZfgtOSMdlAP&oRa*o+V*DR^CYSXr4K;afZ>lOM1n6WcLgJ)c{eTcUGp@rsqVjekGQ z_iYebF&Kg#iP(v3+>(LGEIywr#T(w)EUy@8T3VW$TN=2}$ndBru)pNw=xD%~3=9jG zG5nbkE+fL^5^c+XyI{0yd>+eAZS@k4t!#RuYqYCv)7a2IzG5;8Xsr5rxs+>n!FS&~ z>3I>^iU>u5uX~J#i-((gTDvx*CGmpanzy@4OnHa*MemA^yu6O`mdLWuGDs)Nl03Ch zIodL{Hb9-7(;RhXXY2(!)1exVEHW_m%{~RS9^F5I*7p*#!c(V?o_KWs*0BdZ#k08U zpeOzi5Sr#|A&W{(OiWAjPsqLf*-hNIPoHh2kodIm<@YK`MFatX&# zFg>epsBHr=)8DnaGWMl2BgWPDlDjvgB$2omrBx{sE{Tc;TwJ`|buAqoEoq=%1}6*HF#AbU^sMBmMjl^-d6C zWsQ6~hD{YADNP&GSlu+vgSdng9T2t+BqqwFiRu0awjbSmbPMx(syc(~<tLiONCpMHr)g+Ro7E2W_gCIf>j|ymgHoig=|;TadKfSr(b@>sFL@ z$t}&-t+J)P&IR0QqwA&gVr`jHsjc2l$`3mk7G0tV03!@lT#hdb&;*2L07|Vgm;}Q! zr%7M%P{+OmgW(6UkeDET5Gy?OF2#^I)R4jn(<%TQudVGep)Z}DuLUENN$R(XJ-;}7 z`{pC!L{rV_Bth7Wofoqsgdo*8gQaLgJ*8(YFK9 zi{1ti6Br0~Sdx4j1Zg0cVO1cg89=D*t#RjdGc6&+Vh^Yj-$86z8LKspjjc|vY)+4i z=_K{(dF|PeT3l5HonTvvEEiW-U$3>gORfVo39c92A|o=g4h5(RsyaJ?aY1x&bb$u! zP+JCWG`tMH&WLEqQI@Gx$-!q%ziA2{TJzAY8_bRrgW=~p(eOm-5egxRhDT0?9DR^k z3Hqh0tD$a2*M>=+X{>7?Q7&yT425l+5*x zcLRjmXup-U&5rfGJ;YsD3@2@*d#)`w+Wtsu|DSZEd#x=UA$O z2=L5^Y=*o-6`%qB=u4@CYC~JGiGc9>_f}|jr5M-H9hwErkyBTWrVi&d)D86GPDP?X z2g-6|6%fk$hX$j4Qt;e82pT+I@e*thH>n`2xDt*PxY@DQjS-Up>5+0ADk1FbHuV3j zhVDINFUtA`mcws6TzcB=5p3>Wqvqmkc++(KAgBhY#$W!cwYNF()|3h zGSuNwC|{Jy9fCx}5dUfRqs!nvt4fe*X+D8jg0Zl)KvBcu_t4?TgJrYVPDZDX&#tak zPPQOGY@?4-2B_2;RdRJ1Py|m|pjA}3xKs`nH#ZmemV-hKD1-l9rAiJA4u%&_bTar* zWwfS1ljNy5tqj#_tK%Yiqtx)HOSPq?)ty1t&EvcVC%n_92*R5`ERh1lTiC5eHYzY4 zhFrZGl6u&)J`r~Z<$iurIY`TmX=A-SQCA+7Qiy%TCqFxL{ZT4WGQ_l8I-aV?b^tx;>#Dzw5N%12PpjI|{u`uY3Z z{_Hv!;qgbG-MkNGNbq554}VTc3gKi?dxdC$nB?mb;pp4ILj$t0Mt*ni-Me<};ga*y zulJJyFmtwxi&oZuoJal$!d+Gv{6KzkxqP-WA6zFnxEX_eXR!wll?9{uf&C#jaA5KA z!NKu}5P~3DTnUA6nR27cw=;2zDJ4ID89W|@walslb$cC`?jYzI?`j*6%VYwEUqyL@ zGCb$>nd^Y?Bs`os84YeyrA1|#4~|k35pmEz2b*3_o;(?K=44n^XK+wp^cx2bs~}XX zE>K5B1yqBi360MIO;b>&D$NH+s!~3~+W6`C%@C zr_^wAzJ7kX;cZe0bbvQ3Ep2w~xpsH%o3EcfC2hd=_5je<-u5kz#n{m3EH+-0!{GDT zY$vf;h$oL?)4+Wu#6kEA3l57{f%n2E4hhBwA;CaYGj9+^-`+u3m zR1bcJU<%$Fh$@v@r3ya-B2???sf<#g`Drz!o$v|23?q)TX~@re%g}Uk#|H1;$2e%t z?SbICgy7NppM4Iwed@8!xP$eOr`9J*V^D5_M)7eat>5-=ngx@^#uh_1WbQ(-Kq~NZb@ld7$ZEuiA-MGp{t-}gZdaA4g2SQ-!C*v) zR!HPbGRZ0+nE+*)S%O=Ig;*Xf)g+f{sxmXR>he~7U(ChxzOnT+t*zyeApMhX2c1NI z_(T(iIbqrYr3!4QG(Z!f)&ztDLW*H<7#L$1LPU;445J;Y0s_KvAP}lTJylWRp`rM4 zfk;}4ibz|a2|Gg&>OAy@rl{-RBP0aPx&6Cnguw9x7}*QlaPleZoto^cOO$%I> zfa%)9XJCF#OLNa(VGk7UBsyCEWE6auhR$MgobenI1H)gehqs%5Tts9utgx`4 z!2Gjkhm+1Goy|YH-B}tPlpIg&0gMt&5#=bQNWp=E8Q#u>R08b~D>Ud4ORF+dN|cJ0 z;+FKZgIVQ@$o5EegjNNaM=}UU3L(Tp{4%&&gTs-@kZZLnDEQR5JF5W2*bo;DBWuw&o=GsG(Gy#H$r(b>bbm`S=d%C?nlTNp@C0kKH zsf2z6;a)o5&Ypu8Zt@`eBm5LNu?M1GV4x|FPH`g;RE;JNNl7a9)$#aNin4FwU z@Znn(>9U|&EeOKQD%3N8upszkRCA;PYiDI;5UIcjHOa}EXn;h`5Iu7}9B@Ucsx_dN z;uY`)h7Jso-x)MPh=>%zV6v3a%0S2;qRwc_0<@u?>Zq{J;grmj&g#y53L)BKDca#s zmTRkFh#JB6X0M5=u!WqW94VS2BnY_Ul!_+@wRs7CY47BoEIfQJ^*B;Ld>s3p0CVae zAbf!c2iI|L0-$ZJPy~hqgag36o+Jn%BaDt$1_XqkRwk(eJag4i;ibdd+ns2H1=JgfhoxaT zmxt;+YG$Y27~va5dY`Iuzf0zgQstSDD<_WQvBPsdUmQAwC)3X19xu+iIR4oqVuMuc zDN!@9!1X@xnIa=E^m=Nq5D)wsW=+N}ypGE_W}^L=|Fj^T+}79j+1u z?MWZhTQp+)SW;mp1TQKSxFy7usp6v`{K3mT9w>DtB_(-gC8W1C$R%>za;d4Ph^UAF zD~u*S6pfI|3CYT&s@!h~5>u?I>ckHsF$$<~rAo%^O{3D3P&b z;X@dShQy7AAxHeb;K`No>N3UYaL;OGS#ChoY4vu>_BQdO)tyyng~SXCN|iZ7jc%>8 zgKzeGchW*+c+6~tr%1i~RLId=xFJZ6Zf|c71Hi-NWd8AEhaX-4>@Y!?O3^z)I)UMH zNbZzj7DOl@)PtUxC8@>i^jNDAk2a01F#o{Ykwe&Me|xX(*>i6J&F>kS-<&-Sck^v+ z9pA1P{$mJfF_1{`baAEB)@?lE3ra5SOakwjo>)I`8g=UKkxPUuzplQ%jt)&A*0lo* zNq0pu#g3|P-@g6E3^Ox3Gl3mGuUIIBoF6wZP_2L?CBh%QX>b^|Lkr;$t72zx<0FcZeS}0M8iKoh=;K6-mtify)+AR&QGxs7~2r-v5(Y_ z=4koWliPj_p)Hpyekw>Py&V=5O_Bys?9tIlo}qE|I*DY=u*#!LWD=>99dEp^p{7Eu z4#EwJ0$vvSP~Q#cAYXq zjEW#jVKq0mmv=;{;?1Ur1@+)Ciseb-N#o;{1)&j9&8pBcZEkLSRD5;kS&&?3hle|{ z76dPvYG9ZTAF6=n8rQa=lQ;jc>wgDZ=zhmLosBt7=5d8e9Ryv9(1pT z4OXu)OW(Wj46?tkopC>S2}eILX@Bw%(_167;yO9;ME++3%?Lrq6qLo~)#$i%C+Ylb z7n?1Sj~ex+)%u3{+P0da_DCg>Go(v~RJeo8rng*}lDT7rDJjH}mH@{5ValbF>KE7` z$QdofLX`$HldzpzUWzX_VVX5NJGD76*%6`DYLYc-jWR3>GQ_C(FbI@HXk}-sGw=rT z08mHOkWU1q40lol0p#!(NyEVKY;}IYHW*_-M4oHfMEK4D?azM@3r}Fz+RIbsz591@ z&c%rrr;epwIeZ=bXX>%kki$1`-lC3B5L+Zoi#uMFQZ}i%t;BbdR8VhPH=h$F2k!O8 zF1ghn8$!<-ckHiO+JgK1`q^v3?-}y5`xDvU&qHX<$EtQ((sFPx?f^jYTv`wc1Q|4r zlgzZCvviaj@sPlZzHh7uTxm;td{9YpAhju9LfmI2vAxVUawZd3RSA+qkY`hXV0C_S zDL7w{H2BAe6(%Q_M#l%AH1Dzx88%x723qy2o9nZc?Z{Bs+W$|Z{eNq74aA#o^QtX7F2x26u6ZB~{)>YLVa^3e}%kjf1aA+f?8j)?Nek&xq`-TWNVe)tLyo*+|!i52b~Cp8Ddmv}0FIim*h z!1eW&`FS+M>1nd@JB_uPm66r?Hi6~tYu6z8d;aX{mruW0T3m8|HHZFlY0k>h;;q8p zTc0nq74QI|XEa)2P*`vQ-Y(q|V6P|LpTy*o^TYU>ROM|O5RZZd%+{T>=txC?g_DSFpT+hD1fc=8 z{89~8-@qbEAUZ||gS`#SHVB1sxval_Akj}(S5sad5g&wgf!op1q}F!&bWYRM*4D&i zQEOIKNAJYtj9gWCxOO{}QZmEa!^72RkGPVyx6i^u=eD-P^@6Ya0n)=w+DISmP$URn zQhOD|2+<(n0S5<>9vOo0*bX>s{6@xPvlsKpkOyDn){NmE{kmawp0wnTkWSJS)AYQP zEsxA;#R-F7?O($1H@7%v@65GxIR6%{P`hj_v2VuG^6dwBS@Xr+BJV>b(U??32L*(N z*7P_*y6MaxUzwrNMEX^k9hWO?m|WAZu8y?Ul`9lsx4%b-TN9*v4eK=D6TN*K!zC3k z!BF$7s|%8oDdQt4rG|XgsFcdElR1M^eXC43vy{$z>HI3Y@1(-Zi zR(SJKD%touMc|ot?{S(QKo-&?tEpb(CL9|eRs zl5}-tdUa)teeLe!hp%3fJE(9v>#I3?CPY75K=NlhfT`XmaI_XT9xu?|ws*#YEs%=5 z6RMZPf|T*mnzGQmx*lg7qSifPYM@*8Y&6j6PGVM~ezJ0P#57;mo}C?rc?IIh{63op z%cJy6=JM?zQqjz>3Z%r#a!DZA8`xecair)#i5VsUDm8Zn1v#t?e!C8Ikd-g3QceLJ$^UJDWuDOCq)i ztE|04ttuT(0RcmyySWn#Q^`@?ci%Ou(wF3sGRPMY6+^B(x(+Ut`~n&t)=}~D$)i_8 zQqQGC6;JH!6rvT5Q3P?fch$5yt*76$e+>kws~_+>F?-y5c&qJ0C`7`iVExV<=dLlM+^T*>V(;uMX6q`quvK!tuDrQ9 z9NP{FLZV*qEt7JhnGhADadQFQmy?#0tIP@87z0$~^b^ z<$%4?<{$sAA8miKVF|f0vHqRW;g~psA8qUg^Ivr4(4^y# z-gFr`OW!zigsl*Ywh&=Qb53}4N#Qc(Av04lmx<#nTsF(n+qlDb61QuyA%7W*;Z=cP zcgdXv8a(m@>`Ic!0#zCjpw4dYE$?cm9~kKGAIFAh)7IqVR(Y=H*?g5UGG49HR9Bxp z*)-TvGa!;m1R{adZ=i3oqNZH|sUb;UhKDn^3B_&7sZv%5*?nh0Zf-uv)#~lSN1xw+ z<4qCa@dp5m*caYS@e;QyFhwL@6MZZw(G$mzF&UnJ^ys^%P8Lb7Z|8 zLa<(rm@D)?m=t|7JU(6testg~tlup?W71~Ex@zZZot^hP+a^wJZf(J9Y^H*)XV+)=jP@>Sov9bj{4-PW|f2&XGj&3)9Bh(H_3d-n~0!@@E~Wg~c7q zy}LokfX9RU|KY>AxkWpg&F;56sLd2`d0uWw!SIwvCj&yc^Ag@B`HatGH5hB>XO^7V zwtW4jX={3GWo5pmxA<~+$#P+``2-;$S4afSZBi;F2m#>r>u16ad;tjYw`mHh$VLT< z7}POZXssB}=Fg_o5^6Lq-t_kVy8X(7Rv z6hUHz=CDXn#EVB>5(_+f^vHuRs?Ok`+Jsm=5Nb_aS^pj)s2Ke!ng3+AOMKj%UTJ&F zw4ItHboU;FGzS*n*?#f)qCF^BTRVpzJB9e;2<@ai9%Eni^^;-oAW||K1@?2VUOjWh z!Jkg!UB;d{4vp4e*aC0AwX(TZ(R;Zmyb4deU{;T1HNudj^CX?Pef^BNX(B4DstQ~6 zAq7cRMJHn}Q9@Eekfa4=1S2sG4C>2O#eu=ui$*I}iW>s}(CIr2b!c5{u5#iZkVujnp4l|RI&Q=#x zpG|^?>a!_$S;3Aly^rVS&8ByXq=n?NJ2T3cRJuX%9SI5f;tQX%(ZM;zmxo%sT0y}W z>ZBX%XmSSPOs8?6GtLJ#7^vYhD|j|>Y-QxFZmh7eu?7Kp4IHQ=7@+;)!$q88VrxsY zwfs>J{No5|ICR7{DGGc1mJ9OgMb3C22k+9gx9T4=%53fI24-icH&?by8!MA*AT3Vf z0YW^u1ZJ?DxgC8Q{Tc2@;O8KWgJ*EZ{p86r*CGD^BP6{xC}1$bPlmj|N}~u14+{@h zmR475)OmFS12gsGrdeuSd1WO+oahZWbf`cXP@qv~Uv8Rgtgj!C%M%lUV0vHC=IlhT zwz{e_B@-0Y?Gzu%jc%V!p%88pSBiQT9;&fA3q)@}dSi!=et?i-_bwrcU%e#Z5%Ik| zdgZ}kpHMYO1Z7yfRxwoLx(XInDQX~R@MkGITwj?US)C>Qi0f1v8@kr9)m5vX21n%< zI7QtWXDRHyx3J{wyfnA?YLP|&QZv}ze)^NGs9PZPiVI5yk)K?eG4Pa(V*oA1r_;Fe zV+>3Bz~<~09-f=tFtxXUdkZePO||+$Aj<44h0LA6BPE(;kTcj{h|Pt#fFWcckWXML zQ5qNo`FdeyRYCmes9+U1)6Rl|s)9ycqP%CIVQiDk#6pIXYn4;QasFQv6qIQ-5HEXM z>j(N1<$%!-)J$KEX?AKV+cT*Ow?~!>Q-*)ANTz5`4Z)w{Aw*3ru&$m;O+EL;7bO~XWQ1CwjEIj6$SBTp?OUI171UF^yE_aGW@UrD zGayJ;$wbR}{j}YmAh?J0-&OG!PZ6iYJs`PBvSQQ_G8TM8CZx}9{$O(d1c2O9LVI23CN z7*4LORc`f0R3{y(R)c75si>FBWQn@EHeI5wv8b=E4?u4zLUF5iI1@ZMSm5>!!=!B@ zOR1o^T}?I+3(CsMItw4|#KT9&&k-wpmoh`rVQ;>866Ghnha4{q%r8(X)Dg;PwK`sb zU0D;wZo)*FaKP{e;SNJ=yC6mG6#@|3xySzGsft}T*nfc;#N$P#vom(D%~69aZU6N4 z?@z?S7@ky?mZemc1jR?II_l{QbBjwTL!EehTk8w#hK(tcesXgI5SrFn1_v*PM+X(A zQPMK59jA= zG-{G4or5vk;RK4v>+3_{BsVM9iu#HwixmaQnzNel z$i{jxmxq)SL5_krt=Za~nw@G=Bw_GN0X1b#D$E4WVupYA4MaRv0}RWmmyc5nA3YjA zcZ71DgddTfX89TN;L4SAnN{$D)2dWjt+_8!tq#W>O@m>wEzz%QeSL!(_(be*gR~*y zkP~XGEcUR?8>d-64uPDYu()TlXV0CvXU^b1A3nrUq#!}x<}m4xBXr<7@kF8orK%vw zGhfqQ!@qIE(bCeMOJ}nAf;Q8}s@}BPP=p98CwrR)FGnfC_A)_|Rz;U|mf*fF7+Gol z*({AhND{;_DwQuO1W&3e4b?X1#CJjrEx==C>WF}hfQmXPgDZ-Sb<_31 zYkYPJ$Fz0T0mB@nwjilm5m{3w;)+EQNm^ok&E#5ZW5d?$)WpQpL?o!sVV}bghkw9u z_-snj_g2^mR;Vr27Ic$d>e|CBV`!0;eY5tEq*L!V93+dk7 z*KRD@Lk75r{74U!gX3FW_ViP7h8H7_IjF_pq)|t73^>_aS#f6?dSo+QtK_Iv<)l#$ z&nl?>;=#ew@yQSXORIf~E{lY?Nt%N8tbcf8R$td~`e{ zRtGu#B(787h0VWjTtBj=nlCIzuQFxyc%f^plgVeUsqVx26nDYR~P?VV}$rP&7W@%hK)b zs;Z>wYH+62on_!kHQKTOEw&1%0&gS3o5zoU6~6nDIeY}3!?#mP!?V?jUPWAJ zMr3&h&Ko8Rj90DJ0>Z(ebT1R$WS?k6gk~dLADP#ai6x|ybYpgP9Ghvtk@EfxKpSi8 z8y0tOT)SpT<2cVfe2(Uavw&$h+GJKKMv9~>}W5~s3-?XJlS3jA_lO7HLBGCO6)A~PQ&eq22r13!+fe2 z5sr}}=`0D2@PN-9B9#8n{vd;}xN+~=p1limOOOFBJjMWMPX@95tZ52AaZsBs;E8$O zamwUqr7~KjQdZQ=ueJ8Uk1?j7gtvM9WKGe;+FDC-)8JrEd^Fj6D4}+9OG(2ob{lq9 zW#%UbMF#=fz}sZQ>H3+|lquq&iKwuk_^{@j_V(gpg(kl+x*#+MqH1_)HK^3;g0T4b z?CkJn@T+)pc1!UTWEP+dY8x7A`_?KW4n_2~*VHuDC;Iu-uWfA=wXUtz)J+ae0K?6p z;*4A$fVf?l;gQphc_pFAQX0~};=aoGJ^=5}thzpD?H zqZG}(8T zGxIa^@el=Q)KcnybYizQY4P1L#hlZ{6BA(1EgcaWkon;tZKJ}MtMWSwlJW3cJhrKY z;ZXoZWc$|C6rOpWuWf6qt(`B*i)`*Kp6u&t9n-HEruuX>AXjVF3{zWRD_cWT5xKdL zT4bgSr`)dUJiD`VSe4{Sb>~-?Y1P^Qu)l~%SS>?CP1hgYKl~u%%GE0m9-J$Q0tX3F zb82d6sIt7gsB+U}>XP!IiWk_NHFTVNK`PqK6|Fp6K0g8J_3rqW*Ujx18iw_|P(rn*Oz`PYgTT!=IB!I*a z@JYA+97K7A(qtY>wBCNO%rBse^twB5%m;+5)* zinXoH+1V}ASi>kl9Gh(KDDRzYU8~$M8QXLo9*yOFtu;j;u+~~zLH70n-JT8;}mYj zY#0n}90tc~4{M?_qFMt=2>)_JcvAju z8*3Dxj+T%>++BbS0s!K@oWRhY_O`oFZ->y5C*esYS(@tT_~_`M;2@9C{(C@x2ro*h2Bj5b+{nS6NENy-Ru z*P*x<^7Ynwzr^&s_Q;IL(@lUdIX5?{v@|&=urxYe86Osm2b+{yMY?zWWaZ}UrfJ03 zHagl>+t$}wQPEM}0j|`|%ge34qoxAf1b9(Xk+F3Rd}%}|wgiJ0O{vO1OKtpa`*?zj zt}YAEXd}=F)sfA`IG7DBZpcua5f=eGn~GaHDmrQ!E7zxRQpHwlQRT>3t#P_dNVD86 zG!#b`l%fX)jTewJ*i<|*L=N`C-!Z#M4%ZtfD_lcYie=IbGP`7DWp;K&KWe$#kp(&Y zy*<~iE!aPEezrsa;$<*@$vB}ugHR~oi6mL7Y9%?!i%stk8#>C1TFZ;tTUuH=I(jGY zlH)UBc(f4mJJOP-N!H*{i?f-TDZ~m>sHRaLpUlqALaf7-76hM+k0PgePs2;Ny|ui& zwPqkOF)_WSqarfra#K_I*`!>b>dw+=JSGLMR2deP9k0}Oc%AnvTC3dJSTX6x+iFLh zY}pNKHI0q_Zfv(fTat+s(**n9bI7R>4aE z3^+qESlpb045>A>wrSqFUpK52t&uK72#0uY+6u75pL}G-ards>c!YQE+5T@{zk2xm z^&E~<2M79dI`H2Pp@Trm6+&)L^&v(FhlQ!)b8=e9O)Tv#y}iZ7IBxfHRB-g|+sOr( z)0a{;Pi#`7dV#B|zyMH`R(1Le8ok1tM`-mCF<%ME84*X zF2^T%9?HeKbhRcd45U=NHsPIIrMklP+r+hs_DN(o@=2T1!aYmD*jPhjIv$j(YfNv< z%PU{&YcN8-V*-X@{^c?h;<3>G<|7+&|-<3M-Msi5GKF zjgt_|lQn^7l+)ptX6d4?pyiAULl~4sW$O|DJf>lPBbmmtLSC<09 zl#~?G%1z0elI0+B@&#0jFFtE5m)QIT!Kv^l%7J}chC zU}q_orWWFlDARht`wsoiA+V0FJ=bB2YN}^AadCS;-1}Q;WY^<9k4a~50 zb1Fxv^~^nVz!R)^dpNNA3!fxKmhYttZq4B>9{=RF1=;)9B)qDP{a-!X|8)OXZLJk~ zjag(R9MWoo6?u8Bs02-VV^`Pw*ycopC$-fyY~Hm;f@Rqd!^u_YW`N)VA*HOTX$N;Y zRjHq)_KJpP4b%}`Jlrx*v#qb3+Nx~N$OzB`;MwNT(8$Pa@S{!CYXO^*N$6asx)4`T zwaB!~K{ORJMQaTgy6V%<3f z3=yMabQI*o6Kkz?I`E-su~;O7aMoAZ8(9_#-|kR#SV;+(vFC89vN!R9`=xi9tX))cK36-`c6wro)w4eL`|t5m54H{wUy8pgJYdwb#M z3&6XfLqh}9ik#l&Yy}$O6q?}B)aLq5=L}jQ62xuZ5mL*VHqq}{-M#VT&W#(-=Uy*8 zTbi?9TAF)E9YNdm=WTE=IR|Wg=Z>YrkL>&Z1VWn_sQ|1nBfKOx_lqw)aYj#2JS1tj z%RtSWfOHWME-x=9qi->vrRc;15`+xeLBgU|^EBb=BlY8a49 z!=(u%vR!d>${|GPnH$&Wa{jzaL2zcFsyWNf&gIg3+2OruR+oG)#n$!pwT_IBw>^9K zYU$OJCFww89{zz)ZMCN+UZqi~GV)sS9&6KRH_OqHXIv@D*xn(ChtsMHavEK|JPw-q zA;PW3wRLk3ui?$cEofBp5Ilo^kCmNhvZW(0FRuf1czH*5GXRXt$Oz5oCkO0P#L;OG}Hrd+yzt zTXJ@Gu(Eoq=})+= zkT5YAQ5{-c?HQVI!NL6^c+VUOC~&C02_4PNiuQ)luC7m?zrq#*r2|+iL-BJ zcNq-RW7Ksc)K$K?UC}iic*O3FnQdl1m{Ugm73|ijK5I6%nCOMC7HrdAayr zyqFM{lG2&E{Kb_A!kil#aa{qv+J$0)i~VCwW#UM=uvv2Sir1n)F@c zpZsqB+`?UceZA+|Z6BY`Z683W(T1w0YGMbB>p*XPbJkoG1KqL-@yfhYWS(GXZmypm znQmj$;f(YF2AxH>a!4!hh|pGtR#aqUfKzDB865Ispc$J)^LQPJ8RGOjri8O(?hGlq z;Y`bo6~nZ{pGQa8AE|>|-@A9mYL4mrZ0`9(+=H^SU)c55igY(!0C}Oee*wI-u}+e_ zgD|<2SROv?bkHZOlp5R&)#5ZDMMRvxhs&jlb_}=4rckA9 z$r~uDsjD>_jjK3bU}Xi5xJ{fcs7@*?-PY#0Uj&2~(~FA}zjfK_yL2%xDm(Ae#l|Sr z?b}fu?ic;qzWn;@uRoR5SA=d8E5zBBV1}8)+uF#A`m}+0NWh+2J2=dZPB)Uh!_Muh zFAixns`#A2sjYP??b|TNE;6ogWy9RFyJLG;vfeaR8oP}1)97GLQjUmaWwYC>7hE@9 zhk;wu3U%|~gs2u$5JR14#elcNP=D!$acos@T7T0C49P5LEC`Qwe-<7wAh191p!crb zU0gEr1Aue3_EtY5FWhY<;qhWT`~$Gx6VE`DP$xhEA>)RyMb`Dz_kiE~;s7 zF5NB&?A%sYxL#nSxu17moACP9Z=%NiVqUYN!u>+lndsmkWk6P3xv`=98Cy2cm=TKj zJj)`q+HI9WsZeMY9Uhl1c-0s`>0hw0weQ&&%K|IJKK%S@&w%Lg(}U(x%#L~h#y~m0 zoZ8%^qSgBM2+gAmH%*gkWP@~LdVai3Kf<+gwAgJ?-<}bmZs`Sn*?7H|vbdc!3ctNi z&}SfX0nGP0O@o%%Fn1&3BpQ@8BV!}eKiR_e{jF%^TD*HU)_eCZU?=dy1>DE5U$Vz- zs9n2%#?5J#B0Su5FaQrgXviUKYPK3Vn4}?1*eGwJaeTc}6|ZP-ugFV3xX;C%&4?Z7 z0~tLzxmMAUcHT=3*%%ZJ{Muhu9O*{gzRY*ZRrRg~i4FpR5iXN`lND`<>$BRoR!RO(ft$xy-3))AZ&B=^XrF_=9Ji zj1XPbk74^KJj^)oY8`j)-R;;_*-;Mevo~9X`MowGqoanwZfi*NswYPasq1^c*ENW5 z0~>)!qCcjeX8$RK#DU(!QF=CeK*2DbIdcyetgIZZXwG8#Pj5s0IKn-3j8{xd+Cc66*!1*RS1lyV9p!H4UCNR> zJGV0nhleSEm|;|vMYc5R24uR`jV&BW(t@qpQ&TM!84y{AeU$AU-+FH~x?gnNcfqBj zx0Us6LbjsZ%OxVaBsw^`0Gzp}x}!0pLtCxIt3}F^ay>)KJJP`Qy8HEZxSt>B4XtRE z**ZJPMs@z7m<(DFL;wJCNJ&INR8O4U?$l~SLwkovCEHNhYT6)Mu@t@^#6Dtw)2m~B zMtIKa6UT6x@7TO)-Dqn8IkgSTxY^#4tx(_?cMwMz0T~?~lcq#>m$dnf2BU#$SX-eC z(XcU1O(flzUR|Z;S%o9t*;lu*S)65_hMgU zQgufIkK5hdotCA=UW?)3PHkvj`2?!Nq1m;%NjyPjHkkD{z1IdxzZA8$*22GJY=prE zI|M6Son9Zc*=@&@*H%vSDk38?LVc2|Lqqd2G9t<+u_`b>V%SKG0YwUN9UL?DT9{oO zANEV-@f_50SNy|>l%qPuTa zlrkgMJ0rMCmEEk+lrG;6O4bBm?+T>pJ`e;WIvTU$I?8)vzxD1j)i5sjt+~6jYm>G^ z^RjgPJ@t7Rp@483bZUF=1RCDP*4EZq5%F+4?$aC^vDWJiskyKh`Pb;On`lxE`D zF)(FSb8ky)QD03_QA=-e@x)eTZ~IzhWqV#+nKH8^NB6BqOJsQZ#eZ^D#A{U=r4kgB zrl7i@6zc-X01*O_O6wV#UE$_(@xsNlmKsPra@r^57u?od-7{24+n%`@5g8dE9?3po zS;t!6n5lBIwV|eHWQ!z!vn$lmKVmW{`ZqRABWryPH8r(;#-cU-B%ZLw5H>cpvC^RH zfw8?-Kt{cn^P$Ogvn;D`Wdk{f?C;sS@ zz3U!!a^JnS`<|oy(h}ikWrg-<^){2(e)66QJ0XK1O3RI=M#SRDYD8F7SXE8riz1>i zJ+RG#2^5As= z2-S+_sGMenIuyKlKtOhdhbvc(8&p7WifSBPU(xR%B(D-IdxI6W>TBQF)Ei}qt!$Qe z?%dmb4;(1R{`taVE40L z@6E~11}g+R+^TGCOixdbQ!2BwzI6xlQ-DrVhiX-L$;E9PZ;H*|xNjWRoE_(XFukHk zcfq@Is;FjdQhH&aIHIF6_S^I+uWt`22|DciCFiua%i7oGYx{LNR*X#AHs58OHW>7y zT`RNZsjqnU2wQc@)r74@MR>$!60fdE|DZk$I?I`RhLo14+G24lT<&y%IOrDsde zpDaKQ=&*=ac)WEZ%}*k<62=H)JQAXVg7D@gyvH>V+vfx0Bl8l{AbD_!t!v$y!n74{ zv0MGU{`X_QANjp;e7r#?r(0W|*AafjW#hCjJ!nry0%jp4XSV;@Ap*1n3a#@1;x!qrN$SCq)Ll}>hav=>*dO;$qiYYy-P z3kN}(5fB#|(URrm;l*(Aa%&_G)Er(-MWAL^0U?zau8bG~qH$c`@CSy4<1FsnxVQV- z4LnLQ_wez;^Tp>@=s9a_ibW= z1@z{}e*gR5e?qOUnf}^ZImgk`PF4i}>>B!cH$_1KLAaesg5lY-nbefaprB4qjYd;Y zr2?P2HLGsHbYVop^Xp28z#1sGRn*I($ljd;;~;s6`7Znm7#7PWoFGh^U@sU+WGrxNlH>~g8+q?Uk<#Pb| z>dBMm*vm$-S2+)$tOJw?o5xEYXzQdvZA9k=Ddd@=qy1YPDD zxH+a1%VxSJJ1WY+b>??gYs>p|E*CFe^va6YYE@Ytz85cf)l4*Aa4+iZt-0VeiCgWH z6N%^LD>X5$?k?#qit5t%pk$1fRcEW;Ak1i~;W%<)qWeS|ai6 zbhcVsT7?~vrOC;pb>J*Du%s-qcXHl@=aRQ7u|HzEwXLmo6=D=#xND*i>Or_{u7a2W zh_$t=5DT#pZhU;qG&VN9Vd`oampGztNeH9rXf+8E4mfn4n zMTwX8b+k0P+Yac*Bo{8NtzB{lWF5Y~la1e=cX2=Oo8GKe#bd*8HSS}oO0fEl4LoOY zwrq8hPeHu0y`{3ZrKP=hbLvgU;l}KSiQLt?N+$h`=vQY=5D9@|>zE18$|TwmQHO_I?c+qZ?h)B&Gn*hoDy>ioDN)-X~syR zA$CG_RwYLlU=MMD0vUppV0hK{)wXtMRoeDg3rXc<(b`%Cq>paj3g#PP=@)#9ihKcK zM7jIL*0nSjUzfCsmiV9`a1r>Ip$(QmfGvQ(e0w_|ry>qRh7q8S0HIUSGDY=XQ&(cm zZcx|lLhc7IoXOSAjrl&boxX;yhAvFR^<;>eetv9oLttYKI+0Vi+0ugc7oe%eE&$M_ zT5WuIPLu)ddgX{pL-4p zW@+i+qV1yNpO}X5mm_qP3It-0cObWqCU??TRcQh>>Q*jYK2Ai;*nGoimwv3RzyH&I zG{Em*ff4Svw`7d=^tX);wE4OCUbt}ao$3;tsGdoh5y@wq@P&gh&Mq(Gy!_J6YV6I7 z>@A)Ih9ED-`x(ssq7KL?MAieFYinyolP%>PUYCTN^XIt(b!$Z~zU_+0cK2@^d)v!9 z+MBbr`GKUJH99DnB(IrCW$L8ilI?A3%6d|gXQ(PPucD%3Yj*w3rr_)!SmB6idUkf+ z2mou_>S}ckqaZ1%+jv*UjHcNYyWO;bfm+C2vm?u@Lw%|>)zxLyo}ub&$nwMD)uExK z+6;J!v_wvjQXL?KHAe1;S;qlcqfBns$jF%S_rD)?e(m(t*RP*1T0O)@?xm%_q80zo zAl%CmiNxOT916nO6eVQ#U7#kiNO(z5-$sgutJ7m$#_@*Q(Wm<Xxn(L zPH1=Gg0E|=e<*fzn}w(ux361ETsH`-ttQdQq&fRrx=&0ye zbNkjcG1kM4;pN{^Z~f<{vsD=7l2MzOiWcynnp&yeERIwGg)m%MSJ?CZ!cc>rwivVT=1`qIWJw?GK^cf zuK~gcg;Jqbpq>XGu^e5ZN%l-4J><#MZdie55;#&k5P&Dssv(8zs02$hHt2LlvOlpg zi}f`VX)+^2VMg>_bzNNm5Pay^^y~_1)m4(&kAOEE(A7cK7^#jZtHzf_J`e;a8r~eQ zRF_34l^Rt5xYg{_O3#4Mh+@Og)cSf+UlHnAJfA%de|aru;nnjecOE}^@^J1oUT#0P zNcJG8X%>H(1O4*|t-J)%81F;TI8=?~h3M@jb!QINpDv#O{y4 zpyiZI2-U;Gg(cCQ+a+WIL$YTsUhg%W0*PnRFc7S$T+`7UCG|3qpnl`cV4oGz<%tRW zh;h7Yw7#LPp{sA6N(pho!3cWU)#+CH#S4CrEc)eDL}X~S*p^;e9g26ahlZ--10uix zBUH)R&CQx>oY8-%1zjolQ9R2>%03`?8=U99c}8ZDe)G*Y&t8*h2##g}^Vb3VQwSZn zF#^#$hvJu)m&rlv!jeKwWXk}Hr|S_(C1SBaz-M!L-LmedufO~qWrg4Uu4itE&0=_` z=XGSO3kq;DK??knORMrTt5R^k0tZc=&FsV@f2caJt)^3(k##7vT9LQUw|)!MZqIk0 ze!cYi_5PWTjE?s5@{ZQE)zJ(4D(fzuw{y90DXpbFB0DDxhZRScV&qHKfcGp-#(|1K zr3HAZ1Cok@QcX%e-WCH+&j*rj5B|;`}%$w65`5 z2!?v25uSI5fO?AH>PnY2?UHQ1udcCZ4PtU+02m?IU}$qrKxjY!wsvcj@nKQn0iK@K zXNP@q52g2kiO-vDP)|OOjPVw^(oeq|{SKr^RO&-A})M_SB5kGn%*3Rx;hE3)GDY3 z8%bU+%ulJJA|W93Sq=gRm*g{?QjLu*1rZ0`UGfy|Y3E%VTgMt^e)rE`ExmrW|I@a{ zioCq`ioBZERr$ARz2*L(K0UHpvLn^VF9>&klLMENRi!FrGP(RIItY)(l~6Y&b`E!@ zoCPlm-ykV8yGGIlx`ex%CgscO2S!JAa?UQhv00R(SbxExFkM~q=unNV` zXc?@Mt;V=t7#LYwn>0-p=_ku0i9qsHEL|P z{5%y4^<=z++b(MdJHALDk%{S6JO1;RMF^7AOT-ho9rU>!jf2(5ZOWw)?E`i^x+B(s zVA;~_nftrJ3U?3!#2%KYu_IemR*-~~>N?NncjiNgLU!b3Kmy_ILP)zkQ*Pfbz!u$z zJeTvnHN}1I7i-${`r5j``}En;v#-DWUHw2s?4^Wu5S@vZz8x)EMMYypBqV>z=;YgY zY?WMHnoK50;R)4(>JrkLg=efXJ5z836dut&+nKT*s;IeS$Dw0wg+`au4hUE@uFS!5 z+(4SG^`ruWQv}fQ%|l{8K0gL}4G3b#3j{;P`54pYmT9aukwdHB%1-husLqYZiLX`% zgsQ{C!+B)D+H(u&S^-v9LJQ~Mo+Gi?nGH64)|k;;N9)GeK4ETJZ_ z6b}`Vc!*-AFnW79X}ePsnyZZ-9!`pEbf@_?7N=kIT8pgcYkT_TSI@rr=Ic+#C4NOQ z|Ky%n@8)uWR^OtoE{lxFh{!0@;#rO$ytx#wpIk20s*|IA&UHXn=ffgq$tY8?kw2bxb<2 zxv{#b*GbvucU$Ru140XuLYu?OLUGzkIQFqsmnDUU9y;XN-mZ&rASD)?u4(k4`pLD{ z`tZ{0*|vDEo`oYzB=7I(-v6}Q zUJBV^|IFxUZBbE2dt`=I5nqa}GASu%leVi$N|SM?m+C+ywV9ORVV@+`L0{iP@!&_> z{V%%v))l**cWa3|)X~-d6~y~*zWVNW()zImuM6iv+NL#j*kG{v zMm)$OqLrnkI2se%CDCP2ISg2P3OSetjx?gOj^@Da?;1lXGdthI*VmmWKCs2zTve#V~l@?;ye|oJq1=qRH$m zuVwS;))qDnT){w>v37K{$H|G$l(&u6HQ-2$qIR{aEHpw94~BqdnE#)sl~R^TeL*k| z52tLGRWK|s?u$?+Y1=*AV=tv|#eSQX?U~ilI{xYYulGOgY3tWDR+Klod8ehy%Yi}pRYA#k|8r*5**9bIhtF1r1}NH##&BR< zWo6|GP#mePH5yk8*q@6#yX3y>F_J;l4$M!_Lt25k#2BSkO=J3vm6dS`+X}DBVokP` z<>m%N#U~-bsDLDLl55!KP;N^N>j%zKJU^i8Z)i;S%r8yOJQwofz(4&>E$^)m?%wSy z6pKaPxzWpoCWpW+`dg~$;hav z8R(aF%j7+y^^JLP84(d3<%*6_1elu(2t5l5%J5bvFh0BjFBorw4iCc{ZODzxoykGb zx0mr%f_MFx&)J{NPbyX7eo${q`Q+Bt#+$P%q`(G7Nbb8Po^y4itxdl=Z=4^Y`bdrQ zc<_5{e#2mN*u574G3SfJbF(y2@uBd;;5~a-NYBjAJ(Sgw{s&h`bdNMNj3y>#c@F#d zq?`*ma^Tzl9S9x7QnAS65M+f_lp8Hs?yP7P(incVT{dmtIphP}f)9(Gd}$ z)fT9;!-EPTZHia?=l}X&|Led0>%acD|Nh_q`~Udw->?7q|NKAy0`>@QF0|b565ZE3 zA|f*VVtx8~zb(J>jGF9@cDIXsK09%szOgZ{EYvd;H+JAL4nC?qlR~Ri1qE7ds8*@M z0nm^gf+-zl-9PKoy{-mY3M+)l|HHapU@`T3qn)mo(@GNPiRa&~s7KM8L*o2C*& z>Y}p|ee1lw6*7x1EN-vr$q-l*IlI4N=-CCa!+|5$S2iad%7}`>`&2dI@ukZpo$wm* zJQTO4`@?-&`N(MPc$>^W)aTqVAPhNh{w+qT|7Cf`pFn8I6U0d0IaFA9o8*O6rSJoH z6vbN6Mba4eORj$Dd3kXWkhzsdMnp!cakOY)SXk?S{?GsUzx?a}{GU6}{>T6LAOGur z{jdM`|NVde*Z(rJ{BQs5UsC>4XLWhvC9d$|!R+>fms;!2$4)jf9Xu)~C;cwbXf!+T z@(!$E!7Dw9^ztTw1%`T}8!gjn13a~OLb~a4PEIr4fEO07P$=THW!i{{f~w@@Wytg) z3|P#3z4QG?0myXNO13XbClJTi$H zvJImiqT$%Ip?3Ffwyt($b23|<>!}E@_AK+v&5lY+SzhiO{{Of4E>LOT`J(Ufi4o%i zpTUC0F)2y3Yj5#^x_boTz96VHpc`;U6cK@l0wSP-sen8hMcRm<7th^$Eo|*t9-EoF z%*@%l%j|p4y1Jd@T)pnGWv0nac9W*H&8v^;bk4mq?frfKm^5jpt?jhwWBN_h7>P;v z@O}M$-$#qENM=xf;+Sm0V|NeQ)ddtd@M znC4KArk3q5S2sz}(}qoyWAP%B<(98pabA7>V|F)h-?{VlJMX^x9>^=`?cI0ZdHeP) zjN+@8h3xXaQg7dWy|p1fIMjW>p>M{Y%%?WwmJynd=O1CvU~jh&YG7dI7RtjQot7)< zIxd4T0KDgAyhv@s8!VrE9wB@(GO1vCdd=2jvpF0NxhWi3Fr>mtSKEqVOnz6Fi{^AJ4fgm4r<%<^ zXkvn0$uJ5AQ$vp@gfT>xGk~QL9_-d~-iQ4r9Jo!9&9-qCk7t?`%II}WWE$waW7R^~ z+AW+cma(00f?o;++=GLDbp-`Qb-P0Nl|AL>AjH*YWsw@1G-A%OQ56|+2ob!T z!4SYcbM&SY@kDYF;^(}2*f0=iDlXG-f3zG|^CY^*wZ z46%e=v9r_T<7)$Ev)4P00v3VJgb-F%VPyhv*95U?7mcmgA5X|In@h>{b}X}qbUgq< zxNP!cSv__Xwi>|lk6LG4_X5Lg$fE%LxgaB^ovNu#6*4lhBP<5o^-fE$l>g)BE(KUv|^q{<8nby z1wy!t%;&4uZoCyyK1}!Cef!R>n-9b=uOaos-eDMTz4OZ3+uPSFhfn6O+49N`<#mpA zmK92PbU7QnICRKlV$RQGQqt*i9YioFprHx)(%O-_5r%*!oD_z`lP>X5Y~OE3?=wRg zBz1YS8b(N=tcFc@p$J-q)y#E8_83kIS=NDZ&y>0(nM}=~T9)P)XBGqIC9F~&DOnJX zqiucuwIXYQ8yEXO` z2xHy8!9c(s@GX>6x&Yzh>t$bvV$bfjP<|PNnZ%Ur`U3~oHJr%)GeoefrE(eDWvA_Du}b_3Lk4zkUPqh?jqRieKftYOAi+U%h$*Q`L7~ zxxM|ymG+Z)`k=S0FVE>{JkrYRk_kcUOvrGWgi0Q!coZH*CKTypC|Ma9f%<8rkD!>y zH7ezts-sWC5UBxDdN#GBprGKmddSuje3D%Zl^xho5De+Y=65-Q<;_bWdrEXVHKS&s zS?#SMr$#5wpP%2!D*U0yfiz5y0nfRw=gKMs zO7vhj);xNw;{sB~H{X3{`zbr2x#NI&toAcZKk) z$>$+VqLPUX2aC93EjA@~C#2!=G*>Ra8u4t1-+QmTgBj23Z@u-#g$oyYX=_8t1R^T_VxdLPRQk`bjC9Lg{!Wh+LSRnqAVYRyTXit%E^5LuXP< zwncV$hl@cdl>VTFfG-&gVB@*YyK9I!$!T%q#q*KDFg|2OA(lZT=Y3GL6hM{~D~dwN zJ)Cp*jG+{iFH&?N4=toL$(T%$D-2p_auv&H`cKZWNT2hc37t7}CU9ZCyh%~11w;DR zpN}y1i@i8WcC)c^eFvaru3vX@Tdgadc^;fS57y{Ua)zyZLNK~K@ zU8@u`Bgs1U4yhkkE{B938kOjD7K<(I=;#obToekgj=^S2pPBZALIHaz6%kZ>y+h+e z<9fDEw%(=KsneOn^pGNPto5vIZOyGfUq7ri3s~HtjhPLsa{}w%3?Z`@z^2Eez$WB| zI5mKP!gSx&;F^>#LVv#yx~1s!PDZVZ0<{N|lP)F7D26_9f{hD#LT8rF_|Cj==1ggO zCCAuy;@snZzyI?Q?)hdAre={zq{B@xsLOa4p-Sbt_S$tUenIXJ)4#WFT$p?2^ywb+ zfL&dxo|p<*O337l#Q0qQ=IoZCxqCmGQN`zSv13oXhFsx$Z*ISKSte_1AK z%wDzHJZzh_dHY$EqDK{NU07duTbrvZJV_}IbJ+~5W6io2+?qZ;^YKm|tmtCZ=fU_b z1ppR2;rH);F+mr z8ndcPQGD+4zy7E0ZLv>*5_&DR;MV3=elu^2S_CS<7=BU=PjX`$bdC$7Y`=T*c5WR-Joz_bBRng7q){aY4BdBG->6qo6Bj{TkLkbc>zYbnJqmY4>FX!j!qVh zGTHJsSYm%s#ajPx zBgG`Ds%65mFd+($CcCg%kD!H0lv5o4IImAUHSckU(5vAEWJ~>i^{}?O%4O;*KKE@Q zgoPvZ2MSnXvDm2UfAuN?@aCQOA^@-7xZt)<8$#~EDRr}Y$`Zmhg{{o5ETm;TwJ$Lv zo0v@?4XpLs?09Im?^3v~R9%Y@d~^E^>y_%d=Z`YAD1cEau#LXx9gidG=s@_6f+J+Y zF(`awq8C07IEsa}-+B*f@ zYV@j7hQlb!gj51{aJ%PNt*aUV;)4#tx;q;5bkgX$+Bz6{3ZV>A zN4QHuDFw_)5V>4h1)^u_f?Y2zXeZLuN}X04QomEBHELu6mJDl9Hn252+smTUkg|kZ zBJ0z-Q0PdZGpqx|)Z|mAsM)#ZRiuOF8V`)i24WD-V7WciKw)QUK?B?qdTitUL*^kC zbY}ClCgILr(v~*J>02gI0IgM+C?=@|7Zn?ufY0&z{Q)=9!9jrN4)_KuXw}bGBfF2Z z@UQ;*+dzo^!eo>f5)a6#uJCTWbsxaDu3a6fC`pfs!%wYPYRu3zu(IeGTneab0_O)a zQj@9F>}1@F(KRy$&x#x0*EyoOqJV3tTknD&yngLU^)V(Fg{McwCLIQl212LM`L$Km zN6|A@*KrJVkXg&*b71ei)(F*bP|XA_XD%A@h4R|QPJNHvTuLNTn-_-04G3Y6VRLhO zdU{MEksFb+Kpz#Bfltx}BaV1HDDGZg#Y)EFE@hwYe5(l6P-q+QX3AeSH1cg1Tn}5VjB29(W>{7aWopsAv|;vaocT#=8Z|qIy5J5BmL!jMj}{)O zKDzTA-a$_EwYsBqPdxnuV#u$1;tAOODiVn>hJxCTS_Q>b_r$R$j@7}MN+vL5ax^?x zRjDv)Q3eS{6l?wzibX;f&DmqAAyJVcsx5}Ct(h4>2m_@?SSBt{D-^mkVib3TCrusY zQK`5DTxRsolai<0B?NpLnG~0^vVnXa?4ZJw5X%UCo?y?w@bJL61A3Okh?_97)fpsm z2MIP53DQEC<*B4g28Qf|7P}i5PEFa}FW6r=vuZD=S5+V5bX97R@hE=$ub}?v8YMYd&aJG>yGt|h%`=N`wPgY!blX=} z{QJ_ipFbN$p*VVI@#FvaxBu|% zAS4j$55IpM^I@PsZ(QSCQApOj1boWU92_2c+*74VnI-2}d}h0MF=VD%eDh0LsmT+k zsD<5qxWePDtm^8kJ61UI9b}KGn8%)vKs<&bmM2E|G#F;aV2t!K;I@K~axeZpekizM z!V|^e0A?i$0<{1%GP+$X;^&4pK96`>w+9agNie1>fapXW7 zD=&_mt3iD+a3uMtJOM&-t;WFTu0|JYk9nC z7{!lL$LcDSQ*f%#Q{_Sc6(&~%A*??WhE>a2o!nvVL4n7BUOy&v%+8#iJ$-u1V3?kr zoo2`=+Nx@fQYkie3BxW{&@&I4)yGCyjV$Nzkk>qAS(#Z}!G_rT)_Rcj1b}+$NMoav zYck2XeC4Fjgmh1c1w`Sy2qPb$uF6;mR$3*lMA7tc>(Jm57K_>!%u`LW>Pkeg#b|WF zopa0I{KG%~)jwSPR(xR}2@$;cE|v(q@#^vwBl6)itA$L>N+*_-l$Mb9Wm8iUi5n=q z3;8E3D;v<%MZgy(6V2#Jt-7MT`bNYFVm9>ph3A>DeO0;4JbLVjy2#dx-lv~@a&|h{ z(?2}aKFnrG*zWqbai9b1jer7E)l<@x3@QF z9Yf!ymu)=_dN@116$FTE8O6kd>O{DQbaB~hWBr|Mfv!>3NT*9Adc&5%Gq*CoYCyhl z4Hgd#^|KvP=)$H8g>nX?v52DV>N15RwHpz5kvji2XwjPNQW&e2RT>R!ephzs8rxgV z=Ai*Q3>lYosm@j(tqO;cwV0eNUO$Hj{^xVw2Ev%=ct`}^gCouBH~O!rG{&|zm)vS5 zloIjyq{PJJj5K^kPEzj5#_E!9#ka8t)zM4TdiA(N%2>Yq>g)Fa!b{-wS5ZFSfnrda z3E5I)Mmvx^fe4Hl3_U|;Z*%$aR;QEAsO5^Qs;ZdJKaVIft5A4ajsDn}-syB=1JJaf zghJsYJUf-u%(~vEVV2_4PdwcrWq}?dQ@RyIj`8#}QVK=R<#D+@9bH)L;`6!Cxgw)9 zLKz1`Ix=Q$Y#O#96&?l|=&?#sghiuJ1OhI@Idr_R@5qR0vda~*qnPD{SO&AC@T1FR z~6pE z-Yt{~UcGz;+tX`olS_w^OS5pPiT?wa_%nQFVs;L}v$(pkf^x%oe@~CCf7q#KFJD%? ziWOPhMgXB??fPr-%a=_GacxH(UnlIU1cnGA!q}_#mV3?Wni49pq`Z09$>8&}%V*K6 z7()m)w{GM~m^p8lHyHF1ot%ao46M--nkt!fwY4J<_%k}5IK~i2IvuBH7SGRa8G6VJy_P4 zIof?(3OKs3on0sf4Pygwp&|#Oo5`@kxZI+YYq2rqDp)kDP$;fkzA{u46OaCv=b#Yy;a77mt=<^j}0Kjf)hK&lM{;$0CcL zI;>5k`jS#A5#-RJRy~``a~UhoRxu;t%=6Db-!Y3q-c#h9oD%m+(AiIe*<3=CfQc<2 zLY9w>^oCi-7w9CC&NXbVC{n{7!`5uCK!>~;MG0)6_zX&_cwA&Gp#}#gjtFRU7{Vom z1~b^N&2mUPE9whRcAv~uAL=U~5yAv13Z;?GkTPJgN>`-d2~vA7q(+4nLkL64#mgAQ0v?x{ zkPx4cnV5;sO-gp3H}s76J6WA90ZW8HUE8^kg7a{=&v@Zmq_zDxEHxn$OG~NQ`Q_tQ2A5}C7HgNQv1pWuqSj|-$4R(Ed|XWQp3=>rQ$o`T zg`(PyND*nTmCa%a*nA#OPLr@2n;cMJxQYHfJ;CYeF;*j8SuBI{VFruMmLt-&$goDX zlOQdm)7Z#xk4OhK2Xy%1E~yv#RQBOK~xBfaliH`-6quJ0|VnBaDjr7x06K;Pv-UoP}|guq~!? zS>GTmv-})IAAxz|&7YIl@2)kq3p1f+#y_YVAEeySNApZNbgywf;`H=wpxRo0>YM zb=7%SPlkV zDb{pFTw_;cu9Qomg5Ff<-(*VTS(OT=St94HWUbXC;gUzndFhfq6ES~HVf@zchz!3yqCt*oPSncHp%1)N0m)QL)i}P-q zl`bg1bjU#w^7tr6tTjnzX1GF)anf}cVHhi&QNWmaz$Zd+g2L6JXz40m2Y!#KWCsf` zVyf`*_JW6v@Y275BSdQS{^9*iJZ+^Ib{bTQu}N`76fKp=f`WWX{sK_!>K>a7~D zn$+w$J;p;hLz~M8c8OWn(L1|DEe#DWc$?Ms(CVqEq?I6x$A<_;DwXmD$aJ#=PQ3$M zA_M86tf*Z-J-xZOxU#kei&*Ek#t*bQ$}W{1F6h44#E`9C_?j((1;Bf2h8B&DzOmipuM)J<8kkp{c2{)s4-$`FUG2DJ`1parTdOUd)@7a!>#!=gH;TDh)-> zQFYxDg`z8rqMMdB^uIBhTnZG*6rWgs^wAT4qgX#uh}q9?TKT>JVN~43+uJwadwcuM zL;LIV56Z=yN~}jzELLgcjP^qZ4%b(7N}1?szH+7i_19m!+Ya;2D=31Al+^tG{lm|V zc3(VMU!LE0gwfXGf>yD}T0`U$MJPl-p?tqrZ8o1$H`l1`gBHtRId#030SJvK+0q(S z+>TjGh8n4$+vi!D-&_gQJO@SHZfX)C2^_AY z*KxAUL5D5CCLIc&WHN2F7$P!E4>4T~WA0GVqEIO&!^nP~J9px5Q2beTamS8*(=PA} z5XL6-{T3m-vwi)geFvWVI~|83Mmne!!EjO|pV7L0) z+qux+zW&DV-zPr@mlP@GLu+ddeFvo)Z0eJ+EwY?4Y!vb249A+S`FOK=%5Gk;_+h0{ zaERo2Mj%&$7AjmCRU2z-u^_-p|J$db?`IvS0wXR}$I zP3;I`yNs@*2gb*D{}~7LOVt15(<@7e2gFncI|{QMA;(jo-RIj z?%d-iT8h_?ltuI}3WN7>0DdOI_>(`07}D*V@BjATW#sG7PxQ9)e*EfHJgJlqJz47}~4bPSJjS|Ss_K+c{cQp4MW@xbUDWP#^y{J(m;t3o<3*k_ycW7|P z23_#5LBhV(%a+5uFQaQx(dLo|hvGBb6Y7x9;~Dh2J@a!VnW59{2tuTP637b#dbXso z-8p^Q(ca#PVpAPmGCV%FIJY{#5;%40rAHq5X&^m$YsDA;hp zxQf5^cBG%;wcnpQ_*`LGUP_7CjiL#kXRV*n)P0Cy47n=|Lf=Vt1-e6EOw?L|fm zX)LExQY4v~nVIgCNPE{>n`nYYq=%cEo4$p8$&dW<7r&e;E$mTW>}ww}QFJ1y)M+j# z8y!t=9$a07Bh}5#IiDX!$p-ytsVQlxxYRutoeWlg*~MW2#RZN1V)V}zVol$Gt_8ik zCcEGoY7&`GWIrb>O%?k`cP=7gA{pRA z45^zf>ZHURd}=B#I&Oe1={y-bJi=pER~cbpkZ>}R&v&7i4DrM+FW~s|gsP>u=wM&$ zgI4ol0{rZ723MBzCU(vD9&}gV>-B`z`CGSczrEAO`!0NK2kCW$`ucB=cn4RZ6MDll zRgxZOp6QXW+fSBBI4~a{Lx>_%*s85HDp?K#HJ(5!56+yPot>VYUPHO~bgxqH(Wv$(c#1BRFTj1%$AVIc$w@eVd31g9Y;nckos4Y6y1%{iyMQoe zPkdt8PXNyCwx?>6bT3q@87bCkykt4{S;0JdR1; z*=(7Z_~|1rzm)hdr)tzgPKJn1VKtWZ6{7Tg72+2tce2^WEkkB?O=;=Epg&NWk({;{ zhr>ms2W%3l;n1a~5n=JpdCbSz1g3u{*4Iz8Xz5LNk3S=?`|lJ&Sb~vS_7kjS0_GmP z{mwh@0KZ7<{Ox;Pyl=hn#%ovqqvqh>r5wJsee-|*&s*EqFH8?EgyutP0@a%lYo50` z+5Ls15ncVxVM3FVCUC5oQwaIq*$Bef;99VEt9PtX22+HMS`$sbRkJ6S z;LR=xZEjA3B@K=tgr_?gG+4b&DVE8EI(jEt($pw-v|lP4*c!gLe@tiMa+PvteoBq~ zg_mFc$$#HVRrg2*!eSwXG1S*r?m;I0JnY&HL9xq1Gs;RQ27TveW(G4d_U_$_PsGJ$ zOpQB6oP}}a(lDIn>mMN7~)3DGTwjfQ$Fyn*}Q(^ z#?`SALDS*<{KMs~S8i;-`TzcZh~f6N_NmZH=u|Gb1fNj4WpJ{bd426nh-6&huuBu3 z#7<~HCut1pnwdx_Z0enT1~EiI&Dz*>Z?BYQ3bz=wTBU$(4J7S}Pa!8aFT!~Ht=U=F zg>ZVTwNnBJWkPN(n>9AJ|5B5+XS}=6Fg@IzH$p=Q=`2Uy#k7)BFa7l8pOkp}1;X`p zVVJ@iichlmR#(n1dOY*~(BQ%;Dv5Xs4FAmH>Z1LTthAr)#b?GxC)A8vd&iR!%B3dZ zWaPFGn-GM|XYsj5A6;+b$&TdrJw!-f4Pi{|o`iVZ$>&=C{rA6r{Kh?o!xn#_hFn6$;V^{y{EJOYV_W28#%K&j1`!z% zLbg=D<{v6(LgWD9>};^#+H2??kqFx~N~KaDwFYaVqvMf(vdsjik)mSdO*6KFo=zD> z*2reS>t}eYFd9R6vS)0#yHLt9@whbU*#16pO?G}Njj)xF zYTWbwh0;><(kgUU%-Kr@&rc<1CFAfg!U;DRv{n%M_7q4>lL}QA^tW}jC?=8qt*^J7 z)ygU!u%F+$e9nC#ETqXSsW?(`+{@^(+HSmdRUhhM==CVfK6;eN6g3s(jTRmlT7#X7 zGqckd-nz^1_pJ*xr%H%9@wjG#fyL4vy4X}}bYanq%LpH^`O8|ZNDj*fP#|Nlj!h#% z$d+1zy#_9d{JH?`A8ock|bx)?PY zB1c#B2G>TrZPVj@qimK=I%e%39vWZu4S1WWDPFcIjGSgynBo{7&7xW?rG%v9(m_jB zvN|%pWN^ZBD&4a`CQ6kd$&%k2~ig^?Lj5Wk@CrMRU{R+0am;urn- zwKFkMQF}6|4J8FlRaMnz;XtP9Ec$s?z-F~q96;H7in<3|+ys;8)*P>X%?jv=^NIWV8V~QPh!zNOtk}I|LJ~Ml|7xQsoOJRfB*0j`Q(uU<7BXpTl zKR!gjCB&8+f~OY^hS^!nqMknOEMhbAqVl}WqkFs)vCX~Kt-S7@SzF&liPYIyexNTu z7##N=&&Q`;Ix^xaMo~y{F@-%anvz?yX1mi(l|oQcJaRqsMzf?)BKt}NQqa|rut z21Aw_Life)L+ar*E?n3HLx?}ui&e&=!=qog5c0c)5J^;GN-njaf~!$2YhgROMpL=0 zWsf%`og7VR9)txtDf&M!_8EoQfQ!k6V<4CSV!d#9*LanTnKwDwyaY=I7|AH{BOC$-9= zgFET_LycAbe1y@7q?Byx5xELmi!Rb?jg@D$4sU8I)$U)J*_d)~&SPVa>{I52srIY) z7{2q|zNEy&gqry^q=nw@{R|F9(6!S+tx&WXu}W(t${tXfE}+q*9lb~iH>V9fww^UZ zuY*qGvLq5(I82wY$51Y@HMTW9y|o4m5kh2ALkS53y~Bo~*!sbXg|_ki7u919eR->) zhg4u5QsJwJ@Qc&o(dm z$QkL$@o{}A>H({itwZ^Q0@QE)(MO9_UF`?UVjps#`L!WTqY`rJ3+QKIXN(xGH^s{u zwl_5`1e;X7c#_38=Rt?f|F}b99$d8DtFCEaM=+y*s7)Goq>C{|u zdiK7O=3E@|dUG?)RF6HE7?|^H%-EB2@M)x0r&TI2$z+pQ_=)0|$6C6Y4voTClJ6wH zT_DUT&B`V<(5rT~-)Tk5Mx}H-DciH;EhXan@c0^!-(0h>DI#pbxl@sQf7KhX=);Yyn5bD_J#)i=QlRo)I@wrxqgHpFi|Kd z_W`8*8%Qeb=VVABtTr_gg28E9cL34tN3 z6Wv@5xoyFq-iZ(@X(CZAOzL|2>8GE0a%Ak8S!|vmw8zh{EHw`e?Z3F+sqY_H+nP0u z4>jcVb@$~Fz2oz9^FF)RqL=rVUph2aTV1U&xxy5QwLYUcIW991k55h8yZ4cOo((_Z zH?!iNNXbkp8P-erz%Nq$dG5qyi>c_q&ge9-p#ol3;vEi>~W|B~Hqrw)Ithwry8l;)w}{7^+BOVEZLxEPTWM0%*w zz^WgFunmeZu)0v8uq&d61_W_+DbV8yuEB6hnxK-;tcw)y*V5R?UoINP=Qglmh4V|f zmo6Q0I`me9b==#K)ZIOL$Q$zc2BzkEyrk5UkX|r0a58_44?Qd{mr3HNPb1$`=2eQ7dRq#CWQXx&OP;w^by{lb)cL9G!6jnu)I>?sy_n|uZ~GE1mK|1ub<$!{ zj8V0N(5Ns1LRYvAs~v*Ab&*(W(lL6cgEqK5fEk2_wSF00z~@(r_(u`LW7Q_QOfoim zddqA_3}FKLoTb#fwq+gbS05_u>r1OQqwI01v}7q{CgmmJ?EZfCGr{~a30DZ^^g;^V zQJ+Li!X@m9es)hn0xl=p@2er;aOvg4PN`I+6Jp6b(m#~HQ!4g%e^<5c%OZ@;0fbF_ z&N9+Mu}Xsw(xk!cY6e;gLql|x`zwOY8*hy4;Nqeds4-U|9wR{VjGWx^7&>Dg@PgyC?sE}^if zsYphV_s-4)y+b}&s^swmgU9<$CgwD|J&^K;+=KRsh0-keH`ga7q;!rrj+d1+@?=5^ zMOJK*J4#a1GgGGQQ)+TrVsdgi3GxRPO-MoZ^Tgky@TKK!Wzi9=dhlylhxHvn2!@nO zJ#>&J)-EGkx4ev!Ly_LooLiqkNKVUmBqt{$6`zzzJU^GB_Lr7gJWDI{p5fo#yvy+F zW#sUX)?v%;T3p!HA1pLgxY{C>r3$SA8i$Oq63C@7>8#UpzPTk!$a3n`LSS`E->F0X zQY1!kMp2QBMxzNO!Pyy~c@PGm`$KMzJ-alpx`8qc!+g+gc8Bbzn$<)SiJXg%#t%12 zh6?-IX)=^m=(tR-^LT2Bc~G5|l$lAW@iq^vIT*TPEPVj`d7{NwbTBWHzJJB(uHQ|B zS)`JZ`~xf=r&_aI3Hx_NU95REfta0yPfAS1r{WU-TLzA}xI*-9%&#IRHbo?)?f*C~ zy?PlodMYq>a6tiwYl=ubs&GZ@Y0G4b#?__*yQH5K^xmrmISob+Ot z!e$Z{JxUQMO$r4?=2%=@vw7xMLUyw~gkCf#D8ZKWF8bUHHO(cZQ)()el$IKm*e-!h zmF--ih+kVEEXn@1a&vd;gTxkzMG>Zi!$ z`1nLTiq2DUKi~UEB5`G76`3$%{b8?V+_2@4U%sCq=ozYOQhBFi%ScEGe}i``meuP@CVfO z$*J*~se9A*{`Y5}{nw`+LB=5#w=nE*80s%IGhj|W)+$Kj^F`>zB8(JIJo@N~$GU_~ zhwoOOeTM)0-Xo09$)!>c7jZSPS6c+*5SMk%aq_;zXX8@S$)z6ys+kN^1f zuV4PnKmX?C8V3uGNs;o62wIQi6?W>K4VUmko=v~~!u$&_|LRx2`PqLXrl-coNh8DVGOIst|H(1xmT@L56Ku z-3(OHVuL@zFdz-t&#=&B3Y)OLKZ+bWIh8u4LMhiT?EC4Se)Y@W?8}IcPyIzAL{~}4iT^$4seKvv_^9Z( zn(-}1Yf8fY+7^W(QoRcU5GEf(`NQMqio?Q+{U^Wer~e@!jEPQ2&#osn6!A5%;9esZ zi4a2eKvI&~v!t$1!{O_Xw+;+AAOY8+F9AYRjof393 z@wn33+Bzl=Wep~!4hDLe=+1$fNA~{YrI%iw7@X>7u^eMoebb@tOMQ6-gzoY&LqnO@ z-dxf=mZxp-Rbi9yr-hP}V(~QaT3Bsosf==r&OAd{tD?Vz0JJu zSHFDu)WX#Gnssb^sG;oQ#iWMeo>k(-&&6bYTG8sG}B8P%e8cm5@o{7fdGDgOxw@#&{QSCOv>Uh(E(Z0UqQVY!X z@sr{X4C~8BONo}vKvu%fe)H>>|NTEElK&|oDQ)l1<9?AD9gqJ-LQF>KDQ`(yeB8yd z+TK^g~HcvmT?kim=4S53OU;gIT zKYi(uUnK6$OikUB5TA;B5w{orPf_Wm8JTejN##RM>xdje8BG09`k*nP^daG!e}ZEk z>eJabd(}GjZPOZ*dt?72A8H|Is2W#d2>BVS4yV>p1C<+ zh?p|IHXb}4RXFxc>q)9Ntpt{sp8Dxad;bZS_y{>IGr1%uF>UYOw6qsv5;Nn{%7@1t zQUR7e?1V3>uA;+b52t!5=4)Gc{`DYCCFN$?_flSPdOVr9fKMegPb@5)Dt#(FBQZ5AH!+Kx8lM`E zOWT`(%PAPrud#LL)zT8_-CQqTmdg(JeYKTHUq!xST8JS$+^z+LB9s}Tyh4TTZ8Bnu z&f8o@vDT>77?&#}rG+9MA8DvSB-gsSkkfmBp@@szUoErJbbpxVun4HjtFFknzun89C&1eAd37 z?M+XNOT^)zyZu>w1}=MCZ)NBxvf{~>6Orl(N>N3_=)>dpu;q&pW@hKsBZOiV%nm|{ z;j$RCaajvS((=kJcZR%PR`IV?i;#|FP#+L>Lv1 zw2;)$#9KzDQjC%Tn4G}TE{iZ1h#a6o%Yl?$D?-1ofsUlMHkXKtt=9!-sk)Eh^{ZE4 z(g2)wyCxL~A5255WsHn)MLIcqMCu$+AI>9?CYBaw7K5vE9vF5Vm|G&IXC-H5W+vHs zdTeE*1J-eT@LAy~zYZVNwD)SXBJj2}u9eyLjyd2U5RB z_eS3g!syJB+!S&{1&325Ld0NniAYolu29T@HyDF~p+vz8GN;fxh=NfOkIRSk$Z~Lr z51x5rmmQG6(*!VkqPCVV(wRgIseZWP5X=Z#!uBd{y3NpgG__z4O;NMb@tHVWns-<~ zKH5DzW=l$|NsNt)ib|xGoXUuf$;pAW7)i;=$!Uq1u?-_dSouV;N_J#_-w&PNt`NqN zNLe}gM|cRKQp|xf8klz;nSUV?W1nDA3{pp}qD`TNoj?$!a;mBTqE_L0z?NRtDk+%# z6ku+Vk3v_IlEG*{SU8%LyWoR`$$tOFoZm7uWL8fgf|hI&nUI*;m+<1DamV=RrPkh_ zpd@(5iXw>EuaPwsSBf+u@v^2(14BBEO08&_1B+g`Jdx7%U`(Sm(F6iM za|Eg1q*B?{q7bn=^Dp)lmWB|&73BUb7WdSG*Q++$-K#5u#I)>v8L63Zdvb>L`kuT? z?Y%wuX-^R*rpz_ziMZ6{(xJiT)WkG=W_(`;(cI6X%ZwUX#i2;`Qp`6$eCb=4FGd)h zP9&4+51Xps(!NrQ8B+wVs!EJLtwf)~pk9S|Su55o!vMTCm`iWeREp7Kc}NfW$Rj?$ z@CsjwvO+#zB}7>T)FEowSuI?C+Q8bnOLs_h#4qh!B%B5}8Ok zOs`sAjwBYMWy~ES*S8Fc2`&&Zob1w|q+cTjn~D<0WsVqD_=tHtK7-HWiSK84^e7+Z zYlmG>r0-Jdc>M#Rxs8qU=U3hCfMv=%;YI2E>f9V`m)}^3OU=OH@wm)PG74vc$1jyz z^~d9InYbjXw|`B~lG7=4r@r-g>##&ZXLYt0j3#{QfAANN5SL4&k`B_Dm6glj2eFU_ zA{rFZh#{PT-%uiUBCPRKBtU^F4BgWjmFP~-_IP|!d}?B5e00)yFgSnwQh`-JTsGQZ?&+1XX)+2F z7|LXgodPzkvuP*&i+UKN&%QIV3xo+NBoeWqv9=Oxjlsehgb=|4KZsdX^rjFkYapR8 zLV&7)rDAO=E&Ps4spJ5}$}69!r!lG!!nUx`>MR(t*-sH++P7!LVxDlri0_pZPrw%l z&2LyT_h#VIQlq0|v&VY|)rFT1OC_vMy;VY23MaAI1t|VJVUjd9?Z@9u-=lumYWE4* z1;WgFau%_nNq~Y;t)g;A3$DloU=PEE{6A`mjDUT^*A z#XWub?E*TBC7}z8vD?4(bL%H2#k!`v`1{W#{{m8pk7XAKyNRT%>;o0t%1W#V5tL9Y zGK#G-5uVuX*t92?|SF+DvpSu{+&9 z@0(k-1w8(eq{QTs^Ycq6o>}rwOodkF0{BbuHteAl`&71XF_efSWX6p)46Rui0;SM388#|l_}RH)70jM^D5I0V z+p-IUak->i;-Ld9&JI4#4nmH|=n_(761~IW?CEgH7YL)%h(uC-0iznr zDMT2-We!(6DQmQ?S%~p5ch5lztxlFiz@tUhZ^Iz~Ak?UqjS4Y(!+HrHs1asLxk`$( zpOBpvACF7LB_`rtOv_0nE^Z8-a-*zp#kaa<8yL_#1a!(|TMO3xaN=*o@}`2MAMWkn zmzP~2j7cVClZg!y&N2sLnMy>FQ)zTjDE({W^%{m`16FcjQAXs6Z$q*whTSv1D#--X*5$Y z=-+zrq*B<_kn|UoGJLV@#*k)_$Ry(ac1|QD6@WWjR!|z9o*K9*kGXdanHpRhcIsII zULtT&G1)l2M24@% z+=tNTvyI#IY(AXVR8=i&#VD`9jA|Pogph{MWU+KtLiaI5T9}lKPk1rr*?4?fT4q{u zYIfoless{Zqi`-Sx>Zm(^6?{SbU!%=hkeZZ`-~N>NYDZ>p}ULO~1&3PdUT zP|hbGn6~0uS_s9(NzLQqoid72rxVF!*zlfWmy%ME`;dy~qhh~jO1P_VCWDxgU2@ zrLlkMQv{=P7Gb@(-ofB@W8#)2dOG>hHcAQm|&@L@t6X7$CDi*q3{8Ql40|_B|bUDZme^CO#Aq8`@a^$*aHMn|P*=VYfG<|0d4$wLSgl+Lw@Pn(<}-#gWKh_V}mF&Wt@q}+pysb_spsZ;^it-sm{-LSN6zAq0>X6#(C2Wfs;g1Xp;e*) z=M(o9DE|X~#YPUjsNmz~hi~Yqj{V`B@9YX;T5d{C%ArPvrm6~IbV+(hf8tS7GxMu} zaAmDWT3yM(l1QX?9F*Q85ouvVBhL<>;F@7gBTuRfy!iVtm{)K5_bYe<+ z3OT=Bs;TBPI9htYE%DQjA{fP%FgHDim|r2~RPh-+7sWR9X*Ee)*+3ZuW=O{! zBTNp5i`AV%WsOFK0vfDb7y(piU{n_XRD8mg{%2X!VXS%yDM-wZ2zM{LLr6-=$tE0; zR&n@zjk0s;rB6kO@&5C3a~=;OxZ&$Z2vIO2hB8ICo4}@IK#I6*bhWr#aD@mH*bqhI z{V~n^-FHW~{z&gj$*vG4kjPnpki%gjgp!_p_m?@quWRAToSV1xOKX{xP`VE# zrPcwzR3BdgAXtwxxgA`F=kl{Bp7@gt6)M+2oYt3=W^k)0jHP zANd5rG|%}}p9eEIQ7K2bH%(XQ*Yk2r5M8> ze)aX&ExSUvhd`<))i*OZ)eIg_*x8f*K(SF2b$-L|TlLJZ`Vq#ElTlX(b~MrhC5DDJ z?3Mzhhfw~Dln*vPVCj2XRp;@%?mynVpW%-PzpU&IVJqI@s@JIQQvO9$J#Psx({Kh&?6;~jq>r3uwNkY1PZpGvG`Fv;m7tZ)rHf&BuM~6nt z(JCRKsDvU@kwPKTpkKfm>K5$!_C%N~X}WKA!H*389N8VhY;w-Nth^>b$d&7y_NRXH z-~R1?{Opl`oe0dWo;d>qeV#LC&aAEk#z#gv_!;vCyHA% zy4C}u_odb`F+Vc=Gh}xNv+A?@Szixx zbnOL&7r*H5_|7wYxRcd(FT3-FvB~6|^z?c*pT|RL$kk|RlHuV2cjyd)2&U9MIMmLr zgSny{al{82T`)Uq{X`3o)qbci;fwzc^bGxJhX4HGhqsX2{$u3R4?g_eZvJ0Uf4KX& z-+hREx2WHJ_`#p~TzyAt+jgmi8KkVNto+VexV7b0aWqO1tFwK`5^%%vLd#HVyM$3! zd-NFJ2-ox?k*f;>=;FzX3d$mjk9NM(-2moKp1}M`h9ALF@0&Nbw?D)_eS7=%F8;wE zeXzZKEAq=*+Zf9~Y;XU$2*0CeM!Q28olMQjq2{&2$ypT=xOb<4CbkbF>7-XyRWl)y zQHppPo>nMC0nCZV&I(!&lwp(0@0&aEc?kcs9wLMHBrOF3erSRksbs!d}ehu^Z7bvrHIQF zYg^XWWpoioTXgv3XWqVl<~it}V2BWY6dhp*wsbcL;g9^`0fbSvw|8ZKzb<*0esgyS zqf)c?rSB`O;0eW5SOrWKr}8XkSz**vR#l>(%;%qHp4D)~rpaR2`Z}FUZ)zBgOrHPj z?HzyWD@YID{3OG>2xGC2F}p%|`w#a}#{j~QKHPruqlfpTKHSorU20)sZuTQt8Ap^w z9DbyViHlV-RaYSkdK5`@Wu*%8zY}d|b)8N5ksw5x}!`^b@f>l-2WB3 zcwAP~{`*H~ea5%@oUeV#A0mYC4WIpR`*+WNS_@-d{NqP|-1+(9{a?6G3;*!qn-7`b zLzP`3j7#6QkDPmi+or+J*s9P^4o@uRark`MI_E4(0E>%V?9LTLV7{xL?lppd$ z=)IULdi2ra$w?KY?@7B!|Nex;JmCC4d2jL24xmUt`6*xc$3NVY2RPlQg($!H0W0Bd z5oYFOWu+4i&|6xxmAr_E(VI&sEIx6<$Q85~6h4steL4Ar^M8;bLiopzKDxENliPpV z7v4=-9&8M}-xvNaVvB#EvP*>V896!Wg#8pn%d!TvkH^&*wJwuvJ$O94ShdvCt1w zb{o!Qq-UgO6*eh~&#KytA|qVChxwAG!zUxqqGG;Qgm?49x3}Mn`sbab;%1~e>Qe}B z-IE7S#~;wbsNY4-1%8mSON6o6DH%Cgg%yeuEiHiWF_lqPap+`p%zX!DU*{2GB&NCZ zCeon0c_C6Ou(zLMNMkPiV0ZTSdnmg^7*#^XKa!JIp*VMLeZA#u%leW0zWW{6 z*Iqe@`NQq)52NlOd=?9CkQUzA)i?Oyel5gKxj%eySAXz(C%Z%#O{L;9(hHAttrv&2 zlp}eO+rN92h~GpBcFZ3?y!E@7`%Y(WZ{Lgt?Yi{=CZCh)y@=(JHzN=FaObAt%^zw= zvs;9?^yKvP!g6P0`|-lBnEri9xqGj1_lz{^k8pj2v~Wj0`(8NeqkGx@2hsPU(GRz8 z{V)^!-6D+MgG(D7&2329Ngp2GzcA{fk0K{_FMb3F(EEsdcBU8e?A^zFgpB<^e-tsG zFMjmLAEqVUB|<=UZ|+jeU-0nH@1X2j3-2mk%wN{v>+gYl351aYtRDe>*JSqyzo+uU zf5rXK5k|%Cd8jKrzXkcBBm5qY#rv}IgGczoH>H082!H7EpZ?Pi-Ol{rCF(!@DBpMa z{{b6zyVM> 1) & 0x0001; addFormCheckBox(F("Enable automatic calibration"), F("plugin_145_enable_calibrarion"), calibrate); - addFormCheckBox(F("Enable temp/humid compensation"), F("plugin_145_enable_compensation"), compensate); - addFormNote(F("If this is enabled, the Temperature and Humidity values below need to be configured.")); - //if (compensate) + //addFormCheckBox(F("Enable temp/humid compensation"), F("plugin_145_enable_compensation"), compensate); + addFormSelector_YesNo(F("Enable temp/humid compensation"), F("plugin_145_enable_compensation"), compensate, true); + // Above selector will fore reloading the page and thus updating the compensate flag + // Show the compensation details only when compensation is enabled + if (compensate) { + addFormNote(F("If compensation is enabled, the Temperature and Humidity values below need to be configured.")); // temperature addRowLabel(F("Temperature")); addTaskSelect(F("plugin_145_temperature_task"), P145_PCONFIG_TEMP_TASK); @@ -210,7 +213,8 @@ boolean Plugin_145(byte function, struct EventStruct *event, String& string) P145_PCONFIG_RLOAD = getFormItemFloat(F("plugin_145_RLOAD")); P145_PCONFIG_RZERO = getFormItemFloat(F("plugin_145_RZERO")); P145_PCONFIG_REF = getFormItemFloat(F("plugin_145_REFLEVEL")); - bool compensate = isFormItemChecked(F("plugin_145_enable_compensation") ); + //bool compensate = isFormItemChecked(F("plugin_145_enable_compensation") ); + bool compensate = (getFormItemInt(F("plugin_145_enable_compensation")) == 1); bool calibrate = isFormItemChecked(F("plugin_145_enable_calibrarion") ); P145_PCONFIG_FLAGS = compensate + (calibrate << 1); P145_PCONFIG_TEMP_TASK = getFormItemInt(F("plugin_145_temperature_task")); @@ -263,7 +267,8 @@ boolean Plugin_145(byte function, struct EventStruct *event, String& string) { float temperature = 20.0f; // A reasonable value in case temperature source task is invalid float humidity = 60.0f; // A reasonable value in case tumidity source task is invalid - if (validTaskIndex(P145_PCONFIG_TEMP_TASK) && validTaskIndex(P145_PCONFIG_HUM_TASK)) + bool compensate = P145_PCONFIG_FLAGS & 0x0001; + if (compensate && validTaskIndex(P145_PCONFIG_TEMP_TASK) && validTaskIndex(P145_PCONFIG_HUM_TASK)) { // we're checking a var from another task, so calculate that basevar temperature = UserVar[P145_PCONFIG_TEMP_TASK * VARS_PER_TASK + P145_PCONFIG_TEMP_VAL]; // in degrees C diff --git a/src/src/PluginStructs/P145_data_struct.cpp b/src/src/PluginStructs/P145_data_struct.cpp index 8f5799bec..dbb10e9a5 100644 --- a/src/src/PluginStructs/P145_data_struct.cpp +++ b/src/src/PluginStructs/P145_data_struct.cpp @@ -270,7 +270,7 @@ float P145_data_struct::getPPM(float rSensor) return (sensordef.para * powf((rSensor/rzero), -sensordef.parb)); break; case p145AlgB: // Miquel5612 Exponential - return (sensordef.para *powf((rSensor/rzero), sensordef.parb)); + return (sensordef.para * powf((rSensor/rzero), sensordef.parb)); break; case p145AlgC: // Miquel5612 Linear return (powf(10.0f, (log10f(rSensor/rzero)-sensordef.parb)/sensordef.para)); @@ -294,10 +294,10 @@ float P145_data_struct::getPPM(float rSensor) /*****************************************************************************/ float P145_data_struct::getCorrectedPPM(float rSensor, float temperature, float humidity) { + float c = 1.0f; // Correction factor switch (algorithm) { case p145AlgA: - float c; // Temperature & humidity correction factor if (temperature < 20.0f) { c = sensordef.cora * temperature * temperature - sensordef.corb * temperature + sensordef.corc - (humidity - 33.0f) * sensordef.cord; @@ -306,7 +306,6 @@ float P145_data_struct::getCorrectedPPM(float rSensor, float temperature, float { c = sensordef.core * temperature + sensordef.corf * humidity + sensordef.corg; } - return (sensordef.para * pow(((rSensor / c) / rzero), -sensordef.parb)); case p145AlgB: // TODO Still missing a formula to correct for temp/hum when applying this algorithm break; @@ -317,7 +316,7 @@ float P145_data_struct::getCorrectedPPM(float rSensor, float temperature, float // Do nothing, return a default value at the end break; } - return 0.0f; // Default value should never be returned + return getPPM(rSensor/c); // Default value should never be returned } /*****************************************************************************/ @@ -429,6 +428,8 @@ float P145_data_struct::readValue(float temperature, float humidity) addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: RS= "), rSensor)); // Calculated sensor resistance Rsensor #ifdef P145_DEBUG addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: Ref= "), refLevel)); // Reference level for calibration + addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: Temp= "), temperature)); // Temperature for compensation algorithm + addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: Hum= "), humidity)); // Humidity for compensation algorithm addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: ain= "), ain)); // Measured analog input value addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: ovs= "), ovs_cnt)); // Oversampling count addLog(LOG_LEVEL_INFO, concat(F("MQ-xx: algorithm= "), algorithm)); // Conversion algorithm diff --git a/src/src/PluginStructs/P145_data_struct.h b/src/src/PluginStructs/P145_data_struct.h index 56a9e788f..205b76eab 100644 --- a/src/src/PluginStructs/P145_data_struct.h +++ b/src/src/PluginStructs/P145_data_struct.h @@ -38,19 +38,19 @@ enum P145_algorithm // Members are preferrably sorted by memory alignment struct P145_SENSORDEF { - float cleanRatio; // Rs/R0 ratio in clean air - float para; // PARA scaling factor value - float parb; // PARB exponent value - float cora; // CORA - float corb; // CORB - float corc; // CORC - float cord; // CORD - float core; // CORE - float corf; // CORF - float corg; // CORG + float cleanRatio; // Rs/R0 ratio in clean air + float para; // PARA scaling factor value + float parb; // PARB exponent value + float cora; // CORA + float corb; // CORB + float corc; // CORC + float cord; // CORD + float core; // CORE + float corf; // CORF + float corg; // CORG P145_algorithm alg; // Preferred/tuned algorithm - char name[8]; // Sensor type name - char gas[8]; // Measured gas concentration + char name[8]; // Sensor type name + char gas[8]; // Measured gas concentration }; struct P145_data_struct : public PluginTaskData_base @@ -65,12 +65,12 @@ struct P145_data_struct : public PluginTaskData_base uint ovs_cnt = 0; // Oversampling algorithm sample counter float last_ain = 0.0; // Oversampling algorithm last measured analog input value /* Calibration static data */ - ulong last_cal = 0; // Last calibration timestamp - float rcal = 0.0; // Rcal, calibration resistance [Ohm] + ulong last_cal = 0U; // Last calibration timestamp + float rcal = 0.0f; // Rcal, calibration resistance [Ohm] /* Sensor value conversion parameters */ - float rload = 0.0; // Rload, load resistor [Ohm] - float rzero = 0.0; // R0, reference resistance [Ohm] - float refLevel = 0.0; // Reference level for calibration [ppm] + float rload = 0.0f; // Rload, load resistor [Ohm] + float rzero = 0.0f; // R0, reference resistance [Ohm] + float refLevel = 0.0f; // Reference level for calibration [ppm] /* Sensor type & user options */ bool compensation = false; // Use temperature compensation bool calibration = false; // Perform auto calibration