From 87dd969fce6a024b5a4d217c52788b16f8268c06 Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Thu, 23 Jan 2025 14:56:59 -0300 Subject: [PATCH 1/7] rewrite data classes docs --- docs/media/utilities_data_classes.png | Bin 317980 -> 161851 bytes docs/utilities/data_classes.md | 259 +++++++++----------------- 2 files changed, 88 insertions(+), 171 deletions(-) diff --git a/docs/media/utilities_data_classes.png b/docs/media/utilities_data_classes.png index 94ed83bde976e32c1a22e20b1b37a33f3ff826cc..bb224772355e5260bbb070f508813cd0713268a6 100644 GIT binary patch literal 161851 zcmdqIWmH_t);5Z}6Wk$4a0~8EfHfb?_Faps=9QoSv70gL$r#LEIJA?3KSF+y1bl}8Wa=~0165w0|^0Ag7oy=9tsLg z*jiFjMP5>pQpLs5!rIOp3Q8_IT?3Pw%BF(fDrN=?G5$PECuy`2^5SP{=K=n9KL^TsQa zDhvo=!aph|hT4xtdGAaG9mnyZ5={+L3<~9EKS`m!VQ&^5E-rK-dj6ZkWv!&6l@_U) z?%VlWUD+7H{tc8EfKut`=;oSI1PaP<68AF-6y>F*nS?IF-FhLBIilx|jP9|?OrZe#{&u>|@ z28Dv`*HERyE$+EU?vC|eR5e+#>pz1B{hV1nSKo9J-t4_QW(Np0>nknfCHBl*Biy^P zxjyJee4zs3mC8y>*1-Qkq%s0xa(tRhiJ)VAR+TgqAz4H_mN*|iLWq#GLvpTX;ANB; zE4M@n<;NPr3sJ(ucfz4u4D|}86lE|xX;S6?I)Sqgn zeN#A2X-`?Ys+tma^Sp~QhwYNkDX(I{5x5;vQW{-Mer1V(fa16H% zgJ|+jxwC!DY=KU_%RiW@=s!h+@XTn#7*9i6uG_Dlcl7H&!(cNxtH>sa(gB=U{ltxv z0KjFgU3P~i?dy|wNlWcKX2_vZ}+aVgqdqle-S#Z+% zUaCC2%reQCz3-%;c#z=GD8pIE6kt}wmS@(MQS06b4+NpUr^H1H3QZv*O=iBt9xxSR zfC-d%5A`Uy2eaP;qk{BUCt0(548^(M6Ml`&zl}WXO-Z^xXj|!*X2qb34F zUcQFWhbaw84t|s%*jbb^Y1l7krV%HY$JAV;ei_x>)>N58$L#kn6wvtL?hLyf)HTS* zypAd35z4HW-B!aGSJ3>%6G{P$m`&W368|v7@cJ&NK(=b7vID*Hr_GD0|GSPd%!M4` z`5RZid(4HSA=iiL{ACzB(Zz_o;VBc@dYS(I1XD$AK@W|HNX;eF$5Y}seEMm6#8ad< zY{#pqamMURjidR!Tj?1s$}C1-S=jscf4HOBxvGN(LX6;`Luq#T6O7yWI@+Nr!MzNI zMvj1kEp(~27eU@jOentuOf)po*QszaMB_R{zh_MUBfG4txgwbU6-lAW5|x3SMp)=x z+WDQ-GR(MO{`%k>XK3J+;2~y+7-19wG9|o1(2C`NJ1ew$KN>qhT8K;iyBe5uW7uW1 z)=&du3M)9-et9PZeW=X-k4}iS`3_ewx51v9_9BUejcmSs#=+Qbbr4WAja>0#5+P zyqKArR8eg7TlTS8GZKq9!8hCA#BTJfLHSZ_g-gF#Z{b%Hp%vigMie*@XGeIdzQxRYO#3#pxUQp^VC`g@L@wu7Kr{9tzJWDZGNnc7| zc3n|O{QSKL^?j<`d;b*SvB-CdyD2Dgr6nyTc_n)#6D1C_h>a*KVdoMUbmb}1`v4bs zZ^TE!N6yC&k6hBB0Qo<~QtA(B)@ih9ENK?w(w}$_xW1&?DBcy(sWer(R@zqF&Cktu z&GRxcGFmX^Gd3_vr1LY{YTQ@ke(^56R{ipMK`H&afYO($PHp#`Q{)A`Dn~2suXvLM z8K0O6S;`h>m1cl*A{8?WqzimDel06DUu@8AG8YW1)aO|ibWU;SW9OOXLDfbYmkWhf z+Sc_S+liaFtGF?&*MA=`mDmc{%Ge%Sv(By;c`Myyuk`%>JZbC$M9BOt?D z-gF}LB=m&;WbM<&qq?S>^DXbYL2b|HF3B!s+0Ub2=;bY|l+veE^H>cOmOf>E%c<^? z@+<(lZzvDNMKnYpN3f7;ik@HBgM5bWp6}p%%ze7lyR3q9NKoi2B}cg%-C=zaE4#H&O>YuNl zKd+8Vg&(OMxVXQw*SM-!`Sw+&$EC#+uf5i@=S0Rc)-C69arb^RxE~ab{wpy5F{7$!HT}lYdjNyCA-moQ1H*{Fa7-i=uX# zu7K4j!tv{+%oeMtx@fIY{FY>(Yhdr2=36(0$)0?6eT_( zjyC=>b_re@p$3tg=rS`OS37Gv+c1ln&(CNT2`jJT#@{5QG#H8M6DO!QNI67{#I?la z6oy2v?1QWlI5VWtG7-|XQQaiwM6@wBaR@WH$9OX!K#eKgC}{%ij~~ODBO=kR2|3tH z_{xa|gncxx1`=X}DPe-qJkhhm8Sn2(oaI~OFH>PtGwD6!iTEuJvrs=Ed>BkC(@?Wf zJ6)WAZ4furioYN~;;D68zx%VeSDqlsJ76pU4Eu(=K<`2iRHiAREx(Wh55^xZI)Uf- zPZm!6g?Jo4Uczq`^rdXkTwya42u)s%Y3Ki8o}+h_wouM6(v;S$OJb>c*E^0exta7L zLN8#cHznra0t5=V80v0PC1)_m&I^or&Cbi`0eqb++ie?{_P?Zp-|wV+f0TQDcrJsn zf1uf7ZApHm_E$O9)Bf^c@@Y2hMg3!WOj)aPQ%Rj=5@mAU1ocElbMb=c7;NF13 z;xEOfB%PBcU5lJ)*6a;odb6qfj`m&*-RE@PqJVsIn~jT~~TUedm51>fX|inbO_TM}h9I?vr(}v0V6`%+5xQ0Uw+z ztxoRD114J8mh=sqpJ!rz;-NDUF->Up8hmtK=s;PDL9ec?F0Jlbl&Z1TwQcY?S!GMt zNnfghsq)Yw(PXO$=u7AWUi-Y=-I2ucq&Yq`tG53+EK5>E|ET#9FDE(&l~;5nrMdKi z_t3FL54|(JJz?{Rz#({4? z`APnf@7%rN7C~>Fxu|R43-ko+0^$kc1aVS?HM)PiPP~EQ2gSU|L5vn|UtS8Kb1$zo z>^Yh*vhE42{4&CtE_T~qGk;!jcX4~@xs*k0vX@@hOw7Fz@H`f}@!Nw3p`u?nTp$K|f?tdyePxHF6Jr%Kh1foNCIE#zRxYo{n1Z#Y z^bhoVoLEkEkM4%gcpc-qX53Q)Z&tpq>(x0BY`*$gP8ketH2M;Q7=a|4b&o^$i5mt$ z16c|<5vxGLx2q|d&2I#WHxz*id#{;x1Z0;_a7eT z=BCwqlX`0&ZNM#$dJk<~u->q+fZ8yoH@tphNiI$(uO4(LT@)y{cF}JMU(Vn5BN*;$ zT;N`DHP5jR4l%@pp92#w!UK7Ep_ZHA9r_A;pZK5vR#5M~VBF>_ig?C_&P{t|Z9wSD$~UuqhExh>%}6kjJYK z=D%7a0SaOND-V+ase=+%mz0->r0S+F=H?ErR*r5p4-1!&0%RvS9aktQeA>SrXnD2w zSCH|StTnXVv=tQuOdai6P0Snt=B!@!PJfL9CFCUl$=aK{nNWJ!+c~%jcnMSgtAzk0 z|5q^^HRZpWxY-I*Yb&ZyN;KN~wI8z(0Vqy>wsw}YFB7mI@{&A$ivuW_WzT}@rAo!qP) z9Vq`A*973`?j}r4{nteQef|4A&AqJuXC?>N|9lqY1KIwnVdG$BXZ!E5Azg+3Diu(% z_A(l=iDgI68f0aTAErKG%_TP&pf+Dea{s>t|Qfnz?4M+;v zWq)1JpCNx3{+&Yd&|X9*W#|yQSPV*DN?gMW`aBOl7k}h!v~M3;_DEIMGZRHFmLaAP zCWLx9PZSTfOAqVDu?jQHQn*B16cHyZ4kh$IxPQYj3>!=Tqb`)e4A_NOG@mH5 z(UFs&{=uyhH6S1c^ZuXQs?=gsGHGI*B>&)(ARkkR73%&E30N!@BoW6DY{v7C-tWB_ z6~fs+p#g+oQqfT1gsL!OcK>LB<$@&87XQi0LdXz>1C7E_441O%Kp$$z$!-T~?{{uvp>(vVc5uxXQiMf@{X zgfJA@|9=^3yXJkp?SvuG^Ap_V>Q{XY>C?9F$Mywr>FTP7#eqv>4^%fj6DMw9ejKf$ zq_#=C{|}5C97pS<7EXv99cd2S-Dq?^3*dLUs_1Pz#k-OJwhGU6F1Pw(`wjh)R6 zC?XX+G}36ATA-Cx@OaBBXSnY(%KX_YjOc#yhhGVu}5^u{to8M*P>jvjlLNa-XN6)GJ8M%9peN!Xg zo=&IBD`y2wH=|Zfn~|3R?_K7ijL(DuQ=$q;k)%gMrkiWzv&Y^9!KcSn+U|=c=Wu)b z2T%7OmlI~wQ!l+l^EUWw(i8ijjnSWR^z4DwAp=FiCW!%ZRm!Tyo& zWoyq4)a%qk6S2MQA&# zN3F#aj3wUN)(#gR-2N9qA8tzGiOMj^j+>EO9(uHD#4RCk=H=r%mOLZiOMTO2FPAW9 zif@Xc>hQ60*~G93s-J4!Qe~&Ui!JV!e?amH%bX&~n7f4xm5fYtOY%A{=rvzy?Q-)j z)lRo%4wU92wED^BW8%MQay3(!&I#PIPvPb1^1HGNjS~%?YaR~$wBF-7O%+^QsJ#>C zt;AN)qWS~DzsX&3=jG*2hqgE$Pn(#BWtfilfiprWbx!1!9!l09G|R+d zOet*)xy|iky!xVS3mndvTtr+RDinxX(|fvL2CLhz!%G};P-Y(n$5k)4 z#7HyKy!r(v{lc&17VX{z_`MEm^H%{Q$tV@3Q$=O23C3s+Z19#sF3$NIS0c^6-UT8| zrc`Y^<|u? z{E6Ru|115P*IKy`Z4(LybqDH=j@Lf>>m3l&-4rOlvW_LGY)P zmE!Upzz)=U;ua_ln*36__07I-X;u2eb{4CpFQoG55=HIZv+B{?pBPoWEKnu4av7Rl z^^?(}nAI!O>i?52SBtxdo}s9mud3Vj1zz}Um1WOvbqZ-l?>%VW&7$X_?=HkA zre1S0qYcsD8hh`y)Aem~;{$4%Zwkz#i(KaYiD$B#kAd{<^q~e4hhdjP#WufPD#T3PdFhTA=h&k$bRPlI~t4T!=J)#=a)pot^SF5og%CuXcrvbiz7MR5wSSu zqyEpdbe;*#7=mZ_s!`%pKXkMzy~Y3LMA^pT`ydfl+2rxFzb@mf*ziJ6?^8NokG>io zTDvz6((`rT+t_|`Y1gz)TJ z#!j!)Q^3lX4r1hhY3FdldOy{RbNZg?i1qiwCQX`+6QZPXWB z99It%554+Fn$3;p!OV1$32e?veKpkFNDw$%GN6*VVf{!e%UCPG$n=@j>A-~!QFoXx z^^$x#?{D_nAPv?>svjjpYqZW=CjR)SnU~3Lhj7n{Mk__l!-w+szNoyk3rvTfom)v- z&ojM0!*HdrS!wDgkP6e?WCD|kZal_+d zzeS}*Pq3s<9Hi5^qsZfr3Uf@^U;OZY%K9#dF+RT{SYkDh>mq)$tJdh{K=d+A=T45i zdgL~`=&V-dRr~HBoFo{!_kfG{=VD72{F%Hj#wP_kj1MZ@nvC-ws16q1YMi{j4+6jY z3diDH(df50pK!;HM6SKq(2+`%KGBAXpj({DP+Pxw?k&qg0!gV?Q56(1u#X3=sDZjzNpAj*R0c z^_;@;*5dZIku+CV%pRnioYK%+Jn!yVe!EXEHICkYx;a!FGCL}h@;`ZK_dnAkyBl?W zVEoaMR;jD;c*Tl4JbM^+qc38cYNy{I`6-R5LbP%8aGJL6o_v?=(2`X&&1c*E-Qjo< zY~-D+XKHu5z%(`O&6t{d{Dh@LTFpw+C%?O5HA!@wl7nwvlY`$I15P~rzgK*tWx~&x z{Ss>>Lw7lZnE10Bxq7l}-riuKdfKq0B_uIv9%E zHroHoUB|t*GCX}8Fbv$|(rl`@sVSd=zM}}mtWK+Q3u{Lim+kx-{IyNRLAYz7l`|M~ zkj}WwHnz59vdpkpWSMSwQVDIgM$O%GZ=7sg_DS4;LPhBSp>*~(xtDDxs7jLL4)KvJ z=l<9iw|se*_gpLC1LlNNI3dvjIjJBW=g}oz2(84xZiAX3Izo26@ij4j);lkY{V4*P zg|Bd{d`s7|6(F;{YqHL%ESGcI)ozG*JFj?mwu8hm_F_~?SyNQ` z(-&6e6^$;ONh}AwF82)woubuagH!LX?OgI06avMkCWap>rtsoo(olM*L)peZ zSHGaNp~sW}!}Yd6m%Z)|<`^%+O4S*8C@#%GJG zv5F+bHrk?oLv#QT+#nOq*(p3PaoWmAp^?ipeC*^ec_A`JdTaV7&*^F>R-e#bi5kK^+jQdPYlC`(8q0PRIR3#K#cSl6*=AiXj*D>#?HzT3|N>yz=^I@46 z;o~%@*%bbLB(BZvZm$y9|4@m2`BW*?7BZ`J!CgPR3T8XS}%%m>jeunRk9Eagd`&$!xCs_aA{V% zN`PZQ@CXCsxZ3=gHeX}u>13!V~z{cxZS*G!+yZ*2B3F;#1w#XgCvG+wgo z19b)At-e$3>4#Wj*@9hSxnbKV9OQ3Bkv__bYm7+wR36z_mhT!jFO%46$u0xw3g4nF z)5vD^Knldq|Y^2$%E6BoxMa2ze8nC3>AQ+HtL%d=4^?tF!3blDlA6AcQ4u5(00APVdC?<1|U z?E6QDEnfS0!o>*O zaX5DIoGS#Mqi{%kM|5~Cav0KjI9qx-rX5n~x|{Gg9uQzt`<_;-Ce<_&sU>J!zjK87 zhDyv{4=V7r{x|?7nUHl3L-m78%kS(WV0(^9&F}Wsqbgmz?wRK12V%fYYoeK-5ZUvp z7t3>fBJWw&MszSzUvRHu{>$fSx{srVplA5&$34@@vNk&x=Pw=SQ?3jB0|JkS9ev#o zxZl@{EWWS0?_@nCD-yM6t8Bf%h+ug79{ar%t#2eI-iI0$6b`F`Hw;$4!zrXoGNkK5 zbdBVhivd;IGT+n2x}Lew(ZgzT>l6Dmi%qJq!8qeExyvyMqiIcwjw7#wWu^uvOx-fLV9Cv_V?B_QT_g#yb-{s76Flar zG3Cw;{f{#CX~&~W48B$Hpblo+_mR8FS6k_?(w!HsC7}1YoO410Zoshq{Q`=^F{7== zC0{ewnfUmU$AgdR`-BNtLqNxppDNPZ-f;s`p6nk|co!W(V8Ms|>zD!2QARA)yspijc z-WV59_N_^$m%Ksd$h`<*G)B9cMV6-+rUeo*BZgC zLm}K*PIJ;~tWa+VNU9r588*ke(P)v0)@?ffXB{TCYwPU&$R6rxd|kn#x}7T0(_7}I zM?&x0JvgUejRd?&#kEGJ%qM{s#V+Dw<+lBPVQW$NRIbbLuE)M+d&7LZ!fYbWv)9!+ z35z$a(~>h^Fd+T;YTT>o1A)GtXgECax!Z`&H&Ky4UG15by8J|!2Oh8b^nd62`l~*td9O+z!=40K@tlhOmt-!16 zkD)z71*EH7$KNX3B)=O|g3KqQU zkz>_|6W()Je+PNj=C!H?nc7jw=vuQ^-2UXkXNqo{CObxLA@?E* z@7P7*m>n)$y%%-(o5EFw8IZKYb)1FZIze-#rjd+KyZERzS^RrLJ-oB zG9}O0^NqX`q-msP7dt~`D)W@<%2$0BwW)jPcha&~y~AY|?>~*3MCF#_?ry!u7)>@?V zsO)uz*mUSN_!^6B_ov)t&${CRBN-QnW@iaO@MK5=NfaS0!~HyAm@FDb0+v%XoF<)( zZl3za{tL9`CF*P2M~||hn&a((u+(wS-sxXrpT+@^r@RW90LxU2jDuRB2EI-?l1x-^ z@2l#9;G>@eb@0q$B_LtgOV}PZ%wMg_s#b*9S(9&oMDct| z#L($_7!!oeKXHK%)ehn>$q+_2P9AIxb1K4VZf)l@?;?u9f(1g^t6F9He*N?fm8twJ zW(dOIdvalfMXx+2cdWCZVyCBV`Ej55SmD4czNe0mCa@{rRl{Z7_3)sFuQe#snUq81j|e8KOKPNsq3T60S`<#5f(+{A8O^gZ zFkO4Kj-VQ~gR{%?H=Yh$l^Dyk8p1vL10Y*Lo$f0(d2eZzrS1w6$JGw#&Csd>v~~B3`DKQf zqEOVoBl$J!X?w!eJk=#SgeYX@q0m<3)kKr;m&cGFFM@>$%KcJexi>|slY}zbN#%DQ zF?|ye&W$@I`VXoi>`d|n&3B{uL}r1M&$lyMLLfRmQm%60t(_vj^{<>){V0deOCi?t zjLr(hiNa>qK!zYsc^rknmefh9{U%Wpp*;cVL;q5t0d24z8dxZq{UenO!yVSUV=v76|E?TYoDMoi&PRHG6i6%zBX|AW3{ zoifJG-A2`AT+m)YUth+)2y3TI=jdiu9gDNryFWm#J6gwlvolnIK|+H+fWR(0khHM(&b_8B_ehV(`18VaFT8ir>*Z_828*qR|RWN-RAmB<<)PAkB*dxuU4;!=9G z7>E}Zgn%f*oC0%_dkMmCSR-!SM_^jrnq5s*rfN30_3`6}FNQmSiDgkrq;R>Px6J8m->>GS^Tc4m{&G7z= zQzDVA?G1eGA5DBMKnx?T>`XcMx?M|?W|NyN;E;Ma#!yy!#)qzMUxS&__es&bnX00>ELqlt~&NXP7>k~W$(hG z$hB|7JS1HgC*+!##sdfmp6XtFds;hsTa=F-B}nSp>Qd+;30{VW=EC5(!5Y8=EQiVv z){HWn;{Iah$#M<2AHP&+HYCP|M(7doHd9FIg3^k@RuV>HWFAHrrHXiQ#)3^DRNx%o zF}j>`>vk>VJku*m5}C(;qlBRd`A4(SmJFZn`KbJP`DG+YHr(+u`-H2xK2M zE<2Ol$VJVlcM45>qFbiO=LmHPBEI60U?eq#(*!CAMY(i}uB)N;QyTVvWX^8gG-KlJ zUN(&8-tD$;0=)Ik(G1roPDkBS>QhB@h%})c}T9du@q{&O5xk5gL#)P^-V$D!za@T&lEFY6(E_4m|ui7AttmJ;lvCO z^Mb>D(jm*lZGX#Za2OW4Th(|MMWu+;hK|w(lvdl?5cy^A=squ@>B^!Fh!9y9+}GHR zOU0AG2DtT9G`m?-WSKjx=jboimbhJN%M@&~yjWOe2DaVRP#*DOAdy3qz({=Becgjk z!x*h{Pp@aya^F^=8wR2pNX)M4f{)V39A}j@7P&XyJi<56zpa0578NbcVbP0ncCO~@ zIBZP2o7+EPn#e0zAaU4dIAu$ElGf7oaXaOejLag*Y3<^XHj_n0ENR&ixb$@?aMaVK{%7T z(rUo%T$i9gQXv z0ntnupA7@w8^aGEar|NyFX1STB_6l`)F)VVX1Dof5w4KiU~pQw5{3zRW{@7B_)KfQ ze(3YbB-YrZ_w|5ZFDDgodVd_cbjQ}58FRPWykh!5Cc{qAYxgJU@%P=@5trF>QojNz z7&cFkAs#d6Ztcr_D2I79fna4QB9Jn|ws<}9NaUjzdNragz8xMC61!8__BBUuvpp4p zg|=|9g`~-1a(1cJFm#qZ&-2BY0NY*)3<=L?JDQ#bkL{^#PS}msASi3&d!j)sT#L6B zNI(I~8KS>C7cIh;AoI3Mpe^~;*#>Mx(L22;yT7h7;d8Z8TGfYM5D%bP3?5w*C_fir za!DX(@kex+;y$6DQaSMlVV)w)T{pQR>WWOeGp+P)-)wu^5cSaI(~{8--&zj%$Op&t zj*h#%Fh$?lh^yy>moiK|>dBt5VkOsESIBBs+LXvzFP6^q?s@VPQmdMWgM8Y?c!**O zjtNy3&v5Qhs;D6ge?nJ2r?Ym1k8-hUnL&WhV!`Eo&r+aRj#ZANvhou|J!-l|2c5|Yv3i)-I+(vHwi^>$Ub!NyKnM5NPdXG#@3uiGV0J6?^|va$QxCfm8bDW z$zJ#!l?)=g8!&7|vH$6lq*xb6=s`vdgFO)NXA2qUA_RzGM08mEsT5Z#vv z9)J{9XXuEtp8@L}nZ|zi6bW1WYo2*xMIsJVU{Cp&(DhmT2{%0M9iU%&?etOa_Ct06 zEstG8mGh4A)Y@PAdS5BiZha!Mbd*W#yQIhlCks&QMYjnp<|2s#QVXWTY&Jyx$3ZyQ zqmMBcM4f93;cX!b6O#e$R0%y)Y@T7O`>wErwi@9=AuxZ)#XJn$7S`J;3~$?o>zYPi z_uxg&s`tQP#>uy}KMZd&=IQKb&bI0IBEH2?yO-cTR<#lhk&Dye0K_0MatT}9L5TLu ze|xxH6@UK;hF+4IcZ^aSQG<1hD10+$4u=^#<^ z<%gM(_p)w(#kXVt0zr zxkvgT4Y#=CF{~Zg-%0`jWH1oi*49nNbb+ZiFd)&nDKEupzpSp2NLz>?6}Ck$Gu-)M z7J=i5b|xxs8EqSpgAE7T`v5scg9>3O78SgJ<+d$B+k3sH3Tc1E_WA47#kxb~mV6?a zhLOt2y~4vAAlCeO@E5Zq6xMC(Z2q3~~k|w=CfNp5fGe>tX(6 zeeW~T>8HhPRon#Hah?mRI*nig#VDjGYVop~ubUykSh=V_tL~DtCTk*jc}z~?B`@HS z`-Q}|MQVnq5IgmGAU|*=xy0Xy23?|wb=+n^aZD2xreOfzah7KI=kYxRw$+~}kQYXH zza3U7Yt3>&RAI#=^1Q{?+tiVah@kn^NcD3^Mpc?-#>pmPgJ!!uOAW4nX_#SaX;d=` zk7oS3sf0CV@s~1R3~T$L&S_LF^lJ=`i#CGfgmj4G!>g=2aEtB3Fmr%($AwzEy-K?~ zTgnqqL~!FQ^mo1Dbf<3G4lwr61F}0wI@2>-kMQP3z|pKgf06B}X?)9N3ADam?$tk= zn2K}WtBXhZzMjdl4{aB+jnV*j#azBd;QdY|1pBPQokRia>mkTX;`qk z+-ukHaKFpqbE@FVT2VQ*$AhYo!fuf`ep|Gj8_J%xRwYUN1h9U5M-{O~&!q{q4h=|c zV}Yy?ro%PI1Vk$Cyz*QGeBry4PQD#5z-FoGA7LO!J>L7et?Mh+{X)tyy7D;+u)~R6 z`wWTr)q7gE#Zauj#S&OPO&Eqve`@zv=Ve;DL%e^xOr20~DL(GJ3U;UKhV7ZZK~!e8 zqQhD??~sU_xU{cgmP2su|Koi2yXu+a-ZE zS2rpGdfIvY9W~al1&6|chWvMOj`HST+Af92mKeab-2U`2C)xI3$vIg38gpJj;9=Th zD2Od%EYQ{C^tf)zsyI_7YNo`2s-sQWxGbh2z$B3QRRfvhH7*4U)&Zf{M}Qr?B_iv` z9WzNm2z!b2K=wn7P2Z-!u9?jE>28hS^&TON;^8)ivfvjz@%j%$ zv4_^y7rwQ}$S!h-V$sPifEo%GInTr?OG2Je1(&_-s0hQ!$H)K6NmhRE0@Oxi75 zW1}o(Zf6%!&V5e;tXwUf*C40XS+M7hNlkmGJP=Xd%sTLW1TDUHvXj3dIJ?VJ)GBAi z@gD6WvbSB$@QjQ5_}7jSA{P!vEJabZOR2hY$Nb~Jon5XW3BofG7r4Zuof2`DGWRH7 z4ZMnOH?p7(F(ar z6!b22c`DW(4K20aH#m$FbcZe^kQgC%@HR_}aaZ7{i>%w>uD$}5)m72n{O>h0C3c^G zaS`BG#(~jtQCB~RwwV+)BhD~#3ETbRaALVXgv6*UP*4>&6Sy@cAR2u}(z)G^4;7sj z#!55e@1sGH;TK4F;$mpfA#||PH+j*s-I%CG|B-OO;CDFbRzI4D5R;N7l5~{wHyl87 zv{+Q~*Do=Kn9t>Gm)%d{2er1a64kPXIrL{dwDLPJ{0A5GXOD)x4dbe%eumzsK;jPx z9QYhD3{-bev=tb%5T2p=H~|%KWYZPq0)Z7|skX=yjpgx{1D6h&a%E96e`Qud4ee7v z7Bl0|Z#J%-Dp_5Wn)dBB*fw<}Q)XLznJ8=r3Vlnf7l;_b20C)3fT%&)0HqBf0ySR( zuF($a6<5~EvaKDvHa5?`CHZI^SfHI!bT8~*mK29wHe)?)4bq3|ieDp@`< zuIt(r>7E``9GAt6zsKkTKBAVWy`*eJM13#;yJb2iNg<*|Btn1|#u+ZN`Jph*5|9YVSe7#EVF8u?ak+@G`4~VA zF5`g#K9;C@etRY5Orc2Bt6@i6eqG)eC`+Xp zhUywc1hJ2tl?rc%VYbu*p|&B59Q_j zeRQO)$EngM-kn9*UqDvF+Muyb%WP>~kLpr?Ku#V+snk@EK>oMFXZM)`81!-6t!}hk z9y&34h`_7-p!33cM999b7J}hBN9cNfmcBvq`&CXaHA_xNz)_aV>|ko@QBewszEx*K z{8+QH?HSt7%rRLt5*_q(@j8Ik>wZC*uaj=k)F~PpZ7i4{dn;nd6|Ok>2R`wcQ%}g% za`n{8uk#=^**1NMRjmw%z%EdS^&I+*!Ml}bX5rT_4tnUEqooU*J=(*}c z5ER88OFaCAP>5|h9kE25ReGf|dtTtWNJs(Yxs*$BAeGENalcgybnInk~5{ydgB#3`XXtf#1jc@c@q|+%|w_K6H)&Fd>6y-mIL*p;y*^98D@Y4l{QZ^ zuZfPx9UU#xu!bDjS4A*=H$2oK;a&j-s*g{hMG+9Ggr)ay5;5E0kZk5g0b|8+90W_-+R15`uZjk zdIx{D&`(e9ZP{~!wyn|5BogAh1`48Ws;A&!ju&kGT9n=<7p@v_2J<@zBb8D}QAPM4 zwJZG{)Huly#^f1I=wT6TB7Py(dzwQ&Ru76{%Je4-w6IuEnw@YNTI@Rz4#ETnZ zf#vC6*kP=)3b)i4gbgqjMR?($3^x|B+WCfUG5H2M!(qb!$1`Enl;bTjuM>0YF?<*Q z-Fz)?TOi1FdAP)y@<0roy5i8;*H^%F1-1*hI3jQcGPgq5NsQkULn9;zCA_{WjCCNi z;Sjc3kY_$ef|la3EQc5D&_EmpUL_7|nq*vS zI%Qvm3*58VCZibQ*tTHqSe6LdnveUO5_5!t)Jwyu@_?$NTQmW4}wi=Y0Jh zs_(4%J}0b};;KB-2=}&Oh19dyoZ&+J?e&G0ifUk@Q9Kl3wo;wmam`Sbb>U!4$;eyP z0~|J>fQFxyq)B3i3CKOp&wBpFNvaygL|F*|wA^~P=8av4O*oB9l_l$2LP9JKV6!%F zVEE1}RY_6H40wlpFEgfK4(IqvczP<5q79lU8jZpIzA6Vkb4l z{(){xV?p(D0XZb3<<9oieAf?hI-r@Aa9zaZAWqG+cAMUJ^#y9_TO|z53gb`1YfErm zup{&vo^$;CoMM<9lH;g*5uDkf%dfg2NOb290XYR*`_8cqJ+=c&&t2o(glWPFK@3dJ zM+~;k9@;$t1-HIjS3-TS<1VwcI?g>L5>`mX*w4(?c3a*m+bHlwH}It;Ya^w1oiFq_ zR6oM3*Y-m%HBZkG7-LDp)65f6vCp>%o>=dH`J^F=e{HBWeTt3}#e*1~y z`l#pu5ETTxZAdk$MHjEl&{t&{jO>ISb<}GVwclplwpEsxoewIux*eEnOxm@)fL?MC zUE`97+PN2=TjTu*LdI9y)P&KT>*M`nfvn~2lzl{?)>Io}`U0_96Q!bpZ?}5bm9}*e zq5V>EFs)RDS`9qoqGC&c(vndPCMzBno2W-2zwe1@TQwbO|1Y?Ve=`!8^)4CI(J#A6 zoPI42@l+sgl)_Ko?2mv5&iMTJeju8KLHH=h`iwsiQG{@hRA9?LpBtzGU)|^l3h+KF z+u4lNA6|j@h!0usjc%k!K7P9`MDsSK=IIH-G<^`W80;Glbg%8^P;1iBnRfhmZz6NO z))s$j@uAeSet178ztr{smSS|(Xh}>@#A!~Mq)9^tEq7OX$=*P`^MfZI5~0x3?pT9( zQ>}6a7A$P-lF*DUx`kzG!Da#D+iT;nAUzGnz@u^Dn4i}ubWfV~waqv;KQmFc=k&BV z7~&dxf7dUVjHRVdg^;or>JAn`H}8AWemwcshd6oFA`M-OioW)qbC~WS%Q|Ey)E=}+ zgTeJMb)muXGfrf8hvo%>2py`*AF;sP73X%@KqZjNu9ChBxIuKlrbE}Gq)l&!rC`6n zs>B-d&!rb(`QIuCuxNWR8>g(0_(Aj?VPF{== z79^jsQ2F^?)Ed1z!bQ2J_|B%i7zxx}_iW@EES*To@xj1Yy872&!VR($>mF*hE;m06 zb>h^dEj#d2Hh$#|NLL{26k`W3q6yIf6=t35vD6^YE;h`X{soLxRNUHt?v{BzHg?y| zVH1AGO`*p>qZAhm-p56e?>&L*5D0iw$@dm%v!7@AAhuM1IqaglCLeH#1eOCWroJ+6~72kNGFVF(^-yI;r$zvdkWCl;k5vQCK()hZRM?mnq?xPlhaP|RU7ChcP1Z3t#0Pps1BypG;s zJbCBEJ-L4Cy#?3RQODaLcG>nPK*W#-1;tBXH=>ka`yj%t>2JE#fflrg6_EFQ+#948 z0!2(Q(7Qhc+@CKK%!@|ErqYq6UaI0PIJUrR(rjk$cKAyo9Lu_Qv{hQlUv6{-UMp>B z4r8r4?QZV9&_N=II11(8w56&JRiDGDyesa3!p^QFK40SaK;SWSRk?6>@`We z?W1i^Ffm4lZ9!hUhtES=2N*+PntUVf_L+9s3gJV$2T-o%$45UPTriH|fp{SSJYd`> zsX;$(k#68hhjMGp=0%<-6I8vPI#!$S;gf;dULo{z$Np4+ubj z+xB70eMY2uh1%r7Q2iJWN$6TkbZ8{(Iu_5pzwAzFYv(@t{y*%!Wmp|smo*w30>M4F zI{`v)cX!#r-Q7J%!bXC-CIt83F2Oyxy9IZ*Tl9Iq=l1E&x#_<5{(S$j>nZlGTD8`i zbB;O2sO92HbdALY&R?9BtG=l3PH+jt@*QkJjJK@M3mqul>ePAcnewS^AEac!X#IT2 zU$r;eencVEY+_-UUF-9-c(SwydvXZs8zFul^o_0QaCvnhE7K`aG^kjL0i|S5YY;H6 zJL`hoQ>8d%PBJEB??(;}D+6ht7H*>j3Az&QpK0?HEPTO49=#i6gX>8w)|9*pmB3Hx ztewZulmcjon{DPmi!Tn(R%>sH2g&(uOMYR^7kxw+MOa}=sGYA1vF7o3oZrr$Bpig(&_IHZ_z(KO* zQFu1JrP`F^u{C$pvn2of;xla&df1$_d&>rHBYJwPkCdJB!-vRr7OqN9NTg1kvG+Gs z>ck0hoIrL`hqmLlXTOZ6y4AFw!`NwWc9i1(%49-V_t&G(&y}!)alD&kAru}vH$r0H zH|tB@G%i;X6$iukE@z$qG}%lue^h~!+~41aZusFNPtr$~HWJygyci$u4&%qhtNRTv zfkh!xpn{a*lZ5F)_y%zOfs!Wt-djNdzf@MvFU{I=uB>g?jTVs^NA1LwklS4}qj^os z?lryXm+^Gk?Sv4NUi+Vlq&V64~19^<+BlgYpDvNK|P8|=db{3;U5|sMTJcFLV zS)yGtOAo-sRnk{#N6r^{6MKN{JJ%za;2Z0ATVYoPHgOvpOQ?V? zg2fz*%!O;kL#e8M=MhrAd8h7@nD(;I3THnjf^a1_-oJHVtI(Ob4%u8-AFA0YOFFQh z|AO&AB=_j+!n|;Mh+Lk^y0GaoqPGJ2>~Qt5(&q`$31BNh?MUCMw>Bsj+lS+FcyqYY zGusR!)_rIM+5|CC?vkE*M9erD#P%o<8l?7kj(@S2KEQ;HKINOufIooz&cBkDx1k@J z$}ZzmpLM2B=DhFHcbMEr=Gj;*OZ3`KA@@>mw$1Ze>82a|Vk-D$mC)Ur5}g#b!u?@A zht+D8i9@UT;o`NN_qs@kGaQ)sra>#Tr9z8iq&_>vx#1xV%wQ-=*4cK^PBx8F7OqgK z7qD*YeIrb($D_#cOi4uHXj_Y+&v@5U=Mw|;6jobs#EMW3mz=aS`AFM77XLiZ&wx|I1H{$m* zEM~~WD{nIztGgKLG{OUj8J|$0HX~oZ)#&zRM=WY-_Z7J0`w;ybU5+568K!?MS!WWb z&W*r>>qpqtZJxQvpEDs^8)w8Cdpg9eGm?&7(EPt{39Wh#7JL*_IdpUGHRmCSV@{MB zHo3$O%pXQ^i6ci!^fV7!-s$tLLAjJ-OmM9mvGC)Qd%tt8zGtxrn<$LYBWh-xMY2~k zCAGHJsnx1)yyobFlTNZL8?R`(Kejw2=~s)aiksU`9IrR3*`sfU^`e|*BGDFTI~*iV zvPv(MO)#oS)%!32GZ<}>mN;#tqBOL^!`xeq$Qq0l#GH9cZcai-waT-+sJc||6vssDx6ob& zz^wnOZnvS-zX@az#l`ZK6I6-Vv|;s@L&P>EPnrrG4gqm?nyO4L4K(LFNhV{AoH*A@+{4XrqcMni`S^W(4k0;Vp-pfqG-2lp&&CK?*jiaOOTdEGb8rL(&vHQ@J zjCu4y?uVO>Cug0?c}X59q`|gn57`U?*Q#26zejI8Zs+{k&+#ojchaTW5cEt!JP~$4 z)ol1?tkj6=2;k4s)ly4bT%^{u=();G<|ud`A)JP)CvP1!p?(r)!-Wv@JoR4x-k_W%S%JEqd$^f%QSa~NJ0pX zWnJ`f)#xVd&(S9wLSDUpNAAHKs!qIc zxSqu*IWz}VI*Dyq_ro^z<1+UGd9xiTDe&W4O=%eg_-eabrDc{1@e4Ou`;XYZka5ra zaxnpdokeczg|XzO0~1eZ&#i03GP`_6?_`@w=VeCJWwrXc;yi7gTxV>6nPbP(2ATUx#DVKF zo6&2};PEdIO+-JX!3Vs@jFV9q(o$gq6XhAdHaa>Oq7mr8>c$$1{+1vp%MY97jv?se zfQ7Js=M|6PthVuH<{ zTd;E}9tZ_s5TY)(S;Fw+Zz)6Nb`4;~S@)P#-0FM_5qW?}W!Me=_}16Ab?E!(dqevd ztvKH9!OIs-yMY|AA>&RhqujygTY<}Xup$7GA$d{(GyZV*0}iCw-DX#1ug!n(Y125l zzNb1Z^zua@OFqvvUl(m6cD@KwUdD^Ltj=_)TMk$&K@Y^uDJJPttiIUYGYkv#nuE#K zzUIR8!3^?Ld5v=S;xdF|a~%^-8%AHPYn_9cDv4TR%DDLC*hSa0P*$66TN-oBR+=&m?6!Tkma1^+_@0~d_Rjt#JrXcX^dT>UG5BtUzM9Gt+4@J zXBltZC`Ri9c7{4?z$dfxpP|(m-&xDYTxebHwY&`?+Cf0|5kxI{`%_uIo`p8*XyeLe z+(|e20k=wGo`dR_zi!p2nDnMX-IIa&C{&tiZSz@~$d`uz@T#i7_yDjW7|S zK9IdIIPSg5g{^NdUvx8el|)^XCukAuMoB*U`pZ#4#h+aQ_V<1Ry~TiQL~pU%(sqNv zl=s}P9DXl(f{VXEV9hpE9mv1(BFe@R1j;L`3~O@A_zS>0L-=dA(er#KF@ir%PGw00 zN$&#RBbol{D(VC2iz||Oj(w@s8U$Ni&r2&4Bp@y6otd3 zF%5%YB14|dGFB)sR@km6piD2R0soP11hkVE=uwGYudp?}%0*-k2^^;z)8kUJGTo*0vWohuRIG&RIQY`#dyho@3=w2_H66Iws?S{y%!*5WxN<;L(SRm=ayQu=g=K1 zkODU3U|J@1>M46k9|@GKw0@Udo0Cf-P3I*I(+P;49LF{F!v6u3+gk#omkwAjdFOUCD8TspoU@kS_e3M%S3H@72=sz7qWqkHw z38OgsU-_`~oT5U>^%GCU;__2ODyK*pXSeRj~jaeV{d#*C-~y` zbM+s_WAxeLs7jKR_$odB;?_|k%U!@oJc1TH87;i-Co`_jZ#H_jOdCjkuQWWbj z?or7d$Mn>iGkVCxU)HdBZXQ2AR2X+Emd%*!Ep$aP*~+ z2d7!MFtZz@G&_sJJ~*qUyz3j-biN;_4AvhB z&5+_R12Q3uo!PSZ32S^mUWnR@^=XRU26>r`a#G2f*J$R3A z(d&pa-TabS_Q|7jT%KZNtx!NIyT)Jily2U$yR7NZ0rB{z$$IbLF?$T;=|w4Tzr6qk zh0@~g9iD@YTiFc$;-rf%&W(#Fp6N>e`4w#MSf;o;rS3@wd|xt0CNM4|jW4WB9%GCg zPcHn0h7@%Bs18Q9k(>g}j!GXKuaD6}`qEV#ySCnpnsqvkL{NBCU!fjpkF-`KIM=m& ztvx6;&PIhIi_Y$ZTB6;ckCUh{UDt1bqX>xqCJ{mVb=^S8lcg{D?!2rL?h>X`fXmS& zu^2S22Y1VBulcB)z(Vo^_tL=Crx{J(Ncm6MoxiN;bDd1U?<~61;890mJ)dW%xA`e2 zTQ%p0Ctr)HL%|dUYtbvSIepHLxMoXb*VfpE3#T(^czlQXaSRz^RLFfyvz6%{SKG$v zCjjZJKY_h52XG?T%zFJgz1UD*x+Sj?)o868hV?dfXUS#xU*25vThiCiH6;pBA7iI? zkpO!nor-NJYEk^2&-`N*8?%%}h-yd{g5Eb>GLgJhjA+U+C=;w5xnRq3e&n@p?w z$P0!QgOW#-E&A%dDY;9#2-Fvn}=-iOH z)QUWn(FiG(y0wSxxH_7nO*NH`4XU<+-h;cMkc^mVipeu)q1CNz!7Nizs4$kR!H%jk zXtvhk)YDTL#jiFVSeUKwxRj+;Zq8LTcl$~((=4O@c+j*pcD`;!vyHUkzYe9w238d6Qol@vzA$iV- z71KQSU~C98pHW0if(b-hL|d!)bP5R#zeW#hkQA=n~TQl=TC2o_Uj#`PUbGMt;5upST6flAMUDiV$%l_ zB*!8SLU(M3-sB2G(7vy%iL;*3tk@nlqK;I8aB8YUzj)oZ3MEzHFy~ic^Qaxd z2vY8+QLj_*UA0$^DNf}Ta%BKzj}b=I!G3<*F`Ma2Bjbm^N?E@aj26RYC(U-dI>Be` zNkS_0ZX|`NQKKv_$i+&nnVtz|ZD7YUu~v1r)Jy&8A&-Cuz1%!nYjP63u=G%|2_S)H zeT-rA^A&nvm~YC_cxnn$q))fyW~js=idEk>jV@anv^|n`;)}b~UkaLZ1pF~+0XLtx zlEY=){besnY`Ir;DuRv5`J&Qdk~Ai38*;Bzd0Rfj(dbD6-OJ)fyJ!G6ExIiGGGU#2 zUFhRF)9g}KoYpuShX1hRJlkm13K(ZnznX*5I`yZ2#nCKP=d>*ksG4ua0*IQy=xND)2enFkhFf(KD9g|)m7To1Ich}FaMnXv=_5k`Ob6xQhG_a zKHD)+*){HndqG~vyw>ExcJqfxB7uqx#-UEKrC9tx0c#ASmt$(ZCLcyjgaC$p*|viA z`sQqdgpQg(jGsbzuhLg}1iPo5a!B2f#u($}L#SIkT#QteQ>=c*kCPr|L%T=VMkAL# zF<-_GWM;~kNoxd|`t;tapJESgdP#Y?uFXKjh}2{F>!Zy#)*i-o65c^?Vlfcy-ObOm zI7B{vCRK?G*?udW1M9F$M4=VhnB4&179^F%wU(Lf31`G`3x?!CQf5d;#_1#l%VnKTc;;%L^CdHyP8k z%2EaF)nXE?;??#dqy~y050+m)R7llE^j!>XtTLex^E0rS4WDNjO`g@5$~|rSyP<0Q zt={@w#Xn5<>}5c}=P29l{Z5DKm0l90B7ocV>n+2=mOcdGN+1)*1B`yk^oW0?NnyUx*bXh%9ijeEHB1Fhl(}FUv^Utq1TdR!h}eA{99%>c5SaMutWTx5)_(A zxXxf;5f9#?Lg8xA^k$1T!_JYxEvP3c=FZ+YKCX}K0@NU-&9Pz2WA6fdPCb3(X_>g$ zwZ3f%D!)_x6D4-=`EnbF$>!0wz=$EW@-M1;V{)c`kI^_sFIjS%9%G7?*P^O~FG@9} z9$wqZ?L|2sIeo;9=W!h~Ozf0v4{Qb7c~3tG-5kEJ7ZzXkP*F^4^tZCT*r!*{cf_)r zPVsw;kzy9uwwXTg2^_pRRk52detU3N7iYCN1#nr>B&u*?>^1JiCkNn^xRSJIl6@w`4s^WgfJ(o84dS zp=?n*{XX-ZS}9vSSmZWouhBH#>`)=OHL?99-hK{Bv!h+#XLRgl6X;wuf_4w^j1mXR zA7jsNb&h}=fppRbc;6)!fq=6mX=CldEBtE?k1OBYbXAKu22Ra?nI=~93~h>Wu*Yoa z+{4+M4W&?$OGKQHO_%BEF*WY9+VP~&KRq;vins8vizVnB+R}Bv$zQJNkiv@MW(x36 z&D)g;LOXQG;LIt}PH`|SlZq@SeSyYpRM{611<>KKE5II>O+#?y>`+IbFISDnC(?zS z6u$H9moq#nT8ScA_fXNjUnZAfg;Z=<5p0Nj1R-DUM}fTr>#OFV>y$2v7IBt7NRuEe zdxdul^Q5TOz=oozPJlzJ8Eg(gF*auapz9gET@hDWcB9qmp}zv}PzJ_!_Dp)jCuy#O zcBN;Gf-p@vpk?;3?Z#7G-p3^dP#O*~H7_){)}m{`FsKM=n+(rt8~toAu%58fPzuvg zo-Gk2BE!;xnR^3%L( zHT}?Cki1&0m5>N^hujYsk3>UB`3oVfoC8)po;Sqp;jYk{rTMcAx+Ata`LLQ(G<*2) zHf06WHl9H!3i7*xEzZSjE;wDhl^WprcGc8Hwz3jspQy=lz+|KXVfh@6ef zSC?s*9w*e_^FL%&KsxAJ0(Kg}G8vP0AN3-ZX+Onk7O7#@rD$FD3$9I{lU^;H-1t$u zgu$LwfC5-*7UTqi*DIJ|rKSk_Tu#a)h<_$Cu&{j}1q>ks6NE+m@&Q&S zr>=1#AkQ@ihpuHlD(LOLL_X2*s zq4Bg|iX{kQOA3AQibyuCa5S(D17NU9B_TH3V~~oai)%#*x1EdejX^K7l0>9s{mTIc z@hrgC)9qoKuaSmag%c%l{qWObE-A+CPgBGfSc~M#^LeWUJV^{xvC*# zCsk!ni7GZ{476d~rvrMgtk;@#$tQQLLQAOT6a1}B7FqE#Mv-j|@Q@6Jg6;ty9F4H( zdE$yyY4Th3kJ$FM-FO(R-VwxJD}#)GtbF*@vwxpddfQDH8NZ$Te-jf&<^KE>lr**kopm}O}$Teg9wpav}t$D!RB8;@5 zbWt%-ZS{H5?+GnvV@#nXp@~w)f`g3wP8-Xa-#!)64U@hn0!^hxYM;7uhSe=XwITnT zs|T7EuY5f^XW>HOV07}+RjE|&2--Hj1zw>4wPapc}hIB`^aoPHG5Y2$Z)7m6q-0aTT z5rsNvt2{6hFhO!&!)G70bwQshPGDbu!WJOy&KHR2Pgfuso%MNq?`kp6;O^R@gFMw? zgMz%zLowp^q-!?aAVFv&)HD1#u%i3pCo2=O1=i?R#?B8i$na>g&yH3ZlwaoW+%W6# zP7tAva0?ju-?ld8YC9W|w~BbLvq}TXXjOYMdo&0fI(re5M$LA94e)m>r>w#6qSUQ^ zXsCOuGgS=7!5cistkdi;wn$uI!y8ss%{Uz|3z5(Qq*BJUr zkhUDM9|U2uT2%;1?B8r7xY463%&0TyGXmOkMrB$w z_CesW{$ZV33RHx^6}pL32f97Lh^n(JaL@&9qSGHYE>xS8QKJVGrA=siwxdr1p0KM% z;{$Pmq9NjAF9A1zNu~jNq<;GMRIP5;Xf7>mPnuu5$Wi0oTIfCc+?WK_ixa+ zyLXI95bPMZz78EKG(B_or;kzWc;yq>I};+|Qo)W9`_ZLfQv_i48RIJap@K>d7E}$w zEjRUV=MH*q?IvN_2D4-iMInf6@6l+0PjbMpZK z*VUM%sm9M!XB@+QP^~&p6)@I^VZP$Fvt}S<*UoKys=@K=d-C}z22q3h?Yv$t=cA(* znp`eW{evFWPVx&sC9M-DXPkf<~9cUH0tKphBRB76) z7s&^vAtX^Yzq0h}OW|w04k6Me?T(-fqx73~_bH)5sZ2Y*kFBs(ZnK0CCDjSeaIa~U zN}U@!N^3xV0426M-6-QZU6tsL(WN&?ew#l!sX?JS9L3Ff4GCHJ1f`moMC!@U#t!+gYUOx-&t>}afVDRuE<~6 z){oEYvH=OsdH>mx>*AhmOv+-}WzBQw(ih6v5qWqn@!Yi6K3#ae^KDUXZ+&3?L=;cG zgaps>c>AtVl`au*_lmjHFRuWzNPxO~%S`74u9F=r4Y6SMxCDHT%lMb!1X_hrwo+pw zvt`LU!D{L-M7Q_-UoNfk&`Fy-*5Bw1K8wMje&))0d2l1Lya7M#$1l(3(fhRS)7`w> zo=SiR{9?k3bujG-{R6d0#TA9CPrPf7_>^?t3x~5K)&fFG%0_X>WuE00)kLe)AVGs& z=CIAQh{>u8cnrG)j9|v7(M(y6)R+X^Zk}J5#ck<0#oQaisVev``2-Zgk_XP#C*p)A zKK~7Fj2*fN{(H?}OnPumz0XBf$dgC4{M9QAB2QwHdetmbx<%v+ak+?jsTGr?%??wtcjAIy% z)f$6kKB^$GITcpFkaF0!c~51b*>>8kjTVXOu}HojJfu z!BTHr;+Xi^dgxA@R3_GoI7*t3X>=#I<)W}y^=dgtKGT={dw*dF^3%wYN3e#Hjg2=N zI(N{L*OBB=7i_+B6crua0{s`mBdjv4#+jR9uycVS3=D*jC)`f62)zFb+GXD>1BJ_E z6=ivJ!KDk{zQKL&vs6B(N6n++oI1JI<}!Xbl}sYx@JYRhgbR%B6w=K?AvYQSm+?%p z$@zzJ;SBDZFnKKjp-5xr{u1d%`*k02`KX8Dz}odqbI{zleEdSmtSUS;7P1`$LT0(J{ulvyc4GWdPmYg`v@ogRZ(^Uw?@l=bGWe6mWWvD)h& zy=(1UK($_}R@99efrxMxScaWlT~grf#V6Ax10FRz~5U!PP zcvLSY^dvYm)KQ*X8v)O$D9+&RAJzzoKYg%Z13ZhVcb#U!eK`n~`*A14$LAL*Utgn} z!uTezV{M5RH*xD{DclLd#P23X`7`To*WN1Q7#82Iv9<0{-|K{jWa&$E=G*JQS=_D| zRoL!NSC|eaHfW`59Ywu=u*K2>k8V6lK<_Xups~pMvFRClH-#UiQIreD1*$7VMqRA8 zPVOkkHXig85HdUy)lW9@Ox0&!Zu8z zAKkbf0f;p({|1NVV>0LHyuI+fPzl z;5L@+Uhc_;VTfD9E#iuP`zE-e`Kok7`dorhXyF+$<-T^gR_HC z*IRJbOm;_zfIxhMhK{|(&qMSZgO~pTcz@vVcSbWzihBW1{B)g^+H9sMK|MKLO%5kN z1Fn40AxiQzn6HfL77;AYVGMd6(uEaeqUp)gsB|#wxvU zj>bsjC*EIEKSxjY2~C-TzOyb$xP!5?{3G<1s5P9|ch8H>U5zEoT777xx2SR*xMbWU z6@e^T;O|?h%*KmuL_L)SJyY7-I~~EzWPZ*MrUA>UjIPTYmy5#T_|11x&HjPuwwLU4 z!r_&nH&;H5JO_iw%DEd1zZ|Z`j~0zWb57-SvPaABF1`cP*|oDsIZFvc2S*lsGVb#f zzpnK-dT^g(3c8=NqT`l`8Ry{(!foaE&WyNR)s|%C0a{oIsr+|yMe#%B?hl{F4s)V) zFWQl}9^+|h1u*kcn;u2gcjjr!;n?_=;3NeC;Gx`c_-@sh5e8Dk^2CHaDQ05VZ+~H; z-U>b-y2z7v!cz#=EqugHO+1XZ%TPc^swY>eBR7R!(|1q(Mb3GNlipb+@)k+7>&@lL zlS?9Gmok;|8y_Y((ogA*-cqn!i!#9-nnp!9sDpDW$?ubJ^ zb5Vbc`;wJQng2!@Df>wfAGJ287InSta{Y9q!p9R|w4g7U+8r~S7sl~An@Y$Go<;rP zyG~YQ#;DOIbApy-E!|OkfTTvgcI&$QEGx@OB&;GD?b1r8gWQxe*OYlxo-g-G# zfmvgfY;1Gy1VUl*Kz~Hf5r2HMyZC=G>fazG=ZMjmEt7UC%zLI6cb-!vpiwGynoM`CGeRFoG!D8@KndVYHq0 zh|>1H2g^5-FV#yv>4b2V>zOWige~>7o}(HL5}$N31+=L+Cei!YG#)u zYUMdz*g4^!$syzPb|nqyNN3h##@fZk!EnejJ*x<~inRGUd}D`WNTSmzq23vG3H2JB zK5Tf^O&(Ci+&v}(KIsXnKHZy^8a0A#UJ{D>M8@vQ1<$fyMaZ5KAN>R1(EdUvjpC|X z4-z#V*~R+Wd1y@*8dt2XNT;LrqoCg!;8RlKg1!Zjmvh_n%lO7;P%zf`3<=Fv?tnF> zPpiWUF-66i`WN87zGR6aE72}G^PDM4H36`ABsYb2qdx^62=rspC??@>%F1_r;gP(^ z8xk$MJ7;P~4KO?=3-lT1z~Dof1xn(9lOW*ajwH11()6VfS+#(hVvFp1H1XrfoA$aL z>2E(+7Gm2zf!qAK8!xW~Pt>pH)aC5)UBldNX^!8V|^s_fS2qz)j zyCGaPwTO8(QL~whE}@6sIn5D2RxzPxXRECet>>!xER?D()o3+J)11<%lsCZMaoLrbLn?jK)LDL$lhS|!N)bp zCipeC@w1!J;#beeCFPQyA-WQ=n2rJM-mGc8nDo{sQ{7>VJygqh;RJyyp+;~=E#U9 zkKnv??tNTR*h}h*{S6mF4&SV?l(-X4W>QgqlCBzH!oj!bT@%T&S z7B?$qIn!4axm5a=OaKTrTE0o7G7`-PgP?3zLW`@ly%=^cS3(o$QE_WTicUZ%!Bgj0 zKj_0MrLUatDQ9spaVGy3doU3dhg!0>!r|1tK)@V~sj?$sji?4b+30o0V`CQzzR=_5 z6RvGs`H#LeHzBM3IV8{NvDCcXXkt1)!~3o&%i9(cKRwTuU9od#eTm+ z@O0b)(sg;Bw3r_`j?&f!LkP3QEGE7eP9X@{LkYE?qhJsGbhC>gsIT;>?rKlD;W7SU zb(Zd!ecX1WGR)gzlP-?qx;2za-TL&{sIrhN_u68*G~FpJgNJ_G)@jVdw*Ta9`l1X`uhSouEZg~}VSwVsb6@sveLmSX-}qHZ8FMDsbX z0-Aw3C?1pSSd@0{X{PR(jORKse&^Xz?LL+hUn@ePHyAHj)9v*t>w@&n6f&nREZa!R zq!rZ5Y+!^Mv080n$Einl^GRNn0}7^eLFLad#?1Jy()2G~P@*s4%~U#k=?H`5^px5ZkcLq4{_c z=i*}S$#G+(3`K_BssILubLNdjTJi0@N*-S4tI39|7=q{!x5 zhMb{7+A%i{0rY=tyas7E%)FFdILtpvjXqjUVHZ!T++A_ex+=~d`jyF?zU_UQdeDGy_(lZu)SixqGN;mYeIuE?+?7c zN9GHv;U_5nfYdW<;?k=eLL!CTO5t&>9>icZ${EUc zdJ=9AXLjseuQGc|x{Ipoe43yD*BQL-WJldgHiysmvh*fy6%KEHB8ZP9zHUD(y&6iJ zj8CHYnbIpu3Olvj&z1331C?&VT>bqi<}v(h5>Czr=J$v$_%6k3x3x$EvR2+5}wEEy93?YCy8FTXo<~R%8L}2Fq*+8SJ5!Yt~1U9 zxd+;6rl=oC+e_D<=yEmDG0;sWiRY^oVT3W^nFcE%(7G!!Yk$>n2G5oBHwNBtt_#9L zs!MJL0uBS}1nQ zx{Zlks!8RP>DkFuF40JNer*Ef%(u4iBFa8$tl7^wnlcvzd{7K<=Evp{&)zjrZe zy`+~GN>8;R0Wj4mqVCUJ?t;Ev#&v1@j<~@>jO2hNSb4{RLxq7%R+V{@Sa&lH=Vyqy z=PfeO%e3F0u!kk>UG})(`_F<2Q(WT!mM(F}^OU@MHDQZeOorrAvRcbj35c^^dfP9{ zI)u^KE4z=7SI0e9Dtb8)*Y?*8D)Ct*gw@c)kIb2mVyF(ZNigV!Uq)~g9?0g^36JNS zf!y!*s#kAwq29^l@%~0$O>2@*DKCX zy)Qng5_Iq8R}tRmSnvS5n*Rw0^CCT*+x5#{#pwnOM(ZZ)fzXElb_1mC*U@|nd-zII z#ZE5cqGA`EBwp``Cwu;tGjh4i_`9!Xn%p_#b!JLxt&JcbaFeDc>|bb5UX+#mg4bJk zRdXmES9IqgYRoJUqXz3N6DqxCYelT`Kc65F-tfVXivxb{TwBK%R!0)=2dGhorh@JS z7Ug|Tw7P>YR~MC7Z6@>}g@WggFI>{!ZRVInrf@HQXe8=+{W!;H^mNr&>glMRiTN>e z`m@M24$f=(y>1_J$tV51o3<#E_qFi}3cTClzK&N+pv%=p{%CAeu5a4&MJB6OPfl}L z#J6^L9yJUeX4y<-_C698w{71l4jWl2wo*r2K#TK-aVb7b4ZK4TU;c7m&6CTZ-!?cr;pd{abT#0hEIG9apTsT;c`09Zy2UP zlN#c$m0X-Za!i>WCD=bFH@81jttx)peKH;>&OS$`kvK=mw!GQ&H{hI5&vD|g;N0ME zZUu5*T_o$1AER=wn{H<<%$bljT~L%h<>R7uq|LObJtjwQL>;j>G#C%0_c));<(eLR zHM*aztnmF&>uFo&&qP3?ES;=wlkKT+v5!f&KiO%jS!m&8@vtDHdqK-}{kRQ{_ZZM4 zbbmIzs@$x+l8=kaJaN??P_VbzGdgfyKnnTeo8E=8UR&N%+7U`R6Zrl`kJFw1D{n>K z@txN?Qy%6j7LG=0nVu>i_H=lyVk3<85s3m2Skz12Q;z4#v581N++O53Z4VDScpj1{ zw@;5eY+=EClfC#ccCoajJ1Sv~jQT?mH5T7XJ|_~PcC3elz5j>B>y4`;b+3@qH@Q-L zPD6|rO=GSzXIgl>1z+McgrVG|BY&-%8IP~=anA)VQo9)=$MfgL>F>RRS3za$ z)T=_O(y7(YL-$A<%YyT3oiuH_zJ{hO<}A&a#Bij#O(Ssuv-k-kO$hN;xNJhS`#5N2 zqhDaszTU|OaeZ|!zA*~6Rc{i8z@p8~ZVcmJ%J;oPIXV$FLr9?7%nx0ua2sHuya!*P z7eQkf@?Oa|d9$zxoo=9mSlNY7H!i(i@_!s19X-9Am$JwwBPTbxK3?TN(ERUAy8m+I z_=qy9R2V66Cn(eyqDL~CH9Dr%{3Ra_4tJ)&Yif!3N~+ysi%rpfrs$7Oa6o5z|MG#lFRLufRWEu!z@q-%$A7grZ{;@xByxG%_`Q;M#l}wp6Q;qsT=W zy-63ufGpKl-<`=rPhDd(DTkk*-ruIu4d4fUM<4)&}0H&%(3}nTi>0WL<)#7bx^hCWVS*k{|=vA+sWEU&wvG`HJAsd ztdnXrhFqb>c-)-iB`h>-7SXCU@H*2VN>c>RQL*B->hutPz~2mmBDFyrY-tTKEXK=j zwi}x#YU##V7OCg+w&?sQ<>DYu69k21*Zuwv9Yue{W+W2;#abVkVPH7L@ztGO-_&e@jGq2*UeC2f z45OW{Q!nFl2Eb>j_v8O~0R+kF12Kx#?NFOfzT|y%wi&=#jO>H>BaI6_4Y92Z1<+dk%7F7F6l{0@ne+5Z1yle(9=$-WpiGhIutM$yAknnKXvaei! z%$EVQvJFcZP>#`Wi0c(5)|<6^b2WGvrO20EGS*5>SHLmI_kaKN|La>LF(&Q4K3Qk4&uKh1x_J@zCWPmzS7`pfH59j@--+4as|EC*^;)Xmy zAR}K2OZ=rm=C(vYRb6BvwfMsN098^J)5FlXDUFAk)mSh|l~y4Enc(nm6YsyzlQuCx zec3GrN!(vWjoj6nOX+ov`f5%i0c;Ht!He*bT8W{KLd~Rc*j}g9ia3^e)bC`A-;mNScw(c+wzAu&fhTj@3sm+JEb6_G9Bim-2;dDsLTLG4;3;z#@U@yV5XcT$d zIo)J@*~?@Q(dj%X(sxk?Agm^ruIq&a0--yx(rj4D-CeyeU7)8GyFF-nd!S(5ENzco zldR0Sv8>+7`l$H9DUTt!x{oP_!2mSjIY4>yax)GvtCc)Z-=xrJ+1Is^m&lBFV18Ov z!~XTfcK+p9z7baIq}LM{-GJXL*~}WsCodJCbhenPZvb9|F=*GS`0`t1dUO!FneLGlqRIY1wcY#a_D#>`0=}bI359`djz?J~4qgGMC%0zf`avk{6+8jIck+5p znwpx0eu45mp;h}Xx)DS;cnch|8TE;V!j&J!ZndfmeX^Vh_v@+kTJe|;QgpV$24Acu z{9%1EsXT9upEx3f!_QkSDh0IYp257eO~l@ErSvhs02%$xSPA)oUjJC1;f+2A9}2S! zYyM3?c@VRJPs?E5g3iyatvSal;`H^YoD|y~UwBe<{0a;dFm;_$0m|cFM&*=a{=$>N}3vlBKIk)q|sB0PkG_HGcO!!m4s9rWh2gHchKoI$T#@;j0kk zGI8u=mJ}rxBo*5~Y=bL?s9#Xm4HZ!whQHlqnM@wdpVO3hP8c?PLiNb~4(&vtDCGBVatJiNr^cYG~rw>GsBj{Nn9L zp3R@7G~0Dz)A%urW*XX#PLn;g|mVdX4kp;q$4_kNNQgq)NfFE^rqc0=D*j+e=H zgNWnp28dRtx?I&(QTZ9Ftz~|BWzA2f6s&MJp<(y_eZ?pGBVAZLg5^dIqJ)R}h=H3* z2W23orqw9Q=Qq2GvwB*fb=Y2;blHeyokVObx^S=_^q8%4uU+clgbCd|u}Dne8ueI@ z;Y0V@O~Yh-P1~hv8BJ(~QrIdYO@m6=HQ`e*o0V2tNgc{V%xtxNwy>ssW9$Ti!RG?W_r!l+f8kLWIDAU}-0~rj!9TqH5rBK4ba1w4;^%S*Gj{r|$ zWkF+M`|6W?;<}~WYp-8tMDH04B8FUdy~2!VN3;gN^0L&_ZuBQE0szLAoHl){cl8h2 z0F}E-v}x(#CaD9`Dcq+y@A?Ki!b~u3@Rev^P5kaG@4m-7hs-maA@ZBBjmx`mp`YJv zE+EYK!D`_KeAS0)^8~v#?D3_YdiaS(ci&8cJu^@aIhnxl%5|#Qx=!w;2bZsLimD5T ziPd)s(Qg;OqTJtyDNlc3M}R6T{LDN25Ogj2z~6R9emi498O}w%iUwl$(zY7HHfi4C z#d%G=hjZv?+Q!q1-J0~WDfXD3RlUdr6w*t?^tBWUY=3FPW%()I^0Q2c=jZ;*Nq2da z{+(Zyw~HD@CR`6q+^;6(y|n|ZK`jc1_Q;34q#lSHafZ8uszS{o-)(K6aKO&iPHaoZ z)3#h*w@u^O?p=`Fgrh*$X!33dL+VBRMQQ05F)?|O>Po*omUb>&wj<_RRH%TQJ-afy z6qtpSW$5v?<99tXYed8XN$25{mTK~36&^g(ZZ?WXW-hjOlSk<8ShU}k0(YC?SR^&o z^`ZlZUhEYLFRoSCOhOFdkvl11MsdF99>LZ|oP8+M%#0`=bGtA@3S@_1dCkoqKFC!Vskq4PV*u@jmJE_6+>q^x^evcGv3}dwm(YU z#J4<%X*9=kYhU_fM00|vT7z@RgSZkBLEVwoKI?S&wXmt=ENOfDvzO#5o zdb8Cc_IOz>Z~y4#M`hePJEN`s563643>X&EH;o~>f0i?VJD^Dd8-mu0|$Y84mVNLyzhzJMRT@`P&!qn=l zPEyolY78;AyEV;i&ia(}$)%6QhKF>8{am}&) zRb@!27HsQ-{Poqr@Ca`~$r5sH-WBwL=lgJ581{y?i?@xz900^%1j&_g*7Diji}k>6 zy5#}ar^RKG>VLy`b>9y4J@Ys()V{qzvnORpZV)sI*WL?Vyb9uQIqb?a{>f1bLRiCV zx`Jx9j6}=T3!ooBOk)dn9!-pD2tFPTW<}Ajkt0hsFF2nny0b35U%goRjc?xF;<)2> z9H3P-LtPBWI3uOb>oiS?gAA6;mJ8paML?i*csj!hVla{(mkO^~r2<(VC!M`ZgY_`NSKi!}l`&KZa+RD= zy+26Q*rOYh)M^g*tf@4cxl6G-N69_y7>OIbr`J$9nAS;0C!XvtrIU=79hgzV?Y?d|ssDnCt)oFYsD6S9W)E5cHMzD7n5x6?Uapy~C#f#(wbgVM zdkIOGWnq-~%KXyb7=Bb9#7c*>U~Vqvb(?X|Vjq5%hk(T_LMT{;X@DUNf&vC_#eu|_ zjl}H{>`4KBoDtg96rO&UNcX_JPY(C7sH2AMf}m)r$z)~@m(rNn$lzUP4tPvk{$%;R zr937P(%??7hs}}}?QyyY(nV>Zuhxz6EZ@y-{qi~AWBtU1$SW{q=`u%uelPgssMhjV zFF=qJu!32QET58k{c8yeQBcXBjkgD=Nl;*qm17Aq&dcEDvJ=F z5#trT+T%tyrYf5A}11cS=?!OUf3Vd`E>?4<1N7w;_L0IMAE0o|DC`5>%SN>0f82z-}Pij z<`($@;5s;8hzvvpQATGd^YE6JI_xEh)l3jkpmF-h1m5_7W&846jdpUZP&xz&hCm%( zCkVd-r3Bynr?q^Y^XtHOFO72%tq4W=wemnVLgPcGq|C7^c*6h<>f zU{)~N7h1+fDlYj6ZknE2KY~DquX*r2TcKK1w!I}&0m4i53R3hZq5Q0}$7}S}K^ma7 zQg`(Mu`m)k*>Be2|_+Mr{H;b)6Xp!;>6gi>y_fsBooydanXF?)h9$0@z7-X z7s-#e$3a+CsB9WFcSkzNW*p^m~p#@P zu&rL{thRflq%omnhKYkDQw4tz(0~R7jM?~-?JI@q9Rt!(K8QY}U;HK+$$GX<OcB@G?WLTIyL>+fR&h%p!wAz; z1lET#KJ31tDS#VT$XAWPg44&XCFM+}m1*eST_cC?*a#wT_al&qJ)6>6HWieeO%#Py z$UIQuAM}``P+Zo@>g}xbHAZrvdcrH7jiG(NxT|-6|GUV>*b<55JY$9bPZ_ZxkmY4j z{ysEC+xrDgfF-NKiT(}fn`+cHFD32HLDQI5dl<^{h+-69i8v%=>|!Rr#uSCx6%J(` zPd-l9qWKlKK(-nPhItUd%`9q_Spg^a4^viXc4V==1tIl&K!OXFklx?HNyf5=PI`tRjA*?dbH<1-*u@{&Gf~Q zHflTQHcF-0SVC@bz{On)$I69Va!%Fa!LPulC=gW~1rxk`Uhs1Bc|ehhf~jtuGD7x! z0;ze2Ec{yOVb#?W7H8Hs!I>BEtt?p{<$jnFj*;vXg`j54A!Z+fjl*_DnfELm-YOsW zNGMV2jx(8V=YD<;!1~@scNm5PWqeau`@t?lLZI&Fe){*3x6h4HJE0tS0=G@F>sw+A#p-WB729!u%v-VI% zPL`B1?Jc*)0TLJUlhih+Blevm1LRjw<(+N$nEG`S;rARyu~MU}n8A8Q0LLj`QAKaL zNxB@})k4Y>adZolDU^hB_RU@ZW1kQ0@56SGOX^*Wp-q|n)ieN9OWsUW&L=? z0m7>LI7Szd+L;bK{m^)pHpxi6oPcP85&fCp;f=xIHGh);b3k@`CC1Md4~-$EL`bWY zMH4*4iB6n{@NzNW{S{8Z(`9|V;zzgJ-)0Zp)vXdhwcW&*pj!R=$4KZo?rm>U&b`#* z%VMT|hf=B5^bD%&${`H>>!kOr12v_5pfvv7AS>^iBexrueEHhCu({s=k!OSsH0k|- z+c^L7nC-lB9gl2Q214I81JF6#PFKuw3rR_P!j|-iX7U;2{j2M37X@+c^&3g}?W8gQ zs4IaW7FjR>lWhn3;#h6-7YC-v2f`ZQ(Fw@EJPBYCsYeX|&G{XBvj0H7qllmSbvE?w zjjnXc+IF}0astzwV2faOx1b1;L2a{DaZJ9ps`ei15>7wz1RSS=$=XQo;H_WdWMz$b z23l{QB#n&C0ZZ!@#>e+`r8TwU((E1cVllld z$m=jV!+vEC(EZ{9SoOQ`76c1@DEnsL zY!^wJJ57E#JPr$mF82VO=LGhVO>IXF_x=R1P)2y#3B4n@NpbC~cw#h1^S;C^k!bSC zBA5J*qS}nv2Mk*H2hH``2Q84Nvf|^nxa4 z=d8uqI04vDo0z%Z`iN2#Yl&TAw%nqfDK|GLMh{6y3*LgCydS8#xW6XV#=)52jv;q37WlYV$lgFRCd}EGKni)(UdJR|%exJtfRQ4>#zLN&o3^S7TVCV^i z3R3=w@7w40?B%?y2zY8!_7bh+_)3fbd-5}y{a(64Cy$B0ylSI8*Y24raV{D7e~uMs1#XOD z$_T;uck7+qvKK$5xh3k=mktlv55s(Qxhd59h#fz$1h~vsxXSDT#HP}BcQ3qg5EMf% zoSVKeB({vz^Iw98tIC&kXocrqWj#se50f=3wISpv!hAcXM9wLSOKUxEdaLkw?%N{! z<-2(yS|7d~m1v!yyUo!bg{75puDgew|W(ik(2uRt3c% zf_Fw;GRb?Ntv^$L6oC}*6kUS;x(i{0tt!RTN8AC0NDlF3f}fmasujiOTSg?wU=Sbi=zV69)LqH{}^+uW2FqUL+HcsfQd)%w8& zV(5loM7-PXd14z6GiP&16V4Mt2@UFFp~giZ*%@wxbHs@&Q5FGJw1K-2YF5hL-(AFF zJ9k@ZTyVWt8Poc3`-&38P3o?!z5D*9B6#YPs$wi(UT}1c;YM4(4J2FId)Dnkzyp2M zXn<6_0g8ScrK?<`FsTX5f102=FD=PQ}{D#k~@>eJZy9<+wL7Ead>hQ z&0na*E(wLt`oozf!N4`7>TT&|+D@Rug4=x%1281TOoh(u8AsV>^Do$;0l zAL%YMg3V`aEN&6!~f)is+AR=15 z5z8}#FYU)TF!QTaLFSG@b8osThAtnr@A3~=vH+9`HJ}(u|1+V~Z!wI8wQITZ{opw| zkB$vIz?eEzT)&e-izVu)$>x8coLG92#^=2kMaMM<)oLA9r$q{(d@xL|x1WoNTMDna zOaxQGBh-e!9b3h)a1;I*i}oY2iT~HxWb?zP8eU~u+Z;ejsY7Mg0SE5xe%#IWe%tP&=5&?>(a!zPZQj?OV_C+1VL!g!#vrgn**;Rxzl2d@MqnX(1~gxtbJM-f^n}h^}0I#(OB&4xFhjer*KCKe>|*i9+tZWu!&UnH`*=92dj-2R|pDT zv7i5F4ftNqNa)wF((fl1??{r--KJ!?0-{^k{A>>v8*>rIUfFl>aoWd#m@84S)ayjPd}M2X|pYhg+1e@*nqBw0VC9tdMz6SI;9Q* zE$B?o?`nwuH&>qikB3kxHCwlnaL;Qam{3(k(x{VI5wsU&GNo zT&wqYk-$%EHO@E(`J`V&H9y<3n3+?K?(#x#=++4x@AjbSxjWwGNLfN7vY64Z6FpuP z6T>J#9~dv9uo)lFCjb;xu3y`MRrs?uuiZDpY4M(uQe+&TfXC8C5kvGV*Kgf}_!tN* zp`d<3r9+;_!(nwETPMeuruT*oikluPLk||!LpKhwik4^ANRwfVw-tjAqOJn&>eF6? zV8EQ}Y)?*mQWTRvQxa^CsLbvE;tEVXJACqpE1tUTa4B%K7iCSEF-esVybGvej$YDS zsS;GrPkLpsNiq)(a1f+Q|E zEA67JNmxc!oC5Gx(>E@~ipkSDtnUZNsmxyT8(b1O>O^A_XD}`;%E=v=HaMF{a>LOX zhT4iV|%N5dl&envd4QryYEKsA7D#ZB8PEOt z_N)=rl4 zp*>8I7KstFbgx4JF@86LjsM>){T ztCyX)_=VNLbNJsq)C+SJ2Y^`?;x6?F*IS%9_LE}y2 z6r|SN*>IOw@vb6nVk z9?0BjafS5bLz@pj}3Y25$;2lUDsaw{w_W^0lwUKgHnqu3W0HFP4 ztc$N!Api3LN8DP=yx>BHDQdl*6=j-Y%IS!Z+KFk@*|Lb5WFa)45O4~e%DcHPXXDMM!)Lb1>$+gEKrfE? zPFci>yYeYWuDvr*>e;&sN!BZ1XQF~mZS3LF<}~*idNj+oB{2h7DA4W;`uL89Fs=(# zCD5#5>cIAD3s<4DpL#>%3hD&+Bg}muc7%z)omPhAo2&19am+$F54Z-3owS}p5i}p! z5|WkK2w8LQxL7y6Y94(F0?%18wjKGjxEB{i#BomZhLP`cfQV&N1+0+YqVI>T}0avv` zJVK5`#t-yt`>tsK|vzayAV?puXAE6yH;MO z0Sg27HmAN);klHQV_mzWz%R(2#ft!~l<6?9YgGLmWqF)vJw)F{i z`U~Xd{`c-Oea4WOF+mn%f2ptRQR&tEMKR?xTHSyNycg66>e(!uf}mV%#(MaPDG3Wf z>eyXJrM6IFzWNyqirKs_r(Xt)(ZN|6D zIY!Ex*X4c~Pd8pYAhP^4x;H&DJan@>852&sinter&ZU`aJ_#JU|6G1B?=r;ujj!hz zsf*TO1D#S+7`pZadIHp&;8jM_&ACgK}Ga35=Qa7j;gBhF3L7L+s{0$T|VB_aDzKJ#Bms0hEx@# z*nz@vtt_5!v~ds6o=>^J7}}3_^ zXU5O&RwKaIaPrxOMWUpSFNd<Wmmp5Z-nau!a;F9^B!)3p?^ zJo)%0Z8!Q-WRP%1qxU=x0B)w03HCF1^TCOij#TpG6gEqtmwx=ZrvMADCkEr07@6cK zYi&WX9-Uj2rKhj73Wf?&Tz}vjr^l<-lRQzkTHS3u@o1flY^B=9mKiIGsz5;zhp_aX#`2oiZ z+liowvfw}P9{=TLzrs8|0A#Z3t7QXi^8eqf_NpN$jb|0iV?FK$_n0(EQ0{y`-NL_P7o$iA^rEySuy(9(u(`?C1Mi zQH{DaN?~nV7Es0pYa0s*PW?n=)b*$0b%oAuT$u7`$2*zE7lhlvp%F!xIP~?F%e&ay zRD4W=6`Mo!v$g?^g>UoMLvGAQ?rf46QmZtOVg~4Z_)MaxnaankPd!>;8!T&czevVz z`Ax9NirFFAlV)w!(*ELN^@i^KV+#bx>--sXa={+vePR%N|GxAklzxs=W3AoT?}_5)c_8eW`@NT~d@ zpt?s0fQ+N-?cd7&~ z8@n~XW~1)fVmylVCwq8_B|-RnZ1vFPf6VAhH_tVkPQ=EtXI9n^ON(BBt(1(ksn2%W zY=TrlQnPBNmXk(dzRZ-E8ei7ReGG<@RWgbR?2ju!1QW+x#{&N*zY6JDmz$KD z-SSGuPD!rvr_kGRJ|TKG`n*xkTJB@g!SKPG87Dd=>bPGGHFX;bri12V;v;*u-P}C+ zm&kF$jNQK)3TNsf3=u1E^ktKyQ{Kq+Jr2`QQE0@sgn!z{jpzjHpU-v7F??hlPhjF> zQg~F`(Nk)0@JO@u@^S7BHfV77^M|E!J+jIzo#o0c`IH+>Z{_3~N-|4I87XSJbN)6q z2^R>4pv7$@l|~82$#f4zNl%OJ7H%eOb0EFI^8Vb`M7zgk6n9LUn$Tw)y0HscvizAJ zgX35{DHW_3*3`27WrV9(W2n(~(mLf7dK)W}@&nTM0jiIQ_-NN=>&|VBD`hStR&Uu~ zU4(u#)0D5c39>UNowxZS<8M4j4_0}lV#+5qk`gvCYHVI@u`um;T4p>PZ+iD|Rt(jS zG{rtQ?|&74=ge}EujVT5(9_pmoNG6Is)GCTSduktc8xUn3WRbToq(x0-bu`*z`;_QZ9m@Gw#d?AK z5RKUd8yD>#=_V% zF#Y5qVbomSUN}Uu!ei<7BXL7%4XsvhSk^=Dn?uXIJ#I`Md5C(U6`w)tbRf5E^>E+v z+(PSaR;cr5KMQ^Mptssbbb@!t> zXsv{`7u{o7y+X`4LHI@n@$GlH<$V(P`TC1PxLYoiDe7u_)hqs{%CUe_!tFi5*er$G z@hy2vYq^}3D%n!CQY8DY#(DG6)lI4BRprN$0j`AuYe9`}*ISIqTDQ#(v2lGSXC0L9 z4ma(OOzz3tm)3TG_~IX7sxML{^Un5sW_Y;FJCy(s`iDDsRydOw)` z)IYrLircuhA;BbF`Fw9YhWT*8=kL>rJMv*Z6r(eS+*`0(S=8>eZ!G_TEs5tN$=pt* z#fTtj5cFMd%+8B2TU9{KVMRdP7nz`o@}oM=cYtZhoe0}I7zJ&FbD^?1j_Lcxnrsq$a_VDdM(D+y2H#H9RP&7M5d z0}2&1L=Z9g`lGYPyTEd|Fl1Jg{FoR}9!Iq55)$xcSNKp&Cqgz`e_GcC06l!=v8>a< zYIhsc;g4gzR+`i1Izr;Av$-&s#4!TUZ~>0Xar;54+@N`r5Dxp2w@l63W7>LW#}CofDM z%HrCcc}p%(ukGvw;%s4|4Z<)%0!}p)njQGU8<6S>%-puMClP-~ z;;yq)sf4a_*RW>O`7qh!@9=77WH=N<|3KYdsE5B=N)A~;s1f{zTc?7C`t^Vr?ikbv zCjrSWb#q_+#K|du)Y@~Alvp**Iqc1F-RyA4;UHb9T$!X`ug?pG);KD~Q1cFQPB0NP zcHR&@)Ho7-PWMqXIV8wshUnD6QYcs2%>%>%R$Ud`haUw%12C)Jjj7f;=2wv4aIPcc zl&ls2GWiCRI7f|}7CoA@-k(1jEjACXvsd@^hQf+dlO&dDj~4cU=y8!41Q7*t=w5mS zjYL@ppRk^h2{W43_sqoHi@s~RvZP)F5 z{uIqPi=jdX$kRWNNNi)}ZB#%jp9!Pz9&TVIGYy5pxsqGCznO4VC=l0XTLfUqvb3zc zA2Vv;*OHDX=qBhAu3TEkL)TbV7EHWgGA(e+5IujTwu~tQ@^16ZRoSm%-}&7aTBGev zVvJFJRv)bN65e_JXz!+FP=n2=w$p>w6#W5{PQQO+aVFNIREH{i@>Y~PosRMznaxgk zU&n|)Y3djEIMk6MGeGS`ba&dPcrX)s;otWP6MuYwWZqUCL$p7TWkD#ks^tp!dq@?Y z1HUp22vvU-@n)5@yP|J-)MldOhqSoQV8`a3WwOIS{YU-~>A4lCx3SE17?JSGSG>(? zz7f^l7n-$+v1{k<3oo7G{Mkiqel6+QmE4z2&eIRg%`zcpgGXr#d?hcZp|;mkUa@^I zv$71RJ(OrYI--ZPDoPsnCD5D0Ww5rh?-bK*8NN>UR(9xYnN@^%#|j_yk2C z>dLzG<+}Ut-0^o5<$@&IG&7rrKalqn%-(Hoqw_$;|Kju>=Jm?UX~m+cL+xN#Abudp zH|~yims_#xNv@ft2y^YJ`5nZeKbO-(NH#Fn=@xkXP8QL2g{_y>lDbEhV`(0YL+6mgC7|8t+FN}dY@wGHH(NV_U$vt%a?Cs1^t&v~=7sSU z^Ja|iY=^(;qoNv-1KlToyP8+%_tLpyl7N&eZGWm>sfBT1&mUlH2 zF;7E2NHm0{5^qJb`LZ=OTYp_B3fUm*=R3u~lX)5q!<*3NIZU_Z>+gcFuv_QNNBt{O zeEC*CNAUQ0uH8-hiB_$d=h2*M5s)6tSX9fdB)%lCnrOLlzA|`DwDCK?b4QZPhuL%g zZWaS_UXF>OV~)x+nY-5ziY@@TLv!`*}DIdT90|Kk<%Jh@gWYPoSW>pmxg zyDgGr$fZ?DC0mYmg^dMJ(@9=+av<&@y$hu2YG^ENG*?g7Ibwk#otHfjFh4jwy+Gc1 zyC6g8i=KJQ_;aLOY*7js645405;#dmQnsv+t&LPLqWOQc0P-^-Wdz920+s?qv8FKw z^X8P`hxCwpt`eDf;Q0}e!*#()7(^!%Zhx{l{P55@G5=YiEi#23HPGg3=K`Jdhxu}P z?sg#Si_#WC=^PJDTbObv$v7OCmFhe367SQyrJxY>yM@gboQ6Pth{!4)IGUEycw!>m zJ4hL%q$G!dNy){!Pggk(H@h8;1D5ffD%z!h2YS;;eeWvzf%YT%-?U`Mf>GIF6LwK*g9 z^cpPs{Xg)zqU6s^7htIM@5yFK9sB9eDoVl1eVMIO;-4P?ukqUlG1(- zy!o~dn3#1&3?6=|=y<}j!f52X7h^T#rSR@&Y&7;N?`d0Gs~mBY%%dHJ0&>4N z6gANc%UrXcTw``%^SN|+(+Z0zJ!URumh;AIhU9lObZeq#9op_1Yk<%q%l>dTy7tjr z$K^wA0<-9YcB7QkbTC`M%i6dGfKqKxK{+;qk6oNWO}>W$XrB3=E;SPDx3y6J&8H!; zFvnqb=`Lp-y`z(6@)v;L{xgRWSkMHGz81Up4vZcv$zA7$o%C+edUF}oLIZJ3CG+aSY2A)<Ps1s(5T5XL`dChW9l!kB-2*9 zxxdVek7dw5#wDuYpY7fbLl17Y@sIIgvOK4&=oV^u^LMtl$C}QX)I81V)956V5-S*f zj0BCscwvkASBF(Z4WQVkh#rGhDdWncE1!zhD`DAV;+VF~8r+ZF`SRcdx-MoDFqCLR z`RL#QW%ih{PuxzYz;wC(7T?WB(Iqcb(g{tQ?W?TgIs&xosuEuJQ~XE4(BC%^t?rQM z1(t&HaD?8YfCqVB0uy(>VJ?D~FDNQdZnJ{uF6R<=nhvfIj`RmG0GIjYJw2g&_zc#tcx}V2G3K{{?#e z2h#k{KdgiUpyOj63~kc+0nu#BeLRq1ORU5@B&9&epKHrU#LJM1ZM3VsmfPHi(}}wz z`&rM{&(t@;hF1l(=m6wbaYs`dURt}#Sq#M5b{z|XYI60NwFBe%uCL=eC%3acw(mGn59CL)$bKxo{kU;E!kDry0M5tN zkH5q?MR{nbmjz>eHfvmPxU2yZuc{rDk&^E~)2(xBDNSrBn4$+jhMaS!(;Axj+uIU# zKHi2p^6avjk;7%^f#~55M#71t)8Eyfd*nTV@Vq|5DCfFc?>ePDeI~B?`ue8}@`dJy zC;r}p2+?((jA%Ur_1ACc1zPKD5l#3UA6U!iXadcc*!-aLSF~TX$(QQ+Btx*$q4$p)Z zfvMv2Ks75SXG+^atxijhTtM6mQw_%TZBcx-2KUR%oayx#q7SdF%IGHBrySh%2|%HNiLE@ z>XZO2%j4Ycn@?AA7O%W95QKGo_{=F_rMAxJVP)O2NKcG=1W|iUA7rzWB`DB8m@ux+ zcDOb8zB6_Kw03{dq05+4>a9MO4!WxvOr(T(0@nuB#BC(qd!gqZZYjq zDAb)^f3Oz4^yk?MVSA>(3J%x;KtGmU0slBNZFo6xsu7b|ZM@Y!r5%vdG{xS% z(F0$YB-}cGt_tq~Z}cA&bzq*|A_nIX{n;mu0Zg=J;4`QwT;sdMdi&8WE$x!c^U$fg zz6#@AP!()qi-fE4=*0~^8G#!l=fU(+(W#%#J$`taSbM+{4eH$F8*F#^y7$JdkOrtk zj}MTWp^Uwo8s?%M%sEz&UAy)0BYFlI@jH1Gm_M}YDxd&uQwXSSsP_vT6%(%-b{ZNB zX%zyWFfNlORrV*C+^W$6TnyNik0fHzI1ZO{yQiNdkw-cX~zt0UI zCQuF8dOw#r(nQ6d!%2E5NxFQ4>_gSF%3#ftR2myUBQ|*!$f7J+aO?>^#0wMs23w!t z1hd4xE$QMS(a#Br&IMG%0_b4N8-bTujBRm)C^gW+F~}d?ya6~mdz9U{1wpV1)j(Av zI!!0D8$79jZ%xq)678=raW!0Z1lv!TPF}p1pC;@ZO8ojWeO|HJo`~EN>W9FCq9Wh3 z%NB*cW!u+M4nZ2yRGrq1%+=*Efj+`FTW=D6w{9Pfk)GHvLVQ$OvP^|xCh()ozF%Q+ zJOzsyu%TA>3emIP*MTmI>3V>gte>JCM|u(Ooz^Da*^u&>(o{hneOXKCujqI7r(oMT zFmPZ@biTBlvMviG;8dZ^>g0pKllx&T9jaDdFERt7|5+E!jx1AN^>D7H%Q_-^{l!zx zHs1mJ3IBu~^PyhS{ZrV3IdBwQ6UTk}vm3w&1>8XUPTk(Y+XtDC=@s=GJ0%mhWlph8 za|&TTxJAtE`OwCkb<7NG4fu z89>Rb1t?2N_+*hLZ%b|G1ZQ-&YNuNO{m~=4rVnlo)gbk+EJc>_m>#;z52E0yX#nOB zi{;><Iw_~(f5{A5W@s&yiwvf-Jb~IHF=EZ$TvsU##tGTq~V;D{q>Qd!>bg@nW1E^ zG<&C4i*OnUejaHU_`t~#{@|7N>$}jW2eV2ofaL;P7aTwB2Y+=vJ5{uIMXLvlHi(C% zh*NZ>U|7!>-c(fhZeY*1RA58}XEP0bJ(!zmcxsTuV36Rb&PPOV-=N;eU1xJBxC70C z2bAyvt|gujtBV(`EQr!AbI=wGrb73>{4}=jreR+7aZ~Z+&~ko(Zj5}!Zn~x4Xo)85 z9YKhYk{*3{?2uylrc0pZP3zV89=BC*t7w1oB^%f*&eH%P5HA^`rh9*V<-StFv~;Lg{=W zukTCv#9@SuacPQ{Qa}(dg6D4d5J7;h1x773yjrc84eA_E_aSXs3@bxDlECk@=o^=W zhe0Pa$0j3EdDoMFC4g8MfxP9SvDMv*S|Y@J|Jhg93S&T|*7nl}(yjJOz1ky1Ffah4 zAo)+&7vJG;fplI=BV@3hs%PNnW$7$S>-x_ZUEU>0%Y*&G~Wj*%6@ zIKT0@Bwe`QruBpeTx;UTkat|qgAfcqjU<&yiBHz8A=iHpnLOv=SqQUqz0gKYu;H~= z?#LUFP*kVXPP$*_hZwrP+VkGl>2i{Y5To}Ye?R$X`7mE2`L?&rx7VdKB^=L^QWKuc zoAQ^?mz*jBR`%)jqZaE25rQyi6%=D1P5&32?>)&*&_|*->;vELcA|?)$x>#?uAV;9 zlk|9BU2)>*?>MiM^K=Za9G-Q2a;Fk6IcT8WEhY~RY;sd%N@>#bHLZK&(K8yVQx-=w zuVCQY`ITU+VeDw@n}+p1D~Z}lSY#^p7AYoKriV604egII$0+_cjwpgX*%R+K633X@ zoUGDH10AEbSr`fHTn@80lX5*&o5jM7eBCNs1E3=k!7oJUmr-VaENC3mU%j48{WIPB^@=30+noYyX#5Ct zQ0G8Ku5QM0@u~=D#&^2Sq2i!IBo+(@_z0kK&6)wp@Q5>5oUXqUKM>ap(>F>D3XOZHin4^7#Q$Hgyno|PfffPzyiVa< zqyDak)6wxtNQD^R?uErSCDMzvAYvOZ#|=5Y&D}qb&yKyB`Icw2pE${P&j{zJtQh2boy=@nZUG zSEz+zHn{|iZ2d{|4Okz@bDa-o)!-k)HN4J6+89cH@69P>Y`=v}Ovn<{*iK&1b(K+d z{^K?OPXJH_=(Sy?=c@Tfho(dvOjVtb+(;yXa9k!|M=bN7ajCChge=v-)iB92^uH`v z;w=o5W*tbSMDtlRpx*V$!X*K3`+qSd34;Y{%x1d=2c=Ip2WbQa1y4u$pA7SEY%Bh; z{=g5rNdkcS>i7i=U6;gkZb0-u?)Ep1SA0AHA~JGxULLI+YQOcr8xTkuv{Kvv5QmuwKQ>vB;0lq7I&$R^}NLYn{dTRZFSaEN?!!Y4qlgH_!nxG z*K34(K%>6^&W}LytNuUbpjqrMeJQzYw?a42!anThTee`(mDnVKKR}A^&tE z;Q$eXDPbmbOh4>goP0 z{7V8+7(uPY;&~DyAvu2|MgnH zE=2(zfnn%bm)c)zE#N`}+<^U8 zZ=g>_&8@tNORp@zeQriETk&cA=HJn7uMg6|j``sFrJnh()&EWVe2@kw`TS+xU-w}k zzzi_+MeW&g>()diiTVskv$pf5w-*NO8$63B?0`|J$CVc*%b7tNCj*U37z~}HuA5R3$y|KPM)=--@kc2P&%Vtg%};~OGT~;BAusz z9Y0NG4BH(1H0f7qljG8Ja_$YF@&fRDf+lKn#AH5e?T%4REX_B#g#j~oVEa%EE)00` z*g{PRl+S(2mtLvA9yb7ZtuO&=To>~C?k{uoDteY?Dsq3Uclkfd;e{g7mLe2NJe~RJ zGUk)b_9f}=uRHBdSjsetmyz8C%e8%D(79dwX{B~(;>)sXR3Cp)x6a<$xH&4F)s z$EJgizUI)i+(*_(ayBq>O^;pGBDuP#sFRe>pwqL1qY#N=#Go_&M}b^So<4hVUHPN=vPI~ za^qwEx_83jWHtFrMEQQ|eYMfT=oC|S;y*6SEN%%g$7Mih-L;WYP=4E8glOOG zJYOykbGbjF1_aPY*t!_MZ!tm)z4m2bnf^I*9Vr#8iQ0@|=7vve4nde|>EhHy7EQv} zz(F~Xi{cUS(6v^vcH^fvu)`;r7pAWvwi+f$Z<#tp8IvC}u#w_2J7>MV!ekT6q4k#? z9}oO(EmEzaw?U8gxx>@nH=>aM&ZWlblHJz`12?sR|ge`E6tb(X-74R#7y)OSp9V`<3md6g-7ZXv?oKJ za@q}Xvx4Ses4Qq)XDt82uLJe=tv%Bpj{g~}M1jYWh@Si7qY*v?M+{CHHp#wCrv9uq zz4~v*n#x{{^3Y^1pCp>akY+0Xq#5~WBvj||#kxJAN|mN$CL*HzX|{8BJ=aFSD+1Sp zxLc#iE~*e9z37aruw8Cf32JnZuwCh6Lh(kT%Y7ltr1+`SxId1yw|FqE5xOd`rvy{_ zXxYiQ8Ycc3Q|gW1LKLkDZon3do6lw`M4Kx`lufTOziTjlR-sRo4F*TK+^P-^YG#te zONqiVDak!MM>)-{i{tF-ixn{O=B~ks>~Hf_$aO>4bd$@_iNMHcE0Zu$c3#_mN*}If zSrr~$k;9h%*x7lN_%M9&W%poS)j9bhG5brYR3urS8wcDS0j2~7f^iA~C(W%fOLaxt zFt_M5V0HE>-HN?$KxWlSBg#)CZi8ane`rTB#53*6mB`-bP(` zvQNS;ZunM8sX9q5>L1@Nxe?DESM`lBJc=r^9f2^6%R&qe-5Z;9;K-eK3qprk)Ek<7 zUyxOitCTbIo1nwu26foW%4!PtZSEjEokSyJQuMEbT)uW|c=GD;&I>gR=7D7s?2OKZ zL^Bm)il^RKXqxZUu9}}h&3iT$>6Z)QqA1BvwE7O^mo+m+J~%&i&#e~mJZpFwXrQ9M zs=r%m>0qlfl(fI*wwP3FHi|G#cYj38-M5Xek$oVa5|??Dk=E6bO7RS&<*gmqzdZ;P z0S_2)2T}wd^6%qrjBp!|;L!v0|HdO@T*PexLoZYc&fA9Gljf3Z zmibOi7FXLA@OmDXUmo}CDb>Bc_jdRr|NB&V5H6G~aUhy^nW*Rx{K-)Wv?+E)2%ew= z=a6&!g&N{DaC(fl%m{a**0bsm%Zz|c>_+vI&|up5yyVYca30q3TCmOiluXA(}rPCtUfq zX(&JARrjqgieQ9SnT^SSMxGdUJ>B*1dC_llh+k77x}I#uQVKXoy?7B(X*tb*@F0W* zhTsFdSR?jtYytIwSc3_1+tUsH35HeLyp9^1K`34l!JL>xtRIju`Hj($aUk4Nlht9E zYmpT10*-w#+AUk(c5rV^xQSL5PG^>DIhsM~Wk{;?5zE@D?Oj!L>zL`YZ3;9I4dC*( z!NB7)+uM=)xY*M>FlER(qC9C`2nXYqE4TEVAwo?^kC~!Uk-WxqYN3v4;lb?UdaXtS zKY?bRZ#H%q4k=b%{@0Z>*83 z21N&DXJkWQ@y=k;>$n73)WPl{JvJq8tQN1vks?po{xk2MSJy)b40fj15YcvLPRNUNjT;%)W8TlZg5H=d-0vRw;AkCTcYqL}8Ys=Z`&!s^#UnA&0O{D2_kO{X;ZN?*2Q$X_ z;q?UOpNRb*+D;JgE7%H=^4Gi&F6}zor&pn56cj0!xJttd$yUvgYu|EM_Bt!ye$!rG zTOTbL$(AJiV0Ngs_%FaAO9POEAda$~pB$0m$`Q8N2IVH2zbTi*Ox z5yh@2?7Wg_qGW`AERFc~c7MU6wn4E!5a$^(7<}c0j)Yf_ztTQ7q!q+50AnLaRy<9V z^&X~C95c$YOLxUl3u^7mXV64lMe-dIeG~JGoO9g*`lwaHC9AJWJX`F*)RdZfj5c%0 z^O-sU9r`2acWdsVOZN(jX-^pp9x9jO;HSz_>aMkB&u>i2@)vsC4LkBZjfajq@&_e` z9O5YW7TX(YWdk{#)N7DmKH*Ia?2lBcG%l^&nBf)U;{xx?=pe~+Ih_@4bP7%Q8=shZ zO0?uq?}+n;3ZEY-CX&c+m*9mg2)duK@sJd{tj&HDMk;1L%OeIO=pde+H^!Cn8Y-Ba zn+KB(!p~oa=oDe+yU1WPY27SM4_~7c2p0CNO0!4M&QbA_)!bL0WXfWyRPT#zo z?5IIENlVOJL|;9ltR<|~3xbqqF#*OSkq<;U+jz@ zDdgZ5sbCnP;%u2VJgGBIDRA!MllTasMWA~9=h^@#FW|AMyfzmg0J@GhI#;|u2pgt5 zne}XuW$6hCBfV>=u7?SDxTzW85!X$`4#h_~Do-&v3$1&A?Y`QXY3ge7-sEySwWh5! zXWPIO+-HPWLJa4cmwhn^>6n>i-V?Fh#}m0Ml^h#rD@TQY4knQeCT0Z;0bfo$U=lRy zY_lt^(szZ6DmrgH# zlC3ALvh-jIAN{^&iV@1XSjyL5&1Agw z62-CQ#F6p%yThqVxaNEjB(XnL(nk=3p>Iyp_4eh4PpA6%&=tHn=%3#vh7g0so9hdu ziq~@Ycr3M}46!dQU6y0jjJv}q_xJnR8y<84h@@i@arOJ{i!u{hKMl-yLK=*N-vxiU zkUpe#n|3?9FRHXyx2p@96?H!8mH~PHvSz1!o$X$drZix8=t{lP=c5#r^M5e0)Y)pa zv_+;Y8(zi+FKqH{aOXW3-Oy+-ooaTM^hl`{wSUXf>Gi_6?NB9uAX37Qx$>aw*Vtp* z?e9-}QyJn9J^T0sp4NH|oY~Z^7d7M4WWUE}{>;5KUaMDKG+9vYDl#$He%N*N27Zc^ zr*TnFpjlQsF-FaRn;!WJi#xw#&^<}odj1r`ZjA;1MfVVk^9S2B8`^a!mY5OyCFYb8 z@n9fm(}GCoJ)Zg(1A<@g6eTJHCIncu*l(!ba!tFt)_cdtaUehx+?b8#XU`nVo3c8w zT(-iIY&XX_>ui_b-(}NQXI3p_1lw6<4q5li#)^BZEhd#47Q4d>%7RJQ+2oSBiOjdM z!MN9-wKka)!fxtcNQ`2cjCk*Io99kURtJTK5(UB{^3_V%04t`d0(~@I{wlbyK(D3w z^z>A{&p;sDxlQq-m=CJ=B7p7r7Lhbhk=-`^Xj^^w3US^Jr3rC)Ub|I^y!-W{H<@Q< z8Q*FIP&JydbsI(<{y4S=D{=+frJwli*VUJQ3XC_qH_Ta`W=e*GWq^9UQS{le@wI6C zMqMF_t6*#=A%lGGK}LUHEK5%9nvtW`-u-jQ2DAHE1skXvB5u!XKVW$=MPMEIow>93E8f+a@ScKrcb>O;_fPhK4lq=ZhvJq zp=v+L>9N{|kCdm^;<0{`ojGV@v8mxGP846Hqx>;+V`cdGo9%k*Qw;RuNU(cD>dfUc z4qB9XSbao{wrlN7N61Y_xSrw_2^%FNJqwC#PVw!LYHpU&b4v$)B*@%&e`vd+T#R;!aU)PN}ry&HD`O58C|}Q)bXT@ZRiR%6#INN zI`L)M<)+;aYkyQtFRz2!VxmXrWGXYbmL7hWkOPawbgY=ws5>lH(0PA+i|79RXS(i3 zDo0Iy8uR|sVIj{kIVmCy{unlz^$@Wa%#iji>w}0;2)xro#E!?}H2_RK`p>DW1x8+IF#PrZ{tb_(8((@^N(y_DNVC0H5z6amWjJlgNq~o%B*GM+vK@ z3Y~j9)g9$~C7#L+-ywz+6NL8*ZpQP^9UYqT%gKc+dl0vouF^L3Yr0eYyjRDTuHNxgJ+CPquirG+v)?*j`^c z7r0TxFe-}AcwB5D<30J>g4+*ABZZhJ5K`p|pDjf*Z#3*QM-LA>DPEYQyMLmprokhg zjlM6(#iMfJgN7FeM?%wF#v|nr#n39`qNFI)tm+dBGW$u%|1N@@$5Q<T;8VEmR+bc}{WM)&g5bHxjg1%gZ?^9e(}4;qz|D6?AFg{#hLotdi;jiv`h zmG&TIuxqJ#$*f|Zmquf}&Q z@2}Cuox3o&9#f3u?w~ViiDU$?u$R131(Wg!o!3%)se>9$K1>=;y7g!gC{@()$!^Uy z6S0tA^N8VEN;y%z$Z*S)ADL@2zz{E_`_nNa!S`V>Xg8Ab0*-_oD8? z+lkEgg^5S(`q~>;kG3k%r5djEY~ILm4cRWm*)!;Ot3>GpH(0Rjnrsr0qI-bN96J?|3$6EFIO{ zK+iJU>|(7mHA+ku^jft%E(~9Kdq5q;sUy`sE_c9f3=@!J&AB)%TfTl_t+Tsd7@b-W z#yryznywZoXinJ49xd5fm+nA5@xpXkt*iPyf7gz}<)pW-C(HTaTITVY7~(d~9ZuBd zV6j@w8cQALou(5y$L%TAX$h|&en^~nDV%@MpQ~*BR|^sV&WZ+9zthev3B+D}!@1D7 z7Gf(ETr3%11O{x{B|mxVCNFeae&#Og97YEFWaY0<^UD2B@6aG;ZTo0483a0i$hI5n z?=@Ogjw^y7C8DdrONpfLghx~Xai*gDX%7M4x5y0b30OiAd|~vE6CbU;y!Ej}4xobL zK-R(R+jXZyS|UI}%-MXC_3SM8DPjhec+;U%ZI$Jx>X*W)C4J&7aU9y5>*}#zQtP$Z zZdQ4t$izb)8m!_3MAwRp%zG%+)*g|Ysz%!!z#ocZA6%OLD1qKmP)VP?*F1au>}+_# zK|M^o;|~%UP(b(qEbjF(r1vyBAJEa!J*g9bb_o$!w$e895>P!5D@8aFvup3jfl2r? z@?b5+11@8Z5#a>AmbTRoktWa&i{yPtNl9IvsN3#JvX$mOzr$uO@?GnO@g~uk;dxloG@6R2 ziY+zYi3-(zCL5w`cyK;%+fhtJU!!(8J8Dh;W~PBGpI++Rz)9agk2YqF@~D-x81ZTU zO1yf<(cErWh3&?Q#l5o@G{Q=`xBftDK0SN-8KN8#Q7~_?K&UR|(oE@@DggEho!Gu^ z{wiCn7uFzx=otKwXkF@im8|W%e%nRe4vVTwZiVppk3<_98N=e(sTgV@;u)jM`*|I< zE}m0Z@6IO%j40xniqa zY+s%(1hX#zK$b5X*g+us8s=ZD)?$Q$!T5_d0EZ{GLtrp>Gha?ddI(?c9Z^9M%h*i1 zh-G|L#YwKm+z;>T9kQFNiu2m1G2cz~<>0)XDU}e3)p@d#k=iWVeXnS23YLhp^TN!# zToi8x-hSIbGybZUtU~-m8VrskniXYV)~?tnF=7_U(uCbRlxJCVOVaAvGJ`$KV@6p% zZJB2#lqVMZe7Q7{&3I&|mFfJ}dCu<{0l8g2q^h$BkLbh#`{lv|-l<2wlsJn!ZiKN& zx4z0V@R~n&wn*f6+g<)->R$icio~O?cOk_m{cVL^SaD_zwZ~~jYv>($l#T$rv7b{> zUX$o^=Pp}SW8Y6`Yl|B%wi}4MIe9%Z%)#nZnOr!RWbwU0d5~I|NSFP2-Z|k*=$wZV zHUTu)v=kV=sH5v~(JpdDH!q%tzDi0Zlkq2xd&X+U>=-8CKfThW((r0$@RUbr6N7Uw zr4bs8GmlPyOjy*w9RUdUT%$u9r&($E#nT@ul7G+Y zpp)s477+a)D}n&(^XC&7eV|-t1F9I8R{PYybV2zG<)Gv79og~k^5;pi z1NcaG2}d32wnu&Tk5jo%cw!b{e%Q%<4dw1v!eTunsf?Y&bhZDor%fNFk%46^yTHccEXMO-d zPpjbh$&MA1T|5M7QA{w3MQuvLHIPErX&&YA;KLz7S|OLi(vY_^aOkV=xr)qK&nfGI z6DDiT^d8DS4}|kr%jL|5}U$oWjV22x6EWTX0SGr8Ld21pw;t6Y~&Bq$b5u1;!I0zM&KacG+yc^v8HeJ}MD zR>t!`Da48;RyC@Co`W%gBJnCqbdvEsSRGmq&DssY+u9LUgBD?T>UQUJK zFpYbp@;arPF^!z==$B^D*k`p}e*>uY!wkW9^uW~H3|#d;||yG<=2HOd-K zk0{u1AW4t!mM%koi-$^Vn_OnES7g^&*u|9(gb5OzGDE_E?xg=+VL^}MT2KR3sx8c8 zH!R(R*N`p_fIp;J)4X=q4>;Q_1L?J5ext2>!zB$;*EAmERWd-)H%E5R=Jhil&lh%2 zKO}LIC5Jz(+2iG>#%Aq7isr0N6!uH&7N_M<652$-eu%Y7iwitUdDx!pwzo+$ibp{+ zcQ=DjJl<{pmmB@})&zIS$0Sy>r|CsSvUt7T(&Q@kk_%`+s78;TcHa17KxPwx6LrO6 zDAcHTsi@qeO_;V&TG-jt@Un%{#bbrFwj&$)BdhPd^_yo{c4g-p*Vc0sRdFs`{Y+>S z1(@7ur#0J$Yu}i8m<+pvi}h2E09r+PQcYjQoWk!7HTjZpAukvnwrDW} zc3-ROpf6c6NGt-O23O~`LLi*qMQ2>HJ@mtr|1U&uf>a1WhiahBXUNkBDP@|_kHZ-D z5bvexJrSid=4a>x(GVn_l$Fcc0UA1lpKcxQjW_D94N?CG+gU(tQj`Ut0-P4EXPTN!p zV<*Rd7sz|%pw}{YN|}4q&WAglNFDp4@*|^C?bE*V)9{T{Z+Q*x2AgfOU&(Hut%Xgj z@8zo&neseApW>UlzGD->*Xa++q3T9bQh}p~bJlPUrg55>_f0W??0W4;pq|*V*OAf; zc0MO^8u|Ch;E9Li_9Sx^?>v8;{%o3Ada|wR%Qt(|SxWJc3)JrsuC6XCGswit(lCEL zI1QKGJB2!r<;H~1gkip2v2^WKRf_NRpLq|b&>reR1O&~@OTL9YP zzRT#4t=iqDlsPS7I;%tNG#;c}|L*PDSc%@p=_Ef=Yagf6X;sxDc5-<(2nQ6VEfp+0 zTGVHwPi)9*x0RU6L`7zo9>eJ?y@D*6pf__R`>IW+eUsRL*ii6N*9;?%Z0Fbqb)~NH z*o-~6b+P2;ik8JA%#P9dda{^6y=MXg<78Zz?2#Ij0Pck$et*)K*bw{P*fSYb-0Gr* zU0yzM?05SoDMID%WVD?UNm^R;E`9bj&;1v1Qye3xu1bqAC5@RXD||f19JbzTT?FFO zPVGad1~~?35IXjFf6z1zdn?ykzBTYC4*qnP$d8nX{?B30b1=j~bk4c@-Jv+21(FCg ze!+2NKA~T0V!mbL5Q8Vq!x$3bp%$IXQW{4WuR-D6U@)!~(PO08)u@BXAQAIIG4I*E zx8q#%)ctSX?f>EfgrF*m81g=>54}iPoNQL@8*>PHUj(EYd5}c%I6b7F!=0v4sw3`k zmO9ghNZ?+;7Jnv=FHv=#Qs{_Mi?e-$70SHDos@uSEj*3KEGpH3%EkBc2N5tqiJeW% zZ(m~_8Z$8O?*A%pe(-C*^>L}(#7`u7C}pVK1|#fUU$Gq8((Vigy(K3W1&}Tb&udY9 z=}4LVhCaJsV*O*SaNZiR4Sgk_FhzcQLuq!wZKP0#(q7)4@4u^P=P(e#{(;uBJ2d`) zfeH!?d|~z0Xl4R#xI5RzWj!a_ucY6LM}m@-Ara7bbuw$kBx`E2&>6&KGDsmtito#6 z(}jVzO$Nv!Rh>yfzYqGLGS>%3y0GpU#-qJ0XX&?b&&xRpx&cZn)p6IpFOeNTH+fuK2@Mzcfu2KToOviqc0e;F_`5?y4)8Vt=r^6 zKT)L-_;ovye`NT+IVzcgi%UidUhoTVbaYztXpPIcfhsgOf-kC+)!>d9X^e5j`pD*k zZy&Af3#TBu)ZB>Du0!dKBLKmR+AQo*fo*%@JE8OxKkmk zR&}nawM=`9)pNQCO=M`7(_$!(G2m`Z(a{-aT{c+zPpBM2{vS=o?j3lRFX=>3TlbKb zQ0~c5_>Ix>h+jdu@sC*o%H=w1y08fChwVz*+}g~x_vXdCG115-Q^NB32Lc{`eq|&F zi9JO*m1@59h_j}}CBKJK8)Q8S@$C#vf9bcyVOKtO90u#Db=%9g?G{Z4ck{RIOe9ay z4~<~V)yjS2u^eJha#NUsW`jFOJM|PAXz+)Q4NMHHygvt~h0lvXbde3=og*K_e2{N8 zDnUteISRfAiUxY?V4Vx6QDie_ap%v>;9vE*t{qW$@HhL653(e}+_-}`^y{Ct9SNc}adW(JU!|xa` z-B3MpOkBT61HBiG-64@W^eg8o7`S;4DD^H!G9VJcG~%Y*@hcKDGOY_BXW{ak(vQ_^ z>3)&-{egU^A2xsmPLZzEWU(K%VoZ|r8Z}e>r9!K13`@!JNtVXO2!%TphEH2UT0g$Z z+9(j=Wp-floT|0)H(F!uO&4hqJo^4J=omO@Ud&$3tuI8jZzk`FNrl69x&=Icg;ha1 zewrx+(?Dhx&#da#EeoqPhm{*ta^JZZ!?T}baZ*&_Ogie`4_D7$PoCzkOz0d@BoMF~ z*hrpx3IiiKBm#uQWDIrgs|CWFAs^9O@JfGV=sBw3+ZXFL!l;EPNCbeT9#1Erk3t}Y3d#`+2Co`CuIi-^i1b>8ek%cbn31Ch3-^|f+>=hcjRH|_hLe(Vxj&IT2(`oPHtGIOe%7X8W2y<&G(BPsao=yEVN z{-oR^MEz;z-UFnupYDFF@w3J%UDNDK(&KFTRQ~lg!@(4r_JcB`?tHFVgH|GmoTH7g z{(_R`d|U>(Bsz4G1@jTull31(EP!oy%)fVC+^HS8d*?3kRQ21>?}>;xJ8Nb=Se#x` z_JY_xJpAHpyJ5#XAZ7sC*_wO>O6<|Ct)htnJlpe`&KdlNnENBapgD)n?lh|K@>Tri z>^sZ=)javh@{zS5SL{`3Gm<+xOxfZgfB@<-qQ1w5P4yg@js9ELnRZGyqT)A(}H%2GLL=md9+Qk>XyNEeG%CBPW5#Y{wkSbfe-%utSgB) zL)K14vs%qZYt$zKpOxNhjuRRt_)+?a7s&RKg-!E(jkmgPSIU3Z&Oy3j6V-rcl3t)z zk{_=QHpwNvu>)v(_SZ^Z+vn=GLr2v-v!9VjKER+{x8$7N>nNt}RSE3kPM6BgY|qS% zy*Xf-f%CarYZCEG8zjU9^oK6ldCHc`N?T?IXcMD5>N5^OKf3)TB)`PHirH<`{@_O{ z=c*j3ie#1q4zAzC^vMOp=dTClE2TFD3P*pj$Js;P;%FQ^TK0X-v;p74HaJ5AVK^Za&#K&QbMuMI}y)qqBD40|A24=OwFHh#!$wVcejB4SzDP1M^LGy?8{8OsnWknP?1 zX2p>4@#arv_6i{Xk9(4i<~px7U`e+o9hfnssJtY{S9jwLhTbSUT-iT2k*&$V$^PN~ z>OuEPDp(ToUJX4;Qsg;l(lhLdmNf$(AIL*2CpWt@sim4-rl$9T_yh4SY#4QpC< z&%_wUZpdyhh)9(l9&{h~d<;)hK7(k9zRQRPKYCzwHGbhd*JNxYBI zDDyvA&$sXQ(1!Dl`o~H^>yRyH8uQveSWHw(V<_!eagF3EW*Xm?t^jR|Ui=vxB8Hj` zfQ#svm@PFm}vh#_SD5T77q z(N=rdGhvCquPKnq7Hqm&MQAQQs~16)nTMqcU8d5<4K|2B6Xcc#W4IvZNn5!= zkCfKqMQRN`_xSad*fpWglVj&?n^m%kGG1Po7HDH}&!!jjyhg;aW19FE#ejqyt0AuP zC|sg^?jUsi)NiL=TGU#*M^#7?omcmK4~}dg`GAtHJemg9<*4=Q>e79oN2T*?>1$Q= zs{O@W-pJn88cmruMKoba8vC>~G{_%?=+Lh;tDiGwl_{^_V$@1OLE#E=jN0M~t#vw? zb_^~3X(N&h8T^Qih*KMy@jxL>kS*-)Sjc}nF92smaf`f226ZC+9;%W%#5u;$c1<_f zL{6{s6x>%a?QRKLs=H^Gbtp4u=;S-ajm+OG=iF#3E$Y#-#BJpMkKg-Cs@cPVtPQyL zwnhi%1dx!<$?4jOqeHGfd)rqMFc7djilA@sP^zaUb$q%rt6%9t;9E_hj zC>6RPj6WJ?W)=-o6bH5fc)QoMg1-U<|P@;-m4#Q$pJ8lgu3{`Pf_KR`;o5ip6E zp84ag$vz>2z8I#sstGVZe!5|7!57X!i_WLi?B+a*>OMDr1++KHdd~U#{Od4}7xuB;-FitlWJT>cznV*Qcv&xg3_QM0XMhCo z5}5uvFE($vI@aQI+)g>YxahYV5?U?As(>KHn$}>($}3FM^4Y$Q?_Z^fMe10th>YqM zh_{XE*@}HArU#4@`Yz#c0PNO6x;l1mO7vA`$vPLRJ*vDs{2^1NNB5{jP&lIr78guC z@}N_65^kg^v$rqiO_K9t;8HE_rt+nV<-^>#M;=gJa}<;CUjNp$?`^@RtXtGYw2w98 z%6N^Q%mxynKjCJZVm}gyi`PU&n~WiVb*0%eEO{>e$Yq<~h1ZF_FwjljayoaKNM>0Y zu6}s_Li4bQ?Tf2g1qDO(L+5>CKG)+yAVTRWHRvEH=;I=g;zkJM*iFTlHGr13I#Nhl zl30InIvQ1r)z1WaIYhCdf?J7elzaa8ADxCH{$3BkG`Ylkl7Eu$x6M270kKvh7;0f* zy3+y%pWA6Eia4O~Y*R&_0pV))KpF(e9{Pg=i+fIAu~c77mO8h>dS1MY$S?%}H(i%C z`ZiSt-=V;ekh_g-4DC+jfRiMIw>9whZkU+G^`Az zmn1Eos3dZ|+H`ou(m5P!oht5?@zO*hMX^RloCiCm!FG#s+*ZcJ!!>qWH;BO63&O~c z<5CkFbFJ_p<6r<(jE(ob>YS1&@30+dqR0cSQ%n=~iE}Dj@=+>-~ z)#?P=T>PLs+svCSOjvhTsm)1%J$qY>M`->9mxhtz+@7RYkM6C>C?Kq41KH7$f#@LR zgVpN@Q5p1KyKe_ESq9oeffPbxqQ+`xWEb=*`G(&1$^P%J^#G`#cLnXj{?Gb?h${42 zn$A10#?Kdf-PHYEq2xtg^F{qUGfomzpfbY;)Xtb#-ow!25x`izx;))e^+x~h!gWkPA#mnT49a~#t7!>6_ajGc|IoUIv`tVgE#UgdYDSySdpvH#NRYG*X)=~YtuKg> zp%58&8+26fvbs!lR^JwQ3BLT|x8{YbqpWH%@TP{4J?>j@^R7Jzqk07HQSH!&yfOew z%GB2Ye(<@Sof~6jT@syOQhB49YviLI4h9Dm1w$O9%lKfyr`+|6O`Y|AzKR~8&9H=L z8MSVB>43JVKjLJP?nl#PzY>^Bw;E4-D?gq^5SlqpKV4Dy^`d@$EIhWsS64kJzB%fH z(hmcN&_i6-%Kz4 zFS=Yo(<6?JmNaX)ny}1Ox|sp~#D_uCB84?S3c*(gdHZKkl&Y$o7bKbjAK@j!6bT*^(ul&42q37g-jF5K?^ZHT^?dN z!#rnn3_0YTjTvNm3^?}GWEEFhx6h*o49ok8nG4J0jAy~|M70K44(~&Qq5>*ngMUZ#-Rj__me;@{D|Be}h0Y?(!IqFhl#x-I zttv!KqywFki)!NT(CJ1=i>f>qdgyl`(L}!bNoYuy8xzI_3XE%SO!K&7^=9>GZ?4_N z`5ds*&%Iz&eThrzFulnPH!o$NclTqN*gc!!ex9vl54}0zZ)r1+lAZi9GX3NAr zZ&787_~(BA@oppDUd;xBEe#{y&8}TQ8=a$~4l!~4tThe^$B(fFCTj3h#(e4GO|*5D{$b(AW=8<0zF8w z+f#04B1dm3z-k%Tl--atAfUeS(aVSbUxU+T_+XXrGH{+> zqWaI<_yF-4`#0$TZP}!VAQx1xd=q&IVrvwu7I&Uvrhla=80QaU%Z@uUu{+Hd@(w#Q zMPcb+avKmATlpJ&4*EY&HNuPKwt>lyZ1VRnxC2H~49~Kx1scfu|J5k=Kie2Yuhj}H zvt5=+6mTpCZB9KvN1YA&b4))2*;*t}x`;V!PcZ?#m8v``$We&N7;_%_qe%MCz&Cme zH7dT7B|Ume1B1ctxd^2Q{*yiZ^^3A%z!8&|42g*{cKw}f|Np*55U{nITvWP3?$Op* z&BhsY_)7;7(BDM}eBg1pC;1bIq=CAle>g)zC4nFmEkmaHY=!(DmvP|f+1Z-8VJPu9@cfbw;1~Yv6$4l+6&zX$PCME7N7OTv!@G!IRG*t8SpkSqme9W+v81* z*wI=WqcuQ~v8{0bd)@avBA2Ev}%ky z1M!tWBy`^UOhOd3F;>zqN$pNY!loSoNQnN-aA9UX+ocz;fJjf323xSQM6)WNg3tDe zAM00(hg{zZg&o1EJtt~C`uEg=hYzfgXW;*tlL23X03!v1CU77B_??-+A3?#LJaclY zZ9EthP|6TTaXw$mVFmpR%kQ73@G1sz-YWHP`&OPjd6L^G8_y;UUV-uO2QfsFP%xt6 zo`6H)Z7;L+_i;cO+b;5g+|bF{S$b_GI~$x^r2g zC2?$PL@T;dM3c#PzlLD|CWY$<*9G|d=bL34etuuA@(NUAfY2HT0~0d}bP>=oN}?v* zoUNvtZoGNkfRiZwAOCL&{oC`PCTx2DHpFrcgsY|~@sI~@_||_kvHRRMv4ik%+am-g zy#tdP=zY-T^{@-H=f#dAAbJH*xkv%EGAn!2VU($W`8bE&H@XwBw*7&~)nRmp3l7<% zh%sGPIX{^)H4O3h?9Hd*#O%7}CF&TI9%suW^rfXmrEkC8r>B571T-Ow$$;}(^d2gF zHs^zPOE0UQo$DX|`Z`knO4j|&PjM+Php?5P_vvo?LEj5CzKuNFnd|2}6|Xg57lR^| zg)}IES~xm~br@$n&C~a}d=iHr35zpt8R6C`T~OLg$EFe-UnunEzm4e+bn2CZq*uNq zGdS-rNe|z}t`z+htEL<2ur)!S```9t0x8zNBXr)=gsb1KRrCk+Z$I&PkVoy`M;rmi z0F8DC$kv@+!}@>+#L%W2FvR{2PEGM4pmFL{T44yV=i5yux@%uE(Lj4Lgc@*($WVv_ z^bsaOa|D2rN?RRr2;QOQKg;ust`HDUj#kcxUnPrDi09%E98m+AAi_@=YWei9 zAw0LC2F#QxY5(xc)_gt=K};OD1lFHGmXCiKZp=dJMT)d|>+OSNnlH8m3hF>cDT5&a zg(e8ORxf=?Ry)cR!KL7ZqF~;AakC+4ZsT!VNR9QohT(ED6rxz*({$fMaa_j}{N$TC?u|4XVCp4K)9Lq|gJxzg%n2fMi|}Sf|J96vL|ZLus|Fo9d-E zMj$D4#F`t1j45sdh51TmJ_}8;Shp3@0)mYvhc5U@sNxubCgz0V6Px2@5`6BWrG~Do z6ao&WgB$|-h5+&pi4)szM3nJF6JA z^f3=KMifWs4m#S~mv-kn2&kyo@bU4zonc~7??+C%`uBLPKTLF^iRTLLwj!;MA7?aY zNBN`zZlW)R&raD1%lEEWLU`5)sDyr}cu@kpP+yzGkfK!^0vn|itz=kbpp~(k&#tzBbNDsyB?HS>c=ks^0jFPh2AxTd%?OHc7*Mu8dA&bvKL>S@ z0&Z%zT{r;KLP6C$B)8%e(=W^Y@$pv8XI9zHS5csc{LI=7vwb$QB#>Wa7cRHwnAYD3;Yg)b4zwDq@m2?n^uvX~?nwKpbE zvJohk_T~b24SeDZvs!=^lTub7!Cb5TXTkW@G}l3z<}%Zs|MV^pNWJ=Be85hc{*7rw z?=$=zA9@uY#Y_GZf+O~BsR%DG#BJosY70VMeNkTo121`q{_~_q(ja??H9{7TZS_Nt zziaIwDjpaG=uzn+&8l}5#uoT4$arHXTa!5xqlFqTcfF`SMgUlq+jy(JVAY1rz0de| zezdU+I>S@~&_knA$UjQ>V=HcxA9voV_nh1UfshU21_i|g5osQ*KtYIqXUeUfL_8Pz z-QS{p0?0}p7er9h;|>yOGkKiOqdm4t4KD&fL~yT@P$t4)P@%V3B6?9m&jfaA8Z zfj%_q^!j3lu-35kt8uFrg6TL2r?OY)M}(<}#dQGjXpH`>d>c)Vj9J_S!qa;`<6B3e z{EMRCnc#otLg7IG_=`Sp3_$zz8TMy>%tiV)D#3PG;MMsjX@D0>-cr(3n>Qeol)GOz z9L-VFgt(pUYs{tI`d|*rsoD%=ToA}&Dolp*ZENq|Wz|%!Gp>B|RlKpW@xfM9gOSJX zHE2?hSshF*st*hejs2ez!JkjL2TUJeays2H7k3YYL77iMb6ARLHE1?%qlgqf|3wQ% z41~Sh+EnqrgJPi05deH6BOGZR%-E0zT8SIh!=XWU}U zCLom2VYfKy@feW2XxW>Qt0E_Ia&nGTTWG0RZs>mGN8!X2%jlT&$DrBG>;o&ohJ0(So``tr~T=$ki>(umx8#R$_*RPMv6lb z5fLT6AYk??>oYPHKqjI(6!eTo$LIa^=}%%UcSMp16|a#hpHjKP>hfpHC*r5`P41^3 zdb?SpJ~|T4b=tHP*d1PKe-A~Q;-#+syx`bd{6H8) z(dnY5#kkqJ*P1tNFRw#&{@8#!FUGr&mm*>t2hOZHuE-=$2K&F#GD^K9IkV$7k za3+-O!kKbTiBv^dw0c|!XLJr#y7J{dQ0#m7R=Zns)8cs%Ys8fM6R&TswWP>6B-|#O z$bjs6%6^^5ft=H&=E~@lnHq4dZyeU#-fUiKJ!Fje_?0*Wb9C;`Ylz~9JX@Ge#*|@c* zM35oid;WJDoEy_puYCBNfZemO^P)ts`w&*uf!0u|(;h*&)s}nDrVd;g^6!GT!Pv4H zVES>`D`&>4eTnH-7v6KyeaBo*mbQzuqg?^=#IGMOuvX}|6dKXSc?Rk))VTUU1t<)Q?b?{f?E{Gr=SZC-1wteOsY!8CFl~A+ zSO*#}0j?VxMRo@WsWJhy%LCox{@TE&zQBBg;F%Nptdmw~_*1qvot!uhCGlpXIQh<( zk&%(&%Tq>tkE>ry=;YlG6}n2~cEtDF{qUcd|HBh@CrE6o0}&cD{CjuhBtUE<90Dgk zW+CcM<|zDE1FOB{8_q`%TZw+kH_f(SK~sTrAdosR_Xuhq8#}wm3FU*M(a@+Wvck+ zhoG9*fzx6;Sn1nyin12@tlLwIe-W`*pMJTA_N!Gi-_e9vVshH#CxTZH`Mv3A3m@p0 zL`{=p9Ipq89WDeHm7hMRvAgHh#?ZTI z;iW)BZ(8M7L8!k7qiq7_VHfSlSNoo!`nQ{Rz|9ban!}^F4h_a?AN0kcX;88kV%LT& zwCBcLo&y+Qpr4`q=y^9Y_de{kdvw>V;9msX+h--=d=jRLcXUY1`$-(4pcCjmN^^hO z`02T`AlMWGg7zoVi|eqB+h7lMo8?nQ5tjs_8wS}u*MH5il%K6usFSzy2c+@zHqS=n ztN7kt>%SfAlR^whAbWG+*;mFYwY}#LC~~S^w;*JYV-@X9%o_CA!t;a4Z(ft+#u7M6 z+&^z_rTkBXM~e|E)b=ob-L?u3=RJET@aM6e%4;)&r#))7g=ZwtU()1VjA+T+90M50 zYF)lv{@yLLy0O&3CoSD&Gotger_?;8ui6i?AW0#jkb-*H9?8tif9C1AQ|(-C)@~2E zLYQiPBRteN0^Vc5>7ewao?DcpIEroq?GeZjo|$PGbajFTe{^1T;@jNZ)7pBh%xOKn zD33ekm#5;-S3xc`Ub<}WKe2GQB1R!t=o9q<-KVLyW(!TtAg3;PsOa%k=cZuYZO=)Q zy$_!EJpUg=!s=n|UKUQ^R{}r@*pIlvCxL$kYM>Nl&^d~i0+Pe{z&!9{julxqh&~Sv z7``b{WpE!mqkuIL_7KoS2Ivq+(--pM72&Z>96ec9>I<>M4xaQ;#$ZXwDO2asPod9c z_O9yXV`@W^xd@&w8Ql7NR#lqhZwcc5607^~-v{RF0XdS41VzEO0K;n?KzW%SLz&)u z#?qg!v$KMVv#kMW7)Wlg&8vwA;0cyP+s3+)AsO0?B z=hFY1q?rHqu-tF2?@3TjJMdsL+hp34-5$1@zG=I76Gi^(d7EuvHqdM< zkkGc<+x>albgt~&PuG`6BO!afMf2~s806l%{U0XV97*_=NQb*l|L2G^5ONYGIy5JY z_P+G7tAF=Sm1i5%f42!X%rF)zW@sJX`*;WlhSJXcO#SF~)7T9iFyY$Sfq5SqTXuKg z5yH1LJa3o#zt1^-rw$Z&bFebsag?Y6h+kMklKi6aGvuPURhLmIr8>^^>E;^C)BK7ufea?*HP9%*Wb zV|-rjq^9@mB^e`5ndAA7$AaqWe0hScLmf*u)_*;Gc=h3{-0&&Zs$c0Tj|-uB`Z)Re z@sG#r1=l{JkqDx{KY6D}Hm<-?H7_3bcbokCb>N*iH7_bDLJ4>cJcDMwTp4-+#?1qX z;%6@&V3#j}K`I*^`jywTJ1P~dld)TAhl!4nWNVp-F{Yi|M0<>hApZ=2fPT&^16DE)?KGL>K#~LL!CGsWMU%+C+t|6EXYt5+ z@(FtDd|S?^bxi**1QE#1Fh6vM-kOm$|1rbvZ><>wOA&-Aiv0BrA1Bbgz@2m`UjBwi z-GKRYALtxipbGl*@OT=6GF$gHe@dOzYi=7`x9*A*upH?>G~{QK=3E@%^<$u-oimeG z=iklzS#)9UVY;_`^?CUCPZ9quYXF6@R`rcDNAZTNLIo_lSHi|`0OwNzNaND;%xa}g z;!V$RO>hBtqm6t+m`1V6G(J3$c?r30CL=1GcP`$E1fQU6;{W?*#h~_1!QcWAma{)SbDyblL@c#S+IUJ^)SsDs@YFq z!Z1Df`kMV+`|q?wlv3aIEx+sR{d0=~f7Ycr^KR*X8y-IVR^7k#%19$>+a^n4cOwbv z?r(qzq5twnbpv%{8g6rREee{%<0;Y&P=#9MW?a39u)$JrUl?$!J0S1Sp8hNk=78Ss z)yY>c9-l@80ya4S)GXIDm(mm$AP9PWYrZVFyZ2$!7$^|kI1gi{@qA;AJS7m-i>o{2^j;O)IIk#qrb$1-rL2(f_#7jX+ERa>>S=F|_}%WRKL%nLv(L%fFk zmX0H=2smYF1G9M#Y;XFm#NVZSMB2CZ-aO%RAUERA<6$Iv_;~lf1>Q*x*e(QiJ>NkR z#moN|Ca~|%g#gsv%a>$feOJ+|80hN?p7Vs}<`##7G+qj717~ecuLOUfR$KK3ky7Ww zfXw@AoHm=GEFokho%J@g@AtDuT&|q2rIx?8;+#DQzz(^U_UFR0!4&nR=oUpF!GA^+ zjlrm|7$S`_Zn5X`hvP0!3QCK;KA8%bD*IiBe{d^7820H4NW2Lmnpc^>hmzJNj}*l6Sw0OJ~**d7DNW0=_X5&UO76pq{;#Ud`GA-gWd6n~GzmEe&AA)f)J?}) zlc2Eg@$PfXeZN(53$MQjHXnWPKcR3EPYPdNys$3c?`%WRC-mnWZNt(=3ph>}lx5T$ zdRO&(lsZkp^C1vfJ0PsuMZGHN*#pf}2s6*H<4D(ZtmwwK=Q^_1)d; zYg1PJHNoUfX%n*B^$aIaj)ujoqjW2`WwShJxKsu}u#jqD2dkHQ*MFtAbSzpa(fmq} zRX8c80g6j!*s6XN%M{$t;1xH84zAX3V-93IC9ubZDR9_x+@ZV&;s{gWHqo#Tb#$uE z5Pm#U#uvibT`N1|>8>CjKI?!XoS1lOiYknVT_*2dY4;Ovq~S)A$m<4^TXfA#d=Zgc(xGb)s=*ov;E)K!JOhZ@zPh<<-V@#FHY`xA@0fkU7l>!ZmQkoX+8?e zL*uQ6qelc^{d0?I94?|l_C}mbSz$I_qdf)L!KWKrl!WoG< z2LVokR z-I$f>H|zi)>)=XFEr3gGak|3<;fH-9L2Oq#o@j1g`s6zecar;9qupb5QO$%Xi%^tv zv(%4@$&Aug;U_)y5e&h6&npF5Q%WJ^Eg*ub8>`m`UHbC!j^>PY)N%RVdRm3Av3kbAP``J8wbw^93VljT zMXQ^Fgv!KBmI6mh%_1(l!pc5%B#f4mjhWMDI8Z%d#E^MweQ3K+SKuyV2yu?!NV&C0 zBBE}Zpp|OF4Wf^pjqrlAWmzG->SqgI{gB>z zMlDe(nIl2Tb$vY?6^uWaqwDy~TrolEM|oZG1Gfbis=EiT47jVKZa+Z~BOAra2I6(; zG=)*zj)dog8Gj28+S0{E>?i8Q-GAl8p9E;jvlIEXblP@bJ2esy%%A+z9GckrxA-6| z<^g)aF!*}1PP&JBDb`|UCC`Y6$$I*np5DD`jNOI?Y&nWz4E_?`eyS|Z*uES!Q$3z7d;MlQaMK>+|CngHsqX?kIR0KI0`jA?2cLFF<#zzfbppI%612 zYi+T6nb0FS@|Z5Ia9U2`TZ!-A+}K8(y$>)P>*RHdIVdGG zNXQcTK6o?AaFc1^p|ojyrGNLAf4rG3R34A);;F|<#BeKUKFZC|RmK$@Q%$?VWV*B= zwziggvkfGy)ephv*ltDtB?I@x^EerG3+~;5ijc+n)T+6XkKqm3uO4$@+%0gr`2IX( z!7nOCZM)GJjmV2cjD5De@#5N#iY5q$fZeIX;kc9~^t><_r+v_IqhAmcX#)_ z%al7wr7WgfdUqedi_By_%=iW_a~8(=G_;;Llv81aeVFk6D0rAP1nv{qPF~kJRZNIF zki9iXXsF_|zTOL_Ee5E`zEs549#{eL0Fc1SO-AKW7R4=o&41or3{|r&^CY*kT911* z5qXFUlpzTb_0>TTY#?{ayn-MnJ=-d;*&X?MrB5WkU0Zaa`{apUAVsj2X1{~7_j>8s zka6$~FM&XmQ!5=>`1TAwPRyuTUul*x^%)@GeZUo?c8MM)WQ+o>^%aq*of3w&svI5CA#P@s7Ejs0SHAKj7 z6&?4$3y`55GJGFOwCkw?7^gImY*RZ4;8BmxwNWizvaZKyZUq>4`MW2>f_1~pf^*{b zep(4Uc7I$w)Et)%eYt#FqR`FElq9C)R_^gMdl<4&KGBLoSpj}=Or%sJaa^Px{pGk3 zb`d}?JMLVL8ygE4#bzqUO7H)zx=-=$WCd;=7jY;zohT4B2@Yxvem_n+(N^IPjEC|Y z5&d~3s&}?ZI{x9F^~)kzWU@wkqYhs!d6z83gR4*r>4fpx+fM)0@g#33zxw0(js<;4 zFX2J$4~4?i6sGCX zpFu_*Q-Y_`RLwzuUvzEg2g#Ba|3;hu(N8Fjq>Z;r>KlnaGU6cGF2Ul*!f6Cq> zQ7{rK<4)yT(y6uZSaL4wI>{=ev>U-6o`b;dQ?W5{OkIBbC*q1YS;cl1pa*B!@>JJDO``wt{L}4;RbjX4~8uv?r%W8IX(8v zzQqQ8YaFUj4ra?MU%c#$bg%Xjin#Ka>ca9-s(z^N{Z83Onh=xol`elW?}usiT~n5h z>T#%aX|kxY1R85&VpO-VSgh`e6nkPanr9$#lMs;d>sv89jV1cwdR8wGCD6a=+;?#B z+T3BKkr0O3$FQwKo72xl|9tTD^-Agu(L+a+pFvmJmvQZfW6pfS_=y0)B$&Bg>yhk# z9_M$lpw*<=LDkXj7j$Fjff3W#++)W@&dk{1BT(U&pcWAJ0q_uRUkka*$P?o5?;&e@1(4CJe`z>#5dihk)s+&Cl$D<*ld|t5?0;G`7 z%UM|WU!u!bA5!weD%H&V(xFN7JXeJfvCTmE~!7xcqbTY1^hRO`)WqAZy(T7CvmoQ;;EgAt#d zRPI)TIDNLbO`MwcT86Ii$NT1Yied+A2a-M|AcC2>(PQKHpjK41I5c+p+NuIj6rN@u^njZ-cOHgpzLR64n!VCVO?TW;mF%RCG+$;uwSh^J9#fq(M5aBU zQ-U;r92rj#JpDyJw&YpoBrW4kg)m9W z79psX%XGLSBNlv2)6gu*SYsL~ZxpBU7~Cl`_;~u&u+!vgW{A@!aNU_R}rxY z9xgMvGoSu|VxIo@4&VImy4CbaJdoBKOPSjxVBe=gLEkJf0Fz(6FLFY)_mCYb>&`k- z8a;hEnEc_{l*mPl>e5@8m6#hF*->u6SFf(juny*Pcetf4Ofb=Xx319!76<`dODSVi zHq-LBRy$5ln-uOB^7UQQ@bPPhU5-|YxjG_!gYbO1n)T|kK!TqiEVBDdSlLUFu7P6U+}KNPGs!<@^0cr@AtY5FUV6z3|Xh3 z&Sc!Iioh+E&Q-jAT!*~l@^9&^_1DmsjT|H~BtuG=lrFU^U5k6m=zw+oXcJN~DK^tX ztGeN~4zIGzO4U4k$T85)KaIVT|MUq8t-Aj%Zha`Z zy!1NDn*f!zbeYT%AWFeoTLvQkRgpNfNMI|Ry+w;>t2xjBMXBZw-KSB034|;f$KwG2 zS4;2ekA4=<)_2m}q?d%tb;m~7ZZLhZ_`OxZigD(rn+FmavqtBHM|M-)V;Bj`D$fiD z>Y3^54`~;NH581+5C0pGbb=M47%Ag0OID61{3e-=lL)B1XlnrDs6 zaesth5%AYS?N+yL9_i0Hjf++PS>;mN%a6;{`PAgkra|EhWPFG=WqNTwoKwejDw^GI zaVp853`>Dj`wpZiXD*#hPt3_GVS&VRsoe7G7A5jpq1NWiA$@lZUIvn%&}q0{l*9hS z&#RYcusraTX!izp>3g8F)bCW?GwhE>&(U5gQ%hmI2tIM+9pze8k>-{ zoC^^La=!u8g=9v0xo6*!k319Zn`O8dPa=V9V-4hNursyTP~jQ&oi9!(`A^PJJ2 z>ux`Y2w?qy=QS$!)}oB{AGTacPR*{=))-RfQK@5(X~3NUk7~I(%9w(EJtm87DQ@Y& znOV(1j5JTN2@vwreI6XF;D{Ug`XB_@%y#WcjX$9eu?6Sd>u?&YF=Y`?O>`ooh*rvIe1S3JYj00M~RvJrZ6tvf1NhALJTBzRUW zRIq9vY5k=XplCD3CzvJqVD>ox)fhR+@v&~+^vS5nZD?##rddBS=kRFRsrg&3TD{D(HB&Ehjp7EBE_BnX2h-M8CvwK;-8-t^0d;^D|hTx*JRg z#nKEwI#hANBL}sgj*iP`@Wk&=nLg2VVT>n6nZAm_pQFKU3kqj;mtRSp<%J8cqhh7f zG&7uL!39I3gzHU)#~}UGq3iCqlFIl`WTf{s_4cus9bXbj1StCLr#X>Qx!zx==MFWz zUz~aJV$Wpfy9(ijtn|k*k{-7 z+{<~RN;%1KLtbuq49)$3XJx*Q&KwG})>C7K67f@*jjg~H^!IxlVKPiL73}&_>5CMs z`ifJ$md;BP@2J~M0ae74a@F2!sTe^&V1Uw0b%`&uIpR*{Ju|8P0lXp0+FoS&SB3cB1H-X z$8y5i_06s%bdjr^I6ObWswe7=_R?2A7vKM$>|AQZyN)y;Q{|Wo6M$7lvxKgmP+8^0 z+l_*0ALp9nnK!n0oV_Npyoolt$GY z;y5NMB2?(j=Z*CnYX}V0&&j)wG6tu+tJCsu8?jr>p9t|{!WsjCOUz>hPJ`tW z@233*U(&K`Z~Fvq0}grMm>X`?NArC^HfK}%O>3VeUl?~bJGZd6;U=m9`^rS$8+N(K zEsPdlprCiZOwKJp!z#_|9Q-_P)8j;Ae-G}}@Ih)#z2VM%I>)R1tCaYWR}h^6HejfA z)#ql~*6?vB?(;8)AEGp9`f5#-*1lyI_^+?1)6`+P7eUa0!wD(7R;SF3vNqNKt zT;Q~r1T)gAx`PzEy%2MQ#^ozlC%?|E5cdPv-^0P0KS|m#B)s^G15h;@FgHG%NX4ZM zlt)WNe?dG%jxgE`#EK_Qi%8&RpViS?`KBU*J&DCtu78s_A=g$h5+wbG-^fs9h{&ob z;zmhKk~fOyI*o;mWaC}x1Zxc0^ab|M>Q$QM6OyG0T8(#abQnahA!&Vi84AZNl6nOE zzuIlS3U(2enImt-sHr(?C!ngz5Yz7Gpt#Y_IoM8AD23WD+%AAZoJyX|z0^Q&JwNk_ z=Pml)S3dy{sv!}=EGO9`3ec8T+;+qpOJotEGrapqdYQ#%e09*O*R46StYEijw2F-? zbb#jsiDlkIhmfwF8QYoN%MCJJ{I6_=8MEF!X$%?NxxpLTn{FqY(ijs2D!EnP`|2=- z7d`PgVP?)wVf^sf({CtV7*9w4&v-ijEy+fp?{Nw#xAf7C2INGTC$)fR`?10ID;Mao z$%uZN{K*50JqVlOfZF&+8lxVLOGRU-rnubW^M?X-`_+_gGb_coKODUfbvF_F8garv zAc$0>047?F1CQNalKPS9u0NKJ?`s-bA93PI~slyX%r*7#>G>``D-ew^Z21JvRG}?Xq|wS^Vm0=4Xi4+OUdsuEqC3> zI2inL$})s1D(Sc1JyHELSD>kDE@|alSk%ZSO53=Mm^{>eN%RbcEJ%b~rGApLA6UIp z@*rSF$Er&PB}ZMLM>$$5FH;!mS8_UPL_Mo<-By;?GRxs;El2QV&h2}u)Gr%-v0hHj zu?Rt2T7r=u%CK_}N%{RMltLB1&swuQta;zkT%eDCpC9Gk<{48S=N8TPSs8JR zG&ga?8UGfKzr(*Xvv6FAG22u5vJ#@SPg+oV!a%u)O~*Th#&^necw4WV)zG}vrYVMU zd<#Dm!oIZDhCogDuB1`NMtxRF;{ zE2{Tti@LfjtrRNZ%LY8!5H&o;@xQ}Sp@&{kzRqN{HDDxXa$OxW77MG8;aIqtD};{` zNHJ^prQ44XL+900bR2$}dspX}dX0C2gAxvd)2zwk>ZI~QoaK2pfNZ+Sf_+v58_!z6 zs?u^WRUk-n(dAcb`kXsw%PK@td~%S_{$n>E)1UsjKv#sk(bCQML)Ia^Mpggm?bCdJk1sox zc0x&2kmYj{fBk&P!Gjn9(k6HF>>R8N2lDSVR7ayzkasH z8tplfHvZ-@(>vOmXm0Y!6Lu40iOp<|j;E+Lt2_;Lj(j#?(Pz}eBQsy&7%{g_b|Fp! zE6HD7t+}VxdW5Ut&5qMJ*6t6_)7-LH;paNAZ; zXCZmY>x5SmpUwqKn}`n2d-Xn~SUXHgsqb>d`I;||66W~63fh%VujD3b&sEoGD~6QM zR`yOK*$oG znzXqnnW#K+9P%3+wt+`5XjfbLi;I2;p-gANx+`P=L`fQ*C^S z6HCVnJZLNG_IMf?Bj?%W$y979~BtAg|7f0De$CXIuC@(Y%Q>Y?}3oA&y;cEupAv%*ILZ@ z)|cDU*vlBLp(=l3&+qtx_j5`(B|lYTUgLR+<52U~cjn;nfhK&8?O}6>de!zXtUkW& z424Mi$#|qjWmHT>WOPT{MKjO8iR?3Z-}Bw){uPI2!D#6-J&N7^-CtZwO?anKh;p`? zKHH7F$!d`vcNGy4TDjWJ{;ncf`^kJU7H#9{Al=rLHMa0jLjM)Cx2=U06REM%#JR$* zlk4VP&eQFB8XIHZz8-fIWlcORn*Wt+O2aLh;q|_LND#BYJEmJ=+SI%pWRN2*UxWxY zro=wE{fI`m?}R8q=h&-w7jv9s<(=!G2e3E7@U}Hhkyffkg07N_SifG&F1Pad?+qO<%8%m$ zT2|~Usml?*&rY--Un6Z3;MS4HXkjMF*Q2M8MeqP=89{mg-pg}_;G&Fcr#a7z;ssg?nx=I3t#QHq0x7* ze3t1Q1G4o4a^Y~}FRr+3lw}d-JDLsoIjhI-tu7vUQs}ksAAaA|@+~voT|mT+LI-b1 z7Ot`vmn3{v>!bw6i4lwSy!T3T98cZCx-6wlZ?PTbBWbk7i7RoUw>P4Q4{95TCr;$Y zXf}V)GP1L#ko|P_$``#C6!e9ai%08fF29v(LdD6tQ7o3aNoT3qXCJj!b|Gs}exQCN ztv>Dm9211fVw7|Nrr!nXM-*rb2anYC)rr1wxnAY_%nF7-}yHsI1>jQcoPHoOPiwWk4l))9IR zGwKjQ*_?4b2J2@BG)TKj(6WTX9i!F;+7+ksqsp6;r0kTB-&OqRQ?&##M>~$f$_0JP zf|uVP-?vm|q7@3#5lbz>lGXy(guTnV9w}9<@bmWayaKa6e5O)RjbG+#QhKXgKoLY1 z6Ls4;$?_FpMl_rk{ej!ghW@59z-{GA1M9t{;&>O-G2o(8KDwH*`E@L8CT&z{#;WHC6pG}?MSgIzW7yWg6K!_M z?d*V+II}%dgTR0g6dT1}jFj-%;5DJ*d_*l(uBtqqaB@FQJvE;E@x{u}S1>IIxtP4j z?4G*nk-maewyA5ueWm`c2rP3Tnx(%5Fz43IUYLf~US&S$R!vkhb@!cVV=2~pdp=wh zrQhWoCUYQ{EsXdz432su!^Xu2s#h}@pAUCy;o=#shkYEBqPk^($K#zGvpu3?{_^sp z0vNZ~6dhE0hmR?^`NV%S?j8wdk;)Y?(y~;A|J< z5h?ert3}1hHp-0!JAzkF?RRHrs@v&= zqo$8hNtw(Av9{Y~9sg>be&V1VuX$fOD8+5N#^LQpAGoDGtxltvkbxb2M;LB4G6->h zqh5=c9s{~!o2 zm*CJ$!1aSQWd6U0E%x_egDS!rmAYv`YCLbXkYqW~vSma!c0X1d&)1wTm}L z>cYbxR2~=tmI^LnNVU;bU~Hc&a7^;k0X1BH3-Q=z|U(2Dc9zC?; zuk;X`kAGZaUSIK$zb55-5R&DL&)uS7?r41A(!htjdHHQ%w2Y;NOo4^R0SDH0pAf-w za{)xe8ucU`K_ROGYkeUnRQyWKL z4PnIK`fzpNNT2$e0LRcwTc~(Zxib)GDfQP&*1iaxGsMv}GRDcpH!8IDv@*BUXG_#i zJ&O0@Rc#vOotrL?%9U$9B-a9C>!9KAm#AZBUtW%QB3Brf9&B-Y`)96d=+YCtzyvxd zG@*#(@gR>AdiHx`k-z>?c|1~TgCo1+>C5lJL%ezsRT`P@{xE6D|C-t=cWazty!>?i z%G&hP@VWg)@sbB68^tCWZ8!}Lq>qw)KHdH#r@FPt;)wO(9t^^LeZ8po@v59 z!s?`{m0xC238A9j{=@Z!{<_Yn6w{#Q43w+X0Q1!6(O#8e9qetF2=lXxf>*MPd@lH; zmk|cG={7kQHNC$YSS(2#LhY(3A4 zAr(@WB$4D$jgvxX4U;sjh9jr;jgW?Uem=sEJ&ANe?@Ly?a!H4DjKfW5bhydw!YG=b zjUwy=3<)lM$}{A#NheSTYka90`WUq*-H3?wPY=FrBqDhNrY_+N`%dNqt<}UJ072%k z1dD3fejnwX`a21H_w7qQx`5KDCZ%PeUP#^TB~UF3&*j%TiXKJ3B$}iPA`hX&8cdyl zi>$Yaqo9N{FiQ!1t@|8t4Bu>8>qoQAFIDhi9}3l%kD9Q_JEO85zIUZaduGxd(nIW^ zs`U!55gbc!SXu!zGfamqUuhK2Q)^;gdRDl)+(9LF1e zTQ%%8`3+9*8kSvJ?L_Sk_14(Th>Ig*sa^zviX+E`C18F^3!%@~R)iC?jgWm-EH8gR z$>(>ruRFWrx8fQNGAd15d!d8SJ1R7lDm8ovL5XvZtohZDvV=GtpSkyx76!`itTu*! zYRgXQZ)t?07Q7;+sckZJ#NU2k!P{<_aZq1NKigLVz)C-1Vue!L`aP!kDlga_miXEm z<~1)Bq5AWBn1C8=41&KV+6I>#_>B$%cDl$kw&Pp>E&0A?=<9RQsoZ=l%r`v<564Z+ zN?|P3WjF%4fS*Pt>alu(dX0T34b{~6B1uOtN2SKP#<=vG;{AJDr$lyo?HAUk$9IFO zf!BU|Yva53FYXe?cQ$%pB!R};hptzX4H!$o6J5f(4iwc(XW7p`ELR$;wD5>T2b6Ub zIlJ05_4`~6?9rW_9(#F#j@F)|L$@waKZhbe>-|E0Ot#lNt7gD(P|#442|it|KORZq z=dXNgXvW_6ZS+gz)!`m}Fx{6O?gqOBBa5>szJuo{B;?b}AndtR=Dk%Or5~(~?r&ef zT)fBG8^y?uEwH(%x%yn$*I6|C2Xw}H9YZ7z2W>LJYrA`nOZa!@O+h83AUwnCABuuxZ>b%|S z)B1x;fNNQcy6JML*!?}d>VwJKEK{64K^^~`t z%w*^0DKs3s)YozyFfAIf#|NX4|fihCtCb+jz__WEK6Hp=~6 zL(|l>TNbC^e9bsVOqEK1LRpsY2ez$C6x_f?WK5rOJFdlfkHhuQ*jEkP(P-(!vGaA0 zQr}TV1t)!DDI&gIRjW(({I{6z_c}L{E&+;5m3KMjO8YOdhsaZqc110gbn;v@2wQ0G z|59ms>qCr=uz0oA>oWFmF4wC92L!}B+2BwbRV64STk{{@&EcIF6wA+XwqsVRiI6RZ zNMm+-lH%S(4BM!Qd;Loc6*qkgs0}V)-+ySgil!!t`bFN) zJs8MJ`_a}MaV@qq#6~xorIBUQJJme{BaUZvt{6|eKc~wY&+nFXFoZT|6W_s<-kcLv zQ^AqT5P33!mj}go_4-$7=JWbLIkE)mtx+WW>D1!35f!55rJ}f&^XUzZ3UIX88@H{x zLt=MMSg0t(lt(tpJGX7!c61|{4Doc4YRR&%i8{_OxD$6?E5BZ^#YkCr8(*|xVncMt zQi6Jw7XRyZdbrdO*YyKx`9XLZ8yZg)2L@|!eG**qulKEfAtp~k>*pGKkw=B@k0^x8 zzeGykQ!Zv$Q}rd9-=!a#JS-jlDkC*#xwqS@xdkHe6u>;@ydPh)U3bj$7 zQOVVlz3Dt#J#}mi#Ss8{lh!9sFYv5KeTcQ~kCAY&h}93XIYvcNsV9|NLf6FQda0@N zaAZY{_2-6U?%5_br+g%K+)TBp#e90zS=(|r*`c!Dwd_pE3EVMksQZ4XQyw!hi9M%v zP_()AO+4y_MuG68ww;X?csd0hjysI4l6CMb{_>M$pf}7DlZNK2ID7oY#6a#GOd~~F zQK~aZMYpMk{Q4W@V%J!0avDvLr<;FqP6pl3=1#9g=-Dz@|91bq9Jqux#XO@WKuj&`tMvisb>f;{j} zG(kI9{z&b?as87CGXsK4Ja-SN`|OLjcoj%=rc;Wi$VLCR9x^Z@ti21PbpoT#f9k!X z>1yH{QS_=La!>335}PZtyOsa_86spJ_;gv3P{uT~)1vm%4DxHd`+ZZ%pLW=W2A?5Md4fvJtmC`SUsUj(C`7K-#rL_Re?@y>h58@;3K5t^pGS)!JH!D; za?n^!zq~wU4ea3J1M)rSkOCe{J_Wi}J=#ttR{5g5VdMX0K>^zERp$>&IgUq?=`Vdb z(Cnz1MwD5f`-{BZKLRwfZpVv{|G`bwt-AMmG@?NJ*9)wx0uWq%dTOaU4eivvW9_XV zU+IS#VLk{hG4xu5Bf#IAK5a&^a-{Con}70go+d12MF`3(@1)m1`B|*Sc>;s`$`1>t z?z}kg(hz?T!W^OYafdMdxY5vj_jOQv!2oK!VD?*}a_9wb3Tr4ROM%-Ow!%}4lCh6E zo~iN$d<2_UxXq z=soej8@MT9SvAlY z&FKWx#uwm}Nru##F|n-lDf$8;33=eYPJ>sQ*WBRYT<<3aU-;cX4%P?0-?jt=Wn8<~ z9-ILF)Qc1t(kK7{glco``;*{%L3t=#salBC zr2%Xjc#yof&{?Yw#Ra-?o(!oz26KmJ3Z4@oM+oP<2Gc4wpK*Fg&kzghx*vX=FaJGs zK$;1BWsu4$_EaeH?(S}rz#WuQ1o6^)&%h%TA()6DKvqC%G%yFzoC}!w-51J91f58T zKX9~5S0~c?!TZb!j1noP!NN2RUHkj{lc&x%#Y&$MLS&BEf(x|*v&+dV1d!~?nvwQi z4*B^Bf{^t6g}p^y9@S1gcuMf1`JM|TB8lXyPd?u!qY+NdtUYo-~-fc%%Udep+74ET1Xc@s|c)4Ud~0bLFgX(g`ecp_Z@l3IPnE4T7j|Os|%56Tafvw>vR>KRmv^^>S{ELT&sSn ztdQRz5L<&T@IIGrdwWdcwJliu`#(Hx8ae(V+1o>pU>;DDUg|y5(+MeFi6D7Mc{zA} z-6ahi^$Osi&`)6PBt1P!Cs8>cvCUOk+NjgPnN79c!TlWdPgac9xK$O2M#ovoOaCLgLfY|Y^DTB z0F*%pN_izdb zyIo_H7x6B|E&ODjS?0X6FawZZYZXh{nlI*NbEcZxkv3Cyzb-0uzDzZy^b2l0?pr zl-&rOx$SZmKeCJ{$_8;2C_jSfRKDH3wF==-$&a6n%EdkV4Subt@8T0yfA)SdcIQ}R zMSYu`#BMNysP=#$nqe8MdSV=7I7|N@Mge*B`VMyS-J#&{oDIKadEtDHr1(+ z5_t3$a5P$h#Vd;_^_&n*S_P;#3C!~upxeIya(<;nYox~=Thn0;n$u5T{dlRark+ZF zD1?P@lKCGJ1kzD20}lL{{_?5}#By(M+I>P61SW7$DCrageF5dLH-T=BXQw;-)4(Kg zmdlzJhwK3%l`F)t=F=rz<2fE6%T6onvA!8w^#C$W%4~+;qVB8jkDt^|f{5@vBC#C# zn%IgePUq6gDSpfJ6#4_fd8igahEu%`FpI9&NMn<`$he~5(kIIi$9kS?IO?a&<6;;(-iU7JX8aDFvg`dp;2oLf}nXC}2;PsU{)P$>(Y zWO6)-y`JUs6YRl3e3EF&byF5mS>1aJ&#<}vi;k;9b=$8WPMG#TrFFSB$nO^`wG;tu zLAdaqTyT{cJfnxS$w>)8IU1Mf?cOX1n0JKy-JcE`zuNN}5)`_vk5#q{e`G)UmBw@4 z*J}>9yr+l|V#s?;kW>osor5G5D@=^k0?M3+;#Y!*2GdsqhEUw#*;PeX$q&m=uvlu1EauctEd#?r?{erptW)rJpkowCa;Le%xoE=w;9auRAjXQ6Yv_4o+K zbN{n841ZMg-76W!>wDJ5ekVj-EafV>vKylE64XwGpa@5Wd;#A{^=I$Ff|$@dN*i+b zEU;MmSrNQ)bmoAl;bhw<4c6$fg~SVFUK`6#Z@d8Eli2gBSXLHmgARyLw@)(RZldHa z8sm8lJISCpEje}Cl#fx}Bv2>#rwBobk2yb&XJL1Krar7rl?Z`aAmI%>Y=SJG>6GP^ zVm%99)Z+!qIiDJWiLuc2f8s6flZgBKHLKm>Jh8B!B93n#7oT9UE^+$Y?svl~cYAv% z#UX<=D|e=REZQ4Zv+0TS61}yp!G%4vOx!)%zx7>UdpBlJI61JROzu7}aN+ZRH5PX) zbs)fB6oNV_3!sDxqX3~EzHvBgAEA1p5K=;r=0g-!fBWow&3>N!WLlB&ghJ}2_w4sH zCS@;7BPN`KKFh%Pbm#L96{oszI=Tje)UqF<$pK6#wHCq10=U+fO}MC~2tnZ*Xj@!B zv|9>}9*PVKK?z*A>hqjgg!6;KTprngp0yxffvGUp1;i}D$k}W#QDRCgIP)}P`NtQf z+iRh*~r8j#%_HC%wS^E^3=+d22EE9!i&d|-kLY!+n(t% zUhV8oKFj-m?EPsx*6SKR4y#m%(qNHfC@GXED)TIJMaB#nqd|nE$dE+IRLGDJ$`lnP zNs5vonUWL|g(4-P3_Zuyx^K6&_WnK3{yne$Fa9rfpSGp@{(i6F9FFrikMpx^P8Y46 z(eKmW&8pWeYBOhq$(hBb81P zo%>}&Xk2_cHFEdi>2oN|#ZOK-aC5uNUR;Hqcy7JiayBEoD@&})`Tym4>=ECtr_nG-2P+4%@OAT4 zU-Hph)Jt_lQbc5cF7}6lW_7Zz6V@ zBk{|c*K*!}&G4e=Mpi*`*V?pae-Ys_(dfs$SH+DWaf+;KPm03 z3h|pW-xR|jH_`Xh#M-DFG)5i+O`2*Fbk!7nO03)-^bLKVb0ZiIwSthe$x)^Fyvp#l z{=BjYo7f^?;CAy5 zM2*JC+^TY}yXgERj`k)q3+cE_!x^Z{57uXxYsJt7nCUjDQ)MyCnLhy^ za1fmnjDpgc*Piqh6m478(Zt`Rc3&e|@8L;rq9~~JX>mD+lZy&-w5J=R<&LvUQoKkH zB56goJP2jVMZ4B-TELXR$5aU=0$W)0M7}8nI_1p8t>+edcayFuj1dr5`Pc%BP(8rt zH?LlUHMB6o@FQsr?6dZY-H~}s>k{#@Fw z1}PYj+==aYt0C1LB66Xgg=ne@ zyuKin`w@r&4p1RhytIQ!O#Pc5$DGfY5rd#$ea(vm$wo+2vVPQ<am+qAF z^YS1Lqosj|yNA2Gfji6Kq)gF>#fia!S0{6RX?Z6ORviUZe*AGD-E0P4U;Ghpv()GJ zs89Ueu+UIl11roTfE>YJ!Dr7#f`O!EYn$pl00FiSXlcEGSrJ;eMrjaW9+C9<0(n9W zbXoJuo){7T{nm2?ilKHWFdZ2mIW#^*B;lZT!oNL~YZFwM8cWESi_6k?y>$*A%$^K^ zQg)U84q3a}HEY&rpbuEv2U@zDFo9s4`*8pDo1q?P4iGG=j^CO~bbp(YF~dZ#_COi_ zSt^prk$aFyt>T&bI)A+7W$4-$3D9QEHomC@oniqf!t2xzkO{YF3~Rsyjpee(-OheD zEJM;|2V0%;-R;X;$t)8hgp430FYL7<-7I=mg+G7r*3F&j@tLY%M#?Z@le8%68y{Jt zKMTbh?&x=rUTo7L_4$+^uy)Vxn=6L-EgLXBVlm4)W=?VSvwv;a|Io$EETK2-%T}ki z&l*?*WqB7JU9x0JH{|?|e5hi}*qQ8qQOKa`l*Pn}bMxfH>8?(3maa3*zI1WjE~Q)h zUVORjXZvKc_sAx7+gl19=*vvX!~m;lmm1 zVym*8_pkhn+ON5Lv&d+*{Mq#J2WGLHc>D0mH>HCRIFA%I5_xsG;VkWY=w>UfR$yK2 zkbc&0)%2SmQ}pExWM}Q0O<5=ZJ-iQi1Luk6b3X2_yr6n&R?+2cE=tgAU;XXdH!|+Q z5zX|@tH+KFH{TLm?#-;_Y`Z(;^Wwjkn5;8{_AGx6Kgo?DOw%i0x^*_am{*r(F7<6x z$lJK}MIcU(JIf9zj_tuoU=fj*F0F%ejex2Eef=Bz=R0LttebKzEurgiQR39c49Y+M z^X%^=@HG}!Q&&^Bm(Guul{aWH{e^N?%F~qIC0|2S263=A8;IqvdI~kr8egb|@t$9? zb!6b3QtD_+i}6yk%HGe**6mc#j1jq9|E7?8`oZx&v$cJB)qHgr%4jF)D>jGu%20zO z^+~w#%t2{%lBaFCFd2 zCztUCb#6b%eVVdaeuD3GSyzj0uf0w=yMLczzjx#fxxSaLqpf!_wzNz-bl9KrPZif= zi-XpNC9j^|VqRZ`oeZqy3}+p!!)f1Xu>{|_M!ksgUViV`@Y%(#70+m&&8on=jh?}p zzCuP!b9$L)4dS!DhOU0__r>v5V8#0|ysxzBrF}L7FY7XFxxaNB2S4?O`TEA-vyL%F zI#KWAF&umP!M9>ZXrGPavk?3GNNh*QlIdM2mBwckcd2ird;x1Y`Rrpu98%MtjhClC zjVqIMNnl>^^of7BhMW=q)D@I3V6Y&cE$tD)HT~IGSbt^guyf7Qt15r5GXC4wQ0(yF zwuS}N9lnXr=1r6d44wXLtga#-mU>-!u;Pr{q=DNM!`nBH@&*1zr7?;j<>e|r!4&BR z?iC5`3@s%ke*k;RWNZi&N%gMjt`s!R+xzwXKUYGblm(CL#OuO1{hA8T$UeqqbgNR< zuvCAR<=<8cW9_3M<#Z|8k?tzS;Vj|d*@(##n+{=2S2WbAG*naqu9fx3&0J~)-gjgN zCYFgQ(0;s;3A?*Wz?@=>6r7pHRt1rf1+NQTuG&^d>+EmN7K9_Y0CQJ~gxGFs;^&dE zuU4)y&hHeU`)ld^SZqJ-AZD&hxMM%i0Bhtq%u!u9=~iroAR)_FSeG!Q_dW-E5ASXmPhFjc4Z5d_9GomFNA=F#SV6-^DoiqWX^%s1K7xU%b40 z487-e7-kW9@ghHTL?Qs-#J_3?e}a_P4j8>&@i7-qq%7J=rN{S~XWBweumMv_u#ZVE zxx}v&O=!aL)f@vDu^I!8hJLj`k3`@=b9Myyz(lXOxLtlF?bz`8`VQi9jMYXb(r(}E z9XOZoo-?jiqMS?l1;;l3836YB&Y^fRIt|YLd3^5?ekgH7!%?g6-hGkLYMG#3`AIDn zv6@8LJ!F^>u;K_5aa(%)?auJ3<<%_fqMdUE-UIkr+w;;pRHx7WGfr%mNms2tm0Sf$8!}yO-XiXUk2#t@ADDX{1j{Of6FU0v?`d$=&3#Ef zi(Pv{J$I~hhVnNVh-ASd%_df?t9fRItr*k6o$0vl$x1sPbmV;aYV2j8{91Uy>~<#W zw+~JjLCu8^k||Lrs>H?=VYrF*Whnzl+8KF5Rp$KDTEZFcx21TFy``X{9pb0Sbj-Ld^wlC{M2e!(6OEvgoasQ04xDw`;lOsblD2DlQV4YZV+6q+V};;DSre%NQp_0H3hbeVg+;-}0wV ztL7|{+50qYRz%Yl?~lM(^b(p&HK4Dom%r~0Uk)$vYqsMf15bBcxoRMJq^EXZSUpGg z*5MAhpBM7mt+w^@izXqj-naV;mbQ^`u!1JHQeXEh zn%)JNx@|D+&Li&_rp+a9J}gGS$i&c5%KE(v^u6oP5gZ&$#wUEg`aneSeW7HanD}*P z3^}Xc!lD7mZRN^2HQ+u@?XF54GP^+##wn6wYIqZJe6-K7fQ1|p|7jSpJV?ut;Yvj@*c@_oo2TP z$B~qh-7#k)bkCz94=z=(XFev8q>DQ?luL z8X19+6P%&6yT_`a5WqXHV>Zo7IKy2o*1i4wKIPW>YRx)4S1jK(Cn#C|*XKo}m~eLF zc%lu5@(xUtdPP4k-}DLeMs==t2Cq$IWuddRjhFK-%C>mW8n8{gC0XlgZ~E{0dzf8u z+cHg)t-dtSCh4(QP%=B4pq>h;3JPf)d|Oz*`&HdhbD=c?0%{(Yw+wWE{tUCuSyT7? ziXyZ5LVHZ?9XWyNMWUy#gc1r_idJdw2s&=h84A?f*#Pa>cQ@;*VL{#{quPK$|iB+I|w^N1lQ`zx$xe5tQUR7Au85@NBJBI0Iyf9z`;G%i@> zSyzfTRI=95rI?!b}>0;cuuG z#r5o$Si%y?-$BIM>wSvObIZ1_-($US>c{pn4zMaEk}sTP6Rv^=)xc;|nh_~9iwppn zdvLgI9N3B`4EJ-Zp|hOL5?(WnZ|QG1y?61nfQeNX@BG;Dj;9gjot*{Wo#zb<6om?> z(EXzWkcBdMNhIC^9f=SV`|T*Eby;8w?-<-h0J zb7#-FCt`U^;|hZ6!N<;-sfE^(~coZ{s1Xh$i5z6QfQ@6gTmOz--_9 zW*dP(S^sn=?&~I0Oi7-zXY^iCFG^tP{!cJb;{!58`#$Cex^q?)ty#2Z+dMJ3v3GMk zffPP>Z@waIbVD8X>3Q-z4)JH@g9b`@a z=c(y8!%p77+ZG;8W}99CUU6c&J{AudQk}{yzZ!Zm5?{a+MZkYvVton=v>pn51y{Hc z#bYwkrdhr?Om7B=y~d!*OJ4&=lBm) z*&S8Mh`ZQQRZJh!F;;s4h1TaMKX&|{^2orLM)w6*X1FZgcS>-Y3zo%EVis(#k|Dx{ zXSy3UQnUXrOvgCO>yjP=95dV;Y$xDof(brm# zbrFNb`mc>#Ly=Pt*6&)Q=>}Usk?A_mhq^0mHkzco0w&whcYGo3?U0J3AqKxFkWWcF zu-5@M@RPdBd)k>PoBVd!SAJqy2!Mc&`Ltu--ly<|;I57bLuMEO0c>RKhxMomZY8tN zC9hy=tDt^*NJiv0fMjtz&`R4}c(ppY_ZD9fDJxl9TPGY>*Vev>0!sXye1DFje9fV7 z|3H~+p_Q;UQ3UhNI9xHuXTBJIV=b9{g|ChOVC=S@$9p(pceZi8i}5XwL5r@G^Qd%2 zfhfQ2vPX}?9Ettc-Vm>+v>Bp(;uS>+A%<0ZXPRL@;%8F_%1meusE#-w)9;mUC=1{_ zfA(?~YX=4!Ed7zM?-cbvC@FK`&F@_Cg6s7Jh}VsW5_pzW9oicm9?nZf(n42N6Jref zKX1N$HHtIe`jitCvI;VaJ6k#c4zEH0vq{GhUTuFl0Md`gvi^)o9qzSib@L1Zp;Dq_ksew8+wVXz$p1b%q!Xej$u zqSSQQNh2px{rIHIjO^Oac`4q>X>;xPv^DPBfSjth=gQsfe+OfJK8&{fK`xjpeVZ%T z&~)9dlmL^zQjy@?xjOY#9umd%dzFCsdRc6+A||kb1F=^O4%KU$`paaN)0TrRds`cr ztQ|g_177;P&mu=O`L|o+I}Jo$H6>Z{CT!((H!&So4XA3Ox2;JS#(c!H;&N&#|IKJumxHe+L0_mwVfk{Ld90*)>8zPSQwyx>L8ha$v-?;9 zH883D zh>D*fXRVq1g)1vL1R(fzMNt=rle1Lk`y^bVO?yk}*!OK}PJJ{#=VWK0c<@UC{ykr^ zUdjmwOcELPC$#}db_{;{rh?P3{^#w4;eb1YNLV89GqiRP+;{u9AJShd*Ir3AW)k=* z%QX`z`JX}oT~_5ebYL|`T))2V_OL2&)HWl-)1uk4dcRAgCb6yLx(jDm4LRjCgacz% zjqK4s{a8x(^KBS^ z_}RLA5tq+zK_ofgzvPBLN2{L=+am8#D6UmxSh9pU@Dyol4CO#nr=i%>6*0KR$tpQH zx888ZcMi%>;ZKEH&4}cTg9syf2>azY?)(?cE#@Nw3~2Tm+Cq)!{eWhLwB7fp2K!9= zNdN&4fXxkDD}VBY%#l`!`RLG^pD|`5xn#Vv@~DVeA+Hp7jze;kDDsZW{Y*W|6}(Sz zoA{A~kx9pm+fOsGB?xJ5>sbDFdy!iW$Vkr<9P`wK_bpp*EZP>+VCP681=lu0k@%p~ z@E~FV?dl*7XR!XdW(K;r7BA2#{-#)%a^MP=sc#Gt!{jf0RV#ohdf=MgUo9ps=tQ#BQ2k zdz{j(y`mU`Fj;cLiT5IgC>+^74q*IZ@#W=b5`P%}V9p6luD;ou&d1DRlShMrfeVbo zn!LUHo`%2qy<>;boN#@%f(pP1%xzd;-P^Dl+Z}}&%C{$iEFL=4uhM|y!u%q2w4-g3 z^v}L0%i+&KW^y6JvSX~HpzXRZn(uK-?7wL2$93%j7tOZ!o$lPcMc71Hxp6 zM;afZC>z9U^G|?vc>b}Ri%EOVEL@q2_C0%fj^77c^DA#`x#{`c9;4H)y|7rlWlJ-? z(WYO%0CChY)Oqvqc%vKgNBb`!j;t6q$T5{5Go0N9S`7$T9yQfRKYdW?{QjMS!I~m$ zm!^j8RvW`DSe5<6L%t#B)j}ezqN=I^vIM`BlvMu!9qkN}zr6+M(;2$t743}!&LW!F z8LQDghw_y&e>txW>U8OOOEue+3&Kk;HnwEOzq^2c=Nxyaof>MIVU?UKl~zx$8?pNT z8(a;P{Ik~J%s9^%a8=11+D|(9aU2uu<2|T=O$>I)>{i`BpYa%hR9>y?n~}IP;F{Av z;ulk)81%0>_~edX4buO3Oa<0cgA^x)?^M{vhz-B?`lC4|GcH98#vHR=eA-?Ac`yrj z@lFX%DJo6{5O+3isiLR`^J2R=k%6cmACLWlS04=niC5`;g&irzXl`KSKpYd6~w9f^H&1GI?;k02ypq@tt|1 zOl(5@sF57OSjI-fdq?b+W5}6`iVFQI78}~ikh5333hyNx;zot+@#_5ePJi1J4gtz{ zj_H=ND~7m#Zmxt*+#0wVz1#LWj?LMzn1ZMKrQ_j7sJ+D?0*LQI(Oa{`>!;V~k>MF7 zCF~(Rj!p>OCHg?>{lFpIifuW0^`jzXMOm-^pJ3Olj{6=vz%=EZzli%H!l_tI4opbS zGa2^EGkjWjV)O=jBiRKU^l~j^NdP@*(cW6mv>Gmdvw>>s9dJXO=9KVEE;`_Scv4OR z@XOV2?e|=_V=|@H$7{Q;s@Xeog-N{^m=RmZkO~MN*IkuR>vfrPOkX28fS-#(fT@9ah0I$I5X&}dX5s`J zF(|3~#NMbz|Ff%U5)t8#~`uyt?P z)UPscWZwxEFT_HU*M4fwIWT*UY0i5*u0YdQ=;2?Y^KCre$EAHm&fGB9;*b&-XMbJV zF1NE-$vtH-wrJZ%yTPC&>IAYy7*o;-ce78jLZ*h9-ka@u2zDU%PrAx2g*Nq=J zY;YdICp(LMF9F&_=5Gc`V_X(s+oi`lDgX;_tzWa(t#LoAX{<`jd6Ty!yeZKg!iD?A{d$SXyJ!;=x8$EG=Xh{t41{!`NnPVz@d7Wrz?M)}C z4s=7LdTyU|+7>7U*L)zlmj*lXu7+dVl=7s2W~m;Dz*4pB3;#w*yA;yr79*eK`Pczs z_tMNdp(Qt>Bk~?|{8GL*6?Ay+>ik=eVe=2qo>R12P3;buEWZ1GowMJ|EA9_%UY_k% zoKr!7+59;Ff_(VOt=+@{%%WrY?@+RG%$K@--VhS|c+d2_$|?TJtvU2o2B(Nrzsa5Q zBDMcZ6uEt@>FkPMlj_1j$yOIe2HwP%o;EbAA50c`kn#q3P8x`hM>$UM25z-KEk`>x zn}o0eSFO#$rXwxZ8sh&wM>wd_*fG`8704;9)|(gYMt;5~A|fIsYPsgcb)84Nes%f4 z;rG{-gW*SLjC$zQyPdBQ$|Y&m-lK6fkc~{)a?-KbfP%s|^j~Pfpj_s@>DVX`D{AHM z7%%0XS-m&doq%+l*>zt}9siuJl?w{VTh7qQSY$}RImIhr#3Es%TY9orR^**Eyohl% z^Rx9gVNB?EW){Wu7R4=zn;(>Bszf4f*N@-_&344Q{jJN|pyVhGaod#mS`#?1nvx$C zpOnKGt&N3d;O%4j@DuU{o`2Cyv>~BHd|LkQC*_!gf0!Lhu&plK&uFBgT7OqIg$-+R zM$eu{lsoBtCAU4G=I+{=?FK_3q;9%(&r)LAtQ*1>5uPf@N_Y;Uha8ym|p znaSbC^ePqPJGMk|q>bGtn^o16O)TF!(BfLWi0}oOWq**lPL&r+%XiM*LW_5N@WNm3 zZhJvXDxYb>w3=kRxJ@m)^3rcwT3+Zem`J8;Bb&8R`ZM7e1Jj#M<`x!ilXU-dk&zA) zcRQROVgU2O*SDSoY|UR}-dvVxW@Xv^u@*&ITTJV~wDVB$!CsK!dgTweGFyA0p*>PY zCZ%hCLu&9nnV$~~d77`upW&s>@A=5bs#Fj@>#TPhxudWn2?)Wa@LVH zp{0cmsHrnn_exeUE%W(3-jN2VxOs!cZ@0BUVrU3JyUKY7bvwfEdYZ&{8RL;+kNR^6 z9&?~M=>M$%FN59RX$9DU)G(J?*RiTatWxcNRrfFC+BD-GP=gc$4!6cNnrM_=U$Fn> zt-L?LAC0)dIR%AuWn>?#BegT1}8D~IBam4sUM__Ns zT3P&y1Rb80Wj54f6rd-XBNBccmHFzyYJ*YKdL>?-eH{-UnuMxW3}FhG24aY80$>5#^3>GXwOEc<{Pmub%GpCd1P zrt~e2btH9qF`r^6Y-1JFV6z^BE91u{bF6On zJ)8^lV-9?~f@lLQU)g&g1Tb#uy|ub%4L|=g7>+dvrwI{m{8vps+PAfbw;yXGDj@ov zWj7yU8k{PbI~Par;g>eM8(JrnyTE9((tKR}EN&YR8_t|Nmj$ zcHPBnx74#%k-^(`zlQtL-;h$Qb9mQg(!TTzK%re6YI9Y2G>`CZBMI>%KT6V8$d4Cp zgVo+oj2hxcGyQjHd}Qp$ncq+t3YxbRYUv-p?`I^VT4J6WV?sBn|8t-FQVg~4TUKTB z8lw@N2wM^hr#rg;G~?v8_<1{o3^Hv;%qJ@|c>_c3z(UxBo4q+3YdB#(6Gy^#I_^eea^;hfF=FNfQUO`eAF3^w&w)%4BYxUz6*`536TI_|9A z-H`0*w^PsN>wS9?GLIj_c>~iPubuV-zVal`){oyuODb#&5YJ~P&Pt>%jfu!RCst); z4%1*Oz>OL3{7atVit79bf}i|3(S}aVzmfCrTsg%U0(MwXFEz;Fx`Oh2!*HdI#8da2 zS;Qj(|F*H}KsL@QcvuCSPtM->-H_;+O~5ckKDn)WUC~! zN(Gg40CE;Uk>b{w?W|?#duh>8X&6rUM9}lAwAkR58L*7#9kb?8ET&)fU(Q=`LFGV2 zDqBCEq-C&8WP3`K=)}s$JMZEO_o2GYxYRhbNac*kYfR7(GU#_j1!w5v^8-rre#Nfc z!Hw$h*?X41QSsZ(eY}@%+}MMwj74{?85bzNmAf6CU4)c%IKApVv4?71FkWf);P}h+ zk5amtJ?iK*5v1od+P_|CUQ*U7o}Kc2pQPjcKS+8J|C4LAxq+N+!WPAa7(%jEFxp?k z<-&XxWZ~>N&YiU%3z<=vNa@fz&?vTF;i;HRN)LmzvC{u_6adp9PM7yLXL*yBC9!#3 zwVAAe5_H}rfy?q!PIVdHKYGX$y(ry;073{qFA`;+%YTkTJxdR~QQL(Q2Qd!i@TJe$ z-#L$wIi!rP#)q1FU@H$~?li7&^hS58Ax84WHLr2Hd;*73XXj%BR%L1D?DxroQ&7&@ z_9Lrv@qluSphk(~k06xPw6wLghxA8o+SDauJbS~{?Tf|}wtBcFa?M%g_+!%Y_Ycc- zsdMhn;eE_%yFh*r-1uNP@}72#F@ZM!S;iexMJQx>$&+FF3Mlvz>Qi{|UJhy~$S{CiNl?@ zNX-)i2F#B`5Q(0yI60x+XtCe*_-E}qxrQ_w-79j3GF2V^0mi${ZK4>Z`Z* zj@<`~Bl@6c|IG?pq}d`@So;V2hSD6UU?0AybOG*Bv9CHi%~<}M>Fk?J50Kn}ZndCb z<;2*HM|5pu5PDIin5)=`&9ZW!moi{^0u?UnVKeAu;p)m=iyW z;O~MBWRozw;n?fOLv>=3 zt3YyhEi&vmjxJg2xknOor#_c9@~Rn@>>KiU$1$CT(#^8OG5UI1$eXrV^qH`v3YV8Z zrIL(KE=A?U&p%Ue{AuE8#IGA z+X82(bjRX3)cv$vKvK(|0~}rGT8%-VOWGAs=+pr3BlnEjZ`vN?Zwmirk`id2K#2m& zVkk~Tp_d6}nW61&&vV+hlD~D382o|Q4q9x=z(uxdGkXZN>TpXP5BJxj@5Z#q9U#aG z{Fc?`m&NO*_r3HXj{R2&s?E-0M}=m@au(gpFD$LVA@yR`9;Lm&tTpiHN$IB^Q9ZgL zcI_FHdm@d(3^eaQAb)yALu8+^6e@qsz#b@q63miP;<-|nWXthoHi`akPxP|km zk){cuFAFz$QZeU04-xS1Y6dI7^?4oClf`g?y!&r9I_kIoc|$LPgH)8dQGGN3?VTic z+b_kzOj#pa!p_d#*%M29`~QOYV*&j+yyjDujkkZU*Ya}0zd)ysE|D#eM9Tv|KfgL| zLaNu#p(QIyf)S$uQ``**Zj;ZHm!#KN zo+LN40=mIk=>}$C z@y4J}hVvziRV7xX8(ap066!NvRq&gAr!a9*bQQibTCq+TT2T zYFFAM4Sp(&T5qBU8}P2BTyFY!BP0(9$NsU#XnVTY14UE;IuBHJdnoGfksqe5Ti8e zog~a2o-_v&CtG>^d-56XNJ1N|=%?J6KgoiE13`Fmes&+C-M0qV;fOnn_EEEGW5&r{+_bd7ix=t1PTl+gF2M+sO07pWL6n(Exbn*Po z8ze)YJ^n>qZc7nW5 zyST)`mYqZt>hi+47hoW%fgKs+#Jc+D0w~H5;82HkwIuV5%!(o464|@>offnw<0YJY z$028Glf`32!f(c1r~=6_6<7jk*HT8cLMIk*k;B|z1j@z`#8jBfN^70JmUj9Ol5ECXCf;*lpT0!sq`)by^|WcCn80_cqz(bh)()d7 z1vru@*m+Kf3!zTm0Xa@1j9ZppP*4N9g9fgHXust;?0&)raGpSUa?}>HL!1lynldhU zYvvy4D0$%BzkeUthz;oHHM*A2I>A=nQtWvCSumI|Hv<_ z&@E8%+II`=vdPhn^lA)$3cC@x)%71nE*7UZLPNoc0%qgpGYH|e6eY}=sRR-)J`?}~ zLv@6$9iq;GS)f4x?!eC+PwSSVdKrZhN}SL_(+5g1qMjHLo(e2Vcl4fX9*SXT-OKlO zM14LL^~DsetAzFrm}@m>bT34Qyw8ioSj%PsLlL0Y!!X95VE@`87qy-%B|cV{XQezY zXCytvU=2pKDQQpV&h-lhvQ2=(2{53CKsS#a+0N~$LW+FAL$t)Sg@bkhDXq7&&A%0B z*ih$#S}oz`eZPlZf@Px(|L`8MC}~GX%70Ot_Hzs(c=JaRmLbz`&WksHiiGC_MzD%$ z`Q!Z&IHq#susyvFq+SLRFGu&14(lOsp|#M9(+%uI$Hmf=1vugsZ%5}8&=ZFs@}q_7 z;AN-!{mVIJ>c09H^m$uihBApsfoc0B+wI(NJz# zA*8rVa+;E~;=#iy`{11+f!%N3-B|aXLc-@S(AwNo;@qiZ0s!aUc44PKZ*vn=m7l0A zJZDALAp%<75zbJP4RTlG`%VJeLF;q?N#fh(^%7`Go{)6mL&x^x%Em4icNCxZ2 zD_Xas1xdzYNf&9oc#&(E6IX*_+$RI2r8(acxv32Ph~^(?8M_FXsB6cAbFo4tb>XM) zzrk$p%d5hz=ZcBv5sb*={(Gr^oEd*S??&E+xwPl4BWETq!#aujyu!0~;Nz0&)@(*q zWS`Jp2L|OVG2{4oqV}~3g1C4B%aXLB94>X@@TAWMSWe>|w?%ip!05{AZ(S8>z>fiA zF1tI}L9t|Jxt#$J7|=wSb>Dn7f`tOZgVgg&Mdp=nP%~966TqK4zOTHEfD3hu{FswB zMeg`>Kny1w07%9Dk4vXd32ycT5Vf*J&t#~*ugG8blKi!1w+OC(~R_z)D09R4>5C6-mF+Kyq;9VDC~`8IY&UvLvVO-Q6E~Ph5(aRBBOhL zWOY%0kQ2$cN57a8a#nX$RCS5mZD}Gjlu?sBNltBs(Dwb_pN;eP2RK25CmcXPTA>@9 z%q=voG$vZGmSt8YKZ?BDeq319GDE_F4lHW9#W~NCt5b>JEN)`jQm6o>&(i@yF8Y^jd+>ArK(uP{%8{`+B&n zY0mLvwiQlq3;Ez0E&$1C?eQx34xYj@jDXV_Evl)6fJ67tuA=-i^SIsaqZf@axc4M{ zjx9zr79BWjT7MPU>WB*<3Q{b-g96Vlw4i&RwNva5jT~@r?goigB8Nie7JJS1`$TVH zNEKp15v-wy=jAN|XmN+v(oa|$6yYB*Z^k{D5WrR)Zju29YksW-BUKB4njg@SgI3Bf zN>4p#rn5YVjjBtNN9iGUKZCNc6^VS~wj2^d_51sqa|nZ~LbQ0U&pL~Hp@D|O=iea- zWE3myaRWu6-I(-!Agt0fPGyDL+oFK8hN;`oQsI!NRL0R94ZHzPM!+}amHdw;{RV*Z z-(_T*lQj27i4c_oPmpP8Feh4|s%Vn_=>-kEuO^Ha{e%r)eB zebeSl@3z*vhYvs9E9Ei5{%-K1_$npJglFt9kH=w>@i18g5>6(j{j(GD?LN7h#;+3wD+2|7HP@5^nh8E zOvU#hVU_l`KiC7=|5cnj>ohrv%Fh%$`I`jXjY{E3%g}O8<)IzsPrJ|*Ywx(2Wi6@; zn&5s%Piz`D&N4}maPy2L_00UvHb#Cb@rt*1GS*dj2PQ{qwb$jk)d;dnIUB^8ze(PaPu&eZUAI{ro zOUraf0LS2pPqCVs`|bxN=b-ZwC7lQMOKU$<05SzlzhT(<(mEz)(mfay#L)N%sHH7{ zFVad4Uvd!<*0ugif6X}PF4*WW5*i&a;;fGT>~isH4h*CZ#o9L*Y@esu%thM*L8#eB~-Z#Y~O$2 zR57yw-LWvif7^?+o z^XF0l*hG?xzYUe9UV^`0)dMS0c(q)DW(txCLb2OEa+G@h!v1$0?zqfRr+>bYKLke9 zL~EAV(0=@t?8jk^25M+SpYv}d?)?7|iKEZqnM2D*$rCn^TrH8chxS@ZP+?G8_gr9* z%CO~T{J#@1xU#+L<4mF_0z+fsudB7iW*o`GIDB6NS9wzot-{U)$E1U9A~Z57*dK*N z+ZbX!B5+L-a)i1*5$*Bbp^5;@X~ooNfrPo|+R zo_>Ww#nT&J&cK3Jj|fyRD#0@R$z zNi!$51ZEE`ETk4Nly;TID~7=7S0SW>p;RMqUE#msIxe5?X4W#qv>y=KLso&^u`bE4 zF zERWH~c(sGv;KoS6f?GWCQP8c$(XnC5*cTuo3enLC; z14eX2LnCn);lkARZ9*RWZxrvx(1G+f=Jr5#k8<;}vzDu$SoNid;6!q7Y#gER+RL}-|um6LGRgGSV{flwAxL6wT1 zs2s)9oejN>lGG3ca*1#V*G7qPQx_XFSNP$?(79N4SrHK5m!CSxqxWVC zQ`V}WFS_p6avq+;?YkZd6ZO^ocQ4`b?^fe~Y0!9hx|^kGKdPINm;m!VvFKpv7wMu; z&k1|gqR376;mOH_M1AlsH``xRo7wm3OxSYqJI$!^CS1@G;)1L>JsBx3=vfG1RZ}$> zY)byA!9WEPReTbBXe`{91Cux>@vLX&u~2cuEdBHiR~17jN(<6lpvjBxZ(8Sh+dI4S z0#ey(0L=qiDlSuKweMSOA1}qbZ9Vj981#;6uG4Y)sL_UFTK%@m4TJT-me*BBZ*bjzcVXg*FOr_ z9g^frdXV%wYJ;&XyX&r#c^`U{k+=pK=GO7lT!F}LU(3y_jox3lwgs*m{zYn#fTvVq z)JWY1c4vE{=f~xJCUD=?)@H?7 z4~POCdk#}_ml@&QLchz6=p+s=x$Rh3&SY(T2r_AUw`?_*_SShc4M3^xuL@Rez}a4q zBX8b7sL1*oQUD95JepmRWAWfP%3lL57c;zbIEeMTzlg=$;dhbvdBb}|r(C5%3^MiO zoNWYW9mssSu}OUpBIbu{%sxq&8mP{Zxv>RYm>b|OZi;c38x9~QK68D?$?+Vb$wr#) z_5D!3Yc>u>x$eDRM=me44Eg!br_m+f%#Ak7f)j=AHyA2`Q4Z9cM3){-h1*Y z80crw>-=>0yjW23%zyBC{wcU0bx_I*W?r$S#=>7EM)aoHK<)3t+hcs|oz*}k`T&_j z&6BNJ6{Ihpux*BazIr(IGTMD!K_Br$5W454jr|eF9t1|RKQRlZ<^k;fsd#>vo~|Uv6drAQMr%3o8@}mhE+Lc zgGR~QpunZsYve#uSdGe^ZvEXYW7tNkMc&a)=u9mrV@u~dFK_z13qWwn%eCTpkrVgd zwG0a97DuLNf`|ozdYb9fScQE0H%nYIYOtj7`8%yOr4j2id9WG9}ac?l&b!TQll>c@S z?S09%6%L9ai{!=>uvYd@#}Mt@H%RM7Uugpx9$a@20V>!`-N8!}3J+Z&h2$_~f5I^m z)I3A+n#hRrylQIsh1A*(;{E@raY2TW2rz(xdduhc$$C3}@qoq4mpg`$fD~;@Xas}; zU^I-X4)iPz*Y1OQ8lpv;Oj{XDc!&fyZ(MH2QMEAc4V)?KAR05-^>FRvm{ibBRHgnz zZmnq9Ndunav}kjSKL=3{BYN$l#n4Y$s zL{2CC#GMwQEeC8Bu}ka*Ep=kBC()zKiIA0)RH1m)e*njPAwYKC*hroj$u5SVJ{qcZ zZodr@kxq%9syq4r9XD3{H3iAL{<69+9KZ#imaq-RwlvPQLCA9jDz!e>A44iPm!3OgkkiadzqPI-XVu8lKF} zvVsV@h+nG9Hreb5s=Ifsku(vpChbjbxz!0IcM#!mhYD&XFGwRdCHn}kG z|Jx9VFiQDC;0G!Z(&@8U0eGdzzYg%cm*qB|=fs7U@Z~Y>4Y+Q7%{lSiwU^%veo&;A zwTBQQWyI^-`{K7uUUhx>hh5J1M`)Jk_t^IF2~gtg0Idxnpoq;BzTwXq%V>SDqonOd zd2%v$&fXNQFTEbVR01AOhF=XrmuDf|qqO{rJ|32BZ@k#kbAL!Bbh9nkDHt`uyBP%? z)-YFmP|shY2Bn8(Dly9SLVuYadfYm^{kS=|sxott?Dv|@j`PHZIaw4ZKoMy)zcv7g ziHj(XR6Dsc?`}Dt(eEI-x72sm$ZG(W)yU}wx?mPLs*#pn+hT72q!lUCHrJ0KjG4xh zQYSxgxM#Pwf*tUuY>#NO;)~uK5!1Qlacgs;llhic=$!hiC?UAOkuDv&hxVZo{5FR& z3~HWfvnp3)YsDFN-A+uqQdE4ltB~u(O&T%FSK&AuQNz;rwC-kwbp%F8d);kLxiY1z zXLZUB1{Q9;rzx|=bNJNhLb^8v13t0$o`rCmUu_52sg??n*w*fG5Mflir#>GMw1 zT}INNdvsHHjYAhmw!-M?Eb^AiS!teV*ISpY8{-h(g_?@{&r?2x)`7qhuV~ZZ`s0&< zeva}AH;u(PqMd~+C6AOBU%BHAO+P(!QdczUj)S!%t{9Hs<24`KgVHyO%meyaUJiw- zSr#NXHv>Okr?)fXT4ICpHJu95l^_Wr44~o;rE0=A9156>3^cQO)c~lg{j@3AJ#oUzW< zjno5tgHT=xJ!bbj4hV%2)uk^=bLdU`6k>j>TReJH5_CCfX&rAhr1E4q(ZO|(G@5g_ zRqN2)21CFt+=`uv=Iyl0!waZ1q18y#CNev)qyRk-ErZ zs(BB%OvBR2v5DrX|ICi)4XJNKy3Ptm5TjdSPY*4ib|BOXFDd^TbUvQ;f&U@J!@#>2 z-;pQSLY2XFX8Q*#7D6F>MQ*2^R!X^r|4A;U0zygr`2n(E+z)m_+C(L0tre{t3qW!o z{Aw*X7Y(TkxPt|&OSEjK_KChFMT}%~hyO-#UGcz`ruX`{CHnuV0P+9A?4-)`2d(~p zG|WCBKT2oA|9=~r?ONaMvS9-$#Rc-%OsTa zA9p*&U3tW+X<;Fftij%WqhTQE;S0_KzhAxHC;!4Tu}7vSp-1w?`1oD7@F)K+`3e=$&Zenmu?n=0^MxZ>(FkrZiul=3B%kN2AjYZ?w2L{boP&?@75LmC zRXRSk67_~f)bCZ*N-7HAfWQC}_4L<(7*?)e6g9nbkg&dPp#`e&7LesubfjgY4_vi6 z%ukto_Ke34p;HQ}VsKeW`)QKMVtjFo;e~sDo&&#&(RP^Zil*r{q6i3tF>wHMRhqBu z;CW+vL8l*WOSdpCs)9@?^EiplHdDk2uAE!XQ`d&_eajZi3gCEhOD|+8?aO!}9ci0`wsvcx(jjGyvOcLls7`L zx?FwxnFBLc()~OZvgl4q&3wws`DHV9>jx1^*Lbz%lr=~Y1)!f0<({|4_-~PUR0qLo zz~r_)(%`X~$1RaJP7_)#eKh;>kt)IF6x9WmHHSH8=N1p0J59>vqVg36-BZwg=_Ul_&adZUI5KDwDnDN9LDP zW+N6lJ1puwO2*zV@OXnn-2@QvE$+wQ);VHGKFj zrOM6?QO14Q;X36%6Z@da=Gy1K<}dy_AmK-7(Wx+{5RM680#1~=x!&sj&J z)p^U?9i#ubKc63}hXxIITd(waI&LzI`z3kLOhYNOb2@YpkerpXIb^lam z|6FEGco2+2%h;47Ht;_t9ol4wn1pxKNsM3HCKkvOw94V_k?IX2h>Gu}VANAtF#Ux4 zN&Tfe`2%|rPt+QO`=)`inIZi9NLuE?G0np}yV+Q+ZSVNr>wi#lyw)%X-y*n=3on zVD~6;?u%~KESPbr$v@*4x~NF8H5i&o9tV#ya8~$6-l03MpVn^c3JK~YEn-{S+%7D& zA#6)ssXqR3WVB|l@sNk4zZ728;7wY`343z~jCIvRw`Gl?DuI$xby^4E8Jb@V(%IV9 zbn<(AM~guG!N`_27>M3gN4@akcff&Uue8a^xpNDtUn^!bU21vC{>kF~H8&p3eK!G> z-p|dkJl?m)NcH^%Oi3*@x{K`lg}8{fRqn=H?sBM2jJ`oTw#N&M(Np=+H9vD>tqaa( zTQ;by->moCvJHL!tasPXl^$=cj_f?(1k%a5D)%J!H(uYLS4aK4KosOu=Zy{e{Qi8l zeEa*@oV)F{acjBsC&Ts!yXB`Z8Fe_=DxcA8i|SRn_*Mi!d4M7eIKuQkI^;;~ z__4O}0g$)FFTK(Jw{l}zt>i#{W6F`0`G?*#yDV5x*2IrQ?$!g0RC1Cn2)ol_z2MD( z+y{D_eoQ)a1m~WFw(EzHh(t#30-n3h#iq)tiuK%0+@?3JPanAddusf?EZ3dq6>`sx z4xS!;^$mgg0FH_10H5qesl(tp+hn?*k5B0fszhF7Ue5JExHaFgt8hQdh2|D{%THS4 zYDybpQ%uS|h2}=4jFjs*8kI}tqxS;+n{AI%%Dd1NU7k~ckv6u#4MRp!68q2wY~axK zO7+$8(Juod_djNNXu_7aU5a{NdG3{vTe$M0H-{e{0`v1|L~#C#WjX5OhJ)Q;*S<=> znSR{p)6wJGKbu5iP-@$7wu4U8am|SzC5`QPxN9$SEjwO*_Zjy3bkfvF_RaAgcg)Qk zo-*}l`~Q&k-tk!X@B4T|nHg8aT}t+aA_^hv;-f8L+(@9}*+et-7L<$8I}^E}SuI8J+4-i=p#yD$eI&ziei6n08Y z7(L6`CP)6Yq5rfe6Zkkp@P8_9!eiw38 zoK!wSw)8&Gx&_m}f?4ML5U5_SSwt`A(JrH`n>?NyqkL%XdsL@5GZ(>>V>b5A6z8rB zL*wUT)Ow#|XP3=wX69RGps>`)H3&KtOTgT7^u|#FpDIUSnesuwyU8$zfW$gX!X4Zd zmW>?U;AHrS@cD`Qd(vZjtewI1kte3ag3nsm$Q{NO(6Sp^*i z_cC|ZHhQX`sq0rxI6$}DA22><++EU>Nnay zb}-R&iiEB7>uPRzY&SbBZ8^_7LJ>VE&hdp$zug7ZdN}Vjb8cX01lHA~*5lRkQG@DDj zhuSk+n$dwsEh#^X)`Scp^;s=C-F?t`V<3Gr870jW)g{A5_3SJ3CA{nx`D|1+I#*JB zwD7t6c6WU2p}NQ|gXP`|HKSwqP%g9%1BO-?SCu+!V~mX$*PRRwK+%FOp<~+YJm;rd zzOSK$q1e++o4$DEsk*ZiTO!|qHqCRU`UeMl8w*|XT-o3Bvgioeu6)p72)R$T2Tch} z3fcuZ^5_;C?2MxBzo-2X(uo-&QQM9Awfxvywq>pLRn zZPt0gQ-AoY1h+TmjJcUW{#tKg_37(GC$Z#LA@*u5YMqocFlpVI%6324Z_iBcL2njgZ^Lz#mP|T3EgB21m4Op3r`8t{YX{&QXCm#GleJi|g%LL-BWyb4>%{3?PC$ym;=CrYou#!shaCxCN08n(5ow7hc&GsCJ zGb~ZYV$_GGva`|D*!up#{^eU_UNkoAa_>JYDw(=AaHd=76;8nO-rSmWu5KMU6Q(hb zKDjgpD37^&%^Vua70G`TTY>s2qwx*e{gw;AD)v9enE0$j#doZg6yg_ZW=UspXMGlY z2efzAoQO*N;G%F*s8^74TtMi0)E9Q2lJ#fn$<$n#K??KeP`@OOney0yp$Zh&196`| zbYL~(@%`wRuENwjc_-p_*@Y%UBwDbqRHGEeX-1^eOc;mAbn5IdB!2&dKbK9bvYkov z(E-w(zVjM=_l_0#CM*sd5PH$DtJ@L!QB$6{1!f1KCgRQwO9r3#`VF}1zb!OecLhwN zNBEZ8;&_4yl{Im{x_R=JX}jR{D!H31M)@6fpYYE;IM1$T5N#kx@4fzXRQ%3J=ipzS$LQghDl1tRW9bWoYV0`kL64BIB z1C88-H8fbmj%`nUJpjv#i6o8``L<9`9n#Bd%;_;nhoPZ2FBPq?O*lK{z6bs}8hZ*s z<*E8GbX_``N`|YzT2BdWV00vZYH-LC#s0~9sKqNxUJDOXYqwphmuIaH2@xZ`9OOrsXkp99ZNHuANmHG3(Az&|Gl|5bZT*p~d*1EpgsQ7+6|ufNsWhPE z-v1k_EsAytENhXnQKik=?9*ld)U@(;@?wcP1=$rJb&Ys_!BPwoaM!L2UiU-^C=`h< z!4bbXMKrztvOIx+R7CAj`&7zWkdB{2xKdqAZ2vfG*b6aBS7UsvZfL@s&IdkR7W zlVIWX7ZpVe4$#eywDS^%-g{KP+yL^|5qm<$)mXDn=3k>FL@rPo&5WeYP@~+MAUB&% zdNXq)R2(T&&b^8C!jR~946L3bir2z=b&PiJsD2TcyULkF)PP?Dy;kE&W!H>RqMHP= zP6zb|mIPa={`bGvyxiZ=>hxc2mtzG(=Co?#F}Gep^Sv~sxVfALFPd`B(8#Vz6S|CG zXl(tyx0kNUac#JH9K)ssEha;}T2_}bMj!5vBskA#t1)G!6be?;x&63w6Ydk9uSX9T z85-k`Mu=s%SRauy9w^LG;8Fkv#t<@kZ(7Oi@0$>g7eUT62z^COWhu^jN*U1dgK38i zs@0U$C%<}E^XlfN)`y6(p2#l$GZ{i$V?;G=<#G*3tSCK<@M`~dX9ab#&}^)am+~RkHcb35(dVYDGTMO~~g3So4Sc@9Eu0o}oZm zMb7K6QBhK*lrJEy2_eBP`?zU>+JAYIQuPdm1k0l$d6Fxu^99Do-X$KbqVS+W<-lR)Q@lnkqkD~lCyfY7{uvE)b@D?S zJ30E8^MEu2?JAeGk=Vs9d!E@!r+@Q7-84Vvp;g<@)IVm=KL)P8@tdMjWPik6XCcQM zTu$P{rAhW7VwzqwC_{AB69$DDb1T0~lu05d!;-Iu;zNn^OKc(0#LH|pp2yW{&u!($ zb|dDPPOh}qXc)x!1o67|R(C52m03-FTQQ{sTx52}+{Rrw)rb73wjjNfo=n0vDD`a( zG&aC?m$Q1)h$^*EA#ThNfAH$(y4(RO*YoZ6kjjK^GQ7kvR^H`ooYUPEJ=nEXFGr=G z51BQ0@S2ZgOU0u9&QPTHPP#TTztz#w(()QY^BkEY$(K$CI4ZO*zqS#U7~RdIUhyQI zQPCqOy5jOtB_Uxw^JTily2p~xZkyeb7v>3MkgcGbqjXT8&AU+vksIfUAUrvgb#uLV z=p|!WqazVMud~#B6JY*#&WKic`|t;A@(5g;aKRXrCasS z>6Pk&t}Mj?KaFDAzB_m@x0iZX zI!%TH72%1#fds}-K=CDYbSCua<#T>*}Tu&QU;PHS^c6PsMw_(e*i4848{ z;%;Lm!jjtZsB_NrQd!eF!^|&2nDgMG_Fqgy)6HH8q)Br0cW0^P^CwM|q0KK98-or$ zZ@{^+SD%=%)ideX-kFpco(S#R7!tatGJ8x|v}&0_>!#4Pz=Ra12<;cwoBB^ohci81 zUfc9SU`CH|W}|{Gq){@Xj-jVrbG|U@dXmn!Y!lVEC`Gg|*tK{C*)917 z2x;yKOGw`y)^=NI|DF zf(Wz}aa^I7qG>zNwv8!!i_eO%jpM+vr`TpnPAiLmTi3EEB7i5sj@18I62X~#ro2Zj z64!g#>O%;`YU#Dr{23!S)E+aiG-1TC=z10ZR3OWg3hpc06LG5v_sdc78aI*i<6$3$ zqAwJF+hbX-M-ru*Irm??8?4@YazQg3f8hk3Dhr#9Kee{k?1SA38+fTA1U;#B4I_e` zHuLE<)c4EM<_wnNOCQqT)bkxX&{uIS%6?C|z_7cawkAREUC*|?LGk3re3c^*^N5b} zouhvooG;-pU3DoX!p#>Uc@x%`p2EBKODlKIDv?bg8)Zca=qv;%kj4bBA@o7;t0>wB zJOXOK-djpC{t9*jeJQdhKV3-wq`<(>WRIXULU%2*Oh^$q+}{31jiaK3PYNF8wvP7m zNxeSmU7O8je{EmuHs1bHJAzC+*64WZ)4S0B`Dtu6`-fhal;eI}R^aDP6g1m0dzRX0 zvskuMBzy>IaB6iU5zQc?bf8(GCdov2dwi|x$<;ITQddts)jqgwmROoV<4I#!?yb?u z@a#)Y6CYgI-FcEn6A>td^J#F4nXYf5YerEB8@3yKjlKreiOQ`dhSLr857mt#J9e(@ z`KBBLxH$B9tN4ccSH;J>iEd4vgfXAc>jcG=C1h@7Tot#lM^#r(YO5KOTd&ogNi_*A zRbINMT|PaiNwBZMQm-<1CLV*6UTktmpq;WOI zFo-r~rrI&e2{D8n-3B`78}K6jGMVCUMJ`kdDYw2cDHW^0vQckxH`4cwwmh>sqc3tE z^{{ERp=hpowYNfZmW4CYLm^7GZA>Le7>lzI`& z596%>`6(1?UsFb_$V}l?ea&yR0H4IgQ`XX{@4kWKQ)%wNgh7ft4O6G*g}8}6V(xKL z+x|;q%A6Py`(zCk|5B9OSbT@8SCR`cH_sqG)$wIp@w80YAAtP0xU2EW2n-t+2whD9 zu&FSorhB4xl#R#ZLIllcNH}>@&pz|Quxo{k(b07>j<|);Sc3dNr%{7~VOK+EX=iMWA}cQQ5Z+4;JFo?0d5+Kvj{=S)__4YZMZ zHhw!L*m+KM&%{e-pK~ZIr}NNzN6WrQm$~3`&dH=O$I#L3;shp8MKaNG`c91HDZbX3 zt6v%S-C8q_vj4c1#NHyA%{Te_Lpa0?ro%;t@p zCq1_WBo4`bt+I~Yiu_24M{yR9RA4e>M#ui_58uquhtp+?VM+9xJ1u2tcGRPl-TKqA zkBR8EZ}v;jV_xWB3~smPEh#ckaX$pIr@m?;A$R2yp+)lb2{QM!V>Q+L&u59ZHg&vB zPpS#j)$Owjk)ACEO(OqO-a-|H#P6laUD8s1LNc2CfhnO%z7*}Va6=YAKd6j{aw|%M z77RuimkA$EetT|eVYA8_r8Way*#$dO0cXe`#P4i-@zocdjwezxJTjs;h@h%S?g@sZTkdne@y@KKJvt3;ZkhGHvU|5z!0S!h1rCP#Z%jXKITc5UNHQwSTi^cy zzObWUwnGV-aY0HrjR%Yb%1|NtO0(;Ucsb8R85)?`0%-WnZ}U$do|0E(r0ors=~CJv zaLRF*_8(4IJ-%(`1mvC^1$T^3QmmO=Lt<{t)IXYNm-uLg=H_!!cS3GywkrtqPijP( z)ak;+GCf1wM9#ddzOV$)C>Y|rCo37w{bCCcVl*DPjU4-4t&-5f(=rq>K~oe(`L{-Sab*V!cf5wH4+})d(OuoHA54b zG5z9JkTsj5TH8e}xcw9*8A$xx0O;~D35<8&FO$EQkh|CLmY5fS|E4>1l23?8d8mvs z{F2zwZGj3$&ikdg;2lkU(cy;huNI)rVQat2N+~Ogmr}^%^m5IrQv_+`l3Wg{cGl;9 z>7>UTIitm_zMMY^dyhlVC&{jfvJG2HvhWe;NkTrA)K5)vKyTo%w#qtu zFL9t%i@;0VzaxxHU6K^L5IS4dH{iZEZ&0!Evg_?IjQe6V9{$jQHSwpI*#Vyg$|;Ph ztTF1cFAtj}O0|22?oqR6Z<)0uMF{Gp>e0b%$ANQ()8Q>c# zdcKJ}+j~j3_A2Pdo>CvknxvuC{C5)x)Rr@Z&7P1;P+s~`DnU|`@~Z0hr2m#m60Si? zGWGC24jmRFL^WynCUQklF((2OhjUKiMUZ5B*$~Rmq$(1mrGr6Jpmv zo=&7Wp~_rKBs(jH@u`?=NxZnCV1Mn-dzy~`Kil89P2Bx9d>8>c)qMKV+&1(d`3c-a)a9amWwE{;I0=H|9+<=q)O&9hHS zz$?az%l!Rlt?yp|ZyQ&TW#w&i_J6NZKV_L|7cO5cw>@53;h_&lD3gJN|p~yy;2#%{jv_7VzXZM==eDqyo4Uw z#NJ}^x?t>zN;qN7((1X&`J9T^Kzyo}Ta5`Imq_9ib`((y5$xU>3^;9bh zayD4It$c0Slh<-+)txmDX;PC--oSdDS#ShOdW>Un^}0j3HwV(?mh-YM$o|k$vsMyr zgxqM^z1g3q<{&GHD!E_t?$f>H^4OmktTnRbW9Q#x{BgkBFaoH+Z&mmhiLM}iN+6|Z zlJrd^U-%$;P3tZ?kyLHpnAjTs3&|OHH#L&-*q%O72t7e*$WVC6 z{&CWi6x|p=t28%WCcOuWK~-(J*;gkkN`cRhj*=3jk0;^JZ22t-r5+WW%SdKWl>iVj zb`BNHhVuGyW^sdw-rL}V%~4tF?_h6Iv8u42zug!8X+W<8=LJv+rH1OJJ+p<$flp8z zYl)bb3>8DtajhH;UhA^!QPdXlB){jhB+F z{-+q_8>{uwMdM{cl7%xfv&n|d8I34~#_`pr0OwHh-!?KegS@$@TK3Quaew{Vj zUK>!Pz1$YA(|wgxYwo$m5t2{U zSv5M23-+no9orxsd3UTL&52VK`jbW$rvfoVJGH2@hRwirE#l++HoxqSSY~eimSbwx zYtx_DkC!xrSYz3QjJPcbF?0r4uW@GuUlhh=r7BFwcm{$2ga9U@`=-+6d#H;u=9Z}k zh*i>AXl1akCVK#k`O($*3v6ajDpaHonylIIjf+{NT@W6HrIaf{IIRb0QKzmK1+?SpQSpv6Bt<>*u9VV3l$&F>GgMi)k^GXO2JrV(z_&*(5-Ox+Va&@Y_ zI^ntwslc(FwfVaM#Q(j2Tmw(I4O%z83p#5KL0SoD(shBoF|5@MjnFXRYLa6+Krzw5 zD`@^i9>IfAJ)2*YQb;$rF78UuV}Ha@C&XfUPMwUtzUevb+OJb;3pt_OFU%7DaV>pA zAeLQTBTroPqH)=y1rliC@4z*w@THa$P1=TfNlgUQECJjxhQQK*H~7uBaGSgqf z0i4#u1poUJ`sYRFtu61167C%UqAfy@gN59~po08$oIWRnTnh24e)`wtci09MBEqSP z$g|e<6n!9mbks9*r(6>^)kgZ?>H^R8${y%lb-?0eAtg-7MwKUtnAs*lh8{IzYz}rK z{C-++Q=jKOjAc=~lBB1wlm?J*S(6lUOV}?A^;(sVdFz!Yoxr`J0G#)sj8~&^pcA|| zB{N*;*fI-})4xX3!v&S0;G5_y8@N1hD|m3cAs`#rnw-qiAc$HK2uxa##~_j;9S8+2 zN9_AA4n4f|$G%4{jBVKZ86w52B>yJlDi4q&Vl?^^1MY}0dm+Yx2|RrcRq`W^|Kmr~ zk&mmlHXGxP4j4Ligu;Om1IgpBQCvh)la2ltfBlhQBEv0@4EOix#XqKi7kSq9{fiau z8RdESlaH06N&Z+s$QDzFckIcWGUmbkApAn;Yv!v;c%Bot;8iw|$a%;7J;@(eChUwM zWM?>R**fC>K6n<5JiGJImLKoTfLuT0l83_IT;Xj#pcaUe=qr)d~ zYv~A+N*pFIKcB}LqT>Z%c^83pYzT<%*#PnMB}(AWgZdhlR~s~_P<^C9gZlSHet z2udpYeD#k3Q`tn8(*9{~4DNlhqQvY8xsmJ|f`kIFM5*{o<`JUO)dkUg_Km#S2!vq) zXWSiN>E?dX?h^hV-!cRTO7i-E?Ooh&L?#bvE6HD?Y^8C}hyumz3AhnsIYi(9*UJZo zVQXnbUS*lz%(C9CEIJ50i(3#?6bp$0@jn~h=9rY{*pDgswQOP7o48=ix29z8;l>yK z-%Amu$1s;H8MhS@juTAk`huLE1nJyk0hmYujF&caA0EEow!1717G1GzU|t0*m}v$> zXw-2nIx*+uUyQY?vu~k`j@}Tp=2x)i=LH+2EI!9HkCD|go&8WVkl9>!nc zfGVPw@Yc|&QDN7xr<=^*Fmqb;uU=`OHYoiF@pcQCt%t9XFIKK7#elFTVDz%}c>U{- z)J{);Ux0l&4`*yownDab!qjfeRvwS*d*W#ILhSOqKi>FK|8AeeXwQ9bpE> z)chwiP?F|4mIoRhBBB zs6KcoK+{*X*EOVd^i|;P>Rfr_`+z=HSml<_WyOwi*z5oJ&n4bu(VvqcrjM-FoZL$* zxD^B|jR4-C!1O-u6c&?3A+HYwc_o#^3>tq6dWv_z68#&I4bHw=MW78o?rSF4j?$^; zx(NDdiv{9@&q>0~`Q0>@1Q`-U$Mov_VR^W{)wK4fh=Tf8eG#VJMDCaT4VRD6+igDN z6Gi>S4 z`5&#t2B2%>y)*YJ^PbXh*N$kKp3AA(ciI7VvSr0WaRGwy_i5if>!=u{=65MvP;eAnL+bg6^>oRPq<-+u8KH^5%So!xG`hqAqDuj8Dab9p!UdfV zC8G8SB#JDa2oj2>ee9o<=d@;ahSyA^hwtMPkXH>tyHvgHr$GE0!1@i?bt^9L*K9pS zP7uG5J>Up(8Z`pgX#ydyUFbEy4>;yQfNlxbxSyp<;v%z~+(x3^DWRpx0%Qo*fo)U9 zj*7Q<^Y(akIl@Frvz{g1(RUo_jr#z{!(Op@fBQ%QGyzrJ+w>R;upI`vD!(~2SgRZW z^05&}=k92@HJ){RLE96p3osXu^-Mgui)A2s z?{@&i+R^!{MNF`3$igV`QtkwJ6b!*qF&vU`x@k8G-RK%M=1=ouyD7rp6sqtQaMD7g z;nuyUS+euot9v5XpL*Wp!4~+gXb>@B7yM$na(rz~pukxGPHJ9QzeadtKiyyug*IK! z(fexwE8GpfA+I{#+ z)<}nUr{VLWU`RqSZB-(9+Q?2;&nt)p~(((fmZu==zBtr62 zjRPUxAV|(o0`I9j=&fvK$WC8D-~8GR{T6I?rbQ35$D+5x!vw96&d2&T&CJW=^($~) zjs%Hp&)D=Ara69cEkW4YQ!RUbcvk>W#f;K67*ZZ}58hn59jSi@>?0g22XOSfrQTPO z90&zH`O3+t;SY{XWACAKv!FZz?5OpK*x~WBC6GAxISk&8e30k20K38*POPl^ipP%P zlU`Zy>L8>G()!T)X@8v`QO&j%MgA?hqfmS9p5_St9P7ub>80#XV9ayX0Ts&>B}t*B zZ?9POX$y+Hw>jsH(UxWZmC=fBA#P zizm4$;qu^-_xk)UK|gk-=36bXYuJpIvvmLID<Zgx%ncs8y=F-g5zO|a|w$u zel^#^6zuHoIJ0|BZ^K^3fU9N8a-VYxaj%Qe-rUGVaqVZq@MkXy$Jr@PbUN#d^O5`v zvs7k~h-jOLTLgDC!=dGZg!;6s9Ff;#$Vps0%q@%Q8U&O?d}YZ>O*I z_rLc?B~r5ZpFi(oP@I-q1RW~6GPFUOFcP^U_cSRtkGb&b`oOJ=b{+EpJ7A+D)qc}e zJ3F_Cw;j-#Yc}uZUO8di2`<`QZIP`2d2^InK}KBc)F_bXcI{m|FR~UU{dH~kTV3_Q z*@HQ)8vph^kJu_Ymv0_Inmxx{tGMKu>s2N_R7&ZAMAy^rI`t0;jzkxmbrYSy)lv0g z41w{XW>;1&$IsX)CZfP*0Y(Zp%hPE~kX%|A+8FzuTJXaVCP0zX81k zL!8b9?IO)p8p4Q5-~kypKySc`rlUi|L-YA{q(bj8+!_d{^S#4T=2PUdEVvaU@Wq`~ z^ni+S;c}ZM1y^BYAzjsjX00AUIpd@zy7KBysWW9&9NZq%b|z12XM~JC=gtoH+tQ!Z z#i9upLL^ApsI%W0gk6>T;H%InRY(WPy$oJjp#slB90=oj!0u>q=oMMis3VvJIW+Do z>(M02T<|wZGNFOa=8mf8HMD+G>LNd7eSHF)38Zn?wAHH(Up&#oSyv~Zo|W;cUkQXG zlDqt?7frR;eC8IklIs!fe_1l%2=TF&Z4HFa0o$l}hzdHeeI0`4OHFn)5QH*GowcUg z{8e5>lf$V)WK2(U{NEs2>?x8ZF}^4x#69y;IB$R<5g3OA^f+r)$jVi=@EYn{=%+rh z4kCIrv3tPSb=R}=vda{BcD2PXy?Qd`x$U=T^PJ4j@57Qc5*McGS565kQxRg4NJP)2 zDtAzi&FKdH-PRh@C5`U&$Z1YQ<0q(5H%;0-Ul|rU)eR5?Q^=FvbV}7BZ)j0h>h>(j zv6T2Noj}}LL>2He88a41sl>(F2O#Jw-FlbnGo9FNfC-1}zFiCHJ*Mr@6>rxd>!LYgPOL>|My^eHhzDjvaM|L>ak$x`&e# ztT$D%qB>SzcG^xIlQQF2mKerd2d?U2nc_72?h3Xzaz;u!Q(FJ?6O7^}7nx-qK&zDD zY${MKpLOu{rXb>8UF_OJbSydYDGAdWJ2!6yOOyBsX4Z=H?VP9VsoyB~K5ytb8pVSh zQ_Z5f2ME`aI<_WcK#~t~4eBjyqrcSmM$vs$pZ4%_$q(T)GiOsA3Vu_ONX;!+7g&a27%OK9AAW%f)=1gK?FBH#Wwx(-e?I>4g%3I}On ziZ5w&WVOaUAoEW$xxu9$C!uXn$x$R*OutFxh3ULvY>l4)wN2?DA-Yhpc6Zme=b{~3 zUR|*Be)V*yuzdR8wj~8bNOeSp!crs(fUPJYy3~LT4g|)TSiLi zrp~jCcRtT`p-_gJI8~qEFJkw8n(GFNMyKA}b_Mtu+i)|m&r{xTRn|{(!c1g8L z`SzI50M+iUw5soFPLB@9oZo24FYGEI1abxRWUrycAA$K63&3ojBxlKR$$S!{iYC1` z=x&x02u^NC>oNp_5am20sZ9_2_kY0aG&T&0hTAgqZ^(vHAdE-aN81>kOeG#}0p%%4 z#kHa>FyM(jsps0)`xl< zyPRp1U|k()zIElc$sx1cnWNS@;C$g%PrXcedQ8|>;QFWW14tEOx+2hCz6umq!|zC? z72+j6O5_8Y(DwurvP6LWv_Dn5>WAV<8D2T%x|N%|OLa_q%E`NO>lW7+!el(p@y99& zV;{Yb94k^@yLP*P%;nSAy)jv?_HjlXK0WE&*!X$^UjHdu=?90$D$U+TG#qh0As9Su;M z8i2HBss7B|M8XqN|JZHS2@USNDI0pa8%xiCx)s zH4f-7)Yra?2rr@3+pj4f(NddEpqknd`m!Z+Zt1VI6knlMBxQ>MY30s${h;rqRL{sI zOqmLcXYn|VHh{+R<>JMEAQ+kNs`3r+Q4s>I_-!EbP7JA!RKzWX%Kc~Z!CIYL;#=rSl(s>T-yB$c~sW>q2uj^V) zb)7?SFRW~6oxv%=Mg6y2?wB9UFmlCT%&=g3=X1g9SV%@&Qsree zBW->m9F~Y&M0c``3%AB$FF=B>`Z!SB@KN+lYS;jo=n969=xA?+Mw@z{v{hk|J**`$cOhBPDV|i5 zp$8LB>k`XvrH-gP$^J9g}d`m6P zzcl5ic8#r9{aUJgrF;7?khuW^=Sbdb$_dXu@Jf6HuS}4k!`%#&ydD+^Ed*M#w1W=t zmcI=ENuX?{=H7(Gq7X_~eX#EwX(eeYZEPcU0A2<$L zlOg61yVgsna#@wnvgm>xojhyEs=b|tfHFS3XEY!@4|7UVObGV*K=o)h%eh+??3S>? zB<@94k~^RHgj?ZaV#aBkug+mIScO%plGkuFjJ`eVNU*c)Q?vcpz~Fo9vuZoCZk7}q zZ=XF)hf08kScg@spqEw5yVE-8G?j<2@)?sY0DR_i+ueMV8G!lREu8{d4O^$hvT20p zIkoK<{{Y{aFH^S1$Mc$vNGm11c+ftRI#HZ`pEhfGI2XMXgrwyU?}ucPPXK$a06Daa zG&G0_qo09d@a{^iZF?U0Pj>SSnJ`k{X0Tx7?k8l8{j4^gF`?nC{2|GclLsr)SwXMc z3M>W_Q4~)T<=8X`aBRyy%Fr@}hA4zGh1)df!k)4j!8atL7mb8%`+*aRlkPf;{2&i` z=~OMT63PV>tx)ydmt;%HGiQJ(av~-|C`goJiqq!E&&c-wIWba4PAGsRcmxd9fxu6A z3+AX8fI}(Lf#?@IK*t;@wc`?KoXW5qF3kf03qQI_9PVxl;8k_rXF4tL<;AVxve*sa zR&nJ4x61!;>iJM+fx)^a5}Vg8d1&bb;2T&z0FJM>BoBab_I2t^-Y)am#-27AQ$%PGSDw&(De8fw0&{{>YD1&L0c=+6;_3j;eAp{n+T@b zL~%Nxq?CLDs;T@~=}@4?=7e~rVEPHMt3Lni1ZE;_NkI$9OLZ1fNacEdt44EzhnxZbPwFcZG3*G#&a z8ddu%9`jOwGn77;^wu9pd=o!%hO)@H<2EnlS%g{#uJR5_xlrE)u8g4|%I~z9yeIu< zIiDm-0^nqu)*G~&3(QScK4&ImpF9-)pf;xZAF`bey{W(xap_sFwps@1`qo_0dItb0 z51T?M1{Kz18s#U8&WBT0E8}!9JH>SwIee7hu%;HNWz^lQ2|Lmo`XAoa+FdeB-(h3- z>Uz+`wEY5lMF<5Eb7QQZus4lygcaN{y*>FpA~nEQ_4@TMNvD{y&DEkwmS&WPbjyJ( zRka%SK$-AjZQ+^I_rS_;s_N(dF_PxTD zvkygpYP_4d6LF&@z^-;pfwkWEGO19HZ561XJhAPwxdf-8UX1!g`&fYWAq$0vI}kol z-!`{0+u^R|c%ND9MKic~w5={?bOS{MGLXk-xI(^xbOBxe?Y3ERldN0r{D^bEzN0p< z0bQv!cA%}20C&LMSD1xkSY5(araKs4RnoJpKZalB5t4m=PP)YOM;vE{Q~-xMy0~$X zL<0sWd+(BiMa=%2_T=-@lWJ68rgg0XP6{FEOt%S^yV>=4qx3Vmh$0R+a1d~~fXqPP zNQ9ZV(J=wMDVbp)-VgVGLjq>|+=@lPc?fcQ+TCaA9Ix#ViRAmxZbsg8%H(pWskSVu zrDXMY80+S#f8_#&F6h;IC2WS?&X|ReyXX3mvUwkZ`><>1 zPVbPcZ$9uxA~^c}7(DbK<;&5_G=pvcBN87TZ$AJx0gl2C(g-wB8NdFTL8A$AUZ56c ztvm;!5bu`_Pe=tbVh_o#!R=2Sd7Q1c;(Dk`J-wgD0Q#c;x@R!$${(OE&_E^4^~W%UE%f`1zorSU%#E;GmXEeR(q-E zY(BTh!hJ6E@$V-m)HEHZYzDI0z#B0esyvGU=J7*JmURZ4IZ%Fvel2tDn7f;ht|K-& zQFf}|?3s>)bYC|Wsb8$NN0t>4dS=*5a9jHE5kH-LUV(9_ zl!aSfo|8zJB!Ff^?CAph(Dvot<72|p{yj#-a?qxZ-Q4!B2l-`2N&>*O7Z>S9b z<@z2}HHsj3(FHTcY)A>xWN3eql#IcnkI!zVLLHRkZk7Ey{2L^c+Z@ZDm~|_ zv~2P;GJSX!^iu3R;XiqxnaHj%<7jumu}vO{ znIbsD(ENw5xJR2&Vz)7Yuu2EO>_|_81d-%-<}(IetwmD!Ao+#hBoXw*RxtcELM$}W zK7muv{76MfoL!eJr<{~sq9iFLo8*x=i)@G|SeA*7A0|j)NobPvmkJM<9qEBYO)t8f z50p4XVCGXXf%uO=y@5;!yk#!SIVNTN^(Uz*wo&XC9Yrh;dC{*NO`EtE1wbSp(sIT# zIz2xWUC3%s`oU?EmH%HjP4i5_7Oc$l@4zq{*}BCL7Tx(6yNx>wegxNIgh-}&B;Y;e zA78=%KsW;>?eFM23y+7wD4hMw7aU>W*QEZJWfa1?`k&TP9{+U%{dxi5lpQ~F`1gJj zOMoVP_2|^zJ2|*FWI`%EzFxoSFuzW=hX_mV9(tDGkIxbypM8uq^2L2t17V}|wnmQr z@pmDgKVSbh8SW2*fBtV~Lj>HYJQad}QC(!GoxcZn>*NXMvwsrI4#QVq-^h^sRw>UR zyeOxwuAjz6|9*`p&DTGEorf9&{8;$)m@-^(J_KPgF`Od$AMg5Kx+1`3{!4$PQU!0O z!DZm&^LwlP7=uUTPlS;-|4E2CuObIO7T#rcSqt|FMW~TZju6Lhx^3M?n!#Iww6YkA z`sUDD0wKE~eOJNEy#Voy4hs06vtaLqup9E9y+8WzG@J*UYi^!I$+Nicn7iUJhcbeu zOi+M{xdV-V9e0`jF&WHH&4z|+(2ioPMbP1^3CME`peWpL`cB~wLO#4W+7f=Bobz7P zzq}?iFY?H;A?i0=LPenALynj)tV7XL7wlv#pzdD?hVzIOk&)=$YS@VF2jO*ST34}x zXj0(P(lJz^#0|`^G0KpK@##tJHRi;vAozg@X5M8M%RKN zkp*;eRU#;aFt?)Ts(`)5qo;DW=_YTzw0}rP`MJ+n2KR3Du#SBXk5T?R^a)DHX^|co z*^FDEA%q?-MBL9g_08P3S`93~bC=I$^IOx{#n1*o;qDgP{ZNcFkpsW1g|6_;Wj4)b z=svj+uC9~^6TWHW)=mCkDniQw+*oqnfp+sXG(s^oJ6P(1l=K#y+91!mykU@ff+*p) zZyALK;#=133zX(N_;fCB%wO$6)ad-BN7??$_HSo2gz5D9o+>*Sggty`c!F(cHLmH^MIb9NX4o-y6=wrW6a_Z9vM>B zd`yHrt71&-cL_0`cZS$78|cXnKb_0s3;!?9Wg+*cVEAmQnEp0}Qpa3NjUJm6{X3ul z+}V!rle4!4;*^$PV+xVi*GIWoMdT7@{CsRewRlWc3*qcm5TtpXw+Aa26ZE1U-uF2ZOhTh zhn$vv_jDOH&F!KArfb4az&QM)1)4-+x^<5-N;$9aB$i0~l;3RK21MCvolTvLyT)Lz zXCO>9%?W99-000gsh^Nr1eEv{e1ZYn6qXpUI{dkbx$k!}GM~VtGMT}K>=H3_nnmk3m zL8iP4WZz=HZbGn$oPV6p8UYTz4F-ipC-{diWFc0;mGAc(fQp4+eLE&=G+=Ni9GQ1vT+5a{QGj~ zx|DNa))-6+trV~HfvsdY?;r%mdgZje{UY*HkNVGb=&e^5#~A;&nh z0ps>JjG$q}?ciQHsG=k6S)hfi#7=0l$zX^ZXi%&m)@DuPA*5Eiwk)Yz;gB5%Zk9O< z;Imwp_7~j;xJLZ0GF_43@skJw5sFQu#s;)kFGP&=^vaa_^d0pppimWiS=dc={3)mk zM}T-pTVo8ZZ;JD7HI{!b?LL6PFGg(t@gWLby65jrUIJY_2SGwf$>lH|Y2a42w-SHw z`o5xTF_2s_Tf|(Ie}mps*6Vx9Ud}Mvl;9k zPFz&xA8tn*VU6Md-4`^QCo?mn^PLTqJ~vx0l=&`++wUXd@8rEvQnS~FZCJjQ-EyyZ zrKc(@pDc^#`VcO_IONd+(~=QL-v394F^3o}+MDu55#y#sfC6FC@B@138glL+i+O{{AmKacI-WC}01y$y>H=|HQ1mKq&%l4jUEn>5kG=Iq7}5(apeF!-hHs` zWs41j{@Wdh>;SoeY>(i@p+^EeiMFozF;tREs7eDri;=pMDUMvCpXqccn_x5ath}Xj z0CSFYoz;OkN~@Y+6h&`)G2D@{TSmO6_L2qtCmA|bOm2er6ks@~FWz|bPvLc*h2Wi~ znokS1aU3n4^+cnT!q}CtZ>*e@-<@0g*J^mn$iPNX1YtE-6s-p**?Fc-&p^4Z06_j8 zY+dQ{yEApInu6^PFUz$x*To}_%l}H}k^6)YrYGXiI1g@iU~|PGk)zT@)-c@eI!}!- z)r+=I)|9D|Mk2^Y;NE=it7-2GcMm|KOGm9wuWuHVvej&uTg~(+By1BH zDb}V8wdMZLLG@`cfY>roz4{8ikdD*-c=W2?birLZXpHCf_0wd)O;Nj!PV%6>0^O|M zh4V=u7MlV-Rn!#qar=qnx4@0){*goRYLj41^yW{Fir*z@Gde2=M5)Jfiz=b?Ozkw# z>^|n+uG52aQdS}4Q=pTxH9Fj@4eq7kJqKkeQCy` zWe5`2%(_ziDyr}}{MDYBDKf2g=ozChXkp)Am&7Jk6xBo325`qPk)xkL+%-nPwRD23 zjDS{z$mdH!&pFw&3^eNMOjIdEBhRu@F1}iHO%Ps~rixEKo~FU+blup$x~szRo@4Bi zXw>@xh)h0Br2Zlx!$goHW<*M!zhe}L!pjjXRR5;_7s&N~1d?J>c;D&4NMZs;@(naA z=!Morx9`4un8u8?>v%+&ngB~HbY=`PUPm@T1kjHhLV7*?_4K2b8YL07JLL8R0crAi z=v#j92JD)4I7f0FL*|+6{_*ML5ATzF?B7AzCXVwd;%JdHK^>8~lw{z?-KEVEH2Yx3 z!js0IX)O7SFJe+8Ly8p0DjJ}N_)OB{`lZO=6_Cn~MeEu3YI3&7Jh=DCr)Atc>53rI zVdA8diQ@Qwe(7)TB&s|D-@j&(Ioc9s$6xSp{o|+Ftn!btL`^&-Z zb{~rCFF~y3`%+)O`&{QuRY|fvKC9sy4G&8c)}3J)kK!x%;38GA^HMNWBn0WdAAnOS z!ub@es{9@8dngcSXd*5aY8TP9lHg<&M{o;da!r$coPtl14qebKevf5FIK`LEsIQmL zro~u*hiyB>HL!a`ACtVnI=cyBt2G;axDuv)rxei-2#jiS-d#Zi)>$(5d7y2Y<1Sw2kq|#)HwRxq8*VC@oh&y4> zCkkm=!=akq+fiRP;A)*a&A<2i5I+o(D{t1fzcU{=5ZI9Po#@qjTHLuVBaaXyQmtM9 zL85AZdtT``MIveE;?2qd=#>38giUObZRT~Z_TnJ-0vFF@6q+w?-Nr-92OtZB}!ZZ2gzQKECeHSlleSsxIiW$CbX@ zoz2#-=vyCgG|-yDX*V(!)jel0GcsDMfp8MMYg>a`JF|mRL6$;rPqUMlTP-ya%|!o> zZvPv8$#0^=5Ojr`O>)LGj=RVh+hdcs^6F+w~C_ZBU}=ZHQODlM(&B|IQ=cTeCCw|HKq? zkVLotdiWMDD-PlH(DQ^^_%KkI`JC4+)aCH~F2R{bHR2472b4UKcGi*aKL27I0D-&! z+W%Fc{{k9suvuollTHa!0pbYtLq z@a=C$VY}^D2`@Zp`t@v|vW@%H^U6Lx+15yW!VMf?%Y_s2U1F#YrN}Fe&(Dm?vKiDC zk@QPu@&a%$?fu&1|Frkz;ZXl=+hqwuwkSjt36*uolB`1uGMK1HN%keX6tXX&l#;D1 z(V$57h_YnM7P6K?_AF&9+k1VA^t+$?e%|Mg_n-GTp8o0>GkoW>Ue|e@*Lm*#DYSF{ z-rfGb1W*dKcSVf1eGjBTUhhMpvP^IUJ`ThrxZB+|1A^(Ry{r!w9T2m8gI0y_!NBG!(8EbcvYwG8hk3)L-9HkLZHwwcL%5$h+WVk)|go7XN zhOz4~x^b{JmymNE2Da<2pN1zhQ!qXEw$Hx4644LGA%Dq7nnV{@hw6k%v6F!SZnS&_ zKe)NbZ$HQ4#(-sp`ow?<+x)==AqnhEw0)~9ldI!U70%utoEh{kn9oRMjUGT1LvV{d zxm)GMkK~<4c}e_SuRcuVz2i=wH`}O&s`)dwPzY_H(ZzY8=o-7JXd@g)*FwUN{HZU< zOT$>bYyQmkXS-dOH$d5D##6rUe*zRs64?L9mTR9IP&y99QYwXY0zjZLuhV)1Qn8wQ zLWVYQj;GFL4mkBgsiYoALx&G-NtR-jb~M92m^u$;?g+Y6!9ntpUSlo%-7j`Y zN0&Qp4^B(S+53@4i{TFHLtw6qTgg3Gfw&FUz~IOO8mx*DgWTK#ce83?|! zXV>9{Pd?$-zrZC28p$szi>m9cz&=4b(L7tiJOmC$pUaJ@LnBSnVxo zv;GxT#J{LI`KJ;i59sGrlrTYnf!5x?Lq9=(0vIUBMUobeD?7?~;i%a&t4`5w*ppwI zl<3rp4V{?6K$1T6gnOM7QgqWpI?hj-3NL`X@Ov-`*(qv#)bVPN3NW}?T!5+&6QgBk z1uZwcB9*91AktfT2Sjfj_Fr{SQ$Z)hcaCOA$$ECOw|9UT$!(ap)z!e+ zUC&LMgeQ(EE9jW;TyH*HWH%#2>O zp{TJV#002)`u_0AJC>=CG#lKiap?H>p?hYZwF_}qLGd62kwkZ_qJ52JYN zJxZlJ+R_ma-F5)4ldYaW>yWI9947To-;VEt5Z}3vsu!elBm~+61_gG@LkI)a+VmeF z5?!osV5nfe6SDU&8vPopAVbE(dj;g{m#p8d9AB$wbL0IgNRQoPI=08rBR%xwVqX;4 zQ--T#fA+#dImfxsrxCT)neG}AF^Sg-Lr{41emhq65!_g;P7rd3(q3J7T z86?GWy+|ouNJGUtZg#kt+hVdMfiKvXz25G7xGYp-Et%T(dygjD*LNV|zGf6PzNB z<=hcedAUW?8l{?ctdHWq zb}^!iuO03q;@JMTOY3JWF#<|cG|35?JezPzniZRq7pC%Dr;Q@#6v8Piq&b2(m6mi< zanSL`nA~dCo)Kpa{c_V5UmET@YIV574)V~r>fTy)a;O{s%2MBYLURcXUd$< zK>%0}+S+>TvR1?O`X#dyu3ih}iL<~xVb9+$5yze}sX)1x`qdd7_*+t<&# zRuLqxfE;e$@h(A5kps!2Wb{jAYQV~3POLWP+ZxKi?@zK!z9#Ik=f!klvU3vrhQHep2MP<;$pp>n~BE zLUa!>6X*W31cYLyQxTteV)6|{BYYM*Wc;xd4GBzgSGewU046Ml=Qdq!>xXTVRapnrv(fmQbsUW z&hXl_--)_!fYx=?-rb)xk`HGqxDQzGi*vkv<2HiLv;wd#BaFyaTs-x?kXU0!r8U_P>_=YlT>N0~!(?|5kSWH9j+vw!Ibiq45~qY7ie! z3<_;lL8>HeX@opD#C6|iT~q}#_4{DBQ5w%GBDsEqt^Ec9;_eH~nElXJX~auIzVP^DKAfybxWW`EmCk}j@`~YAmtA{tcCYM;Hx(*SsSePSF(fiD+&w|* z&1Xc93#IgqHzQ*ZBHOctTTz%R9{dsLnHWg;yn~gKyv`rRvf;z3#DdRDhWM8ID$#xk zE)8zW%*%IiF>!WwHkms+nbp!_I{VmdkZ$x40quV&=kfbjKy>CUaz0svI#az4IB1T{ zS5R#j0D|9{mm?!rV7SIpg>~mfut5tx11^AgY6p)sL$sq;y^JYDQ2FuPwP~CKM8x+I zW0zMwTF(b!_-N?Zz7IVA82C%w;lgP;sf-I|GTax**vSR0y7THa785y&oW@LQ!KwF? zNK}E(O1T>pz~`=vLIa&*{uC6LVt_u{&81lt#__dPk}8gGE1dv;qXOGI3Ia58-9fA` zpLrVvZ6QR;e0lI)dwBp|44gLIro}LqDUfYY8B8K20dycrq3o>{PZj6u^V`o&o=Xe9 z4-fVJjW7OO2VS`+aUkDs&8Rbrnnx@!3p|v+L!qLF9lRrHIHa+|Q>UtpAmcHCWC(-Ki|#v<)DAdgWf(b9Q(rtRsVIHwm%bV49)n8-T+nnWAgWv|VxtfoMBVCf*B z^(kO9J7?%c@#r-zSjRky0v08Q!X?1(soKmSa~wprB2}Y5#^J4sL;S%$koTL;WP-8z zpiJ)%jh;w87>^!d{==_qNmrjEKNesH&ge3CK2Nzm`tfCv>?)9KLP%7DnA|CBJD$Bp z=>!c_3&OQ8)2tcW4(yhv=cZ#h1$^UNqbBsoi+B*!jdJ2Z z|K2gHt;vxGn82d@PdyQaNzUI*Q(AtSBM^z@|A0nTHF$V+D9!bydIWuFpIizR53~c& z{5~i=Mgz_i1>77{UxPdfkzX!G&C+a#Y^)xC4a&zKuXUi$JRvaOTj=okbhe55<-@8cvxYK&w=8>mQ;>nem4_^Bg;UqOQM#waBivV`?x=NlV z<;8|rsX?eoi^IMa1CyM{trrV|&B#JQvbA*y)Cuy^yYg*ql}K!4GOtkc6+AbtVJz|? zIRIYZ)mMjX^No$@`%##?YW@@uwc>BJB$FZ*0gk&ElAbAq-2TR{oNM_aqiC+nvi|+k zv)XJGO*1k-GYBKCsdvmfo+TKB&C_ukRqTJW^7|W9Am>l#{d3BH>;D9}+(+7oe%r-2qCO(8yEUVI9q@v>Qw? zo$o{P6NM@s8fW{$4h~q`x%$fUZV}mI!#zRhWUmO^*&joCeAMAqAYo4xlPW!TxSI-x z5Yn;~*!U4%lI37p5yJU5Y42k`Wz1}nCm3_1Mf zX>0Dl)6^5x}vNz zJAov2es#(_EYhJM7WQWf?5EFdCLl3m0&C;-Paw9J@oh@F3Yr;~&(2X>P&(YYIMBfrn2uUY{UjQqb+nu}&M(wq_$B_rN4m4VxGDQXXqw9hCxWns6zAR2-s4 zOW5Q;kCD>4uIQ%SO(r!2gx6O z8hSHvzmZdYEbH12`yy3{yq-=&H?qss-rnU27i;2)#$swGT-+#1`g_UYVtdx&+X`M% zSo3!k!`}&TP7{^JUzA*5D3lfu%3qmcNY7Xx_EE>=v|VHHHZjn&wf0l{~o|U zQPD9F#t56Vo7CLCc93!@z)Genvt!v@KqcU3z?{sqsz>jggeF(nZ1AMN^t-{k-Oc^$)wkFb-D1p>eB+KSAZI~ z{+)|=x*UP}Gzf`xUDn5!&D9uKn|1k0JzsY=j?sB8D0N?%;7sDG2PO4og4DfP8h$gz zHr})$R7#zv%MUs=dIT}@#at%zi%u?_gig}XuDw0eo}ho$nd&;D&p*>wM!GT$()~Fc zJvMO<3iTfA;q^?*e5odyK8X_=z0^Qu$6_(6HeE0+qUQmKp`0y6lj^J!8~>c@z!FG- zh>Geqr#G+)rZo;XCw(2l7XPw0D_y7*Dog)*RoxS7KX7zs0cP^n@Vvsp;Z%$foMii* zD-xz=t3p^W0zZu997nMsMCV(1$oH2R6hMjpEr3*vhg&@21&f6y*XP&+=6E{Bj%;I& z2hkk&lOVB{X%x}nR1q{CXm!h3L6KaWH){f)-OnfUbD)! z7+2cm2|$f^IS?*PRC$_O`A`R=0<}}vX#2+ub{Xfl$SZoK_S_iU{TDr%Gu+aAv`cGs zn`ijhmR}2bRArNp0Hl!B+!?3Arat+=Kt(N0B z-j4DSnu*kGQi^*sx%@q5CnydvX*Iczycn&XyD_mEBGxda+u7i>L&I#Lo=6ub?ex4m z5|nOaEN4|(>I*a+ibSY9nSw8`usJE0HVN?sCfxE@}k7hm&kLDrb$%jWwV0$}bLkw5G zMXn6`-dpDKm+>mw&z7K)Bsu&rxJ&N>O)1~4Wd7Sa#$8FOblS!6xBLwM5 zBs!$SJP250UJDyBdl8Delr&2YJQq)M9~}NsEd(BpLEiKhnHXk)j=KHN67k2sS!{D^ z7(1ua`s2xnLQnM$wjas~dv>JVKV}VS)~v$*C@BH=Ra$2X#O1!2Z5WV!NB5Kr?w;t<;v(R9BC!$oliFkgrwGH^H^VoR1UedU}GfTXE3n(>b{IAn5b z?5a3+w5u4cSK z_jRdO%9@U_RcLY;481H9hR7Ckq^K*!RJk!&dT#bi$+as_1$CxSohsDEHp(Vx)!&-`pv?KxeXlJ<1a^0(}`KIX0_R- zULW7Q2^$@(qSpLNBzQc8k zm4r-0G%1b`NT6Pb9g3F)&YK4K?}(oUAR69UJY7dnsO175h1EHR99!LZXD{{x-ZlR_R=0 zj!VpeJ!_XhEDUBJ*+rL)X-H4ft4g^iwIME)6va{VD@!Nhf*mnCWG&K z0_{7X4|X*(VF^Jg2b*R#v29kuX-Aj^E`b_BH^=t*^u@hb3+@~)-Npf_xW4OWKj$4z z(X=2F);?hqOm96U^X~g-wbQ<-$Ldou%ef!OMZQJ*?}_tff#L^%pi3lz8Rdnrd zOmDqy*Yjq95}w$Jdk1RT3MWQC=O_2_ddMrqEn9cx*aaw;q+KipJo>f7j*99rR{PB) zt3Rk{SDbgl3QbG1q&T<=EGl704=Ga))QnwuUlPP57bpT%_7)&|>p#XzjskTyPrH_n zCMB_bq~&q<7vhM2&TBvCoN<+8{ zymB7iLc#ltzOH&J{_#r)6GK&$t1Ynsz@m-eTwSP|1Mvy{Bpsrez+K4HJHHV5Wgu19 z;aKuBZbh2wjyDUP?945WY3{@J*I!QCt`@|K zQr=9rvbLooC=E}fr3%gnJ5dCOW+8N2!GN?Ap%r4bHT!a z+xm~+&&Wk@A%gU)Nnb^fb5Tk%tDHx%LBoEtsqBZ#Z$VJhvxebQ)8-%#&W;;?D+R(z zFUUo(-hnEN_-0dHi_z`#QM`c+7CIk)uijf^5Y`@(A7ENLdtphla>I3aF*-PSeSPDp zDt1-?oB+lyCU6?7B7+pfzAsCo>QfS3q!G=B>`UlZu24AL)3Q!?C5$86p1A@DQ#Wy}Lb z+E6y}=VKo@L$}8pPNy%#t++iDR0z@Y-iGNKUeQ4U&)T^bgrf14@t(q#g0Kao0g5Cg zY_zou4XXE)a{0^ctwhv&$?D7s$iz*>+-A&*1bTQ!FTW3DjgxVaK!VnudR}#am<+gh z{vbRO)^4r%#=g+*{4fgXd4}!!2GxM>dVFJmr+#sr2R-V*8-#jngB`}5B6R|zg#;52 zI^kU8eF64YZXL#y?-7GwMm@IHe=*jA)5Uh$gVVP$bKWLm7kPb;!;V}-(e_HwJ#T=h zZS}#?Kz7V+a5?c+tUiI#XhHPAZ!GE-J4{B6-N1p3$%sN=l~`BMnf1wFz*KCjkOWL~ zt1N1DlkiPwr~_v25n`Om%lqI6f`9x8x5FT!)v$(Q2i3u1X!S6u2xM@6nj*z|*!8m6 z&DB!b%b%{N>SY-{t5>H=V8(l44ygy`EppVaIBx&R{4yo(GLEA{v{`7D05@YLM@3WS z=h^gy%lmTDOIOqIq*%A>$6Es_pkJ7p}{b&p^Ps6kC7Wkjdz_4@7{5 z{+HGwK(yqg!eYrcf)X(ll&Hwyp>GGpi1d7lUV11fc^fCwPVCp^zM$+U%!KVIa>*gWg#|x*FLmz<`T^L%VzkZ9kg6*rGPc#AlQ0`d7)1tgg@6r3KJ3vG}&*Zshr`Qjn!qA-hQCD+4#K`qqdM^>0901(b?VK=LdO5}qfa5OkX@Vn>q z5SoVatqae;_KtTr-CbtgcXK>}-k(GgxDYAMxtE|ZeGtY|So&sHBb@~gcOaxFhZqCA zmECy7>rXy;5Cj+971~&zbIW1Z@;!iC;T+94e}pyDgI;NpCu;vMSra8B*j zB0pE~_{-|E$DD)q1}0bvIHok)=*)0r2uD50h3hE_*&JrHa{@d{z6Ou-s6%GEtu~S#rFfrBqmf#_t#a zf!-Jzg#oaFDOyqc&Yp7L1IJFV~3YI6@M1`X+ zgZQ;o>Z#%C;@%$Ku9SE`IqB=tbCBFxKHR^$FcrvJLute=?O1K*xMj7|X*QHCH(v4q zsV?Ws7p8i3q8^ad+}?G7l0wAs;N7Vq?T1&?)%zj=^@{>h;ogOw^n=V+)9w_s>}G)8 z^mCd-Zd*P=`S7UMU9i^OT_yhE2tH}DzCOlRA&rSvZ5A8;S;b)9VJ z=j?w!y^bvVZQ}~WOUi|*Y(TdM;Gl|XJJ-5>ZNmi1bKT>517VsKY6v5x`q`EvEn&bv zLGPa)ApN#2JT08MEE(?1Jcm=6pA$7){iv2`UB0$}j(HM4d)ld|Y)2|edI33&i&o-D z9PQEBHw~H+rk-BCP^d3zL=+_uw)5`)FhjwHQ{))^+@~@(3_vp?y4YJeR}Jb#RqYIY z)&xb}>Zc(2A&Ls%R{$vXX|VXp!d%hx6Y0?+=r$}QVLk(E)6;=&*;xBpej9?;xi+tt zU^;leVHW7B-OZFp2>6$4~TiLqHUQ2iboub#kDx?Cwxr|f|yyeh#jG) zKHn_)G|I;Oty!uyOn~k6?otLLXwAEX_48BFo+c&5D}?m9(T;~+`(8y?OauPGVbOhg zd&k=7i~zNMuc6Lp6S?%j&VAQDwfpBkLeCsKL96=%pn8Mw7>!vUJt3p@@}xazY0TyR z1`xmSBz15xXH8;o#hgVdZ;L-}d^rp~C0B&+-k6I-=$FIcvFC*#h%#=*3Jd9?a)=(3 zvVYBxmn0;#6;y8~Hf|QygK*|0#oVl2tAogkl3_4LW^9;HviN3tY~S^rMuzRD0#c>@ z#lOj?J?5?%`zW3p=)pXh(n>Ta$^*dJ*v>_GiA zMJxIETwK|vpSY4*(AiJ}-0-V?$|_z@{sOuBMJ`VDtXmnl&+%{`#h?}$jYHc`%8EyO zJ>c+@Vv>B9t=;r}TjLKgcSH4)kMKr1kbs!Z{5b9m38_s5v#clLMsoNi0mWS;v@GHB z-3O=r_RJhGBfF`Wa*cm{Ug5cH@aVOxbK_YlZVk{H&veHe-{$xI_Z_Oq2uFK_@2SCE zYat^n>sY9+?0da`?f8h$^YVsBx$0(q=`gb7QG-yFWS`&mU026NWR_Jyv)W#rfqq=C zZ2Qa&mu2lMkQ4S}96NkO7j7!jj8=r@M+h2pMeNrV{8-*0S4m=F7>Y?`UpYl&Ry4n6?lHu+0$Z5v6Wb-4Sh22y7?^+}-x451vLdnTo%uhJE#9+zNFfl$UX zc~<5EI>hr>#wxIv^Wnz<=ZRS@03Sk7A4!Jcin@5_mY&cqadOosRnHBZF~f!L0~s;r z%&|1;K?#YIq<$ia$1gnev7$3F!?3F>-8tGEp~$p$K~}4wGojO_m2Kk^6@iz63hkKI z#??4nUO|CIUG^I=O}iO{u*-pSp3v

e2QAv~(SyRm3!0#VWt=q+B95*7}AD)#YR$ zUrP}25boutDHrp0ZAQ)UVi(GM881YbA7b@*Pw;d{yb@Nj?6P^Cjv=mYAEXW=0cw4; z*_AU7xKz~C#(jScm;4!kYme5MBxr5y0URo#1)i4z3e2xjHx7db3_)uWnz%afBG^6t z9=kK`+X%W*@F1OEZqJzlZ0>yK9;$J&OJ3$GSO(H^6tFyEHiI4=UetT*USkDrKfd^F zwy9dl!FX4{+a4sa7sa5Sm&1(MQHV}g2z*mD2!p;ov4YVA8?$I6y!>EQxAf;-sj(;7 z--=K1+H{n-7eO(}rH9ZyZwpyl|B*1#^*XLBtl&qgGMdyIc~C3dcSl3TbQOLd(q7o@ zXlXW`6OG3ni%tNPa`p=z!Rm+|yZ2dBRt4h{X&L%K@q z561+*-9JglAdNDj2;WK(9sD#tOxSdp(T#UVq+;hTxIkbww6Px(|UR z$;lf(HL3oZ?SJKDRP$|C*M1IVSO+-v9DtY{k|uL^ZJ5_59~Y0NMbQtF0t2n4dRs75 zQFdeHY4O5Zxzwspx%T#rpZvT3JvV@rl$S3&AMlSy{^!(f%n?7tPT`^!g1^t8|Jz48 zQIWj+?ES^Hjq=|=kyixF)KOOP9e=H~jqUWW|MRli0gv+a;M?Wh|5#=l&-#!5$=9MY zCM25rfA;P?D1=ncZ693ucVqTnUgNq1`&dh*-tWKsx+Iv%S QZ-Rfva2m=Pis!xm5C4H%%m4rY literal 317980 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

IS?H!4!a007AQ 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

wCMs}KB3q7E8Ns}D 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 diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 01fe21e20b8..e4151c52e17 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -5,115 +5,105 @@ description: Utility -Event Source Data Classes utility provides classes self-describing Lambda event sources. +Event Source Data Classes provides self-describing and strongly-typed classes for various AWS Lambda event sources. ## Key features * Type hinting and code completion for common event types * Helper functions for decoding/deserializing nested fields * Docstrings for fields contained in event schemas - -**Background** - -When authoring Lambda functions, you often need to understand the schema of the event dictionary which is passed to the -handler. There are several common event types which follow a specific schema, depending on the service triggering the -Lambda function. +* Standardized attribute-based access to event properties ## Getting started -### Utilizing the data classes +???+ tip + All examples shared in this documentation are available within the [project repository](https://github.com/aws-powertools/powertools-lambda-python/tree/develop/examples){target="_blank"}. -The classes are initialized by passing in the Lambda event object into the constructor of the appropriate data class or -by using the `event_source` decorator. +There are two ways to use Event Source Data Classes in your Lambda functions. -For example, if your Lambda function is being triggered by an API Gateway proxy integration, you can use the -`APIGatewayProxyEvent` class. +**Method 1: Direct Initialization** -=== "app.py" +You can initialize the appropriate data class by passing the Lambda event object to its constructor. - ```python hl_lines="1 4" - from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent +=== "getting_started_data_classes.py" - def lambda_handler(event: dict, context): - event = APIGatewayProxyEvent(event) - if 'helloworld' in event.path and event.http_method == 'GET': - do_something_with(event.body, user) + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/getting_started_data_classes.py" ``` -Same example as above, but using the `event_source` decorator - -=== "app.py" +=== "apigw_event.json" - ```python hl_lines="1 3" - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEvent - - @event_source(data_class=APIGatewayProxyEvent) - def lambda_handler(event: APIGatewayProxyEvent, context): - if 'helloworld' in event.path and event.http_method == 'GET': - do_something_with(event.body, user) + ```json hl_lines="3-4" + --8<-- "examples/event_sources/events/apigw_event.json" ``` -Log Data Event for Troubleshooting +**Method 2: Using the event_source Decorator** -=== "app.py" +Alternatively, you can use the `event_source` decorator to automatically parse the event. - ```python hl_lines="4 8" - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEvent - from aws_lambda_powertools.logging.logger import Logger +=== "getting_started_data_classes_decorator.py" - logger = Logger(service="hello_logs", level="DEBUG") + ```python hl_lines="1 3" + --8<-- "examples/event_sources/src/getting_started_data_classes_decorator.py" + ``` - @event_source(data_class=APIGatewayProxyEvent) - def lambda_handler(event: APIGatewayProxyEvent, context): - logger.debug(event) +=== "apigw_event.json" + + ```json hl_lines="3-4" + --8<-- "examples/event_sources/events/apigw_event.json" ``` -**Autocomplete with self-documented properties and methods** +### Autocomplete with self-documented properties and methods + +Event Source Data Classes has the ability to leverage IDE autocompletion and inline documentation. +When using the APIGatewayProxyEvent class, for example, the IDE will offer autocomplete suggestions for various properties and methods. ![Utilities Data Classes](../media/utilities_data_classes.png) ## Supported event sources -| Event Source | Data_class | -|-------------------------------------------------------------------------------|----------------------------------------------------| -| [Active MQ](#active-mq) | `ActiveMQEvent` | -| [API Gateway Authorizer](#api-gateway-authorizer) | `APIGatewayAuthorizerRequestEvent` | -| [API Gateway Authorizer V2](#api-gateway-authorizer-v2) | `APIGatewayAuthorizerEventV2` | -| [API Gateway Proxy](#api-gateway-proxy) | `APIGatewayProxyEvent` | -| [API Gateway Proxy V2](#api-gateway-proxy-v2) | `APIGatewayProxyEventV2` | -| [Application Load Balancer](#application-load-balancer) | `ALBEvent` | -| [AppSync Authorizer](#appsync-authorizer) | `AppSyncAuthorizerEvent` | -| [AppSync Resolver](#appsync-resolver) | `AppSyncResolverEvent` | -| [AWS Config Rule](#aws-config-rule) | `AWSConfigRuleEvent` | -| [Bedrock Agent](#bedrock-agent) | `BedrockAgent` | -| [CloudFormation Custom Resource](#cloudformation-custom-resource) | `CloudFormationCustomResourceEvent` | -| [CloudWatch Alarm State Change Action](#cloudwatch-alarm-state-change-action) | `CloudWatchAlarmEvent` | -| [CloudWatch Dashboard Custom Widget](#cloudwatch-dashboard-custom-widget) | `CloudWatchDashboardCustomWidgetEvent` | -| [CloudWatch Logs](#cloudwatch-logs) | `CloudWatchLogsEvent` | -| [CodeDeploy Lifecycle Hook](#codedeploy-lifecycle-hook) | `CodeDeployLifecycleHookEvent` | -| [CodePipeline Job Event](#codepipeline-job) | `CodePipelineJobEvent` | -| [Cognito User Pool](#cognito-user-pool) | Multiple available under `cognito_user_pool_event` | -| [Connect Contact Flow](#connect-contact-flow) | `ConnectContactFlowEvent` | -| [DynamoDB streams](#dynamodb-streams) | `DynamoDBStreamEvent`, `DynamoDBRecordEventName` | -| [EventBridge](#eventbridge) | `EventBridgeEvent` | -| [Kafka](#kafka) | `KafkaEvent` | -| [Kinesis Data Stream](#kinesis-streams) | `KinesisStreamEvent` | -| [Kinesis Firehose Delivery Stream](#kinesis-firehose-delivery-stream) | `KinesisFirehoseEvent` | -| [Lambda Function URL](#lambda-function-url) | `LambdaFunctionUrlEvent` | -| [Rabbit MQ](#rabbit-mq) | `RabbitMQEvent` | -| [S3](#s3) | `S3Event` | -| [S3 Batch Operations](#s3-batch-operations) | `S3BatchOperationEvent` | -| [S3 Object Lambda](#s3-object-lambda) | `S3ObjectLambdaEvent` | -| [S3 EventBridge Notification](#s3-eventbridge-notification) | `S3EventBridgeNotificationEvent` | -| [SES](#ses) | `SESEvent` | -| [SNS](#sns) | `SNSEvent` | -| [SQS](#sqs) | `SQSEvent` | -| [VPC Lattice V2](#vpc-lattice-v2) | `VPCLatticeV2Event` | -| [VPC Lattice V1](#vpc-lattice-v1) | `VPCLatticeEvent` | +Each event source is linked to its corresponding GitHub file with the full set of properties, methods, and docstrings specific to each event type. + +| Event Source | Data_class | Properties | +|--------------|------------|------------| +| [Active MQ](#active-mq) | `ActiveMQEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/active_mq_event.py) | +| [API Gateway Authorizer](#api-gateway-authorizer) | `APIGatewayAuthorizerRequestEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py) | +| [API Gateway Authorizer V2](#api-gateway-authorizer-v2) | `APIGatewayAuthorizerEventV2` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py) | +| [API Gateway Proxy](#api-gateway-proxy) | `APIGatewayProxyEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py) | +| [API Gateway Proxy V2](#api-gateway-proxy-v2) | `APIGatewayProxyEventV2` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py) | +| [Application Load Balancer](#application-load-balancer) | `ALBEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/alb_event.py) | +| [AppSync Authorizer](#appsync-authorizer) | `AppSyncAuthorizerEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py) | +| [AppSync Resolver](#appsync-resolver) | `AppSyncResolverEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py) | +| [AWS Config Rule](#aws-config-rule) | `AWSConfigRuleEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py) | +| [Bedrock Agent](#bedrock-agent) | `BedrockAgent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py) | +| [CloudFormation Custom Resource](#cloudformation-custom-resource) | `CloudFormationCustomResourceEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py) | +| [CloudWatch Alarm State Change Action](#cloudwatch-alarm-state-change-action) | `CloudWatchAlarmEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py) | +| [CloudWatch Dashboard Custom Widget](#cloudwatch-dashboard-custom-widget) | `CloudWatchDashboardCustomWidgetEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py) | +| [CloudWatch Logs](#cloudwatch-logs) | `CloudWatchLogsEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py) | +| [CodeDeploy Lifecycle Hook](#codedeploy-lifecycle-hook) | `CodeDeployLifecycleHookEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py) | +| [CodePipeline Job Event](#codepipeline-job) | `CodePipelineJobEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py) | +| [Cognito User Pool](#cognito-user-pool) | Multiple available under `cognito_user_pool_event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py) | +| [Connect Contact Flow](#connect-contact-flow) | `ConnectContactFlowEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py) | +| [DynamoDB streams](#dynamodb-streams) | `DynamoDBStreamEvent`, `DynamoDBRecordEventName` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py) | +| [EventBridge](#eventbridge) | `EventBridgeEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py) | +| [Kafka](#kafka) | `KafkaEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/kafka_event.py) | +| [Kinesis Data Stream](#kinesis-streams) | `KinesisStreamEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py) | +| [Kinesis Firehose Delivery Stream](#kinesis-firehose-delivery-stream) | `KinesisFirehoseEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py) | +| [Lambda Function URL](#lambda-function-url) | `LambdaFunctionUrlEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py) | +| [Rabbit MQ](#rabbit-mq) | `RabbitMQEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py) | +| [S3](#s3) | `S3Event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_event.py) | +| [S3 Batch Operations](#s3-batch-operations) | `S3BatchOperationEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py) | +| [S3 Object Lambda](#s3-object-lambda) | `S3ObjectLambdaEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_object_event.py) | +| [S3 EventBridge Notification](#s3-eventbridge-notification) | `S3EventBridgeNotificationEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_event.py) | +| [SES](#ses) | `SESEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/ses_event.py) | +| [SNS](#sns) | `SNSEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/sns_event.py) | +| [SQS](#sqs) | `SQSEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/sqs_event.py) | +| [VPC Lattice V2](#vpc-lattice-v2) | `VPCLatticeV2Event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py) | +| [VPC Lattice V1](#vpc-lattice-v1) | `VPCLatticeEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py) | ???+ info - The examples provided below are far from exhaustive - the data classes themselves are designed to provide a form of - documentation inherently (via autocompletion, types and docstrings). + The examples showcase a subset of Event Source Data Classes capabilities - for comprehensive details, leverage your IDE's + autocompletion, refer to type hints and docstrings, and explore the [full API reference](https://docs.powertools.aws.dev/lambda/python/latest/api/utilities/data_classes/) for complete property listings of each event source. ### Active MQ @@ -121,119 +111,46 @@ It is used for [Active MQ payloads](https://docs.aws.amazon.com/lambda/latest/dg the [AWS blog post](https://aws.amazon.com/blogs/compute/using-amazon-mq-as-an-event-source-for-aws-lambda/){target="_blank"} for more details. -=== "app.py" +=== "active_mq_example.py" - ```python hl_lines="4-5 9-10" - from typing import Dict + ```python hl_lines="2 8" + --8<-- "examples/event_sources/src/active_mq_example.py" + ``` - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.active_mq_event import ActiveMQEvent +=== "active_mq_event.json" - logger = Logger() - - @event_source(data_class=ActiveMQEvent) - def lambda_handler(event: ActiveMQEvent, context): - for message in event.messages: - logger.debug(f"MessageID: {message.message_id}") - data: Dict = message.json_data - logger.debug("Process json in base64 encoded data str", data) + ```json hl_lines="6 9 18 21" + --8<-- "examples/event_sources/events/active_mq_event_example.json" ``` ### API Gateway Authorizer -> New in 1.20.0 - It is used for [API Gateway Rest API Lambda Authorizer payload](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html){target="_blank"}. Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayAuthorizerTokenEvent`** for type `TOKEN`. -=== "app_type_request.py" - - This example uses the `APIGatewayAuthorizerResponse` to decline a given request if the user is not found. - - When the user is found, it includes the user details in the request context that will be available to the back-end, and returns a full access policy for admin users. - - ```python hl_lines="2-6 29 36-42 47 49" - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( - DENY_ALL_RESPONSE, - APIGatewayAuthorizerRequestEvent, - APIGatewayAuthorizerResponse, - HttpVerb, - ) - from secrets import compare_digest - - - def get_user_by_token(token): - if compare_digest(token, "admin-foo"): - return {"id": 0, "name": "Admin", "isAdmin": True} - elif compare_digest(token, "regular-foo"): - return {"id": 1, "name": "Joe"} - else: - return None - - - @event_source(data_class=APIGatewayAuthorizerRequestEvent) - def handler(event: APIGatewayAuthorizerRequestEvent, context): - user = get_user_by_token(event.headers["Authorization"]) +=== "apigw_type_request.py" - if user is None: - # No user was found - # to return 401 - `{"message":"Unauthorized"}`, but pollutes lambda error count metrics - # raise Exception("Unauthorized") - # to return 403 - `{"message":"Forbidden"}` - return DENY_ALL_RESPONSE - - # parse the `methodArn` as an `APIGatewayRouteArn` - arn = event.parsed_arn - - # Create the response builder from parts of the `methodArn` - # and set the logged in user id and context - policy = APIGatewayAuthorizerResponse( - principal_id=user["id"], - context=user, - region=arn.region, - aws_account_id=arn.aws_account_id, - api_id=arn.api_id, - stage=arn.stage, - ) + ```python hl_lines="2-4 7" + --8<-- "examples/event_sources/src/apigw_authorizer_request.py" + ``` - # Conditional IAM Policy - if user.get("isAdmin", False): - policy.allow_all_routes() - else: - policy.allow_route(HttpVerb.GET.value, "/user-profile") +=== "apiGatewayAuthorizerRequestEvent.json" - return policy.asdict() + ```json hl_lines="11" + --8<-- "examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json" ``` -=== "app_type_token.py" - - ```python hl_lines="2-5 12-18 21 23-24" - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( - APIGatewayAuthorizerTokenEvent, - APIGatewayAuthorizerResponse, - ) +=== "apigw_type_token.py" - @event_source(data_class=APIGatewayAuthorizerTokenEvent) - def handler(event: APIGatewayAuthorizerTokenEvent, context): - arn = event.parsed_arn + ```python hl_lines="2 8" + --8<-- "examples/event_sources/src/apigw_authorizer_token.py" + ``` - policy = APIGatewayAuthorizerResponse( - principal_id="user", - region=arn.region, - aws_account_id=arn.aws_account_id, - api_id=arn.api_id, - stage=arn.stage - ) +=== "apiGatewayAuthorizerTokentEvent.json" - if event.authorization_token == "42": - policy.allow_all_routes() - else: - policy.deny_all_routes() - return policy.asdict() + ```json hl_lines="6 9 18 21" + --8<-- "examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json" ``` ### API Gateway Authorizer V2 From ae2a8f18faaccebf5a8336a71a5338279b32c674 Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Thu, 23 Jan 2025 17:34:39 -0300 Subject: [PATCH 2/7] update examples up to CloudFormation Custom Resource --- docs/utilities/data_classes.md | 265 +++++------------- .../events/active_mq_event_example.json | 27 ++ examples/event_sources/events/albEvent.json | 28 ++ .../apiGatewayAuthorizerRequestEvent.json | 29 ++ .../apiGatewayAuthorizerTokenEvent.json | 5 + .../events/apiGatewayAuthorizerV2Event.json | 52 ++++ .../events/apiGatewayProxyV2Event.json | 69 +++++ .../event_sources/events/apigw_event.json | 20 ++ .../events/appSyncAuthorizerEvent.json | 13 + .../events/appSyncResolverEvent.json | 71 +++++ .../events/awsConfigRuleScheduled.json | 13 + .../events/bedrockAgentEvent.json | 16 ++ .../cloudformationCustomResourceCreate.json | 13 + .../event_sources/src/active_mq_example.py | 18 ++ examples/event_sources/src/albEvent.py | 9 + examples/event_sources/src/apigw_auth_v2.py | 30 ++ .../src/apigw_authorizer_request.py | 29 ++ .../src/apigw_authorizer_token.py | 29 ++ .../src/apigw_proxy_decorator.py | 9 + examples/event_sources/src/apigw_proxy_v2.py | 9 + .../src/appSyncAuthorizerEvent.py | 33 +++ .../event_sources/src/appSyncResolverEvent.py | 57 ++++ examples/event_sources/src/aws_config_rule.py | 3 +- .../event_sources/src/bedrock_agent_event.py | 3 +- .../cloudformation_custom_resource_handler.py | 28 +- .../src/getting_started_data_classes.py | 9 + 26 files changed, 667 insertions(+), 220 deletions(-) create mode 100644 examples/event_sources/events/active_mq_event_example.json create mode 100644 examples/event_sources/events/albEvent.json create mode 100644 examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json create mode 100644 examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json create mode 100644 examples/event_sources/events/apiGatewayAuthorizerV2Event.json create mode 100644 examples/event_sources/events/apiGatewayProxyV2Event.json create mode 100644 examples/event_sources/events/apigw_event.json create mode 100644 examples/event_sources/events/appSyncAuthorizerEvent.json create mode 100644 examples/event_sources/events/appSyncResolverEvent.json create mode 100644 examples/event_sources/events/awsConfigRuleScheduled.json create mode 100644 examples/event_sources/events/bedrockAgentEvent.json create mode 100644 examples/event_sources/events/cloudformationCustomResourceCreate.json create mode 100644 examples/event_sources/src/active_mq_example.py create mode 100644 examples/event_sources/src/albEvent.py create mode 100644 examples/event_sources/src/apigw_auth_v2.py create mode 100644 examples/event_sources/src/apigw_authorizer_request.py create mode 100644 examples/event_sources/src/apigw_authorizer_token.py create mode 100644 examples/event_sources/src/apigw_proxy_decorator.py create mode 100644 examples/event_sources/src/apigw_proxy_v2.py create mode 100644 examples/event_sources/src/appSyncAuthorizerEvent.py create mode 100644 examples/event_sources/src/appSyncResolverEvent.py create mode 100644 examples/event_sources/src/getting_started_data_classes.py diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index e4151c52e17..968b79e3f71 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -41,10 +41,10 @@ You can initialize the appropriate data class by passing the Lambda event object Alternatively, you can use the `event_source` decorator to automatically parse the event. -=== "getting_started_data_classes_decorator.py" +=== "apigw_proxy_decorator.py" ```python hl_lines="1 3" - --8<-- "examples/event_sources/src/getting_started_data_classes_decorator.py" + --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" ``` === "apigw_event.json" @@ -137,270 +137,133 @@ Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayA === "apiGatewayAuthorizerRequestEvent.json" - ```json hl_lines="11" + ```json hl_lines="3 11" --8<-- "examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json" ``` === "apigw_type_token.py" - ```python hl_lines="2 8" + ```python hl_lines="2-4 7" --8<-- "examples/event_sources/src/apigw_authorizer_token.py" ``` === "apiGatewayAuthorizerTokentEvent.json" - ```json hl_lines="6 9 18 21" + ```json hl_lines="2 3" --8<-- "examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json" ``` ### API Gateway Authorizer V2 -> New in 1.20.0 - It is used for [API Gateway HTTP API Lambda Authorizer payload version 2](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html){target="_blank"}. See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-and-lambda-authorizers-for-amazon-api-gateway-http-apis/){target="_blank"} for more details. -=== "app.py" - - This example looks up user details via `x-token` header. It uses `APIGatewayAuthorizerResponseV2` to return a deny policy when user is not found or authorized. - - ```python hl_lines="2-5 21 24" - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( - APIGatewayAuthorizerEventV2, - APIGatewayAuthorizerResponseV2, - ) - from secrets import compare_digest - - - def get_user_by_token(token): - if compare_digest(token, "Foo"): - return {"name": "Foo"} - return None +=== "apigw_auth_v2.py" + ```python hl_lines="2-4 15" + --8<-- "examples/event_sources/src/apigw_auth_v2.py" + ``` - @event_source(data_class=APIGatewayAuthorizerEventV2) - def handler(event: APIGatewayAuthorizerEventV2, context): - user = get_user_by_token(event.headers["x-token"]) - - if user is None: - # No user was found, so we return not authorized - return APIGatewayAuthorizerResponseV2().asdict() +=== "apiGatewayAuthorizerV2Event.json" - # Found the user and setting the details in the context - return APIGatewayAuthorizerResponseV2(authorize=True, context=user).asdict() + ```json + --8<-- "examples/event_sources/events/apiGatewayAuthorizerV2Event.json" ``` ### API Gateway Proxy It is used for either API Gateway REST API or HTTP API using v1 proxy event. -=== "app.py" +=== "apigw_proxy_decorator.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEvent + ```python hl_lines="1 3" + --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" + ``` + +=== "apiGatewayProxyEvent.json" - @event_source(data_class=APIGatewayProxyEvent) - def lambda_handler(event: APIGatewayProxyEvent, context): - if "helloworld" in event.path and event.http_method == "GET": - request_context = event.request_context - identity = request_context.identity - user = identity.user - do_something_with(event.json_body, user) + ```json hl_lines="3 4" + --8<-- "examples/event_sources/events/apigw_event.json" ``` ### API Gateway Proxy V2 It is used for HTTP API using v2 proxy event. -=== "app.py" +=== "apigw_proxy_v2.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEventV2 + ```python hl_lines="1 3" + --8<-- "examples/event_sources/src/apigw_proxy_v2.py" + ``` + +=== "apiGatewayProxyEvent.json" - @event_source(data_class=APIGatewayProxyEventV2) - def lambda_handler(event: APIGatewayProxyEventV2, context): - if "helloworld" in event.path and event.http_method == "POST": - do_something_with(event.json_body, event.query_string_parameters) + ```json + --8<-- "examples/event_sources/events/apiGatewayProxyV2Event.json" ``` ### Application Load Balancer -Is it used for Application load balancer event. +Is it used for [Application load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) event. -=== "app.py" +=== "albEvent.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, ALBEvent + ```python hl_lines="1 3" + --8<-- "examples/event_sources/src/albEvent.py" + ``` + +=== "albEvent.json" - @event_source(data_class=ALBEvent) - def lambda_handler(event: ALBEvent, context): - if "helloworld" in event.path and event.http_method == "POST": - do_something_with(event.json_body, event.query_string_parameters) + ```json hl_lines="7 8" + --8<-- "examples/event_sources/events/albEvent.json" ``` ### AppSync Authorizer -> New in 1.20.0 - Used when building an [AWS_LAMBDA Authorization](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#aws-lambda-authorization){target="_blank"} with AppSync. See blog post [Introducing Lambda authorization for AWS AppSync GraphQL APIs](https://aws.amazon.com/blogs/mobile/appsync-lambda-auth/){target="_blank"} or read the Amplify documentation on using [AWS Lambda for authorization](https://docs.amplify.aws/lib/graphqlapi/authz/q/platform/js#aws-lambda){target="_blank"} with AppSync. -In this example extract the `requestId` as the `correlation_id` for logging, used `@event_source` decorator and builds the AppSync authorizer using the `AppSyncAuthorizerResponse` helper. - -=== "app.py" - - ```python - from typing import Dict - - from aws_lambda_powertools.logging import correlation_paths - from aws_lambda_powertools.logging.logger import Logger - from aws_lambda_powertools.utilities.data_classes.appsync_authorizer_event import ( - AppSyncAuthorizerEvent, - AppSyncAuthorizerResponse, - ) - from aws_lambda_powertools.utilities.data_classes.event_source import event_source - - logger = Logger() - - - def get_user_by_token(token: str): - """Look a user by token""" - ... +=== "appSyncAuthorizerEvent.py" + ```python hl_lines="5-7 20" + --8<-- "examples/event_sources/src/appSyncAuthorizerEvent.py" + ``` - @logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_AUTHORIZER) - @event_source(data_class=AppSyncAuthorizerEvent) - def lambda_handler(event: AppSyncAuthorizerEvent, context) -> Dict: - user = get_user_by_token(event.authorization_token) - - if not user: - # No user found, return not authorized - return AppSyncAuthorizerResponse().asdict() +=== "appSyncAuthorizerEvent.json" - return AppSyncAuthorizerResponse( - authorize=True, - resolver_context={"id": user.id}, - # Only allow admins to delete events - deny_fields=None if user.is_admin else ["Mutation.deleteEvent"], - ).asdict() + ```json + --8<-- "examples/event_sources/events/appSyncAuthorizerEvent.json" ``` ### AppSync Resolver -> New in 1.12.0 - Used when building Lambda GraphQL Resolvers with [Amplify GraphQL Transform Library](https://docs.amplify.aws/cli/graphql-transformer/function){target="_blank"} (`@function`), and [AppSync Direct Lambda Resolvers](https://aws.amazon.com/blogs/mobile/appsync-direct-lambda/){target="_blank"}. -In this example, we also use the new Logger `correlation_id` and built-in `correlation_paths` to extract, if available, X-Ray Trace ID in AppSync request headers: - -=== "app.py" - - ```python hl_lines="2-5 12 14 19 21 29-30" - from aws_lambda_powertools.logging import Logger, correlation_paths - from aws_lambda_powertools.utilities.data_classes.appsync_resolver_event import ( - AppSyncResolverEvent, - AppSyncIdentityCognito - ) - - logger = Logger() - - def get_locations(name: str = None, size: int = 0, page: int = 0): - """Your resolver logic here""" +The example serves as an AppSync resolver for the `locations` field of the `Merchant` type. It uses the `@event_source` decorator to parse the AppSync event, handles pagination and filtering for locations, and demonstrates `AppSyncIdentityCognito`. - @logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_RESOLVER) - def lambda_handler(event, context): - event: AppSyncResolverEvent = AppSyncResolverEvent(event) - - # Case insensitive look up of request headers - x_forwarded_for = event.headers.get("x-forwarded-for") - - # Support for AppSyncIdentityCognito or AppSyncIdentityIAM identity types - assert isinstance(event.identity, AppSyncIdentityCognito) - identity: AppSyncIdentityCognito = event.identity - - # Logging with correlation_id - logger.debug({ - "x-forwarded-for": x_forwarded_for, - "username": identity.username - }) - - if event.type_name == "Merchant" and event.field_name == "locations": - return get_locations(**event.arguments) - - raise ValueError(f"Unsupported field resolver: {event.field_name}") +=== "appSyncResolverEvent.py" + ```python hl_lines="2-4 8" + --8<-- "examples/event_sources/src/appSyncResolverEvent.py" ``` -=== "Example AppSync Event" +=== "appSyncResolverEvent.json" - ```json hl_lines="2-8 14 19 20" - { - "typeName": "Merchant", - "fieldName": "locations", - "arguments": { - "page": 2, - "size": 1, - "name": "value" - }, - "identity": { - "claims": { - "iat": 1615366261 - ... - }, - "username": "mike", - ... - }, - "request": { - "headers": { - "x-amzn-trace-id": "Root=1-60488877-0b0c4e6727ab2a1c545babd0", - "x-forwarded-for": "127.0.0.1" - ... - } - }, - ... - } - ``` - -=== "Example CloudWatch Log" - - ```json hl_lines="5 6 16" - { - "level":"DEBUG", - "location":"lambda_handler:22", - "message":{ - "x-forwarded-for":"127.0.0.1", - "username":"mike" - }, - "timestamp":"2021-03-10 12:38:40,062", - "service":"service_undefined", - "sampling_rate":0.0, - "cold_start":true, - "function_name":"func_name", - "function_memory_size":512, - "function_arn":"func_arn", - "function_request_id":"6735a29c-c000-4ae3-94e6-1f1c934f7f94", - "correlation_id":"Root=1-60488877-0b0c4e6727ab2a1c545babd0" - } + ```json + --8<-- "examples/event_sources/events/appSyncResolverEvent.json" ``` ### AWS Config Rule +The example utilizes AWSConfigRuleEvent to parse the incoming event. The function logs the message type of the invoking event and returns a simple success response. The example event receives a Scheduled Event Notification, but could also be ItemChanged and Oversized. + === "aws_config_rule.py" ```python hl_lines="3 11" --8<-- "examples/event_sources/src/aws_config_rule.py" ``` -=== "Event - ItemChanged" - ```json - --8<-- "examples/event_sources/src/aws_config_rule_item_changed.json" - ``` -=== "Event - Oversized" - ```json - --8<-- "examples/event_sources/src/aws_config_rule_oversized.json" - ``` === "Event - ScheduledNotification" ```json --8<-- "examples/event_sources/src/aws_config_rule_scheduled.json" @@ -408,20 +271,34 @@ In this example, we also use the new Logger `correlation_id` and built-in `corre ### Bedrock Agent -=== "app.py" +The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/) with `BedrockAgentEvent` to parse the incoming event. The function logs the action group and input text, then returns a structured response compatible with Bedrock Agent's expected format, including a mock response body. + +=== "bedrock_agent_event.py" - ```python hl_lines="2 8 10" + ```python hl_lines="2 6" --8<-- "examples/event_sources/src/bedrock_agent_event.py" ``` +=== "bedrockAgentEvent.json" + ```json + --8<-- "examples/event_sources/events/bedrockAgentEvent.json" + ``` + ### CloudFormation Custom Resource -=== "app.py" +The example focuses on the "Create" request type, generating a unique physical resource ID and logging the process. The function is structured to potentially handle "Update" and "Delete" operations as well. + +=== "cloudformation_custom_resource_handler.py" - ```python hl_lines="11 13 15 17 19" + ```python hl_lines="2-3 10 14 19" --8<-- "examples/event_sources/src/cloudformation_custom_resource_handler.py" ``` +=== "cloudformationCustomResourceCreate.json" + ```json + --8<-- "examples/event_sources/events/cloudformationCustomResourceCreate.json" + ``` + ### CloudWatch Dashboard Custom Widget === "app.py" diff --git a/examples/event_sources/events/active_mq_event_example.json b/examples/event_sources/events/active_mq_event_example.json new file mode 100644 index 00000000000..50da9596682 --- /dev/null +++ b/examples/event_sources/events/active_mq_event_example.json @@ -0,0 +1,27 @@ +{ + "eventSource": "aws:mq", + "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", + "messages": [ + { + "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-east-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", + "messageType": "jms/text-message", + "destination": { + "physicalName": "testQueue" + }, + "data": "QUJDOkFBQUE=", + "timestamp": 1598827811958, + "properties": { + "index": "1" + } + }, + { + "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-east-2.amazonaws.com-37557-1234520418293-4:1:1:1:2", + "messageType": "jms/bytes-message", + "destination": { + "physicalName": "testQueue2" + }, + "data": "LQaGQ82S48k=", + "timestamp": 1598827811959 + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/events/albEvent.json b/examples/event_sources/events/albEvent.json new file mode 100644 index 00000000000..9328cb39e12 --- /dev/null +++ b/examples/event_sources/events/albEvent.json @@ -0,0 +1,28 @@ +{ + "requestContext": { + "elb": { + "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a" + } + }, + "httpMethod": "GET", + "path": "/lambda", + "queryStringParameters": { + "query": "1234ABCD" + }, + "headers": { + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "accept-encoding": "gzip", + "accept-language": "en-US,en;q=0.9", + "connection": "keep-alive", + "host": "lambda-alb-123578498.us-east-2.elb.amazonaws.com", + "upgrade-insecure-requests": "1", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", + "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476", + "x-forwarded-for": "72.12.164.125", + "x-forwarded-port": "80", + "x-forwarded-proto": "http", + "x-imforwards": "20" + }, + "body": "Test", + "isBase64Encoded": false +} diff --git a/examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json b/examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json new file mode 100644 index 00000000000..920258aa396 --- /dev/null +++ b/examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json @@ -0,0 +1,29 @@ +{ + "version": "1.0", + "type": "REQUEST", + "methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request", + "identitySource": "user1,123", + "resource": "/request", + "path": "/request", + "httpMethod": "GET", + "headers": { + "X-AMZ-Date": "20170718T062915Z", + "HeaderAuth1": "headerValue1" + }, + "queryStringParameters": { + "QueryString1": "queryValue1" + }, + "stageVariables": { + "StageVar1": "stageValue1" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "abcdef123", + "httpMethod": "GET", + "identity": { + "sourceIp": "test-invoke-source-ip" + }, + "path": "/request", + "stage": "test" + } +} \ No newline at end of file diff --git a/examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json b/examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json new file mode 100644 index 00000000000..f30f360f6d8 --- /dev/null +++ b/examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json @@ -0,0 +1,5 @@ +{ + "type": "TOKEN", + "authorizationToken": "allow", + "methodArn": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/" +} diff --git a/examples/event_sources/events/apiGatewayAuthorizerV2Event.json b/examples/event_sources/events/apiGatewayAuthorizerV2Event.json new file mode 100644 index 00000000000..83c3c9d8d61 --- /dev/null +++ b/examples/event_sources/events/apiGatewayAuthorizerV2Event.json @@ -0,0 +1,52 @@ +{ + "version": "2.0", + "type": "REQUEST", + "routeArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request", + "identitySource": ["user1", "123"], + "routeKey": "GET /merchants", + "rawPath": "/merchants", + "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", + "cookies": ["cookie1", "cookie2"], + "headers": { + "x-amzn-trace-id": "Root=1-611cc4a7-0746ebee281cfd967db97b64", + "Header1": "value1", + "Header2": "value2", + "Authorization": "value" + }, + "queryStringParameters": { + "parameter1": "value1,value2", + "parameter2": "value" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "authentication": { + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/merchants", + "protocol": "HTTP/1.1", + "sourceIp": "10.10.10.10", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "GET /merchants", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "pathParameters": { "parameter1": "value1" }, + "stageVariables": { "stageVariable1": "value1", "stageVariable2": "value2" } +} diff --git a/examples/event_sources/events/apiGatewayProxyV2Event.json b/examples/event_sources/events/apiGatewayProxyV2Event.json new file mode 100644 index 00000000000..9de632b8e3d --- /dev/null +++ b/examples/event_sources/events/apiGatewayProxyV2Event.json @@ -0,0 +1,69 @@ +{ + "version": "2.0", + "routeKey": "$default", + "rawPath": "/my/path", + "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", + "cookies": [ + "cookie1", + "cookie2" + ], + "headers": { + "Header1": "value1", + "Header2": "value1,value2" + }, + "queryStringParameters": { + "parameter1": "value1,value2", + "parameter2": "value" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "authentication": { + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "authorizer": { + "jwt": { + "claims": { + "claim1": "value1", + "claim2": "value2" + }, + "scopes": [ + "scope1", + "scope2" + ] + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/my/path", + "protocol": "HTTP/1.1", + "sourceIp": "192.168.0.1/32", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "$default", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "body": "{\"message\": \"hello world\", \"username\": \"tom\"}", + "pathParameters": { + "parameter1": "value1" + }, + "isBase64Encoded": false, + "stageVariables": { + "stageVariable1": "value1", + "stageVariable2": "value2" + } +} diff --git a/examples/event_sources/events/apigw_event.json b/examples/event_sources/events/apigw_event.json new file mode 100644 index 00000000000..dc0efd36604 --- /dev/null +++ b/examples/event_sources/events/apigw_event.json @@ -0,0 +1,20 @@ +{ + "resource": "/helloworld", + "path": "/hello", + "httpMethod": "GET", + "headers": { + "Accept": "*/*", + "Host": "api.example.com" + }, + "queryStringParameters": { + "name": "John" + }, + "pathParameters": null, + "stageVariables": null, + "requestContext": { + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "stage": "prod" + }, + "body": null, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/event_sources/events/appSyncAuthorizerEvent.json b/examples/event_sources/events/appSyncAuthorizerEvent.json new file mode 100644 index 00000000000..8820f2ab00d --- /dev/null +++ b/examples/event_sources/events/appSyncAuthorizerEvent.json @@ -0,0 +1,13 @@ +{ + "authorizationToken": "123", + "requestContext": { + "apiId": "1234", + "accountId": "11111111", + "requestId": "1111", + "queryString": "mutation MyNewTask($desc: String!) {\n createTask(description: $desc, owner: \"ccc\", taskStatus: \"cc\", title: \"ccc\") {\n id\n }\n}\n", + "operationName": "MyNewTask", + "variables": { + "desc": "Foo" + } + } +} \ No newline at end of file diff --git a/examples/event_sources/events/appSyncResolverEvent.json b/examples/event_sources/events/appSyncResolverEvent.json new file mode 100644 index 00000000000..84ac71951c6 --- /dev/null +++ b/examples/event_sources/events/appSyncResolverEvent.json @@ -0,0 +1,71 @@ +{ + "typeName": "Merchant", + "fieldName": "locations", + "arguments": { + "page": 2, + "size": 1, + "name": "value" + }, + "identity": { + "claims": { + "sub": "07920713-4526-4642-9c88-2953512de441", + "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_POOL_ID", + "aud": "58rc9bf5kkti90ctmvioppukm9", + "event_id": "7f4c9383-abf6-48b7-b821-91643968b755", + "token_use": "id", + "auth_time": 1615366261, + "name": "Michael Brewer", + "exp": 1615369861, + "iat": 1615366261 + }, + "defaultAuthStrategy": "ALLOW", + "groups": null, + "issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_POOL_ID", + "sourceIp": [ + "11.215.2.22" + ], + "sub": "07920713-4526-4642-9c88-2953512de441", + "username": "mike" + }, + "source": { + "name": "Value", + "nested": { + "name": "value", + "list": [] + } + }, + "request": { + "headers": { + "x-forwarded-for": "11.215.2.22, 64.44.173.11", + "cloudfront-viewer-country": "US", + "cloudfront-is-tablet-viewer": "false", + "via": "2.0 SOMETHING.cloudfront.net (CloudFront)", + "cloudfront-forwarded-proto": "https", + "origin": "https://console.aws.amazon.com", + "content-length": "156", + "accept-language": "en-US,en;q=0.9", + "host": "SOMETHING.appsync-api.us-east-1.amazonaws.com", + "x-forwarded-proto": "https", + "sec-gpc": "1", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) etc.", + "accept": "*/*", + "cloudfront-is-mobile-viewer": "false", + "cloudfront-is-smarttv-viewer": "false", + "accept-encoding": "gzip, deflate, br", + "referer": "https://console.aws.amazon.com/", + "content-type": "application/json", + "sec-fetch-mode": "cors", + "x-amz-cf-id": "Fo5VIuvP6V6anIEt62WzFDCK45mzM4yEdpt5BYxOl9OFqafd-WR0cA==", + "x-amzn-trace-id": "Root=1-60488877-0b0c4e6727ab2a1c545babd0", + "authorization": "AUTH-HEADER", + "sec-fetch-dest": "empty", + "x-amz-user-agent": "AWS-Console-AppSync/", + "cloudfront-is-desktop-viewer": "true", + "sec-fetch-site": "cross-site", + "x-forwarded-port": "443" + } + }, + "prev": { + "result": {} + } +} diff --git a/examples/event_sources/events/awsConfigRuleScheduled.json b/examples/event_sources/events/awsConfigRuleScheduled.json new file mode 100644 index 00000000000..02ce2a0700c --- /dev/null +++ b/examples/event_sources/events/awsConfigRuleScheduled.json @@ -0,0 +1,13 @@ +{ + "version":"1.0", + "invokingEvent":"{\"awsAccountId\":\"0123456789012\",\"notificationCreationTime\":\"2023-04-27T13:26:17.741Z\",\"messageType\":\"ScheduledNotification\",\"recordVersion\":\"1.0\"}", + "ruleParameters":"{\"test\":\"x\"}", + "resultToken":"eyJlbmNyeXB0ZWREYXRhIjpbLTQyLDEyNiw1MiwtMzcsLTI5LDExNCwxMjYsLTk3LDcxLDIyLC0xMTAsMTEyLC0zMSwtOTMsLTQ5LC0xMDEsODIsMyw1NCw0OSwzLC02OSwtNzEsLTcyLDYyLDgxLC03MiwtODEsNTAsMzUsLTUwLC03NSwtMTE4LC0xMTgsNzcsMTIsLTEsMTQsMTIwLC03MCwxMTAsLTMsNTAsLTYwLDEwNSwtNTcsNDUsMTAyLC0xMDksLTYxLC0xMDEsLTYxLDQsNDcsLTg0LC0yNSwxMTIsNTQsLTcxLC0xMDksNDUsMTksMTIzLC0yNiwxMiwtOTYsLTczLDU0LC0xMDksOTIsNDgsLTU5LC04MywtMzIsODIsLTM2LC05MCwxOSw5OCw3Nyw3OCw0MCw4MCw3OCwtMTA1LDg3LC0xMTMsLTExNiwtNzIsMzAsLTY4LC00MCwtODksMTA5LC0xMDgsLTEyOCwyMiw3Miw3NywtMjEsNzYsODksOTQsLTU5LDgxLC0xMjEsLTEwNywtNjcsNjMsLTcsODIsLTg5LC00NiwtMzQsLTkyLDEyMiwtOTAsMTcsLTEyMywyMCwtODUsLTU5LC03MCw4MSwyNyw2Miw3NCwtODAsODAsMzcsNDAsMTE2LDkxLC0yNCw1MSwtNDEsLTc5LDI4LDEyMCw1MywtMTIyLC04MywxMjYsLTc4LDI1LC05OCwtMzYsMTMsMzIsODYsLTI1LDQ4LDMsLTEwMiwtMTYsMjQsLTMsODUsNDQsLTI4LDE0LDIyLDI3LC0xMjIsMTE4LDEwMSw3Myw1LDE4LDU4LC02NCwyMywtODYsLTExNCwyNCwwLDEwMCwyLDExNywtNjIsLTExOSwtMTI4LDE4LDY1LDkwLDE0LC0xMDIsMjEsODUsMTAwLDExNyw1NSwyOSwxMjcsNTQsNzcsNzIsNzQsMzIsNzgsMywtMTExLDExOCwtNzAsLTg2LDEyNywtNzQsNjAsMjIsNDgsMzcsODcsMTMsMCwtMTA1LDUsLTEyMiwtNzEsLTEwMCwxMDQsLTEyNiwtMTYsNzksLTMwLDEyMCw3NywtNzYsLTQxLC0xMDksMiw5NywtMTAxLC0xLDE1LDEyMywxMTksMTA4LDkxLC0yMCwtMTI1LC05NiwyLC05MiwtMTUsLTY3LC03NiwxMjEsMTA0LDEwNSw2NCwtNjIsMTAyLDgsNCwxMjEsLTQ1LC04MCwtODEsLTgsMTE4LDQ0LC04MiwtNDEsLTg0LDczLC0zNiwxMTcsODAsLTY5LC03MywxNCwtMTgsNzIsMzEsLTUsLTExMSwtMTI3LC00MywzNCwtOCw1NywxMDMsLTQyLDE4LC0zMywxMTcsLTI2LC0xMjQsLTEyNCwxNSw4OCwyMywxNiwtNTcsNTQsLTYsLTEwMiwxMTYsLTk5LC00NSwxMDAsLTM1LDg3LDM3LDYsOTgsMiwxMTIsNjAsLTMzLDE3LDI2LDk5LC0xMDUsNDgsLTEwNCwtMTE5LDc4LDYsLTU4LDk1LDksNDEsLTE2LDk2LDQxLC0yMiw5Niw3MiwxMTYsLTk1LC0xMDUsLTM2LC0xMjMsLTU1LDkxLC00NiwtNywtOTIsMzksNDUsODQsMTYsLTEyNCwtMTIyLC02OCwxLC0yOCwxMjIsLTYwLDgyLDEwMywtNTQsLTkyLDI3LC05OSwtMTI4LDY1LDcsLTcyLC0xMjcsNjIsLTIyLDIsLTExLDE4LC04OSwtMTA2LC03NCw3MSw4NiwtMTE2LC0yNSwtMTE1LC05Niw1NywtMzQsMjIsLTEyNCwtMTI1LC00LC00MSw0MiwtNTcsLTEwMyw0NSw3OCwxNCwtMTA2LDExMSw5OCwtOTQsLTcxLDUsNzUsMTksLTEyNCwtMzAsMzQsLTUwLDc1LC04NCwtNTAsLTU2LDUxLC0xNSwtMzYsNjEsLTk0LC03OSwtNDUsMTI2LC03NywtMTA1LC0yLC05MywtNiw4LC0zLDYsLTQyLDQ2LDEyNSw1LC05OCwxMyw2NywtMTAsLTEzLC05NCwtNzgsLTEyNywxMjEsLTI2LC04LC0xMDEsLTkxLDEyMSwtNDAsLTEyNCwtNjQsODQsLTcyLDYzLDE5LC04NF0sIm1hdGVyaWFsU2V0U2VyaWFsTnVtYmVyIjoxLCJpdlBhcmFtZXRlclNwZWMiOnsiaXYiOlszLC0xMCwtODUsMTE0LC05MCwxMTUsNzcsNTUsNTQsMTUsMzgsODQsLTExNiwxNCwtNDAsMjhdfX0=", + "eventLeftScope":false, + "executionRoleArn":"arn:aws:iam::0123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig", + "configRuleArn":"arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw1", + "configRuleName":"rule-ec2-test", + "configRuleId":"config-rule-pdmyw1", + "accountId":"0123456789012", + "evaluationMode":"DETECTIVE" + } diff --git a/examples/event_sources/events/bedrockAgentEvent.json b/examples/event_sources/events/bedrockAgentEvent.json new file mode 100644 index 00000000000..b7ad75b3c43 --- /dev/null +++ b/examples/event_sources/events/bedrockAgentEvent.json @@ -0,0 +1,16 @@ +{ + "actionGroup": "ClaimManagementActionGroup", + "messageVersion": "1.0", + "sessionId": "12345678912345", + "sessionAttributes": {}, + "promptSessionAttributes": {}, + "inputText": "I want to claim my insurance", + "agent": { + "alias": "TSTALIASID", + "name": "test", + "version": "DRAFT", + "id": "8ZXY0W8P1H" + }, + "httpMethod": "GET", + "apiPath": "/claims" +} diff --git a/examples/event_sources/events/cloudformationCustomResourceCreate.json b/examples/event_sources/events/cloudformationCustomResourceCreate.json new file mode 100644 index 00000000000..5c32d8c7aa1 --- /dev/null +++ b/examples/event_sources/events/cloudformationCustomResourceCreate.json @@ -0,0 +1,13 @@ +{ + "RequestType": "Create", + "ServiceToken": "arn:aws:lambda:us-east-1:xxx:function:xxxx-CrbuiltinfunctionidProvi-2vKAalSppmKe", + "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3.amazonaws.com/7F%7Cb1f50fdfc25f3b", + "StackId": "arn:aws:cloudformation:us-east-1:xxxx:stack/xxxx/271845b0-f2e8-11ed-90ac-0eeb25b8ae21", + "RequestId": "xxxxx-d2a0-4dfb-ab1f-xxxxxx", + "LogicalResourceId": "xxxxxxxxx", + "ResourceType": "Custom::MyType", + "ResourceProperties": { + "ServiceToken": "arn:aws:lambda:us-east-1:xxxxx:function:xxxxx", + "MyProps": "ss" + } +} \ No newline at end of file diff --git a/examples/event_sources/src/active_mq_example.py b/examples/event_sources/src/active_mq_example.py new file mode 100644 index 00000000000..983233606ec --- /dev/null +++ b/examples/event_sources/src/active_mq_example.py @@ -0,0 +1,18 @@ +import json + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.active_mq_event import ActiveMQEvent + +logger = Logger() + + +@event_source(data_class=ActiveMQEvent) +def lambda_handler(event: ActiveMQEvent, context): + for message in event.messages: + msg = message.message_id + msg_pn = message.destination_physicalname + + logger.info(f"Message ID: {msg} and physical name: {msg_pn}") + + return {"statusCode": 200, "body": json.dumps("Processing complete")} diff --git a/examples/event_sources/src/albEvent.py b/examples/event_sources/src/albEvent.py new file mode 100644 index 00000000000..fd2b6aef05b --- /dev/null +++ b/examples/event_sources/src/albEvent.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import ALBEvent, event_source + + +@event_source(data_class=ALBEvent) +def lambda_handler(event: ALBEvent, context): + if "lambda" in event.path and event.http_method == "GET": + return {"statusCode": 200, "body": f"Hello from path: {event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/apigw_auth_v2.py b/examples/event_sources/src/apigw_auth_v2.py new file mode 100644 index 00000000000..128c7a57a6a --- /dev/null +++ b/examples/event_sources/src/apigw_auth_v2.py @@ -0,0 +1,30 @@ +from secrets import compare_digest + +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerEventV2, + APIGatewayAuthorizerResponseV2, +) + + +def get_user_by_token(token): + if compare_digest(token, "value"): + return {"name": "Foo"} + return None + + +@event_source(data_class=APIGatewayAuthorizerEventV2) +def lambda_handler(event: APIGatewayAuthorizerEventV2, context): + user = get_user_by_token(event.headers.get("Authorization")) + + if user is None: + # No user was found, so we return not authorized + return APIGatewayAuthorizerResponseV2(authorize=False).asdict() + + # Found the user and setting the details in the context + response = APIGatewayAuthorizerResponseV2( + authorize=True, + context=user, + ) + + return response.asdict() diff --git a/examples/event_sources/src/apigw_authorizer_request.py b/examples/event_sources/src/apigw_authorizer_request.py new file mode 100644 index 00000000000..e0d81196af2 --- /dev/null +++ b/examples/event_sources/src/apigw_authorizer_request.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerRequestEvent, + APIGatewayAuthorizerResponse, +) + + +@event_source(data_class=APIGatewayAuthorizerRequestEvent) +def lambda_handler(event: APIGatewayAuthorizerRequestEvent, context): + # Simple auth check (replace with your actual auth logic) + is_authorized = event.headers.get("HeaderAuth1") == "headerValue1" + + if not is_authorized: + return {"principalId": "", "policyDocument": {"Version": "2012-10-17", "Statement": []}} + + arn = event.parsed_arn + + policy = APIGatewayAuthorizerResponse( + principal_id="user", + context={"user": "example"}, + region=arn.region, + aws_account_id=arn.aws_account_id, + api_id=arn.api_id, + stage=arn.stage, + ) + + policy.allow_all_routes() + + return policy.asdict() diff --git a/examples/event_sources/src/apigw_authorizer_token.py b/examples/event_sources/src/apigw_authorizer_token.py new file mode 100644 index 00000000000..e27eded5c7a --- /dev/null +++ b/examples/event_sources/src/apigw_authorizer_token.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerResponse, + APIGatewayAuthorizerTokenEvent, +) + + +@event_source(data_class=APIGatewayAuthorizerTokenEvent) +def lambda_handler(event: APIGatewayAuthorizerTokenEvent, context): + # Simple token check (replace with your actual token validation logic) + is_valid_token = event.authorization_token == "allow" + + if not is_valid_token: + return {"principalId": "", "policyDocument": {"Version": "2012-10-17", "Statement": []}} + + arn = event.parsed_arn + + policy = APIGatewayAuthorizerResponse( + principal_id="user", + context={"user": "example"}, + region=arn.region, + aws_account_id=arn.aws_account_id, + api_id=arn.api_id, + stage=arn.stage, + ) + + policy.allow_all_routes() + + return policy.asdict() diff --git a/examples/event_sources/src/apigw_proxy_decorator.py b/examples/event_sources/src/apigw_proxy_decorator.py new file mode 100644 index 00000000000..81db0b1a6aa --- /dev/null +++ b/examples/event_sources/src/apigw_proxy_decorator.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent, event_source + + +@event_source(data_class=APIGatewayProxyEvent) +def lambda_handler(event: APIGatewayProxyEvent, context): + if "hello" in event.path and event.http_method == "GET": + return {"statusCode": 200, "body": f"Hello from path: {event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/apigw_proxy_v2.py b/examples/event_sources/src/apigw_proxy_v2.py new file mode 100644 index 00000000000..fb468973e15 --- /dev/null +++ b/examples/event_sources/src/apigw_proxy_v2.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEventV2, event_source + + +@event_source(data_class=APIGatewayProxyEventV2) +def lambda_handler(event: APIGatewayProxyEventV2, context): + if "hello" in event.path and event.http_method == "POST": + return {"statusCode": 200, "body": f"Hello from path: {event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/appSyncAuthorizerEvent.py b/examples/event_sources/src/appSyncAuthorizerEvent.py new file mode 100644 index 00000000000..012f7beb016 --- /dev/null +++ b/examples/event_sources/src/appSyncAuthorizerEvent.py @@ -0,0 +1,33 @@ +from typing import Dict + +from aws_lambda_powertools.logging import correlation_paths +from aws_lambda_powertools.logging.logger import Logger +from aws_lambda_powertools.utilities.data_classes.appsync_authorizer_event import ( + AppSyncAuthorizerEvent, + AppSyncAuthorizerResponse, +) +from aws_lambda_powertools.utilities.data_classes.event_source import event_source + +logger = Logger() + + +def get_user_by_token(token: str): + """Look a user by token""" + ... + + +@logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_AUTHORIZER) +@event_source(data_class=AppSyncAuthorizerEvent) +def lambda_handler(event: AppSyncAuthorizerEvent, context) -> Dict: + user = get_user_by_token(event.authorization_token) + + if not user: + # No user found, return not authorized + return AppSyncAuthorizerResponse().asdict() + + return AppSyncAuthorizerResponse( + authorize=True, + resolver_context={"id": user.id}, + # Only allow admins to delete events + deny_fields=None if user.is_admin else ["Mutation.deleteEvent"], + ).asdict() diff --git a/examples/event_sources/src/appSyncResolverEvent.py b/examples/event_sources/src/appSyncResolverEvent.py new file mode 100644 index 00000000000..6884b0649fd --- /dev/null +++ b/examples/event_sources/src/appSyncResolverEvent.py @@ -0,0 +1,57 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.appsync_resolver_event import ( + AppSyncIdentityCognito, + AppSyncResolverEvent, +) +from aws_lambda_powertools.utilities.typing import LambdaContext + + +@event_source(data_class=AppSyncResolverEvent) +def lambda_handler(event: AppSyncResolverEvent, context: LambdaContext): + # Access the AppSync event details + type_name = event.type_name + field_name = event.field_name + arguments = event.arguments + source = event.source + + print(f"Resolving field '{field_name}' for type '{type_name}'") + print(f"Arguments: {arguments}") + print(f"Source: {source}") + + # Check if the identity is Cognito-based + if isinstance(event.identity, AppSyncIdentityCognito): + user_id = event.identity.sub + username = event.identity.username + print(f"Request from Cognito user: {username} (ID: {user_id})") + else: + print("Request is not from a Cognito-authenticated user") + + if type_name == "Merchant" and field_name == "locations": + page = arguments.get("page", 1) + size = arguments.get("size", 10) + name_filter = arguments.get("name") + + # Here you would typically fetch locations from a database + # This is a mock implementation + locations = [ + {"id": "1", "name": "Location 1", "address": "123 Main St"}, + {"id": "2", "name": "Location 2", "address": "456 Elm St"}, + {"id": "3", "name": "Location 3", "address": "789 Oak St"}, + ] + + # Apply name filter if provided + if name_filter: + locations = [loc for loc in locations if name_filter.lower() in loc["name"].lower()] + + # Apply pagination + start = (page - 1) * size + end = start + size + paginated_locations = locations[start:end] + + return { + "items": paginated_locations, + "totalCount": len(locations), + "nextToken": str(page + 1) if end < len(locations) else None, + } + else: + raise Exception(f"Unhandled field: {field_name} for type: {type_name}") diff --git a/examples/event_sources/src/aws_config_rule.py b/examples/event_sources/src/aws_config_rule.py index b81ae39bd25..07d87999982 100644 --- a/examples/event_sources/src/aws_config_rule.py +++ b/examples/event_sources/src/aws_config_rule.py @@ -3,13 +3,12 @@ AWSConfigRuleEvent, event_source, ) -from aws_lambda_powertools.utilities.typing import LambdaContext logger = Logger() @event_source(data_class=AWSConfigRuleEvent) -def lambda_handler(event: AWSConfigRuleEvent, context: LambdaContext): +def lambda_handler(event: AWSConfigRuleEvent, context): message_type = event.invoking_event.message_type logger.info(f"Logging {message_type} event rule", invoke_event=event.raw_invoking_event) diff --git a/examples/event_sources/src/bedrock_agent_event.py b/examples/event_sources/src/bedrock_agent_event.py index b16d3c86bad..31d5684fa08 100644 --- a/examples/event_sources/src/bedrock_agent_event.py +++ b/examples/event_sources/src/bedrock_agent_event.py @@ -1,12 +1,11 @@ from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.data_classes import BedrockAgentEvent, event_source -from aws_lambda_powertools.utilities.typing import LambdaContext logger = Logger() @event_source(data_class=BedrockAgentEvent) -def lambda_handler(event: BedrockAgentEvent, context: LambdaContext) -> dict: +def lambda_handler(event: BedrockAgentEvent, context) -> dict: input_text = event.input_text logger.info(f"Bedrock Agent {event.action_group} invoked with input", input_text=input_text) diff --git a/examples/event_sources/src/cloudformation_custom_resource_handler.py b/examples/event_sources/src/cloudformation_custom_resource_handler.py index fa5b85d54df..87fa2bd1ab9 100644 --- a/examples/event_sources/src/cloudformation_custom_resource_handler.py +++ b/examples/event_sources/src/cloudformation_custom_resource_handler.py @@ -13,31 +13,15 @@ def lambda_handler(event: CloudFormationCustomResourceEvent, context: LambdaCont request_type = event.request_type if request_type == "Create": - return on_create(event) - if request_type == "Update": - return on_update(event) - if request_type == "Delete": - return on_delete(event) + return on_create(event, context) + else: + raise ValueError(f"Invalid request type: {request_type}") -def on_create(event: CloudFormationCustomResourceEvent): +def on_create(event: CloudFormationCustomResourceEvent, context: LambdaContext): props = event.resource_properties logger.info(f"Create new resource with props {props}.") - # Add your create code here ... - physical_id = ... + physical_id = f"MyResource-{context.aws_request_id}" - return {"PhysicalResourceId": physical_id} - - -def on_update(event: CloudFormationCustomResourceEvent): - physical_id = event.physical_resource_id - props = event.resource_properties - logger.info(f"Update resource {physical_id} with props {props}.") - # ... - - -def on_delete(event: CloudFormationCustomResourceEvent): - physical_id = event.physical_resource_id - logger.info(f"Delete resource {physical_id}.") - # ... + return {"PhysicalResourceId": physical_id, "Data": {"Message": "Resource created successfully"}} diff --git a/examples/event_sources/src/getting_started_data_classes.py b/examples/event_sources/src/getting_started_data_classes.py new file mode 100644 index 00000000000..64119fc4c0f --- /dev/null +++ b/examples/event_sources/src/getting_started_data_classes.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent + + +def lambda_handler(event: dict, context): + api_event = APIGatewayProxyEvent(event) + if "hello" in api_event.path and api_event.http_method == "GET": + return {"statusCode": 200, "body": f"Hello from path: {api_event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} From 099464ab7155f6b7ea3502e631c97e4bc29fb3fe Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Fri, 24 Jan 2025 10:08:52 -0300 Subject: [PATCH 3/7] continue fixing the doc examples --- docs/utilities/data_classes.md | 120 ++++++------------ .../cloudWatchAlarmEventSingleMetric.json | 59 +++++++++ .../events/cloudWatchDashboardEvent.json | 38 ++++++ .../events/cloudWatchLogEvent.json | 5 + .../kinesisStreamCloudWatchLogsEvent.json | 36 ++++++ ...uthorizerEvent.py => appSyncAuthorizer.py} | 0 ...yncResolverEvent.py => appSyncResolver.py} | 0 ...edrock_agent_event.py => bedrock_agent.py} | 0 .../event_sources/src/cloudWatchDashboard.py | 24 ++++ examples/event_sources/src/cloudwatch_logs.py | 18 +++ .../src/kinesisStreamCloudWatchLogs.py | 17 +++ .../src/kinesis_batch_example.py | 29 +++++ 12 files changed, 268 insertions(+), 78 deletions(-) create mode 100644 examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json create mode 100644 examples/event_sources/events/cloudWatchDashboardEvent.json create mode 100644 examples/event_sources/events/cloudWatchLogEvent.json create mode 100644 examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json rename examples/event_sources/src/{appSyncAuthorizerEvent.py => appSyncAuthorizer.py} (100%) rename examples/event_sources/src/{appSyncResolverEvent.py => appSyncResolver.py} (100%) rename examples/event_sources/src/{bedrock_agent_event.py => bedrock_agent.py} (100%) create mode 100644 examples/event_sources/src/cloudWatchDashboard.py create mode 100644 examples/event_sources/src/cloudwatch_logs.py create mode 100644 examples/event_sources/src/kinesisStreamCloudWatchLogs.py create mode 100644 examples/event_sources/src/kinesis_batch_example.py diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 968b79e3f71..4e6723a33ea 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -224,10 +224,10 @@ Used when building an [AWS_LAMBDA Authorization](https://docs.aws.amazon.com/app See blog post [Introducing Lambda authorization for AWS AppSync GraphQL APIs](https://aws.amazon.com/blogs/mobile/appsync-lambda-auth/){target="_blank"} or read the Amplify documentation on using [AWS Lambda for authorization](https://docs.amplify.aws/lib/graphqlapi/authz/q/platform/js#aws-lambda){target="_blank"} with AppSync. -=== "appSyncAuthorizerEvent.py" +=== "appSyncAuthorizer.py" ```python hl_lines="5-7 20" - --8<-- "examples/event_sources/src/appSyncAuthorizerEvent.py" + --8<-- "examples/event_sources/src/appSyncAuthorizer.py" ``` === "appSyncAuthorizerEvent.json" @@ -243,10 +243,10 @@ and [AppSync Direct Lambda Resolvers](https://aws.amazon.com/blogs/mobile/appsyn The example serves as an AppSync resolver for the `locations` field of the `Merchant` type. It uses the `@event_source` decorator to parse the AppSync event, handles pagination and filtering for locations, and demonstrates `AppSyncIdentityCognito`. -=== "appSyncResolverEvent.py" +=== "appSyncResolver.py" ```python hl_lines="2-4 8" - --8<-- "examples/event_sources/src/appSyncResolverEvent.py" + --8<-- "examples/event_sources/src/appSyncResolver.py" ``` === "appSyncResolverEvent.json" @@ -273,10 +273,10 @@ The example utilizes AWSConfigRuleEvent to parse the incoming event. The functio The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/) with `BedrockAgentEvent` to parse the incoming event. The function logs the action group and input text, then returns a structured response compatible with Bedrock Agent's expected format, including a mock response body. -=== "bedrock_agent_event.py" +=== "bedrock_agent.py" ```python hl_lines="2 6" - --8<-- "examples/event_sources/src/bedrock_agent_event.py" + --8<-- "examples/event_sources/src/bedrock_agent.py" ``` === "bedrockAgentEvent.json" @@ -286,7 +286,7 @@ The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/ ### CloudFormation Custom Resource -The example focuses on the "Create" request type, generating a unique physical resource ID and logging the process. The function is structured to potentially handle "Update" and "Delete" operations as well. +The example focuses on the `Create` request type, generating a unique physical resource ID and logging the process. The function is structured to potentially handle `Update` and `Delete` operations as well. === "cloudformation_custom_resource_handler.py" @@ -301,36 +301,17 @@ The example focuses on the "Create" request type, generating a unique physical r ### CloudWatch Dashboard Custom Widget -=== "app.py" - - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, CloudWatchDashboardCustomWidgetEvent - - const DOCS = ` - ## Echo - A simple echo script. Anything passed in \`\`\`echo\`\`\` parameter is returned as the content of custom widget. +Thie example for `CloudWatchDashboardCustomWidgetEvent` logs the dashboard name, extracts key information like widget ID and time range, and returns a formatted response with a title and markdown content. Read more about [custom widgets for Cloudwatch dashboard](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/add_custom_widget_samples.html). - ### Widget parameters - | Param | Description | - | -------- | ------------------------ | - | **echo** | The content to echo back | +=== "cloudWatchDashboard.py" - ### Example parameters - \`\`\` yaml - echo:

Hello world

- \`\`\` - ` - - @event_source(data_class=CloudWatchDashboardCustomWidgetEvent) - def lambda_handler(event: CloudWatchDashboardCustomWidgetEvent, context): - - if event.describe: - return DOCS + ```python hl_lines="2 6" + --8<-- "examples/event_sources/src/cloudWatchDashboard.py" + ``` - # You can directly return HTML or JSON content - # Alternatively, you can return markdown that will be rendered by CloudWatch - echo = event.widget_context.params["echo"] - return { "markdown": f"# {echo}" } +=== "cloudWatchDashboardEvent.json" + ```json + --8<-- "examples/event_sources/events/cloudWatchDashboardEvent.json" ``` ### CloudWatch Alarm State Change Action @@ -338,76 +319,59 @@ The example focuses on the "Create" request type, generating a unique physical r [CloudWatch supports Lambda as an alarm state change action](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarms-and-actions){target="_blank"}. You can use the `CloudWathAlarmEvent` data class to access the fields containing such data as alarm information, current state, and previous state. -=== "app.py" +=== "cloudwatch_alarm_event.py" ```python hl_lines="2 8" --8<-- "examples/event_sources/src/cloudwatch_alarm_event.py" ``` +=== "cloudWatchAlarmEventSingleMetric.json" + ```json + --8<-- "examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json" + ``` + ### CloudWatch Logs CloudWatch Logs events by default are compressed and base64 encoded. You can use the helper function provided to decode, decompress and parse json data from the event. -=== "app.py" +=== "cloudwatch_logs.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, CloudWatchLogsEvent - from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData + ```python hl_lines="2-3 7" + --8<-- "examples/event_sources/src/cloudwatch_logs.py" + ``` - @event_source(data_class=CloudWatchLogsEvent) - def lambda_handler(event: CloudWatchLogsEvent, context): - decompressed_log: CloudWatchLogsDecodedData = event.parse_logs_data() - log_events = decompressed_log.log_events - for event in log_events: - do_something_with(event.timestamp, event.message) +=== "cloudWatchLogEvent.json" + ```json + --8<-- "examples/event_sources/events/cloudWatchLogEvent.json" ``` #### Kinesis integration [When streaming CloudWatch Logs to a Kinesis Data Stream](https://aws.amazon.com/premiumsupport/knowledge-center/streaming-cloudwatch-logs/){target="_blank"} (cross-account or not), you can use `extract_cloudwatch_logs_from_event` to decode, decompress and extract logs as `CloudWatchLogsDecodedData` to ease log processing. -=== "app.py" - - ```python hl_lines="5-6 11" - from typing import List - - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData - from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( - KinesisStreamEvent, extract_cloudwatch_logs_from_event) +=== "kinesisStreamCloudWatchLogs.py" + ```python hl_lines="4-6 8" + --8<-- "examples/event_sources/src/kinesisStreamCloudWatchLogs.py" + ``` - @event_source(data_class=KinesisStreamEvent) - def simple_handler(event: KinesisStreamEvent, context): - logs: List[CloudWatchLogsDecodedData] = extract_cloudwatch_logs_from_event(event) - for log in logs: - if log.message_type == "DATA_MESSAGE": - return "success" - return "nothing to be processed" +=== "kinesisStreamCloudWatchLogsEvent.json" + ```json + --8<-- "examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json" ``` Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless integrate with the [Batch utility](./batch.md){target="_blank"} for more robust log processing. -=== "app.py" - - ```python hl_lines="3-4 10" - from aws_lambda_powertools.utilities.batch import (BatchProcessor, EventType, - batch_processor) - from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( - KinesisStreamRecord, extract_cloudwatch_logs_from_record) - - processor = BatchProcessor(event_type=EventType.KinesisDataStreams) - - - def record_handler(record: KinesisStreamRecord): - log = extract_cloudwatch_logs_from_record(record) - return log.message_type == "DATA_MESSAGE" +=== "kinesis_batch_example.py" + ```python hl_lines="7-9 15" + --8<-- "examples/event_sources/src/kinesis_batch_example.py" + ``` - @batch_processor(record_handler=record_handler, processor=processor) - def lambda_handler(event, context): - return processor.response() +=== "kinesisStreamCloudWatchLogsEvent.json" + ```json + --8<-- "examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json" ``` ### CodeDeploy LifeCycle Hook diff --git a/examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json b/examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json new file mode 100644 index 00000000000..fa5089cd6b5 --- /dev/null +++ b/examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json @@ -0,0 +1,59 @@ +{ + "source": "aws.cloudwatch", + "alarmArn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", + "accountId": "123456789012", + "time": "2024-02-17T11:53:08.431+0000", + "region": "eu-west-1", + "alarmData": { + "alarmName": "Test alert", + "state": { + "value": "ALARM", + "reason": "Threshold Crossed: 1 out of the last 1 datapoints [1.0 (17/02/24 11:51:00)] was less than the threshold (10.0) (minimum 1 datapoint for OK -> ALARM transition).", + "reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-02-17T11:53:08.423+0000\",\"startDate\":\"2024-02-17T11:51:00.000+0000\",\"statistic\":\"SampleCount\",\"period\":60,\"recentDatapoints\":[1.0],\"threshold\":10.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-02-17T11:51:00.000+0000\",\"sampleCount\":1.0,\"value\":1.0}]}", + "timestamp": "2024-02-17T11:53:08.431+0000" + }, + "previousState": { + "value": "OK", + "reason": "Threshold Crossed: 1 out of the last 1 datapoints [1.0 (17/02/24 11:50:00)] was not greater than the threshold (10.0) (minimum 1 datapoint for ALARM -> OK transition).", + "reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-02-17T11:51:31.460+0000\",\"startDate\":\"2024-02-17T11:50:00.000+0000\",\"statistic\":\"SampleCount\",\"period\":60,\"recentDatapoints\":[1.0],\"threshold\":10.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-02-17T11:50:00.000+0000\",\"sampleCount\":1.0,\"value\":1.0}]}", + "timestamp": "2024-02-17T11:51:31.462+0000" + }, + "configuration": { + "description": "This is description **here**", + "metrics": [ + { + "id": "e1", + "expression": "m1/m2", + "label": "Expression1", + "returnData": true + }, + { + "id": "m1", + "metricStat": { + "metric": { + "namespace": "AWS/Lambda", + "name": "Invocations", + "dimensions": {} + }, + "period": 60, + "stat": "SampleCount" + }, + "returnData": false + }, + { + "id": "m2", + "metricStat": { + "metric": { + "namespace": "AWS/Lambda", + "name": "Duration", + "dimensions": {} + }, + "period": 60, + "stat": "SampleCount" + }, + "returnData": false + } + ] + } + } +} diff --git a/examples/event_sources/events/cloudWatchDashboardEvent.json b/examples/event_sources/events/cloudWatchDashboardEvent.json new file mode 100644 index 00000000000..fd2d3be62d6 --- /dev/null +++ b/examples/event_sources/events/cloudWatchDashboardEvent.json @@ -0,0 +1,38 @@ +{ + "original": "param-to-widget", + "widgetContext": { + "dashboardName": "Name-of-current-dashboard", + "widgetId": "widget-16", + "domain": "https://us-east-1.console.aws.amazon.com", + "accountId": "123456789123", + "locale": "en", + "timezone": { + "label": "UTC", + "offsetISO": "+00:00", + "offsetInMinutes": 0 + }, + "period": 300, + "isAutoPeriod": true, + "timeRange": { + "mode": "relative", + "start": 1627236199729, + "end": 1627322599729, + "relativeStart": 86400012, + "zoom": { + "start": 1627276030434, + "end": 1627282956521 + } + }, + "theme": "light", + "linkCharts": true, + "title": "Tweets for Amazon website problem", + "forms": { + "all": {} + }, + "params": { + "original": "param-to-widget" + }, + "width": 588, + "height": 369 + } +} diff --git a/examples/event_sources/events/cloudWatchLogEvent.json b/examples/event_sources/events/cloudWatchLogEvent.json new file mode 100644 index 00000000000..aa184c1d013 --- /dev/null +++ b/examples/event_sources/events/cloudWatchLogEvent.json @@ -0,0 +1,5 @@ +{ + "awslogs": { + "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA==" + } +} diff --git a/examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json b/examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json new file mode 100644 index 00000000000..000f37935d3 --- /dev/null +++ b/examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json @@ -0,0 +1,36 @@ +{ + "Records": [ + { + "kinesis": { + "kinesisSchemaVersion": "1.0", + "partitionKey": "123456789", + "sequenceNumber": "49635052289529725553291405521504870233219489715332317186", + "data": "H4sIAAAAAAAAAK2Sa2vbMBSG/4ox+xg3Oror39IlvaztVmJv7WjCUGwl8+ZLZstts5L/vuOsZYUyWGEgJHiP9J7nvOghLF3b2rVLthsXjsLJOBl/uZjG8fh4Gg7C+q5yDcqUAWcSONHEoFzU6+Om7jZYGdq7dljYcpnZ4cZHwLWOJl1Zbs/r9cR6e9RVqc/rKlpXV9eXt+fy27vt8W+L2DfOlr07oXQIMAQyvHlzPk6mcbKgciktF5lQfMU5dZZqzrShLF2uFC60aLtlmzb5prc/ygvvmjYc3YRPFG+LusuurE+/Ikqb1Gd55dq8jV+8isT6+317Rk42J5PTcLFnm966yvd2D2GeISJTYIwCJSQ1BE9OtWZCABWaKMIJAMdDMyU5MYZLhmkxBhQxfY4Re1tiWiAlBsgIVQTE4Cl6tI+T8SwJZu5Hh1dPs1FApOMSDI9WVKmIC+4irTMWQZYpx7QkztrgE06MU4yCx9DmVbgbvABmQJTGtkYAB0NwEwyYQUBpqEFuSbkGrThTRKi/AlP+HHj6fvJa3P9Ap/+Rbja9/PD6POd+0jXW7xM1B8CDsp37w7woXBb8qQDZ6xeurJttEOc/HWpUBxeHKNr74LHwsXXYlsm9flrl/rmFIQeS7m3m1fVs/DlIGpu6nhMiyWQGXNKIMbcCIgkhElKbaZnZpYJUz33s1iV+z/6+StMlR3yphHNcCyxiNEXf2zed6xuEu8XuF2wb6krnAwAA", + "approximateArrivalTimestamp": 1668093033.744 + }, + "eventSource": "aws:kinesis", + "eventVersion": "1.0", + "eventID": "shardId-000000000000:49635052289529725553291405521504870233219489715332317186", + "eventName": "aws:kinesis:record", + "invokeIdentityArn": "arn:aws:iam::231436140809:role/pt-1488-CloudWatchKinesisLogsFunctionRole-1M4G2TIWIE49", + "awsRegion": "eu-west-1", + "eventSourceARN": "arn:aws:kinesis:eu-west-1:231436140809:stream/pt-1488-KinesisStreamCloudWatchLogs-D8tHs0im0aJG" + }, + { + "kinesis": { + "kinesisSchemaVersion": "1.0", + "partitionKey": "12345678910", + "sequenceNumber": "49635052289529725553291405520881064510298312199003701250", + "data": "H4sIAAAAAAAAAK2SW2/TQBCF/4pl8ViTvc7u5i0laVraQhUbWtREaG1PgsGXYK/bhqr/nXVoBRIgUYnXc2bPfHO092GFXWc3mOy2GI7D6SSZfDyfxfFkPgsPwua2xtbLjFPBgQqiifFy2WzmbdNvvTOyt92otFWa29HWRVRoHU37qtqdNZupdfaorzNXNHW0qS+vLm7O4PPr3fxHROxatNWQThgbUTqiZHT94mySzOJkBUqYLOWY8ZQLbaTRkEvDciUYzWzKfETXp13WFtsh/qgoHbZdOL4OnyhelU2fX1qXffIoXdKcFjV2RRf/9iqSmy933Sk53h5PT8LVnm12g7Ub4u7DIveIXFFjFNGUKUlAaMY0EUJKLjkQbxhKGCWeknMKoAGUkYoJ7TFd4St2tvJtDRYxDAg3VB08Ve/j42SySIIFfu396Ek+DkS+xkwAiYhM00isgUV6jXmEMrM5EmMsh+C9v9hfMQ4eS1vW4cPBH4CZVpoTJkEIAp5RUMo8vGFae3JNCCdUccMVgPw7sP4VePZm+lzc/0AH/0i3mF28fX6fSzftW+v2jZKXRgVVt3SHRVliHvx06F4+x6ppd0FcfEMvMR2cH3rR3gWPxrsO/Vau9vqyvlpMPgRJazMcYGgEHHLKBhLGJaBA0JLxNc0JppoS9Cwxbir/B4d5QDBAQSnfFFGp8aa/vxw2uLbHYUH4sHr4Dj5RJxfMAwAA", + "approximateArrivalTimestamp": 1668092612.992 + }, + "eventSource": "aws:kinesis", + "eventVersion": "1.0", + "eventID": "shardId-000000000000:49635052289529725553291405520881064510298312199003701250", + "eventName": "aws:kinesis:record", + "invokeIdentityArn": "arn:aws:iam::231436140809:role/pt-1488-CloudWatchKinesisLogsFunctionRole-1M4G2TIWIE49", + "awsRegion": "eu-west-1", + "eventSourceARN": "arn:aws:kinesis:eu-west-1:231436140809:stream/pt-1488-KinesisStreamCloudWatchLogs-D8tHs0im0aJG" + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/src/appSyncAuthorizerEvent.py b/examples/event_sources/src/appSyncAuthorizer.py similarity index 100% rename from examples/event_sources/src/appSyncAuthorizerEvent.py rename to examples/event_sources/src/appSyncAuthorizer.py diff --git a/examples/event_sources/src/appSyncResolverEvent.py b/examples/event_sources/src/appSyncResolver.py similarity index 100% rename from examples/event_sources/src/appSyncResolverEvent.py rename to examples/event_sources/src/appSyncResolver.py diff --git a/examples/event_sources/src/bedrock_agent_event.py b/examples/event_sources/src/bedrock_agent.py similarity index 100% rename from examples/event_sources/src/bedrock_agent_event.py rename to examples/event_sources/src/bedrock_agent.py diff --git a/examples/event_sources/src/cloudWatchDashboard.py b/examples/event_sources/src/cloudWatchDashboard.py new file mode 100644 index 00000000000..f1c806fd84c --- /dev/null +++ b/examples/event_sources/src/cloudWatchDashboard.py @@ -0,0 +1,24 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import CloudWatchDashboardCustomWidgetEvent, event_source + +logger = Logger() + + +@event_source(data_class=CloudWatchDashboardCustomWidgetEvent) +def lambda_handler(event: CloudWatchDashboardCustomWidgetEvent, context): + logger.info(f"Processing custom widget for dashboard: {event.widget_context.dashboard_name}") + + # Access specific event properties + widget_id = event.widget_context.widget_id + time_range_start = event.widget_context.time_range.start + time_range_end = event.widget_context.time_range.end + + # Your custom widget logic here + return { + "title": f"Custom Widget {widget_id}", + "markdown": f""" + Dashboard: {event.widget_context.dashboard_name} + Time Range: {time_range_start} to {time_range_end} + Theme: {event.widget_context.theme} + """, + } diff --git a/examples/event_sources/src/cloudwatch_logs.py b/examples/event_sources/src/cloudwatch_logs.py new file mode 100644 index 00000000000..95890275595 --- /dev/null +++ b/examples/event_sources/src/cloudwatch_logs.py @@ -0,0 +1,18 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import CloudWatchLogsEvent, event_source +from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData + +logger = Logger() + + +@event_source(data_class=CloudWatchLogsEvent) +def lambda_handler(event: CloudWatchLogsEvent, context): + decompressed_log: CloudWatchLogsDecodedData = event.parse_logs_data() + + logger.info(f"Log group: {decompressed_log.log_group}") + logger.info(f"Log stream: {decompressed_log.log_stream}") + + for log_event in decompressed_log.log_events: + logger.info(f"Timestamp: {log_event.timestamp}, Message: {log_event.message}") + + return {"statusCode": 200, "body": f"Processed {len(decompressed_log.log_events)} log events"} diff --git a/examples/event_sources/src/kinesisStreamCloudWatchLogs.py b/examples/event_sources/src/kinesisStreamCloudWatchLogs.py new file mode 100644 index 00000000000..fa6fccf2b17 --- /dev/null +++ b/examples/event_sources/src/kinesisStreamCloudWatchLogs.py @@ -0,0 +1,17 @@ +from typing import List + +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData +from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( + KinesisStreamEvent, + extract_cloudwatch_logs_from_event, +) + + +@event_source(data_class=KinesisStreamEvent) +def lambda_handler(event: KinesisStreamEvent, context): + logs: List[CloudWatchLogsDecodedData] = extract_cloudwatch_logs_from_event(event) + for log in logs: + if log.message_type == "DATA_MESSAGE": + return "success" + return "nothing to be processed" diff --git a/examples/event_sources/src/kinesis_batch_example.py b/examples/event_sources/src/kinesis_batch_example.py new file mode 100644 index 00000000000..0a7366fdd8b --- /dev/null +++ b/examples/event_sources/src/kinesis_batch_example.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.batch import ( + BatchProcessor, + EventType, + process_partial_response, +) +from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( + KinesisStreamRecord, + extract_cloudwatch_logs_from_record, +) + +logger = Logger() + +processor = BatchProcessor(event_type=EventType.KinesisDataStreams) + + +def record_handler(record: KinesisStreamRecord): + log = extract_cloudwatch_logs_from_record(record) + logger.info(f"Message type: {log.message_type}") + return log.message_type == "DATA_MESSAGE" + + +def lambda_handler(event, context): + return process_partial_response( + event=event, + record_handler=record_handler, + processor=processor, + context=context, + ) From 2e282183a3571221e944b377578debe34f78f31d Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Fri, 24 Jan 2025 12:09:52 -0300 Subject: [PATCH 4/7] examples up to lambda function url --- docs/utilities/data_classes.md | 425 +++++------------- .../events/codeDeployLifecycleHookEvent.json | 4 + .../events/codePipelineEvent.json | 34 ++ .../cognitoCreateAuthChallengeEvent.json | 29 ++ .../cognitoDefineAuthChallengeEvent.json | 32 ++ .../events/cognitoPostConfirmationEvent.json | 18 + ...gnitoVerifyAuthChallengeResponseEvent.json | 28 ++ .../events/connectContactFlowEventAll.json | 41 ++ .../events/dynamoStreamEvent.json | 65 +++ .../events/eventBridgeEvent.json | 17 + .../event_sources/events/kafkaEventMsk.json | 35 ++ .../events/kinesisFirehoseKinesisEvent.json | 32 ++ .../events/kinesisStreamEvent.json | 36 ++ .../event_sources/src/code_pipeline_job.py | 10 + .../src/codedeploy_lifecycle_hook.py | 9 + .../event_sources/src/cognito_create_auth.py | 11 + .../event_sources/src/cognito_define_auth.py | 29 ++ .../src/cognito_post_confirmation.py | 9 + .../event_sources/src/cognito_verify_auth.py | 10 + .../event_sources/src/connect_contact_flow.py | 14 + .../src/dynamodb_multiple_records.py | 10 + examples/event_sources/src/dynamodb_stream.py | 16 + .../event_sources/src/eventBridgeEvent.py | 11 + examples/event_sources/src/kafka_event.py | 12 + examples/event_sources/src/kinesis_streams.py | 37 ++ 25 files changed, 654 insertions(+), 320 deletions(-) create mode 100644 examples/event_sources/events/codeDeployLifecycleHookEvent.json create mode 100644 examples/event_sources/events/codePipelineEvent.json create mode 100644 examples/event_sources/events/cognitoCreateAuthChallengeEvent.json create mode 100644 examples/event_sources/events/cognitoDefineAuthChallengeEvent.json create mode 100644 examples/event_sources/events/cognitoPostConfirmationEvent.json create mode 100644 examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json create mode 100644 examples/event_sources/events/connectContactFlowEventAll.json create mode 100644 examples/event_sources/events/dynamoStreamEvent.json create mode 100644 examples/event_sources/events/eventBridgeEvent.json create mode 100644 examples/event_sources/events/kafkaEventMsk.json create mode 100644 examples/event_sources/events/kinesisFirehoseKinesisEvent.json create mode 100644 examples/event_sources/events/kinesisStreamEvent.json create mode 100644 examples/event_sources/src/code_pipeline_job.py create mode 100644 examples/event_sources/src/codedeploy_lifecycle_hook.py create mode 100644 examples/event_sources/src/cognito_create_auth.py create mode 100644 examples/event_sources/src/cognito_define_auth.py create mode 100644 examples/event_sources/src/cognito_post_confirmation.py create mode 100644 examples/event_sources/src/cognito_verify_auth.py create mode 100644 examples/event_sources/src/connect_contact_flow.py create mode 100644 examples/event_sources/src/dynamodb_multiple_records.py create mode 100644 examples/event_sources/src/dynamodb_stream.py create mode 100644 examples/event_sources/src/eventBridgeEvent.py create mode 100644 examples/event_sources/src/kafka_event.py create mode 100644 examples/event_sources/src/kinesis_streams.py diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 4e6723a33ea..232db8d87b5 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -131,7 +131,7 @@ Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayA === "apigw_type_request.py" - ```python hl_lines="2-4 7" + ```python hl_lines="2-4 8" --8<-- "examples/event_sources/src/apigw_authorizer_request.py" ``` @@ -143,7 +143,7 @@ Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayA === "apigw_type_token.py" - ```python hl_lines="2-4 7" + ```python hl_lines="2-4 8" --8<-- "examples/event_sources/src/apigw_authorizer_token.py" ``` @@ -160,7 +160,7 @@ See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-a === "apigw_auth_v2.py" - ```python hl_lines="2-4 15" + ```python hl_lines="2-4 16" --8<-- "examples/event_sources/src/apigw_auth_v2.py" ``` @@ -176,7 +176,7 @@ It is used for either API Gateway REST API or HTTP API using v1 proxy event. === "apigw_proxy_decorator.py" - ```python hl_lines="1 3" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" ``` @@ -192,7 +192,7 @@ It is used for HTTP API using v2 proxy event. === "apigw_proxy_v2.py" - ```python hl_lines="1 3" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/apigw_proxy_v2.py" ``` @@ -208,7 +208,7 @@ Is it used for [Application load balancer](https://docs.aws.amazon.com/elasticlo === "albEvent.py" - ```python hl_lines="1 3" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/albEvent.py" ``` @@ -245,7 +245,7 @@ The example serves as an AppSync resolver for the `locations` field of the `Merc === "appSyncResolver.py" - ```python hl_lines="2-4 8" + ```python hl_lines="2-4 9" --8<-- "examples/event_sources/src/appSyncResolver.py" ``` @@ -260,7 +260,7 @@ The example serves as an AppSync resolver for the `locations` field of the `Merc The example utilizes AWSConfigRuleEvent to parse the incoming event. The function logs the message type of the invoking event and returns a simple success response. The example event receives a Scheduled Event Notification, but could also be ItemChanged and Oversized. === "aws_config_rule.py" - ```python hl_lines="3 11" + ```python hl_lines="2-3 10" --8<-- "examples/event_sources/src/aws_config_rule.py" ``` @@ -275,7 +275,7 @@ The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/ === "bedrock_agent.py" - ```python hl_lines="2 6" + ```python hl_lines="2 7" --8<-- "examples/event_sources/src/bedrock_agent.py" ``` @@ -290,7 +290,7 @@ The example focuses on the `Create` request type, generating a unique physical r === "cloudformation_custom_resource_handler.py" - ```python hl_lines="2-3 10 14 19" + ```python hl_lines="2-3 11 15 20" --8<-- "examples/event_sources/src/cloudformation_custom_resource_handler.py" ``` @@ -305,7 +305,7 @@ Thie example for `CloudWatchDashboardCustomWidgetEvent` logs the dashboard name, === "cloudWatchDashboard.py" - ```python hl_lines="2 6" + ```python hl_lines="2 7" --8<-- "examples/event_sources/src/cloudWatchDashboard.py" ``` @@ -337,7 +337,7 @@ decompress and parse json data from the event. === "cloudwatch_logs.py" - ```python hl_lines="2-3 7" + ```python hl_lines="2-3 8" --8<-- "examples/event_sources/src/cloudwatch_logs.py" ``` @@ -352,7 +352,7 @@ decompress and parse json data from the event. === "kinesisStreamCloudWatchLogs.py" - ```python hl_lines="4-6 8" + ```python hl_lines="5-6 11" --8<-- "examples/event_sources/src/kinesisStreamCloudWatchLogs.py" ``` @@ -365,7 +365,7 @@ Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless int === "kinesis_batch_example.py" - ```python hl_lines="7-9 15" + ```python hl_lines="7-9 18" --8<-- "examples/event_sources/src/kinesis_batch_example.py" ``` @@ -380,72 +380,30 @@ CodeDeploy triggers Lambdas with this event when defined in [AppSpec definitions](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) to test applications at different stages of deployment. -=== "app.py" - ```python - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import ( - event_source, - CodeDeployLifecycleHookEvent, - ) +=== "codedeploy_lifecycle_hook.py" - logger = Logger() + ```python hl_lines="1-2 6" + --8<-- "examples/event_sources/src/codedeploy_lifecycle_hook.py" + ``` - def lambda_handler( - event: CodeDeployLifecycleHookEvent, context: LambdaContext - ) -> None: - deployment_id = event.deployment_id - lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id +=== "codeDeployLifecycleHookEvent.json" + ```json + --8<-- "examples/event_sources/events/codeDeployLifecycleHookEvent.json" ``` ### CodePipeline Job -Data classes and utility functions to help create continuous delivery pipelines tasks with AWS Lambda +Data classes and utility functions to help create continuous delivery pipelines tasks with AWS Lambda. -=== "app.py" +=== "code_pipeline_job.py" - ```python - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import event_source, CodePipelineJobEvent - - logger = Logger() + ```python hl_lines="1 3" + --8<-- "examples/event_sources/src/code_pipeline_job.py" + ``` - @event_source(data_class=CodePipelineJobEvent) - def lambda_handler(event, context): - """The Lambda function handler - - If a continuing job then checks the CloudFormation stack status - and updates the job accordingly. - - If a new job then kick of an update or creation of the target - CloudFormation stack. - """ - - # Extract the Job ID - job_id = event.get_id - - # Extract the params - params: dict = event.decoded_user_parameters - stack = params["stack"] - artifact_name = params["artifact"] - template_file = params["file"] - - try: - if event.data.continuation_token: - # If we're continuing then the create/update has already been triggered - # we just need to check if it has finished. - check_stack_update_status(job_id, stack) - else: - template = event.get_artifact(artifact_name, template_file) - # Kick off a stack update or create - start_update_or_create(job_id, stack, template) - except Exception as e: - # If any other exceptions which we didn't expect are raised - # then fail the job and log the exception message. - logger.exception("Function failed due to exception.") - put_job_failure(job_id, "Function exception: " + str(e)) - - logger.debug("Function complete.") - return "Complete." +=== "codePipelineEvent.json" + ```json hl_lines="3 19" + --8<-- "examples/event_sources/events/codePipelineEvent.json" ``` ### Cognito User Pool @@ -469,18 +427,19 @@ can be imported from `aws_lambda_powertools.data_classes.cognito_user_pool_event | Custom Email Sender | `data_classes.cognito_user_pool_event.CustomEmailSenderTriggerEvent` | | Custom SMS Sender | `data_classes.cognito_user_pool_event.CustomSMSSenderTriggerEvent` | -#### Post Confirmation Example +Some examples for the Cognito User Pools Lambda triggers sources: -=== "app.py" +#### Post Confirmation Example - ```python - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import PostConfirmationTriggerEvent +=== "cognito_post_confirmation.py" - def lambda_handler(event, context): - event: PostConfirmationTriggerEvent = PostConfirmationTriggerEvent(event) + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/cognito_post_confirmation.py" + ``` - user_attributes = event.request.user_attributes - do_something_with(user_attributes) +=== "cognitoPostConfirmationEvent.json" + ```json hl_lines="12-14" + --8<-- "examples/event_sources/events/cognitoPostConfirmationEvent.json" ``` #### Define Auth Challenge Example @@ -490,213 +449,60 @@ can be imported from `aws_lambda_powertools.data_classes.cognito_user_pool_event This example is based on the AWS Cognito docs for [Define Auth Challenge Lambda Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-define-auth-challenge.html){target="_blank"}. -=== "app.py" +=== "cognito_define_auth.py" - ```python - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import DefineAuthChallengeTriggerEvent - - def handler(event: dict, context) -> dict: - event: DefineAuthChallengeTriggerEvent = DefineAuthChallengeTriggerEvent(event) - if ( - len(event.request.session) == 1 - and event.request.session[0].challenge_name == "SRP_A" - ): - event.response.issue_tokens = False - event.response.fail_authentication = False - event.response.challenge_name = "PASSWORD_VERIFIER" - elif ( - len(event.request.session) == 2 - and event.request.session[1].challenge_name == "PASSWORD_VERIFIER" - and event.request.session[1].challenge_result - ): - event.response.issue_tokens = False - event.response.fail_authentication = False - event.response.challenge_name = "CUSTOM_CHALLENGE" - elif ( - len(event.request.session) == 3 - and event.request.session[2].challenge_name == "CUSTOM_CHALLENGE" - and event.request.session[2].challenge_result - ): - event.response.issue_tokens = True - event.response.fail_authentication = False - else: - event.response.issue_tokens = False - event.response.fail_authentication = True - - return event.raw_event - ``` -=== "SPR_A response" - - ```json hl_lines="25-27" - { - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "SRP_A", - "challengeResult": true - } - ] - }, - "response": { - "issueTokens": false, - "failAuthentication": false, - "challengeName": "PASSWORD_VERIFIER" - } - } - ``` -=== "PASSWORD_VERIFIER success response" - - ```json hl_lines="30-32" - { - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "SRP_A", - "challengeResult": true - }, - { - "challengeName": "PASSWORD_VERIFIER", - "challengeResult": true - } - ] - }, - "response": { - "issueTokens": false, - "failAuthentication": false, - "challengeName": "CUSTOM_CHALLENGE" - } - } - - ``` -=== "CUSTOM_CHALLENGE success response" - - ```json hl_lines="34 35" - { - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "SRP_A", - "challengeResult": true - }, - { - "challengeName": "PASSWORD_VERIFIER", - "challengeResult": true - }, - { - "challengeName": "CUSTOM_CHALLENGE", - "challengeResult": true - } - ] - }, - "response": { - "issueTokens": true, - "failAuthentication": false - } - } + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/cognito_define_auth.py" + ``` + +=== "cognitoDefineAuthChallengeEvent.json" + ```json + --8<-- "examples/event_sources/events/cognitoDefineAuthChallengeEvent.json" ``` #### Create Auth Challenge Example This example is based on the AWS Cognito docs for [Create Auth Challenge Lambda Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-create-auth-challenge.html){target="_blank"}. -=== "app.py" +=== "cognito_create_auth.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import CreateAuthChallengeTriggerEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/cognito_create_auth.py" + ``` - @event_source(data_class=CreateAuthChallengeTriggerEvent) - def handler(event: CreateAuthChallengeTriggerEvent, context) -> dict: - if event.request.challenge_name == "CUSTOM_CHALLENGE": - event.response.public_challenge_parameters = {"captchaUrl": "url/123.jpg"} - event.response.private_challenge_parameters = {"answer": "5"} - event.response.challenge_metadata = "CAPTCHA_CHALLENGE" - return event.raw_event +=== "cognitoCreateAuthChallengeEvent.json" + ```json + --8<-- "examples/event_sources/events/cognitoCreateAuthChallengeEvent.json" ``` #### Verify Auth Challenge Response Example This example is based on the AWS Cognito docs for [Verify Auth Challenge Response Lambda Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-verify-auth-challenge-response.html){target="_blank"}. -=== "app.py" +=== "cognito_verify_auth.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import VerifyAuthChallengeResponseTriggerEvent + ```python hl_lines="2 4" + --8<-- "examples/event_sources/src/cognito_verify_auth.py" + ``` - @event_source(data_class=VerifyAuthChallengeResponseTriggerEvent) - def handler(event: VerifyAuthChallengeResponseTriggerEvent, context) -> dict: - event.response.answer_correct = ( - event.request.private_challenge_parameters.get("answer") == event.request.challenge_answer - ) - return event.raw_event +=== "cognitoVerifyAuthChallengeResponseEvent.json" + ```json + --8<-- "examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json" ``` ### Connect Contact Flow -> New in 1.11.0 +The example integrates with [Amazon Connect](https://docs.aws.amazon.com/connect/latest/adminguide/what-is-amazon-connect.html) by handling contact flow events. The function converts the event into a `ConnectContactFlowEvent` object, providing a structured representation of the contact flow data. -=== "app.py" +=== "connect_contact_flow.py" - ```python - from aws_lambda_powertools.utilities.data_classes.connect_contact_flow_event import ( - ConnectContactFlowChannel, - ConnectContactFlowEndpointType, - ConnectContactFlowEvent, - ConnectContactFlowInitiationMethod, - ) + ```python hl_lines="1-5 9" + --8<-- "examples/event_sources/src/connect_contact_flow.py" + ``` - def lambda_handler(event, context): - event: ConnectContactFlowEvent = ConnectContactFlowEvent(event) - assert event.contact_data.attributes == {"Language": "en-US"} - assert event.contact_data.channel == ConnectContactFlowChannel.VOICE - assert event.contact_data.customer_endpoint.endpoint_type == ConnectContactFlowEndpointType.TELEPHONE_NUMBER - assert event.contact_data.initiation_method == ConnectContactFlowInitiationMethod.API +=== "connectContactFlowEventAll.json" + ```json + --8<-- "examples/event_sources/events/connectContactFlowEventAll.json" ``` ### DynamoDB Streams @@ -705,66 +511,47 @@ The DynamoDB data class utility provides the base class for `DynamoDBStreamEvent (`DynamoDBRecordEventName`). The class automatically deserializes DynamoDB types into their equivalent Python types. -=== "app.py" - - ```python - from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import ( - DynamoDBStreamEvent, - DynamoDBRecordEventName - ) - - def lambda_handler(event, context): - event: DynamoDBStreamEvent = DynamoDBStreamEvent(event) - - # Multiple records can be delivered in a single event - for record in event.records: - if record.event_name == DynamoDBRecordEventName.MODIFY: - do_something_with(record.dynamodb.new_image) - do_something_with(record.dynamodb.old_image) +=== "dynamodb_stream.py" + ```python hl_lines="1-3 7" + --8<-- "examples/event_sources/src/dynamodb_stream.py" ``` - -=== "multiple_records_types.py" - - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, DynamoDBStreamEvent - from aws_lambda_powertools.utilities.typing import LambdaContext - - - @event_source(data_class=DynamoDBStreamEvent) - def lambda_handler(event: DynamoDBStreamEvent, context: LambdaContext): - for record in event.records: - # {"N": "123.45"} => Decimal("123.45") - key: str = record.dynamodb.keys["id"] - print(key) +=== "dynamodb_multiple_records.py" + ```python hl_lines="1 5" + --8<-- "examples/event_sources/src/dynamodb_multiple_records.py" + ``` +=== "dynamoStreamEvent.json" + ```json + --8<-- "examples/event_sources/events/dynamoStreamEvent.json" ``` ### EventBridge -=== "app.py" + When an event matching a defined rule occurs in EventBridge, it can [automatically trigger a Lambda function](https://docs.aws.amazon.com/lambda/latest/dg/with-eventbridge-scheduler.html), passing the event data as input. - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, EventBridgeEvent +=== "eventBridgeEvent.py" - @event_source(data_class=EventBridgeEvent) - def lambda_handler(event: EventBridgeEvent, context): - do_something_with(event.detail) + ```python hl_lines="1 3" + --8<-- "examples/event_sources/src/eventBridgeEvent.py" + ``` +=== "eventBridgeEvent.json" + ```json + --8<-- "examples/event_sources/events/eventBridgeEvent.json" ``` ### Kafka This example is based on the AWS docs for [Amazon MSK](https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html){target="_blank"} and [self-managed Apache Kafka](https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html){target="_blank"}. -=== "app.py" - - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, KafkaEvent +=== "kafka_event.py" - @event_source(data_class=KafkaEvent) - def lambda_handler(event: KafkaEvent, context): - for record in event.records: - do_something_with(record.decoded_key, record.json_value) + ```python hl_lines="1 6" + --8<-- "examples/event_sources/src/kafka_event.py" + ``` +=== "kafkaEventMsk.json" + ```json + --8<-- "examples/event_sources/events/kafkaEventMsk.json" ``` ### Kinesis streams @@ -772,22 +559,15 @@ This example is based on the AWS docs for [Amazon MSK](https://docs.aws.amazon.c Kinesis events by default contain base64 encoded data. You can use the helper function to access the data either as json or plain text, depending on the original payload. -=== "app.py" - - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, KinesisStreamEvent - - @event_source(data_class=KinesisStreamEvent) - def lambda_handler(event: KinesisStreamEvent, context): - kinesis_record = next(event.records).kinesis - - # if data was delivered as text - data = kinesis_record.data_as_text() +=== "kinesis_streams.py" - # if data was delivered as json - data = kinesis_record.data_as_json() + ```python hl_lines="3 8" + --8<-- "examples/event_sources/src/kinesis_streams.py" + ``` - do_something_with(data) +=== "kinesisStreamEvent.json" + ```json + --8<-- "examples/event_sources/events/kinesisStreamEvent.json" ``` ### Kinesis Firehose delivery stream @@ -825,6 +605,11 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along 1. This record will now be sent to your [S3 bucket in the `processing-failed` folder](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html#data-transformation-failure-handling){target="_blank"}. +=== "kinesisFirehoseEvent.json" + ```json + --8<-- "examples/event_sources/events/kinesisFirehoseKinesisEvent.json" + ``` + ### Lambda Function URL === "app.py" diff --git a/examples/event_sources/events/codeDeployLifecycleHookEvent.json b/examples/event_sources/events/codeDeployLifecycleHookEvent.json new file mode 100644 index 00000000000..6e422a2d505 --- /dev/null +++ b/examples/event_sources/events/codeDeployLifecycleHookEvent.json @@ -0,0 +1,4 @@ +{ + "DeploymentId": "d-ABCDEF", + "LifecycleEventHookExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxx" +} diff --git a/examples/event_sources/events/codePipelineEvent.json b/examples/event_sources/events/codePipelineEvent.json new file mode 100644 index 00000000000..25269cbb387 --- /dev/null +++ b/examples/event_sources/events/codePipelineEvent.json @@ -0,0 +1,34 @@ +{ + "CodePipeline.job": { + "id": "11111111-abcd-1111-abcd-111111abcdef", + "accountId": "111111111111", + "data": { + "actionConfiguration": { + "configuration": { + "FunctionName": "MyLambdaFunctionForAWSCodePipeline", + "UserParameters": "some-input-such-as-a-URL" + } + }, + "inputArtifacts": [ + { + "name": "ArtifactName", + "revision": null, + "location": { + "type": "S3", + "s3Location": { + "bucketName": "the name of the bucket configured as the pipeline artifact store in Amazon S3, for example codepipeline-us-east-2-1234567890", + "objectKey": "the name of the application, for example CodePipelineDemoApplication.zip" + } + } + } + ], + "outputArtifacts": [], + "artifactCredentials": { + "accessKeyId": "", + "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "sessionToken": "MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=" + }, + "continuationToken": "A continuation token if continuing job" + } + } +} \ No newline at end of file diff --git a/examples/event_sources/events/cognitoCreateAuthChallengeEvent.json b/examples/event_sources/events/cognitoCreateAuthChallengeEvent.json new file mode 100644 index 00000000000..ad018ae0829 --- /dev/null +++ b/examples/event_sources/events/cognitoCreateAuthChallengeEvent.json @@ -0,0 +1,29 @@ +{ + "version": "1", + "region": "us-east-1", + "userPoolId": "us-east-1_example", + "userName": "UserName", + "callerContext": { + "awsSdkVersion": "awsSdkVersion", + "clientId": "clientId" + }, + "triggerSource": "CreateAuthChallenge_Authentication", + "request": { + "userAttributes": { + "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", + "email_verified": "true", + "name": "First Last", + "email": "create-auth@mail.com" + }, + "challengeName": "PASSWORD_VERIFIER", + "session" : [ + { + "challengeName": "CUSTOM_CHALLENGE", + "challengeResult": true, + "challengeMetadata": "CAPTCHA_CHALLENGE" + } + ], + "userNotFound": false + }, + "response": {} +} diff --git a/examples/event_sources/events/cognitoDefineAuthChallengeEvent.json b/examples/event_sources/events/cognitoDefineAuthChallengeEvent.json new file mode 100644 index 00000000000..80ea5ac2d98 --- /dev/null +++ b/examples/event_sources/events/cognitoDefineAuthChallengeEvent.json @@ -0,0 +1,32 @@ +{ + "version": "1", + "region": "us-east-1", + "userPoolId": "us-east-1_example", + "userName": "UserName", + "callerContext": { + "awsSdkVersion": "awsSdkVersion", + "clientId": "clientId" + }, + "triggerSource": "DefineAuthChallenge_Authentication", + "request": { + "userAttributes": { + "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", + "email_verified": "true", + "name": "First Last", + "email": "define-auth@mail.com" + }, + "session" : [ + { + "challengeName": "PASSWORD_VERIFIER", + "challengeResult": true + }, + { + "challengeName": "CUSTOM_CHALLENGE", + "challengeResult": true, + "challengeMetadata": "CAPTCHA_CHALLENGE" + } + ], + "userNotFound": true + }, + "response": {} +} diff --git a/examples/event_sources/events/cognitoPostConfirmationEvent.json b/examples/event_sources/events/cognitoPostConfirmationEvent.json new file mode 100644 index 00000000000..e88f98150ca --- /dev/null +++ b/examples/event_sources/events/cognitoPostConfirmationEvent.json @@ -0,0 +1,18 @@ +{ + "version": "string", + "triggerSource": "PostConfirmation_ConfirmSignUp", + "region": "us-east-1", + "userPoolId": "string", + "userName": "userName", + "callerContext": { + "awsSdkVersion": "awsSdkVersion", + "clientId": "clientId" + }, + "request": { + "userAttributes": { + "email": "user@example.com", + "email_verified": true + } + }, + "response": {} +} diff --git a/examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json b/examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json new file mode 100644 index 00000000000..2ebcdb5c278 --- /dev/null +++ b/examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json @@ -0,0 +1,28 @@ +{ + "version": "1", + "region": "us-east-1", + "userPoolId": "us-east-1_example", + "userName": "UserName", + "callerContext": { + "awsSdkVersion": "awsSdkVersion", + "clientId": "clientId" + }, + "triggerSource": "VerifyAuthChallengeResponse_Authentication", + "request": { + "userAttributes": { + "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", + "email_verified": "true", + "name": "First Last", + "email": "verify-auth@mail.com" + }, + "privateChallengeParameters": { + "answer": "challengeAnswer" + }, + "clientMetadata" : { + "foo": "value" + }, + "challengeAnswer": "challengeAnswer", + "userNotFound": true + }, + "response": {} +} diff --git a/examples/event_sources/events/connectContactFlowEventAll.json b/examples/event_sources/events/connectContactFlowEventAll.json new file mode 100644 index 00000000000..5850649b6eb --- /dev/null +++ b/examples/event_sources/events/connectContactFlowEventAll.json @@ -0,0 +1,41 @@ +{ + "Name": "ContactFlowEvent", + "Details": { + "ContactData": { + "Attributes": { + "Language": "en-US" + }, + "Channel": "VOICE", + "ContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", + "CustomerEndpoint": { + "Address": "+11234567890", + "Type": "TELEPHONE_NUMBER" + }, + "InitialContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", + "InitiationMethod": "API", + "InstanceARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa", + "MediaStreams": { + "Customer": { + "Audio": { + "StartFragmentNumber": "91343852333181432392682062622220590765191907586", + "StartTimestamp": "1565781909613", + "StreamARN": "arn:aws:kinesisvideo:eu-central-1:123456789012:stream/connect-contact-a3d73b84-ce0e-479a-a9dc-5637c9d30ac9/1565272947806" + } + } + }, + "PreviousContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", + "Queue": { + "ARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa/queue/5cba7cbf-1ecb-4b6d-b8bd-fe91079b3fc8", + "Name": "QueueOne" + }, + "SystemEndpoint": { + "Address": "+11234567890", + "Type": "TELEPHONE_NUMBER" + } + }, + "Parameters": { + "ParameterOne": "One", + "ParameterTwo": "Two" + } + } +} \ No newline at end of file diff --git a/examples/event_sources/events/dynamoStreamEvent.json b/examples/event_sources/events/dynamoStreamEvent.json new file mode 100644 index 00000000000..16009a7a956 --- /dev/null +++ b/examples/event_sources/events/dynamoStreamEvent.json @@ -0,0 +1,65 @@ +{ + "Records": [ + { + "eventID": "1", + "eventVersion": "1.0", + "dynamodb": { + "ApproximateCreationDateTime": 1693997155.0, + "Keys": { + "Id": { + "N": "101" + } + }, + "NewImage": { + "Message": { + "S": "New item!" + }, + "Id": { + "N": "101" + } + }, + "StreamViewType": "NEW_AND_OLD_IMAGES", + "SequenceNumber": "111", + "SizeBytes": 26 + }, + "awsRegion": "us-west-2", + "eventName": "INSERT", + "eventSourceARN": "eventsource_arn", + "eventSource": "aws:dynamodb" + }, + { + "eventID": "2", + "eventVersion": "1.0", + "dynamodb": { + "OldImage": { + "Message": { + "S": "New item!" + }, + "Id": { + "N": "101" + } + }, + "SequenceNumber": "222", + "Keys": { + "Id": { + "N": "101" + } + }, + "SizeBytes": 59, + "NewImage": { + "Message": { + "S": "This item has changed" + }, + "Id": { + "N": "101" + } + }, + "StreamViewType": "NEW_AND_OLD_IMAGES" + }, + "awsRegion": "us-west-2", + "eventName": "MODIFY", + "eventSourceARN": "source_arn", + "eventSource": "aws:dynamodb" + } + ] +} diff --git a/examples/event_sources/events/eventBridgeEvent.json b/examples/event_sources/events/eventBridgeEvent.json new file mode 100644 index 00000000000..65872cf9a34 --- /dev/null +++ b/examples/event_sources/events/eventBridgeEvent.json @@ -0,0 +1,17 @@ +{ + "version": "0", + "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", + "detail-type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "account": "111122223333", + "time": "2017-12-22T18:43:48Z", + "region": "us-west-1", + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0" + ], + "detail": { + "instance_id": "i-1234567890abcdef0", + "state": "terminated" + }, + "replay-name": "replay_archive" +} diff --git a/examples/event_sources/events/kafkaEventMsk.json b/examples/event_sources/events/kafkaEventMsk.json new file mode 100644 index 00000000000..5a35b89680a --- /dev/null +++ b/examples/event_sources/events/kafkaEventMsk.json @@ -0,0 +1,35 @@ +{ + "eventSource":"aws:kafka", + "eventSourceArn":"arn:aws:kafka:us-east-1:0123456789019:cluster/SalesCluster/abcd1234-abcd-cafe-abab-9876543210ab-4", + "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092", + "records":{ + "mytopic-0":[ + { + "topic":"mytopic", + "partition":0, + "offset":15, + "timestamp":1545084650987, + "timestampType":"CREATE_TIME", + "key":"cmVjb3JkS2V5", + "value":"eyJrZXkiOiJ2YWx1ZSJ9", + "headers":[ + { + "headerKey":[ + 104, + 101, + 97, + 100, + 101, + 114, + 86, + 97, + 108, + 117, + 101 + ] + } + ] + } + ] + } +} diff --git a/examples/event_sources/events/kinesisFirehoseKinesisEvent.json b/examples/event_sources/events/kinesisFirehoseKinesisEvent.json new file mode 100644 index 00000000000..8ac0ba93bd5 --- /dev/null +++ b/examples/event_sources/events/kinesisFirehoseKinesisEvent.json @@ -0,0 +1,32 @@ +{ + "invocationId": "2b4d1ad9-2f48-94bd-a088-767c317e994a", + "sourceKinesisStreamArn": "arn:aws:kinesis:us-east-1:123456789012:stream/kinesis-source", + "deliveryStreamArn": "arn:aws:firehose:us-east-2:123456789012:deliverystream/delivery-stream-name", + "region": "us-east-2", + "records": [ + { + "data": "SGVsbG8gV29ybGQ=", + "recordId": "record1", + "approximateArrivalTimestamp": 1664028820148, + "kinesisRecordMetadata": { + "shardId": "shardId-000000000000", + "partitionKey": "1234", + "approximateArrivalTimestamp": 1664028820148, + "sequenceNumber": "49546986683135544286507457936321625675700192471156785154", + "subsequenceNumber": 0 + } + }, + { + "data": "eyJIZWxsbyI6ICJXb3JsZCJ9", + "recordId": "record2", + "approximateArrivalTimestamp": 1664028793294, + "kinesisRecordMetadata": { + "shardId": "shardId-000000000001", + "partitionKey": "4567", + "approximateArrivalTimestamp": 1664028793294, + "sequenceNumber": "49546986683135544286507457936321625675700192471156785155", + "subsequenceNumber": 0 + } + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/events/kinesisStreamEvent.json b/examples/event_sources/events/kinesisStreamEvent.json new file mode 100644 index 00000000000..ef8e2096388 --- /dev/null +++ b/examples/event_sources/events/kinesisStreamEvent.json @@ -0,0 +1,36 @@ +{ + "Records": [ + { + "kinesis": { + "kinesisSchemaVersion": "1.0", + "partitionKey": "1", + "sequenceNumber": "49590338271490256608559692538361571095921575989136588898", + "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==", + "approximateArrivalTimestamp": 1545084650.987 + }, + "eventSource": "aws:kinesis", + "eventVersion": "1.0", + "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898", + "eventName": "aws:kinesis:record", + "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", + "awsRegion": "us-east-2", + "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" + }, + { + "kinesis": { + "kinesisSchemaVersion": "1.0", + "partitionKey": "1", + "sequenceNumber": "49590338271490256608559692540925702759324208523137515618", + "data": "VGhpcyBpcyBvbmx5IGEgdGVzdC4=", + "approximateArrivalTimestamp": 1545084711.166 + }, + "eventSource": "aws:kinesis", + "eventVersion": "1.0", + "eventID": "shardId-000000000006:49590338271490256608559692540925702759324208523137515618", + "eventName": "aws:kinesis:record", + "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", + "awsRegion": "us-east-2", + "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" + } + ] +} diff --git a/examples/event_sources/src/code_pipeline_job.py b/examples/event_sources/src/code_pipeline_job.py new file mode 100644 index 00000000000..39db6e60b9e --- /dev/null +++ b/examples/event_sources/src/code_pipeline_job.py @@ -0,0 +1,10 @@ +from aws_lambda_powertools.utilities.data_classes import CodePipelineJobEvent, event_source + + +@event_source(data_class=CodePipelineJobEvent) +def lambda_handler(event: CodePipelineJobEvent, context): + job_id = event.get_id + + input_bucket = event.input_bucket_name + + return {"statusCode": 200, "body": f"Processed job {job_id} from bucket {input_bucket}"} diff --git a/examples/event_sources/src/codedeploy_lifecycle_hook.py b/examples/event_sources/src/codedeploy_lifecycle_hook.py new file mode 100644 index 00000000000..862dc75de8b --- /dev/null +++ b/examples/event_sources/src/codedeploy_lifecycle_hook.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import CodeDeployLifecycleHookEvent, event_source + + +@event_source(data_class=CodeDeployLifecycleHookEvent) +def lambda_handler(event: CodeDeployLifecycleHookEvent, context) -> None: + deployment_id = event.deployment_id + lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id + + return {"deployment_id": deployment_id, "lifecycle_event_hook_execution_id": lifecycle_event_hook_execution_id} diff --git a/examples/event_sources/src/cognito_create_auth.py b/examples/event_sources/src/cognito_create_auth.py new file mode 100644 index 00000000000..9f57743f053 --- /dev/null +++ b/examples/event_sources/src/cognito_create_auth.py @@ -0,0 +1,11 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import CreateAuthChallengeTriggerEvent + + +@event_source(data_class=CreateAuthChallengeTriggerEvent) +def handler(event: CreateAuthChallengeTriggerEvent, context) -> dict: + if event.request.challenge_name == "CUSTOM_CHALLENGE": + event.response.public_challenge_parameters = {"captchaUrl": "url/123.jpg"} + event.response.private_challenge_parameters = {"answer": "5"} + event.response.challenge_metadata = "CAPTCHA_CHALLENGE" + return event.raw_event diff --git a/examples/event_sources/src/cognito_define_auth.py b/examples/event_sources/src/cognito_define_auth.py new file mode 100644 index 00000000000..5ca425de0f9 --- /dev/null +++ b/examples/event_sources/src/cognito_define_auth.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import DefineAuthChallengeTriggerEvent + + +def lambda_handler(event: dict, context) -> dict: + event: DefineAuthChallengeTriggerEvent = DefineAuthChallengeTriggerEvent(event) + if len(event.request.session) == 1 and event.request.session[0].challenge_name == "SRP_A": + event.response.issue_tokens = False + event.response.fail_authentication = False + event.response.challenge_name = "PASSWORD_VERIFIER" + elif ( + len(event.request.session) == 2 + and event.request.session[1].challenge_name == "PASSWORD_VERIFIER" + and event.request.session[1].challenge_result + ): + event.response.issue_tokens = False + event.response.fail_authentication = False + event.response.challenge_name = "CUSTOM_CHALLENGE" + elif ( + len(event.request.session) == 3 + and event.request.session[2].challenge_name == "CUSTOM_CHALLENGE" + and event.request.session[2].challenge_result + ): + event.response.issue_tokens = True + event.response.fail_authentication = False + else: + event.response.issue_tokens = False + event.response.fail_authentication = True + + return event.raw_event diff --git a/examples/event_sources/src/cognito_post_confirmation.py b/examples/event_sources/src/cognito_post_confirmation.py new file mode 100644 index 00000000000..51ecc2de43f --- /dev/null +++ b/examples/event_sources/src/cognito_post_confirmation.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import PostConfirmationTriggerEvent + + +def lambda_handler(event, context): + event: PostConfirmationTriggerEvent = PostConfirmationTriggerEvent(event) + + user_attributes = event.request.user_attributes + + return {"statusCode": 200, "body": f"User attributes: {user_attributes}"} diff --git a/examples/event_sources/src/cognito_verify_auth.py b/examples/event_sources/src/cognito_verify_auth.py new file mode 100644 index 00000000000..ae15942246e --- /dev/null +++ b/examples/event_sources/src/cognito_verify_auth.py @@ -0,0 +1,10 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import VerifyAuthChallengeResponseTriggerEvent + + +@event_source(data_class=VerifyAuthChallengeResponseTriggerEvent) +def lambda_handler(event: VerifyAuthChallengeResponseTriggerEvent, context) -> dict: + event.response.answer_correct = ( + event.request.private_challenge_parameters.get("answer") == event.request.challenge_answer + ) + return event.raw_event diff --git a/examples/event_sources/src/connect_contact_flow.py b/examples/event_sources/src/connect_contact_flow.py new file mode 100644 index 00000000000..53d120a4c4b --- /dev/null +++ b/examples/event_sources/src/connect_contact_flow.py @@ -0,0 +1,14 @@ +from aws_lambda_powertools.utilities.data_classes.connect_contact_flow_event import ( + ConnectContactFlowChannel, + ConnectContactFlowEndpointType, + ConnectContactFlowEvent, + ConnectContactFlowInitiationMethod, +) + + +def lambda_handler(event, context): + event: ConnectContactFlowEvent = ConnectContactFlowEvent(event) + assert event.contact_data.attributes == {"Language": "en-US"} + assert event.contact_data.channel == ConnectContactFlowChannel.VOICE + assert event.contact_data.customer_endpoint.endpoint_type == ConnectContactFlowEndpointType.TELEPHONE_NUMBER + assert event.contact_data.initiation_method == ConnectContactFlowInitiationMethod.API diff --git a/examples/event_sources/src/dynamodb_multiple_records.py b/examples/event_sources/src/dynamodb_multiple_records.py new file mode 100644 index 00000000000..ebc216e4da2 --- /dev/null +++ b/examples/event_sources/src/dynamodb_multiple_records.py @@ -0,0 +1,10 @@ +from aws_lambda_powertools.utilities.data_classes import DynamoDBStreamEvent, event_source +from aws_lambda_powertools.utilities.typing import LambdaContext + + +@event_source(data_class=DynamoDBStreamEvent) +def lambda_handler(event: DynamoDBStreamEvent, context: LambdaContext): + for record in event.records: + # {"N": "123.45"} => Decimal("123.45") + key: str = record.dynamodb.keys["Id"] + return {"statusCode": 200, "body": f"Key:, {key}!"} diff --git a/examples/event_sources/src/dynamodb_stream.py b/examples/event_sources/src/dynamodb_stream.py new file mode 100644 index 00000000000..e317ddac8d4 --- /dev/null +++ b/examples/event_sources/src/dynamodb_stream.py @@ -0,0 +1,16 @@ +from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import ( + DynamoDBRecordEventName, + DynamoDBStreamEvent, +) + + +def lambda_handler(event, context): + event: DynamoDBStreamEvent = DynamoDBStreamEvent(event) + + # Multiple records can be delivered in a single event + for record in event.records: + if record.event_name == DynamoDBRecordEventName.MODIFY: + pass + elif record.event_name == DynamoDBRecordEventName.INSERT: + pass + return "success" diff --git a/examples/event_sources/src/eventBridgeEvent.py b/examples/event_sources/src/eventBridgeEvent.py new file mode 100644 index 00000000000..5bd9c165824 --- /dev/null +++ b/examples/event_sources/src/eventBridgeEvent.py @@ -0,0 +1,11 @@ +from aws_lambda_powertools.utilities.data_classes import EventBridgeEvent, event_source + + +@event_source(data_class=EventBridgeEvent) +def lambda_handler(event: EventBridgeEvent, context): + detail_type = event.detail_type + state = event.detail.get("state") + + # Do something + + return {"detail_type": detail_type, "state": state} diff --git a/examples/event_sources/src/kafka_event.py b/examples/event_sources/src/kafka_event.py new file mode 100644 index 00000000000..93568931eb6 --- /dev/null +++ b/examples/event_sources/src/kafka_event.py @@ -0,0 +1,12 @@ +from aws_lambda_powertools.utilities.data_classes import KafkaEvent, event_source + + +def do_something_with(key: bytes, value: dict): + print(f"key: {key}, value: {value}") + + +@event_source(data_class=KafkaEvent) +def lambda_handler(event: KafkaEvent, context): + for record in event.records: + do_something_with(record.topic, record.value) + return "success" diff --git a/examples/event_sources/src/kinesis_streams.py b/examples/event_sources/src/kinesis_streams.py new file mode 100644 index 00000000000..195f6ae565a --- /dev/null +++ b/examples/event_sources/src/kinesis_streams.py @@ -0,0 +1,37 @@ +import json + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import KinesisStreamEvent, event_source +from aws_lambda_powertools.utilities.typing import LambdaContext + +logger = Logger() + + +@event_source(data_class=KinesisStreamEvent) +def lambda_handler(event: KinesisStreamEvent, context: LambdaContext): + for record in event.records: + kinesis_record = record.kinesis + + try: + # First, try to parse the data as JSON + data = kinesis_record.data_as_json() + logger.info("Received JSON data from Kinesis") + except json.JSONDecodeError: + # If JSON parsing fails, treat it as text + data = kinesis_record.data_as_text() + logger.info("Received text data from Kinesis") + + process_data(data) + + return {"statusCode": 200, "body": "Processed all records successfully"} + + +def process_data(data): + if isinstance(data, dict): + # Handle JSON data + logger.info(f"Processing JSON data: {data}") + # Add your JSON processing logic here + else: + # Handle text data + logger.info(f"Processing text data: {data}") + # Add your text processing logic here From 905ebd971ced4790576f40fa69edc2b403f8e5dd Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Fri, 24 Jan 2025 15:47:17 -0300 Subject: [PATCH 5/7] complete all examples --- docs/utilities/data_classes.md | 322 ++++++++---------- .../events/lambdaFunctionUrlEvent.json | 47 +++ .../event_sources/events/rabbitMQEvent.json | 51 +++ .../events/s3BatchOperationEventSchemaV2.json | 19 ++ examples/event_sources/events/s3Event.json | 38 +++ ...tBridgeNotificationObjectCreatedEvent.json | 28 ++ .../event_sources/events/s3ObjectEvent.json | 29 ++ examples/event_sources/events/sesEvent.json | 101 ++++++ examples/event_sources/events/snsEvent.json | 31 ++ examples/event_sources/events/sqsEvent.json | 42 +++ .../event_sources/src/lambdaFunctionUrl.py | 7 + .../event_sources/src/rabbit_mq_example.py | 21 ++ examples/event_sources/src/s3Event.py | 18 + examples/event_sources/src/s3_event_bridge.py | 13 + .../event_sources/src/s3_object_lambda.py | 31 ++ examples/event_sources/src/ses_event.py | 13 + examples/event_sources/src/sns_event.py | 13 + examples/event_sources/src/sqs_event.py | 13 + 18 files changed, 664 insertions(+), 173 deletions(-) create mode 100644 examples/event_sources/events/lambdaFunctionUrlEvent.json create mode 100644 examples/event_sources/events/rabbitMQEvent.json create mode 100644 examples/event_sources/events/s3BatchOperationEventSchemaV2.json create mode 100644 examples/event_sources/events/s3Event.json create mode 100644 examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json create mode 100644 examples/event_sources/events/s3ObjectEvent.json create mode 100644 examples/event_sources/events/sesEvent.json create mode 100644 examples/event_sources/events/snsEvent.json create mode 100644 examples/event_sources/events/sqsEvent.json create mode 100644 examples/event_sources/src/lambdaFunctionUrl.py create mode 100644 examples/event_sources/src/rabbit_mq_example.py create mode 100644 examples/event_sources/src/s3Event.py create mode 100644 examples/event_sources/src/s3_event_bridge.py create mode 100644 examples/event_sources/src/s3_object_lambda.py create mode 100644 examples/event_sources/src/ses_event.py create mode 100644 examples/event_sources/src/sns_event.py create mode 100644 examples/event_sources/src/sqs_event.py diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 232db8d87b5..7d5723a00fc 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -25,13 +25,13 @@ There are two ways to use Event Source Data Classes in your Lambda functions. You can initialize the appropriate data class by passing the Lambda event object to its constructor. -=== "getting_started_data_classes.py" +=== "app.py" ```python hl_lines="1 4" --8<-- "examples/event_sources/src/getting_started_data_classes.py" ``` -=== "apigw_event.json" +=== "API Gateway Proxy Example Event" ```json hl_lines="3-4" --8<-- "examples/event_sources/events/apigw_event.json" @@ -41,13 +41,13 @@ You can initialize the appropriate data class by passing the Lambda event object Alternatively, you can use the `event_source` decorator to automatically parse the event. -=== "apigw_proxy_decorator.py" +=== "app.py" - ```python hl_lines="1 3" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" ``` -=== "apigw_event.json" +=== "API Gateway Proxy Example Event" ```json hl_lines="3-4" --8<-- "examples/event_sources/events/apigw_event.json" @@ -111,13 +111,13 @@ It is used for [Active MQ payloads](https://docs.aws.amazon.com/lambda/latest/dg the [AWS blog post](https://aws.amazon.com/blogs/compute/using-amazon-mq-as-an-event-source-for-aws-lambda/){target="_blank"} for more details. -=== "active_mq_example.py" +=== "app.py" - ```python hl_lines="2 8" + ```python hl_lines="5 10" --8<-- "examples/event_sources/src/active_mq_example.py" ``` -=== "active_mq_event.json" +=== "Active MQ Example Event" ```json hl_lines="6 9 18 21" --8<-- "examples/event_sources/events/active_mq_event_example.json" @@ -129,25 +129,25 @@ It is used for [API Gateway Rest API Lambda Authorizer payload](https://docs.aws Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayAuthorizerTokenEvent`** for type `TOKEN`. -=== "apigw_type_request.py" +=== "app.py" ```python hl_lines="2-4 8" --8<-- "examples/event_sources/src/apigw_authorizer_request.py" ``` -=== "apiGatewayAuthorizerRequestEvent.json" +=== "API Gateway Authorizer Request Example Event" ```json hl_lines="3 11" --8<-- "examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json" ``` -=== "apigw_type_token.py" +=== "app_token.py" ```python hl_lines="2-4 8" --8<-- "examples/event_sources/src/apigw_authorizer_token.py" ``` -=== "apiGatewayAuthorizerTokentEvent.json" +=== "API Gateway Authorizer Token Example Event" ```json hl_lines="2 3" --8<-- "examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json" @@ -158,13 +158,13 @@ Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayA It is used for [API Gateway HTTP API Lambda Authorizer payload version 2](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html){target="_blank"}. See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-and-lambda-authorizers-for-amazon-api-gateway-http-apis/){target="_blank"} for more details. -=== "apigw_auth_v2.py" +=== "app.py" - ```python hl_lines="2-4 16" + ```python hl_lines="4-6 16" --8<-- "examples/event_sources/src/apigw_auth_v2.py" ``` -=== "apiGatewayAuthorizerV2Event.json" +=== "API Gateway Authorizer V2 Example Event" ```json --8<-- "examples/event_sources/events/apiGatewayAuthorizerV2Event.json" @@ -174,13 +174,13 @@ See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-a It is used for either API Gateway REST API or HTTP API using v1 proxy event. -=== "apigw_proxy_decorator.py" +=== "app.py" ```python hl_lines="1 4" --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" ``` -=== "apiGatewayProxyEvent.json" +=== "API Gateway Proxy Example Event" ```json hl_lines="3 4" --8<-- "examples/event_sources/events/apigw_event.json" @@ -190,13 +190,13 @@ It is used for either API Gateway REST API or HTTP API using v1 proxy event. It is used for HTTP API using v2 proxy event. -=== "apigw_proxy_v2.py" +=== "app.py" ```python hl_lines="1 4" --8<-- "examples/event_sources/src/apigw_proxy_v2.py" ``` -=== "apiGatewayProxyEvent.json" +=== "API Gateway Proxy V2 Example Event" ```json --8<-- "examples/event_sources/events/apiGatewayProxyV2Event.json" @@ -206,13 +206,13 @@ It is used for HTTP API using v2 proxy event. Is it used for [Application load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) event. -=== "albEvent.py" +=== "app.py" ```python hl_lines="1 4" --8<-- "examples/event_sources/src/albEvent.py" ``` -=== "albEvent.json" +=== "Application Load Balancer Example Event" ```json hl_lines="7 8" --8<-- "examples/event_sources/events/albEvent.json" @@ -224,13 +224,13 @@ Used when building an [AWS_LAMBDA Authorization](https://docs.aws.amazon.com/app See blog post [Introducing Lambda authorization for AWS AppSync GraphQL APIs](https://aws.amazon.com/blogs/mobile/appsync-lambda-auth/){target="_blank"} or read the Amplify documentation on using [AWS Lambda for authorization](https://docs.amplify.aws/lib/graphqlapi/authz/q/platform/js#aws-lambda){target="_blank"} with AppSync. -=== "appSyncAuthorizer.py" +=== "app.py" ```python hl_lines="5-7 20" --8<-- "examples/event_sources/src/appSyncAuthorizer.py" ``` -=== "appSyncAuthorizerEvent.json" +=== "AppSync Authorizer Example Event" ```json --8<-- "examples/event_sources/events/appSyncAuthorizerEvent.json" @@ -243,13 +243,13 @@ and [AppSync Direct Lambda Resolvers](https://aws.amazon.com/blogs/mobile/appsyn The example serves as an AppSync resolver for the `locations` field of the `Merchant` type. It uses the `@event_source` decorator to parse the AppSync event, handles pagination and filtering for locations, and demonstrates `AppSyncIdentityCognito`. -=== "appSyncResolver.py" +=== "app.py" ```python hl_lines="2-4 9" --8<-- "examples/event_sources/src/appSyncResolver.py" ``` -=== "appSyncResolverEvent.json" +=== "AppSync Resolver Example Event" ```json --8<-- "examples/event_sources/events/appSyncResolverEvent.json" @@ -259,12 +259,12 @@ The example serves as an AppSync resolver for the `locations` field of the `Merc The example utilizes AWSConfigRuleEvent to parse the incoming event. The function logs the message type of the invoking event and returns a simple success response. The example event receives a Scheduled Event Notification, but could also be ItemChanged and Oversized. -=== "aws_config_rule.py" +=== "app.py" ```python hl_lines="2-3 10" --8<-- "examples/event_sources/src/aws_config_rule.py" ``` -=== "Event - ScheduledNotification" +=== "ScheduledNotification Example Event" ```json --8<-- "examples/event_sources/src/aws_config_rule_scheduled.json" ``` @@ -273,13 +273,13 @@ The example utilizes AWSConfigRuleEvent to parse the incoming event. The functio The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/) with `BedrockAgentEvent` to parse the incoming event. The function logs the action group and input text, then returns a structured response compatible with Bedrock Agent's expected format, including a mock response body. -=== "bedrock_agent.py" +=== "app.py" ```python hl_lines="2 7" --8<-- "examples/event_sources/src/bedrock_agent.py" ``` -=== "bedrockAgentEvent.json" +=== "Bedrock Agent Example Event" ```json --8<-- "examples/event_sources/events/bedrockAgentEvent.json" ``` @@ -288,13 +288,13 @@ The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/ The example focuses on the `Create` request type, generating a unique physical resource ID and logging the process. The function is structured to potentially handle `Update` and `Delete` operations as well. -=== "cloudformation_custom_resource_handler.py" +=== "app.py" - ```python hl_lines="2-3 11 15 20" + ```python hl_lines="2-3 11 15 21" --8<-- "examples/event_sources/src/cloudformation_custom_resource_handler.py" ``` -=== "cloudformationCustomResourceCreate.json" +=== "CloudFormation Custom Resource Example Event" ```json --8<-- "examples/event_sources/events/cloudformationCustomResourceCreate.json" ``` @@ -303,13 +303,13 @@ The example focuses on the `Create` request type, generating a unique physical r Thie example for `CloudWatchDashboardCustomWidgetEvent` logs the dashboard name, extracts key information like widget ID and time range, and returns a formatted response with a title and markdown content. Read more about [custom widgets for Cloudwatch dashboard](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/add_custom_widget_samples.html). -=== "cloudWatchDashboard.py" +=== "app.py" ```python hl_lines="2 7" --8<-- "examples/event_sources/src/cloudWatchDashboard.py" ``` -=== "cloudWatchDashboardEvent.json" +=== "CloudWatch Dashboard Example Event" ```json --8<-- "examples/event_sources/events/cloudWatchDashboardEvent.json" ``` @@ -319,13 +319,13 @@ Thie example for `CloudWatchDashboardCustomWidgetEvent` logs the dashboard name, [CloudWatch supports Lambda as an alarm state change action](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarms-and-actions){target="_blank"}. You can use the `CloudWathAlarmEvent` data class to access the fields containing such data as alarm information, current state, and previous state. -=== "cloudwatch_alarm_event.py" +=== "app.py" ```python hl_lines="2 8" --8<-- "examples/event_sources/src/cloudwatch_alarm_event.py" ``` -=== "cloudWatchAlarmEventSingleMetric.json" +=== "CloudWatch Alarm Example Event" ```json --8<-- "examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json" ``` @@ -335,13 +335,13 @@ You can use the `CloudWathAlarmEvent` data class to access the fields containing CloudWatch Logs events by default are compressed and base64 encoded. You can use the helper function provided to decode, decompress and parse json data from the event. -=== "cloudwatch_logs.py" +=== "app.py" ```python hl_lines="2-3 8" --8<-- "examples/event_sources/src/cloudwatch_logs.py" ``` -=== "cloudWatchLogEvent.json" +=== "CloudWatch Logs Example Event" ```json --8<-- "examples/event_sources/events/cloudWatchLogEvent.json" ``` @@ -350,26 +350,26 @@ decompress and parse json data from the event. [When streaming CloudWatch Logs to a Kinesis Data Stream](https://aws.amazon.com/premiumsupport/knowledge-center/streaming-cloudwatch-logs/){target="_blank"} (cross-account or not), you can use `extract_cloudwatch_logs_from_event` to decode, decompress and extract logs as `CloudWatchLogsDecodedData` to ease log processing. -=== "kinesisStreamCloudWatchLogs.py" +=== "app.py" - ```python hl_lines="5-6 11" + ```python hl_lines="5-7 11" --8<-- "examples/event_sources/src/kinesisStreamCloudWatchLogs.py" ``` -=== "kinesisStreamCloudWatchLogsEvent.json" +=== "Kinesis Stream CloudWatch Logs Example Event" ```json --8<-- "examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json" ``` Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless integrate with the [Batch utility](./batch.md){target="_blank"} for more robust log processing. -=== "kinesis_batch_example.py" +=== "app.py" ```python hl_lines="7-9 18" --8<-- "examples/event_sources/src/kinesis_batch_example.py" ``` -=== "kinesisStreamCloudWatchLogsEvent.json" +=== "Kinesis Stream CloudWatch Logs Example Event" ```json --8<-- "examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json" ``` @@ -380,13 +380,13 @@ CodeDeploy triggers Lambdas with this event when defined in [AppSpec definitions](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) to test applications at different stages of deployment. -=== "codedeploy_lifecycle_hook.py" +=== "app.py" - ```python hl_lines="1-2 6" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/codedeploy_lifecycle_hook.py" ``` -=== "codeDeployLifecycleHookEvent.json" +=== "CodeDeploy LifeCycle Hook Example Event" ```json --8<-- "examples/event_sources/events/codeDeployLifecycleHookEvent.json" ``` @@ -395,13 +395,13 @@ to test applications at different stages of deployment. Data classes and utility functions to help create continuous delivery pipelines tasks with AWS Lambda. -=== "code_pipeline_job.py" +=== "app.py" - ```python hl_lines="1 3" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/code_pipeline_job.py" ``` -=== "codePipelineEvent.json" +=== "CodePipeline Job Example Event" ```json hl_lines="3 19" --8<-- "examples/event_sources/events/codePipelineEvent.json" ``` @@ -431,13 +431,13 @@ Some examples for the Cognito User Pools Lambda triggers sources: #### Post Confirmation Example -=== "cognito_post_confirmation.py" +=== "app.py" - ```python hl_lines="1 4" + ```python hl_lines="1 5" --8<-- "examples/event_sources/src/cognito_post_confirmation.py" ``` -=== "cognitoPostConfirmationEvent.json" +=== "Cognito Post Confirmation Example Event" ```json hl_lines="12-14" --8<-- "examples/event_sources/events/cognitoPostConfirmationEvent.json" ``` @@ -449,13 +449,13 @@ Some examples for the Cognito User Pools Lambda triggers sources: This example is based on the AWS Cognito docs for [Define Auth Challenge Lambda Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-define-auth-challenge.html){target="_blank"}. -=== "cognito_define_auth.py" +=== "app.py" - ```python hl_lines="1 4" + ```python hl_lines="1 5" --8<-- "examples/event_sources/src/cognito_define_auth.py" ``` -=== "cognitoDefineAuthChallengeEvent.json" +=== "Cognito Define Auth Challengen Example Event" ```json --8<-- "examples/event_sources/events/cognitoDefineAuthChallengeEvent.json" ``` @@ -464,13 +464,13 @@ This example is based on the AWS Cognito docs for [Define Auth Challenge Lambda This example is based on the AWS Cognito docs for [Create Auth Challenge Lambda Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-create-auth-challenge.html){target="_blank"}. -=== "cognito_create_auth.py" +=== "app.py" - ```python hl_lines="1 4" + ```python hl_lines="2 5" --8<-- "examples/event_sources/src/cognito_create_auth.py" ``` -=== "cognitoCreateAuthChallengeEvent.json" +=== "Cognito Define Auth Challengen Example Event" ```json --8<-- "examples/event_sources/events/cognitoCreateAuthChallengeEvent.json" ``` @@ -479,13 +479,13 @@ This example is based on the AWS Cognito docs for [Create Auth Challenge Lambda This example is based on the AWS Cognito docs for [Verify Auth Challenge Response Lambda Trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-verify-auth-challenge-response.html){target="_blank"}. -=== "cognito_verify_auth.py" +=== "app.py" - ```python hl_lines="2 4" + ```python hl_lines="2 5" --8<-- "examples/event_sources/src/cognito_verify_auth.py" ``` -=== "cognitoVerifyAuthChallengeResponseEvent.json" +=== "Cognito Verify Auth Challengen Example Event" ```json --8<-- "examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json" ``` @@ -494,13 +494,13 @@ This example is based on the AWS Cognito docs for [Verify Auth Challenge Respons The example integrates with [Amazon Connect](https://docs.aws.amazon.com/connect/latest/adminguide/what-is-amazon-connect.html) by handling contact flow events. The function converts the event into a `ConnectContactFlowEvent` object, providing a structured representation of the contact flow data. -=== "connect_contact_flow.py" +=== "app.py" - ```python hl_lines="1-5 9" + ```python hl_lines="1-5 10" --8<-- "examples/event_sources/src/connect_contact_flow.py" ``` -=== "connectContactFlowEventAll.json" +=== "Connect Contact Flow Example Event" ```json --8<-- "examples/event_sources/events/connectContactFlowEventAll.json" ``` @@ -511,15 +511,15 @@ The DynamoDB data class utility provides the base class for `DynamoDBStreamEvent (`DynamoDBRecordEventName`). The class automatically deserializes DynamoDB types into their equivalent Python types. -=== "dynamodb_stream.py" - ```python hl_lines="1-3 7" +=== "app.py" + ```python hl_lines="1-3 8" --8<-- "examples/event_sources/src/dynamodb_stream.py" ``` -=== "dynamodb_multiple_records.py" +=== "app_multiple_records.py" ```python hl_lines="1 5" --8<-- "examples/event_sources/src/dynamodb_multiple_records.py" ``` -=== "dynamoStreamEvent.json" +=== "DynamoDB Streams Example Event" ```json --8<-- "examples/event_sources/events/dynamoStreamEvent.json" ``` @@ -528,13 +528,13 @@ The class automatically deserializes DynamoDB types into their equivalent Python When an event matching a defined rule occurs in EventBridge, it can [automatically trigger a Lambda function](https://docs.aws.amazon.com/lambda/latest/dg/with-eventbridge-scheduler.html), passing the event data as input. -=== "eventBridgeEvent.py" +=== "app.py" - ```python hl_lines="1 3" + ```python hl_lines="1 4" --8<-- "examples/event_sources/src/eventBridgeEvent.py" ``` -=== "eventBridgeEvent.json" +=== "EventBridge Example Event" ```json --8<-- "examples/event_sources/events/eventBridgeEvent.json" ``` @@ -543,13 +543,13 @@ The class automatically deserializes DynamoDB types into their equivalent Python This example is based on the AWS docs for [Amazon MSK](https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html){target="_blank"} and [self-managed Apache Kafka](https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html){target="_blank"}. -=== "kafka_event.py" +=== "app.py" - ```python hl_lines="1 6" + ```python hl_lines="1 8" --8<-- "examples/event_sources/src/kafka_event.py" ``` -=== "kafkaEventMsk.json" +=== "Kafka Example Event" ```json --8<-- "examples/event_sources/events/kafkaEventMsk.json" ``` @@ -559,13 +559,13 @@ This example is based on the AWS docs for [Amazon MSK](https://docs.aws.amazon.c Kinesis events by default contain base64 encoded data. You can use the helper function to access the data either as json or plain text, depending on the original payload. -=== "kinesis_streams.py" +=== "app.py" - ```python hl_lines="3 8" + ```python hl_lines="4 10" --8<-- "examples/event_sources/src/kinesis_streams.py" ``` -=== "kinesisStreamEvent.json" +=== "Kinesis streams Example Event" ```json --8<-- "examples/event_sources/events/kinesisStreamEvent.json" ``` @@ -582,7 +582,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Transforming streaming records" - ```python hl_lines="2-3 12 28" + ```python hl_lines="2-3 10 12" --8<-- "examples/event_sources/src/kinesis_firehose_delivery_stream.py" ``` @@ -591,7 +591,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Dropping invalid records" - ```python hl_lines="5-6 16 34" + ```python hl_lines="5-6 14 16" --8<-- "examples/event_sources/src/kinesis_firehose_response_drop.py" ``` @@ -599,7 +599,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Indicating a processing failure" - ```python hl_lines="2-3 33" + ```python hl_lines="2-3 11 33" --8<-- "examples/event_sources/src/kinesis_firehose_response_exception.py" ``` @@ -612,60 +612,49 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along ### Lambda Function URL +[Lambda Function URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-invocation.html) provide a direct HTTP endpoint for invoking Lambda functions. This feature allows functions to receive and process HTTP requests without the need for additional services like API Gateway. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, LambdaFunctionUrlEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/lambdaFunctionUrl.py" + ``` - @event_source(data_class=LambdaFunctionUrlEvent) - def lambda_handler(event: LambdaFunctionUrlEvent, context): - do_something_with(event.body) +=== "Lambda Function URL Example Event" + ```json + --8<-- "examples/event_sources/events/lambdaFunctionUrlEvent.json" ``` ### Rabbit MQ -It is used for [Rabbit MQ payloads](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html){target="_blank"}, also see +It is used for [Rabbit MQ payloads](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html){target="_blank"}. See the [blog post](https://aws.amazon.com/blogs/compute/using-amazon-mq-for-rabbitmq-as-an-event-source-for-lambda/){target="_blank"} for more details. === "app.py" - ```python hl_lines="4-5 9-10" - from typing import Dict - - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.rabbit_mq_event import RabbitMQEvent - - logger = Logger() + ```python hl_lines="5 10" + --8<-- "examples/event_sources/src/rabbit_mq_example.py" + ``` - @event_source(data_class=RabbitMQEvent) - def lambda_handler(event: RabbitMQEvent, context): - for queue_name, messages in event.rmq_messages_by_queue.items(): - logger.debug(f"Messages for queue: {queue_name}") - for message in messages: - logger.debug(f"MessageID: {message.basic_properties.message_id}") - data: Dict = message.json_data - logger.debug("Process json in base64 encoded data str", data) +=== "Rabbit MQ Example Event" + ```json + --8<-- "examples/event_sources/events/rabbitMQEvent.json" ``` ### S3 -=== "app.py" - - ```python - from urllib.parse import unquote_plus - from aws_lambda_powertools.utilities.data_classes import event_source, S3Event +Integration with Amazon S3 enables automatic, serverless processing of object-level events in S3 buckets. When triggered by actions like object creation or deletion, Lambda functions receive detailed event information, allowing for real-time file processing, data transformations, and automated workflows. - @event_source(data_class=S3Event) - def lambda_handler(event: S3Event, context): - bucket_name = event.bucket_name +=== "app.py" - # Multiple records can be delivered in a single event - for record in event.records: - object_key = unquote_plus(record.s3.get_object.key) + ```python hl_lines="3 6" + --8<-- "examples/event_sources/src/s3Event.py" + ``` - do_something_with(f"{bucket_name}/{object_key}") +=== "S3 Example Event" + ```json + --8<-- "examples/event_sources/events/s3Event.json" ``` ### S3 Batch Operations @@ -678,54 +667,42 @@ This example is based on the AWS S3 Batch Operations documentation [Example Lamb --8<-- "examples/event_sources/src/s3_batch_operation.py" ``` +=== "S3 Batch Operations Example Event" + + ```json + --8<-- "examples/event_sources/events/s3BatchOperationEventSchemaV2.json" + ``` + ### S3 Object Lambda This example is based on the AWS Blog post [Introducing Amazon S3 Object Lambda – Use Your Code to Process Data as It Is Being Retrieved from S3](https://aws.amazon.com/blogs/aws/introducing-amazon-s3-object-lambda-use-your-code-to-process-data-as-it-is-being-retrieved-from-s3/){target="_blank"}. === "app.py" - ```python hl_lines="5-6 12 14" - import boto3 - import requests - - from aws_lambda_powertools import Logger - from aws_lambda_powertools.logging.correlation_paths import S3_OBJECT_LAMBDA - from aws_lambda_powertools.utilities.data_classes.s3_object_event import S3ObjectLambdaEvent - - logger = Logger() - session = boto3.session.Session() - s3 = session.client("s3") - - @logger.inject_lambda_context(correlation_id_path=S3_OBJECT_LAMBDA, log_event=True) - def lambda_handler(event, context): - event = S3ObjectLambdaEvent(event) - - # Get object from S3 - response = requests.get(event.input_s3_url) - original_object = response.content.decode("utf-8") - - # Make changes to the object about to be returned - transformed_object = original_object.upper() + ```python hl_lines="5 6 13 15" + --8<-- "examples/event_sources/src/s3_object_lambda.py" + ``` - # Write object back to S3 Object Lambda - s3.write_get_object_response( - Body=transformed_object, RequestRoute=event.request_route, RequestToken=event.request_token - ) +=== "S3 Object Lambda Example Event" - return {"status_code": 200} + ```json + --8<-- "examples/event_sources/events/s3ObjectEvent.json" ``` ### S3 EventBridge Notification +[S3 EventBridge notifications](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventBridge.html) enhance Lambda's ability to process S3 events by routing them through Amazon EventBridge. This integration offers advanced filtering, multiple destination support, and standardized CloudEvents format. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, S3EventBridgeNotificationEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/s3_event_bridge.py" + ``` + +=== "S3 EventBridge Notification Example Event" - @event_source(data_class=S3EventBridgeNotificationEvent) - def lambda_handler(event: S3EventBridgeNotificationEvent, context): - bucket_name = event.detail.bucket.name - file_key = event.detail.object.key + ```json + --8<-- "examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json" ``` ### Secrets Manager @@ -746,50 +723,50 @@ AWS Secrets Manager rotation uses an AWS Lambda function to update the secret. [ ### SES +The integration with Simple Email Service (SES) enables serverless email processing. When configured, SES can trigger Lambda functions in response to incoming emails or delivery status notifications. The Lambda function receives an SES event containing details like sender, recipients, and email content. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, SESEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/ses_event.py" + ``` - @event_source(data_class=SESEvent) - def lambda_handler(event: SESEvent, context): - # Multiple records can be delivered in a single event - for record in event.records: - mail = record.ses.mail - common_headers = mail.common_headers +=== "SES Example Event" - do_something_with(common_headers.to, common_headers.subject) + ```json + --8<-- "tests/events/sesEvent.json" ``` ### SNS +The integration with Simple Notification Service (SNS) enables serverless message processing. When configured, SNS can trigger Lambda functions in response to published messages or notifications. The Lambda function receives an SNS event containing details like the message body, subject, and metadata. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, SNSEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/sns_event.py" + ``` - @event_source(data_class=SNSEvent) - def lambda_handler(event: SNSEvent, context): - # Multiple records can be delivered in a single event - for record in event.records: - message = record.sns.message - subject = record.sns.subject +=== "SNS Example Event" - do_something_with(subject, message) + ```json + --8<-- "tests/events/snsEvent.json" ``` ### SQS +The integration with Simple Queue Service (SQS) enables serverless queue processing. When configured, SQS can trigger Lambda functions in response to messages in the queue. The Lambda function receives an SQS event containing details like message body, attributes, and metadata. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, SQSEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/sqs_event.py" + ``` + +=== "SQS Example Event" - @event_source(data_class=SQSEvent) - def lambda_handler(event: SQSEvent, context): - # Multiple records can be delivered in a single event - for record in event.records: - do_something_with(record.body) + ```json + --8<-- "tests/events/sqsEvent.json" ``` ### VPC Lattice V2 @@ -851,4 +828,3 @@ However, certain events may contain sensitive fields such as `secret_access_key` ```json hl_lines="16 17 18" --8<-- "examples/event_sources/src/debugging_output.json" ``` - ``` diff --git a/examples/event_sources/events/lambdaFunctionUrlEvent.json b/examples/event_sources/events/lambdaFunctionUrlEvent.json new file mode 100644 index 00000000000..da5c133e6f8 --- /dev/null +++ b/examples/event_sources/events/lambdaFunctionUrlEvent.json @@ -0,0 +1,47 @@ +{ + "version":"2.0", + "routeKey":"$default", + "rawPath":"/", + "rawQueryString":"", + "headers":{ + "sec-fetch-mode":"navigate", + "x-amzn-tls-version":"TLSv1.2", + "sec-fetch-site":"cross-site", + "accept-language":"pt-BR,pt;q=0.9", + "x-forwarded-proto":"https", + "x-forwarded-port":"443", + "x-forwarded-for":"123.123.123.123", + "sec-fetch-user":"?1", + "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "x-amzn-tls-cipher-suite":"ECDHE-RSA-AES128-GCM-SHA256", + "sec-ch-ua":"\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", + "sec-ch-ua-mobile":"?0", + "x-amzn-trace-id":"Root=1-62ecd163-5f302e550dcde3b12402207d", + "sec-ch-ua-platform":"\"Linux\"", + "host":".lambda-url.us-east-1.on.aws", + "upgrade-insecure-requests":"1", + "cache-control":"max-age=0", + "accept-encoding":"gzip, deflate, br", + "sec-fetch-dest":"document", + "user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" + }, + "requestContext":{ + "accountId":"anonymous", + "apiId":"", + "domainName":".lambda-url.us-east-1.on.aws", + "domainPrefix":"", + "http":{ + "method":"GET", + "path":"/", + "protocol":"HTTP/1.1", + "sourceIp":"123.123.123.123", + "userAgent":"agent" + }, + "requestId":"id", + "routeKey":"$default", + "stage":"$default", + "time":"05/Aug/2022:08:14:39 +0000", + "timeEpoch":1659687279885 + }, + "isBase64Encoded":false +} diff --git a/examples/event_sources/events/rabbitMQEvent.json b/examples/event_sources/events/rabbitMQEvent.json new file mode 100644 index 00000000000..5b1d998459f --- /dev/null +++ b/examples/event_sources/events/rabbitMQEvent.json @@ -0,0 +1,51 @@ +{ + "eventSource": "aws:rmq", + "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:pizzaBroker:b-9bcfa592-423a-4942-879d-eb284b418fc8", + "rmqMessagesByQueue": { + "pizzaQueue::/": [ + { + "basicProperties": { + "contentType": "text/plain", + "contentEncoding": null, + "headers": { + "header1": { + "bytes": [ + 118, + 97, + 108, + 117, + 101, + 49 + ] + }, + "header2": { + "bytes": [ + 118, + 97, + 108, + 117, + 101, + 50 + ] + }, + "numberInHeader": 10 + }, + "deliveryMode": 1, + "priority": 34, + "correlationId": null, + "replyTo": null, + "expiration": "60000", + "messageId": null, + "timestamp": "Jan 1, 1970, 12:33:41 AM", + "type": null, + "userId": "1234", + "appId": null, + "clusterId": null, + "bodySize": 80 + }, + "redelivered": false, + "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==" + } + ] + } +} \ No newline at end of file diff --git a/examples/event_sources/events/s3BatchOperationEventSchemaV2.json b/examples/event_sources/events/s3BatchOperationEventSchemaV2.json new file mode 100644 index 00000000000..720dd1f0cf0 --- /dev/null +++ b/examples/event_sources/events/s3BatchOperationEventSchemaV2.json @@ -0,0 +1,19 @@ +{ + "invocationSchemaVersion": "2.0", + "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo", + "job": { + "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce", + "userArguments": { + "k1": "v1", + "k2": "v2" + } + }, + "tasks": [ + { + "taskId": "dGFza2lkZ29lc2hlcmUK", + "s3Key": "prefix/dataset/dataset.20231222.json.gz", + "s3VersionId": null, + "s3Bucket": "powertools-dataset" + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/events/s3Event.json b/examples/event_sources/events/s3Event.json new file mode 100644 index 00000000000..71eff8db743 --- /dev/null +++ b/examples/event_sources/events/s3Event.json @@ -0,0 +1,38 @@ +{ + "Records": [ + { + "eventVersion": "2.1", + "eventSource": "aws:s3", + "awsRegion": "us-east-2", + "eventTime": "2019-09-03T19:37:27.192Z", + "eventName": "ObjectCreated:Put", + "userIdentity": { + "principalId": "123" + }, + "requestParameters": { + "sourceIPAddress": "205.255.255.255" + }, + "responseElements": { + "x-amz-request-id": "D82B88E5F771F645", + "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo=" + }, + "s3": { + "s3SchemaVersion": "1.0", + "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1", + "bucket": { + "name": "lambda-artifacts-deafc19498e3f2df", + "ownerIdentity": { + "principalId": "123" + }, + "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df" + }, + "object": { + "key": "b21b84d653bb07b05b1e6b33684dc11b", + "size": 1305107, + "eTag": "b21b84d653bb07b05b1e6b33684dc11b", + "sequencer": "0C0F6F405D6ED209E1" + } + } + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json b/examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json new file mode 100644 index 00000000000..99b859484ac --- /dev/null +++ b/examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json @@ -0,0 +1,28 @@ +{ + "version": "0", + "id": "f5f1e65c-dc3a-93ca-6c1e-b1647eac7963", + "detail-type": "Object Created", + "source": "aws.s3", + "account": "123456789012", + "time": "2023-03-08T17:50:14Z", + "region": "eu-west-1", + "resources": [ + "arn:aws:s3:::example-bucket" + ], + "detail": { + "version": "0", + "bucket": { + "name": "example-bucket" + }, + "object": { + "key": "img.jpg", + "size": 184662, + "etag": "4e68adba0abe2dc8653dc3354e14c01d", + "sequencer": "006408CAD69598B05E" + }, + "request-id": "57H08PA84AB1JZW0", + "requester": "123456789012", + "source-ip-address": "34.252.34.74", + "reason": "PutObject" + } +} \ No newline at end of file diff --git a/examples/event_sources/events/s3ObjectEvent.json b/examples/event_sources/events/s3ObjectEvent.json new file mode 100644 index 00000000000..afec46fecca --- /dev/null +++ b/examples/event_sources/events/s3ObjectEvent.json @@ -0,0 +1,29 @@ +{ + "xAmzRequestId": "1a5ed718-5f53-471d-b6fe-5cf62d88d02a", + "getObjectContext": { + "inputS3Url": "https://myap-123412341234.s3-accesspoint.us-east-1.amazonaws.com/s3.txt?X-Amz-Security-Token=...", + "outputRoute": "io-iad-cell001", + "outputToken": "..." + }, + "configuration": { + "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap", + "supportingAccessPointArn": "arn:aws:s3:us-east-1:123412341234:accesspoint/myap", + "payload": "test" + }, + "userRequest": { + "url": "/s3.txt", + "headers": { + "Host": "myolap-123412341234.s3-object-lambda.us-east-1.amazonaws.com", + "Accept-Encoding": "identity", + "X-Amz-Content-SHA256": "e3b0c44297fc1c149afbf4c8995fb92427ae41e4649b934ca495991b7852b855" + } + }, + "userIdentity": { + "type": "IAMUser", + "principalId": "...", + "arn": "arn:aws:iam::123412341234:user/myuser", + "accountId": "123412341234", + "accessKeyId": "..." + }, + "protocolVersion": "1.00" +} \ No newline at end of file diff --git a/examples/event_sources/events/sesEvent.json b/examples/event_sources/events/sesEvent.json new file mode 100644 index 00000000000..636ecad687f --- /dev/null +++ b/examples/event_sources/events/sesEvent.json @@ -0,0 +1,101 @@ +{ + "Records": [ + { + "eventVersion": "1.0", + "ses": { + "mail": { + "commonHeaders": { + "from": [ + "Jane Doe " + ], + "to": [ + "johndoe@example.com" + ], + "returnPath": "janedoe@example.com", + "messageId": "<0123456789example.com>", + "date": "Wed, 7 Oct 2015 12:34:56 -0700", + "subject": "Test Subject" + }, + "source": "janedoe@example.com", + "timestamp": "1970-01-01T00:00:00.000Z", + "destination": [ + "johndoe@example.com" + ], + "headers": [ + { + "name": "Return-Path", + "value": "" + }, + { + "name": "Received", + "value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by ..." + }, + { + "name": "DKIM-Signature", + "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; ..." + }, + { + "name": "MIME-Version", + "value": "1.0" + }, + { + "name": "From", + "value": "Jane Doe " + }, + { + "name": "Date", + "value": "Wed, 7 Oct 2015 12:34:56 -0700" + }, + { + "name": "Message-ID", + "value": "<0123456789example.com>" + }, + { + "name": "Subject", + "value": "Test Subject" + }, + { + "name": "To", + "value": "johndoe@example.com" + }, + { + "name": "Content-Type", + "value": "text/plain; charset=UTF-8" + } + ], + "headersTruncated": false, + "messageId": "o3vrnil0e2ic28tr" + }, + "receipt": { + "recipients": [ + "johndoe@example.com" + ], + "timestamp": "1970-01-01T00:00:00.000Z", + "spamVerdict": { + "status": "PASS" + }, + "dkimVerdict": { + "status": "PASS" + }, + "dmarcPolicy": "reject", + "processingTimeMillis": 574, + "action": { + "type": "Lambda", + "invocationType": "Event", + "functionArn": "arn:aws:lambda:us-west-2:012345678912:function:Example" + }, + "dmarcVerdict": { + "status": "PASS" + }, + "spfVerdict": { + "status": "PASS" + }, + "virusVerdict": { + "status": "PASS" + } + } + }, + "eventSource": "aws:ses" + } + ] +} diff --git a/examples/event_sources/events/snsEvent.json b/examples/event_sources/events/snsEvent.json new file mode 100644 index 00000000000..3d8a8ed443c --- /dev/null +++ b/examples/event_sources/events/snsEvent.json @@ -0,0 +1,31 @@ +{ + "Records": [ + { + "EventVersion": "1.0", + "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:sns-la ...", + "EventSource": "aws:sns", + "Sns": { + "SignatureVersion": "1", + "Timestamp": "2019-01-02T12:45:07.000Z", + "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", + "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotification", + "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", + "Message": "Hello from SNS!", + "MessageAttributes": { + "Test": { + "Type": "String", + "Value": "TestString" + }, + "TestBinary": { + "Type": "Binary", + "Value": "TestBinary" + } + }, + "Type": "Notification", + "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe", + "TopicArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda", + "Subject": "TestInvoke" + } + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/events/sqsEvent.json b/examples/event_sources/events/sqsEvent.json new file mode 100644 index 00000000000..4ca764cc0ba --- /dev/null +++ b/examples/event_sources/events/sqsEvent.json @@ -0,0 +1,42 @@ +{ + "Records": [ + { + "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", + "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", + "body": "Test message.", + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1545082649183", + "SenderId": "1234", + "ApproximateFirstReceiveTimestamp": "1545082649185" + }, + "messageAttributes": { + "testAttr": { + "stringValue": "100", + "binaryValue": "base64Str", + "dataType": "Number" + } + }, + "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", + "awsRegion": "us-east-2" + }, + { + "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", + "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", + "body": "{\"message\": \"foo1\"}", + "attributes": { + "ApproximateReceiveCount": "1", + "SentTimestamp": "1545082650636", + "SenderId": "1234", + "ApproximateFirstReceiveTimestamp": "1545082650649" + }, + "messageAttributes": {}, + "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", + "awsRegion": "us-east-2" + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/src/lambdaFunctionUrl.py b/examples/event_sources/src/lambdaFunctionUrl.py new file mode 100644 index 00000000000..f518d825680 --- /dev/null +++ b/examples/event_sources/src/lambdaFunctionUrl.py @@ -0,0 +1,7 @@ +from aws_lambda_powertools.utilities.data_classes import LambdaFunctionUrlEvent, event_source + + +@event_source(data_class=LambdaFunctionUrlEvent) +def lambda_handler(event: LambdaFunctionUrlEvent, context): + if event.request_context.http.method == "GET": + return {"statusCode": 200, "body": "Hello World!"} diff --git a/examples/event_sources/src/rabbit_mq_example.py b/examples/event_sources/src/rabbit_mq_example.py new file mode 100644 index 00000000000..998f012fdba --- /dev/null +++ b/examples/event_sources/src/rabbit_mq_example.py @@ -0,0 +1,21 @@ +from typing import Dict + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.rabbit_mq_event import RabbitMQEvent + +logger = Logger() + + +@event_source(data_class=RabbitMQEvent) +def lambda_handler(event: RabbitMQEvent, context): + for queue_name, messages in event.rmq_messages_by_queue.items(): + logger.debug(f"Messages for queue: {queue_name}") + for message in messages: + logger.debug(f"MessageID: {message.basic_properties.message_id}") + data: Dict = message.json_data + logger.debug(f"Process json in base64 encoded data str {data}") + return { + "queue_name": queue_name, + "message_id": message.basic_properties.message_id, + } diff --git a/examples/event_sources/src/s3Event.py b/examples/event_sources/src/s3Event.py new file mode 100644 index 00000000000..2307bdfc5e0 --- /dev/null +++ b/examples/event_sources/src/s3Event.py @@ -0,0 +1,18 @@ +from urllib.parse import unquote_plus + +from aws_lambda_powertools.utilities.data_classes import S3Event, event_source + + +@event_source(data_class=S3Event) +def lambda_handler(event: S3Event, context): + bucket_name = event.bucket_name + + # Multiple records can be delivered in a single event + for record in event.records: + object_key = unquote_plus(record.s3.get_object.key) + object_etag = record.s3.get_object.etag + return { + "bucket": bucket_name, + "object_key": object_key, + "object_etag": object_etag, + } diff --git a/examples/event_sources/src/s3_event_bridge.py b/examples/event_sources/src/s3_event_bridge.py new file mode 100644 index 00000000000..425c144bfd8 --- /dev/null +++ b/examples/event_sources/src/s3_event_bridge.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import S3EventBridgeNotificationEvent, event_source + + +@event_source(data_class=S3EventBridgeNotificationEvent) +def lambda_handler(event: S3EventBridgeNotificationEvent, context): + bucket_name = event.detail.bucket.name + file_key = event.detail.object.key + if event.detail_type == "Object Created": + print(f"Object {file_key} created in bucket {bucket_name}") + return { + "bucket": bucket_name, + "file_key": file_key, + } diff --git a/examples/event_sources/src/s3_object_lambda.py b/examples/event_sources/src/s3_object_lambda.py new file mode 100644 index 00000000000..11e20287191 --- /dev/null +++ b/examples/event_sources/src/s3_object_lambda.py @@ -0,0 +1,31 @@ +import boto3 +import requests + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.logging.correlation_paths import S3_OBJECT_LAMBDA +from aws_lambda_powertools.utilities.data_classes.s3_object_event import S3ObjectLambdaEvent + +logger = Logger() +session = boto3.session.Session() +s3 = session.client("s3") + + +@logger.inject_lambda_context(correlation_id_path=S3_OBJECT_LAMBDA, log_event=True) +def lambda_handler(event, context): + event = S3ObjectLambdaEvent(event) + + # Get object from S3 + response = requests.get(event.input_s3_url) + original_object = response.content.decode("utf-8") + + # Make changes to the object about to be returned + transformed_object = original_object.upper() + + # Write object back to S3 Object Lambda + s3.write_get_object_response( + Body=transformed_object, + RequestRoute=event.request_route, + RequestToken=event.request_token, + ) + + return {"status_code": 200} diff --git a/examples/event_sources/src/ses_event.py b/examples/event_sources/src/ses_event.py new file mode 100644 index 00000000000..690bfd2f7bc --- /dev/null +++ b/examples/event_sources/src/ses_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import SESEvent, event_source + + +@event_source(data_class=SESEvent) +def lambda_handler(event: SESEvent, context): + # Multiple records can be delivered in a single event + for record in event.records: + mail = record.ses.mail + common_headers = mail.common_headers + return { + "mail": mail, + "common_headers": common_headers, + } diff --git a/examples/event_sources/src/sns_event.py b/examples/event_sources/src/sns_event.py new file mode 100644 index 00000000000..a45e02b1e24 --- /dev/null +++ b/examples/event_sources/src/sns_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import SNSEvent, event_source + + +@event_source(data_class=SNSEvent) +def lambda_handler(event: SNSEvent, context): + # Multiple records can be delivered in a single event + for record in event.records: + message = record.sns.message + subject = record.sns.subject + return { + "message": message, + "subject": subject, + } diff --git a/examples/event_sources/src/sqs_event.py b/examples/event_sources/src/sqs_event.py new file mode 100644 index 00000000000..b76b1bfd360 --- /dev/null +++ b/examples/event_sources/src/sqs_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import SQSEvent, event_source + + +@event_source(data_class=SQSEvent) +def lambda_handler(event: SQSEvent, context): + # Multiple records can be delivered in a single event + for record in event.records: + message = record.body + message_id = record.message_id + return { + "message": message, + "message_id": message_id, + } From 92363ac8b2d61d48182fa7875b55c58546ddabc4 Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Fri, 24 Jan 2025 17:06:34 -0300 Subject: [PATCH 6/7] fix mypy and use events from tests --- docs/utilities/data_classes.md | 76 ++++++------- examples/event_sources/events/albEvent.json | 28 ----- .../apiGatewayAuthorizerRequestEvent.json | 29 ----- .../apiGatewayAuthorizerTokenEvent.json | 5 - .../events/apiGatewayAuthorizerV2Event.json | 52 --------- .../events/apiGatewayProxyV2Event.json | 69 ------------ .../events/appSyncAuthorizerEvent.json | 13 --- .../events/appSyncResolverEvent.json | 71 ------------ .../events/awsConfigRuleScheduled.json | 13 --- .../aws_config_rule_scheduled.json | 0 .../events/bedrockAgentEvent.json | 16 --- .../cloudWatchAlarmEventSingleMetric.json | 59 ---------- .../events/cloudWatchDashboardEvent.json | 38 ------- .../events/cloudWatchLogEvent.json | 5 - .../cloudformationCustomResourceCreate.json | 13 --- .../events/codeDeployLifecycleHookEvent.json | 4 - .../events/codePipelineEvent.json | 34 ------ .../cognitoCreateAuthChallengeEvent.json | 29 ----- .../cognitoDefineAuthChallengeEvent.json | 32 ------ .../events/cognitoPostConfirmationEvent.json | 18 ---- ...gnitoVerifyAuthChallengeResponseEvent.json | 28 ----- .../events/connectContactFlowEventAll.json | 41 ------- .../{src => events}/debugging_event.json | 0 .../{src => events}/debugging_output.json | 0 .../events/dynamoStreamEvent.json | 65 ----------- .../events/eventBridgeEvent.json | 17 --- .../event_sources/events/kafkaEventMsk.json | 35 ------ .../events/kinesisFirehoseKinesisEvent.json | 32 ------ .../kinesisStreamCloudWatchLogsEvent.json | 36 ------- .../events/kinesisStreamEvent.json | 36 ------- .../events/lambdaFunctionUrlEvent.json | 47 -------- .../event_sources/events/rabbitMQEvent.json | 51 --------- .../events/s3BatchOperationEventSchemaV2.json | 19 ---- examples/event_sources/events/s3Event.json | 38 ------- ...tBridgeNotificationObjectCreatedEvent.json | 28 ----- examples/event_sources/events/sesEvent.json | 101 ------------------ examples/event_sources/events/snsEvent.json | 31 ------ examples/event_sources/events/sqsEvent.json | 42 -------- .../{src => events}/vpc_lattice_payload.json | 0 .../vpc_lattice_v2_payload.json | 0 .../src/aws_config_rule_item_changed.json | 13 --- .../src/aws_config_rule_oversized.json | 12 --- .../event_sources/src/cloudWatchDashboard.py | 15 ++- .../src/codedeploy_lifecycle_hook.py | 2 +- .../event_sources/src/cognito_define_auth.py | 41 +++---- .../src/dynamodb_multiple_records.py | 9 +- examples/event_sources/src/kafka_event.py | 2 +- examples/event_sources/src/kinesis_streams.py | 15 +-- .../src/secrets_manager_event.json | 5 - 49 files changed, 87 insertions(+), 1278 deletions(-) delete mode 100644 examples/event_sources/events/albEvent.json delete mode 100644 examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json delete mode 100644 examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json delete mode 100644 examples/event_sources/events/apiGatewayAuthorizerV2Event.json delete mode 100644 examples/event_sources/events/apiGatewayProxyV2Event.json delete mode 100644 examples/event_sources/events/appSyncAuthorizerEvent.json delete mode 100644 examples/event_sources/events/appSyncResolverEvent.json delete mode 100644 examples/event_sources/events/awsConfigRuleScheduled.json rename examples/event_sources/{src => events}/aws_config_rule_scheduled.json (100%) delete mode 100644 examples/event_sources/events/bedrockAgentEvent.json delete mode 100644 examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json delete mode 100644 examples/event_sources/events/cloudWatchDashboardEvent.json delete mode 100644 examples/event_sources/events/cloudWatchLogEvent.json delete mode 100644 examples/event_sources/events/cloudformationCustomResourceCreate.json delete mode 100644 examples/event_sources/events/codeDeployLifecycleHookEvent.json delete mode 100644 examples/event_sources/events/codePipelineEvent.json delete mode 100644 examples/event_sources/events/cognitoCreateAuthChallengeEvent.json delete mode 100644 examples/event_sources/events/cognitoDefineAuthChallengeEvent.json delete mode 100644 examples/event_sources/events/cognitoPostConfirmationEvent.json delete mode 100644 examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json delete mode 100644 examples/event_sources/events/connectContactFlowEventAll.json rename examples/event_sources/{src => events}/debugging_event.json (100%) rename examples/event_sources/{src => events}/debugging_output.json (100%) delete mode 100644 examples/event_sources/events/dynamoStreamEvent.json delete mode 100644 examples/event_sources/events/eventBridgeEvent.json delete mode 100644 examples/event_sources/events/kafkaEventMsk.json delete mode 100644 examples/event_sources/events/kinesisFirehoseKinesisEvent.json delete mode 100644 examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json delete mode 100644 examples/event_sources/events/kinesisStreamEvent.json delete mode 100644 examples/event_sources/events/lambdaFunctionUrlEvent.json delete mode 100644 examples/event_sources/events/rabbitMQEvent.json delete mode 100644 examples/event_sources/events/s3BatchOperationEventSchemaV2.json delete mode 100644 examples/event_sources/events/s3Event.json delete mode 100644 examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json delete mode 100644 examples/event_sources/events/sesEvent.json delete mode 100644 examples/event_sources/events/snsEvent.json delete mode 100644 examples/event_sources/events/sqsEvent.json rename examples/event_sources/{src => events}/vpc_lattice_payload.json (100%) rename examples/event_sources/{src => events}/vpc_lattice_v2_payload.json (100%) delete mode 100644 examples/event_sources/src/aws_config_rule_item_changed.json delete mode 100644 examples/event_sources/src/aws_config_rule_oversized.json delete mode 100644 examples/event_sources/src/secrets_manager_event.json diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index b354408d981..6095c83c47d 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -120,7 +120,7 @@ for more details. === "Active MQ Example Event" ```json hl_lines="6 9 18 21" - --8<-- "examples/event_sources/events/active_mq_event_example.json" + --8<-- "tests/events/activeMQEvent.json" ``` ### API Gateway Authorizer @@ -138,7 +138,7 @@ Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayA === "API Gateway Authorizer Request Example Event" ```json hl_lines="3 11" - --8<-- "examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json" + --8<-- "tests/events/apiGatewayAuthorizerRequestEvent.json" ``` === "app_token.py" @@ -150,7 +150,7 @@ Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayA === "API Gateway Authorizer Token Example Event" ```json hl_lines="2 3" - --8<-- "examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json" + --8<-- "tests/events/apiGatewayAuthorizerTokenEvent.json" ``` ### API Gateway Authorizer V2 @@ -167,7 +167,7 @@ See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-a === "API Gateway Authorizer V2 Example Event" ```json - --8<-- "examples/event_sources/events/apiGatewayAuthorizerV2Event.json" + --8<-- "tests/events/apiGatewayAuthorizerV2Event.json" ``` ### API Gateway Proxy @@ -199,7 +199,7 @@ It is used for HTTP API using v2 proxy event. === "API Gateway Proxy V2 Example Event" ```json - --8<-- "examples/event_sources/events/apiGatewayProxyV2Event.json" + --8<-- "tests/events/apiGatewayProxyV2Event.json" ``` ### Application Load Balancer @@ -215,7 +215,7 @@ Is it used for [Application load balancer](https://docs.aws.amazon.com/elasticlo === "Application Load Balancer Example Event" ```json hl_lines="7 8" - --8<-- "examples/event_sources/events/albEvent.json" + --8<-- "tests/events/albEvent.json" ``` ### AppSync Authorizer @@ -233,7 +233,7 @@ or read the Amplify documentation on using [AWS Lambda for authorization](https: === "AppSync Authorizer Example Event" ```json - --8<-- "examples/event_sources/events/appSyncAuthorizerEvent.json" + --8<-- "tests/events/appSyncAuthorizerEvent.json" ``` ### AppSync Resolver @@ -252,7 +252,7 @@ The example serves as an AppSync resolver for the `locations` field of the `Merc === "AppSync Resolver Example Event" ```json - --8<-- "examples/event_sources/events/appSyncResolverEvent.json" + --8<-- "tests/events/appSyncResolverEvent.json" ``` ### AWS Config Rule @@ -266,7 +266,7 @@ The example utilizes AWSConfigRuleEvent to parse the incoming event. The functio === "ScheduledNotification Example Event" ```json - --8<-- "examples/event_sources/src/aws_config_rule_scheduled.json" + --8<-- "tests/events/awsConfigRuleScheduled.json" ``` ### Bedrock Agent @@ -281,7 +281,7 @@ The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/ === "Bedrock Agent Example Event" ```json - --8<-- "examples/event_sources/events/bedrockAgentEvent.json" + --8<-- "tests/events/bedrockAgentEvent.json" ``` ### CloudFormation Custom Resource @@ -296,7 +296,7 @@ The example focuses on the `Create` request type, generating a unique physical r === "CloudFormation Custom Resource Example Event" ```json - --8<-- "examples/event_sources/events/cloudformationCustomResourceCreate.json" + --8<-- "tests/events/cloudformationCustomResourceCreate.json" ``` ### CloudWatch Dashboard Custom Widget @@ -311,7 +311,7 @@ Thie example for `CloudWatchDashboardCustomWidgetEvent` logs the dashboard name, === "CloudWatch Dashboard Example Event" ```json - --8<-- "examples/event_sources/events/cloudWatchDashboardEvent.json" + --8<-- "tests/events/cloudWatchDashboardEvent.json" ``` ### CloudWatch Alarm State Change Action @@ -327,7 +327,7 @@ You can use the `CloudWathAlarmEvent` data class to access the fields containing === "CloudWatch Alarm Example Event" ```json - --8<-- "examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json" + --8<-- "tests/events/cloudWatchAlarmEventSingleMetric.json" ``` ### CloudWatch Logs @@ -343,7 +343,7 @@ decompress and parse json data from the event. === "CloudWatch Logs Example Event" ```json - --8<-- "examples/event_sources/events/cloudWatchLogEvent.json" + --8<-- "tests/events/cloudWatchLogEvent.json" ``` #### Kinesis integration @@ -358,7 +358,7 @@ decompress and parse json data from the event. === "Kinesis Stream CloudWatch Logs Example Event" ```json - --8<-- "examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json" + --8<-- "tests/events/kinesisStreamCloudWatchLogsEvent.json" ``` Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless integrate with the [Batch utility](./batch.md){target="_blank"} for more robust log processing. @@ -371,7 +371,7 @@ Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless int === "Kinesis Stream CloudWatch Logs Example Event" ```json - --8<-- "examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json" + --8<-- "tests/events/kinesisStreamCloudWatchLogsEvent.json" ``` ### CodeDeploy LifeCycle Hook @@ -388,7 +388,7 @@ to test applications at different stages of deployment. === "CodeDeploy LifeCycle Hook Example Event" ```json - --8<-- "examples/event_sources/events/codeDeployLifecycleHookEvent.json" + --8<-- "tests/events/codeDeployLifecycleHookEvent.json" ``` ### CodePipeline Job @@ -401,7 +401,7 @@ Data classes and utility functions to help create continuous delivery pipelines ``` === "CodePipeline Job Example Event" ```json hl_lines="3 19" - --8<-- "examples/event_sources/events/codePipelineEvent.json" + --8<-- "tests/events/codePipelineEvent.json" ``` ### Cognito User Pool @@ -437,7 +437,7 @@ Some examples for the Cognito User Pools Lambda triggers sources: === "Cognito Post Confirmation Example Event" ```json hl_lines="12-14" - --8<-- "examples/event_sources/events/cognitoPostConfirmationEvent.json" + --8<-- "tests/events/cognitoPostConfirmationEvent.json" ``` #### Define Auth Challenge Example @@ -455,7 +455,7 @@ This example is based on the AWS Cognito docs for [Define Auth Challenge Lambda === "Cognito Define Auth Challengen Example Event" ```json - --8<-- "examples/event_sources/events/cognitoDefineAuthChallengeEvent.json" + --8<-- "tests/events/cognitoDefineAuthChallengeEvent.json" ``` #### Create Auth Challenge Example @@ -468,9 +468,9 @@ This example is based on the AWS Cognito docs for [Create Auth Challenge Lambda --8<-- "examples/event_sources/src/cognito_create_auth.py" ``` -=== "Cognito Define Auth Challengen Example Event" +=== "Cognito Create Auth Challengen Example Event" ```json - --8<-- "examples/event_sources/events/cognitoCreateAuthChallengeEvent.json" + --8<-- "tests/events/cognitoCreateAuthChallengeEvent.json" ``` #### Verify Auth Challenge Response Example @@ -485,7 +485,7 @@ This example is based on the AWS Cognito docs for [Verify Auth Challenge Respons === "Cognito Verify Auth Challengen Example Event" ```json - --8<-- "examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json" + --8<-- "tests/events/cognitoVerifyAuthChallengeResponseEvent.json" ``` ### Connect Contact Flow @@ -500,7 +500,7 @@ The example integrates with [Amazon Connect](https://docs.aws.amazon.com/connect === "Connect Contact Flow Example Event" ```json - --8<-- "examples/event_sources/events/connectContactFlowEventAll.json" + --8<-- "tests/events/connectContactFlowEventAll.json" ``` ### DynamoDB Streams @@ -519,7 +519,7 @@ The class automatically deserializes DynamoDB types into their equivalent Python ``` === "DynamoDB Streams Example Event" ```json - --8<-- "examples/event_sources/events/dynamoStreamEvent.json" + --8<-- "tests/events/dynamoStreamEvent.json" ``` ### EventBridge @@ -534,7 +534,7 @@ The class automatically deserializes DynamoDB types into their equivalent Python === "EventBridge Example Event" ```json - --8<-- "examples/event_sources/events/eventBridgeEvent.json" + --8<-- "tests/events/eventBridgeEvent.json" ``` ### Kafka @@ -549,7 +549,7 @@ This example is based on the AWS docs for [Amazon MSK](https://docs.aws.amazon.c === "Kafka Example Event" ```json - --8<-- "examples/event_sources/events/kafkaEventMsk.json" + --8<-- "tests/events/kafkaEventMsk.json" ``` ### Kinesis streams @@ -565,7 +565,7 @@ or plain text, depending on the original payload. === "Kinesis streams Example Event" ```json - --8<-- "examples/event_sources/events/kinesisStreamEvent.json" + --8<-- "tests/events/kinesisStreamEvent.json" ``` ### Kinesis Firehose delivery stream @@ -605,7 +605,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "kinesisFirehoseEvent.json" ```json - --8<-- "examples/event_sources/events/kinesisFirehoseKinesisEvent.json" + --8<-- "tests/events/kinesisFirehoseKinesisEvent.json" ``` ### Lambda Function URL @@ -620,7 +620,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Lambda Function URL Example Event" ```json - --8<-- "examples/event_sources/events/lambdaFunctionUrlEvent.json" + --8<-- "tests/events/lambdaFunctionUrlEvent.json" ``` ### Rabbit MQ @@ -637,7 +637,7 @@ for more details. === "Rabbit MQ Example Event" ```json - --8<-- "examples/event_sources/events/rabbitMQEvent.json" + --8<-- "tests/events/rabbitMQEvent.json" ``` ### S3 @@ -652,7 +652,7 @@ Integration with Amazon S3 enables automatic, serverless processing of object-le === "S3 Example Event" ```json - --8<-- "examples/event_sources/events/s3Event.json" + --8<-- "tests/events/s3Event.json" ``` ### S3 Batch Operations @@ -668,7 +668,7 @@ This example is based on the AWS S3 Batch Operations documentation [Example Lamb === "S3 Batch Operations Example Event" ```json - --8<-- "examples/event_sources/events/s3BatchOperationEventSchemaV2.json" + --8<-- "tests/events/s3BatchOperationEventSchemaV2.json" ``` ### S3 Object Lambda @@ -700,7 +700,7 @@ This example is based on the AWS Blog post [Introducing Amazon S3 Object Lambda === "S3 EventBridge Notification Example Event" ```json - --8<-- "examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json" + --8<-- "tests/events/s3EventBridgeNotificationObjectCreatedEvent.json" ``` ### Secrets Manager @@ -782,7 +782,7 @@ You can register your Lambda functions as targets within an Amazon VPC Lattice s === "Lattice Example Event" ```json - --8<-- "examples/event_sources/src/vpc_lattice_v2_payload.json" + --8<-- "examples/event_sources/events/vpc_lattice_v2_payload.json" ``` ### VPC Lattice V1 @@ -800,7 +800,7 @@ You can register your Lambda functions as targets within an Amazon VPC Lattice s === "Lattice Example Event" ```json - --8<-- "examples/event_sources/src/vpc_lattice_payload.json" + --8<-- "examples/event_sources/events/vpc_lattice_payload.json" ``` ## Advanced @@ -820,9 +820,9 @@ However, certain events may contain sensitive fields such as `secret_access_key` === "debugging_event.json" ```json hl_lines="28 29" - --8<-- "examples/event_sources/src/debugging_event.json" + --8<-- "examples/event_sources/events/debugging_event.json" ``` === "debugging_output.json" ```json hl_lines="16 17 18" - --8<-- "examples/event_sources/src/debugging_output.json" + --8<-- "examples/event_sources/events/debugging_output.json" ``` diff --git a/examples/event_sources/events/albEvent.json b/examples/event_sources/events/albEvent.json deleted file mode 100644 index 9328cb39e12..00000000000 --- a/examples/event_sources/events/albEvent.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "requestContext": { - "elb": { - "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a" - } - }, - "httpMethod": "GET", - "path": "/lambda", - "queryStringParameters": { - "query": "1234ABCD" - }, - "headers": { - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "accept-encoding": "gzip", - "accept-language": "en-US,en;q=0.9", - "connection": "keep-alive", - "host": "lambda-alb-123578498.us-east-2.elb.amazonaws.com", - "upgrade-insecure-requests": "1", - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", - "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476", - "x-forwarded-for": "72.12.164.125", - "x-forwarded-port": "80", - "x-forwarded-proto": "http", - "x-imforwards": "20" - }, - "body": "Test", - "isBase64Encoded": false -} diff --git a/examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json b/examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json deleted file mode 100644 index 920258aa396..00000000000 --- a/examples/event_sources/events/apiGatewayAuthorizerRequestEvent.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "1.0", - "type": "REQUEST", - "methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request", - "identitySource": "user1,123", - "resource": "/request", - "path": "/request", - "httpMethod": "GET", - "headers": { - "X-AMZ-Date": "20170718T062915Z", - "HeaderAuth1": "headerValue1" - }, - "queryStringParameters": { - "QueryString1": "queryValue1" - }, - "stageVariables": { - "StageVar1": "stageValue1" - }, - "requestContext": { - "accountId": "123456789012", - "apiId": "abcdef123", - "httpMethod": "GET", - "identity": { - "sourceIp": "test-invoke-source-ip" - }, - "path": "/request", - "stage": "test" - } -} \ No newline at end of file diff --git a/examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json b/examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json deleted file mode 100644 index f30f360f6d8..00000000000 --- a/examples/event_sources/events/apiGatewayAuthorizerTokenEvent.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "TOKEN", - "authorizationToken": "allow", - "methodArn": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/" -} diff --git a/examples/event_sources/events/apiGatewayAuthorizerV2Event.json b/examples/event_sources/events/apiGatewayAuthorizerV2Event.json deleted file mode 100644 index 83c3c9d8d61..00000000000 --- a/examples/event_sources/events/apiGatewayAuthorizerV2Event.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": "2.0", - "type": "REQUEST", - "routeArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request", - "identitySource": ["user1", "123"], - "routeKey": "GET /merchants", - "rawPath": "/merchants", - "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", - "cookies": ["cookie1", "cookie2"], - "headers": { - "x-amzn-trace-id": "Root=1-611cc4a7-0746ebee281cfd967db97b64", - "Header1": "value1", - "Header2": "value2", - "Authorization": "value" - }, - "queryStringParameters": { - "parameter1": "value1,value2", - "parameter2": "value" - }, - "requestContext": { - "accountId": "123456789012", - "apiId": "api-id", - "authentication": { - "clientCert": { - "clientCertPem": "CERT_CONTENT", - "subjectDN": "www.example.com", - "issuerDN": "Example issuer", - "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", - "validity": { - "notBefore": "May 28 12:30:02 2019 GMT", - "notAfter": "Aug 5 09:36:04 2021 GMT" - } - } - }, - "domainName": "id.execute-api.us-east-1.amazonaws.com", - "domainPrefix": "id", - "http": { - "method": "POST", - "path": "/merchants", - "protocol": "HTTP/1.1", - "sourceIp": "10.10.10.10", - "userAgent": "agent" - }, - "requestId": "id", - "routeKey": "GET /merchants", - "stage": "$default", - "time": "12/Mar/2020:19:03:58 +0000", - "timeEpoch": 1583348638390 - }, - "pathParameters": { "parameter1": "value1" }, - "stageVariables": { "stageVariable1": "value1", "stageVariable2": "value2" } -} diff --git a/examples/event_sources/events/apiGatewayProxyV2Event.json b/examples/event_sources/events/apiGatewayProxyV2Event.json deleted file mode 100644 index 9de632b8e3d..00000000000 --- a/examples/event_sources/events/apiGatewayProxyV2Event.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "version": "2.0", - "routeKey": "$default", - "rawPath": "/my/path", - "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", - "cookies": [ - "cookie1", - "cookie2" - ], - "headers": { - "Header1": "value1", - "Header2": "value1,value2" - }, - "queryStringParameters": { - "parameter1": "value1,value2", - "parameter2": "value" - }, - "requestContext": { - "accountId": "123456789012", - "apiId": "api-id", - "authentication": { - "clientCert": { - "clientCertPem": "CERT_CONTENT", - "subjectDN": "www.example.com", - "issuerDN": "Example issuer", - "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", - "validity": { - "notBefore": "May 28 12:30:02 2019 GMT", - "notAfter": "Aug 5 09:36:04 2021 GMT" - } - } - }, - "authorizer": { - "jwt": { - "claims": { - "claim1": "value1", - "claim2": "value2" - }, - "scopes": [ - "scope1", - "scope2" - ] - } - }, - "domainName": "id.execute-api.us-east-1.amazonaws.com", - "domainPrefix": "id", - "http": { - "method": "POST", - "path": "/my/path", - "protocol": "HTTP/1.1", - "sourceIp": "192.168.0.1/32", - "userAgent": "agent" - }, - "requestId": "id", - "routeKey": "$default", - "stage": "$default", - "time": "12/Mar/2020:19:03:58 +0000", - "timeEpoch": 1583348638390 - }, - "body": "{\"message\": \"hello world\", \"username\": \"tom\"}", - "pathParameters": { - "parameter1": "value1" - }, - "isBase64Encoded": false, - "stageVariables": { - "stageVariable1": "value1", - "stageVariable2": "value2" - } -} diff --git a/examples/event_sources/events/appSyncAuthorizerEvent.json b/examples/event_sources/events/appSyncAuthorizerEvent.json deleted file mode 100644 index 8820f2ab00d..00000000000 --- a/examples/event_sources/events/appSyncAuthorizerEvent.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "authorizationToken": "123", - "requestContext": { - "apiId": "1234", - "accountId": "11111111", - "requestId": "1111", - "queryString": "mutation MyNewTask($desc: String!) {\n createTask(description: $desc, owner: \"ccc\", taskStatus: \"cc\", title: \"ccc\") {\n id\n }\n}\n", - "operationName": "MyNewTask", - "variables": { - "desc": "Foo" - } - } -} \ No newline at end of file diff --git a/examples/event_sources/events/appSyncResolverEvent.json b/examples/event_sources/events/appSyncResolverEvent.json deleted file mode 100644 index 84ac71951c6..00000000000 --- a/examples/event_sources/events/appSyncResolverEvent.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "typeName": "Merchant", - "fieldName": "locations", - "arguments": { - "page": 2, - "size": 1, - "name": "value" - }, - "identity": { - "claims": { - "sub": "07920713-4526-4642-9c88-2953512de441", - "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_POOL_ID", - "aud": "58rc9bf5kkti90ctmvioppukm9", - "event_id": "7f4c9383-abf6-48b7-b821-91643968b755", - "token_use": "id", - "auth_time": 1615366261, - "name": "Michael Brewer", - "exp": 1615369861, - "iat": 1615366261 - }, - "defaultAuthStrategy": "ALLOW", - "groups": null, - "issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_POOL_ID", - "sourceIp": [ - "11.215.2.22" - ], - "sub": "07920713-4526-4642-9c88-2953512de441", - "username": "mike" - }, - "source": { - "name": "Value", - "nested": { - "name": "value", - "list": [] - } - }, - "request": { - "headers": { - "x-forwarded-for": "11.215.2.22, 64.44.173.11", - "cloudfront-viewer-country": "US", - "cloudfront-is-tablet-viewer": "false", - "via": "2.0 SOMETHING.cloudfront.net (CloudFront)", - "cloudfront-forwarded-proto": "https", - "origin": "https://console.aws.amazon.com", - "content-length": "156", - "accept-language": "en-US,en;q=0.9", - "host": "SOMETHING.appsync-api.us-east-1.amazonaws.com", - "x-forwarded-proto": "https", - "sec-gpc": "1", - "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) etc.", - "accept": "*/*", - "cloudfront-is-mobile-viewer": "false", - "cloudfront-is-smarttv-viewer": "false", - "accept-encoding": "gzip, deflate, br", - "referer": "https://console.aws.amazon.com/", - "content-type": "application/json", - "sec-fetch-mode": "cors", - "x-amz-cf-id": "Fo5VIuvP6V6anIEt62WzFDCK45mzM4yEdpt5BYxOl9OFqafd-WR0cA==", - "x-amzn-trace-id": "Root=1-60488877-0b0c4e6727ab2a1c545babd0", - "authorization": "AUTH-HEADER", - "sec-fetch-dest": "empty", - "x-amz-user-agent": "AWS-Console-AppSync/", - "cloudfront-is-desktop-viewer": "true", - "sec-fetch-site": "cross-site", - "x-forwarded-port": "443" - } - }, - "prev": { - "result": {} - } -} diff --git a/examples/event_sources/events/awsConfigRuleScheduled.json b/examples/event_sources/events/awsConfigRuleScheduled.json deleted file mode 100644 index 02ce2a0700c..00000000000 --- a/examples/event_sources/events/awsConfigRuleScheduled.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version":"1.0", - "invokingEvent":"{\"awsAccountId\":\"0123456789012\",\"notificationCreationTime\":\"2023-04-27T13:26:17.741Z\",\"messageType\":\"ScheduledNotification\",\"recordVersion\":\"1.0\"}", - "ruleParameters":"{\"test\":\"x\"}", - "resultToken":"eyJlbmNyeXB0ZWREYXRhIjpbLTQyLDEyNiw1MiwtMzcsLTI5LDExNCwxMjYsLTk3LDcxLDIyLC0xMTAsMTEyLC0zMSwtOTMsLTQ5LC0xMDEsODIsMyw1NCw0OSwzLC02OSwtNzEsLTcyLDYyLDgxLC03MiwtODEsNTAsMzUsLTUwLC03NSwtMTE4LC0xMTgsNzcsMTIsLTEsMTQsMTIwLC03MCwxMTAsLTMsNTAsLTYwLDEwNSwtNTcsNDUsMTAyLC0xMDksLTYxLC0xMDEsLTYxLDQsNDcsLTg0LC0yNSwxMTIsNTQsLTcxLC0xMDksNDUsMTksMTIzLC0yNiwxMiwtOTYsLTczLDU0LC0xMDksOTIsNDgsLTU5LC04MywtMzIsODIsLTM2LC05MCwxOSw5OCw3Nyw3OCw0MCw4MCw3OCwtMTA1LDg3LC0xMTMsLTExNiwtNzIsMzAsLTY4LC00MCwtODksMTA5LC0xMDgsLTEyOCwyMiw3Miw3NywtMjEsNzYsODksOTQsLTU5LDgxLC0xMjEsLTEwNywtNjcsNjMsLTcsODIsLTg5LC00NiwtMzQsLTkyLDEyMiwtOTAsMTcsLTEyMywyMCwtODUsLTU5LC03MCw4MSwyNyw2Miw3NCwtODAsODAsMzcsNDAsMTE2LDkxLC0yNCw1MSwtNDEsLTc5LDI4LDEyMCw1MywtMTIyLC04MywxMjYsLTc4LDI1LC05OCwtMzYsMTMsMzIsODYsLTI1LDQ4LDMsLTEwMiwtMTYsMjQsLTMsODUsNDQsLTI4LDE0LDIyLDI3LC0xMjIsMTE4LDEwMSw3Myw1LDE4LDU4LC02NCwyMywtODYsLTExNCwyNCwwLDEwMCwyLDExNywtNjIsLTExOSwtMTI4LDE4LDY1LDkwLDE0LC0xMDIsMjEsODUsMTAwLDExNyw1NSwyOSwxMjcsNTQsNzcsNzIsNzQsMzIsNzgsMywtMTExLDExOCwtNzAsLTg2LDEyNywtNzQsNjAsMjIsNDgsMzcsODcsMTMsMCwtMTA1LDUsLTEyMiwtNzEsLTEwMCwxMDQsLTEyNiwtMTYsNzksLTMwLDEyMCw3NywtNzYsLTQxLC0xMDksMiw5NywtMTAxLC0xLDE1LDEyMywxMTksMTA4LDkxLC0yMCwtMTI1LC05NiwyLC05MiwtMTUsLTY3LC03NiwxMjEsMTA0LDEwNSw2NCwtNjIsMTAyLDgsNCwxMjEsLTQ1LC04MCwtODEsLTgsMTE4LDQ0LC04MiwtNDEsLTg0LDczLC0zNiwxMTcsODAsLTY5LC03MywxNCwtMTgsNzIsMzEsLTUsLTExMSwtMTI3LC00MywzNCwtOCw1NywxMDMsLTQyLDE4LC0zMywxMTcsLTI2LC0xMjQsLTEyNCwxNSw4OCwyMywxNiwtNTcsNTQsLTYsLTEwMiwxMTYsLTk5LC00NSwxMDAsLTM1LDg3LDM3LDYsOTgsMiwxMTIsNjAsLTMzLDE3LDI2LDk5LC0xMDUsNDgsLTEwNCwtMTE5LDc4LDYsLTU4LDk1LDksNDEsLTE2LDk2LDQxLC0yMiw5Niw3MiwxMTYsLTk1LC0xMDUsLTM2LC0xMjMsLTU1LDkxLC00NiwtNywtOTIsMzksNDUsODQsMTYsLTEyNCwtMTIyLC02OCwxLC0yOCwxMjIsLTYwLDgyLDEwMywtNTQsLTkyLDI3LC05OSwtMTI4LDY1LDcsLTcyLC0xMjcsNjIsLTIyLDIsLTExLDE4LC04OSwtMTA2LC03NCw3MSw4NiwtMTE2LC0yNSwtMTE1LC05Niw1NywtMzQsMjIsLTEyNCwtMTI1LC00LC00MSw0MiwtNTcsLTEwMyw0NSw3OCwxNCwtMTA2LDExMSw5OCwtOTQsLTcxLDUsNzUsMTksLTEyNCwtMzAsMzQsLTUwLDc1LC04NCwtNTAsLTU2LDUxLC0xNSwtMzYsNjEsLTk0LC03OSwtNDUsMTI2LC03NywtMTA1LC0yLC05MywtNiw4LC0zLDYsLTQyLDQ2LDEyNSw1LC05OCwxMyw2NywtMTAsLTEzLC05NCwtNzgsLTEyNywxMjEsLTI2LC04LC0xMDEsLTkxLDEyMSwtNDAsLTEyNCwtNjQsODQsLTcyLDYzLDE5LC04NF0sIm1hdGVyaWFsU2V0U2VyaWFsTnVtYmVyIjoxLCJpdlBhcmFtZXRlclNwZWMiOnsiaXYiOlszLC0xMCwtODUsMTE0LC05MCwxMTUsNzcsNTUsNTQsMTUsMzgsODQsLTExNiwxNCwtNDAsMjhdfX0=", - "eventLeftScope":false, - "executionRoleArn":"arn:aws:iam::0123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig", - "configRuleArn":"arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw1", - "configRuleName":"rule-ec2-test", - "configRuleId":"config-rule-pdmyw1", - "accountId":"0123456789012", - "evaluationMode":"DETECTIVE" - } diff --git a/examples/event_sources/src/aws_config_rule_scheduled.json b/examples/event_sources/events/aws_config_rule_scheduled.json similarity index 100% rename from examples/event_sources/src/aws_config_rule_scheduled.json rename to examples/event_sources/events/aws_config_rule_scheduled.json diff --git a/examples/event_sources/events/bedrockAgentEvent.json b/examples/event_sources/events/bedrockAgentEvent.json deleted file mode 100644 index b7ad75b3c43..00000000000 --- a/examples/event_sources/events/bedrockAgentEvent.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "actionGroup": "ClaimManagementActionGroup", - "messageVersion": "1.0", - "sessionId": "12345678912345", - "sessionAttributes": {}, - "promptSessionAttributes": {}, - "inputText": "I want to claim my insurance", - "agent": { - "alias": "TSTALIASID", - "name": "test", - "version": "DRAFT", - "id": "8ZXY0W8P1H" - }, - "httpMethod": "GET", - "apiPath": "/claims" -} diff --git a/examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json b/examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json deleted file mode 100644 index fa5089cd6b5..00000000000 --- a/examples/event_sources/events/cloudWatchAlarmEventSingleMetric.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "source": "aws.cloudwatch", - "alarmArn": "arn:aws:cloudwatch:eu-west-1:912397435824:alarm:test_alarm", - "accountId": "123456789012", - "time": "2024-02-17T11:53:08.431+0000", - "region": "eu-west-1", - "alarmData": { - "alarmName": "Test alert", - "state": { - "value": "ALARM", - "reason": "Threshold Crossed: 1 out of the last 1 datapoints [1.0 (17/02/24 11:51:00)] was less than the threshold (10.0) (minimum 1 datapoint for OK -> ALARM transition).", - "reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-02-17T11:53:08.423+0000\",\"startDate\":\"2024-02-17T11:51:00.000+0000\",\"statistic\":\"SampleCount\",\"period\":60,\"recentDatapoints\":[1.0],\"threshold\":10.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-02-17T11:51:00.000+0000\",\"sampleCount\":1.0,\"value\":1.0}]}", - "timestamp": "2024-02-17T11:53:08.431+0000" - }, - "previousState": { - "value": "OK", - "reason": "Threshold Crossed: 1 out of the last 1 datapoints [1.0 (17/02/24 11:50:00)] was not greater than the threshold (10.0) (minimum 1 datapoint for ALARM -> OK transition).", - "reasonData": "{\"version\":\"1.0\",\"queryDate\":\"2024-02-17T11:51:31.460+0000\",\"startDate\":\"2024-02-17T11:50:00.000+0000\",\"statistic\":\"SampleCount\",\"period\":60,\"recentDatapoints\":[1.0],\"threshold\":10.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2024-02-17T11:50:00.000+0000\",\"sampleCount\":1.0,\"value\":1.0}]}", - "timestamp": "2024-02-17T11:51:31.462+0000" - }, - "configuration": { - "description": "This is description **here**", - "metrics": [ - { - "id": "e1", - "expression": "m1/m2", - "label": "Expression1", - "returnData": true - }, - { - "id": "m1", - "metricStat": { - "metric": { - "namespace": "AWS/Lambda", - "name": "Invocations", - "dimensions": {} - }, - "period": 60, - "stat": "SampleCount" - }, - "returnData": false - }, - { - "id": "m2", - "metricStat": { - "metric": { - "namespace": "AWS/Lambda", - "name": "Duration", - "dimensions": {} - }, - "period": 60, - "stat": "SampleCount" - }, - "returnData": false - } - ] - } - } -} diff --git a/examples/event_sources/events/cloudWatchDashboardEvent.json b/examples/event_sources/events/cloudWatchDashboardEvent.json deleted file mode 100644 index fd2d3be62d6..00000000000 --- a/examples/event_sources/events/cloudWatchDashboardEvent.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "original": "param-to-widget", - "widgetContext": { - "dashboardName": "Name-of-current-dashboard", - "widgetId": "widget-16", - "domain": "https://us-east-1.console.aws.amazon.com", - "accountId": "123456789123", - "locale": "en", - "timezone": { - "label": "UTC", - "offsetISO": "+00:00", - "offsetInMinutes": 0 - }, - "period": 300, - "isAutoPeriod": true, - "timeRange": { - "mode": "relative", - "start": 1627236199729, - "end": 1627322599729, - "relativeStart": 86400012, - "zoom": { - "start": 1627276030434, - "end": 1627282956521 - } - }, - "theme": "light", - "linkCharts": true, - "title": "Tweets for Amazon website problem", - "forms": { - "all": {} - }, - "params": { - "original": "param-to-widget" - }, - "width": 588, - "height": 369 - } -} diff --git a/examples/event_sources/events/cloudWatchLogEvent.json b/examples/event_sources/events/cloudWatchLogEvent.json deleted file mode 100644 index aa184c1d013..00000000000 --- a/examples/event_sources/events/cloudWatchLogEvent.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "awslogs": { - "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA==" - } -} diff --git a/examples/event_sources/events/cloudformationCustomResourceCreate.json b/examples/event_sources/events/cloudformationCustomResourceCreate.json deleted file mode 100644 index 5c32d8c7aa1..00000000000 --- a/examples/event_sources/events/cloudformationCustomResourceCreate.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "RequestType": "Create", - "ServiceToken": "arn:aws:lambda:us-east-1:xxx:function:xxxx-CrbuiltinfunctionidProvi-2vKAalSppmKe", - "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3.amazonaws.com/7F%7Cb1f50fdfc25f3b", - "StackId": "arn:aws:cloudformation:us-east-1:xxxx:stack/xxxx/271845b0-f2e8-11ed-90ac-0eeb25b8ae21", - "RequestId": "xxxxx-d2a0-4dfb-ab1f-xxxxxx", - "LogicalResourceId": "xxxxxxxxx", - "ResourceType": "Custom::MyType", - "ResourceProperties": { - "ServiceToken": "arn:aws:lambda:us-east-1:xxxxx:function:xxxxx", - "MyProps": "ss" - } -} \ No newline at end of file diff --git a/examples/event_sources/events/codeDeployLifecycleHookEvent.json b/examples/event_sources/events/codeDeployLifecycleHookEvent.json deleted file mode 100644 index 6e422a2d505..00000000000 --- a/examples/event_sources/events/codeDeployLifecycleHookEvent.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "DeploymentId": "d-ABCDEF", - "LifecycleEventHookExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxx" -} diff --git a/examples/event_sources/events/codePipelineEvent.json b/examples/event_sources/events/codePipelineEvent.json deleted file mode 100644 index 25269cbb387..00000000000 --- a/examples/event_sources/events/codePipelineEvent.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "CodePipeline.job": { - "id": "11111111-abcd-1111-abcd-111111abcdef", - "accountId": "111111111111", - "data": { - "actionConfiguration": { - "configuration": { - "FunctionName": "MyLambdaFunctionForAWSCodePipeline", - "UserParameters": "some-input-such-as-a-URL" - } - }, - "inputArtifacts": [ - { - "name": "ArtifactName", - "revision": null, - "location": { - "type": "S3", - "s3Location": { - "bucketName": "the name of the bucket configured as the pipeline artifact store in Amazon S3, for example codepipeline-us-east-2-1234567890", - "objectKey": "the name of the application, for example CodePipelineDemoApplication.zip" - } - } - } - ], - "outputArtifacts": [], - "artifactCredentials": { - "accessKeyId": "", - "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "sessionToken": "MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=" - }, - "continuationToken": "A continuation token if continuing job" - } - } -} \ No newline at end of file diff --git a/examples/event_sources/events/cognitoCreateAuthChallengeEvent.json b/examples/event_sources/events/cognitoCreateAuthChallengeEvent.json deleted file mode 100644 index ad018ae0829..00000000000 --- a/examples/event_sources/events/cognitoCreateAuthChallengeEvent.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "CreateAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "create-auth@mail.com" - }, - "challengeName": "PASSWORD_VERIFIER", - "session" : [ - { - "challengeName": "CUSTOM_CHALLENGE", - "challengeResult": true, - "challengeMetadata": "CAPTCHA_CHALLENGE" - } - ], - "userNotFound": false - }, - "response": {} -} diff --git a/examples/event_sources/events/cognitoDefineAuthChallengeEvent.json b/examples/event_sources/events/cognitoDefineAuthChallengeEvent.json deleted file mode 100644 index 80ea5ac2d98..00000000000 --- a/examples/event_sources/events/cognitoDefineAuthChallengeEvent.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session" : [ - { - "challengeName": "PASSWORD_VERIFIER", - "challengeResult": true - }, - { - "challengeName": "CUSTOM_CHALLENGE", - "challengeResult": true, - "challengeMetadata": "CAPTCHA_CHALLENGE" - } - ], - "userNotFound": true - }, - "response": {} -} diff --git a/examples/event_sources/events/cognitoPostConfirmationEvent.json b/examples/event_sources/events/cognitoPostConfirmationEvent.json deleted file mode 100644 index e88f98150ca..00000000000 --- a/examples/event_sources/events/cognitoPostConfirmationEvent.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "string", - "triggerSource": "PostConfirmation_ConfirmSignUp", - "region": "us-east-1", - "userPoolId": "string", - "userName": "userName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "request": { - "userAttributes": { - "email": "user@example.com", - "email_verified": true - } - }, - "response": {} -} diff --git a/examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json b/examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json deleted file mode 100644 index 2ebcdb5c278..00000000000 --- a/examples/event_sources/events/cognitoVerifyAuthChallengeResponseEvent.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "VerifyAuthChallengeResponse_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "verify-auth@mail.com" - }, - "privateChallengeParameters": { - "answer": "challengeAnswer" - }, - "clientMetadata" : { - "foo": "value" - }, - "challengeAnswer": "challengeAnswer", - "userNotFound": true - }, - "response": {} -} diff --git a/examples/event_sources/events/connectContactFlowEventAll.json b/examples/event_sources/events/connectContactFlowEventAll.json deleted file mode 100644 index 5850649b6eb..00000000000 --- a/examples/event_sources/events/connectContactFlowEventAll.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "Name": "ContactFlowEvent", - "Details": { - "ContactData": { - "Attributes": { - "Language": "en-US" - }, - "Channel": "VOICE", - "ContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "CustomerEndpoint": { - "Address": "+11234567890", - "Type": "TELEPHONE_NUMBER" - }, - "InitialContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "InitiationMethod": "API", - "InstanceARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa", - "MediaStreams": { - "Customer": { - "Audio": { - "StartFragmentNumber": "91343852333181432392682062622220590765191907586", - "StartTimestamp": "1565781909613", - "StreamARN": "arn:aws:kinesisvideo:eu-central-1:123456789012:stream/connect-contact-a3d73b84-ce0e-479a-a9dc-5637c9d30ac9/1565272947806" - } - } - }, - "PreviousContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "Queue": { - "ARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa/queue/5cba7cbf-1ecb-4b6d-b8bd-fe91079b3fc8", - "Name": "QueueOne" - }, - "SystemEndpoint": { - "Address": "+11234567890", - "Type": "TELEPHONE_NUMBER" - } - }, - "Parameters": { - "ParameterOne": "One", - "ParameterTwo": "Two" - } - } -} \ No newline at end of file diff --git a/examples/event_sources/src/debugging_event.json b/examples/event_sources/events/debugging_event.json similarity index 100% rename from examples/event_sources/src/debugging_event.json rename to examples/event_sources/events/debugging_event.json diff --git a/examples/event_sources/src/debugging_output.json b/examples/event_sources/events/debugging_output.json similarity index 100% rename from examples/event_sources/src/debugging_output.json rename to examples/event_sources/events/debugging_output.json diff --git a/examples/event_sources/events/dynamoStreamEvent.json b/examples/event_sources/events/dynamoStreamEvent.json deleted file mode 100644 index 16009a7a956..00000000000 --- a/examples/event_sources/events/dynamoStreamEvent.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "Records": [ - { - "eventID": "1", - "eventVersion": "1.0", - "dynamodb": { - "ApproximateCreationDateTime": 1693997155.0, - "Keys": { - "Id": { - "N": "101" - } - }, - "NewImage": { - "Message": { - "S": "New item!" - }, - "Id": { - "N": "101" - } - }, - "StreamViewType": "NEW_AND_OLD_IMAGES", - "SequenceNumber": "111", - "SizeBytes": 26 - }, - "awsRegion": "us-west-2", - "eventName": "INSERT", - "eventSourceARN": "eventsource_arn", - "eventSource": "aws:dynamodb" - }, - { - "eventID": "2", - "eventVersion": "1.0", - "dynamodb": { - "OldImage": { - "Message": { - "S": "New item!" - }, - "Id": { - "N": "101" - } - }, - "SequenceNumber": "222", - "Keys": { - "Id": { - "N": "101" - } - }, - "SizeBytes": 59, - "NewImage": { - "Message": { - "S": "This item has changed" - }, - "Id": { - "N": "101" - } - }, - "StreamViewType": "NEW_AND_OLD_IMAGES" - }, - "awsRegion": "us-west-2", - "eventName": "MODIFY", - "eventSourceARN": "source_arn", - "eventSource": "aws:dynamodb" - } - ] -} diff --git a/examples/event_sources/events/eventBridgeEvent.json b/examples/event_sources/events/eventBridgeEvent.json deleted file mode 100644 index 65872cf9a34..00000000000 --- a/examples/event_sources/events/eventBridgeEvent.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "0", - "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", - "detail-type": "EC2 Instance State-change Notification", - "source": "aws.ec2", - "account": "111122223333", - "time": "2017-12-22T18:43:48Z", - "region": "us-west-1", - "resources": [ - "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0" - ], - "detail": { - "instance_id": "i-1234567890abcdef0", - "state": "terminated" - }, - "replay-name": "replay_archive" -} diff --git a/examples/event_sources/events/kafkaEventMsk.json b/examples/event_sources/events/kafkaEventMsk.json deleted file mode 100644 index 5a35b89680a..00000000000 --- a/examples/event_sources/events/kafkaEventMsk.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "eventSource":"aws:kafka", - "eventSourceArn":"arn:aws:kafka:us-east-1:0123456789019:cluster/SalesCluster/abcd1234-abcd-cafe-abab-9876543210ab-4", - "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092", - "records":{ - "mytopic-0":[ - { - "topic":"mytopic", - "partition":0, - "offset":15, - "timestamp":1545084650987, - "timestampType":"CREATE_TIME", - "key":"cmVjb3JkS2V5", - "value":"eyJrZXkiOiJ2YWx1ZSJ9", - "headers":[ - { - "headerKey":[ - 104, - 101, - 97, - 100, - 101, - 114, - 86, - 97, - 108, - 117, - 101 - ] - } - ] - } - ] - } -} diff --git a/examples/event_sources/events/kinesisFirehoseKinesisEvent.json b/examples/event_sources/events/kinesisFirehoseKinesisEvent.json deleted file mode 100644 index 8ac0ba93bd5..00000000000 --- a/examples/event_sources/events/kinesisFirehoseKinesisEvent.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "invocationId": "2b4d1ad9-2f48-94bd-a088-767c317e994a", - "sourceKinesisStreamArn": "arn:aws:kinesis:us-east-1:123456789012:stream/kinesis-source", - "deliveryStreamArn": "arn:aws:firehose:us-east-2:123456789012:deliverystream/delivery-stream-name", - "region": "us-east-2", - "records": [ - { - "data": "SGVsbG8gV29ybGQ=", - "recordId": "record1", - "approximateArrivalTimestamp": 1664028820148, - "kinesisRecordMetadata": { - "shardId": "shardId-000000000000", - "partitionKey": "1234", - "approximateArrivalTimestamp": 1664028820148, - "sequenceNumber": "49546986683135544286507457936321625675700192471156785154", - "subsequenceNumber": 0 - } - }, - { - "data": "eyJIZWxsbyI6ICJXb3JsZCJ9", - "recordId": "record2", - "approximateArrivalTimestamp": 1664028793294, - "kinesisRecordMetadata": { - "shardId": "shardId-000000000001", - "partitionKey": "4567", - "approximateArrivalTimestamp": 1664028793294, - "sequenceNumber": "49546986683135544286507457936321625675700192471156785155", - "subsequenceNumber": 0 - } - } - ] -} \ No newline at end of file diff --git a/examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json b/examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json deleted file mode 100644 index 000f37935d3..00000000000 --- a/examples/event_sources/events/kinesisStreamCloudWatchLogsEvent.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "Records": [ - { - "kinesis": { - "kinesisSchemaVersion": "1.0", - "partitionKey": "123456789", - "sequenceNumber": "49635052289529725553291405521504870233219489715332317186", - "data": "H4sIAAAAAAAAAK2Sa2vbMBSG/4ox+xg3Oror39IlvaztVmJv7WjCUGwl8+ZLZstts5L/vuOsZYUyWGEgJHiP9J7nvOghLF3b2rVLthsXjsLJOBl/uZjG8fh4Gg7C+q5yDcqUAWcSONHEoFzU6+Om7jZYGdq7dljYcpnZ4cZHwLWOJl1Zbs/r9cR6e9RVqc/rKlpXV9eXt+fy27vt8W+L2DfOlr07oXQIMAQyvHlzPk6mcbKgciktF5lQfMU5dZZqzrShLF2uFC60aLtlmzb5prc/ygvvmjYc3YRPFG+LusuurE+/Ikqb1Gd55dq8jV+8isT6+317Rk42J5PTcLFnm966yvd2D2GeISJTYIwCJSQ1BE9OtWZCABWaKMIJAMdDMyU5MYZLhmkxBhQxfY4Re1tiWiAlBsgIVQTE4Cl6tI+T8SwJZu5Hh1dPs1FApOMSDI9WVKmIC+4irTMWQZYpx7QkztrgE06MU4yCx9DmVbgbvABmQJTGtkYAB0NwEwyYQUBpqEFuSbkGrThTRKi/AlP+HHj6fvJa3P9Ap/+Rbja9/PD6POd+0jXW7xM1B8CDsp37w7woXBb8qQDZ6xeurJttEOc/HWpUBxeHKNr74LHwsXXYlsm9flrl/rmFIQeS7m3m1fVs/DlIGpu6nhMiyWQGXNKIMbcCIgkhElKbaZnZpYJUz33s1iV+z/6+StMlR3yphHNcCyxiNEXf2zed6xuEu8XuF2wb6krnAwAA", - "approximateArrivalTimestamp": 1668093033.744 - }, - "eventSource": "aws:kinesis", - "eventVersion": "1.0", - "eventID": "shardId-000000000000:49635052289529725553291405521504870233219489715332317186", - "eventName": "aws:kinesis:record", - "invokeIdentityArn": "arn:aws:iam::231436140809:role/pt-1488-CloudWatchKinesisLogsFunctionRole-1M4G2TIWIE49", - "awsRegion": "eu-west-1", - "eventSourceARN": "arn:aws:kinesis:eu-west-1:231436140809:stream/pt-1488-KinesisStreamCloudWatchLogs-D8tHs0im0aJG" - }, - { - "kinesis": { - "kinesisSchemaVersion": "1.0", - "partitionKey": "12345678910", - "sequenceNumber": "49635052289529725553291405520881064510298312199003701250", - "data": "H4sIAAAAAAAAAK2SW2/TQBCF/4pl8ViTvc7u5i0laVraQhUbWtREaG1PgsGXYK/bhqr/nXVoBRIgUYnXc2bPfHO092GFXWc3mOy2GI7D6SSZfDyfxfFkPgsPwua2xtbLjFPBgQqiifFy2WzmbdNvvTOyt92otFWa29HWRVRoHU37qtqdNZupdfaorzNXNHW0qS+vLm7O4PPr3fxHROxatNWQThgbUTqiZHT94mySzOJkBUqYLOWY8ZQLbaTRkEvDciUYzWzKfETXp13WFtsh/qgoHbZdOL4OnyhelU2fX1qXffIoXdKcFjV2RRf/9iqSmy933Sk53h5PT8LVnm12g7Ub4u7DIveIXFFjFNGUKUlAaMY0EUJKLjkQbxhKGCWeknMKoAGUkYoJ7TFd4St2tvJtDRYxDAg3VB08Ve/j42SySIIFfu396Ek+DkS+xkwAiYhM00isgUV6jXmEMrM5EmMsh+C9v9hfMQ4eS1vW4cPBH4CZVpoTJkEIAp5RUMo8vGFae3JNCCdUccMVgPw7sP4VePZm+lzc/0AH/0i3mF28fX6fSzftW+v2jZKXRgVVt3SHRVliHvx06F4+x6ppd0FcfEMvMR2cH3rR3gWPxrsO/Vau9vqyvlpMPgRJazMcYGgEHHLKBhLGJaBA0JLxNc0JppoS9Cwxbir/B4d5QDBAQSnfFFGp8aa/vxw2uLbHYUH4sHr4Dj5RJxfMAwAA", - "approximateArrivalTimestamp": 1668092612.992 - }, - "eventSource": "aws:kinesis", - "eventVersion": "1.0", - "eventID": "shardId-000000000000:49635052289529725553291405520881064510298312199003701250", - "eventName": "aws:kinesis:record", - "invokeIdentityArn": "arn:aws:iam::231436140809:role/pt-1488-CloudWatchKinesisLogsFunctionRole-1M4G2TIWIE49", - "awsRegion": "eu-west-1", - "eventSourceARN": "arn:aws:kinesis:eu-west-1:231436140809:stream/pt-1488-KinesisStreamCloudWatchLogs-D8tHs0im0aJG" - } - ] -} \ No newline at end of file diff --git a/examples/event_sources/events/kinesisStreamEvent.json b/examples/event_sources/events/kinesisStreamEvent.json deleted file mode 100644 index ef8e2096388..00000000000 --- a/examples/event_sources/events/kinesisStreamEvent.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "Records": [ - { - "kinesis": { - "kinesisSchemaVersion": "1.0", - "partitionKey": "1", - "sequenceNumber": "49590338271490256608559692538361571095921575989136588898", - "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==", - "approximateArrivalTimestamp": 1545084650.987 - }, - "eventSource": "aws:kinesis", - "eventVersion": "1.0", - "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898", - "eventName": "aws:kinesis:record", - "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", - "awsRegion": "us-east-2", - "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" - }, - { - "kinesis": { - "kinesisSchemaVersion": "1.0", - "partitionKey": "1", - "sequenceNumber": "49590338271490256608559692540925702759324208523137515618", - "data": "VGhpcyBpcyBvbmx5IGEgdGVzdC4=", - "approximateArrivalTimestamp": 1545084711.166 - }, - "eventSource": "aws:kinesis", - "eventVersion": "1.0", - "eventID": "shardId-000000000006:49590338271490256608559692540925702759324208523137515618", - "eventName": "aws:kinesis:record", - "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", - "awsRegion": "us-east-2", - "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" - } - ] -} diff --git a/examples/event_sources/events/lambdaFunctionUrlEvent.json b/examples/event_sources/events/lambdaFunctionUrlEvent.json deleted file mode 100644 index da5c133e6f8..00000000000 --- a/examples/event_sources/events/lambdaFunctionUrlEvent.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "version":"2.0", - "routeKey":"$default", - "rawPath":"/", - "rawQueryString":"", - "headers":{ - "sec-fetch-mode":"navigate", - "x-amzn-tls-version":"TLSv1.2", - "sec-fetch-site":"cross-site", - "accept-language":"pt-BR,pt;q=0.9", - "x-forwarded-proto":"https", - "x-forwarded-port":"443", - "x-forwarded-for":"123.123.123.123", - "sec-fetch-user":"?1", - "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "x-amzn-tls-cipher-suite":"ECDHE-RSA-AES128-GCM-SHA256", - "sec-ch-ua":"\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", - "sec-ch-ua-mobile":"?0", - "x-amzn-trace-id":"Root=1-62ecd163-5f302e550dcde3b12402207d", - "sec-ch-ua-platform":"\"Linux\"", - "host":".lambda-url.us-east-1.on.aws", - "upgrade-insecure-requests":"1", - "cache-control":"max-age=0", - "accept-encoding":"gzip, deflate, br", - "sec-fetch-dest":"document", - "user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" - }, - "requestContext":{ - "accountId":"anonymous", - "apiId":"", - "domainName":".lambda-url.us-east-1.on.aws", - "domainPrefix":"", - "http":{ - "method":"GET", - "path":"/", - "protocol":"HTTP/1.1", - "sourceIp":"123.123.123.123", - "userAgent":"agent" - }, - "requestId":"id", - "routeKey":"$default", - "stage":"$default", - "time":"05/Aug/2022:08:14:39 +0000", - "timeEpoch":1659687279885 - }, - "isBase64Encoded":false -} diff --git a/examples/event_sources/events/rabbitMQEvent.json b/examples/event_sources/events/rabbitMQEvent.json deleted file mode 100644 index 5b1d998459f..00000000000 --- a/examples/event_sources/events/rabbitMQEvent.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "eventSource": "aws:rmq", - "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:pizzaBroker:b-9bcfa592-423a-4942-879d-eb284b418fc8", - "rmqMessagesByQueue": { - "pizzaQueue::/": [ - { - "basicProperties": { - "contentType": "text/plain", - "contentEncoding": null, - "headers": { - "header1": { - "bytes": [ - 118, - 97, - 108, - 117, - 101, - 49 - ] - }, - "header2": { - "bytes": [ - 118, - 97, - 108, - 117, - 101, - 50 - ] - }, - "numberInHeader": 10 - }, - "deliveryMode": 1, - "priority": 34, - "correlationId": null, - "replyTo": null, - "expiration": "60000", - "messageId": null, - "timestamp": "Jan 1, 1970, 12:33:41 AM", - "type": null, - "userId": "1234", - "appId": null, - "clusterId": null, - "bodySize": 80 - }, - "redelivered": false, - "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==" - } - ] - } -} \ No newline at end of file diff --git a/examples/event_sources/events/s3BatchOperationEventSchemaV2.json b/examples/event_sources/events/s3BatchOperationEventSchemaV2.json deleted file mode 100644 index 720dd1f0cf0..00000000000 --- a/examples/event_sources/events/s3BatchOperationEventSchemaV2.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "invocationSchemaVersion": "2.0", - "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo", - "job": { - "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce", - "userArguments": { - "k1": "v1", - "k2": "v2" - } - }, - "tasks": [ - { - "taskId": "dGFza2lkZ29lc2hlcmUK", - "s3Key": "prefix/dataset/dataset.20231222.json.gz", - "s3VersionId": null, - "s3Bucket": "powertools-dataset" - } - ] -} \ No newline at end of file diff --git a/examples/event_sources/events/s3Event.json b/examples/event_sources/events/s3Event.json deleted file mode 100644 index 71eff8db743..00000000000 --- a/examples/event_sources/events/s3Event.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "Records": [ - { - "eventVersion": "2.1", - "eventSource": "aws:s3", - "awsRegion": "us-east-2", - "eventTime": "2019-09-03T19:37:27.192Z", - "eventName": "ObjectCreated:Put", - "userIdentity": { - "principalId": "123" - }, - "requestParameters": { - "sourceIPAddress": "205.255.255.255" - }, - "responseElements": { - "x-amz-request-id": "D82B88E5F771F645", - "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo=" - }, - "s3": { - "s3SchemaVersion": "1.0", - "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1", - "bucket": { - "name": "lambda-artifacts-deafc19498e3f2df", - "ownerIdentity": { - "principalId": "123" - }, - "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df" - }, - "object": { - "key": "b21b84d653bb07b05b1e6b33684dc11b", - "size": 1305107, - "eTag": "b21b84d653bb07b05b1e6b33684dc11b", - "sequencer": "0C0F6F405D6ED209E1" - } - } - } - ] -} \ No newline at end of file diff --git a/examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json b/examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json deleted file mode 100644 index 99b859484ac..00000000000 --- a/examples/event_sources/events/s3EventBridgeNotificationObjectCreatedEvent.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "0", - "id": "f5f1e65c-dc3a-93ca-6c1e-b1647eac7963", - "detail-type": "Object Created", - "source": "aws.s3", - "account": "123456789012", - "time": "2023-03-08T17:50:14Z", - "region": "eu-west-1", - "resources": [ - "arn:aws:s3:::example-bucket" - ], - "detail": { - "version": "0", - "bucket": { - "name": "example-bucket" - }, - "object": { - "key": "img.jpg", - "size": 184662, - "etag": "4e68adba0abe2dc8653dc3354e14c01d", - "sequencer": "006408CAD69598B05E" - }, - "request-id": "57H08PA84AB1JZW0", - "requester": "123456789012", - "source-ip-address": "34.252.34.74", - "reason": "PutObject" - } -} \ No newline at end of file diff --git a/examples/event_sources/events/sesEvent.json b/examples/event_sources/events/sesEvent.json deleted file mode 100644 index 636ecad687f..00000000000 --- a/examples/event_sources/events/sesEvent.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "Records": [ - { - "eventVersion": "1.0", - "ses": { - "mail": { - "commonHeaders": { - "from": [ - "Jane Doe " - ], - "to": [ - "johndoe@example.com" - ], - "returnPath": "janedoe@example.com", - "messageId": "<0123456789example.com>", - "date": "Wed, 7 Oct 2015 12:34:56 -0700", - "subject": "Test Subject" - }, - "source": "janedoe@example.com", - "timestamp": "1970-01-01T00:00:00.000Z", - "destination": [ - "johndoe@example.com" - ], - "headers": [ - { - "name": "Return-Path", - "value": "" - }, - { - "name": "Received", - "value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by ..." - }, - { - "name": "DKIM-Signature", - "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; ..." - }, - { - "name": "MIME-Version", - "value": "1.0" - }, - { - "name": "From", - "value": "Jane Doe " - }, - { - "name": "Date", - "value": "Wed, 7 Oct 2015 12:34:56 -0700" - }, - { - "name": "Message-ID", - "value": "<0123456789example.com>" - }, - { - "name": "Subject", - "value": "Test Subject" - }, - { - "name": "To", - "value": "johndoe@example.com" - }, - { - "name": "Content-Type", - "value": "text/plain; charset=UTF-8" - } - ], - "headersTruncated": false, - "messageId": "o3vrnil0e2ic28tr" - }, - "receipt": { - "recipients": [ - "johndoe@example.com" - ], - "timestamp": "1970-01-01T00:00:00.000Z", - "spamVerdict": { - "status": "PASS" - }, - "dkimVerdict": { - "status": "PASS" - }, - "dmarcPolicy": "reject", - "processingTimeMillis": 574, - "action": { - "type": "Lambda", - "invocationType": "Event", - "functionArn": "arn:aws:lambda:us-west-2:012345678912:function:Example" - }, - "dmarcVerdict": { - "status": "PASS" - }, - "spfVerdict": { - "status": "PASS" - }, - "virusVerdict": { - "status": "PASS" - } - } - }, - "eventSource": "aws:ses" - } - ] -} diff --git a/examples/event_sources/events/snsEvent.json b/examples/event_sources/events/snsEvent.json deleted file mode 100644 index 3d8a8ed443c..00000000000 --- a/examples/event_sources/events/snsEvent.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "Records": [ - { - "EventVersion": "1.0", - "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:sns-la ...", - "EventSource": "aws:sns", - "Sns": { - "SignatureVersion": "1", - "Timestamp": "2019-01-02T12:45:07.000Z", - "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", - "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotification", - "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", - "Message": "Hello from SNS!", - "MessageAttributes": { - "Test": { - "Type": "String", - "Value": "TestString" - }, - "TestBinary": { - "Type": "Binary", - "Value": "TestBinary" - } - }, - "Type": "Notification", - "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe", - "TopicArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda", - "Subject": "TestInvoke" - } - } - ] -} \ No newline at end of file diff --git a/examples/event_sources/events/sqsEvent.json b/examples/event_sources/events/sqsEvent.json deleted file mode 100644 index 4ca764cc0ba..00000000000 --- a/examples/event_sources/events/sqsEvent.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "Records": [ - { - "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", - "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", - "body": "Test message.", - "attributes": { - "ApproximateReceiveCount": "1", - "SentTimestamp": "1545082649183", - "SenderId": "1234", - "ApproximateFirstReceiveTimestamp": "1545082649185" - }, - "messageAttributes": { - "testAttr": { - "stringValue": "100", - "binaryValue": "base64Str", - "dataType": "Number" - } - }, - "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", - "eventSource": "aws:sqs", - "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", - "awsRegion": "us-east-2" - }, - { - "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", - "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", - "body": "{\"message\": \"foo1\"}", - "attributes": { - "ApproximateReceiveCount": "1", - "SentTimestamp": "1545082650636", - "SenderId": "1234", - "ApproximateFirstReceiveTimestamp": "1545082650649" - }, - "messageAttributes": {}, - "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", - "eventSource": "aws:sqs", - "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", - "awsRegion": "us-east-2" - } - ] -} \ No newline at end of file diff --git a/examples/event_sources/src/vpc_lattice_payload.json b/examples/event_sources/events/vpc_lattice_payload.json similarity index 100% rename from examples/event_sources/src/vpc_lattice_payload.json rename to examples/event_sources/events/vpc_lattice_payload.json diff --git a/examples/event_sources/src/vpc_lattice_v2_payload.json b/examples/event_sources/events/vpc_lattice_v2_payload.json similarity index 100% rename from examples/event_sources/src/vpc_lattice_v2_payload.json rename to examples/event_sources/events/vpc_lattice_v2_payload.json diff --git a/examples/event_sources/src/aws_config_rule_item_changed.json b/examples/event_sources/src/aws_config_rule_item_changed.json deleted file mode 100644 index cbf7abf67aa..00000000000 --- a/examples/event_sources/src/aws_config_rule_item_changed.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version":"1.0", - "invokingEvent":"{\"configurationItemDiff\":{\"changedProperties\":{\"Configuration.InstanceType\":{\"previousValue\":\"t2.micro\",\"updatedValue\":\"t2.medium\",\"changeType\":\"UPDATE\"},\"Configuration.State.Name\":{\"previousValue\":\"running\",\"updatedValue\":\"stopped\",\"changeType\":\"UPDATE\"},\"Configuration.StateTransitionReason\":{\"previousValue\":\"\",\"updatedValue\":\"User initiated (2023-04-27 15:01:07 GMT)\",\"changeType\":\"UPDATE\"},\"Configuration.StateReason\":{\"previousValue\":null,\"updatedValue\":{\"code\":\"Client.UserInitiatedShutdown\",\"message\":\"Client.UserInitiatedShutdown: User initiated shutdown\"},\"changeType\":\"CREATE\"},\"Configuration.CpuOptions.CoreCount\":{\"previousValue\":1,\"updatedValue\":2,\"changeType\":\"UPDATE\"}},\"changeType\":\"UPDATE\"},\"configurationItem\":{\"relatedEvents\":[],\"relationships\":[{\"resourceId\":\"eipalloc-0ebb4367662263cc1\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::EIP\",\"name\":\"Is attached to ElasticIp\"},{\"resourceId\":\"eni-034dd31c4b17ada8c\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::NetworkInterface\",\"name\":\"Contains NetworkInterface\"},{\"resourceId\":\"eni-09a604c0ec356b06f\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::NetworkInterface\",\"name\":\"Contains NetworkInterface\"},{\"resourceId\":\"sg-0fb295a327d9b4835\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::SecurityGroup\",\"name\":\"Is associated with SecurityGroup\"},{\"resourceId\":\"subnet-cad1f2f4\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::Subnet\",\"name\":\"Is contained in Subnet\"},{\"resourceId\":\"vol-0a288b5eb9fea4b30\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::Volume\",\"name\":\"Is attached to Volume\"},{\"resourceId\":\"vpc-2d96be57\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::VPC\",\"name\":\"Is contained in Vpc\"}],\"configuration\":{\"amiLaunchIndex\":0,\"imageId\":\"ami-09d95fab7fff3776c\",\"instanceId\":\"i-042dd005362091826\",\"instanceType\":\"t2.medium\",\"kernelId\":null,\"keyName\":\"mihaec2\",\"launchTime\":\"2023-04-27T14:57:16.000Z\",\"monitoring\":{\"state\":\"disabled\"},\"placement\":{\"availabilityZone\":\"us-east-1e\",\"affinity\":null,\"groupName\":\"\",\"partitionNumber\":null,\"hostId\":null,\"tenancy\":\"default\",\"spreadDomain\":null,\"hostResourceGroupArn\":null},\"platform\":null,\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\",\"productCodes\":[],\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIpAddress\":\"3.232.229.57\",\"ramdiskId\":null,\"state\":{\"code\":80,\"name\":\"stopped\"},\"stateTransitionReason\":\"User initiated (2023-04-27 15:01:07 GMT)\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"architecture\":\"x86_64\",\"blockDeviceMappings\":[{\"deviceName\":\"/dev/xvda\",\"ebs\":{\"attachTime\":\"2020-05-30T15:21:58.000Z\",\"deleteOnTermination\":true,\"status\":\"attached\",\"volumeId\":\"vol-0a288b5eb9fea4b30\"}}],\"clientToken\":\"\",\"ebsOptimized\":false,\"enaSupport\":true,\"hypervisor\":\"xen\",\"iamInstanceProfile\":{\"arn\":\"arn:aws:iam::0123456789012:instance-profile/AmazonSSMRoleForInstancesQuickSetup\",\"id\":\"AIPAS5S4WFUBL72S3QXW5\"},\"instanceLifecycle\":null,\"elasticGpuAssociations\":[],\"elasticInferenceAcceleratorAssociations\":[],\"networkInterfaces\":[{\"association\":{\"carrierIp\":null,\"ipOwnerId\":\"0123456789012\",\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIp\":\"3.232.229.57\"},\"attachment\":{\"attachTime\":\"2020-05-30T15:21:57.000Z\",\"attachmentId\":\"eni-attach-0a7e75dc9c1c291a0\",\"deleteOnTermination\":true,\"deviceIndex\":0,\"status\":\"attached\",\"networkCardIndex\":0},\"description\":\"\",\"groups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"}],\"ipv6Addresses\":[],\"macAddress\":\"06:cf:00:c2:17:db\",\"networkInterfaceId\":\"eni-034dd31c4b17ada8c\",\"ownerId\":\"0123456789012\",\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\",\"privateIpAddresses\":[{\"association\":{\"carrierIp\":null,\"ipOwnerId\":\"0123456789012\",\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIp\":\"3.232.229.57\"},\"primary\":true,\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\"}],\"sourceDestCheck\":true,\"status\":\"in-use\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"interfaceType\":\"interface\"},{\"association\":null,\"attachment\":{\"attachTime\":\"2020-11-26T23:46:04.000Z\",\"attachmentId\":\"eni-attach-0e6d150ebbd19966e\",\"deleteOnTermination\":false,\"deviceIndex\":1,\"status\":\"attached\",\"networkCardIndex\":0},\"description\":\"MINHAEC2AAAAAA\",\"groups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"},{\"groupName\":\"default\",\"groupId\":\"sg-88105fa0\"}],\"ipv6Addresses\":[],\"macAddress\":\"06:0a:62:00:64:5f\",\"networkInterfaceId\":\"eni-09a604c0ec356b06f\",\"ownerId\":\"0123456789012\",\"privateDnsName\":\"ip-172-31-70-9.ec2.internal\",\"privateIpAddress\":\"172.31.70.9\",\"privateIpAddresses\":[{\"association\":null,\"primary\":true,\"privateDnsName\":\"ip-172-31-70-9.ec2.internal\",\"privateIpAddress\":\"172.31.70.9\"}],\"sourceDestCheck\":true,\"status\":\"in-use\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"interfaceType\":\"interface\"}],\"outpostArn\":null,\"rootDeviceName\":\"/dev/xvda\",\"rootDeviceType\":\"ebs\",\"securityGroups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"}],\"sourceDestCheck\":true,\"spotInstanceRequestId\":null,\"sriovNetSupport\":null,\"stateReason\":{\"code\":\"Client.UserInitiatedShutdown\",\"message\":\"Client.UserInitiatedShutdown: User initiated shutdown\"},\"tags\":[{\"key\":\"projeto\",\"value\":\"meetup\"},{\"key\":\"Name\",\"value\":\"Minha\"},{\"key\":\"CentroCusto\",\"value\":\"TI\"},{\"key\":\"Setor\",\"value\":\"Desenvolvimento\"}],\"virtualizationType\":\"hvm\",\"cpuOptions\":{\"coreCount\":2,\"threadsPerCore\":1},\"capacityReservationId\":null,\"capacityReservationSpecification\":{\"capacityReservationPreference\":\"open\",\"capacityReservationTarget\":null},\"hibernationOptions\":{\"configured\":false},\"licenses\":[],\"metadataOptions\":{\"state\":\"applied\",\"httpTokens\":\"optional\",\"httpPutResponseHopLimit\":1,\"httpEndpoint\":\"enabled\"},\"enclaveOptions\":{\"enabled\":false},\"bootMode\":null},\"supplementaryConfiguration\":{},\"tags\":{\"projeto\":\"meetup\",\"Setor\":\"Desenvolvimento\",\"CentroCusto\":\"TI\",\"Name\":\"Minha\"},\"configurationItemVersion\":\"1.3\",\"configurationItemCaptureTime\":\"2023-04-27T15:03:11.636Z\",\"configurationStateId\":1682607791636,\"awsAccountId\":\"0123456789012\",\"configurationItemStatus\":\"OK\",\"resourceType\":\"AWS::EC2::Instance\",\"resourceId\":\"i-042dd005362091826\",\"resourceName\":null,\"ARN\":\"arn:aws:ec2:us-east-1:0123456789012:instance/i-042dd005362091826\",\"awsRegion\":\"us-east-1\",\"availabilityZone\":\"us-east-1e\",\"configurationStateMd5Hash\":\"\",\"resourceCreationTime\":\"2023-04-27T14:57:16.000Z\"},\"notificationCreationTime\":\"2023-04-27T15:03:13.332Z\",\"messageType\":\"ConfigurationItemChangeNotification\",\"recordVersion\":\"1.3\"}", - "ruleParameters":"{\"desiredInstanceType\": \"t2.micro\"}", - "resultToken":"eyJlbmNyeXB0ZWREYXRhIjpbLTQxLDEsLTU3LC0zMCwtMTIxLDUzLDUyLDQ1LC01NywtOCw3MywtODEsLTExNiwtMTAyLC01MiwxMTIsLTQ3LDU4LDY1LC0xMjcsMTAyLDUsLTY5LDQ0LC0xNSwxMTQsNDEsLTksMTExLC0zMCw2NSwtNzUsLTM1LDU0LDEwNSwtODksODYsNDAsLTEwNSw5OCw2NSwtMTE5LC02OSwyNCw2NiwtMjAsODAsLTExMiwtNzgsLTgwLDQzLC01NywzMCwtMjUsODIsLTEwLDMsLTQsLTg1LC01MywtMzcsLTkwLC04OCwtOTgsLTk4LC00MSwxOSwxMTYsNjIsLTIzLC0xMjEsLTEwOCw1NywtNTgsLTUyLDI5LDEwMSwxMjIsLTU2LC03MSwtODEsLTQ3LDc3LC0yMiwtMTI0LC0zLC04NiwtMTIyLC00MCwtODksLTEwMSw1NywtMTI3LC0zNywtMzcsLTMxLC05OCwtMzEsMTEsLTEyNSwwLDEwOCwtMzIsNjQsNjIsLTIyLDAsNDcsLTEwNiwtMTAwLDEwNCwxNCw1OCwxMjIsLTEwLC01MCwtOTAsLTgwLC01MCwtNSw2NSwwLC0yNSw4NSw4Miw3LDkzLDEyMiwtODIsLTExNiwtNzksLTQ0LDcyLC03MywtNjksMTQsLTU2LDk0LDkwLDExNCwtMjksLTExOSwtNzEsODgsMTA3LDEwNywxMTAsLTcsMTI3LC0xMjUsLTU3LC0xMjYsLTEyMCw2OSwtMTI3LC03NiwtMTE5LDcxLDEsLTY4LDEwNywxMTMsLTU2LDg3LC0xMDIsLTE2LDEwOCwtMTA3LC00MywtOTQsLTEwNiwzLDkwLDE0LDcyLC0xMiwtMTE2LC03Myw4MCwtMTIyLDQ0LC0xMDQsMTIsNzQsNTcsLTEwLC0xMDUsLTExMiwtMzYsMjgsLTQ1LDk3LDExLC00OSwtMTEsNjEsMzYsLTE3LC03NCw1MCw0LC0yNiwxMDQsLTI4LC0xMjUsMjQsNzAsLTg1LC00Niw5MiwtMTAzLC00MSwtMTA2LDY5LDEyMiwyMSwtMjUsODAsOTksLTkzLC01NiwtMjUsLTQ3LC0xMjMsLTU5LC0xMjQsLTUyLC0xNiwxMjcsLTM4LC0xNiwxMDEsMTE5LDEwNywyNywxMCwtNDYsLTg3LC0xMiwtMzksMTQsNDUsMiw3MCwxMDcsMTA0LC00LC02OSwtMTIsNTksLTEyNiwtOTEsMTI3LDU0LDEwNiwtMTI2LC0xMTYsLTEwMiw3Miw4MSw1MCw3NSwtNTEsMTA4LDQxLC0zLC02LC00NSwxMDMsLTg2LDM3LC00NiwtMzIsLTExMSwxMjQsMTExLDg3LDU0LC03NiwxMjIsLTUsLTM2LC04OCw5LC0xMTMsMTE2LC01OSw4Myw3NywyOCwxMiwtNjUsLTExMywtNzksLTEyOCw4MiwtMTE4LC04MywtMTI0LDMxLDk5LC05MCwtOTksMTYsLTEyMywyMSwtMTE0LC05OCwtMTE2LC0xMTksMiwtNzMsNDYsODIsLTEzLDU0LDcxLC00MiwyNSw3NCw3MywtODYsOTQsNDYsOTksOTMsLTgyLDU1LDY1LC05OCw0OSwtNjAsMTEyLDEwMSwyMiw2OSwtMTYsNzcsLTk0LC01OSwtNDYsMTE1LDMwLC00Myw5Myw4OCwtMjgsMzgsNiw4NCwzMSwtMTAxLDMyLC0yMiwtNjMsLTk1LDExNCwtNzUsMTE0LDM2LC04NCw0MCwtNDQsLTEzLDU5LDcyLC0xLC0xMDMsMzEsMTA1LDY5LDY5LDc3LC02NCwtNTYsMTE4LDEzLC0xMTQsODAsOTksLTUzLDI1LDQyLDk0LDczLC04MCwyNSwzOCwyNCwtMTcsNjYsLTExOCwtMjMsMTE5LDkwLDEyMSwxMTgsLTUxLDUxLC0xMiwtNzYsLTUxLDksLTIxLDExNCwtMzcsLTY0LC0yLC0xMjYsLTk1LDYzLDczLC00MSwtMzQsLTkwLC0yMiw1OSwtNzksMzAsLTQsLTEsLTUsMTIsMzksLTk5LC0xMDUsLTEwNCwtNjEsNjUsLTc0LDE5LC0xMywtNjAsLTI4LC04LDQsLTgsMTIxLC0xMTgsMTIyLC02NSwtMjEsMjMsMTcsLTg0LDQwLC05MiwxNCwtMTI2LC02MCwtNzksLTUzLDM3LC04Myw2NSwxMDQsLTM2LC02MCwtMTEwLC0zMywtMTE3LDYsMTA3LDEsLTMsOTMsNzgsLTk1LC0xMjIsNTMsMTA4LC00OSwtNDksMjQsLTY1LDgzLDEyNSwtNzcsLTE5LC04MSwzNCwtNjcsLTQzLC03MCwtMjYsMTgsMTA0LDY1LDQsLTEyNiw0NCwtMTE5LDUyLC00NiwyMiw2NywxMTMsMTE4LC0zMywzNCwtOTYsMTIxLDE5LC0yLC0zNSwwLC04MiwxNyw2NiwtMjcsNjksLTM2LC0xNCw1NiwtOTcsLTE2LDEyMywyOCwtOTUsLTMyLC02MywtNjksNzAsNjQsLTMzLC0xMDAsNDMsLTExMywxMDUsMTAwLDEwOCwtNjAsNDAsLTIsLTk2LC0xMjQsMzcsLTQ1LC0xMjQsLTY4LC02OSwtMTIzLDE3LC02LDg2LC01OSwtOTQsMTEwLDczLDU3LC0xMTYsMTA3LC00MSwtOTQsLTExOCwtMTI2LDEwLC04MCwtNzAsMTAyLDg4LC0xMjYsODcsLTI3LC0xMDEsLTk0LC0zNSwtMTA2LC02LC03MiwtODYsNTAsMTE2LC0yOCw5MCwxMywtMTIwLDYsMjcsOTIsNTYsLTkwLDM5LDQ5LC0xMywtODYsLTI1LC04NiwxMTMsLTEzLDQxLC0xMTksOTQsLTk0LC0xMDMsLTgzLC02MCwxMjcsLTE1LC0zOSwxMTksLTk1LDI3LDQ0LDExNiwxMDksNywtMTAyLC0xNyw0OCwtODIsLTMxLC04LC02OSwzNSw5NCw1NCwtNTUsMSwtMTE5LDU3LC0xMDgsLTMsLTkxLC0xMjIsLTUzLC04OCw0LC05NywtMzUsMTI2LDExOSw1OSwtMSw4NSw3MywtNTgsLTEyMCwtNjQsMTE5LC0xMTIsOTIsMTksOSwtNjYsLTkyLDEwOCwtMTEsLTQyLDExMSwtMTA0LC0xMjAsMjcsLTEwMywtNjksMTksMTExLDEyLDIzLDEwNyw1NCw0MSwtMjYsNjAsLTMxLC01XSwibWF0ZXJpYWxTZXRTZXJpYWxOdW1iZXIiOjEsIml2UGFyYW1ldGVyU3BlYyI6eyJpdiI6Wy05NSwzMiwxMDgsOTEsMzUsLTgyLC0zNywyNCwtNDQsLTExNSwtODIsLTEyOCwtMTIyLDMsNTMsLTI0XX19", - "eventLeftScope":false, - "executionRoleArn":"arn:aws:iam::0123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig", - "configRuleArn":"arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", - "configRuleName":"MyRule", - "configRuleId":"config-rule-i9y8j9", - "accountId":"0123456789012", - "evaluationMode":"DETECTIVE" - } diff --git a/examples/event_sources/src/aws_config_rule_oversized.json b/examples/event_sources/src/aws_config_rule_oversized.json deleted file mode 100644 index 5eaef4e0015..00000000000 --- a/examples/event_sources/src/aws_config_rule_oversized.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "invokingEvent": "{\"configurationItemSummary\": {\"changeType\": \"UPDATE\",\"configurationItemVersion\": \"1.2\",\"configurationItemCaptureTime\":\"2016-10-06T16:46:16.261Z\",\"configurationStateId\": 0,\"awsAccountId\":\"123456789012\",\"configurationItemStatus\": \"OK\",\"resourceType\": \"AWS::EC2::Instance\",\"resourceId\":\"i-00000000\",\"resourceName\":null,\"ARN\":\"arn:aws:ec2:us-west-2:123456789012:instance/i-00000000\",\"awsRegion\": \"us-west-2\",\"availabilityZone\":\"us-west-2a\",\"configurationStateMd5Hash\":\"8f1ee69b287895a0f8bc5753eca68e96\",\"resourceCreationTime\":\"2016-10-06T16:46:10.489Z\"},\"messageType\":\"OversizedConfigurationItemChangeNotification\", \"notificationCreationTime\": \"2016-10-06T16:46:16.261Z\", \"recordVersion\": \"1.0\"}", - "ruleParameters": "{\"myParameterKey\":\"myParameterValue\"}", - "resultToken": "myResultToken", - "eventLeftScope": false, - "executionRoleArn": "arn:aws:iam::123456789012:role/config-role", - "configRuleArn": "arn:aws:config:us-east-2:123456789012:config-rule/config-rule-ec2-managed-instance-inventory", - "configRuleName": "change-triggered-config-rule", - "configRuleId": "config-rule-0123456", - "accountId": "123456789012", - "version": "1.0" -} diff --git a/examples/event_sources/src/cloudWatchDashboard.py b/examples/event_sources/src/cloudWatchDashboard.py index f1c806fd84c..ff8b896a806 100644 --- a/examples/event_sources/src/cloudWatchDashboard.py +++ b/examples/event_sources/src/cloudWatchDashboard.py @@ -6,19 +6,26 @@ @event_source(data_class=CloudWatchDashboardCustomWidgetEvent) def lambda_handler(event: CloudWatchDashboardCustomWidgetEvent, context): + if event.widget_context is None: + logger.warning("No widget context provided") + return {"title": "Error", "markdown": "Widget context is missing"} + logger.info(f"Processing custom widget for dashboard: {event.widget_context.dashboard_name}") # Access specific event properties widget_id = event.widget_context.widget_id - time_range_start = event.widget_context.time_range.start - time_range_end = event.widget_context.time_range.end + time_range = event.widget_context.time_range + + if time_range is None: + logger.warning("No time range provided") + return {"title": f"Custom Widget {widget_id}", "markdown": "Time range is missing"} # Your custom widget logic here return { "title": f"Custom Widget {widget_id}", "markdown": f""" Dashboard: {event.widget_context.dashboard_name} - Time Range: {time_range_start} to {time_range_end} - Theme: {event.widget_context.theme} + Time Range: {time_range.start} to {time_range.end} + Theme: {event.widget_context.theme or 'default'} """, } diff --git a/examples/event_sources/src/codedeploy_lifecycle_hook.py b/examples/event_sources/src/codedeploy_lifecycle_hook.py index 862dc75de8b..6da54d185fc 100644 --- a/examples/event_sources/src/codedeploy_lifecycle_hook.py +++ b/examples/event_sources/src/codedeploy_lifecycle_hook.py @@ -2,7 +2,7 @@ @event_source(data_class=CodeDeployLifecycleHookEvent) -def lambda_handler(event: CodeDeployLifecycleHookEvent, context) -> None: +def lambda_handler(event: CodeDeployLifecycleHookEvent, context): deployment_id = event.deployment_id lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id diff --git a/examples/event_sources/src/cognito_define_auth.py b/examples/event_sources/src/cognito_define_auth.py index 5ca425de0f9..2f7d197bb26 100644 --- a/examples/event_sources/src/cognito_define_auth.py +++ b/examples/event_sources/src/cognito_define_auth.py @@ -1,29 +1,30 @@ from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import DefineAuthChallengeTriggerEvent -def lambda_handler(event: dict, context) -> dict: - event: DefineAuthChallengeTriggerEvent = DefineAuthChallengeTriggerEvent(event) - if len(event.request.session) == 1 and event.request.session[0].challenge_name == "SRP_A": - event.response.issue_tokens = False - event.response.fail_authentication = False - event.response.challenge_name = "PASSWORD_VERIFIER" +def lambda_handler(event, context) -> dict: + event_obj: DefineAuthChallengeTriggerEvent = DefineAuthChallengeTriggerEvent(event) + + if len(event_obj.request.session) == 1 and event_obj.request.session[0].challenge_name == "SRP_A": + event_obj.response.issue_tokens = False + event_obj.response.fail_authentication = False + event_obj.response.challenge_name = "PASSWORD_VERIFIER" elif ( - len(event.request.session) == 2 - and event.request.session[1].challenge_name == "PASSWORD_VERIFIER" - and event.request.session[1].challenge_result + len(event_obj.request.session) == 2 + and event_obj.request.session[1].challenge_name == "PASSWORD_VERIFIER" + and event_obj.request.session[1].challenge_result ): - event.response.issue_tokens = False - event.response.fail_authentication = False - event.response.challenge_name = "CUSTOM_CHALLENGE" + event_obj.response.issue_tokens = False + event_obj.response.fail_authentication = False + event_obj.response.challenge_name = "CUSTOM_CHALLENGE" elif ( - len(event.request.session) == 3 - and event.request.session[2].challenge_name == "CUSTOM_CHALLENGE" - and event.request.session[2].challenge_result + len(event_obj.request.session) == 3 + and event_obj.request.session[2].challenge_name == "CUSTOM_CHALLENGE" + and event_obj.request.session[2].challenge_result ): - event.response.issue_tokens = True - event.response.fail_authentication = False + event_obj.response.issue_tokens = True + event_obj.response.fail_authentication = False else: - event.response.issue_tokens = False - event.response.fail_authentication = True + event_obj.response.issue_tokens = False + event_obj.response.fail_authentication = True - return event.raw_event + return event_obj.raw_event diff --git a/examples/event_sources/src/dynamodb_multiple_records.py b/examples/event_sources/src/dynamodb_multiple_records.py index ebc216e4da2..8436dcfc827 100644 --- a/examples/event_sources/src/dynamodb_multiple_records.py +++ b/examples/event_sources/src/dynamodb_multiple_records.py @@ -4,7 +4,10 @@ @event_source(data_class=DynamoDBStreamEvent) def lambda_handler(event: DynamoDBStreamEvent, context: LambdaContext): + processed_keys = [] for record in event.records: - # {"N": "123.45"} => Decimal("123.45") - key: str = record.dynamodb.keys["Id"] - return {"statusCode": 200, "body": f"Key:, {key}!"} + if record.dynamodb and record.dynamodb.keys and "Id" in record.dynamodb.keys: + key = record.dynamodb.keys["Id"] + processed_keys.append(key) + + return {"statusCode": 200, "body": f"Processed keys: {processed_keys}"} diff --git a/examples/event_sources/src/kafka_event.py b/examples/event_sources/src/kafka_event.py index 93568931eb6..c6f62e243eb 100644 --- a/examples/event_sources/src/kafka_event.py +++ b/examples/event_sources/src/kafka_event.py @@ -1,7 +1,7 @@ from aws_lambda_powertools.utilities.data_classes import KafkaEvent, event_source -def do_something_with(key: bytes, value: dict): +def do_something_with(key: str, value: str): print(f"key: {key}, value: {value}") diff --git a/examples/event_sources/src/kinesis_streams.py b/examples/event_sources/src/kinesis_streams.py index 195f6ae565a..630190c5807 100644 --- a/examples/event_sources/src/kinesis_streams.py +++ b/examples/event_sources/src/kinesis_streams.py @@ -1,4 +1,5 @@ import json +from typing import Any, Dict, Union from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.data_classes import KinesisStreamEvent, event_source @@ -12,21 +13,23 @@ def lambda_handler(event: KinesisStreamEvent, context: LambdaContext): for record in event.records: kinesis_record = record.kinesis + payload: Union[Dict[str, Any], str] + try: - # First, try to parse the data as JSON - data = kinesis_record.data_as_json() + # Try to parse as JSON first + payload = kinesis_record.data_as_json() logger.info("Received JSON data from Kinesis") except json.JSONDecodeError: - # If JSON parsing fails, treat it as text - data = kinesis_record.data_as_text() + # If JSON parsing fails, get as text + payload = kinesis_record.data_as_text() logger.info("Received text data from Kinesis") - process_data(data) + process_data(payload) return {"statusCode": 200, "body": "Processed all records successfully"} -def process_data(data): +def process_data(data: Union[Dict[str, Any], str]) -> None: if isinstance(data, dict): # Handle JSON data logger.info(f"Processing JSON data: {data}") diff --git a/examples/event_sources/src/secrets_manager_event.json b/examples/event_sources/src/secrets_manager_event.json deleted file mode 100644 index 18e7dcd935b..00000000000 --- a/examples/event_sources/src/secrets_manager_event.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "SecretId":"arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", - "ClientRequestToken":"550e8400-e29b-41d4-a716-446655440000", - "Step":"createSecret" -} From 69ed1995869f5ccf02f5d239e6752af70945c7f9 Mon Sep 17 00:00:00 2001 From: Ana Falcao Date: Fri, 24 Jan 2025 17:15:27 -0300 Subject: [PATCH 7/7] fix highlight kinesis event --- docs/utilities/data_classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 6095c83c47d..2574d119acd 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -559,7 +559,7 @@ or plain text, depending on the original payload. === "app.py" - ```python hl_lines="4 10" + ```python hl_lines="4 11" --8<-- "examples/event_sources/src/kinesis_streams.py" ```