rovided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type null $last_used Null. * @type null $last_ip Null. * } * @param string $new_password The generated application password in plain text. * @param array $args { * Arguments used to create the application password. * * @type string $name The name of the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * } */ do_action( 'wp_create_application_password', $user_id, $new_item, $new_password, $args ); return array( $new_password, $new_item ); } /** * Gets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @return array { * The list of application passwords. * * @type array ...$0 { * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * } */ public static function get_user_application_passwords( $user_id ) { $passwords = get_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, true ); if ( ! is_array( $passwords ) ) { return array(); } $save = false; foreach ( $passwords as $i => $password ) { if ( ! isset( $password['uuid'] ) ) { $passwords[ $i ]['uuid'] = wp_generate_uuid4(); $save = true; } } if ( $save ) { static::set_user_application_passwords( $user_id, $passwords ); } return $passwords; } /** * Gets a user's application password with the given UUID. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return array|null { * The application password if found, null otherwise. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } */ public static function get_user_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( $password['uuid'] === $uuid ) { return $password; } } return null; } /** * Checks if an application password with the given name exists for this user. * * @since 5.7.0 * * @param int $user_id User ID. * @param string $name Application name. * @return bool Whether the provided application name exists. */ public static function application_name_exists_for_user( $user_id, $name ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( strtolower( $password['name'] ) === strtolower( $name ) ) { return true; } } return false; } /** * Updates an application password. * * @since 5.6.0 * @since 6.8.0 The actual password should now be hashed using wp_fast_hash(). * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @param array $update { * Information about the application password to update. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * @return true|WP_Error True if successful, otherwise a WP_Error instance is returned on error. */ public static function update_application_password( $user_id, $uuid, $update = array() ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$item ) { if ( $item['uuid'] !== $uuid ) { continue; } if ( ! empty( $update['name'] ) ) { $update['name'] = sanitize_text_field( $update['name'] ); } $save = false; if ( ! empty( $update['name'] ) && $item['name'] !== $update['name'] ) { $item['name'] = $update['name']; $save = true; } if ( $save ) { $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } } /** * Fires when an application password is updated. * * @since 5.6.0 * @since 6.8.0 The password is now hashed using wp_fast_hash() instead of phpass. * Existing passwords may still be hashed using phpass. * * @param int $user_id The user ID. * @param array $item { * The updated application password details. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * @param array $update The information to update. */ do_action( 'wp_update_application_password', $user_id, $item, $update ); return true; } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Records that an application password has been used. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return true|WP_Error True if the usage was recorded, a WP_Error if an error occurs. */ public static function record_application_password_usage( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$password ) { if ( $password['uuid'] !== $uuid ) { continue; } // Only record activity once a day. if ( $password['last_used'] + DAY_IN_SECONDS > time() ) { return true; } $password['last_used'] = time(); $password['last_ip'] = $_SERVER['REMOTE_ADDR']; $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } return true; } // Specified application password not found! return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes an application password. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return true|WP_Error Whether the password was successfully found and deleted, a WP_Error otherwise. */ public static function delete_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $key => $item ) { if ( $item['uuid'] === $uuid ) { unset( $passwords[ $key ] ); $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application password.' ) ); } /** * Fires when an application password is deleted. * * @since 5.6.0 * * @param int $user_id The user ID. * @param array $item The data about the application password. */ do_action( 'wp_delete_application_password', $user_id, $item ); return true; } } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes all application passwords for the given user. * * @since 5.6.0 * * @param int $user_id User ID. * @return int|WP_Error The number of passwords that were deleted or a WP_Error on failure. */ public static function delete_all_application_passwords( $user_id ) { $passwords = static::get_user_application_passwords( $user_id ); if ( $passwords ) { $saved = static::set_user_application_passwords( $user_id, array() ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application passwords.' ) ); } foreach ( $passwords as $item ) { /** This action is documented in wp-includes/class-wp-application-passwords.php */ do_action( 'wp_delete_application_password', $user_id, $item ); } return count( $passwords ); } return 0; } /** * Sets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @param array $passwords { * The list of application passwords. * * @type array ...$0 { * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * } * @return int|bool User meta ID if the key didn't exist (ie. this is the first time that an application password * has been saved for the user), true on successful update, false on failure or if the value passed * is the same as the one that is already in the database. */ protected static function set_user_application_passwords( $user_id, $passwords ) { return update_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, $passwords ); } /** * Sanitizes and then splits a password into smaller chunks. * * @since 5.6.0 * * @param string $raw_password The raw application password. * @return string The chunked password. */ public static function chunk_password( #[\SensitiveParameter] $raw_password ) { $raw_password = preg_replace( '/[^a-z\d]/i', '', $raw_password ); return trim( chunk_split( $raw_password, 4, ' ' ) ); } /** * Hashes a plaintext application password. * * @since 6.8.0 * * @param string $password Plaintext password. * @return string Hashed password. */ public static function hash_password( #[\SensitiveParameter] string $password ): string { return wp_fast_hash( $password ); } /** * Checks a plaintext application password against a hashed password. * * @since 6.8.0 * * @param string $password Plaintext password. * @param string $hash Hash of the password to check against. * @return bool Whether the password matches the hashed password. */ public static function check_password( #[\SensitiveParameter] string $password, string $hash ): bool { if ( ! str_starts_with( $hash, '$generic$' ) ) { /* * If the hash doesn't start with `$generic$`, it is a hash created with `wp_hash_password()`. * This is the case for application passwords created before 6.8.0. */ return wp_check_password( $password, $hash ); } return wp_verify_fast_hash( $password, $hash ); } } ۖF(lVE<%-_%ZS $T ƥ.a^{ O[2_r"" $XEyg I$"##3##"##3<|yOz䡪3_ر3-o( fM#g~7v2gSzFd :}Y2왝pfϏk?~PlN aPhM#A"ެe.݄GKb'z(<^Fqox^&xͰ_ًIK?OϟC"JTnV o^h)rp&qi%˯la_q-<x\MygK%~,VϞ=\/vx_o5C2Ά_a{4~|Zl+;rsҾ28]"AHbyHjn2MS&<45R`t釶V%~.+{b_khA]ζO#~ָw> ) T zn#a|&sC{K2pW̿Ð. ~-a>+;}w{!fk|s` ?s h|ۏ gxAA r)O'> lT4h󅭜(De\%8o}D,se@iP_+/< |{G%*o p䣰O[A ,T9YLMނ~RAw @vu,?~ 춐f0+IqTj%$ 'm[x0boBEW)g׫9@/#^Iяs0}S5(D i UG'/@iԉ| SiΉ[b/VdO[ϕ,qw>n>#/1122C ==h8[\d@+i f>Yq6)iu64Y=0Mqd6vM}8c ;dFR6* j0Y7CL=}ۘ3q=}]}dMFӮe {]C9ܝ dl/LJ;ycwC<%%EƂ N9b>PO$ol33:5y}e,,kf>6nĊ='Iu[O(0i8DM9inn1,LWPuIGpة6wVa~qୗϿc :ntgpr~,+ I&q|1+GmT,HQzKn08K}ku `v.v6$B w_~mJC~rjP<%f C;3u'ݧ7!9 >ֹ "q;*O'4O}G=N$  n A0`X0.tM5asAۨ9W]x.@rε 4z)G<`bk AA|NpQw[Ri'4}&4~dO wKEw]˙ڶcۏ\չS7ŝijOmnv`ID^F6eF%2;ޅ{ڦk83-!_xn1인ib5Da hQj?6˫@tJ"1ԇsezS뛽 NP +̈́$pK"@u'tpe7HY4)P}Y6{`!K YJ> xO`K=(Wo2[p|$L_4Nȋ!Hٌr<9XI0H3H,YTEk ڬS O.A+`RR7**j@iǎ-%L1`[Xw4Tğ`=qfo0HKRX؁ K*vXp`j(Uh;o,:zj11o+EHbE;aD=Qt. &~R-E/.BHVl! Q#"@+AY"h ] 5'hB$5]1N]Wnsw8ia(&QL'0;Wqr 3XussUcؑ MY)^ԹEo܀f1"U K<3 gMkm `sBЭj]C4 W*e*{SaU0{T4rS ]tRg@he 诓!kFJǷrEomQ )9K70{S ܆_9gi\4 ؍@fbqXr[q{:K =wmfEm:nnzU(EPq>Eέ\k"%4AვS ktkj#Ā/ۚq+0N߬!j*ؕ3=M=deSK7j:jAq ]C85V#fwT֞ 9K{Uw4 Y9}R0k g45W|E຋Ol}!Ufɻrm(H)Iv?Ԡo"OuWer1%>ۋVdE.K8+U{4B6-PVB "lXЂx6GRt _M{-c!g+oY~P)Z8M$Cj bMq3VBHMt7EMiv]FB|G RɘSZQSf.ZL84ʴbԌV`VSB,$P:R=X'hN]l<ԩAE;JjԎ۠,;fVZcX;L2X8~glc6 Пcz,FanO&CJ<ҟzsusg ]{P'#35&LHc``&h6U^Lp?ģ3ٜEƚfq>ΤW(y@4kLm"zѤg u&; &أ=[>1~Y-2p!] ų*lf~۰m{J1zЀ$KXnW{qKw46(xmöw^ÑHB3^{E m`蔲U;XZr^NV>h[}(s]l+;l!1* C˼JB4J[ XP]`5m3-M`ei@e }dPۍaX`gA3A+k0LL5*{@MDidՎ P-+նzE{*ph%73 mh 8HwM:t!@ZT! KF`U2H8^nfa]lFٖeUQg/6^aM-rnCk8L}M#ں*-0SqO5B.[@,1{8O2nHO5 4mPl\0`Б6(+&if.K >kr[rw\\wc 疳]>ZHha½ y:U\'-v䤟VO]"< pL] |R[X&_uuϺUQݵ<).+nfRf(", bL&E'N >c& Ѽ6s<<T1𩄌6"$vsMaũcZl U`;#̳!Wn7ĕ7ͻ 1S!Jm7jMjyk#lkHEbR4"l5+΃+(&Y{$} i,Sniyd}J_ާ{X ߫;w>ެKKߧ^"vpk~A7w@@;kCpww(~Z6w).R]+%\Ew4軃C1u]xͲHYmIM h*6Cޏ}Jj,͋$}^Ƽ_geԭnދZSu]^ŮXf:y2Tx#ni&{BSSFy^QՔdHj(ֺj0V(U; xeGHj]UJަлJ8Pj90!ODȡ S C?ztLhó*gyJy,k#ͺY6h$2HUA^G;7%X@Ӊbrxl$l*H8Xdj g]FEV5}qZ QW`7M2S9'^fQҜ#2"Z \1VBZQ%ߗR4>KlP"[Iۮ<3sg<_g<\.`vQ4DvB`6`BF^}b'ћz'a7YB!Ȟ=!W %oZJv 1܋m4px2/#f=E)lbG/NނAV]4 im7`U^/DP^;6{k m%~7jPOnJxv-R#C5׮`Y@!ł:fٜ܉[ףǿٲ-0fNa2s)F6- =G=HVا hV-Er Ty[l]>S?)!D1|~_,B|6cM٦W[/{){y5 K;֢;=+V:?$֤],SY7ZȄ2˲nʫtuLGAD0F(/`B(q:Yxf_xY %Z$g)&B#i*LEd%QX$TtvZZ;+,FZ=}JgEyxl# cd ɆQ5*nAi\ sՈLCso^H>5ZҠ$ա9B+lO10G{[CvlR^R<Ntv}{ &l]I4亮d{+'p6+-ͼ^])̂PV,ފ.eʛT(i?DL#k(rm=KBrdwM[ .^}v*\ Y{Łi 7BmJٵJ53v7]-MV _fX;bfO0&fW.LAED|ii$-{}p݀޿9U)F.).n$KxBumWi:k]<ٞws=Utѧi/.h^0 ̴p/@lD1Rf8 _YdLv1NXz+(R4";Lc3TꍩURi9{Zڹ`Vл)ʞ  7n>4p~ahug07 [Gw:Oi Ӑ/l]`?5SV[Cv\ לP<gan/JQ3Wϔe-@907)eD:Νk0RhBv-MD'=繽Pw/p@xV&,o0HUX9'J-o_S]/r~94C+%*X9>(-›e MJVޏy.0uх;zvN l00'_~"kf9F{s\q7P0Y`/Hjb3G'?O 2/׷(4)f t釶wLvA$ǮR! ^ ߫5 fDJ{}x:yKȴ*-Hs6K>8]C -O<. $ HkhqGWDq'x Vr(Pr ^C87c嗘0dx="a*L_C|7Viȓe)'0Eʩ:(J(7IcP"XH q$=5a&6jG ;*aIJB3h=QJ,Id^S bXe,)LJ:2y]C!VD!//_ c,KK,O  4m$B**qFo1cM]E32WA*AwSa٢]$(-REmVEI]2Γq,wf$]Q8AP !>oװʤ~EQ2h7Q{W͘DˤZX>o'/r?8BǾPP}qF'\P]E8y_qad=?GoH0-5 ʦ6{^'#XyЕ3|8RTB˸A=]Y~oݱΈ}[mhwuNZZ:lPcV*eѭŪ?c''%#~WNx$ꝣf@_r.f0G Y ڣ ŨD~.j@wiLAۜ_Dx&V8l6 `|`e4鮰Ă-$W\via C/!Ѐ!-kzN zSh9bݡY >30Ꚏ:ҺnӴ^tF&W/`z>B&e1 Uӭi1s/o,m`TMFۣ@@*peό@&|aZ6Yej#(w$D(/fhϾ@=Η BfH TsQ ci7IQEv~YKfmT*q%KjDI4&òVxZ}x1h4pُ9|ŵ߁yH#tnvDJxx*k om=ʬPJ.[C jIĝF:5w 'H ͗0MET!!+*Kقiv:gtAޅzg\V/5fbFhfUlj;lzŚ;_{Vg U֧cWUJXm""S ^FʘnR':%P:jiVabj;I'ApDW֗O[L6 E/绀0+t݃ݒ<W~s'h:+Xt/vqeWQ`djl 5W_,j[eAJ?nrDRBB]`tPi*8қMMݴ=V-#~S_{fT!C9TIREcwbu]k=l XknE!p%(QvAmlDWC1TTtY1zQ=AA}>Lu/TԟTQAA}5L^aeT[;>[ѕK 1gy ; LC,$`6E+Ӏd;E.ĖH,ar2,`Dži2$#B}WaiDof)VdYL]"@d$QRR*B2lO:D2PiSY[``ܐ̑7Fh{& ^XzO벮uT迡k}u|c๋``F se٨}!}>dK]$cL?1]w! (\5jY SL1`a?X}V#}PBjz 9īfI&KcYGz;H7jY^Ȥ❞t0m"X n#w|6 1 Mи–Vܲ̈́l`qN7R`W8 {c27Q پ,sN8Cn@^+k gOwYX)QHmaC*5U !DPĽ#*N#z( a1wTY1vj iK2ڐg/bӈ< fcoF'p j"bKb'z0T?x4Pԏvx3~js{1Ii?CTy6"ȃ(lA[_P }:hY2$=^~㟞?2>}\l ؈(f#z.8yKy`?M];m`Qž]`IAt:I˞j McpzўGU!͎77 *\|z.&O_bl`S/  . k'@3ld2xr]fOfa>/Eh*;Bf1b1;C1&ID.K\?D40.=ɰr8ƥS%P0뙚is &p6gb>a424uYfLLW0e~RCC.LӚ:P0Ljp)aK/Akz7#^3z1ju=| hYo3w3Y# T0!]j.p4sh0 `!L2^Oӻ/}\)0 r8tVY#pzA$sk~E&F`mC \/(B$0=?=h8GlY_u7z/Yi!<@; Zo0z!#_ a|`,Y?(6#CnC}&sxee>Snq1 pAEdxM exj#k#mj&#ל6udr_=f U D+k記 J~2F {%µ^`}s=] >OyA[>:xM C7aQG}SR7f1A}Մ!@Xe M] 0tAHA9DwZ@zFt݅jPe-$ZAoAG {TPQBb]=z ³5T}Cv鹵123obٶ{2%dϐmxF(rG2)%GĒI}|KVnq," j<GDoYb M ۱ ә<\ ӄ*fri奂s*46⧷ռhi&:LHi fxx+ΩL@i4R^`J"ԋgCơ "ѱ=5[^fɛEnx͜2guqR$dQ@R*ۼ8sO[,vna'7)/Ǚ؀97х.Ux<4$qF+w'ҴدOQP=TCf-bgZQ=:vྋ!ETmB>+4{{zLM1`,s`Óf*YjFt/ovKo}Cf@E)MDjZNYrɝeӂϹ^OaFr$~^Yl儻JH?w?,}X.# L@[{gL;J>D/2?M;~xw,vw$%;.]MCͫŎmy(zB22'ץ+reѲtTM4GM uTj0KQSЪs:gs/2b׬VQ,Z%Kס#‚hpI LblIDQ:ƈL8v˛I6oܳcg1OO ]Jb@>l|=MK{#وByg; tvQnn;ؿ0;ZD5F&S3ѽîK"РE:ie8Hq_S͡H] BCtb͑:מ! #ٗ t)]h evU0:"{t odɶG:m:&Bkޖ[]D|OuH휳H k裚-@PmRV~{djp\П 宇1Z=xp8o;sW*Ĺ^tBWǷKڸU@`=rgj$QB 75,w%xAGsveۮ䉯FOc Z ܸݜ`D@YJ ~EƖA꛾obsֶ~M\JT#5 H,~ĝK{5"+tI<[;(Ȼk{uXj8 TP\LiG羍~VNKT:bO< 1 B$'?k% Яu/k.=6K0^{!GKq3 }Z\|o18@itVNӵQzO3WƯoq{2VIюW%^餌o yX|ܶo/_+(x>: ߟȧ ^}DW5Z0!"~|v}Rȋ F/yEyȣ5\ yܶ<0E+.lo. q d$[<'?<_| .γ \?5PgVYP.1V&vyr $+]%sLy([j?00yC0) +$]gGn oD.RkRGCrԶ؅oD3Ix2Ɠ 2v"/#ȘU?Uh˄ٟSar)وwEKhg=&`bH3jA\V=pyIρij-{y"q=x"-{xJ^q@_(u)v qZf }<OaOG-@ 8`Ƀɉ zڨ;B1751$ CpsX]|5)")끧 L\\Ѳ/V]{c-nBJ>C3G/mrEżi_Ǫ8ռ*s|^ (Е&ȪA);edB#+F A9=PΌ>k,Jq"[e$wakц5c|1cC4i\yH:Q idO3{1= F rnw }ѧ#`YU:|uOT3IS1krUS']5z覮9o <FfR9!i֪PNvrwD*YCt| CMW6`@A'tuFqrA"\BϑMoK:!vI 3.I謚 `Ûbk_Q*Xeo)Zv MG kQ\@E2 ч!cR$SA\/@4 t@V='GXnpq! 60 a=w>zM >W_X.v@(|"_wbgt@n,ӳȣPYŽKza+ <2!{IY|D(ą:+(˃ězLȳXx 3߹'c*sbW1{%'{ s;4D I&P`m)b9" b#C|*_..p1n(,PuZH.іNᙊʣ\ V[JSX\]ԐdOeD0Ё2X_"z)E8ӻW'QBzF ?s4HnNN`OBAr {(U5.h yC]*a1Xщs)AbUS4^}%f6\&,srsҕ^lT4]_:b"-Ť2@-qtwMT~(<אwyWƵ&Sz#cYioBWBwP%ц en_ Z E^uPNoDm6³=(+}E obNw\*a(Q6a/]D $KVNPk, ۿ/G289h!. tx(c ot W{))2OX:˂臸RGx%~l0˄ /$$I$x*]KՌw DtT}Eː͂'xV$\(WTV/'4EI7Kȹ&Υ:NٝggS-Q fߏh턢p0v ؈.أa!%` jd^Ywyu2)3}[/3c+c6§[kڧ?u5R-v5&r/5#/mb❷-Rm<O뼥S0-@{y׀eTF}C0(HINOO]wEA$LCXXEC5ST_S]9\I=h)2ZDRA_ƙh8slKOؓx΃ ;Sk!] un}ր2Q/PN*摱Ggv1 w j^]7ęʐ+:GLË uysj&P :+5R쮚0]S]v'o#oL:\xc`LΜ7mqvY߇zGfD_  wRW t""L;2+Y&g@9`2+H0lH^ƶSx[JD^ CANZŦ N]m%ap&.#~zM8-*`sat #4c`=;qcΞ=/7;RaR 6$ 3Hv]nU#X- Q7VrrV`Zv&oA ]w3Eq7cVq첚n u De tCogcWwPt8əVA޺g'IJ;LL𠍀smib)ao?j{קt*[:gڤ DPV †[%h?Z h}aD- YQ̘G#S!eL&P^!̚-En'\t)$ rdiZX38|TPB(*{ %9V vI :.$&C;- 3IڸShO<#2>-wE/0NQ48a9-E`OWs/f`Ɗ$Tg_i흄'|ݷҎb~O>=首V;<97.RBm2]Է)Eӽ9΢w[7It}errlǼM{{v4Z`nzԺ=A2`Bj@=Ga* 3) ś^%֭7ۼxh~Nr6< 3_GjA:^A%G/H(86l@3= 1Y'iDGlS~rrbN޴V-WhOdBo㿶:? N,O?my#ɉxi*<4d]+Smu_z&P۱}`_Rwus:%r}u>@(&%g2ZW}J )?~X̂ωç~߽o^?ʋ/WR̵Z ߍ6.VS*۬kW=:](2I$GD3 ] p~aN;l_:?~s Gwө~A }[\[[R)V 9d+bJý~%9CĿ= Ij~[*PC_bO#}sXWaFwrz88I@1{3_ e{Lp~0 Wp lkd¸xɣ 3?f KAѸk{z3\ُ9W