From 6c516fa00c647b4aa448e45a55da27ee4247efd3 Mon Sep 17 00:00:00 2001 From: Gustavo Bretas Date: Sat, 5 Apr 2025 11:17:32 -0300 Subject: [PATCH] feat: Add support for creating GoogleServiceAccountClient from service account info (#532) --- ...anager_client_with_service_account_info.py | 60 ++++++++++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 279 bytes .../__pycache__/ad_manager.cpython-312.pyc | Bin 0 -> 40469 bytes googleads/__pycache__/common.cpython-312.pyc | Bin 0 -> 44083 bytes googleads/__pycache__/errors.cpython-312.pyc | Bin 0 -> 2208 bytes googleads/__pycache__/oauth2.cpython-312.pyc | Bin 0 -> 14823 bytes googleads/__pycache__/util.cpython-312.pyc | Bin 0 -> 9240 bytes googleads/oauth2.py | 28 +++++++- tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 158 bytes tests/__pycache__/oauth2_test.cpython-312.pyc | Bin 0 -> 26977 bytes tests/__pycache__/testing.cpython-312.pyc | Bin 0 -> 1079 bytes tests/oauth2_test.py | 37 +++++++++++ 12 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 examples/ad_manager/authentication/create_ad_manager_client_with_service_account_info.py create mode 100644 googleads/__pycache__/__init__.cpython-312.pyc create mode 100644 googleads/__pycache__/ad_manager.cpython-312.pyc create mode 100644 googleads/__pycache__/common.cpython-312.pyc create mode 100644 googleads/__pycache__/errors.cpython-312.pyc create mode 100644 googleads/__pycache__/oauth2.cpython-312.pyc create mode 100644 googleads/__pycache__/util.cpython-312.pyc create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/__pycache__/oauth2_test.cpython-312.pyc create mode 100644 tests/__pycache__/testing.cpython-312.pyc diff --git a/examples/ad_manager/authentication/create_ad_manager_client_with_service_account_info.py b/examples/ad_manager/authentication/create_ad_manager_client_with_service_account_info.py new file mode 100644 index 00000000..62d22fae --- /dev/null +++ b/examples/ad_manager/authentication/create_ad_manager_client_with_service_account_info.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# +# Copyright 2024 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Initializes a AdManagerClient using a Service Account info dictionary.""" + +import json + +from googleads import ad_manager +from googleads import oauth2 + +# OAuth2 credential information. In a real application, you'd probably be +# pulling these values from a credential storage or environment variable. +# For this example, we'll load them from a JSON file. +KEY_FILE = 'INSERT_KEY_FILE_PATH' + +# Ad Manager API information. +APPLICATION_NAME = 'INSERT_APPLICATION_NAME_HERE' + + +def main(key_file, application_name): + # Load the service account info from a JSON file + with open(key_file, 'r') as json_file: + service_account_info = json.load(json_file) + + # In a real application, you might get this info from: + # - Environment variables + # - A secret manager + # - A database + # - Any other secure storage + + # Create the OAuth2 client using the service account info dictionary + oauth2_client = oauth2.GoogleServiceAccountClient.from_service_account_info( + service_account_info, oauth2.GetAPIScope('ad_manager')) + + # Create the Ad Manager client + ad_manager_client = ad_manager.AdManagerClient( + oauth2_client, application_name) + + # Make an API call to verify everything is working + networks = ad_manager_client.GetService('NetworkService').getAllNetworks() + for network in networks: + print('Network with network code "%s" and display name "%s" was found.' + % (network['networkCode'], network['displayName'])) + + +if __name__ == '__main__': + main(KEY_FILE, APPLICATION_NAME) \ No newline at end of file diff --git a/googleads/__pycache__/__init__.cpython-312.pyc b/googleads/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7a997fadb47f4abc2e0a58690967b98ab526ac0 GIT binary patch literal 279 zcmX@j%ge<81e+~Crf*_mV0aATzyOdB2A@TM)O3avhA4&<#uTO;#$2W-CPs!zW=)nV z9Y=-aoXpg`5`~=1q@u*4N`0rAOQ;Ky9DoZl*^K^j@K?v%{$7kkcmc+;F6;%G>u*uC& kDa}c>E8+y22y#p@FOc}a%*e?2QI3Jp_!)zG5j#)>01y98oB#j- literal 0 HcmV?d00001 diff --git a/googleads/__pycache__/ad_manager.cpython-312.pyc b/googleads/__pycache__/ad_manager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16f6419e97c48cc6d6936e4c69b644a4613164b3 GIT binary patch literal 40469 zcmeIb3wT`DeII!5ykEfJ{RVhJfCNF}#fL}=A|-(UNJ0cbngAsWwlf{#4!{9{8TihC z6h@!}DRM++orp}Gl8V`gTKj9r$XhYB+sJLd&vM&*>rFRZ3_W z?AqFPv%mj2_uP5lLXs6{``En%&)j?7_uO;-@AE(ZvZ%--;rh;#52wbzE=hk*58`s@ zH*3#YB6$tCksgTxP$PaSQvkj$7HUZQRCw?c;X#>lk;iU+1_Jzt$Potb5!o z^Ey1^9+u`E_p#q1{MyEgRr|PKb&Qv&&hb)<6tYgYiq2$zL*?I)RhR1ihWvM}@5nrU zyh8P;UiQy-!!}-Nk&Z}e(QA@g9P&+fWXp=X=`L}X{e8#E@5gIcX+KJrY*2bvwv@Ot zO4qT{r6^stLFv7sO!n6(-LOHKr?Pp)omwv5p0!wk7Ry6TqNaEBY~!0)Y9&&uvZ>?B zFVIePUOP3YsXAMe(M~gKrxvMo+0^mPYW-`{c*}yNy&2uJfjApbD>B`%QOs)j1Ha}3-p~lIXu+g zH#T%)BrwuTEnd7whfr4yv)Psc3X+Ce$?%oee+61PM#eO43JiSH`af zO<)iccc> zag5&VAT=ur)EtkVK`;B}=4SNQ5h-OOe4yhC*_S9D3B@l&wR0km?}Ua)B%Vr6&IBhy zc{2oqFc*ylXGFI|R=-FP5sfG3&&-5lXG7ZO=0n=Ta4<48kM$sui%x~+qFT1s`b<0- zotwu8&Y61N(Qx*AH}Dtko4||-#}|%ABVmlUsIzKxerhTdi-*)c^)ymMymt(PBp#}a z32;&i#X{Lkr(@X{ucHSlW%7wiU!+-eM2pVP>2{jhG_0#Q&+qm!wHqb-(5wF9z!Mhf1btGzu=3GnMqAWcelOC3(DJRBHEU{C%p95IDvN-USrzQzo!-wcw006Xl>siANPo zO66>bfO$*_MpR{jAY@3n5ITb-2G5lVhIL|H9*?5*#p7D|%zQi)>&26zM1ufky8=8* zuhOS*)ImsuCv_cRxa0%@yT!>`^b$;|a`uhHs{97_+xFwjxgl3p6glP)`C~vxB9>mWo z;RxuXSq9$mNr669L?QD+aCS!j#%xMsQfpKCbXHg@D4dC2WenduCojG`D2{MMOoxf! z#936CLwgauqStsT6ra~3Mx}l0dWd@B;ouDBzRG(`GwghD1`{8%fYpr7Qe;jSMCHM7 zOsqe2Ug0YYnBaLTKd5OS3&VVVP62I4a;s3(C|Za_`bxzK`gAsAC;!)zre=oO|t2Ly$Q ze5v1-+8r6U0YNej5TLWsNTzrg)aGF=Itzr1;m^1OFZLZD4jdbNF;f{hHTb#HL#GA@ z0z)H1V}a-UhEETUBKpKhB5?bLbEDfW8SBJMEaRdvrH>q=DXb_T^>-5rj&)C+(Li^` zx(7nBbMfe0x6zf(xdni#NGB-oY$Vo^Sbbe{3)(ZNE74Ri6}$4g{vVJh){kIGde|iS z{0}9Iul4J-snX_TX>+QyCt2E)c9mRdxz>5L^JaOfxi{I|n|66quI8kxdChJqYhfiG zNEUnR8mf^-%-5_B%j24~C@&rS#nmf?N&r(t!1&0u{TQpj<+H(kWn4t|) z#Bl_PO&hOyR#^#VUTg+Am!t=Zo-Y@dM@xtX7-uU9>FW%VvR@<9xsk)A2UB|7_ zmAakFyZcv)2A0$hy~PF4VP~>*XWHevH1Wpl<=N|_sm8s@#=RRs2kkH#oFIlkT!fmf z_`kM@{``)7EeDmy^+iia`8U0iLGH@ZqD6DX4dlIOIS-ot7hlk-oUJ2)+61_GRi>pL zFhI(p1y2UJShV8Fc!Nb7o($4p(TOMYlwWb8q1m-4ExHz+LWYAp26$PtYnDZOq%o)W z#LpC5)5O#iT!LgrZ3g&RbZHeTdTR!d=nauK`yLKF5zED{1#7!4`0qi_3>hSV2??V^ z8gTu}EJ&9;VkXK6gBWnJHZ@QDa;yUsA!yQhO&LAWchaEer{+P!aynf|chu1N&h^$j5BfAMJcE_T@xxh=aGeq&{lSjWCdS3^XR5?-p27S!QfWHZvKd(-``E{T> zms4!lUV_Xh`=T2ynsRf17{d?f6jpAaR4-e42`hv&Yzi>3C3c?oFqb_xh|H{ zbto7MbtyxWjOqjD(2-jiHNm(hH8dHVpNTWJOgR&bg(q};MZ{>AG8R?Ta4dL+Fc@M8 zeUbEW9L?m`H%HB90WqiFx+s?}y@256rG>7M6M_D|{-cB9d(TlU_%9L$(wnTSffa)= z59vBJI)VAFDI?Jc*2W~LQdWiWX5m<*Ee=kJ`bpfTXeb_@4MpeUXd{Ap;vo{5>T!5h zj*qgpLPtRV5?TlK3f7ngB}?avx+a*^FF-3RpmWgFcQwpP66ws?kfUQ`*%gV3f-2*E z(TgeIqbZ}yg?z7~gd#NF7?#;N2#;du4%L4q8l4G&kPb)C61W?@AqIdL&y=pyr_S55DhqfNMNH5yY>9m-;ocHcwo#YbN7~CW z_Sifinzj${HRB2dh_?y^GBpE(hx<+suNQbTyq|HPL{y7q%8xJsMIQT!s@LY)xg#O+J36I$#h2N0~(BCmAx%%R!dPUSQTgM1D90Swlr|hR+Vn(px@ebO)LFYrc0}q23~tEy=fOc zHr%h@1qx@mSXtiu#F|xZ*hjH7AGSa7X2boawp3GBvZ*W8)SGPTU1>V-z$)3@sNXvM%j=c~zB^`g}+#fg++*K}^JBF-Rb^a%W9$p}-qhZV$+ zJZa^`gBhn3Cvh&jKz4k3?udvK6aMJiws-VCUbHRRMx_=hO9W0=h?cUy(>p{jHg)(6FJw=E% z&4iC!wwXmhhF})3UKiI2;R~(q^&JryYaPLJ9(16NR&+UPq0lp@RXsCd7#%_47L)-< z2m>)F0!+s!+l8~ixB>!WVqVigrp`c^gb^W?8bG~X9j}1nnKMEXMXxbG2YDK>2+;E6 zJfvwMP>Dc%kbF_qbHJSp*@-q#Gb4+0x>C@Po4o@X8Q<^E}GgXpG@k>UGXQ zkdBp8#_Pm<>j)Q)Tt-1pkLuENE=&XY!awU-NXV#uor2Ii2|U3m8X9V*A=U9IP_bzH z)3fqoMgSj+j|g;g9^YDpJdn|ap_jrjCQ}9(62L1pCj!X8q>?h5dBnMrJ`FpeNr&k%JY1l^2Jn8r(P6wLh(@| zaQ@)Pz{wLsBV#!{e(e!M|JF}P5xmtfSEOeu0z~x$pdNpIsDChU_{6E>ePi0^F%FrM zEK)xioHz&MoyEHh4WFW1^#&0^pL$FSMnGF>@j)UnGCrf?<9#Q!QOa+Fa5UC#*S<&( zK7ClY%-*TLP{u*gpdOrJ)QEwnm7y@~o$+MfCs9|3#ItE%AT(Zy03yfjlCSK(f78A!O7@)z#xT{`^0R&75b-!G|6l_<#)B~{X!Ea_b-Igs`g zr#vl5Ps`2ow=TTrTi!aD^bE4drlhCozNe1e*C##oxOt=Fa!1-znl7oh=DF&5?01$n zEKNNqlZq>sB0szDtw?$6livE2cVE)G?~&v~gK2lk*N2mCCGD-gap0CSS>KcNf|Bt6 zB-@cacT4s>a!6%OHx_Rlxw~o41G~k)cg<=o-Sm~NVD-%fsR7+@|& zj2JjIu5wcth$T1**?W|<{>+*}nGHcCt%9>-Fm`f2!ubx+*b0Z@ptl*Y2H7nbjRB}A z1`P9!ZCL@fuEFaN0D>e6H2d1uiva#6ut*NnCVcY$aV(PmmB63^bOPrwc|gHJ@4$2k zs!U5GW*A}!_UP(Uh%V1y?q-VfD{Z$j*rQD&O*@AmM$_JaEv0}T`2`Zq1ub{2%ko#aAPx2jgWJk-kI2gMt1N$4{Ob933U&Cg_Kl^j1^R zr;L|zLVVFMT@4f7YQzHp)H3{}P2oX1OTjD!bCg!3^H39^nVCQUIPq5y8zbuTSfw`UHCD#t8hy&C$z%`!9lhXFjjOT zbS>E0-P#K%lz2*KgmsdKAX_fY!vG>A8aXhL2_Z;c(3L0}n4IgI3wNGm8n{GdB-YbQ zNcI%B65yQnNFHlPU8d>0wwHC8$(V7+FD7HA&&RGs>q~OXBE!TDGFtJf(t->X^I<&Z z$!MvEx}G_Yzc-=k*8x_pPBzNxh7cD(VTKeHKv@vLhUo%yE;Bh$QC9}*RAQI%0+GX{ zjs{ZDLX#oT*B~hckkECrF@hN&!9k|wRK@F1bXkNl7oIp51GTM8AO;3ayb_4{nAL}1 z9o7pM{)>@CL4x{;l049*Jd;u=&WnXWsxv_!W~(vE!r+4s-$=VPQx;e^C$ukN3NqnM zyNy$Vr5}?gMq&m4XiohxxRp?{#A*JF6f&H52_!e8AXHBc(xx5~r_`sL^xsXp?rz$D z=giW;k8BNW_2(&*N$bN_kpq=50}wLgKxE$InW2~f3eLX=I9lRBf>kO^d}DK=iSQ(Z@jQnC9&$}GsDM86_`(-- z<2v?~RjmUDkdnFPECRByiZW8W7c-W!!#cQcVDMC+f4FaSR9nOtazUt9SC;g{8cI7x z(M&v<#mL1+$m$p@JeaJ}@Dz~w$x|l=PWO)mMu(1M{5iHtBf$JRJ(4NP8<31c?-tD! zG4(U3IZj>UQ$Cj1y3s1g&-Vjb3lUTV@}xp4uD`w~Rlh4)ziXvv_tN2XZDXpoCt2H* zsy&#jJ-Bq3WR;DZ-g@E97a)*Kxi%$Tn^LZxq^sw?t2E`RNxEuMuC}DB?UpUI?aAb} zCs$m(U`e(fSd%PGtau#|zOQWQIA2)$5<%;HQL%;f_wWFw!gNuYE+k?{3N9g~y10Rr zm4>YZi`aB<0Ob}pT4=^3&sHv$0OWgQab->XTJFTpgMy!W;;);JIl7X9>1foMKQC=0 z^H2Cmr#2Vw1kPi&((MjDF-c0EDd8fyqfpE63Btf^#=+%D9Nb!T#yeMcldIQfQ;gp6 z(@e3Pd}L-B8%8exZhcZkO{#o*vV420e1Echf2w>aSw6H1|z0 zGt1?zNynB|TS>}RowQY7x20-&k~KZ|Y&%!I)yuYOPM3WdwSu0~@T0{jAYrvOPr4uZL`l>!z-ck6Zmgj0zR+xAS$0U4B1pmj@hgo&(@r02Z%$v7DBPaQ+>*O zJUjyfYi8=XKng96Ynixd4nh}-nu$)4N)n(oOD1-i^Xgw=y@?x34gzV>Q&aqulS(+Y z;F>f{nzS-3RTIHJ`KcGSE{BxS=0XQ{qG*UeQ>$@ z$$QS;bWusFXj`&q+pY3jQ!7P#mmPc4-r}X_*hBX5A`_7$MeA(H|BvY22x=2Lld@J%wH2I!K{aw1p+dXafHa54>yEJRvhTWW*M1vg znz5aQ?NG)s8;)Q<0*TA%*cL)TEn|ljF)RSBYH*?5uU$c5?JCva zh$ooQGoxBbkk6#^+TW%-YC?OHg5Ra!8wfHs>V@`u^!yeDHxUR>VQ25X9$2v265H0n ziVYyoUlREEL(~iKQA6Nk%Z-{;?e=8t_Iu79X?O7(4VN31-HrE)s|{&)vUpe8*K_BI zq;Ee-xIHA`_5iDwSEb52lVzQ^LhnxBo_=TMy(24S1L?BrYum4GPgm4l8@@U$erg)u z^1bQfVCtdQQS5pkIh?M?#geDu%HWOtZykK|;5~PHx~l%#^wsHGPrUoo?Wf+G|Ng@F z7Lr9n%Z?#v;yv3L=o)Evn$jp2Xt;id0yek>lnD_6j2ifm-o6u0j51;JuwtuUmxtl* zfdYBhLrabIIglvEEhkT?l1#~H9P@{a;ttW?$B>psun35@MpC+bf`x6q1j(XWLpCAC zryWC(Y1tvsa*VsMrPi&wujI8 z>PJ|rmLM!svE_BVJmj5})iUI$P|NXLsaB~Kc&bt>@l?IwZm-t9g=!MdzSMW?jjtYL6NIs<4r=V7Z)+68Q_(ZZovSKhb?oU%rsD}P*wjHBIC2<=3) zebiVu!d(HjjqlLH$zWJZ>>s7A7F?SF6$0PmK&p#5q!K+b5uKTzjdTZN*o{OR9raxg z`LrCN2P^)sDXc>uC&43GUE-hT3F!SJW7O% zfwq3^Cov3quq|7Pm7xl7C&f}_{gV3HxpcL%q<%HR$qq3MkcEvt`vL=a*oaAm5e2cG zIx?qX;?h9>)Bf^NEGYilZc98tbfK=ffb9oqP5U9#PAn}Q#!SijV(b$5@mZa61hPS-m@ZM72jr>96 z=IP}vN0%8`dw;8Os{=QODR5(K*FQj21soS-9yv=x`+elV#(F76Bo6?b?a(8e%ig?J zVX;3aa~Sp=q$Em52Zsmy#|Qx)K6T^%y^$r^KG=)jT*0Q1IJ8L_l4 zfN{w!%J?7xDJ+2|J+tc|#td6330MTqEaWt0?~QG0+8SXF z_y( zV!-Zq5pIOOv>oQiE4C?a064Rqt7hto>>fC5YB5KN)Ec@~czveU3>C$z@|476zlGJ} zS=$3{RM5OR>F9@HOPY-~@16O(Oj>fK0FV)zTBK^*Hf-OF>o=`qT{}d;6kH$Ej+w;3 z)E;(SJ5>dZ;PGSHF_RBSW>ScC?U=|AUfFouOk@ifdy_iy+fi+18=Dr5eVeF5F?rvP z_+}A1O{7x6WnK!gTMIJcQJ{X+egld$*iy6Kc1J>Ej2dwW#GdGQn7|bi?g_~wgZsMB zW1Sk|V@S%7UaQU&a)g{{W^@%tyG&KbHY_t7$7!#wM6*tWnP#HmT_f7x$9sWjw-Zmb zka6fBxI+7fh}Ve4EPWGJ|)BcFEdIOBw<1zn) z6%H_}FL3BZ9!UTi*%++CQauH%9hoXa;*EGF8xtF&8P%v%Thr zG0p=JLTUdP`CuwU$V2-V2=cTc-m$0w>J#valFwmx<)jW1;2#AbW-Nxw_xj?ii`NI< zI`+HAa<&QVNcwgxcbr)9om_UDTy=V1fBDsyukU&5!0#T|Fq5x%X^?WFy0pXl`phdc zSN5c!Hz{wuWqa3m+jmF(qjP_FZn^DHvi#6JN55WaPS%!WdCN`p_s_k3E?K_wo?{o~ z_{yta$;q)bS-$mF#k)M~poE&-`({E2F%X{uQcCuDpd3hOnocuoB zjQ{@2Z@-)@-*wNid$qFW+UKu+{(9(d2UdIb{E_b;_#Oj!HK(fgC9C(5iKOqU@4EWd z?3=UL?@-hE&}#7wk%^*xNM1d3_@O=f$aypjuyN5nLvjS=)=~5lSs^BVuTNEJapg^C z6X~Hr8~1HQ8|N^!S#EekRdaz+N=R8ZZ5WvZdn#Hj`qaxf^={-%KgTE|-xJmAs^AF` znskIvFzL!9MoJ8)z5b7#cgP zGH+mPw0skl>xP9zV^G$NK`G~C)@L7-tNNgDK2$I)te?5wGk8LdaecwCfLQ#m=S`dPT1JTe^+$-apkkCJ`oO(zlmF=OW~k z%6YQO7EhmfZn8zsSYHe~@v$0_ING-n7Bjc5Ubk2IaVFOvL0E@E^E_oq@wX$e+bjLxsXN|NyyC9sDiMijc~|8 z>e_;9Q9ghe_C@8y|8xi=O9+|GUm9t;g`AvZ7rK>aOi)-Rcn2Fta=vk)*hJJMKCM_x zLLCSB7KA$7e1^3cUzmePmKm8Da_(Qs%Cc#HikD{e=JP~qo)YRmChukRCL>OT;g=OJ zrhOAd@+U#b3-B&PL-xErMj*_^=;#`ruEH$u(X`lss+bDRUYxSECT*=ZPv07N_xSDO z_iVkZHH}LHuMfX6e5E{zEvUxiXqU&@Ys@6Pkial+M|{5i5LIjc9R+_v!M~*7zekX% z7(IRD$l&N0oDrSuJ2J@WbL}NcCt(P;EI&zi{{sbgDfkfuA5idP3jQ?(|AvA;r+_97 zmkbZm-M2&l->y>ZH}LeD^r7X*W1Aleu`AC%mgx7vW~pq;Qb)R^ZfQrlTv_Vkci4o} zvD&)r&e;1EunE7VrYqa;G=EUtczq_-)SYbVUTNC7QoZZWu4MJzHD{Bx>d~{ZVjYqn z4agpA$)g$(JgAXsJJ%%fxK`t{maH}SttA`;qD#g_G8nqnzK$SYs}!<9Z)S%#zK^jI zct;0@D%(Q}t(Y~(>z?Z~)nLo1!M$LI-55>MMAd2C013bq{tHM8Pl^XFLbuW@=od-C z=y@%HfC%ns17Pbp@biv-J0QJbeZw|kosuRjUjm2zMSQc1R_wNgTN6_NW6Rn_sPYZV zRm;~JY|;cuT!b2B0!Hfm{sIs~(1*(UX)_QudMH8Wbbyp=+)b52s~XyKxCccV{9-}_ zHOUxZmS6%^RDvlv)_BM+Kna(G6QIhi+yF42X$L7J-wepWRRvpD3@30ABk6$ta}(y8 z)3IXQ#XuGsdT?=v&P&4!2lHSE`-Z~z*9V6*s2ZFoz+)+M^DB00>9n3j`!mct20`KG z%nmoEvoY;MM8VFkA3qsc<(qwsY%yA&Y|yz(_g~>LL9>L53TS_iiKO69G4X_nW2;nK z_m=Zb=MDE`r`6YjefYJTFK@rpa%uj7T`DP0msX@ocO*-9+#0;IZ>999HM_OQ@qjWt zqU_kWXK(rWnuJ?s+y3=U`y6?ePoxxLtL^U~e4QK?8LRDbj!B8dx?I$r{Z;YC zxpKZ&u~#0oo5(y7Ta_&*?hsoe?z6wD^M(~ECNf3DHe~aOJH$4L`|K}bO=Qf|N;ZeM zQ(ZUgs{3O`bF;{q{WV6jP4%FqU&0%k^q^I=XSDYD%d)mR-X`KN$-qk9*Ibw70R!p_ ztOcq5FaAA!qBOo_5!L#Jb;82%2i_1qDWvIk(RTJ1_{6ZM1J0-d&ahmxs>N(XfAK!} z<3u{K>#`vq&Yxur7oiPcqLScWU{U5^A~J3TC9C5K2IUz$0W?JbFJJ9%f{9oO!bZ6@ z{Bp3(f4Rtp>?-(B=i3r~S`=eA@BBCvlW~uQUWz|Y#5_2+Z(@dITrb7K0ir1~zC+wC z5lhZ^N9JeGgf#Y`U89^uWY$OawLI?cB2K%G05$!ubkC}DQzn)nPnSn{U^o7+jUf0P z`Isa#hWbl@MHl5Pq=%U|VGDL$wy07q?!9p1z!bK%yfmjho!Fg+Dp|MlnVhZzs~ zs2V+F`>}rZZ^^CBa^2A%Y{>!_4|LY<>w3~{@Ug(a$;M5 zFhW+4%(oVE2FLsdlRYH$mYBvMj1J;m8P{mY_&#h@{}}I-XhwNB!!lN$G9Nh?!5(l{ zx)&BBUF}u;?X6IxWNah>$T%bH3&t`I{wbNgr1m!I%jz_^v1GnAWP!z`_Fq$p-)2Kg z^ial%U2=>p(bf=&eQ*7g;hPkYZZspGXD_b&Eum>95~hGEF&XL)i7L4TNQ6Os3?GYR zHd%hp*_f_wxV0n6%&YIa%VEm6=N`NaAhIi2^yISRNglcHt*767`ks3`C3Gf>_Afj3 zKX&M*kE!~OWPQgycjqr+d+Cv?w}Q~ASKiwG=Jqsxo_h1CbZygHwQtrwblR#*9w0*l znNp^?;idR#Xnt$>&EZr-XR@L5VY#Qm_t0KMwwOh*#cas8#ayjwUghSP==HUiufCkF zth@H&)fZ7e6?0NCCyJHuV)Wi0xQo9YTcIh3;9m970vpl?lDua?hRno22nB@fM(C2N zn?D$QZl&Vb4^F=?Ul~nRb|)*l@5p!d{iyP(_fID)jy<$nsU<5~@<>Hh`JSMBIYy+`A0Mne;&6<#d(3!ljhT!VFwg&rCJIf7Le7}@ zIL6HV3C)BT@I)4*O|T&SpmVp$w&+JvsTB^Y*gk9A!AimA|8UEWTf?c2gUODAD;>|Q zYPBGdQ9fr%>}FEPy!XfH+$A;8_y6EEfGQ|6;Mo^fB@Ju1;;)l zP9|q`1g!ug;kG>t%WqUh&!6VP*4+`2?l> z>|#Dat>S4x(%3F3TgJ!q4CMQa-jtwV)}{sg&=)BJ{Ipb%RLBvLs3uWUFr0=tWhWYr zZ9*0@Ak@8?>Eh;=L1UMIn3`THQcp=t!(`*`I#oWq9N`~Vw zgN4Z^a#jUf_?{K}4wxs2b#qLYK5`NwXM>W^kjJ_{s)S9VZgZ##N&Xg9`{!s3u$&F) zd${MuLu}m1ls(5zlS#f3^@U@aqe9+8!@38hFsxObhCR@&)_1qx-mdF;s}8}zTy?*^ zT2*)L+|_fWB?UWavA3|*xq%7#Ur@)g(l?rGd@&Ew9j!bTv{L)T(7=g<%?>9H#Zt?b zTVu;l9#2uGds{GO^LOzMSiPUp zksjC?vOqP~1+zdk<~v*G_!9h5$rG>`Ul@fy-7bdq|ng?(1N(~j{_lsm2BsYX-PiOXgV@$8wQiI zhlD7~|L>Iu!^nL$eT;tS)A_ce55g9@7R00(X)k6jg!mroe~cJru*!Us`N`-WUkL`R z{Om7ZVD8H^;)%IR%XlG3)E&UYG+NRb&%8FHpGwAkm*N}~Rp00hzpO9eATL$>x5z1Q z^+nus>E$^p@6vsj#7q%(b-~mXMyXE|VE+NiWB-4Ha8I=AEV^{&mBf|NyUv=lzw*k& z746c?OOvZj-P~0MH%v`4>ww{O{U+v*6#5hTt;BDtraM{FovJyItbwMH;{4?)zmoJT zDSt=O-?8HFS~_~aYV*yb%T=9FMV^4s5cYm2olPm{uDi}%X@}?a=qu5bLrFT6l%p-_ zXk)I_nvzrQyRd0JH=+@D4&#xLSVKo2kmZ%J%f5db9ntJ z@20!nP3gwwRO6mx2O z*=G7-m=uW*rSVmWtHD>nX_TMts}$3ipZu~oo-WZ?xJdJoC+T}UoBbXQcfAeix~5d! z&Sc%rRNaAO9Xt}Y-`Yd_so!h;e#iIdd(KyfL-_Q4aTtA(zjlP(Z$l41gXntEc+*#N&U!F4l(*;f6pn}6 z9l;OL^;7e3wjR`xKJ!E#Q7#0-5F2kh12NjUSUc0p65FW*3NWFQfFQB63W?4G#_^DtT=R6(yE* z9%F;H^h4V{^vg47pZ2wvo8a85y1yqT#mwrJIobW-nGo|Z3vo=F{in4hE zczFkZJtq1h5=$3xW{O_GBs?6|cq@s90??S3Ity49BZDc}x;9CmHHur4#jPvFTbGWc zE9z4f+maRAZq=<+?71_Rtms`jzFJg~Dr!p>wcRR$mx-mrtDcf8$L@MI-8_8j?A_MA z_Z^KXM@!PtvfTRAd(Yo<4BQ7jGX2W*a_Q!Kj+V5)D&=oa`rB`HuK4#aO+Ii+-cqCZ zO6y+8FRfb-n%RCB6EewkFOFM)!;7Ar7K%h$*c1cco)4fc>x~or>jLh+22L4$OjF|cKAQP0H#qmlciHjIJ-v9 z42e~{puq+KMkvfncaR+>q5~EJM0##o^y1)$>?%JK0z?L|0t}=L;!Ij4{M&vkgvTo5 z02TmEht4?-<$!yfT9FIy_-cg6l2{oo|Kj!VC_)g}PhW_DCUKsZX+=2OgVKl(W1~Qp zb{%X4aDd!7_~u|nFAV0>AmK*fi*RIOW?l^mt_pkkv1tSTUjY+gvkX9sE%X}qi9sfs zEOQS0HLyjtpt6nm>(RZnb&#}2>tL=y1loirkgl$Fqo^(g)N!hTDGGZSkH(?e3TV*_ zpVT#;Q$bEq2l@~oM_&0yo2-99XwJ02yW0SB3drMvs zLs3Hmgq}JGMHTDOr%w$tl+`%|e`N4RGKJaAk5-{*`or;ref>asxH);^)R;2RH`dqg zyAXEYgg1HU=C8c zkz;VNH$I4so;17A4wH8)RG=ttj%S?uOwH8l1G9eOWy(ZS_KRmK%)TJUc{ZGf7c;OU z82yY(j0O%*ISbumj0A6d#qp47Rx=gi_4%ldMIj>&C0YuQp;@M{5l&o2rND`s^Ks&; zvv%3poNnp4^W5E*r{CQ3{@}8sX0>KZy5&H+p)1|A>!I83b1V(OTU!}UVcefA-Tz+W z4{a-@$CsYFZ>vw)l%!2rZXQZEcipi)w#xRsKgq`KywiKn_B0s&H-7c*N9Uc-|$`bJ+@oyRZy#W{psQ=I>znBv6bR&OQ8>n z%B~Ei9YwFtzA}4d5L_jpT0cjWcst`V5aj@(u1VPXNk$>~vV|8=m(^5zVE8B}K7n=! z1xaixh82V)1I{GyW#>roU3pyO2KdRX2~A)yNqtx@e)J)cl0t(8PzWsM@&DKh_)45u4oc)M$lVJ_5@zbd2nTxsz zA~H-F!hu@QrQy^Gj7o%*Z*;L9@-kqHkQHx&l|&zg!$6q%l?6^h@iulA$AeFuW!!aK z`)@H7gg;rg(PO6R$~g53xQ-o-@TFHRK0m5B#hMt44&xOPTQ^vJ1^NCFEx=Z^iv`#q z`Ab2I+FU7HebQEcedy+e-~YK9lXz)1fotqdYT^b@Cg8S$adMObHT zOo04HT23_KKax8>k~hQn#;u0ff(L`<{_=b@9)f3T9D_l(K&~V0cAVlHJD+hd^oBg2 zJAGnoFwi$VtQ{a6=i>3v3qpE)kYc?#!@(DWhZYCVTOdcyRGBP@{@D4%mQP*}$o4~8 z4*M}fVT)2Fl~rD=yIObs*qzN2|Gnq#mn4{mYU$$S7wXy87 zx@^ySyc8^pHXApjz?bYWYqY_v(Z1fSQR`LhX6z5;eZ!&~D?%xL(Sl=}44D=dp&`98 zRxb9-yn`=8m-r={m2dB!_<=>zlGiuvEJ0F#h2~) zvfemGkzbb$i5W(s*(?^N{j78;M!H4h$o}TmfV?Fv?@)Y;$YHi&Ker{dG}o9eFQsh5 zl=9pZ0ancnScSB8RJsfYjSCgJd8q~FrIkT1rpRcJ6a@)zlf*}cKrt|E&0OptirItZ zz_g$ONDPD;<}P_S^R@wGW)=1F{S$doKeCR2dwtG->OT5W6PnX4TzN-;l=Fmx1juj! zjl&(AIhg<<8)~60a^Qp4fTlwQWu(8A;SLghe%QNpjls^3BYkcv_s95fBY6rS!lBGY zlAI0X*hs>VA>T$)EQ=g)V9B?Yq{*S%Nh-olQhS7I+vQA|ArkAStuoXvY~Xr~M4V!T zu>!_n%O;p@cqya`+jhCW%r36`A;BKx1nrpleIp~qJ(Ypme}URQ)8gO zV34Gbw#H~Uu(|pN$599o94ASV07TA)U()lDsbx(2U(f~Z5LIT`y!of-6gacfV~6)^ z{~IL`1l9g`3La39ZyEWK+}U2qeNX;-O8pNM9HZc82r}g+1Cf2B&f0l!H0OhD396CJJ`gij6>-8c{#SpBdtgMfo09ZrRC9 zG~MA?l&=;cX?VzuXRiH#Xg%jMr|6sh z1~UH)WMhTo@?U9BI_uNL)z_WLV&#=k+Fg3(#iYB5VqD4M=2t?i#bryOKXdxBrkwY^ z#bmHZb79Sj-^Y^d+rC;_ajoWR&4-)Y*6f!0cKlxHfZo(!`Slq2eBYg{hehB@ecwv; zp_Sr8I6(#WL-lYoWGUMYBO>qi$1bU~P8@)>Ct0#5U3?6+mmVjxNbhkOwxJbUZ-!UO zdzPkGVO9F_UH9g+uk?-Mmycg>xgKBfwO*n;J}46TL08R5Z}ZK*yWTD7V*eXwFQ2_~ zex)o2(wE1S}&Bd?HUpf6>EiSvB`fmB1)8DDX4P}5navM`D zlS=v4=@tL(W!G*>sK4uNz3;DnUX6D_H{hMEhl^y<~oq8_wd$yzpIAdBs=NsxPc6Ob803hvF0373yAxE5SryQU*m_XWO_&~mW|=+zzk z7CtEPki_^iE)uB8U>X^B3fURK1mIrUI828kE88G8nwy8DR6ld9eFNnBA4MQg&^PYS zT=bOqdlDR?MRzq2XA@Jrg_=nxVrq7=J@%)mJcq;OU$k{QN0yHD*3d7Cc%R z)$|vX48O_b95G{^fmD%TH_UyQz>u*`{(|A;tdp0fh%osn)_pVuxL_tz!9IK7LVz)G zdaSme8vJ!?(9ZgqaWNVRqV0^I4?ik|9TCVp!e2x_FQP zZRuFLvTA8$)l-~q-1DCM{{G?g{=GamL3{8JesIIFPV0Roap)ZCUO*l|Upk9KDBJcY-Sw+D1MPEny-n%z`s>GWAjGAuA9!lNw|AxP(D(M<*>e4f zoAoR8o$u{U)*ZU%>0d>r!|+yg$#uW3@%q_sbYAlRc~#S;!zhw&YQ6dSyG>m{M)f@( zG<5-~Ju45&22vaRQGIW^sSBN`@A*rhs-4JCy$L|xU46Yf>1w}Joc7k;Yua_!y9I(e#Mh_BoIMmB6`*)F`&74z|7Pq zPC3~nm{e}uDqxvOx|Lw!$D}g|YnsmBwrL83*rq8A0*jP)h=Rs-(UN6^&7C=@uH0Ul znK)z_+mFR##Dap!tdqbh5+mxuvq$yexhR32;3x?a&=v;=FxWbk%;mFWki+RTuF2=h z2Bw|@52Mp}Izyy`<`WEJ6Oqe-IpE*W=m}+i&)%JSRpMZW7jbnSKi)YoFn084@A2ck zqoau~{g{VbS3lGaH*H{0Q0JkDxTX~5vt2MW!kHWO8*81PI`8q&dM>b00B@9Iy$DJd z*#Qi4d<3trem)YWcLGRfHR@1;YY}t{Fr9ZIBDa7lFWj$m16h9hf8ng~k%Yacr?;mk z{1F~9@;E5st5p1p_!t=*M9PVbi_8YdBYeiiHhKYcX}^MGA$|213{j>i8vzMi?jzni zUnZ-42^A&U2F$5wMCZ})dkDx8Q^-7CR5qq6wj?XId~4!X_j_BD+xy-}FtoDux%*q& zMNC_A`*SN>kLAQ{Np3&7vUMmMv$FLNf7q7X-oLVSAn#$#Yp*;kFCBmElPYVk9lv@! z?W(@+OS-lIHdVI$o3`$^U%FGY()Kj@i2o-q0}k2C01sW2S593SU3S)9f8nmP71jXP zcV9oWT(s$COR{LoG7iDX+6T1DKP4mlcI#m{H2yN(m74AnD%c=&lD-j{g>VeFneKWi zc!q*u3JAwBNg*5K!i_{^DbLL1pCb0;SMWp|iH?2Pv-i$oYTwc1zN0Jqo?GcT_QONT zo)hV+x;5)2>oboI$#$#qsMv08Tq|z0)<1Ywmi9iC9y-2e-)5~}8;8)F*vw@kc7PraQ!t3&Bi8|bqUzJySJ55(NikXjIDJ%> zA2vyH=b8h=!jC2YkELSv=l-$e`LX2v*HYV`ONg(=9~N&z@3K_0TE1ghDp{?rTb3$T zi>sHsNT~0)-j=G{k*wR1@mJ%Zie=jlqEI@QQOvia#PQ(satFfkZ20hmEp92XEcqTs z>|e3SJF~~4?oL+iek@Vk<3o=9a?SN{s;Mj4)Rk&FkZd~eSVGj}^Kz#QcQ*^E>b7Kc zTdEo^Yj!=BDDJ`ElEJ{I3;!W$s?ev1@Dk>W!nsJCQUmQ9g*P!CFxWG80FK_CL8K$8Sh03{Jk zI#erq4{zX~Luja9P_?roH_-yJu;U zNgSnj&wl^CbqfUuw4LtRvuDofl6b37b?erB{_p?4|GA{ZE#dgRM?M(a@+C?7OZp)W zn|`tS6-AP6N?~bO3d>>3ggh*>vt`)A&dRWYvoc|wv<=&2p2t3HXU`nN4t919JK5Q# zpWVZ5_S-Y;VQ25Kmz_(7OW4^r?8DhQQ94;RTsB!gTs~PbT%ng;Ib6l^RO{!O;ac{) zZn%z}>xb*vxj{cS>gNsmxk*1a>*tNbewKfeer_4|Tcn6{{D|m?+&R+vy3BtKw?(|; zCv#84)%cLO%AJQh*2#M|mq%O;cde86DUl<09_|j?hI_*H;Xv3C2_)^3G~63@4sQ#) zhPQ{^!#l#B;hkY`q$AQ5=^jQ@FNlbcp_J-xEjAK zu5#zs^~>P{;fmqM&`TxbbGfJD%EzUD21ydeXnCK(J_1|T!Ux* z;aa2v;X0&;!}Umygd30^4L2e^7TzA-@S;3C$VzBJ3C*Swj~!X0?yEPK|8XI-W@ z&at~&akm>ay!{cid6MPqLC!$roKf~u>~1gaZZnno=~+wXj$~hdY;rO-yer#pQ)a zbZX46&P=h-O!;S~;xp6JF*Sh?pP5ZuL`^S6)HrJ9?`Vq$*#FLee{jklQ^OI}pNOG| zsmN$F;U86Flm6%=y&OWz;*pUVHJX^ETWai5WD?Egt&89rYQ#Sho16|Mq8FkQl6VymT zD^Vk(Y9xL!n20?and+3aI@Ftf1*g^MrBEUgd^R#09F0yy@T@!>nTU+xW;hrc8HvqI zCA5mjROrG)1m8waMB>z$TII-0JQ14=QssgdQFU~(wlO+2GBFd51ZNV|DbYwg7@Z1Y z5~#t@7`ksn2V!hOx{%VMTy^5^O(_Qnc1r|s$Mprv^6E)Kpav=75cd;KaV0=x;dx%p zQ;z@YL8|;_Q{A*6eJ?pnz=cG@N+xjiX zIcc-BU5d+>Ewc19S}RLm-g8BHTDmNE+LC{Flx8{x0F%v_>G9~;R475SEL_^^Zm)6XAf{?f3VoWAXhs`~C5Yn9aed&}3x4|NKR~O~1RvTI`8WM@FKf z(Gh<kl4A2U5Pjg=avIZsvVq16aT5$3;m zMK6UWW+GH<($ei8N?QCK59H2Hr&bbt^8Db*!ShcCPoC~Sp;^ac(J9S35sfD_dz>w4 ztz4g4vq3d7h6n1bX6whwQMJ-w|LIewP7ei74ju}g8$5~|XP!QP3^$%SeD>Vn>7h=G z=FWA8=F81df>LoBbie<>S3FUqUfALWyDd}frlCwHnU4QfG8&7{T@tq^fTMsO?KDM;+ z;8OMDsiC{p>WsB9ZEak(HvQa&ocEoQy-I88{+-yLd{JxJwxY=19V?P-+p(hH0iJH` z{GHxEd3@1xV$piy=jC`KHUA(^ll-LvefyNR_Sp`}juHGc4zUDRYjEqP6p=txNkmbB znz8_+SZ9?^tLEiUzMld4WKVx=DiMkTxW_MsR19W35mFN~(*S`0Zxk(HGD zb-ff>N|cDV$Bk7h?jWCj`B{8>UY@tiS)Q+)vy7MLa)>LDGpszj7xk<))w5FM$(_U2 zITIwAm1d<*+tA+^A5o*z366JI7UOMNe4$IRDCiSajj8cKryC3B%+q2e z1W)xHKYg~~*5D9sIf8_HfP)>EL+TXapbf!+!)MMO?(aK)c))o7{NYn)PU22s5&dUR zYxarQNN6IWm5oIbdb9L9wu#tf6m6xVfv>Fb$i%272Q{Z?b)0$!Kuh)GtT}@~9??WF zn5;HW#(=mzg-r2DBq`~AN8Li-+m5E?mYsJ(Z@28dYcF{z_Izx)X2|1dwmyF%)t9=Gb(AhTY8Upsa_}1mmm0U;zWjFM9(sS``3Wqv zszY+N|HM!6@+lchZo}SHd{7$dv{Cg4S_XrfI~be2#|R_(Y8geg|C zG;S;*Jk^gm>2>}26*&$x6P4zzVR_DaNm4hOCN53If@7QzbHM?msF(Hv$|#0JbLdgz zoVU%{@GWD>jh7V^il5^}7S5balpsqkY0f$)*CXe=Jy9#(pR*_G#I-=y@y-8$Rw)c| z+rFiUFTNlr8b!(Lv~z=a9=3~bi?;!4Hj1Zn_VG>PI(HTzM7%NYz_>WkO3Q%s48YX9 zYtBCBqV~=?=UfNqjNgw*UoN$>z9`!BEu#FWBx*G8PPB=;bMl(}ggv6vIcLJS`w?$;8E<+`ZyI;mn+p1&0{!5f^Um2XfkgVU z6FuP7d&H~vh!;IlWkuhpjfoyn>Ucn0<<8-fIXg%*-?x-->G#USS7r1rkzk1`k+W4& zTQPdZY8(Hg>w?c9t9b@pmN+R_Q2v&GQ2CBI3+nHjbNr_KEvuL{FUaB>o#ml_j!K`5 zfpq}$5%GsZiI9IPG6E`{ab=(pfwqaCiGo!Dg%=Wx8{>9}<_9v5sUXZ4xR>!ao@zUNIi?$EK+YU>j$_hb4$!y+Xxt?q>$n zF`mW?XkDrU!Q1`08sQhKr2q287;q=6324BX32>zm#+?!w>KF8IkQISkoLI&MbpmP} zMla?{4H0F|DQ5n9@h;l$@AHF5LZ8G&_3UvJMl2My8H1sB<>iafk&CS3SY`ZFH}m&c zzjAUv$K3Xv8AO+j`eRe9e2kQ6piVYKr}WZj5RLKa27k`U0#FX%%IRBbC<+RgH$`+j zSVP9H2YDSozAfTKy;1tN^`>E1i?oT2Ujb_ojxsRSe>F%m>836J($)#dM3B*QGK!K_3HNcBal`QoDwUy;2}*OO$m=qCqsfxjZ9C3Mj-sa@U`GU3oB3Wp}ckMf4c9~NqvDZ za<(ND4o-%q0F%@fT7aX`D<}p-i;948Oxn&EZ<|5A`lhcsXFo=jr z9SxsP9y}KVzpKwN(F z^fRzSW2i<(Vq;U$B=4Nj*aQe;>R_7XR4Pqm>iY<40KT85RzM|u4)Kf|zEQ8YUr z8O=@Wu%F4AH0O!PESsE~JBo=w*kmN4St*CsILIYFPYQw0;1u!CeI$_38Vr8^?BSz> z=guEK8>FFTUn2revr>zRi8y=uGf#tmA38F~>Y`N!4_`^B=-V>{`1N{JiJRsXsMQ=E z>N|AuFmeCjQ_c~mPan`K`ky>^{`9HfvBP}>5CE`yPMxcXtJ|qJOEf0~_`nicnSgif z4(g@VhzXI8__SI9=?Xw3dIZQ<^Xbw%T~f#7b|m)+CH)qih@!6EjOF%Q!f<}XLDZ-KmW{KcV))ikajm@+<~+^uws#2U8{=4vvozX*tV`X zrK-A{`)=&}=Es zQFDDRQ`?cQ?O3Yq0=t&#$yQXQdR8n>W#@aPZC90SWBY9--PoO)yxyO-*Ja%`*W+n- z;|DgWY|Bc8RNHv-;*E>T8@JtQS*qE+XsNtg-n!VfdvWivrSid4ceW*v>bdSqTQ=U^ zyfTC$1>S^~<$Z z_JUQ}S@6PryX0+o^|2M3#kFHqQ9L_WB*nIKMM2I7aaxOS?Xn%&B>k|x;%K?_A2#(I z^(p_cy!V)-6z4#H25!(SvMt7ejvK;S6t5pSt~9}}2bzWfJK4&i?u5B=Ad_yb@9%3_S{9l>h zC6O`d$X+)%Y(d?FgZSvuz$q0Ts72Sj<73_{!gWJjMPhDSA*T_x%sZZQT+VSE_Rv@V ziQ~{oI8vh!WlU#5z;L3JlWzaSegI1m0ca4i|HOX$6Z_%+|A_sts27Hkok#OICoV~c z9uq7-(cWM~nJPIPNR~g8HMyZ1EQQEA8U-&HCk}yVwSd3Vqgi5c%}T3Xvqj^f3vtaI zxiSrw5nLq%+f=Y-C2@h~7(C5LX7vyNwAxR}03}40bvo4uU6W;n`e{l?Kcv|&a{c#{ zbmtkmBS+#ylnY9a6MCgNLXU}UR1$%|jlcL`ApxbgPjY)-uDw?Ka?`b@>xpI8hP$4U zm-k-VoAETIJxvSYCC}#601<2l?z&2@hOZASyXqI7%9hvOY`oF<)uzcEPET)$i^laSF>pLW$}Ts>)5550_UncfDSs6F2Q)~6PoN9pZBnO+~1 ze@O)l$`9fs2YgHN93WOr(01vqJ+{8b9dAAAz?~mhx(@}EA8c>x z->3Z0*VeyN`Qc6*u16FUAPz&WejKFoOEN5uKmkPMc_k-dzbcQy0_jC(PSG@AD2@c) zR`*_mH4;fGaklDb8=c3LdF#i>7HOOdj(MB;YtMk1nzvt*=j@PuI;_&vpBB{4j@lW@ zuOhX30kv{aZ9b+Z#9tH~Il61i0_sW`FD=M`pJC@UxtP){>=OMGmBrP^Nk4}#C&`8U82RQMbB=2=mmj0g9OyGI`Yd2-JE=blj&bUqf+OtCjRNQ+Pp%gD<^7hS zt9U`SNOQJ1YgC$3z9WA{J_q(P^zT5@33V`;j`)j6km55Jn6(U~kt72kY{`W`f*~co zu|U!(9tmD`zafw0LKY@d9i0{B>DdAM=#G%R2#KF4jJ`t!5nnIFOriww4wt*?rU!Y| zIw3YV{EXrs5ylBz2lf zqDHA-K$6!IHI6%D>4QS#wGVmRFaJ(n@5~u89fchgr)+ zbcD-UMl)C ziuArSXGkD*j*$nNoy!WfIu0Jra%-*gWUR%-%v!xD;@si0PYw1T4)*o;pJyd#o}-Zj zbOGl^Kz(TTnQ1KJh$QC?_QfO@T*|U=FYNB}eu331Iq4 zYpMsbA-ikIIrvWC7}90i;5}#6^9!i7b8w)6TXPn^I{{oj~^L=1f&< zx~er(^;o*j6H|^YZ*IAx%)}@_w z8E0$SNwT6P=N`RaNWp9s8EakIT9ur{r$^ zuWbic9E$4+c~!A``alU;ZGG|w5U|xQcoto|Z_TG&kZ$c}Mgt?DV2p!wm;|g=-$Vis zC6A+r3lFkD7P1oKX6{gPKS>1UCZ z>9Szb1~Wcg>tpUSA=PK<7ra2qQs`YtNeRa1G=1W5B7-BS4fT?Spnd%0C^@I9 z#QVBFg&>0tiOEV3w!*qLfWRZ`4OCv&>M$jfeI!I3Go&?#i3KCG)QFlOBSru|(pE+R z0inq|0xLE*vrc7wq$a|z{IkILm&u+Ri$ph1*2|t{=B`9GQ2F}G%YB7Zv1EI2UY)_jkLA_? zuCP3WnwcaDFqz<>V5n13iLp={kZA66k;GwUIvwtm)z9NroI0G_x2fdB!ICFw3XtIt ztV4aU;ABRi{;)Gtf^3Zh1P$54=a6Pbgkw! zmtyK;tqRZ2$DU-$$=S2I#jtt<{rGuPr+Y=G*Qc%Z3*C90uKo*T&O@t&Qt5BC8_7!$ z7`&vsWF?`&i_({rs}dI!e93xMxoU;jKnW`^I?1XO452mj3{cpB=n2d^%un7?FgZpa zaz;@1BoKU{=mY8()_FNAhu9P-T~PpABs?<=?{zE%!4%9AxJ^MpH*l7RoA!qT{-GGm za#)R6sWgV-%dA@MasTwp1<=6$$p{bx?2Xt87zyDM`uY+1*$85}iIqW1&panSatid3 zAYIVrg8$4b8LlO<5tuWfWky%ADsmoFclUq=!SpoVC;5CKODpJ7!!?8(^8f~!?blId z1{B1{c_zjp5RkbP4U^_y?~O-cVnkS(+6kOS*qJW*Q*Kue@g6IW?lYJrG9@Bc7GMzXfu5n8Gw9-y(nuZpy+xD@IIATrpz-=`R3~3vZkq%-UzC zUX7g71jGQW-us1l5C1ByP`yF)J>Kacuh>Kni`HXOUc>^SRwwup#Rak?Fqh4V1n(?dy))0#PDd& zXq@*K0IQvU#0*j^2IEI`U$4{ZDFzCXTRCWrs84c8o0C)&$xMK^4bust>J5^&QWr~) zE_vGC_Vj(PHq-e?y7Q4Ywk&n_En52?=4y;deH>+cT?PPFh__K4*Q}7pK>!0wNo7jD zX8n>$etXT(t^zDeqj2(h(P`*|IdE2z9Xe#j1g3!|ASY;#ya^R}Aoq@#*8@be65;RF zE~=8nywa{2hSRcSk*-123jv|b1%yn50>XgM5r|bQGXb&dEH!+#xPJ@7jKW)GHmFZ! zT9ST$ic5|($EV>)Hx2i=N7fw(K2iqm$&HZy>Q`u38c`}(@b~Qv3y&?^JKrs7TsXg2 z(tYcxbV>K3y_?&m(*ShZ)K_rQ96GR7Z{e5vTa;W!5~m*dyx;$XUcb_UuO~Y`X+6J0 z)!K>D9;Bq7?C<-w_qDNf^`30Q7O>K`iuYl_a&XDkux7E?dRE~P)3`!cFre^OriLCS zafudZ0C5=?U&p*L0Xbmi!eb5t_C14?g=85do8cxR7bApocJiwHHHJe&~%~s6Dd(M!ZPeHdJh-*|SkNw5 zpECM5qEfGt7X!Ir1cO7JcJ*s?#|_IcebqB#Gc^$>EUP(iKa@zoH3UR4T`pa_H}1Qe#WoS#280mG+*mB zX6m}qbzQf2F77{>sXKMe3)*Y+UP<}O!E3>VbMKUFf@r0z_WGrTU)O4n6I&Zfw*Yy6W6--w1ko;3g_MDbiN~QWC8OB83($sN2{Ym7B z=}*&K{cTEqhZ3X3eCmJR|HKoj9}l$Bg7&E2$6XSju*LSvlyu+kQx3^%ey39Tvnr2L zy3!!I>lQ7weD)%eYeU=UmJ&=|9d)Wr*dp%Gfo;vmpN6M2tQZ&cwdU<%i2qhAh58z{XCO&F97nE&!A}&9sYzr&fidGn3p0lc! zurwvl0hR}ie!=%iv|e!FuDjqCe&TKsb)Q(&D3zoI?10ahGNe)wDj7S$Mbg6^Zn;Rq z%YMYUOha?fO;G-jkz;ZG2EFtm68J$5LQ;0_+)41-L}_ZCczlA)3+V@D@(#+GlUL9? z>}@uau~db~f_#{gRVLAg;feKKn$G_d9;c*xwVP4{%hsxF9hA(=*6M6!b!yi{6H1{+&nN663Kw80J&=$&^a?XrpisYS> zfn)S3KChrYcmtMS#uRClRLIAlmS!!&F04}tm0?x&Ggk^CRxqG}+yLjeB2En(f;@5! zHaiEypMuHKh(#i%3uGny5^{P&I4Z;@E`ii!_Dwny$6sNt2V_ry!n;|qRCG?#s56EB z_$*B6Ck_8b{bl_HA;4qvv8WJ_YDQ8WB8E+Z9i759zH5>I5=+O0fn?1O#zX%IINT#l zTcbPmPtT~+kaCijWgeMMuKA3qCXZe?GNbj33SajVYGjfe3=rIGh)|S{J(QWVr02R-iY~U4*2IvI6%oaR3Co1St=$)8X1HAF4 zc&CsLj}8Nx#53JRQ->ttagF|_cq;Du`hfVO7iJRNTLIEj20a*@Y5Dl!RR0j`Bu*=k zW(z}*DlNlgV;)$^hgW|{(1r9#kdQWeY!&aiw%+aT&2%46cOU<ru{ zjub4S1(%{>5{MaLvI8)6N=_QjCsyeOQ;otagh`FS z45~52_P~(o)55PCm&FUrAF!|yPDD42SZ8V=+yh+t0Fd|$GbY#}xTEXC2w23eSV)e~ zA=KGv zVY5YZistBH8#pL=6FKrH40PjSqTQnja~wGUMto9PMe5i+B1(wl$l876F8;NN+q*Jb zA5Cw4bh+lhvi&hUe`)T8IpgWAUEe+M>Vc)2ZOiuU_dJ!U(~P+2vH)U>|9lR%6@3Y zTRXCk99&g4D7E(wxRjpNno@<6H|+Hhyks084%o5Ug40Ww>*gpALPR}my((P+kAV53 zz~N>%5}9Ue?YtU-d<}>td9=?@cm43h;dda~B2PszX)xF$p^=LiT^3Q~3Vbzr>>aZ5 z1>THKMq)Dv_><>DV64Jr)a~oAwwqHv))#=@DL4dNomZx+=ahs&R}~|zS)d6-xPV2U zL5}DA)#s#t0pShU7?AYev*dVc1c4|k_$Yp2Jr}V~3mVkgtPJW5{`L|fF|MAD`-^mL z5uu~rU!Zx2*hxg-{wDemzx}7qv9*iNhkvi`|4L|-d9NDkXQG%)ATx(n@*Gdu+B4x4 zUJeZ=;>7g%lNj{?`xT%?zD^;KfYJ*@Is(v)G1U)z>?UIRs)njYbLfrI%43jEF==j4 z+_JIP5u3tF-%|-HYo2poK;WQAKNYN%(d^UBS6G`g=g{e3e_#Kx!dQ9+T9Em+lI}mkZ(s2t8;@QL9sY1v2JlL$PrZ;U?B-X%eFgfx`!& zB+BplDqbGHHlFddrhTnTzAev3vM%3pMN6h)Yr10V+peuyUqveNzSXttZdypBtv%VY z+S_~IXd}s0U=8-Hu;s8z8#*$Lz3Il@)WAz8pFjDIwT=T7`?{b6QF3@AMj{gv!65MG z5-P>;=M%gwtWPMpPgSNl{2_sp(?7SADce>gBw}OwH2hB+!cEoFOaA~2%L2{ZUco-j3SeRHckBz zOhRA{reNW5r$|!_RTSuZvgYDnpn{nifU`ZiuPa{vs853j63`NjX7mB05s0)fQ+H5l zqc`bzK?bl-HjyQn?(41_aOQd=07+XV6l#N54J>Y0B+RVAfxi9~O3)P4&5XG;EA?Ws z)Kmi9@S$dLGS-8L%iXlt{MeHF;G*>)8$FWO6~Q)|hxNWLhkFn27UG%=-J`@or8nZ@ zMd<^JRk6b|z*_o&MOGe%BvrrS6NPf;O%&=0)=N}5^b%5joRf5+w!U_;iYG(IA``S! z^KqV558Qmt^c>t7A|_ERIrYaVtP-_j3h$J3*Hyo0sb^KmtA!Z1RfuIDny$qJFT?hT zwO9zCys7PEQ@cX9oikN1`TGnO^4U#tv&8H)$gPIs z=tM3>V>5BEm5eH)cl*MhM*KMz4gi>zmIJd!MC2F%uzW25QCFc@yHqseET#pphg6vwevBh)eE+6~Uvh*-htK|j}z5-Q@+wwMMN z3_XPfK#yOX4HL>?v@R=H@EMG<)GJoV;RpvUA~eCVQ=gNDm9>kS&4v^=c-sg!aHCzA zbP$uPx#$6F9XI8mjzlH~b78uP*$ilif-sR0uZX(oJYGm{eRw7X*2}yRQ<~Wdfkv&7 zY#x23yNa%KC3Im#bMzhRhjJxESOJSZ#AY1g5c%Mo!W^h|NbpyvY{3dt{~O(-q?SJ0 zg$n@*+)`!D&8;`!a(hp)XO!x+QvHF&t#}A9)UYcK80h7^C8>i*X>|jhEpyG-_527MLsd{;S2=NK{6&yu9AWWDeQ7K*^8%IPsqPF0ew?pn{AFt-W z%xO;Z1FufKuK2d!oQGeJZ+`e*qE*}*-y*JZ=kd64=Ru ztOSFeJbRMBnoio|Qh-50|KsKLcmjq}@UmfmAc`URr@?}`37+9#gufnJfNC@*0*?kr z-iZi?MR^C#_8HaYt`fXJ21E1N37sS}+F$_uAfl+MDx}P&zMz`NMqn4l3i|Z9fs@=S zk0A)c7e+CRThKd#$DkmYL?Nq!^3WrkQv!xWcMEi2avJgLE+%=QS9r{y%W8}e10Xl7 z2IIOJ3!w)3JS&ab{h<96g*l=xF(n!38&(sYBVu@t)oe&p5>s)6o^%<#pxLJ4uubZ0 zP>*94s{e%&#`{=_zEJ<1elJpTh?0Iv1}Gtl9?>u<$_E?>nT(J5AC5#=tfaW+A`@0d zXKIZc>7adtlnjoZJyidI3R14b!UX%(NMzcYL6p3hViVVePD#C6u$PDp-QGH_& zH3y5#O96WibE4x^2%LcC3nG9lMTUX}7JftN$j~RE{PBgL8cdm1@o=d+qh^R4)TgQK z6G-AD8`CG95FRtOt)8)oCQ8jvO!Z>L#($32z_R%zXUW&bZ&iQK`hE9n?(dhrR=QlX zFI&^Nys^Dz@N~-yW$=&oI7_dt^{G$kx}x_UV6xB9fgCEv)qjR|GDX;{OcqfN-snN-JM} z_S&-DxLy1Grq`M>olm4YpIEBy zOAWnS)d=66g$R<=sVw5mKq!*2)~2ns3%=VW%ho-2J*6-2zqX$*hlS^sJb{d7SK0$> z`8}zDtfw?}LMNJwvd3IhM2#yXhKU+wBxw&dr5wLVX3}-v(hP^=)hFaKrHs?OlyL-q z#z8c%g1^;unPCpoi}AnQHLIW4M6eBl|HXy_(gjpQy@z7iSMxrIC+t}L5l;C;Hu&2j z>joAeM0`8&)R^yj88{J1F6Qm9Yn?n+Qy%v^d0=Z|l;c?^4=hoPJl?PawJMo)cDl53 zol63?(gl9W*#dT3XF-7?nZKPujp(c{D4afnYyL;_%+_4*z-mt)UNQywXmb~45+X*2 z4E>}aO$>GruN~^dz~)nsjQiA^RD^oufz^Y$wxcM)b`0SLBC62C7>uwW3!$siX+QQU zlFJjB0A7n;gY1oCRFGT1)kQy$6H4Xez@l`9ra>J|>cx=#0EK-Q#p*H<9+6T1K~x(N zy->shtR?(#UhMWq0%HMx`=uS*w(r}%y`7ad1e?fGJ+!>&0R$-KHHG1tUL5jp9+#QH z;M=-VTJz<1o@VE7s;^=^3Uttnj1caUxhZJS5tA6ycnjWR;B7+};qSU^Wj!-(scOXO zRJO5+ur(Lo=7|((_!)elS;d7e55CN8H%Q`Qj2OB_pW+1bi%bT({Snd?LFbx7wPQ`> ze}NIUMnQa-bl+sIT2l#wqX~h3;u`LU?OFIt;FLVSX556Bj$LG8OOsq^G=*eXXf1Q% zYMP$D_n=nFUHzVUi~?vysa}luaQ&g;Bpze_DHaLMHWl=mzzhNOXs4UA$C+ z-Z;x!jiQqqAMW_P3@@Q~RX>0YM;?WJT`(Jye_)vI3oDe%@i3EV@}Td+8oJ1w)R!L7 zD!kX}N~~~w1i+HT5utwstQ=d|1%f%Val8Ho#QG51(-06tXmY;tGh6l|(^m7CYLYj7 zeZfzoF~>sjQ`}ZvXZ>h8>zF2xpW~~)Qs+JRJF%37$vAClLXIbVabH3-bm7B54f+^> zZ)ye2Q(a(CXqaX0WLBWwZ|G@Kuov&=KK6`l9l4-M5{Bldoz`|eC0&#p!iRE_0%0U!B`fW`f${`{W88Qf zQT3Z11|p`%uc7(zF_a6NPO_6|NIM!9b}c*nSyu^}S$3xJ-_@CI>&&$6O}7z;+xFO1 zYsR@D?cA_%KJ9GDmXv2oHl<5o@R=@YU$nQspU+({Za?~`t?BJUOWxCqc5X{C)affG z>Q?`n+V?k<{4FJfuGPPzWFxhHGbOA?SZDOm&wOHAt)hFBj8e0H1Fw>(TY=IG9J?;+ zzHcp2npc`7t3ybSXdqP*J=23-t z1Pm<%wkXN)p^yS5x;8mGXv7#Nf!I{!GB!{>QFd}0}i;CLXXuoMMJ zMie2k=bE#OlC!8BI*+!T<`PpvCxksBV;D);aOnm*#xMwsCb9n7=v@q$<~@9ae5!kj1zXm`p}$VwQ79-JT`L~Get5whbS)c(MH$OPCW^l^?ZKC z)p-mnV5^W;@=nvd=6=vzM(ecFg1T!yu_YE~t%R!!zQ}cic0PJZZf5e(+Tc(Bgyte? zPB0hiq?!f}X}MYZQuY4SP}W)|1R^ko&w47ae|FKcY0NePJ)s(r^jVvak}t8%9zxoniZXv9g$% zB)6i&0-$2Z1dkYP`nHh;uT9TjcZ84%svF+7ux2+}O3PK(m~(1^s-n|-D3GZrkXbLx zq}SK&afG3_9_p03RS$&C*EQV;@MuD4Av#MZV(^U#s8EQbVom}Se*u2I_@v)I8k)qu za3Pg{ol59t@fk)yiZWL<77`t0h4t711SYf+_U)-ykZFKM%)(+rZ2k9`y<|+7GeyZM zOJU##ii{~-?Ly%SKFciyB>aT{F9f34QIy5 zAh+N^3pa>cvkKJHE#lXBtGLRYiz(TedfIIomtu3Eh$23*Rg{bEd-Ty2XQ-!@dG~Yf zJoR)HCPuz+k=Bi|ESZkB2mvP4a)jbZ4=oU`;7Q!HaQ!-x7jiht%+aPG%L+lIpfC;G zEhLY6dATwX42kpl0)TK>DJTR(GKn2K^-W=NVqTCVV}%-Qlf07gxo9{!%;%KW90#zt zQB*iVRAxU<{7(O$9wPM8lYvI%mr|Hz3S<1!ec&Q&+G4pIAuX58y-xtr%yB;zO#1?l!4u zoVb35ah1pEr=gNpKcJtBlpLa@pOOJeNEy$_Ce2ESOLJ3`PV&9;>>Mj<9_o1=XR538 z!Wtz%rQ~On`~f9o<$^u&AfwWp`U;3^cBY$)Yc{gO$BwW%si~C-S+{;84u+ZNRaHjg z81thx(v^qq{U=IZrR2{jq4ui>D4D=dtz9x${@~2nsXlzd*mncjGG`!ZD{qvbmSt4GRNlYuD|AZ|r$<@3Qs8PaNK2diaIJ zEA!u&f4ipJq}TpfCH&pe)?1%L2)?_ebuT}6?YT^8N4m6Qsk96F@6ztn(G@Gj%DY?N z^h)D58nf<-h3K7HYy{Y_KNViK*Q~jv>U!Zfl&KG->jRnkz3KYBnfin2`h!dLPb^jS zy}2n}HIO=Wx4ioLBzF@xe9e~1ci!nsm+wg(&u-X~*$_x?2oUF3|BqGJ|DdI5V7v6A z?M;UtRsOxNk=37EjE#BQoh7&I)C zCvei75EBJSO`x*qoU~Si$pwjAbj`4N{MQrw+fm85AMb;ofuGj4tGhCu##HPZ2E#{ zfQtHb8~Hf4-2`(=Fy#o_-3jao5&eQwWn<(UVgA2>2-xdwEJD5yY$*%h2Sb&hc^D4G ze$KSVj6?sZ;Q_(9Qzk`AHa`TJQH`A9p_~RYir!#)u*%v@MO(U}?bhh+@SD39E83PS zj-^h(>mlRoP5XM6eA`n;?|Hg%Bi@zvbiq?w1ljbbo&H-09 zXsx!&tlgclH^NIlW8avzZ@lGMws%9k`{7+rHQ6FnzFSg37Dts2m=x`W#%AfaTwTg* za@RVpv%kfLE`b{J1Ivs+Ou( zg%*af%tXJD`h{Dt>*6qd<@t52EanF(uL7LVa4qiP=?0*A&%cOaCo5*J}iun zZQhPR@x>!|*um2)g4e!b`ErvL8?_?84R2uc&=E9z#5(VwJD1@=8Tuv)1tkQG2{#Xd zx4LY`5W`SRKH{yC0P6bkCy?)_J>I!{ZK10Jy#d4F7}F+m$q`&b283LP9y7ySMrrFx zXi_@1Ux`N?NZiI(8< zNoa?Ri!u3yKZssCULSm6WMU@FMLy9fcx}O>4?bWZCyI%uKLNOefC-Tjh186MVx5bf?_sM>+ zstqeuwIhM4Akh!1gA(j8CaG>D*oB*0?IM0mGCHkQXw^C3~(yI`P z!z>3f$T$xwWn(`yH#_lt?_j}5Mu^31c!y9#F^rT)5bY)yMtVD7q*kfCI#cFPm-#bg z-EWt5GZVv}bXCtgRlUF4xafQgR)*z||M>C#KT7<^V{aXUJ*~|L>)qZRcRJrVzZ^J( zUDkX9^1FdU>58r!`>*$1pIJyEQ)y+!*PiyZ-?rUOzH#s!-|=kV5WVXGibMW;p7PYG zU#!{anu+$`s`B^kcjnP11lSl@{9{}YZIVNA#Son7sa1fk+}T8?qlf4yW<8q|70$^d zZdB!2i%VjnDnn43^Lj3Z>_#mH^`jUOW~|BIgR%(jWD#|gLMSq6x7u>}mD0i&iMNm?wN3ijPF2nvLB6C-kpSm?p=~ z>O{>I9E_7);+|c}hKG@_cy@|r>*w$~(aBbu=dP=i?|1XfEt!U{bVJwe?Mn?kORhl1 zwHwjf?~EXu)DbwqftVq}>Rh0j||B6Ukn zq%NMTPeTK0plQ@jKXS8}cJEUw)_rgj6jEDFJ@2F@(vul1iB9F-qq$Y!eV*meVif7sN3?!5*GlKp`$YWf5<9 z!26sR(*HnYLJ`BycIuCI-f+z+$V5agsZ_}gSbY!Urqj)82gt9JoL&|=1_3BP zd+oEClICN86vJ5%BJ9p%?sziC}|G~KIdplxawl1nvRsmXU;HH@0s zpRU^f#$!uWgV$X5u>0=djlruf1iQPLypjCsTxu!{yMUVA>6+bHcjfhGZnrL02k!XZ z^nvcFJtLvbmjdbiTW}eF3|pNOc=BwcFCQ+wN4|Nxbp7cWO^&H@D-qqY5&f z+Rha>FJ;AsEqhaw_dIo|`Y-NRO6~pfFYY^$gGm*B*x@}~;{MUrhQk%sJfe%hGedF# z^ghL5pJ$<70FLmW@F+%x6+>u6xlVFGD>wvNL2y_Azj;_atn=MsNY64yA&ar0N}ih( zILj#+;an|o2ozs{IS>m6NajiGD2DWkxpjc3^8y*#=9QLSOUtOykuz3Xy1Fe>-IcEH%2aPlS8vNyKbo$7G*f*jU47`kRu5cttzdhjat53D=1M(p zSM_Lhn_fM*=*5Q8a`mpOE(Ftaco8wT=CDiwa;mf5hDGdq?WtO{R(-fuf=GK5jyF@% zkuHG?qXos)H(d4Ib(Z}S+fqBqb#Fy^Q{Pt0TU(nBRoQ;vv>Yn6{h-u_>%0)O1gqJS z-+-<#M`-~~2uio`cpbUuAU{D+EhG$r?;wOhn{+`CiGl24`Psb~z*^8n#SMpTb9SP# zAQ&RosABk1; zm0=)LzPi~`(j}jw97w6SIzmuYY@$cw21+(dRQUH;)Dm!wBvEBW5@W}9DAe7=5sg%o zMmRj5Mtdj(2(?6H{~wA<<3KQKgbUNn$@HG(O;RT@iX-|oW;22W20QV$dJKuN2O$^? zCfNiI#6&XZXD`9o&j^ICVtX!qpTZ5;r%Ir||v$4n7Q#)};b-;pdI54BsH=)PbVePKKZinjcN?Irdup?V3B~*-h==-T3Op zJGIN39$8bQjcs`H3+BW1g1<%ITM;0Z(W}3PRx?r&G073&Sas5G7ZROxR2j@IE1aJu zTGGenyCE-BlXzK^FKIO^b)Ko@4MkZ+na^k?+?NfgF+D!M6M`^0qdHKsGeo<{Oj>8gUAjAUacBa2F|tRv=O zAu6R7f2+@-3i*30Ybj?+4m<1U?lPv(`djqPr1klMLQJiqYCBMgM?Xv0THpv-PS^ETwI$bCm# z6*UU|Rm!y^nh=df!7;bq_liiaib<=CF@W4=+%SyHedLN92m3N-g)+`CA1#(|d{gcn zaaFvBp~_RnTST7R`Fn;TEQ}$gdF45vFGG6m9O88NDO#M?3$gGlwq=J&6*GQMR{wfi ze75)_6CWO;UGDoS!p98u1Ya9 zD=^&(sn84e(VO#>Q0dH!OsnFaR}`HECL0lzm8O0jnL0hp`BS}4FPx=hg6iZ(?1z{d zBt@ZCl{45g@eJ-!Y6F*e*w{5!(h!W&Dj9gvmDIWgS)3SB&Q@{xFIDYNJ-cG@IS#yA3dgZJsGZApXWMte6a?qpkJ9|_0OK1`dzyAI1AzR&mf z$dt6COIq$r9>;-fb?sG%$GtD_yS8u9voX7=<-2vS)_u3>)uybk?Y1@3(U57)DujST2rgc}kbyueK zk#y@LnbybCtq7VZSN6$Q+wRqFxH)%Y?(N#`w~|-8?)qvozUH*AIpf=z_U+7iOI|*9 z?byQbo$^1d|J{0E>rx8!QhI=zbl{gO)o28dM1H5_p!6qA0|%718v8d4>{WiW*M=Xu zeU|zunk#znb*7BFMRVm9B#bKhJoX>qykZw_6|w5c^T+%TG*)DR`~Zw$h19r_>nJh} zJJJn1?mU`qcpTW}XVwbaft4+iw{g+hz6!_d6Pdo^5-3&ta5n{j=XY(W;W`M;#DzuiDAi_sxkzoqS)mBYt+x=u=;oOlbXps zQ0Rj7ZF)e-U!&~!6UfWL_1>$fekcZ`jJV$vgK-66T4|fBoZqQ8C zILwPM1R>`=^*qa-A03_tZYM&F$NcwFh_QekF^mN=(%kG84?0$<>JiNXh8!%;ZKj`~ zBFG|Jb2A#9S)Oa9>^hfM^RgRUNd%UR{W5}x#Wg3pK{3zDa@Ob!tHwD_Hr>{DWB27U zG81ptSR}zMy!nuKQJuWH#eOh4H5$`wlc90!Ku=sOuA@`9Cb&x1BS7FixK_LAhU2Nj zXU}1mb(Lr+^#~}yKuMfDUC%?iED zvwSDoP4wH&%|z7Alp{pRBqg7smHuy1<9m{iT_df2PjbCSkMO??Pk$`+r=|YClq%no%HNY3-jh7+Kdx)u zqnk)e-;-+D|7xrn&xWh*8Fypa-H5nt?zWWUURABwG`=fc)wL)=()sasR;(7=F&O|s zZh{U28v;1875-a$VO5eU&6d`syxH2OMG0FWZCsS9vsEorY{llRwR*9(W3lT|w6py& zFyEDrrAqOB^C@{zYJlFqY5$^BpKW_|QEI`jhQOj!gF4r2U6d+tu5P|LbYmz}wIf}% zW2tHvmDzLdTytbu8J|$n@vnJ8`zW=-|*WRD91dv{k zx5<0%kIEb5n)?Txa>xA|hupDRwO6iNOUNf=x$63sHHpq^pS4uT+ZI}1>HS784^_7& z;l^5*OMd)%&6t64|I#PrNt#5$8ilFw(wx`)2md@4fe%x4%wI z6bX!<-#cplk|pFXd`U(oR)$-k>=K96h(T@RHJ)@z2gnqakrky=e{&44vK zX0^062iE+UHKVNsuolOx+0KP>sXKo|%0MdCR>EQR4huH~yA=dYPp}n7u@600_#yk$ ztxGODl|}*{XBxi@FM+a41gTL7!f=Z zE3u+_=|3f7GEK%8+-r*{Bg=YXuJ5=F9=d)L($7O(1E`0Dg;qOc>w#pPt+)L~=mtL9 z<_Z?JxaT^Rs-ug8Y|VlRZrLCYENySX zC4ill65hJJ3>)RkxI4Egl;TY>DA=~XBDSp)#$fD7UDzqu*PT5t=t^?b>##+=3F6rf z`O_-=UcA0<{bp63OwN3l+rKz6Y38lNESa3%S?zyvFm-Kb^_x4IIb}nau3FBVt|%Tl zn20eogy+FEqjDP0!8|QT&@f;fHNypD*t0%)YGusXBLX5~CvIxMla8bWLxg>z;Lt>L z$&G%#X6ce=qLQyTceoE}lAno`hut4^`p;Y>?n4t}@qQ-t2h0h!eJ|h+yx(sN1^0`) zo^UF~B4aCIDBXHH6lxLPSp13oRZzEGXOZ25=6HJ*TNk#;*dHvi?G3lFkvd|mkpza3 zB4acMmqGb=4mz|)yKtGt7>Jxp8Hjzg8{7s`xp4oxLNN{zo=u1j2EvieIFSDz3S-^n zvq{9D`!<&f2v zJpX?5w_B30fd_=3Zh|;8DWyl(34M2zHE8a~FGmEXQ4z#mCDtj;?Sl@}D4(OVdrKn% R(`f1vo!eXbo4}+Y{sUrV1@Hg> literal 0 HcmV?d00001 diff --git a/googleads/__pycache__/oauth2.cpython-312.pyc b/googleads/__pycache__/oauth2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33eacf43cb5ca094dfaccf95f72375fe716c7a64 GIT binary patch literal 14823 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 literal 0 HcmV?d00001 diff --git a/googleads/__pycache__/util.cpython-312.pyc b/googleads/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fd71457ed473bdf36480c16b9f0d4c4d0659b80 GIT binary patch literal 9240 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 literal 0 HcmV?d00001 diff --git a/googleads/oauth2.py b/googleads/oauth2.py index ef774343..be62293e 100644 --- a/googleads/oauth2.py +++ b/googleads/oauth2.py @@ -251,8 +251,8 @@ class GoogleServiceAccountClient(GoogleRefreshableOAuth2Client): """A simple client for using OAuth2 for Google APIs with a service account. This class is not capable of supporting any flows other than generating - credentials from a service account email and key file. This is incompatible - with App Engine. + credentials from a service account email and key file or service account info + dictionary. Using a key file is incompatible with App Engine. Attributes: proxy_info: A ProxyInfo instance used for refresh requests. @@ -288,6 +288,30 @@ def __init__(self, key_file, scope, sub=None, proxy_config=None): googleads.common.ProxyConfig()) self.Refresh() + @classmethod + def from_service_account_info(cls, service_account_info, scope, sub=None, proxy_config=None): + """Creates a GoogleServiceAccountClient from a service account info dict. + + Args: + service_account_info: A dict containing the service account info in Google format. + scope: The scope of the API you're authorizing for. + [optional] + sub: A string containing the email address of a user account you want to + impersonate. + proxy_config: A googleads.common.ProxyConfig instance. + + Returns: + A GoogleServiceAccountClient instance. + """ + instance = cls.__new__(cls) + instance.creds = ( + google.oauth2.service_account.Credentials.from_service_account_info( + service_account_info, scopes=[scope], subject=sub)) + instance.proxy_config = (proxy_config if proxy_config else + googleads.common.ProxyConfig()) + instance.Refresh() + return instance + def CreateHttpHeader(self): """Creates an OAuth2 HTTP header. diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95aa601b2f31643d272ab52e46a08ca253c72cf5 GIT binary patch literal 158 zcmX@j%ge<81e+~Cri19mAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdWvd@roLW?@pPp2d zT9R0-?~+=aU6Nm*pPrweo|BrGQmk80S(1^Tr<;?Rq+gO+TvDtbAD@|*SrQ+wS5Wzj f!zMRBr8Fniu80+A8Y2)FgBTx~85tRin1L(+Q4uGL literal 0 HcmV?d00001 diff --git a/tests/__pycache__/oauth2_test.cpython-312.pyc b/tests/__pycache__/oauth2_test.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d60f9b5ce22bda5824bee69dd1514ae733e95851 GIT binary patch literal 26977 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 kL-OxF<)zqyS5qG`fsChkrR|ljm%F~z4LW;M1& literal 0 HcmV?d00001 diff --git a/tests/__pycache__/testing.cpython-312.pyc b/tests/__pycache__/testing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca0f8878559814a20ea627bcdf706d9c2954c74b GIT binary patch literal 1079 zcmaJ=F>ezw6!zUYX&M?qQAH6#V5tHW)ZPiH1E7k57LbtW0PT{+y4*SGg^OKmpUP!o z=zr+SiaIj$3z#yXNXJ+fHmbnViRW`tq^ROa_ujML^Y@;==lj}d)Dg(%N2lFa7@-rh zm`Y{hj9-Ftgksb}u@k$g({f7dw%pQsE$pHfDE1CfjG5aj5vL&59(&fds=3>&4DLVA zc%&1-6$yDvqBK;BDUvA`la7!ipj8O(xe@f6-y11^Y``0fa=4)N+Y?2ipI+s#T*qm+kzMrl!} zv@hZ;HU0vn@3JtRMCK@sMMSAwfJ2{!YGOrE)|auxReRX(e2*k+%|We6CS)jd$Z nJjZcPZz1QwxQd*`@96RgTK-*~cY==(M=R^YmGwUe7A4SM_-i9k literal 0 HcmV?d00001 diff --git a/tests/oauth2_test.py b/tests/oauth2_test.py index a64bf654..920da68c 100644 --- a/tests/oauth2_test.py +++ b/tests/oauth2_test.py @@ -303,6 +303,43 @@ def testCreateDelegatedGoogleServiceAccountClient(self): self.key_file_path, scopes=[self.scope], subject=self.delegated_account) + def testCreateFromServiceAccountInfo(self): + with mock.patch('google.oauth2.service_account.Credentials') as mock_cred: + # Mock service account info dictionary + service_account_info = {'private_key': 'fake_key', 'client_email': 'test@example.com'} + mock_cred.from_service_account_info.return_value = self.mock_credentials_instance + + # Create a GoogleServiceAccountClient using from_service_account_info + client = googleads.oauth2.GoogleServiceAccountClient.from_service_account_info( + service_account_info, self.scope, sub=self.delegated_account) + + # Verify the credentials were instantiated correctly + mock_cred.from_service_account_info.assert_called_once_with( + service_account_info, scopes=[self.scope], + subject=self.delegated_account) + + # Verify the client has the expected properties + self.assertEqual(client.creds, self.mock_credentials_instance) + self.assertEqual(client.proxy_config.proxies, {}) + + def testCreateFromServiceAccountInfoWithProxyConfig(self): + with mock.patch('google.oauth2.service_account.Credentials') as mock_cred: + # Mock service account info dictionary + service_account_info = {'private_key': 'fake_key', 'client_email': 'test@example.com'} + mock_cred.from_service_account_info.return_value = self.mock_credentials_instance + + # Create proxy config + https_proxy = 'http://myproxy.com:443' + proxy_config = googleads.common.ProxyConfig(https_proxy=https_proxy) + + # Create a GoogleServiceAccountClient using from_service_account_info with proxy config + client = googleads.oauth2.GoogleServiceAccountClient.from_service_account_info( + service_account_info, self.scope, sub=self.delegated_account, + proxy_config=proxy_config) + + # Verify the client has the expected proxy config + self.assertEqual(client.proxy_config.proxies, {'https': https_proxy}) + def testCreateHttpHeader_noRefresh(self): header = {'authorization': 'Bearer %s' % self.access_token_unrefreshed} self.mock_credentials_instance.expiry = (