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 ); } } ۖ6(ZkV-)[HꮬL/嶧˗*&EB+)RK^'{^ԟ̗$D]zz)@ W2ZO/eYtܜ u8vZ]Ѯ>m?ԴϟlE#XK3itOR=sEZW^A"EԋZ׎-lzXTa_:1]%L-:% {Zq%vJZ ݛY<{_QZZ:בrh{ bǁ$?[3Z~(i;xǪ寺DQ;g?P" V7%sby`$z.O[ *?޳./DfMC+p&ߓFw /@MɵP\;Z#6 HdiΠd$^-hHc>' |6+#w1Yv(͆/Zdu7"g~J}'mz7J95ο_96/24}ʲL\__6jӮ6;%b`B3u[$mؚ-zG!fӋ/AGk "5(rUSjԈЉJT6~*0;zֶjm/@%ɕamW`M'>մ:Ϋj{ӫ%@48`b,A REF!c;Y7<8\̈́>e A?(2e@YԘqnHgIn k0Cz=` 7c[>OhNz`0iO>Y=c#]i3Y?64< ?4WSl悽gRFDHjAbw[[~p~稜e >T-2m,xИ@fH:_ X1y)Cج2ilĪmpI'Ӓ?Ś6z(pK==&V=`|a٫un v7^`Ჺ텸;~ԙGa&z#_6]3qVaʅW[!c|EA_l_WX=zӹ茉 [~n]J# Y-p+sGC)`T+Ǫ#܏Xs(3u“_Y3,Mж_O?%!h-ӏ/ΚE>> )67=G"qmWV?y= ׮y;% y4$pSx;MWQ¥iוkJt0S7lVZ7h6*kbM-㘙"(WR6m<.#wj8Ofo]*3 `&S{EIKEmOGӚ,fS0:Z0z ,9+38eD2+3T$=m6hIW4!NF̬yi:am4Pt g0E:PS[J &'şo+sߊéCw+IN,ƨİN^Z4:D8.K)8|?!y6CF%t [/V Ln-/>>0`#wdr+H ukBo6scx]FnJTOqȁ@@tIq~är8X A.ES32><5g=۷iZ6m p̎a|s7ܤzpdGz+0lV@m{417`C@9ٛ^O 7=ݲyʱD` `1 Go;Т!W=fZe>jFb@ u)X96a uh 8N@%\j os$H(@jŢ'Sy$P})ClD zDT צE ?<>jnΜvP'.*B4rA>3?Z>~*o0b$t6N./ &%QY,p[]Y Ϛht T.AI'j]h망ZV0oKnS mSKtlzaVҜ1IOpJ.r z) XS&ʼJZ))sNW} (6UGd55K&O.Ng++{xiI|԰4by!`!(ӆ8E Yկ\Μ+߇s{pa#`+~D1n մDھj8˲^@c]޶ew8ep|%3.ePN[ʁ xJЖ#' bto %8i[j M;@<;01 ϩTwJYnlӰʆݤ >6ieFtNFg%6;ƚYb.|$N jejP윧PT%U/.*zTu`Vώ]0]n[Py-)"pl0o #L 2ez;a3 5 9&)s@v!a(?k: /WvN+?zV)s]%ޝe:DA:aEK̬O }x1IWA^^C s2Et&#(-B2Zl18Ͱq2 ƪލCG\qM.G@'jJ&V9Ϭ|dK}g`+d<ϥɱ:qjL+YG'T o$978xiML1!عJ*y;U4 5kXfԋ*1b/u|#h;.Apbs >"1W9ųrg9T#6!iΰc`yD(oVcH@{k:{q}ZLzjJŸѮ1[l?Ru L۸k _G:8&S+Zi+S]=y:<&O+ZiO!ܭ@wk:x09wCo dqc`]Cjv|qre˃[ܞ6a]s#:c9#"/7"DE]csGD^$|o51|xDE]curGGD^$|o5 =||DEǻsď4q=ڝ]qizčU&G@XYiučf4G@XAipčU|"16]3kednUC6ܳ,oXHuV& J6j6.A'J)Pꊲ=h9Rw.qJ8t"xqr1R@h x&6]4 ,da<8J=hh;O)F{ҪNk(Oy~S ۔E[N҉F9b7m7[;3:-ˡ威TӺNeh`s`T&jvk:t"ee x bdç<3 St:fVƃV}DfAx`K҈4 f׍̘VS Hc)"UW\`=YGҩ8X ird3cu-iJU=rKf$86+= w^n$K8H'ڒѼV`/|03 &>ÞD'9u ׶Ds͠ c Ϊ,k R>Z!Rye\Ięޅ\8 {$kIZ=ff2co#C"0T*۷fzowÉ ;O1 )!՗wY@5r9ݟ}䑁8F`v^XFpoXID؍dJA_;b9ޟL=#ʢMfF w2t:wde='FV;?V߁XZ+I6 ꠷l5Ŵ9[AGE;ǔѸ·KDM>4?[DBJ"]_!Ʊ&+]FNN*"-Lȟ)*ʦTiUq|['8 Rן7g-렱-0^ȓ wc.!3NXw~uϟ!Gh2G05s-H*JtMM,NʰEAd.j6s*t8jWq>$(bXmfF 檃ʸ4tw>P_ ?Yiוprx*@B<?hSLObPYp5ߨlNl_T4NۘV]& ^L+nYmRzƮ[=gY'IKT#$ NtG讲0vEҫdzUutf~_^uR>nC|HK28'PfK7Yy LPJ_VP f4h42DL} ]V?F* e2Jӊ܆lΪIAG\Fhc#c$C: M&[k-L>zQUSq~wIo灹!)kT,O&UO#Ju˲ybȼr\+䒕C̦pRmpʫ<P(_Xa Qvרq~ĶV8GWrL =^ȎΘ@7Lo*u[ug*;hKL Ysw.en](vBDӋ ]P/n])f0T:NEo`KQ$ ˬϣį6gER6]G\*4 Xf#LE@H8鍚0sbKJUvzXZU<۱Hd +K,WI|>I 7EŵH;..l}ݝaX7J`7 jp8qvZS\YOBP27Bi4 QbJ/ deJv4!śr}q!VIrђ Q+'ȗe |V O«Tx~n}aN8_Bd SyR}9b09lYV<*ڂx۔u՞yLoL+;mk ̭\yŬM3p.aRqRr2S31Фٮ|AuNIٱQ텻V~ tq; oT-K:|ubGtO." PB8)<)ғz־GΚ 4ͭ8K:fǿ3s+ǽ΀D ]s׋AM==\VS,+{oA\aPC85+vڑkг mn/e{Y; x.V/4Tc /%h' ɡ'yOV~ʹeZV4: Furla̷o rNJhr=s8gmFnR_nVqC?.%RN#-T:z)̝y)<吊C,o*f~z2ne U ֭դ(IۏҲ,Wnw\e 7qL[9',Y5Օged^Qt MŘ[xzDlYb؝ߎDK-ݏ'@! TԣicMO59^vJ]ziU,&%w=L[T=Hb`)_T٢x,Kgݗ)5b 1=6?ҤohtbbkL(Sϱ)O7Aޔ@=?%n @F 3T =N6MpJ&]}Xc@CNƺ5=pnܜV@~t@J `-7 JcYs΍Aj|Ջ@005P\@@kV_M f5l>i6.ʈ̔Hڄ[ֆ@5m4-5M^My|t"uć}u`a M(Z{L,f'Îu c&>t:&@8}ǝVK v Czr 'f|&h4K$qw&rԎMutȚ8.'FV鶪-E z1*KT1po($0\f0 i=ٺUV::UcA5 _S%a>vp;?5tʀ˥M[c >:1\X2o@Ն lڠ(;i݀|CJ@G`^LJ۔%8e?ZE~]i,m|qqGN ĭ0] LUV0ΖqEMΉ'+3aVWw'uض"}Xs>T~aEZ@#!)`J U~( \,Ls“;v+-ME r!v吱0Zd|kRgԱM5DW,V,c8ҙgC<)|#n+Uv7[Yv{|~WhU SCbsXDdS"-TKh jr~'HF>oW`)4U"b  JUQt]4!4֋T][=5!oXqc-|P{ûr}hoZc~xUt!54!5|_NZ쁼yֆVa{X=j9 ^asO]hj'mnJsw[w=l[PQu=&#b TTcCF.55f1ɫ@_%c۷1̓X1%dw%6 GGS%dۏU#xP=yTu%[Ւ Þӽ@)6cq^+B^JvXdY |7{cYܫ +Sbt# {\R}b4`eWYk1ro9)Vk7^8^eтNVAWks|7+ߎ] -L+.]mF<ҕOATM핂 K+pG{.Hhؼmpȴ| Y bӪUQ2o,Sg[Lnk+#Ucˏs#OHbUuY{'Ļ*{Ȣfҡl3^G0}±;<7>~Bot01;L.DVEB^#g $mLSNk^Hzx "OŦ"J~F5+ $ௌ>~uz?5FdR!"CIMuMk@V00L_RYLvd,tsu:I_'K0^HΎ )^!)Ua;W |7Tn9fA+:q@~EYke:nO[ZP78I仍$5GE)چbm-Ak3.}g!wN}|'n[(}j$7|_C1YmQYH"I<ZcVMFQQ^A^kŘ'qvZ0yOF$CrY//P,( CwH ~R2{A #Co̾cc-o$ouS/u(au91ɔ!?snI1jQ S0k߳җL _`X@Xtp1uy`خYRVP$/ӵyB}tk*ޕލhB\Vb'ڲҚ#JSZ lr|ؾzac[RKvŹŹ. h~Hf.P>Pr~6$o<(A];Ȯ$M/|UG-(|6]fMKk5ʡ׼'D&i =4]AN2"Z-lT 񌸧 Ձ":?I.@Obb|]/K:9wIuDC5nB 7^wV7_edwFg,堳f%N7T/Q#5~Rm܋k~{0FI1' 6PRJ"C`Bgw8hb+  AL38.Y*7Z|@Z 3ghυFA_|02z0}UXbJ݉]`H~`h5sڨd7/a4ݼc_eRWӉX_9lU`?&6{H'cvCئ|\Ϗ®+/O?uUœ]KHMUo9zŜա CMou<"Yh1MBvjDG\)+'®Y@x'wq{c^iujx sL[E9IG¶KhU@7a:U(+gi4 4 "Yi?kGV`m.Bכ{.2]a/%ZnXlwzݽ227Cj`\f!ZDHY;?%$LjZE]l ϠR.[+ ynT!O8CC ވ{<\1MO?i>5e.b!k3F%c*^i#^WuAsl+/ycⅿ/+=gko҈ ZI_O>1nH GkN!*dZyܝQH2F H@$k7/@+>Pt4%B6KcC<Hr`$$CXף,b~tz "aJYc6OOF>4d<2Z8E?: CL_/lԄ0 &yk\vJ5 /VV@'qkUA&NmcJqaW~wH%u$S: f)bɂQղ8697C 9v|5nf4 HpK@х06&I9)ʄd2r x牲b zH̶O>?Ws8ռJ* ~|OrÒ5"Y HK! }ϜՂ4qQ\დim}A#؅?LwJ.-<R5",s]s@8',lID?Av0= tRBH %z(ƛto#%zŖeB9|ʙgKzl$HMGyB0+S!^EJ/ׅgO !?"u/q0~:9L&cUa8^g]a^ !YBh\ Rk٠f7ەwl3bڱ6\nm-=g[0ZLr$j[nfH_swSZ o15<2-)j_o_೫1\Yd)PA ^cu֚nj@sBIlKzT\-CD`ZaX hY^BHuM MӺEpwshc t- 6R5cBzc]폆/tCDTgXDzF_ 'DSz=u]{Ha? B+6 銪_Fcx \}WG5C  X~#Q IVG kd'MmbF0vB,B}HU{ ,*L(jedOA)W )j*4f>C0uf1zÔ+(m >J3]R&F2s3 ŞM~ .WDn0Cכ 4˟9@=qk j*ȍQwTY[T&Ќ/Zlj(@W+gG /KMQ5ƕp|aQ4"p@w]Pv\EA9Iel$lr@&mk--trE^بA_\)=mM)C)z@2^^̙n&6Erqh\m(a&ՙpcrTf}ՠ9sݶ?Ǹ r]/M;y_SwN1d Z X6?:}RL#0B2'};+v_QsՀIk90bU:dkSrYWM/ pO#nF*Dk644|!blۘmLppT 莵Ц8j[VlU4^nClmW5+l򶸰+G݋BtyI9P9m\c#xZoccPh'G գ-TuD0z꣮ <Ճ$TP}ԵDz'WE'TP}eDz'':D&O8, `V<ocLkyOف璶l, ]?TVp\2xJӂxDHBf2vyKg-??Otc(![aBMSW`{E@,ʧ* pwwu2dNfstч :zj=K5uМ7|!:ߺ1ɤ!}6&K?d_CV *W'Is>1<# ֈ?}@h(BrJ-9+j73<#<7J,)S^d3 Q;=b E(*δ^TO'>4);i|k:;qؓ"dŸRK'ٔ\c؍FT@`p°ztEs0Tj]0+`kG`%3^ χ:h|<>}EI@^B$X,R{)$jAC -G%; DqX ڡ6NCo 2\"Gff /; yc# Wi$D1>QvtsK$m0R;%0+%? Lbc83 .IVg[ x2NA,NtK\B\_ݶ h g=P@T  CBGP¤nCG;usޔ!Qkf;'\pXhd-$ 7jxBNxY7ŗ@?5 Ey_3yrq鸁6-ŬJBQH r i,FP*N:r6hkTعN9 }K{_(% 5̤@F還Ь{gF,gBۿΰXИ94QF/ʗT>CŸw氽K 6PtAHrKuB5ĕJ^(׌K/$4ˌG.Qd3w!MipIAsP(1A yQSї7?X ˔,9ԬY/6G1y$"_!:1`=/`u?؉N Gqr5zp@Ga3He QWN5|by@;2|-6#oP++VTwV/ |{WU L7!-qF"SbSrml',Xuŏnɪ}tVw`*k>;T'lo;=yy"x@7y0/|םO~8CK 9.8̑48Ʃ$kf<O_e4"s+3oE]aګ'/q P4ul2/f!|S͂ ӺÄG0%1g쬩$[-YFGpHY-rFiS@]NPŪT$>c+C}F$o0n!M+jPK-nJ2% F[Wd.𧩼2Hϟ񧆱DS+ϗ\cf$R-t *Y9ʴ/IDĕ#dA| T8OYpiܫlC%t4+b,?~%t+8'gh[CJs[^'_Zhx&k}l٪2 ,M#c1}Ch6$`>M?UcҀ}ERF=˂^uU~_퍓/:x#jCkPǓXW{+/ܨc[ˢW@$3v0ohɤ8p$>zS<~CfO(?%kA0/8<ɒh6jӸ>ƸBA}k^ xqD Eo0R{Q>nb!_0jopbB'#( qB 0؆?Ɉ pjalh:`~6TP>1|v2h7m:M}=!9s ?ZWz\Uy1 @P.<'~Io'.0L@{8CZfHYT1];?XCKEsΏgo1 APSz-"%rٶ˅LPϝ[~F=oҁ[@;qyA0^`g63I(IjṔ-"qrC>'&jςd[pUuVAiNޭI\ɿjF g%N[>+] (F w+߱L<;;o}r &sյ.L/!&1 5@|_ cHr?/]MC<;T&m $&e|9 SmM}kkj4jp؆U:;ց{PqKl5<*T7,j[8g7b! j⽅O䕐8N'sƋπgi'ө{Ec٦4s0r 3AŔ|N(xcbO%ak` vc3.T.ã_J; d2MW=,Ȃ[* (#>Q.|d<+sx$IǰU ѫH$?ؔ-&*EA,hÌA"n,i8T!EuT$qgbyP)V:Z b0R`V]BIR 9[a઎Ǘmx"U8LяIm5eK̒ eW3yu79Uʎoa .Kض] O9V̮ؔ{2+%.u6MmEܷ쌋m4: lq HHT_Jy? 1na@\㑓SI6j#n>Lq8{wg]Oo1 AMmK4Gt,_Fʛao~gm$jaSɜ=|o-}!YNI<};/Ii0\+5eXʯh౬9~>ϸ4YH!hsQ|KmnjNKc0sGSoWvp=>sIo sӺL8=W43[J``8J:@2xp.,ϧ jsityįOtC';[P:rg =o&!Mވ%0 9)RKm B;Z0c]mr3!Utf,ڍv+ oW Pv=-sV:z@O` W&'j7sfg}^s)f"Mfhѵc]R&-<L\)U7IWx ckp v#ӓ&@A^Hن[_AāE[Ӗ[1Nz Sez6B/V&VC(*`BK(¿g *>g \O[$BD+0)eZ[[ʨ$1NL0FpT425$w n0?-Wr '9e[ DE[Sn)FBn-(r k_|gKqZ4~`3Ό$ ʂWw +33MRI#~u"<( Vw7%eHH 'aX^Xەonr;ShSnƅa0 l[tQ* c&a.6L͐9K OY?hKWXv\ÔdjZE ׭$Q­$b^q02G=jD "p'"{/.C 70k51Cj# aU ~gtWcoD (HN|fD{E<*HFu#Y^GVYD ]c (V7bKsYoP(/]DfWm9WfξȺtĩS5N}KfT ]1Y?pՙmbⓕ V7Iy' g'oWJ|ϩp%^e䠛*F7SmEol, gS8y>أJI .-,KJkHO\M"|tSs =-(/74̱ޕ{)*| 0kdc'egWWگԬʯ/' .ڏ{x)|oa|+a^0w)o}j$x1ǛY~yy;Iˏtۼ6El g"g9`14&33x)zlSlvSo濗sg:+Rf׿`ȸ> j< /s16 + pgW N"@/GRF׉Val Y_o xPir|hdRul>!"!ۻNBKm>vٹ4#UHَkau4eCSڢ%X_eBA]A/`#kYP08f9 ˏAyv$/ŰWg u2ڛGeשbx뱡33LnRK7Ђc^|^}UzTĎEl,З*G )bK8*_,hˠ/@t_rcmͤ$] J̖iYt ;4s[(;s)8,]?0A~EW*_ED>[Cpo3v#P??ǣCFxxK>c0PGo#JF_bE=u"cЧT1? Ƒ 1BGGaG= y IRI wCJ"}2@=#=2iqҌfNx,"Rl •r }tB#Mvk\k!&3jΟV K\tV(F̴.,G7 ))y:aP"TNɌ9J`NNIo}sJ9S>% w;5lvJ1b\6N=Gojmx? gl9ڕ<4x Tdye:u߰Sv`0kV]9&y6TAE Ovӏ/jڀ-xigQtW"{KAx.FFoplx#it!fέ鯯;<vErއ(k-4:R&""XQۿ(CAl| 1|[PY DNrCAOhɬϓƁq7kcok"o@ޅD6g6?O_>ϳ) |?a+ԈGܑD 3Xt->D3mIl% uVz`Zvc yRFx;m3,[Oʶ]/?W01 |[]<Pt8OAGzPWgLdt@giV´U>~D02S:Q?ŚFfڤʚ_Pg6ѓJϽ5-{x@UQZ棠5GA{8΂G@ cu!kssQ눧P-rR >CqOc(/n'l\;WQ}֫+$r:FagЕQ65d.Z5v { E^ .$d>k!##fd9$I@./#eNz*նreZN9PÐ9ʷcu?~Z:!aV|eGA߉y/N]AHOGuAoO*}NՋ5}) .?zqH:ٯk"+9^&Q9(G2:yW̆Sag"sx4ilI47ؾTʿ9;0RIn?Xx|{xHN׾*jGjE'ZGwӃa+_j\z9\kFgHOς=oP؀n Zg81IFqH 'ȶ9=;;3^3٫#;+;OA韸4"L;5i GgC<>jQ%z (=xjcnEiK>7qtm֣GQH1"@g-00W`RXN~aNgC |Y ~>童_0>iZGhig--jOZ\[6J6ӭ -nu1Gj_/ro @O|?~ ׭Ykz|t¸&*Y2 eFh^(;`ʼNZçT/kXz0Uó{A%.B !aLO";K=ɬ[ ,nBhۡ[^bH|ay&A|2cM4%ԪliO%uNYBk*xWj G?~VA2EoY֓'s5_2K{~-߰݉%%YK_^o|;Zn\OK^CbιsRѼݹ`p%qUas;I8{9A{a'Pvԛ:? ;qjh8,jNHY?̕p$D6ت1f aNVF?b>?36U? N"{{7HߠNR6tN껻cC4~}t2ZO'?@~ܹi=~W~d PT%/FLsgk/f{J u?avv݋;nū3r!6W 4,@vA\ ??`$z! /9|pÓ/EN 1"gs  3`/ipxx;L8TDLɴ?,(!G