From 4649de8fb52e1b8c48d8b1f51464ab8aa43dc956 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sat, 30 Oct 2021 17:52:12 +0200 Subject: [PATCH] Add module partner_email_duplicate_warn --- partner_email_duplicate_warn/README.rst | 1 + partner_email_duplicate_warn/__init__.py | 1 + partner_email_duplicate_warn/__manifest__.py | 19 +++ .../models/__init__.py | 1 + .../models/res_partner.py | 48 +++++++ .../readme/CONFIGURE.rst | 1 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 7 + partner_email_duplicate_warn/readme/USAGE.rst | 5 + .../description/partner_warn_banner.png | Bin 0 -> 56447 bytes .../tests/__init__.py | 1 + .../tests/test_email_duplicate.py | 127 ++++++++++++++++++ .../views/res_partner.xml | 25 ++++ .../odoo/addons/partner_email_duplicate_warn | 1 + setup/partner_email_duplicate_warn/setup.py | 6 + 15 files changed, 244 insertions(+) create mode 100644 partner_email_duplicate_warn/README.rst create mode 100644 partner_email_duplicate_warn/__init__.py create mode 100644 partner_email_duplicate_warn/__manifest__.py create mode 100644 partner_email_duplicate_warn/models/__init__.py create mode 100644 partner_email_duplicate_warn/models/res_partner.py create mode 100644 partner_email_duplicate_warn/readme/CONFIGURE.rst create mode 100644 partner_email_duplicate_warn/readme/CONTRIBUTORS.rst create mode 100644 partner_email_duplicate_warn/readme/DESCRIPTION.rst create mode 100644 partner_email_duplicate_warn/readme/USAGE.rst create mode 100644 partner_email_duplicate_warn/static/description/partner_warn_banner.png create mode 100644 partner_email_duplicate_warn/tests/__init__.py create mode 100644 partner_email_duplicate_warn/tests/test_email_duplicate.py create mode 100644 partner_email_duplicate_warn/views/res_partner.xml create mode 120000 setup/partner_email_duplicate_warn/odoo/addons/partner_email_duplicate_warn create mode 100644 setup/partner_email_duplicate_warn/setup.py diff --git a/partner_email_duplicate_warn/README.rst b/partner_email_duplicate_warn/README.rst new file mode 100644 index 000000000..d8c920736 --- /dev/null +++ b/partner_email_duplicate_warn/README.rst @@ -0,0 +1 @@ +Will be generated from the README subdir diff --git a/partner_email_duplicate_warn/__init__.py b/partner_email_duplicate_warn/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/partner_email_duplicate_warn/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/partner_email_duplicate_warn/__manifest__.py b/partner_email_duplicate_warn/__manifest__.py new file mode 100644 index 000000000..d8f8fc6e9 --- /dev/null +++ b/partner_email_duplicate_warn/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Partner Email Duplicate Warn", + "version": "14.0.1.0.0", + "category": "Partner Management", + "license": "AGPL-3", + "summary": "Warning banner on partner form if another partner has the same email", + "author": "Akretion,Odoo Community Association (OCA)", + "maintainers": ["alexis-via"], + "website": "https://github.com/OCA/partner-contact", + "depends": ["base"], + "data": [ + "views/res_partner.xml", + ], + "installable": True, +} diff --git a/partner_email_duplicate_warn/models/__init__.py b/partner_email_duplicate_warn/models/__init__.py new file mode 100644 index 000000000..91fed54d4 --- /dev/null +++ b/partner_email_duplicate_warn/models/__init__.py @@ -0,0 +1 @@ +from . import res_partner diff --git a/partner_email_duplicate_warn/models/res_partner.py b/partner_email_duplicate_warn/models/res_partner.py new file mode 100644 index 000000000..cf83a48ea --- /dev/null +++ b/partner_email_duplicate_warn/models/res_partner.py @@ -0,0 +1,48 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + same_email_partner_id = fields.Many2one( + "res.partner", + compute="_compute_same_email_partner_id", + string="Partner with same e-mail", + compute_sudo=True, + ) + + @api.depends("email", "company_id") + def _compute_same_email_partner_id(self): + for partner in self: + same_email_partner_id = False + if partner.email and partner.email.strip(): + partner_email = partner.email.strip().lower() + domain = [("email", "=ilike", "%" + partner_email + "%")] + if partner.company_id: + domain += [ + "|", + ("company_id", "=", False), + ("company_id", "=", partner.company_id.id), + ] + partner_id = partner._origin.id + if partner_id: + domain += [ + ("id", "!=", partner_id), + "!", + ("id", "child_of", partner_id), + "!", + ("id", "parent_of", partner_id), + ] + search_partners = self.with_context(active_test=False).search(domain) + for search_partner in search_partners: + if ( + search_partner.email + and search_partner.email.strip().lower() == partner_email + ): + same_email_partner_id = search_partner + break + partner.same_email_partner_id = same_email_partner_id diff --git a/partner_email_duplicate_warn/readme/CONFIGURE.rst b/partner_email_duplicate_warn/readme/CONFIGURE.rst new file mode 100644 index 000000000..e7dc23597 --- /dev/null +++ b/partner_email_duplicate_warn/readme/CONFIGURE.rst @@ -0,0 +1 @@ +No configuration required. diff --git a/partner_email_duplicate_warn/readme/CONTRIBUTORS.rst b/partner_email_duplicate_warn/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..ff65d68ce --- /dev/null +++ b/partner_email_duplicate_warn/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/partner_email_duplicate_warn/readme/DESCRIPTION.rst b/partner_email_duplicate_warn/readme/DESCRIPTION.rst new file mode 100644 index 000000000..6d6d92c4d --- /dev/null +++ b/partner_email_duplicate_warn/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +This module adds a warning banner on the partner form view if another partner has the same e-mail. It helps spot duplicate partners. If the duplication is confirmed, the user can then use the native partner merge wizard available from the partner tree view (menu *Action > Merge*). + +.. figure:: static/description/partner_warn_banner.png + :alt: Warning banner on partner form + +It is similar to the native warning banner when another partner has the same VAT number. T +his module has a twin brother named **partner_mobile_duplicate_warn** which adds a warning banner when another partner has the same mobile phone number. diff --git a/partner_email_duplicate_warn/readme/USAGE.rst b/partner_email_duplicate_warn/readme/USAGE.rst new file mode 100644 index 000000000..0e67ae8fa --- /dev/null +++ b/partner_email_duplicate_warn/readme/USAGE.rst @@ -0,0 +1,5 @@ +The warning banner is displayed on the partner form view if another partner: +- has the same e-mail address (independantly from the case, from starting spaces and ending spaces), +- is not the parent nor the child of the partner, +- if the partner is attached to a specific company: is in the same company or is not attached to a specific company, +- if the partner is not attached to a specific company: is in any company or not attached to a specific company. diff --git a/partner_email_duplicate_warn/static/description/partner_warn_banner.png b/partner_email_duplicate_warn/static/description/partner_warn_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..1db912e059448b204576a5dba473cd798a9bc8c7 GIT binary patch literal 56447 zcmb@t1yEc~*DeYnKyZRPA;C4cOOO!U-95MtgF|q4cXxMpclW{F9R@wTZ_ar~y-Rl9o6-n)BNKdWUut5*lfN{b@FAfoD^U~TLG)Uz{!FtM_>G@`RNuro5Uvj1)Ea1PbM2LbT~ zLQMFFqEqS#2&jnxd>y!4IH8v~Cp@I?gITN`Sac0NY}0aK01m~i?naN00T1)BW7hME z7=xyI*IZ8my}Y31a_^ffjXXRd#9@)lNA|%^7dY)L%r)ytOG)k%zz*h;!s6nuzNmtq zNPH{t#{9~?{=G#_;D!VJ^9)r`HObfNpZpU^sia`T-?z%-SsMSo{6rHoN%yyOoY(=@ zza_edNgWXWEum+G*6jDUYNk^JhSm!~6;ZYX>}uf4k9Y*&I&J*5Tpw3%&x~%6I{TyQKFF>edHK zFkMBa^4VSp_PT+Z*!OQwPOo=0q7uli3D%@zTcU*tT0$VRq1CGBG75)}&`kygb@%_a znjWY%PF<&V=mze>@>o;)@Cu2DyOi>PL%bR$a`I?|KukB7yQtq5tei2dzfi6jJen~5 ztVBJ79JNq`(q_@j)SeUri$|`F4&BfN(_7xjPheW?ow(%j6>C%`~kjy+1fQH+?zg>$yFp0F18lg!&Vk z^1;JWzf)7;LW1&`O$Rah%zget)_g~qmAv^sJi>&mS zd$A}69XIZ%6jZ8Fv-1bs{9vC6R}lqx&Rbmz{Sa4vJR)jwcu=%w(oO6#|h zbbrPqzJ0b6RpMe0(;S%4!8ddfkgh9_f~1?xVf2lLogz9(MKEp&>pt_hzfAh@g>C@y zu_3LvaZfPP33sw++)<$Qc~>a0>57Z60%HJMncnuRgWa&?f!50bF1J6N%1vL3#5%IW z4=uhR{Q1gTU6`gkR#l7C3*@7oO0gImyx$SK2WYQPOUT2Dx-Xiq)tuhuuN=NN3+r!7HgC#k-aiQF7=^PU4Y&27I7|{JwiLozaPA zd_P=*wkGRZ02{s*U|bjxj-ow-8`%X3Pmvn=YA+H50fgoG z7s0e+AyAR;x7_{sXvadV43el&f}Icz07=jjGiUy#iA^Jv6|dVx14c~pes>%YSN+e#U1%-{H&??AXLY7Mrk#^o36{N5 zJ#4cWr-D8eG#g!S1?L*vjpKPM>)rOnRpo1dc`FXVLXMax7*G0Ssq3>PMh@Pi!-8?? z){HX^XEqEPyTzv$Z!JcG^`3c4F-7Qpw8Py{&q^o?Pmr*n8Vbx$R|6p`SFEvp6$4uK zRUR~cd}s+hcn!1>I6S7%bb9!@fP|~f1Pv;?ApOD0KR0l8+0Pe5j%PHT1{)C1D~G)m z@uwzT0SJq6CEqC7(tkv0Co%!6JnqHJjwBm}!-~&mEUApo8;GlQfsEyHLO59Xe=5o& zcL+6>+`H2c62B0vXbb_CNG*7U{X7YBxQ}Ma;%hv+U};ws{9QAg{E?0%7>IdAOkEd~ zWc}AS+8>%9QL#3K#q?o%wR%ofkVtxGA|lta4z8mI?eK=^8YGPbP}m7roJp<3^98Al zJ@s)RZG~`WDKK;j;P29otN)qex2hLRu@sSvb})RjLb=mV{b8W-T{WcH_mYAatI0#) zC(>7)*CD!3j);jE2YtZAWR*r*SUy%rT}8GxOw1(gp}Wf-NZ1Rvz%C9TjVp6Vp}dyu z-DT&xQb_i}CHxhs07@Y%0k2}{6uWnd)v=GK5R{u+D3p>lsoj+@QoJk$3jl1P8W%=V z$bhnn`Qrr;#2a+`5(o6;>MzfU8V$1G^{gXJ$dzPnS3%s(w=KWTvMS`K2dpebX$S`O zK~;nc#;W&Z?eKKN22A~Yvck_Ph>27W)0!2?Cd9z_iZi(qo*N5A8i%CktHFIb9Pd`o zup-_*fOF<F(o59ILydA*;LjL5tW0l5~aB-_DqOkqvUJw z!bXTWk}Sh#=)QYM)*sm%j~PHKJm&1H0o%g$G$8)qH_xkGtBE?{j)-AR&!aqGSAB8c&E89bPzY}?AbLck{GI5 z3!aYil;3_bcGA%Z9kA!rUdTl|`_n7R-jw1uj;n(LJ(oRwR+kh^=wqERv`!SrN7x8C zTK6;5t52Rk?@*Y{REg_rfZwJ&*Eed8+vAZ`wU>kK`SG~mdbUL~#bIW9PPHXjgfR5W z2C1!}6<0@sM##FoPq5WKL5K1SXmLlgAE%MRZ*Xz`w0)qwyCFjT)5aMCB}P^YpTQ!))yi@$KhNHq$D0TOQ6Zvjm)< zeNF7n-^^?x!YG#8;|)Zsm)Bpl^3Dg4Cf;I9%8%x9TcV(SvXC(m;_Y1^p<4!jAlg`# z-a4!Q7p&*Ey5>G*ANpVn5=_jfO7aP~U7qS&=~7`BbWAW5SjjM{o#y$A8#y+nX?v+D z)7apse_Lj5J%~k5hYZmb<~BA)dv}{58Y4j>8O&j*=*gyD+|RIiU7Gv zCs2)B!RVvwk)y3|`P)b5KYj&bw`Kbrpzlo%`9)E)no=41_1l;yBsbBBiE&7l&10u* zL7l9DE}YVk%JG=hV3FlHw%}V=K0TV5!sTJ1?}q5?O@yo@HuR?yn_==`Ogb^U-KiqC zHYB6pRjo3y!Us4m)Wmmgq6bO6MDbp)8@|a~dkYD{o#KkTLCQTeEU0vAii>e_h(2x4 zTCBm}@qW0R&1F?=^^cZ^il07pyIMH492Zwn@`HPjN}#01b4aF^CMSz_;YoS!{u&H_ zJ;YGdpWB#mENSZqHO;2KwyVfXzC_1oKONnA!;kZ@jlp3a<-mgts8G6KhdR zRiYLRbI}3rP$S=6*}jf~$d4pwSQ!SG&F zS)oFCd$Y#vU<td1r`=xX>3QJEYI~JxtA%hsP2oVX%WYQ-){1SuCcB zv{!+}gtwpRk^&O%Ut!`2N_o-89UMPCEaenpNuIt2h6j`I`k{BZ2cC#CH{?b7z)I^o z1{(|DzjWNTJ)-XxMrSyAov?91)0BS}hNd(;UG9!LVrG;t;~Z`VuV1{>qt9AbsWZ*f z>X|5UpquFQoh13#j4pRZ>maP0nOjg9tpm>)@2`p9@~Ba)c(cP zqrnJ#Yf{p$vv^Dj%!OvmfQHM=Vn?*eiGjbihWvb~)sD~CJK;z4 zGxL!8a{rT_C4zDGEu7CirA`Hp7!}w0H@!r;Zl1ms{6)sULb1pDndI*b?Yd9KAK-p) z(9|YbFXzmeb;?UGuPH40xlFAr1bi>}cB0b|GS{#BY#D}Olxldd2NkTG$HJV_19lXC z`1su_m3<(d>}m0CGz)v%!y8W-1!w0++}5# zYV5!(uitN|$H|H`WvfCmRxk#My9uDkJcx`x3Tg=}6&B@7Ygzc#WBN^qgW>wC4*>^f zRObfP#JeHN2H<#VUmR8;#z4oO!PjY_4nGGCb;&dQ93=`3_yE8)2Olmld6TdAqoN?G z--}5edj^8d6RNo%rMEQhf+n5NK>U#an)>T8Y#10(=#A_mQW{$dSDMry!o`-fmg<8~ zE&5FEG3^EeZ+w}*e-X5;j_#13k`Hb8RA`MKGFpBcV5VXU>+5jq6-~0eL9!i)P8c0; z8<@OJ9>Z+o?)X$kPZ2eiVyB+LOKo)%OzfrOB*U}RyC)(s)f=#BNWCY#MURZ7Hd(@& z$`dPCucGteg!Q17+6Xs@;1?Sj8g6iavX3%?+1ckiisl(^+T=_}HZve?$Up7?dY!cO zf|fsFE$mQ_&bm4(QdY)9hXDwKqecB&TOuczwwlaMqA|pwa+SBY1rZ&BOGP}N%{k4kKbK*>EY!lt`O6e22}+7EY$fG2Tmiiep< zE^4%$JbLm`!>^Xn)7s_Mv0G7bG)icRlz8}CiKLHC$8TdDPz=%OY7U+dSBdf*Dl@M? zM9TOw8=axGMz{YqTd!1_bVfZFR8F5#%D|Z~V(?8H4wjy%a?O(i&B3bc6#r^e@yRy= zu0-LZAhe6K0pH_t1B=9O$<30=?ziXxTID5Wz$ly0FrxtNrb6DEhDuIo6ID zR!HGL0T0# z1K3frtEK4Jld$OJz<`Bf~A zr6c3rB7JM|Tzc;ZbgX@1%DoLthe(Myf|u<{r>wyLuncmR^aq=L=CXwjBej3rMz%`| zib|*TS`FGZ+MO~L($D$%Xw!C z&XP|ySz!x=vT0}{yF6Z+R6p%C1uF20z z_Tm;`irE?>K3r9Z)w-%B7dv8_G?7+Zj1eE3CC760hr%~*u&ThojsQ(ibC~N?TYkOU zy$RZ?P=}~a51dR>Q5ucXhJ_*0H3Cvn-|(&c%6aD?87}nB>(#KE6Ew$R-|iBm_-@o= z0AGD?hdkyP)%f4v#cBSc`WIi{|JGl(Pvt=KnQ&8pSr^_e( z{Q7+VBd%+|^1ydRIXWEjfjWZpMSE*MYx4i<={j$?v=>K;kI!km+bJ*5|1?vdx+r+J zeCyU))jG!_E%fu!sRHqpnLi-#xPbY2hl_7rPAcG@zxM0QID4Y~e#4HsLoZKF?D;uD z-rN?85tZKhb5rZfsmonPVP`*cBILI9cGAG!=SUmlhjnky4z*+ZN6tWHZK8#Acs`)$E%#Y|n`NLJZY zjEsrYmLEZOH|yx}>wD?~MEN{!p=F_rmZc?yflAGJ+Ee2bHvgIH9$otRxleLRCyI6Z zFt6wQ#kQ-;OwLNXk1Un;oyyrFcO3C6AD%mKO!<@T58Q~iUgrBTGS6ut$sw^^b!dq@ zdJi?O4C0R0*j^HbD{xKDh1t2Pd_rgNE#?FGc(K_IHZF#I+Vq5tcn8$N*A4b-TE#8z zGg<_-5@3Z|vNNQ-Q@ij|?03WYt4XM?_bH=t>8Q~>27f9*x_3PA3kmBVgR*vLB}TlX z!g9Wq!cuw1XVP2X%6ul!p||gD%ZiGP_$^$eUB2l!h24p=nFIzF=IX@Uh*UabVmeff zXR*eVy9qZ(uB(4_L&9*i7>E4Z-v6T`oxJOUgmXtygwjp=y~0K2!gW6 z`eJOZ$C;=2^nBIqzRWmn6FwcBg7oHL%eq2M!PHbUTZTu;7w3~#-u@e(%R4E{M8#eS zy6HFrb?bhR%l&Ud42=cI@*rQ5&?3jCm7Eom&4(6UQe*ZfPbcRYV%6>?x0*U8wj%CP z3^OC@H|baKvdh!DczX!p(rut?vH>5Za7K6yK&2~sT6B8rC>a;yE$7$&TxZilIEoN) z-dYHWD;E!|&Ly0hGY*0X1#G3eva?E>=u532wV7=$K26pHeAnMyslDdR)>~<;>zAWS z=uP)6Zlh$b;F}~3Tzll1oWrZb|fPfYs5z=-Vs z=&g)GgaiC6f%tuq`1%RhfZmuD?_R^HXnBmejc{Vbb(!8J<@muVOUP8$NxAal(*V`&2J zAR$$p_OfyKn?~>>YdFlFB$kJJD)zcsH|7r|T8{@fEDqkG6$uJd+15DrjMr}{%N{-V z_W`!Q*AUzk9a*oHJ$^8N#5^8Xpq`IIXwl>-kxy5qz46>&r=zHKn`E?(4-Hjp+`WD!ikOzIF0}P$J#l(rd`)Bev(WAm_J=J% z?ctf&`9OqUxs?x&yR%Y{Pvh;8Z$kQO>YZ>QglNf&E!HmNN!?Y)8ogSwvOJjWalQ z2U35k$rW1IjEk1)pJ9EYS5j(m;>yH3CHS^~s+D6EQWlqygy=fN{HP`IH}GoPOrsopLhlcK;3dX$T|A78aLR6obALTT z{cYy$>C?8*sh884`y(FKdX=}OQVb5tZ$XpGi?FFiv##6Ws+$@&QL#Gs@aYBN_vLQV z9k+zh239#z@5Wf*m%&E)?!mC-=(_f@#|8}7(ahv|^kX!|`jWU`G1)_L$5r>J0EWOeYNuDb6#oUw&8NEp7XujQc)5>k zmZ$YQm)HDn-FJ-%PR`_+wgcU@b-~`^9ORQkUqrYz%geMV} z0HOagT^olQ{lGg>ymx~+-vrfSR-$LgHel=rD#W)RGhLa0iEozlI4-@GcBJ{1sNO#jA-(0N)FID1jgF$lw*K|Bcz;Cv^Swr8)Wumx zvutZ_57OG|IvWNF#!ZM6HE~#NDf7!pmW*-xN2`ozU5@eZFclTz>Y|$79s^&LkZ%W+<^%vz zA?JM-FiiH*;YR0fgL|d$)YtcyVEhnDT;{YW6W1r}caNYXK;s^*FALWGtaK;Ddgj+D zu}{zZsmVfj8NlSZhZ%Q$OHbiZTl;jzh);1Sd0Cl7msjN97IX#>%2jshkn{g2*o z&%lX{rl2+TBZgcHar|*D>vl=7#QAk+Y==TNivD1#=hYpEcj}0C^>$&2=cVEp=dt96Xw9c1|8#P-Z|RW6LM|ml1R^XFu{xt9Yn^fr01h$Isql{ z0&8npZy<2sb?DU8I)?d@Bp)G}MBu+-0aD!pOt1)gvLiPCG+2v*kD%_5p1JRDtwD8$ z3&T>gVGqnXn#p|S8*DBggu>p8`YO2A9tQ$qTOX~{lQZ+fPVWazlZC0G;4)Gvh`$N{gr*2y=s1d!ed8Ae@9$z%H4N<`X( z$o|Bf4ANI|*utOER?9=cjw*>E@Xd6`9t(|0>L>~A;M<3}y)E+NpP!C77hXynM-W0i zPq3*4&o)wsiSl$3=&#xxhHQU*vZXpokGE1l4taZ$Xc!fL-{xMbB7FIvao=H+Rq{>) zv!SM=RQ@G~|L1WA|KV!?P1wS`-((rvvsU=BPQA28;WbcfJ_vQ5;z@15@a28QR7&%= z($P^7*t|kmqt0ZZ)v>3S4u5B3LtSlfN=j6;R6Tt|mx3xHfg|w*u3Y2;BqY6gl5#CJ z4xZLZ?o!>zrooxp;Y5x;VO)CAW5ho>ne z{8v21*6NU7>|YA}e<|GJKQLIGueD(}Bmb>ka~`A4sqPuE_1~xrROQ^B{%gU7AAiaB zNb=3$|5pgdf9m{ip#49M2x*ocsLZVa-*PV{8m3|Qd}HMP>M81i*4s}Sh|L9|xS1NIMR9??MT zGm?#?^CqQm{C9uH(BW1=R(krvn2B;IR3Sid|J?9=8u)NW!wg)r$Fu@XYnSV;JhA0J zd~~dnxBMPm^+1FS)7Dqol@5}lqM6#{zmf^Hv1=3N3M^L`U5}%q0)Rs&Q(^-IZo|bWn({k5#PHZAzMAZ~C13 zr&!4EnPDXAiG2CZ|7Gi07NLDVz^@O{^McPs6VLj@KELsfq8O-K<5h-od$#tXW;;;v zhVhvExapKsAw%N(zzuDM z!NxTQTTmn3(nVvR*o(93D_c&orH2+`DT>VG^5JQ^NO$Mm`essNS8kOhjs2`$MxH z+F1mzc6hGc9lLvSe3V|`&UGi(5s3F~V@k2}*Q6~zAxba+x{0;EF+j%Pr0#xdr0sB| zMDgvBlsI3qr;F*PT6%*tUnt*Klta4vvyH>{#JKf=FoiCJ5iG*@Fyv>R z?&>XI$r|v=9z&Ki(*&-N`CM8?a#~WNdj5=euQTVfP4m|CnC41ZJioQU9QdQ=tvgV= zys!`9VQ6=cC)R@lT;2DUf(SH*WpSV6Ile#`L$Qo=0NcISsw#+fNxp=tC28yiZOia5<$LJ0YKgJQ|QMYZj#H>CVUwiPbX!ikocg#uKQ{m*tY1e6m zUOen-Gf;)%Zy&gf3l-zgpq~}-cKSWXr7O)o&(-P<<5?e3+yki;er}Z3A86a%)qQ@S za6fb2?-BPws-R#Oiz7(i+gm2=euM??pt`TH^IYvO;2u@}$!LEFerChFI8w4bDWFhI z;P)Mpq2K%SWYx!aDWZHv_3;)1j=xp($D&T-zD|kr%_Xd@jAx2vk+F;9OJb2bAzUg~ zga(C(9_K3@|EtrdjwIrXjr9(Fbq9Kly*6nVz%|~AFA7B=`5$yYtnUR;0Qs(bwy09? z$EzSo-mIyqLeq?^5i1RUz6*4jwpuUFD$J8-XE+h0ku2p>y@kzoN%zNZKcRnj+J!>3 z9OHm*)L(D5T5i~1J0C3vezz?eOIv9KjIf3{?eT{s5jqFc(J0Gj72`zfm`uSyF#^Z; z|A?LquwJ?{NrugsUf^A^Fq5MUWR+nx3`?Ex&PPzmy!QH_fFc&E-mXB^?l>!20d+{| z$%9MPA7>7LP8;)L9~)FF@H!K(pl~+W|#i_;iA`er<=5WJ+iJ*ss1Xxs&ID)l`_$Nag5 zGiZ+jW|Y(zn&`m$y`8tbyHzYy^j)D`uKi4J)tH9?BYGwc>YAHE1I`$H>$) zKZ_#Uo%|>7hijj9#F`?*-7|ICaA{4~HiY)^a81t&Y^ZFWChJnd`ZgZtXLXZROxco> z#q=VR`81EvTehgmQm-}+`%};#9_Kci@I&a)bt8*yUYJ?SZ<{u>%o$o^+cK;Epg+K+ zG`%C;jACfkkhb+UF^`FTa1Vci{dpMU4nvZJ{D_}j`moaddT_%ri}4$nSa^jd6DzX% z8sp`)GO^&5F~I|{USlf?LyZN`{u-AN!-MNF0pz(l=?JQN?u=M}m2@8Q5t}ocr(OIr zFzU?nxOK0IuhD6U0NS?W_t9cY2 z`8Wbg8mIO>-+fS~qcmsMnMH_vRoFV=-MQ=@HD(IXaz}uFXJo>u1q=m%kD8YpKHYAW zz##q3lNLBCO(8RB?#p~D6j*di-0!DYf~#p&_qYR#DQ~}YtYtA79@n197Nm%LL&}K4 z#&Nmvq5PBMiRFJvpK1FU4d#S~!}qRrMMTmN>w1BZrPQ|33M8fVnB71#nIYvEbie+v?$+Gy}mMq5HT?;lkAUhqh_h5I7Pu{zzYJ zLD7524N5gdoZY~2fOh{Xw91k+v7&`Qvtk9J$-BgrIt(ScxFXY@@u3-bB0Cf^6xJ}!XrhG$4iiNrMgLM7$j?UnB}2dH z8{?4h&To`Q7xOA$wb7(1c56*Br`d15poK5QM6JU~MB#X~!QO3Y-dXt|=E=QLwj1I- z-;A~om~$s1)66cd=)9>c9FH7K&WVJ6hjSPWaoBb4I2=YiMD^+xt)ggq3Q|&G&|J#} zigAxt8cm9`lpG>F-C7JCBBc^4k4gt{_^v3MRxT`epKp#1B`g8Z#k=3BT&1V%k8*^; zEe89`35&Q3+euYX+jKtV#o5Jmv$1<}InAiwU)|H4wvby{9NPKKU_Z07A&ZvLoqe`# zTtPCLO!QbZKfMeN?aQkt@NvN!2qMQ=cojxT7w?$yR6*NVH8h#JA$`4DNV2^y2@R@+ z>`Pe0UpL&7s$jD6VotoKq^Zetk<{HfecM~sASNk)L;b*$CQz20Ey)%0PD*$8Rx8Hj z%_$j*I;k?-LIRRKoR&BCmU5M5=s(F6$Wv1YF;ulHa-|jZHmRDUR9NQ=Q3#tNg z%iIG~8wXo}N5o%KEH`h;5`~n^o2zf5%`?s5&D_{J<_s(h&sE-W;a_PgpXmLe6!E%> zdH{ueL!g45iy{u!jHbq82TuTk5*hg24b;cZKxa|!Ru5$+YYWqdgbjRh+&AY??vwNR z+@q3YVR_|b`fe=woFu1`6~`(iQb~>NkHzM%sF1AYW@qbSZ;c8Bz_W2VF-^AIwkTrn zjgNgBS*&G@km{qh`h(mX;b>CXkv{^Or4g4Zl&xr?LsW~RJKgNmVP-Cr<^Ph8OX9vu6n3Boi?OelhB#>*W|f|LERYcXV%m47^T zA3HT1@(_Icj;olg#d^RJMDoPxQ`i7D%rVilV< z4h#PT&(|oQfNUqRWVMYUDd;lg0Xwc}#r{k@Hn2495?^+@oHg-JLbKze9uDVn>yv{B z@4~~K!qP^x(0lL&Em-pkq_dqGPHIcKSichO({V3Wa0bg5>a2dyw_U!Xc^VVF2z$l9 z6DJ%{eoo`v6Kya>@$~&oE{2Zy%|G14j`pJ?g-+V+8b*rDwmZ-3fJp7!>aI>1}!SFk6O;w?+P+2b(DNo?Hg037!BR7IV6sy#z26@OI~cWDnAi{g%1(sGi!je zh?Y}ZKbdu6n|?*#+I+g$y~|7i3BG!9n4yaKg?Y{EX(|ym;KHL4LqYyf<|K@mNnJx! z>5hxd4Ju+D+FHAh%7I?{m}`l+WvetC9W>Tk6lQ&KtcMOotlGP?rhcWo*8gfq(^2}q zQ;m>40+JX7#LePS7nRXxvDjlCzgp8TkpP)kBvB|Axj1AKUup8l5%RajES6j{#nx5P z3)nhFUeWtzl?ln54|$kYDNqR~r4^DqKDj@}+UtV9O2;k8s?^4n@q3IHsl!$#R%VJ; zH2kPiR7id1zcayM#GPQFz&l3tO5bRlnzcw78SmkoosWxdI9_+-wk82v`YQKPq|1)E z+~qla#yRrsXAdXppF5F2_`;LjjytW-mQ`gdTp-7&LR#gy4I>^_S8&cUb&5gJ4I7cE zKVU+-8!M;b;iYxVCJW%=Q7ar@7BqVdsz1lkrcVpV?QEC7mi`QM9-^Rz+jCk?DJ#9bMaf3Su)UBrysWVUcAvZhVK+T>$~5 z5qfg?tf@Q2a|UCLd^n#eNooDhI?uAw+QV-i zv?O)C-XbNsIgqvDDIjeK#hT!(dGD-wL8Gcayfg@ls)wC%wk|AqyzbvH(b(go)h)8d zbxEDIh~8F~uU@kB>%GFXe;~~6s8q8yA?FO)8GAAojpfUQnWe0#Y@Z46qd?)aDMo3O z$!jS0G!xsYdE|y@Dd7QXWr`>`FUAaLSCS>;K0CPZ1{VvN%#632GwB|k?AFN%BTdFs zpC};jCm56tkphO$M|I-7iuwx8z%a_555Rijp*-oioCR}%shkxpMNjruI5x0i6L-*xI3b%EcG*G;ac_rcBzFjxXg+#S`O@~HwxU53b#8ps51f7D2sc3eV;f<&U3-Xhe^5{2bdn?N_C%ENb_)poIBBx@OS2lE zTtzbw2X8D$1Xx)$>21HLXbf_PZCC%z+)q_5tbI++DzUz^zrdF*jxHekd@YH4685tx z*mfIT75s|mQFqy8-ARW?xRMaZ{}yzrM~uEy!;i_o-iHl1x82{NXf&Q)DSg^Rv7jmH zX&?B#b?y?qX8DpC!RB4L=6E80E}Gc_Q#-rF<7LuR|J+gf@PIeJg7n2|6vM4r9FHy4&s(daishL6 z?3i%%`HT!=`48fOeQ?;hmeh|jd=Ew$+m}(21IuhK)d1qjM|J}TCswtJ1_v8_=sp1a z%o(NrST**8g(*qn4Vgq`0Y^B+)daF-bqPq|N6fy+-j~ute`l>_#Lba-5 zK^M(z(s4fLX10LTwj@h^D9(BBy}A9v#82o30gC=!ZhJGS&j=`sb`r64B*?pN_dg(O z&ad+$D(Lu9LY!T*{GKQpG?&;AGj{#-EUDH#hL$)rOqzx4Ulv;n^RyL|^^ zb_f{_B>a7s*uN0-M?t^&vD*u)gHZ;}^NRJ(q;xCNh^ePP!f@=W%#h+d)9jaQfWiXd zOK@IDTGL}+`%U|z^%lJ^>Iads#g(>G(mg!0F&B$lBs#tLZ41wRJ@Ne4-kU;Y-U^Wb z#bTM#Z#@K}8Q&)!H5l{X5+dRoZBJ+JH&^7Ui#5Bw6B;JZi7RF%%6%^XhE>f0-arzy zcP1Yi9>!v~!b-Jnpa;awzblhgne>o5MD<)YCwgFr{OfRc7<|+br!N19m^^brkC$D7 zabl3JtNglR@p|!dcx>EBWNkz#<`Lkb!JVQl95%H@ro;X3xk^nN(0ZHj-+hs(PzU+H zzWo3G*yaBfpZ$MMasH>e@)qOVVh}6E-)KF09+AU#=QO~96}P6u*56HpgoMY{6)xut z37m8J11q9hGTncr4_ptKUs6$;$UQ5Exo{K$9%EU;t^D1cNFC}EuNhsHgRsVIo{*#@ z`FqAR@Q!t2B#dsu($AW(Kb!npeR^Y0LX_sa{@zP@z>en=Hv~_cx&0Gf*Vu>y0R#de z#Kpyz=}L;1H?QU6t7G$Mji@BlhUMe0b~TkT@0sq(F0o!_NfpGZ&JJsZ=3EXi*3>6R^d z7v>$LMowQC{->mW<d3ilVM<3dq7=d%mi1?f z%|bLC9@p~rEgxk} zUsYvKS6{0;Pq9{O(M$g~mp0+l=>m?p#$|S6o{bET4`WZ|fUw*XkRTE7}OnK1fSWFt30!&JA?smm>zI}G)0Z6hMw?qH@p49T~kw9cK zbO|G_qYf?2&DpiJj*D#Rf$wQ>xv9B1*{G4*q*>%^6yppC*Q6=vpBIk>4S373hi9vG zxds_lU;jx*+WUMU(3q11*IJf+{EE6stA@J6uU~^d#B7lW2v1RQalI~VJ$l;I*m=T3 z09%c!6z|z`?cvASV)9iM3WDtc{DGXTEL?ncf`EVk^s{EyE3Y@vtE3O9oC;nV)*%AF z0)Z7HM-DKxwFkQ9G=GGrPa|g7eP3I3Tr`wXy>@m!7@8#X=tBGqaM3%eok9%}0hLSS zn05`JC&H9V?Pfv^694Try9Gh-}_Hq6z7Ql2$@9EBdaHzS$3Qt|V_`qeRAz^Sm^~tAVXH?xzC%oS$L3L;jkyN#?yg?d z;Ypab5%5)W7kO};I-qN^ZjCcT8{Q}lMsDgyqwB5VD&XF*wAq~LU03CsIc**`{Kn(a z%}ca1WwMl#S`wwKGi9YS0;muuC?*hIIXQ$UhVrxXY>3zKpvAwU{3FrCfM|GaEt+KD z#rfS`G#d0cDW*Wy@AuE?`a^O5EQ)<2!2+g@m|0kKO?_LUq$%-x*Yu7ZY|V;<1SSW7 z38k(M?^hn%Cq##V(j~n{H?=>rv0ouNmv#g>IEN&o67a?TMcVxPCs``ii`%%A{-GYw zXE0c0ayHk`$EVDcmx`*7!*%>&RcE+N*uw)8LU)Z0z5LLiE&aVY5#HvOenb-UfCCs6 z_2b59k{ia3iV*3CpU|#f`S?C&pBY#aB$ywxSjW7hPvUV!DJ%kgd))rF(|9Np`0MVE zW00nei$3q@)~pm4D=yY>Bi-G}OD1jv1jA#Fr&4)In{>{aW@*je&b%VLV2kK~^|2ou5=5Is5IBf>Pk zkN9js-UEEwD?_3ydZo?wr-H7vwfb{zhshZr6y!X%UzKtIic!`(RDA8_g_J5=7n`)D zs-Mm4CEpPqC&%tyS%LPljqjV8DH`zc;Gka!|2czLrW~+mtkrQo@^|R$@0|tOZa+sR zsrg6BUcapQAtaD|`d~ap6cUMQec%97`gVmgp25%;Ta;xSgU-r&`woPUrx(6eo8?!C zji>WySp@|Yi0?QbN0ac8O(<|r4AFLW6f+weVWWBX^+Pnt4^5hgbU@#lys;!;%11Hf2rK=;kZi7yR+`*Af zj|Eox8{?siYAzRBnth_C#tH(ebtEz}@|gOM-<6eM;Rue6|`s1!@DHg|F3basgoI`N-Ka_|m|M3Iz}qm;{P zHFD|DFlGqz_KF&Zra)(HZ_iZJ(Fq+K#ID0rD*Qg%T3&X@OQPFSdXW6p+O9>}e{GG< z&7Dt#$+f*G*1Q@H-0rV5b}du#ZHFDTK@Bb%+FMC!=}-*O{?ytpF=b`aqDfrCMy>w@ z)#|!6^8F6&TbZR<7tQsrnfn}wdmMP9xN^~li_OMAf%NZyXAy)dr| z)!6m6*|AEc($(;NHO^fwp0LJT1V;$i(eo5m&sk&QMVEG&Ch4 zb#;iBmp!lu_ot2mgehf-K&DMkztb|XtELVJ?0~j@B~0mY{U-xPN3ZhQ8rvZg!Q{GNtj|^yoZ5nuMlLf8#;Z*g6J*W*xI*c zXr-r5GSST~PilxBjm~XsYy>jXse^XbWu4ZHl7tVVN!$Eys=xp0n*?SooTb0f_xz;& zgk9A)GJ^aDc1A;2J}56_EIi$M-KzL3s&UjUk0(I6qk^JUK&(T$E6xT7$RU*{yk_jgai^5>##qwLW_v7sCIWm zzu|=ds$sR$k1@aOx;#CkT?g``%vl!D(D7crs&u9el_Di3-e zzl%%3^iE7%EuXF0M0S5vIYt#>szif3S$$aKJHqZPo()SF<6JuAz?#}p*@)7RF#l;0iArwA5 z9V@AIbe_ot^xD@Tdyg}Jp)ioiCXDI}t&>@d#@!B(Xp;K$C?hygoYLDfjctF~lgeRk z)O6o<+ZfKB_%k+P2fw+E?-TzT&W|61jTZj?XShNeC@D-TdB1*P1L3$c)gyz6HQ%kr zqW4!CBiFLtE+}9sSUnHqa1a-!eVC=P)-v zpJv?3H|Z9MPe2fSrUBJRB%PM%i08nJ6BK+?WhqLKH33TcjTVs(P00Im**aB-VGU=u z*L$1Jm1VS7@x1mrl94#YIfwYjAuC$kDqZ&Q%WBj6gn$gSJY3JOF9i&%Qv@=;gN1cK z!u4tpoOW{G`|alD&Xd7}5a1VyGx`a8eW?ykZP#LmlDZ8X2E_#Vz;`nJGd3Cq1ay6j z?(Z@poWP!s1M?I(K;U+l25AE@k3BOwJxCpd*%j=NWEL@>i#GymIiz;717ov=RlJ6o}e%?O(Ji*)$CHH^DiqC08n7u z=qUjHyG38{56iZoTd`N2tj+ldW^tm!kHSYRO))#1=3MRPwm{&PlKf1uoHM${S-TqkNv4jVAI7FTW${`#f25#YA?e(J59}&XlSlGBW({&fP{LYx=vl!=wrSWkjXJ==#V}qH?+A_=c*r|@!JLxFgAaYM@ z3eINhZE>X>vwQ-;C2=vR>L-nK#~At+b#r=K>Vl`tY{ry;N43PmUfeal*+6kcygoDM z{`v*2R1}m7Z&T|7pb|cpUoN^!JS+OkwPs4TX86277T7&HviO~|zP2WVciuQ^V`GEr zn!QYXAOln=$VeP1lmk5o;JzcVWyKZZjA0_sUK3=pup_3X$z@Uqjxy|?oCM$6F1dZ4 zX#2|7agn0YqEgj^)6+dLu~f;~*g!S>MSolKzJE4&j!_myRnXS9RbArY#%=R&ZsonH z1zZ4tZgTPs&avLDt85!;eG3cF0BY&&^ge9XTIq6@E<|T&6+rj#SsX&^T}%Y(HMD-tq|>XpWWusOoeXAdpJZSJ0Rn3RI1H6chp#sq0VbghT{|MUQ;4KoQ}M!moe# zRrIg^>R}U!ne~T(O*m5?8cT z#bwEkGdZlq9o}O&3BeySzGxUX12CFWQJZ1T8S$hv5ALt;1PmHR4DE~pO9Kn40joGt zKjz$Y3a0h$&(?=WM+3hW22@os@9gZbct73v+dMHRSLLjgQ$NL=?z33Bq%O00-v7$b zP66s$07zW?0fNQn01L}`bJp{8rGbW)wuivB9SjEMn(KH!$2VqdOs4&!7vbWDFw;d; zMMXuu&4qEpp3fAx#jTqo#umKrK!F4BmF!*`ypWL4n*9(FEIfYuQjkW)U|CgX1d8B;-qZq*)(Trf zLqp)=pGLmLr)%Tg!D!si7MLcJ*#b1jbtXb*d?+L&YHMt^{B(3bm)fX_G%6;Pms(nQ za)BJKxwQv7#K?IVFsK)9okSUA~LeZJPp4&hUB1J@JQ?UC-7;R{y2w`rye6K2msjc|lueiOG_sjLK?%<8@_?AKhzqDBM@_ zy>D>{2V&?!Q_Cq9ciTd-2LPF&C_*o&1(MOd+OF$RYHDhjI5>v;6InD24E+N4YmW1) zUY{*2EUNYUpkEHV7Ic`uTLqkQ~itz)v(qJMzJnkdT z)o0gJ3RLvx=RZ&7iAjI`+FNTpib_ZbAW(d(jdr~8@p1K9qmc$5*e+NXm+#Ggh;qv< zH%a~&edp#I-TF%rSXW1snQ3I_kepUo*VJ_C7{EtI2k*M>i~};vYqDHqD%b5I1|GEs zPLW{ANiEvZteV3N42uqQ+;1Q-Gc%8+vO>toaY<(M7MT#8oE9q3;BW0yOG%gDM8KET z7@2ddtrNv3e2=OfZD{tkpR2ankLIB2-irFBpn%HH&mWha9rL5kB&|}729t)KUQBuJ zBIZybadfW;+ds>+eYG|Hrdf@ooc%i;X7au~qqYk`4sdxKC>F|p7`9H#&SHG}^vUhG zqKU6h*{`eRz0iBH?OcLM19HYInIa09MsiS_(&( zbm{bmEe)}zrp9}1H>GcV9nJAykl}H%5lGltyFlW8ba=RXERCI2zZVkZ7Z?bU%%mNG zM8H{na0Ziu##Exlr4Q8F=H?|aGCVgayi#S0Czauz9hDQ32Y47b`C`f4N-u3m@bnCXl5Rc8JSv=ZRtwb4DDfr+$AqY+mj)ImS ztH;Z<4H}FyGcy-Av+}MjvP>!Df`Y^&BO|cz@V!8G@aJ*-w{LnH!}|W_PZ6!hhyD$c+J)AO@G9c%iSSEAdJn-%~=IdfL#D| zITrfXvfsa}jYqM6CMWl9Zjw0ePYgUm`PuM>)$iwsIdkkP>1X@~JX<6Ce=xC(c+FH_h>1w-eQJD-*Bv4#VPAt%# z6fRXJgCoDrL5;GdDy;ZGV1Gm|OR z)hr*$Ku%7s+3k{yj-Gz|-@lOgGBv}w5=HH^=fmQh{LW6|9H2CxwVexQ@;E~K`}?N~ zcyey|JX?!PNNo3qW3b>Nrm`ABgF`^bKDQpu78`D~yMsJ7xR9yir4c*w_8kSKDGh)s z{MSfLl&+yCfpXe}ntbLE3HAOu6{bNW`hLR`Nmw)K1wt{hV{L~o+7b-O4Q&M20q@+H!7I<&4G)3>CuCFydMuqC?spl68 z^xIYx273CwWJXN|9i13IKTs6m@-1Sam~qJIVpTATIxPnLt&PPpu{k*;ayf!X-P}t&JUnhshsAmG7BxWLKiTXeiNs-s z1`+bPAOh8bWo>P(+Hqgb>vmr4p^xOv52(;5%XKi83+4X68a{82re1H4`wyeKZ{Q$6 zTIGdQi{7iGav5}CFfT=Txlamtwl{hizv@iXPFRQHN zeBRuj%oze!v!4{W-v8}`y~E=(5Oy`b?>;~k180%c<+NJz z(|tWsgGE5-%M%N&2Cjnt`J_(ml^-QYblR^#sy1)-P*GJiwAxM=0N-$FG7-P&uoC3< zGm;zX+a?2`5H4QtH+N5)HYJ6HLA|}bs2CWA>0icyn*x@*=*N)n?(2h)iXrT|J6&zV zB<_gLNJ&Xi5r_?}Xw|Texb=FD-YX8gN3k24DV!GAsGL2VS~7bX$ginE1AHO0u8v(Y z3Ri#n*HApURJF-CzMF@K!D^#5@I2ezS$QF(q_4s6FZ)6lx3{0Y{j{6yz$W>x5rIg$ z+zurnV`4%ED$&E;s_pjqdF=C98_MnNt$LFU5tU4;-ji{EIzaw8+q^~@cUe8gV2w<) z25Ss?IyRb$jrkU^ULU={qIh;UU;c4jTwj0qa<%8Z4gc+&lJ?pC-$eQJJ;ljP9zz#T zA0I&-uSMB8w?;DSS zq2VP^0`MgyBp!~+s$`%Z6$pOYUtV7a78g@bZp(glU})&2W6f^o zbox!|Atx>(#KebEOq2BQK4p{$Rfq>NJ6n$1u?XazLN`94{-f-m;w zBzvG5^fue?ve@s4X9{>?1H?&MUVi9$QV0bH2M4gH9*{|;rKJz910|>uKSB~H(5Zsn zyp1;N5kNS7EDY4&`1p8G)UNwZKOD$U$Ce*18sG~+lH3`HtO1H2LiV_&ScMH+$6!W! zJ)r+eYFOB(>;WQF|9~cEMcJqCkhHRpg?b5?P)|#BxowAN7Jj&$(-!YodXpK zD8o>CnZdV!0xE_g09jhUulvlK&hK7(xEKl4vfcN$^LNse(N8I(ms^1-fQkZvuLc)07xeFU* zU{@eRJgF3Za2h)YhhCtP+5!8?B;hK5Ubu1RZ#WnQruX8-n$6?JPbHgf^z>a| zF2q3#2%Gry^avn0K9aSdpy0*TRe)r{;q~X$Sx*`s9=z*+xprF)9VTI?hK4afI*eU*}t;T~2X?UNrwUuqE0q{gSfG=va6J^~`+t>_N(%?r! zGcqz3{U8Rx!m+y0eJ`5_v?y3at9Q`p!&^xS@N}VQg6X9tSZ3xbLEmwFIdUm{k{nW4 zZk_nZo15=|g1rT(ut0IWV9`~wUmu)`HGY16oVnyVeSq3uwe6DdXsx+D0)qOPA%ci# z6~UK)fME8mbk_r>*0w!4Gs{@L(+fR@WKu%s4eNl>YTb;y#=k0--eio>ah_WD@a!>V z#0VAzg^Ng2SwkaYh}aVm$i;vwvPJqfN=Wh@opw0=1q9oBf4U@iVq#(wcO8J-V`5@z z%^MPw;V8EERo6TSLvsR0>6~$WY49#-FEQOWK3Esb{|06L$%hM+?lOq zrB&udZG{pjFfe@LLy$n5J$Kcr0BD+GGe(F@1fv6;jj3CEeBDyz2!NFDbo)cNUG%_= z+bGc`0a=x;t+S|Tus*T8vN9wwG4T+h*pNRD;J+3P_&_TZ$OaO!vYwjljr;kh!GP}P zf%Iqd0H|vG?|bg5??}(4q`k!yrp_`jNZP!(9;w| zd3jR?UE)YUnfm#YChn&)s6#FmO|TN^9f;di7Z12=#!ClPbw0rZ03hlI8mr5Rx^&@p zB^$X?<(*02H};d$Q$+wy0c6qXhnnrKN%Z8d-qEC2zuttl6N8_ohQ`?4H(}39D_dI> zz%H$=yi2PDLNv@e?P1Bu*g-)-H_ekXW*q8WJ_5wPFZNMHmM>T*b(4Yw?J#!HKwCEU zTgq=cepZ+vjA+GpKnI8-W;YNX1(IK3vG>H$d|8dh?NOPJ*E%rQ(Q@Ry+wkw~ER6D- zM~os;0|2={0_%I}+>Iq5v(f`_8z^bAT@)&6YOaqnGpmXCrWXG@3*cGWH!7f0mxEJC_}8Y$wsYJhpLZHtvfxTCZu$9C6j^SUS3)?PUeU5OGych zCg931DS>ThXpsK)tq*u;4vI`V#|VR11Av@Ml zy}Z4*_x6IDo4E;vd$6^6B58HR4rQtfCTju z2QuoF(b3WI*{eKoU{KO(43c^;<1Ia1V~mNKa<8Bh&f#fGXDL4H0s zz|h1bB|{G17#Uyrh&+spC;&+cDCqu!gOVq!O_OsHxd0?1@qJ;vy1L3;Jl1EyEjKBe z?CXP@o)(E~bQyt#wG%TdaqV)U`d*5uR3y^_WElVvK>(=q_iwrnZg+Ne27DESpJahQ zP}?Zb;Q*G1Ow13PCAYYz=>fRmIN*kMj*i{d2;{7^HkdY@?rXV>s{}AGFdUqmK*lBl zIFVE=@#ocICkpiN4?*Q*r2zrR5-H5OoDIPzvPy}p6Go<{rhmNm_x94>Vo718zkFe( zCkD9FxXC#tJk z=8cGo>Tk4OZ5_Ym<>ua+mLeGdsLuzH1*Rqp=6|acF@L__^cC`X*oJApUC@k^rZAD> z3k?bR$ixpomY02ve%=9qQ7DNIZU&ca2w<#s_iLcig9C2i=ILoTl0XS`@~RYdby4Ky z<@qnVAyhx}tu_|4tmvwpwH`AO@;bo+JU|r46NH3>EFL#z{C7)+)ipIe09~s#pQUPl zxf;E=yBoA_S`Psn)$4kkt0*wuuXAX8C1=PV|MMS=0?8jP3Ua>5r{Rf-7^>y!{y=;g z0G5G8Mm}pG82jL>)~lTD0H^vu#cam#0J>Au-E^c^1tv2Yw3<-?-qB*NYB!xPu~cV@ zA{k5kq03mUHKU>MU-%vFuY4$20Q7Gx%*_R5a9Yb1Q=OGB;F2G} z{rzdNYfJ;}PR;gNQUtZ!r931Zh$Mi(`StdS&dQVmu9yDV@`QUSb+8f=xWgecxRR>1q5#^=Hwsfvm)p;SmvJ(06@v+FOMzw4JU?Q=LI-aNLn8B|^DV=5$ zc6L9JzSAR+%>GjY7$PvC=5mx13)Ip|we=#n1&e=fGlbNxU88Y;)XZqIVj z!^Ix}(nFd!@*zV5@;o^=H_#Og{_OIn+1|4Y80!1MS9UNfpamo;0Nkw_zI_%H+@PCC z7GKN;iqcuvyAO~OQ2?9;@Pj~~xQ{77McYbX+=%kmcUnM)UD-Y5T6da7wLwB^8Xg{I zszCS{`hyOnOgkfBu@V*semLq=52-%J{_y?u&u3*nUJ~!xlHmfDLYr2=truKxlym8O zRsR?k3@exW=6$_&dl-|(!eJ^)@$t6S>`Xy#|Fr)Z9klHJ?;AnY^8Z;O9!u|krV8`H z^olY*mKcU-`Jc0JfX19YE*R|xm`Uq@W)Y$N{<{qQ|GCV6k2Qk&--`tO_tWhtnb5aq;)JpU( zz19B`U2A%)?!&!K!(A`STx0TDZYvvS-=eB=a*&oA)^rfyBD~!WY*e9ilFxzWX(LWB2EOhj+w;vE2^D%fNgp*Zkb?T2cI*I-LdM>^QjO-38(&3V^t`0 z&CWrAFXt0bypZjG$@hIySCBzF2H2-clCBq-rd&}6Q92IM{bT2004<~-_0_8U$Lc1P z$1+U{DM1D1(Fax+%YNT{YUYOhxhPpq%xh(pI$T!F~~wMFWTiu;6Hqcd6}7i zmNECAGWY~n#!L-rI0!bN26ho^+syz?H5xHw{KERL3I>l{_skGA;=Kv#$9qVdec0D~ zu`*?bgBFw>+YFvwSbmXkBki&#dHl?j7T-S73qr0x;w-U0T+%s_=MKDfH!e}M{N#A= zU**d(DBl7VX%imMWc|F;nqcj=Eq@%pJogsdZ9SoTF_Kf%*K!)hqb>M$e>3~Qsk_Ll z#2gSkY3*iwYKyu{Q~M(PCz&o&=!G0PQ(D4B9}n}$1efB@?(Ra&P93voA}cl{-wWE# zuEg)@1@dI+5<~76PVV=@z%c>Pb|Q}6o;Cu@%uEAE^43l4v)x~1I^f%M#O4`-*H&?S zMD)Yj+|jW6ANzcoW2xq76wRl|q)8oJ0_C^NWWw6u5dO(a#u+|` zq?1UmND3?Ut~Qf{p*}P8@f{QQl!%We6Hucmbe{6?Kki8!fItRrOgl! zD8>p4k;s8T7Av@h(B!qtsb)AS$m%IlkcLZo8v2<)^y{0=)VZ9%nf(AeL2&u%hf0N2?Pb*wW#~I zO)lw*!wa|Ru-^t)za#46J-nD3r8c9Bb2EGT?$sS0E%R8|r7fyR3X@6_V8n#6TNwe1OavuGOuRde+a>#{Ek0IF9 z3h|P_yJDu;-Ou7nVG3q?`wr`!ewKZPR2tHFGt=QOD7cjnn*><+V(V9TH?yDRsWL*ih zzpX4bFD>O*6H(&-HiE$iNm z1QI{An(l4A7E_m;X)DrzG`}iH``n|yUy^8n_%9lkgHnXld_gO}53_2d``-FF<%x+E4@zud2VzCz2S~WAfLVK>x*7TLYgfZrUD7K%T~o zrD5oDr7eQ=6#iWyVSgn5;B)*%%ZBsqd?j(yK>iJJ%~pRwQh|8riCJD)-|XFh+@2)z zu#U>G+!G_>d(5u7241>`hKEjg9wguUBN9_%LkijmD$6x7f4u=)KvqLZYpUNlr;V6K z12Q-yht5hwY**~i3QS*!6Q^oQ1I+3qSAA@#HmOOumj4gK_H93Ctr4Dx3Qf5khsev8 zxg_F&=}b=+mjK8{H2O;|NCn>uXa4HDsM6e|m@bG(XDcYPLkDfx622N3xYo0;#$ZSz z$Cp)oDl9(lm_3q$VBbhuVYuXR!Ae_UP4BJx-;uHMML>|=pJROA@OH>_yBUf5vi3d! z<-JBLCC$cLge(TDVNy48joNS!(lCuGGTom$rH|XJyj8!1KYVu?#b7PyO=UfR7p~2> z(~9myVj}T!I8we5hkm2ejbRRA+}8~P<~Je;lEe6XaASC7kp1=#W)j*z#4x^Ka2k-wD^M_@fq)X`*8X6hi;}Hp$JYDlH=yE}rlC zWJG-CYX(&m`YggUpEsZf13S;%y337ey~=dgKi=gFX1S9YWq7iS^u7txSNe9Z?x_I< z=BMC`&F9NBxYj16v;Qgzghu%gGskR&*hWqN9XqNhV(bVzOQ*GkGIltgeI>V3b!CHa zYe3=<^G**O#0)M;}Ug};Q+Q0$UhTa6C8V}*Ip`?FtjW6h3J z4PwLZ`9mJRRO$N`f&sp#Ez@0k_qkhtr|M$K>)aOeU}_< zM;``_0=8vW#mh^np!6WA^$+8-kSJw>oX(M5+;5DcjeAt8HdmTiab#TAMX^-Z8_JW) z6B}&R&;WMR)yN<5n7cOF5btsrr!I#7^yLm*yppV6&?)CkNg35b4;963XE1xLp97$+B-1-sA)PsAu6P?KFmo-v-$D&K)&F9~4(YsUhc27L8G#^GcoXWhh{KNIUx5OEOeF&ro+xDZFQN#^TrUITE(Ot`X3aJ`j~f{?>W|By5tet-G zfs!zjWLcrIkdR|-exGiU_BqxIU7lN5HQH`|z6?ItwYpue?is#dwOdk~RMek>kv>> z-`9vRg@u!=j^d^hs{8SApz>+vT6x!RCg5_)4Ji%=_amvS6Yc5AvYFv-k0OL6*3qeR znUV(os?e~k&F8KCTIJ^R^f0FsG6OIMyw~OZ@A%qk;kTY z+_3}hV*7;87i+xrHIYRI%H^JL{qMoqAy-Kf5%M4uqO&`5%Aj9f%01LTf#SYUmZ)EUj{WF z=9fBi!17w~#)+6B#q)_BF?V{k21`cZU?WCWn1z&0maCv>hNYP#2{}MQbl&uhpm<1Jm0U3>@0B{*8L|3P% zjh0ACp0+Zd6hk57XV^{Am$0Uij#^l`2|3h)#?OOfJ=iPVDq7ZeS>ut z*QeM{H0vG6o0D!NC_z7-RC2FPc*$6N;CzU>AiEZ56}`3@5)u;PoT#vPl8~lcGtCzM z?u6RL>TiF$emY4YbFdR1+QmhRfLHzup|6c>gQ=jYwEF56Mzno0w@tGAV7S+ov(;0x z;Nmld{mc8EgrXj6jf}u;@`+K$$AMTf-J|H(?vv8yC~rt;{|MZj-(e76W8!;QH1j&* z(DoV)z+R3Poac)*6Vv_J|CD7wVEr_WOEodaFe7+~fe)HfX2(}>EQD55a)FC5e3%TO zaB5l(XoTfkupTJXX+3iuoeF?%z&~mfl0|?Frw_=t9sD!&7T_wh85B*@6(F?_nJ+NG zm|IASQi#nD8(+rk#fLd2I_sXvTYRRWML-wlRaEl4FYz}fUWCYDD}+~h{$^p?GxZ=c zE?IR|(9jAaU{!TnfOoFydPVy+qvAi~pe&&Ich*hltf zW^5~ly=2WXS>fh+asp$52qnO6D?wGfra)mOU?}CKu^}Zp6*%IOMBA+irX*x~9W&n=RGX&LY6XPfU(P3@|9qq7! zaDq7C%Og5EjKjgd&B-1I zX5LZPyNpkf?p=JDlgmPAidmgX2({I9gA>ARtQ;DI`KI%XiV}o0{Y}YCxTDBWrpeF1l{N_f$8C`#E>0_EzcRr?Bx;^ScD=$>g9(TDDl#N_Sb&Hd_Svx;>Iu@Yg%hiLMVQU=?q7HxX3RYg+TRM2h_d2IE~oP)&K@)Lm~}bc9bO zGy@x{wH7@2+H2c~CJ=K+GWVO$u_#+k_l&UjAPYx%gL@R1@wTAuhfF6UL-MnWJ$b)Q z79?6M#nc0a;H-kNo707vJq9x5-uBgk>en38XzH$MtnJXI4Zn*mfo94Xl)G`YI8O%x zPA^A9m5T8>3C_-D_i1J9HGoS79^m{u#LkuZD*QE+*oW+qLWXG3lMDTMxHQa(J7l*) zrAEOQIehLu!UD_0{&Y#B~xhFUcfYSf)f z8GN1|qDt>;$-D{P(mE?rLNUUV=<^x)`2v_WT_ko5(yr~Cq@m$XXEr8vrT@WKz<#5(;qVk8j211R76sD z^vhtk;WnH2=qszS25Kkcu0dG6koz17q6C342XqdmL={qd*n`5WE@505?-L@je7 zTkqxAht&ch(UUsF^K#FACrRaRDRoh>*-iW*Ffl@bzFA6QejsgUI!@oXi1BqMCb8j& z&29hTPkh%O3Q0q&Alteqqa5Y0f)>MiqnWuojGY_dzqrw~7<~0382E7sZjC9+%X0Uw zIpLdKmwaQFDYxH$MUvXb_W#D&?6oa!#!JEAkbZw+CoHizKV_(m?f=te5Iv1uLt@im zD(EEx2Mv~v@ZQ&Tr@2BT26^u8+y4zkCO|Dmpjo2YKFd$V_m$n|Twcs>)o$%|Y&Vr} z1}xv^Js1{!(%kLgELF#Vm5f_bAZjs3J4iuFadI+G8gZXB@?wl{QZM^l!55{zXV|!_ z=XXuax^0ehh+oTls1VcbIV$(`?o6kxeQnWeFa=x}-nHcN-J|gY;D{!>p}~`#A)&hh ze1w5hNy7^;O2l47w*07IQvdl7G}3QfnIg>+!Ei%7Mj{WbHc}T0@y)tMGU|T0EKu95 zsfN4?lW?L3;>gi*>aoF(J$(W@gtr?-ihr-|1TZl8m&9t?GDN;=ojWx9pd^XV_= z%O%Nd_1_1d6Cn@$!xW|hjf&8*aT5K@YrCO!1hn)!&dwue0dzN6Pw?~DjK~5{pZ*$l zoH(^SKgn~DD~av{RE*@`DECw$Mo6YUCmn})Z|*bqYwxI)I{_EUU!+yFU;!NjFMU+o zMH2LOo|z~b=t^6pbZinyh-z}XbCg6TZuLHUaZ!WoRqcq&gXeZzYm~|*^{A^nhW#|U z+|FKF$xMqmr>=y7d(0JLURSY8ju#Z)>%Q4b%tMApa(TVJu(I(JJKAOiN}rdVB!~gg z4?zWtd|_y5Ymc+715N58nfoMqe3>+K*0t3y9~z>Ovs_Lmh?yBisYtU_Io-H*l?i2b zjSO&VwCQLuV76RQQ`7QDgA5kj!qO7x@&S`E_InW~%}w$Dk&!JLjGG4xSb^TwSZi{< z_P_rM&!1h^Z~jNmu9Zx_Is89g9{gWn`u}T+^8c&k?f?H`{-;&)fA2yJhjzdG?<~NF z;{#SwL;-rep`I83r-Hr@7hfd)-)_Z!8wATj&{`W$4B0DjNFA>nFNcv`1~GLdL&gYQ zj}UJcvUo-Bdj$M^+AEW*p&_|Tp((_VnC2^IHVq%K!$_rcvJC0tP&hl*LPNbj#_ zrkNd1P~$E(u&_D7d?f7z>=4F%9rog&dhXZz=ZhwCa2t&%Nb z7)v3o=y>m!jnZ$gkSJX*n(_##<^PH>gG3E^<%;HZiq z2tEk)w`skWO)50P*!pUP@@+QbY^%NAs)hcX%<0*luG)%qT(3O82mkT8X5VcrlN;PX zTi`4E_ju2nZ|&r_L#>-becMNi@RRm+EK(;?dZw(oe6dwN_hddlnFc2ju|?6Uf(ttJ)oq-ITW@D0v^n+nX%$C4DL&xQJcEgdqvg!NW(~v znyV{`=T+$HUwrS**cl>rQMMjjtEQ084rYEL8&rkCW1mPyulJ*C8gM9LD9JFtNB4x{lc*shg`M%-Kf8MeM^K+q{`T*hzrA@?-^8Uw(}(XlW4UYYOIpGj zM{NX>Zz;A&GeOe1p^Qf_+x8b1oO&v-e z#*A|2oi1>>75-Ip8WP#XcDRT2w~=7d?O2TAo7JG^`P~4MI|{;n#r9MSX2jT<*_t)? zB%(!32l@@(kUFa^9AAFo@DMt64(U@2-WO^VcABoSH;L;Xo$nlK@JR<+5N2FP41F4W zo7YJ(Zzo>azSfL*w?nL^9?XOk5I8<*!)0YxaPE%C5IdWH2MSB;JuEP(Jh2_QH3K~p z6|!;Jz#W{xSd`=nQ%MY7OuDP`w^Bp4;OjO3o*p>*4ZM8^y* z_Z}l!dc_p^_7%75tv(9E^gC_cZ`r`9?I?mZNX_8vlJgwnU>DK}DIa~Q1hD9DhEKAY zqC)%RUT+%~=nhd{oOwSl*>!(aTrwP+Od7vlLS9ATXM*#xI?TX=pJI{XptTt@303g@ zDI`N`AaK?H+uT{g**`P#;OJPVg|4S#;t8r54!d>RsEC{9r9$ty%llxe3Rt;N7xcv5*f@;6Ik=p{IV zhd3vCqZe$_L;&w|5zd?H6Tu-lyN<-`DIxN|k#3#NSB1#y*aF(8A`6f3fSI6mh8K6r zXT$Hbsw-R5@r)DxZoq%VfV70#{E zBSE19h6;<6EHq)cCcHEe6#TU%4sD;p8%Sgg72WWYqgQ9OFh+h8g=?Xdoj1PzPAG^> z?I6eFz*jDeAA8rMB4A3N&3{+$m}lJYPdN0dz5(BJ;B4!9jw%ejDp_}D5%ZV}tjkEf zJ!G3Wj;5%1kEmLZ%)9rDqK0Un#K{DIvmc9=Mjgl+JY1q2 zwSo=F)#)PE^t11qTEf|U$if*`Ke2jml&xz#EkR4IIrJGiNe5q| z_p(FuDSQ%L<*zvNO? zb!$e;@kE{!mFGFvi>(SAk?v!N`(}qE^(&PL1Gh-lcFvU+JrY=-=|wnfGZg3%UQ^IB zmc+F`AMxPpITKik0q|t~cR}OXB!Ybsu^nX9oVl5NZ!w11n3{i)c;#Q(L;0ve$P(^| zx3r*WvMhJW)(bm!$j6?I1ly{XW?Z%~Zp1&qv6yslB}PvhH#eP2#G0sT@l=PQ6f=^m`W9#@E;(@ibD#MgOz=yx=HK&P z<{UX}fSs-Y2haN8sD2P7uEHbCOz#AuwVqP_sw)N>wuJpEXX@bD*1e;#dZTyJp_15C zLdd@6k4OfBwreN;;_SlXfuS^q|0m|Ev)!EGc9CB~}ZM>Jf-q^8TuU4oLq}<-I4tgapJ)`R$AX2SZSFlvpU9QIJVYV*rktYwc2@1@ z`l39z=Di_1k5fe-l+k=`W>3~5N1R%(djyKU!oU-G+updtPi|%u)n|hTL-$uNo#aN& z$H>xVtBAR}0+!0c9m%)Vyh-x$h>i0W-?#3TR>wH(yEndvcMfBIi%#DO5RG%>X{86> z-`JcQU&MyfY!!G#r@~=ii8!X-rW*X_`S_~LN`*9Z-LooSA7|t-?~?&nXZYalN+tlU zlAJh}aXA)xJ~e=Sh40-PG>HOC&EY*oTiUHopIu$xAsz|rK3RS-mzU1D3cy)k%-Y5d_hQ=E#KMqEbozlllY(8UzNYb$iMWkkz@kDsdOy$UleAv6oT2SVhm~IH;o&d>M=7 zUtC(jujK3K)!hU!F;OCrP1{NIg*5%YDc35t_g|Dm#WMR}-j6h+m+_47D6BdJYT`i@ zR{X#(xrC(nk%nWA;4GZ%)<5z;lZsK~{;)6=nkpbS32Ryg+xl@Mg%FOlVx zv;>)W#-2qx>Jty;FE) zPxLL?vC&C7M#oM%wrzFCwrzIoq+{E*ZF9%AZRhUp-~FF+9`1d<_xtw4+NxDmYgW}5 zvu2HHLmm%B7n7m}x#(wYVZn^@JLIC;WE0UOO6GP0^mGIs05o&Y| zb4UEd4|M9R@G?$T$yhG~M6BDlt&-@*@yTY#VDH6RRvISh=9ZCyUU+2RSc^!V2V1UYNZQ&Q;`r9_ zhE`hz51TQ3aj?Ltf2Pb&^6i4(7|7W*#`vC^`hpd7V+>duYg`5?OEvfl~i28YnY=muiU<+B@_hV~FE zlrzND61M5iN1oMwHoNGb1@9IYM3bK!$tu%r3`S)w&Nl7_tg?~yRj}EisjjYOZ^4FM zQ(}UyD~yVe^cU&!Bg98{#QiKhJfd_kAIr@`T%{DrogH5iv0`?C@P)F?O9`k)OSKXsNUA;qTpYmcM%hOSD8TpKWY~TF zM~UIl438brE%I_B%kNN>KRss4q`C<{in7a<96ZA6byDshs2H`>0YwfxwIIsu1|5_%~!#^V1M|q@{vrGczl0v0j3t2cN1lhI_w5yWGX1&tXJf(XlxspwI zF-594^;_3FVyY3meUDG}X*55GFF#XdN)*F2I&=qRaAcu8V6ODHPU9$^?XWI+nBo-6 zR+!;4M&mDJ#pk#kq-t;TI`7qaahUui9JCLvi@2`$qm?kP>o}r7@GzOPp)ibnhR9dn z+^Sa5Ht3#X+yFyNZPRE?g&l5Aj#A9S&5Ko12YyLzC1*mNm{ep+ye}l?_sP8)1GlPA z9wZDV@kj0I0E_-Q$Lg3b815Yp_&0AlORk1+7NgQNk1$4O!!vizzci=B71>$yepR3$ zUPy}_uf_J{Wg3J$W?=>^%&ldTAQ_+B4$!E2gvfN^=SrIeO7YWcyEY;<*dVt4$_#L{ z5q`Q+I#YEDnSRioPmQ${O1|r2bc9>5)g8jlO;~WP#~ZD#0lQ|}P7J;F`wsn?=rMAf z2n>whw-9JjE~`LyJay!x(-hD7RR;O!q4Ti{e@)|U2Rjzt%4GH6ik;FONp4<v|C$4JImjLA}g(J2Kls`MhT<^RjS~?AknwB ziBMqw`z^j9l7Q@^Pf9@Jtw;Hp=c^TKqzBVZbU8l-G_WZ^K5>3QTJ*Z@MpW?k9q`4S zFD%>ie_y{rJjMcOMO%TD{ae~L0h#^(x~50wSpWA2;2ikn|G35oar*lke363JC)XwT z-qETK!kiy9`H4CjkdZi27;>b+UAU8XUe53@`sl>%1L_~ZQXbQWkI}&eT*W2G=$OsV zqbq(2XbUncFm&Cn7opERJ3qZ&q<)9)^%?Eha}1BM7C;UNP7o1-Y-f)tq{@Cnl>&9h zDK`p6cbLrno*UhYN7ge61g_|d-)pqKFgZOW;GYj&u%Ig9g0b zY(KthimxWxSmHC>lII(d*}k%CHK<`?wE2uYAUrk^`OVx|wI{X=h%yuAgxTBsiCg ze;<@~wkFPX=kvY)fcQ7{dN~0Me5Q33dCTCu`uG@*Yy4Ue2Dh0=;=Bo^v!)n zUML5)*O;XNcuF791U90&SuXF^d6Vmv=m^yfKO(uu2x1r-9QQ z{`A<#C;WcBuw1L7a(ScUxZl3x7!?l_5pRaf_Tk9M?9V8-xNlp-Ce_Z4bh4^fOzRtH zJ=+NC>G_tB5IGoY7;}!T?ls6Mid` zXg67O1-%%wzyMv!4%h0&&5ax8S(tkd5~uYXD6s6 zSfCfU4#VzuqTfnC<)w*EsecrgUt0i9=txO%vFrP`<>srrheeS;$bOM4etb38I4dWC zH@nuPinVKq{XsJ1Py$ba!&Uz6k9uDfb$R)WB+7D+((`_U?syF4m<(y1cxZxu^Bx-b zcGuxojiOa?dsobBNK|Yj+|a(#swW<*h~XV%KNc0KJ<+-wVA|_Y=^oW0R33Act_d}O zbKihY%H0jD{c5C1`#oVIDeG>9%d37;dvM_Gg6)wetcbBS^95_V2_(yqHq1+eL3wgh z0N#wmoD z>4FQ^*~+d<$yGf$#np4syYi}HepZ&gyTWjO4lg{L&NR{J97Y^(4!OFfqTNn==CqTE zoxY*7nBQU5QDb3!2o7tv zpGaX@yaSv|1Git;JrM4PTZAi~e4jOP#px7xRja5C$dQU#&L?OwM|fJoIN%yl5)^$K zRN&kr-BR&+(ZyNjbXrX~r*Pr+Ad0-+9J>=jb(#)`_bwSSIOD!*L%5h~Ol{MP)hrxR z^PcR67!L0}+3?l4K1#&GP80*$+46?&3w&jB_YPi6czoLrv>(L2@PFe^qRTu}b^dL$ zsbpIj3IX%#f^0KA+p3{~OTw9pXU6v=yd2VC2!`# zf{O?^r(e0c0=<#{zwk3Lj2-C_nVg$E^jfy^Z9+Yksz@1Uf&U!8g?qM7gYhbwFq&yUzEe2gdQD(hONX_V-smnO zxD)_9;&~@Oev3;jtlPWYWH0LS;2R@atkYpjm+QnA%cE-Zw6VgGP=CbI!LQNl=Hjc~ zdR;u$UmG7{YKpVF|M9b;%lfY4JlZxAJBxf{dm_imc9dr{h=r@AxKu1!g5XNfW3{d5 zQM}>k<7PF&(n@HwvVdmU6*d+A@Ej?VsC#eos0+9j`tQd8X9#UXVw#@cqkMnRosCVw z(sI{3(?Y5#!d4r5n4O`zvZ(uN&&#BBI5xi{UTvSfdKbZ*nFQjZKfYq^>Xnu3n! zkXS-`0J2u02KaY+}^-rzF_UxQ*xjQxNL2v2kZ{6h% zSLt9#a5SN@mO$hxz~`9lRHlwIJQxBxCs8M;FT78 zu9lMC&Gw4FtT4D=3G{k*dhp03d{;q>O-PXnRKjcRVu_v<-IpN;Cmw-%MAotSZWH9H zOX^#B30}CApUtqK=|gNd-Iy;Y=VO^*>u~4s+E|9hNK$R%LPeXEDyre4#4pyQ(6PkB zkzVXaSKm?cal^In9KvWZgj2RMFV8PimXuiYQ9yNB?-^5Ys?&ZQG@E%K*DiWXZoT^D zd_z-Y9{uNimfl9IiFJF9MfYzNUW4weRWKkp`AiQc0nUkvs+dW4*>oYg*Nb-IMk5rY zDQ_XRxsof>%q)S@c_=`Qmokoxho@(bZ1w~g{sFBS4oA?fuWHIz`^>Q!Dd7o9wBuDBCC&wICMtj6 z*i{Vp1oRGnpIcS(OQ)`vSOKVl`NHqU1revPr;bY5Aj`QayI%gRmELc*$VxF#DghDA z(-03Q(8np<+lM+soF~UUSlLgt3M+?Ddb`>|a3$Kh-6^2@6JgN^!d zqI2YN<=k}nC-t4jfL}R)9D21nz(`D`)=-Wd`_T!-w;ODVe`ontlLL1I@ZQ;Z?R=*M zzsBb423WB_c#U2v#_tu=x$EyMKUg7=5NzdGe06UOkruG_HY$xX3`j9NjUO#R zsC%+JF!wa!37oqBt|Dk*B{EYWJ(_)Em?LNSS&C`t5wx&2)%QEUd7`*WT0;E=Z^gTI zbW$yMeg&2D*kh2T**%qNiij`=zD->PHL7Y+M=9giqZqJrkuS1CXuY#CfpL=5G3M2wVI&}D;d=mn#RkrTuWBcv0rT5dG)d4PLYv)GQ3*D*>X^t7X zBsC5g!&v9uP{OI|N1ul@{v)>yeHVWqVP<4j#|Tc9SGNmJ6iQO&|Mp?rt_HV1zu z``{>qs_i8m3Dov4tI^m!**3d-c=ydut-k0aPYLir zQC8lUbJiZAy#==>)iW~_RosJ795WgPAk{hU9+!=LGsmunBk{TQTo5i&`k5%V7G>l1 z+J`{0<`_s}mWDb@ks))tU`JIK(i`7LqwXA_|9o*DFHF0$9*u6#UI6XCf~EwK%_{Kg zysso*HcdA@SEZJMJ0*A4Q=g4i_u_(@VqE5;C5x@CsPPvsc#}e%&9;6N35L9Sy!2B0 zquXH<=IEzo#$R%Dh2$n|--^1Q@2~sFC&T5p-Llf+Ze{O>e8Jp^y^}X`6IazZF712uwJRxHJeO6Clto< zDLY$>K??NT-cnr&`0sAF39!cWo@q5YiF(Ia{c%cJ`IVA_r8!wH-lBg3tPrd=Rq;e4 zKjUnETqL!;y*x1GCnoPM)I(Lto`yUS7hadZo5eHaAgpMWO^b+mdWjo?^ z7i~uN>cGSk7#$RwozeUeSWiAYkj)FWl96i0lu-X*jKd(EdATo;w#w@?Ym@$X_+&Uq zqj<|q=^OI0WWU+BExfEVn8v8X+@?Jsg8nsZq`8LL(}bZBPYPNqv(?HDsla92Ind#`k{e{oUsAs1?+;SaztYyyrXX69&`C4)m z@RZbk+MUb2*wZ36=jmU*4&7uV-o|ek717lZK==%b5q{Z@d_q8;<7_Sb8nwXQvTnrS zzRg#4C(TS9E%4ft!)*Tpx#=9)LOE6ORLut$7FDf@?Ay6PMarIy>`aL`I(>AvyFE^- zg-sY5b?s6MNm&1H^oWZh;>+o;iIwcZW4HHq73dkGh5>j6_ih$1(N?}m5+GvAfpv~) zK_k(Ny+tPEg^mZJ(^`o=4+SuDu+^=k(^VyxQ7_EipXW3jG8#XulMxheAe5`v`_Z*b zUgm$PXh1d}{RHp2m<2f7Qpj=sL~h%KE>lUlKBJ(w9IdQ&I#vtw(_p%$l#--N-)Tx1 zs!m20#Nj$7IF7#3b)#7L>jpu#CN(Rc#@yv_slok285T||vY_j9dlT#9>*oK_el;5o zZ&vv2b370mv&EhP&WVRWy;Vb3Pfw)dJDVkwy?DhJFGbEIt5f8)VeE<)%E^iLE4GPU z`AHaXs6#$PUkW|04p=Kp|qqU9DCS3 z{fhpP6_6Sl2#t-#@%{aA>(vZBlWf6jERXB9&#*PkC@VcMP*O@~?_fvrI%E%?lQKw4 zW#3sj5oE$&>K}d#Y33E^J+``POYHqjj9?%Sj<@GZt*;*#9S0wJ!GF>?h)H)o^?v7h z|N0>lJ^asQ(tA!}@w}6UDs%QchN<2XXUmJ2S4Y3`VoFq3l@LoQvoz70rBcgBmY`pN zfIrd7;5q&!bwz4%3{6LM>@Kh@lxBK+y_P&L>mss?v?)L7XA$}Pu;Kyj>QqTT_fOgT z;~&7-20tx^=SM{Ut16~g`!gCfd=TdL4=ly4g%X}A3hAms$zimDeWm<)-8|3)8w0Xd z>Y7&UOKkhw5t^p%p_cR&?9G#Oq7F z#TaHwM)hDoa=4Uj9uP%!YY0il87zM^uI=jf70v0mqKGnH^cC?;EFzXw> z#gN8%T{9+Go+`t%3RvkyVN>v6OjNDLN{q4O>|Yr-Qwk`i<}!hBu*Cqke(iWG;9sM9 zz?U~;(PX@}u?kBqo!{(Zi}O+98>8yaHj1hzP0XUEiQ@T>KwOd{Cd+Rzl#pPV$!0z$4AtV z0prg$={4@7l{`W`Fhe5NEb@|_K~{-f{?p3Hqm9X^H?SGp7SaYm(JHoBCr$*B)9>2J zD+xKYTSv3IxKnK{<(bVDV(j@326Iv!t`6p6?rp}^&iADDWoQYvvCv#V#Wi`4#q6TO z&anbFVauhlM`}j9Q$W}Q9or(A-fAg?5cVm|s~dHeH`X8_?sb!Lwj%Wp2Va6iAvxOm%1OJk}c*33>ki_I(8vAP6t|ZN(zUEcm+*SrW z9nAhU3DmZtqDWd%PftH8u82c6v++-Rf*1L%sn%Gl)??fx&eL3E)%M@R5QeE!J?3IZQZ%(Hr$w3&G$x$WluX;A$WIf1~ zwCxW&7q1oMV-mYhNXaD{A9Fq(yq}iW^rY4FqU4Geq|Y2HqD#ud#0N)VYYpgP_V&i& z2RWHhOy5ps8MaU?a%+$FE>w-;Uu@2zuc}&-oLWUd{{T6zzm& zE7HSCn_s$CHvWFpB!fk|z*H8L7%|9MK?1WtJt)|eFOYOYq>3{+bmm@+cA@*(^?g0c zATTcGYLUtoQTdMBp;g9=b4oBlM2t!flx$4{65wmmxN+_iZY}t~eU-+XW2bAGI@&8g za`sUW>6a%{M76M%Z_Ken1O+L51rjCrs-v^&PJlT_lFCX5P+%d3Zzl2H##YCRbtOr~nN z7DF=y5?XeH_8d`2aopJ@kyX?VDnA;5^Axs-OdSnSwCK|1^Dl_P7Ek1TY8fHvC;J^t zz*{)qsQ-6|jT6jntO&SAB8cw!jK6tF&wsuVNOxZu*@h{;d_{RVncl~CDQ6(k4x**Y zwldc|*p&K$x4KQDrN7&>Sz~!Fc_5S3TZgJ`q%Azd*VxqyCdt@0CMR{1!<0T*oSoYq z@brEdl7sGKL2Y;EBXS-QNL7>^IJ0@u{nq_U!RiX_xk`q+aLzp7vRCMtBpTlzuhk1H$@3_u_R zQGl@%nz#mSrY|cZ0Q3Azx_6kQsOo;3@f`*Zj_10~0J=+4RKgm&%|}jnW*E!{6-L7c z12;~889hPF&JAK2W3rY@G}MP@HO;>7v+@J_v#@Od0F-Cc&({DtwsQ(?d!~j^DCr2e z2y`rMu=NuEU-zecNxnz~%E>G39c7$RHw-r2Iz;%8VOqf4SeUMqZ&PfzDfG0@Z+>soDY@l!`ZQcRLp3Fzd)ZDyl;D| z|3Y(SS+YnTGR@gkC_-`8jx}8s@1*f?rREzjIUgu1$C8~nFd>sF-=u=mYQr}&$WgP0 zC0)FKI8aTfz1Rh1l*A}8zcM{vTPSBJKMV-xj%LvEUrF!n-D9|H)yf06ytGrM- z)*bb=T&F$K3l_oYgk@)h?jhlp#{BtuFOE^8G5GfW1@wH7Fx0lH)uN&OBp&g44#Wpb zls&B96-7&tLoN{9Iz3%cdU|OAMf8DWBO@zIhqg$=a2=-CzwnJYym0EkG9$t%bomxCio+*m7hF%IZc-zu*wn(2;#zY8q)B*qeZaM-xD6Los%85~9LvNmvAJ7?#L zJ|I4ws`bzz6cEbHR-?s9*FZ3k2hcp6cZ6i>6FKAc)B}FJK(gy<6oJXz-yigD*j8eK z7{Ee#KgYUgdnU~%32SHn}%AgfBMlOLwXO2*burfQ=gjndn`pyNV__yCagwR|(l-s{U z&r3Y`g1c#M*$R6bnTtxGK@mIEBV1=wSh5mSjphtE==^vbI*z#O9Bz;H-k+P_|Fd7- zVcCK^dN)v}dNc5a25HhjCZbdFT(p+a;Rjo~$@c5i^&F}kN=Y%6$!Uxg`|Y z+0u{_!6vuL^|0m9aV5k1exX~KGCvBf?ByTktl$9+Xv@;AQyaIu` zqb<6(v1{5EnX5xAR$fn6kINac753vHqXS!&`t68=8C->lw2;o1xlBn=KyUshD%k$M zyJBy2-q}4X-y3&YQ!Cc;%k`q=SiHhBJaE4+QbO$sJ5Q8*>JaMOY`z}_6_sW9yVP2% zc>s;h)M}>|J8ifn%3n7BG*nV4vQYS8*-YBgHVJSO%M^G*8(5 zwRO%FHbnD48ze&++>ma)S0rW|A`2LVhgP;OFMk8G$|IFYX@-O&Ya>Lg)!L$6ITHjm@NP$%@yDDD0ZC36xb1$Ai!g_--TomhK#SQGUIdy<>Q zK;hQF=>-W;8q?WIEVor}z4v2F$*@`W>s1uQ;uU1YM{Qyahz21}#n*mCbbQIeVv;nb zQ;eFrVhF-WX$4gcd0X4B;m#zA@_)vAvM}uCYM3(KerCgF8+b?|R;}<`DsVuUEY!XP z@ZfQ}=Jlo*X7~Y*Gy7?c6vUfk>Fy7PKLs`psA;0_VgU<`Vmsd=KAA?W3PQn ziu<%9mE;7I8T|gr6}FnSxK`p8xFla-v{qr-W1dmrI#b4HaY-L|eIvXbNFvAi>Dqw= zpROaBkuuHZuxnIl85Y-b^~YOBO#Ol+zm#Yf+7Mga=H7AEM9F$J9)0Hm0TStN>`%ff zM*RmiPxb>gNf!J7?sr(QN;>~sGu~8{SI@D>s^~2-e}s<=@@v5+^_>yle~vr)KR}s4 z!wgv!;1pd1&;ojhhAGhH^3m`)e1-svdl8ZC_q`09-mmyt{Qw*Y0oRaFaz)tQEEnJm zkBdtKbV&il2Y-zncRr}EsR9SwIKP=U_SaMIL&f(8@Rg9?z?B_1CR0nwD=L6_4_Z3S zLutnL_V#p{v1=L|$%ylwydM>i@o5Gf8+~3-!kKUwcOn~)gvWv04;WTpwrJn{4Hklx zm33a3w&g+n??g^eU|aZjS8&(4`TnF;7-qYh!p&|yL9(>~!7 zsX0EvqG!o%A+RV>VP<{Le=qwK_b=3>S4dKkVsTW^Uaq}HD51&XgoA! zSM|`A$6h{>UY2T@b7rzf4?>8kwQBV};Xfq5 zAy|E!-a+0;Dlr>3Su z2TjX399pKnCTU;WpFAn7slZaik{DkX&xOhNbJ!XN^3>=DWsk(XsNZFdNgq8n173&3 zA4-%gms0u*aCxYx@w|IvjsT-CiQUR{lY3i*m{CIq3fa?J^SQhooSZrA4)GjZGFVrZ z#N5)6`Innhz0I5vSlhBMClk1i2u9Kta6p=Exon#V7%9M{t$%8=k<3cuoEsF3vJC5E zuIJJ6l#Y?Ch1s+Z3mMxNU!VhjRzWs#JggbwNvXTSo#{!WShOM^FTg_;bfWme!I!Di z*%B}nfPCg+)3QNEsuo}sLiXm#D^iQS%IS18TgB^S<8XQ;`&#tt%Qpz&cl?13B@VO_ zT00xGZi9^U>2$8qh`xh*7Aev-F2ghsHr6Lf@-aM1TrlkRntVH8AGO~y-MRVQorRV7xLeS; zB5J^v;8D)CdU#;OQY$ISstHlr>y{z&(n4&o5mWZtx@L92@O&^w6c-rzgYKxf4|7p; z?HxZa`aSmS1ZAL%M=ixfh{5hx7Q7c%T@4oO7&wkvx-jOc1MW|CIkJa3VyjaLBDn59 zvEA2#Y%6Rv{0cD>l@P%k7Mp(<;y9T&izC+4;(nOZGB`LCRQ^Itij}#t(Usdsp*F+> zF@&8Yi`!8Q4w}a|Cv({62Y;1XbG;cDa^2l;1TTqOa{uwVaLJGGY9cImcHnP0;h6pS zbkTklPmf*{T|-!lhV?@;f>=}|nt|SFcX=af?+o6cFU7ueV)BPm&gIe<%?YjJM?vaT zbqOGP3Pve5T~EY-3j6)4NBW;tD>fZCQrlitm&az6=5JrQxOEiKVx2O&I$v;{+<9a) z1)Hag-)nJ!*UXcz`niQPRKX?;$2E8WSJz+&sjO{#{z_%Ybu$OdV`(WMu#AYNvyeDd;sMtnFM@13FJ*2nn&(On~ETKD> zVqkqB{<{g5QD5e@o$)t z3CU@c6tpGH`|NYgKE8><{S;=bvlwy~5L=RmAIK))VFI(wGbMF!h-AO3_|`Qv4-ShR zM^9Vy+>>^z?(RtX#{|LGkSPB1+flR`$UZjISVJT#CkQkP7J!q~b5fI#{FD?ivZeDk zw3fUcL3nGY$6~4qnkzFBrtPWN4!YVbBxkun^N>4G%w-lZDLQcOvmboZhrLU&e6@z- zDr>hfHjv@?uGTu;+GBPg!am)yZKaH$po+qt&9UF6ulB439%#(znf5eO(1AKI@U2)n zUL12omX?3}EYu&ApX^Z(`#E#NHO((QZgRkrE4794&$xxcCR5lIQy@6o=y$U9Omq-q zakdK>t#cPhkEWroS;PkVM!u7#!i}E>uPVxlg1$YV^rsdoy(ozd>!#pGQ@`^8x(+-y zin)MH7_$9a|kVd26-XcVb&bT)rS?f7d_jStf(^z+U$k zJO}M61EF|$C`nw45B)8pH4h@oc~+eWB(?}l%QK@XRo+ok+3`H=L#@rz<=Kt*^TuDBGYvbS+{0pX8|Q}_K z<|8rQXKyGq(I43GZ#}62Vktc#3OT($3-~K3$S(M4Y6>9l*eXo(s+|gby*S&N$YRv< zi)hFrGr}M1o-MI3;n>?hK*8Bej=Ecu@j|z{6HbUHhXd19oqn?f*HX?&0d3$nXo9-$ z!s55ZIq;}LOyC6h=VJ1h=GB?}wh3(qu#ytn;qhdCLCJX9s4x7A)6?Ekg`=$oW67x) zp@TZ4p~PWG44D_O@-t8|mQq4yhu;wY+c!w~--P6G$$(|FVV7k-R59!q6i$HF?2gpxmBTCNz|oC{*L)CIKHI2!S3hnixD3y0A(WeLf0#K-eo1493GP;h*C zm*89__59|~`9246A8QAdw)H;9ZTWbxgDH6p%5JsE{v>xgV@zbKUivYBx~8@K_;3MEP>>xr$UT<2Nnf#4t=tMcunVZSyr3+45E#cmJoto5TD z5z*+JOm#!{7ptNaE%gI+h8DONy3t^WDaB-~YpV&XS}mI0zH7T)txL%^{nXT?(Sd7i zP`7Hx27*?*Z9&)yb(ZGMS0ZSiGN9&odwaV%oneT)?9t&OEPg z-KW#>!O3c9KRDRte9%OStssk%_kKmCG5fX>Evbq2W!kFq)JBgnpl}vtQvGaxeXmx` z0G^9NKSF}nSHqN)+gC6JN})A6-K@ji?cE-|$>+&O_{pnnkB!6E48~`0foQ`T`(y2! zyUHhL;11gi-qo}pB}*ph_Gb09Ja#in!8vLk=0*uVWEe-2(^m%-VTUKruTj9$QZ{>h zN829$W{m;JftSK|9%lZXM3`PX|O}|zpXsHUH$gVB408#Z#VaCg09r@^Ju`yRX z4j30iW4iu2rpPT8M5-x&B)t{rBud93F_|zO zq^K<|!feHO%S|8mbMroxlhy?*+ZHDf2@%G_OW;#)=uc3Vq$o45F5(p!ssH zcz!Vec?UmkN|?}EM{^BiZOsz+H8AVge%M8=6|kYeUKE73g8~}M-wQ%vmhZrt{=2;3 zH)338oCSW)5}Mlg;*yyymnG2NRZ)HCQRwB#QI4b+9j!NG=WuM@a_ZXVL+}Fsk-XFk zyFwkh-3Q`z^t!_+yM9y7PTKFq7{VLPH^oLi{yTK6g=23|d(d(0Fkz^*>E-LgQr$Sm z(_tR1NtcQK=8u=Irob@SqWTI;Z;w0zz4yXuRwZSdZ-PIOQfuKQmqQ*2ngW3%jyR0? zgVt-NR3u%JGaO4E5X+uY=C@BYB)69XdH|3}XY|c6lS)-vFPk(io-ZfP;DXvc&jtYy zqDK()PW#Z3T_=`Zgi$tXgFBxH7H73Zpu-TBW~9vnWMyT6-G(eUM*~|40x}1{CnG&3 zNtzQ?CC%E3IEf0@AR8HqV|X-`aJFYuL#K@dQ{Qr(GESb`S+$@+^#DPOOGy`ug880S zR|L3zs0_T}hPkd^lJN$WLC!5ly??aTL|ESyg zDssCXx~o}Vza=15uf&m`$#SGLLQ?pf%TUX6+@lQ zK_r67%$%9*QT7bH*`Y6DLOK}V*BVoVHd$l+TBp9Y`8@bfF`HD*8Vs1$0%4!MoVoJkJm11M~Q$Ni4zc$ReJrd#gFPJx%^NIXs(l(%rcW4QSom ziGw5Tm-*M=3$a#F?jsW<4swnZ=g>Hb!x?ur()tv((G=lWSUP(~4uS~pC$?#Q&JR4m zhE5N!ltVA%Bk8nlKmtL>Nc#G7JZa`c(c<;4x0t%i&Cth=tg`nTA+=mu&i70=CZZ+R zjlc&vZiy^@F4?NAK95_Mq$y>KcGsKTCbzj?0=w6kOr7|VIwRUd8z~ZdFgWUuIMSC; zVapwc*q1ai`A?PY$Yc*6Pdr83pfC?LM7LKqp7$~|&x_|d2bU(>cU4Pzu)6)H^pZWa z0mY1ra=;-s$F9umQH`aHgJl2KZ-*QE>*W5fXa0~G|Db{dUykTK9cxt?gn1^7y;hHB zgmlvJXg+*_SDi+-2tmf_IR1g0$OF$Ha z0uj4@;o|8YORDVQcyD!K-*_Zu%p-Tn^XthyY~HI-gTfnpx@@wH7 zGv+IV4X<1}$qjedpwA>8N)w4XO||KX*ulY1@9r5T(N;OPKwbodZ*1fN$W0}Tw~kW( zY!Mg2qbrel_JYLhkoBzA%Iru9N2p`)2~*kLa?IL3{Epdr85bu^Txy~x7rk!(Hfh;j zi@G(!(ViCni>ap96>DPR4B|%Q)wK2DPjhTix(v*RGdpzA!CL2yVBuWd{gr^}p51F3 zWd(v?_KE-s#ffw^CjU^2N)PcYS@#^+2N&!onjM`8MWZmyq{UzhUV1|+a#93t25gOjaCr46AbZf4>ptU)bo3V!G z`Ni^j#-i!kG55Awy0T|?Da&oh*#|Ee_ONOk^3FvWPcT#p(uG?`i7S*C2ZMf%T zVt!)PCaxf#P!F1x-HeJPu-pxPK0UrOMq2xXy6;35e2W3Dw8*)lv)ik)NWt?ZXe^ci zNr?PX{-PU4367R;>N{RWssk%N>{W8pKQ4zbm1&~}d14v9-;n-k~rUP1jE)bvrlX~#eQn%va;f;M;2X1ln_oMmwzn5My zOXFsIf>xDFlW#q9v;zPIcYTTz2D|k>SI3BA?s5nw^muqdeWFgyH6f z;dtUtl!uI=owd|I2L<7H#cEt3ys7~U)FFTVAggkr|0_db#(x!-FF$r8_guI309##{?of_8Y-Ok3K?Xg@)4RmW;fGOMGl!|Jk_U z=zqAzu4=736PP@ul9G7+cMgP=1{MSPC86=EbyNzj+5AHEY${h=^N~MVp1i#wOV(8S zzzV7{nj|}Joj=Y0szs^5t)s^FV&k`{)27-J53nRWKeJOE&dZS0uVQyOC_jJg3-*fA zX}ZMk%fq+T5^U?4q@c?GeJ+A)UI{5hZ3hvKU<=-a+=ezpY(-yQm91c^A>~Ixq7Q6C z1v9(}Y8V+~fyp6>h<&!!wJYTv|D1C^x;Xs9LJt&SJV=4yx?tJH z$QWJ$C=}{&vcN>YOnl|IW2kPFC+oT2{FKZO%`oM)?O`iddk&Gg}NkQ=QOjtILATz(0##k z2OXl{%E+9Ir!JVMX`FOVyF$Py{>J&I2){(`AknRzg*etBvGk+?_#A!yA!Z)~b7dNZ zYYtN{s4G>|FNn;8@yXpyP3rwW3HML? zfV2YE_lfu)Zs)g|&eJ{kxmICb^fMy%A`d=3SO|cZ@f0GWXxZ}i_|6v;p|NHa*Co=N;|0?S|gPKsf zFpMHZKvC%g!2$-Up$3tv2vGrP(xkU=4ZTV=(mM!92~|Xz)JQL(7lD8R(u9DagwR5h z8i6nBz2DrKyMK4K&YnH{yl3X@FaPuFC>K)yu9j4PB%6H!*#~lini`2k)Es>vz9zdV zG?_jB3<+2KwO;b*2s+qD4W3Flq98ArMf+WCPR$FGz$wYj9z&zi%;F*PB*t_-c*&hl z+rWhZdV`?3B@-T7mK>?Eo)(hk$)UR)+;C6Ct~33?W zI8)AW=Jl@~do( z-(A4Yrxe1R*E)sdvF(XC970k@OqjXkFUeeK+BDZqhVmP>G`A_dP{6d4O?|c+7A0LT zoIE=WAIkUUZUWjcRPse|qsW;Z+(Ki6riQRRiZ-TtF229_e;?V7jXH2{(|Zi`$k&k4 z7khEsm(MKjV$aofkeo*(KTa5^5esQe|-qzuNtqpH1VOJ|OxAX19PqYfM#a!+04ZgC0v39^w z{#cP>3w!VJvx@wDPn}uHwFO$$LCaI>n0>g8mh{zVtHJvwF-cfCaGg{C;_;d!NxTzB zo%g;>G)TcKafWN0*Ma#5L|2Zh$b4xwn{~y{{IikiJz@Ff*@t91&^=aAC5s#;d4W)<3VN89bpzlmEIUwEX*7|M zstkkOfKNKo=R{|oFtkBnu|P9&w$!X8jJNm)7a6-;@gWJH(9lHddIU&o9*o&j@ku&E+(#jBC&XIh`Bq(t@37U^uWEWPQ=ml7hYr$1DmqTJehH5*z=OD{%# zuoNve5ED*-Q*(fwWUDD0C7!PZYxll0LZRN7BY5a)GCIEXWaF!a2+X$w(yK}n64O-T z;do3MyPC0^N$!#RFr98iiuT(hF%)S>tHg0rR%jnu(YGn#2BM0u`L7OVN4KmXZnI4j z$kl7PIE-FcHrZO22#m;;`JO|i1D928Z?Txqk#M$qJjJUb+N2{#@zjl_krh2SY!>(0 zsu22VgprN(Fo?sLh7bRRD4VwHfv&ze?3ba;*gkZLI2d9x8;_k=npsQjUfHZKnMqQM z?V^u^Vc8&#=kHZZFgaunhL^^$zdOwgCrF4ut}hhPM6XU>rsS6fyfpXhEMHUS>+UU( zM4yT#n8w)O*bq^`R;Y(e7uK?)a|P%?Veh2T0rj|9l$~wA zSj0gsikGtc%-)aPxoh$Csc=EYEp@7|_D`}0>mm1J$$tdDWiicvNLBILOw)aLYYsbm zrFoBy-ami)unHmGpp*Hy*1^gBK>^`BTji_K`1l7ZC!glLalr`D*ga2eXZ=gJ)>03d zEG#VaPvszR;V^Xy5Ch^Q^Ib(PQVvCV)v(>SGHzaGO%DG6V{L2>R4o_;$(R4&ErZ#^ z)+fu z($31g>gIgn>d7)wSPY%W91T{iZ8>PMx_iHqAU~d|dX3tj0ZQ{qI%F0h4Q&0DyStNQ3Jq{#kM62&6PFd!qg+`P<^0dRX8MxS$Lp6H^!7jLjz#s2J z%#SCSn$!0AtgbbEN{CB#!C2!v)xQb)#}8J*#;ztDgElAMDPw@M84Ka(A+QgKyP18O zQQ8sD(prbsuFj=6&8KfLO6z(ZHyX{@?kD`lrF=2Y`6WZ~h{hvd?I61^ih&+LCdnvH z1>sH$TM()xvpt%=@-R-S^%yzFrPhOwl5Rrq>C84N(s?MP?=j~jUmW^NwrDk{%M~t^ zjc|_0Z?N|4gi-3xQ9ly`Vlt*0-YCQL2klLup;RRpSYd?&RimB>jc2Uw)Qjv*k9(H~ zpSzSCu3vtf((4D2ClIlkAY$u9F)Wa>=I#W5@Y8n~+{#G_+AEulu3s&dWhX??Z*Is0 zJ95lel5h-xeiZ7AT%6PK4P&%lY2GD`-=sIu7Ujft;+rmaUvO076nHzT*o|gWB__3S zN@kg`f9(Ls2u)PeclLY?P*vtPNCC5{_q>S5PceUP0h%^x)G)R~H+WaV;qL81TKV-7Vdck*o%Jp2fplI%2PN+L$z@pV68>a;1938LW zG2=O}Z@JRQ&^-HV%280co)zRk`I$dXOmx&eAowC{87Y>f{2AJt-=4{zvEy*}3#=wh zX6Q8HI^K^_V=fkJ{et{?g;rM()GSMFhIQw_<5X`CLVS`2rLxw6gVkx%vgq;0cK#~Nh~ZYHp3%sk7TyFa%)V@cE2%b z8XNm~D9uOrk5*Ju4Q*B9=(|I5yZT>;04esl^J!@?9@ItSLDz3RxQk6VlyOK?V=<6yl6M?Tgp?>Dx~FmXB2$riMJZ-dk9 zNi1fCU)ZI2Stb8A0g*okQROJ>I8{$o#0_U39CR64Px&xT@wstCSaEy$AJZ5Dh`LO|L3$Pa6-91rp4hz( z$})esz4Xy&bVFXwNvnpT^k!c^U&O9L=WCM!-o$QsHO79?=JY+f56w3m2Z4%hZBEzA z5z?CtV}R|6QEEBDL3^0HAFd(n8oO)tdSQB%!+0UDRl#mk^|;bg4&XpipAM@1U%G$0 zJ{r^Yp6Sh9&)bLko{jfH3OwA~g#}_RFn*PyU~(0N-?H^T8sXA>^EmiAreM+|U$~TG znpn49t#DQ(`+E;L6{ckzJLW=hT(u=``cnDk3UV9zvtEOiK6a0Zd_4yaE2s!AP42E< zS(_T=Zf0<>9K`#@%EU!y59%~ne$-H@+ziq{&P#`#y1Ufnot?~oP7&0wQ0ZlLmx@JG zsLNoDQ^Yzi@r{kf(!Dbh)%79N%F+qH;L63$eb=iMdh7X!G3e5=#;HZ3VG>cb+$DEe zyC@>QxX?jsfUre(@#YKla{`Roz2LrE&#{8}YB4;M+FS7r`JB(4mC+BP{H736?$td9r-@w*om8Xd!CE4stzwp7fpE%;fVtDz4h4FDCeklcA0(Z`* z$Q2v8RgWNt8NRTgtU&79f=F-X@5!Nz}^UEG2BM3AXaNgOI3d$6#Y!uGM1dLNd_{-uRA0%s;Nzn|aq ztc_4nHbikE`NK^{s!$|^3oQ3C^K14(YeA*H#_PV!4TvBFAeRN zwqwn<2A#@e<$t;a%Gw|cNb3Iy(x@9!=h=6X;{K>8a}Yy8LfR!8wHvnw?Gko1Ta?R4IGh2l}KB#IU;YU;OoV vqu{z8>#ToJ?A7l_1$nCfjt2b;z)r5AHju|P{pC#* +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests import tagged +from odoo.tests.common import TransactionCase + + +@tagged("post_install", "-at_install") +class TestResPartner(TransactionCase): + def setUp(self): + super().setUp() + self.partner_simple = self.env["res.partner"].create( + { + "name": "Alexia Payet", + "email": "alexia.payet@akretion.com", + } + ) + self.partner_space_start = self.env["res.partner"].create( + { + "name": "Alexia Payet", + "email": " alexia.payet@videolan.org", + } + ) + self.partner_space_end = self.env["res.partner"].create( + { + "name": "Alexia Payet", + "email": "alexia.payet@via.ecp.fr ", + } + ) + self.company1_id = self.env.ref("base.main_company").id + partner_company = self.env["res.partner"].create( + { + "name": "Test Company", + "is_company": True, + "country_id": self.env.ref("base.fr").id, + } + ) + self.company2_id = ( + self.env["res.company"] + .create( + { + "name": "Test Company", + "partner_id": partner_company.id, + "currency_id": self.env.ref("base.EUR").id, + } + ) + .id + ) + + def test_partner_duplicate_simple(self): + partner1 = self.env["res.partner"].create( + { + "name": "Test regular", + "email": "alexis.payet@akretion.com", + } + ) + self.assertFalse(partner1.same_email_partner_id) + partner1.write({"email": "alexia.payet@akretion.com"}) + self.assertEqual(partner1.same_email_partner_id, self.partner_simple) + + def test_partner_duplicate_spaces_caps(self): + partner2 = self.env["res.partner"].create( + { + "name": "Test space", + "email": "alexia.payet@videolan.org", + } + ) + self.assertEqual(partner2.same_email_partner_id, self.partner_space_start) + partner2.write({"email": "alexia.payet@videolan.org "}) + self.assertEqual(partner2.same_email_partner_id, self.partner_space_start) + partner2.write({"email": " alexia.payet@videolan.org"}) + self.assertEqual(partner2.same_email_partner_id, self.partner_space_start) + partner2.write({"email": " Alexia.Payet@videolan.org "}) + self.assertEqual(partner2.same_email_partner_id, self.partner_space_start) + partner2.write({"email": "Alexia.Pazet@videolan.org"}) + self.assertFalse(partner2.same_email_partner_id) + partner3 = self.env["res.partner"].create( + { + "name": "Test space2", + "email": "Alexia.Payet@via.ecp.fr", + } + ) + self.assertEqual(partner3.same_email_partner_id, self.partner_space_end) + partner3.write({"email": " Alexia.Payet@via.ecp.fr"}) + self.assertEqual(partner3.same_email_partner_id, self.partner_space_end) + partner3.write({"email": " Alexia.Payet@Via.Ecp.Fr "}) + self.assertEqual(partner3.same_email_partner_id, self.partner_space_end) + + def test_partner_duplicate_multi_company(self): + partner_company1 = self.env["res.partner"].create( + { + "name": "Toto", + "email": "alexandra.payet@via.ecp.fr", + "company_id": self.company1_id, + } + ) + partner_company2 = self.env["res.partner"].create( + { + "name": "Toto", + "email": "alexandra.payet@via.ecp.fr", + "company_id": self.company2_id, + } + ) + self.assertFalse(partner_company1.same_email_partner_id) + self.assertFalse(partner_company2.same_email_partner_id) + partner_company2.write({"company_id": False}) + self.assertEqual(partner_company2.same_email_partner_id, partner_company1) + + def test_partner_duplicate_parent_child(self): + parent_partner = self.env["res.partner"].create( + { + "name": "Rocket Corp", + "is_company": True, + "email": "contact@rocket.com", + } + ) + child_partner = self.env["res.partner"].create( + { + "name": "M. Dupont", + "is_company": False, + "parent_id": parent_partner.id, + "email": "contact@rocket.com", + } + ) + self.assertFalse(parent_partner.same_email_partner_id) + self.assertFalse(child_partner.same_email_partner_id) diff --git a/partner_email_duplicate_warn/views/res_partner.xml b/partner_email_duplicate_warn/views/res_partner.xml new file mode 100644 index 000000000..12114eed7 --- /dev/null +++ b/partner_email_duplicate_warn/views/res_partner.xml @@ -0,0 +1,25 @@ + + + + + res.partner + + +
+ +
+
+
+ +
diff --git a/setup/partner_email_duplicate_warn/odoo/addons/partner_email_duplicate_warn b/setup/partner_email_duplicate_warn/odoo/addons/partner_email_duplicate_warn new file mode 120000 index 000000000..cc33e02b6 --- /dev/null +++ b/setup/partner_email_duplicate_warn/odoo/addons/partner_email_duplicate_warn @@ -0,0 +1 @@ +../../../../partner_email_duplicate_warn \ No newline at end of file diff --git a/setup/partner_email_duplicate_warn/setup.py b/setup/partner_email_duplicate_warn/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/partner_email_duplicate_warn/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)