From 6c18bcf748d796518c685cdfce8cefabcbc48e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= <76261501+zecakeh@users.noreply.github.com> Date: Fri, 17 May 2024 16:48:59 +0200 Subject: [PATCH] sdk: Improvements around `generate_image_thumbnail` (#3415) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * sdk: Return a Thumbnail from generate_image_thumbnail We have already all the data for it. Also fixes an error where the thumbnail format was assumed to always be JPEG. * sdk: Allow to select the format of the generated thumbnail Sending an attachment could often fail if the image crate cannot encode the thumbnail to the same format as the original. This allows to select a known supported format to always be able to generate a thumbnail. * sdk: Do not return error of thumbnail generation for SendAttachment Since the thumbnail is optional, failing to generate it should not stop us from sending the attachment. * Apply code review fixes * sdk: Split attachment tests in separate file * sdk: Add integration tests for generating thumbnails * Revert wiremock debug log level --------- Signed-off-by: Kévin Commaille --- .github/workflows/ci.yml | 1 + .github/workflows/coverage.yml | 2 +- crates/matrix-sdk/CHANGELOG.md | 4 + crates/matrix-sdk/src/attachment.rs | 132 +++-- crates/matrix-sdk/src/error.rs | 4 + crates/matrix-sdk/src/room/futures.rs | 32 +- .../room/attachment/matrix-rusty.jpg | Bin 0 -> 153924 bytes .../tests/integration/room/attachment/mod.rs | 521 ++++++++++++++++++ .../tests/integration/room/joined.rs | 286 +--------- .../matrix-sdk/tests/integration/room/mod.rs | 1 + xtask/src/ci.rs | 2 + 11 files changed, 624 insertions(+), 361 deletions(-) create mode 100644 crates/matrix-sdk/tests/integration/room/attachment/matrix-rusty.jpg create mode 100644 crates/matrix-sdk/tests/integration/room/attachment/mod.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 165ce75bdab..b0771bcd2e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,6 +41,7 @@ jobs: - markdown - socks - sso-login + - image-proc steps: - name: Checkout diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index ccc9d6cf5c3..17149f1af42 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -102,7 +102,7 @@ jobs: run: | rustup run stable cargo tarpaulin \ --skip-clean --profile cov --out xml \ - --features experimental-widgets,testing + --features experimental-widgets,testing,image-proc env: CARGO_PROFILE_COV_INHERITS: 'dev' CARGO_PROFILE_COV_DEBUG: 1 diff --git a/crates/matrix-sdk/CHANGELOG.md b/crates/matrix-sdk/CHANGELOG.md index 16e8f112e6d..40bdad98b97 100644 --- a/crates/matrix-sdk/CHANGELOG.md +++ b/crates/matrix-sdk/CHANGELOG.md @@ -11,6 +11,10 @@ Breaking changes: `Media::get_file`/`Media::remove_file`/`Media::get_thumbnail`/`Media::remove_thumbnail` - A custom sliding sync proxy set with `ClientBuilder::sliding_sync_proxy` now takes precedence over a discovered proxy. - `Client::get_profile` was moved to `Account` and renamed to `Account::fetch_user_profile_of`. `Account::get_profile` was renamed to `Account::fetch_user_profile`. +- `generate_image_thumbnail` now returns a `Thumbnail`. +- It is now possible to select the format of a generated thumbnail. + - `generate_image_thumbnail` takes a `ThumbnailFormat`. + - `AttachmentConfig::generate_thumbnail` takes a `ThumbnailFormat`. Additions: diff --git a/crates/matrix-sdk/src/attachment.rs b/crates/matrix-sdk/src/attachment.rs index f1f9349783b..4afbf1b6c97 100644 --- a/crates/matrix-sdk/src/attachment.rs +++ b/crates/matrix-sdk/src/attachment.rs @@ -20,6 +20,8 @@ use std::time::Duration; #[cfg(feature = "image-proc")] use image::GenericImageView; +#[cfg(feature = "image-proc")] +pub use image::ImageFormat; use ruma::{ assign, events::{ @@ -188,7 +190,7 @@ pub struct Thumbnail { } /// Configuration for sending an attachment. -#[derive(Debug)] +#[derive(Debug, Default)] pub struct AttachmentConfig { pub(crate) txn_id: Option, pub(crate) info: Option, @@ -200,6 +202,8 @@ pub struct AttachmentConfig { pub(crate) generate_thumbnail: bool, #[cfg(feature = "image-proc")] pub(crate) thumbnail_size: Option<(u32, u32)>, + #[cfg(feature = "image-proc")] + pub(crate) thumbnail_format: ThumbnailFormat, } impl AttachmentConfig { @@ -207,18 +211,7 @@ impl AttachmentConfig { /// /// To provide a thumbnail use [`AttachmentConfig::with_thumbnail()`]. pub fn new() -> Self { - Self { - txn_id: Default::default(), - info: Default::default(), - thumbnail: None, - caption: None, - formatted_caption: None, - mentions: Default::default(), - #[cfg(feature = "image-proc")] - generate_thumbnail: Default::default(), - #[cfg(feature = "image-proc")] - thumbnail_size: Default::default(), - } + Self::default() } /// Generate the thumbnail to send for this media. @@ -229,15 +222,21 @@ impl AttachmentConfig { /// more information, see the [image](https://github.com/image-rs/image) /// crate. /// + /// If generating the thumbnail failed, the error will be logged and sending + /// the attachment will proceed without a thumbnail. + /// /// # Arguments /// /// * `size` - The size of the thumbnail in pixels as a `(width, height)` /// tuple. If set to `None`, defaults to `(800, 600)`. + /// + /// * `format` - The image format to use to encode the thumbnail. #[cfg(feature = "image-proc")] #[must_use] - pub fn generate_thumbnail(mut self, size: Option<(u32, u32)>) -> Self { + pub fn generate_thumbnail(mut self, size: Option<(u32, u32)>, format: ThumbnailFormat) -> Self { self.generate_thumbnail = true; self.thumbnail_size = size; + self.thumbnail_format = format; self } @@ -252,18 +251,7 @@ impl AttachmentConfig { /// [`AttachmentConfig::new()`] and /// [`AttachmentConfig::generate_thumbnail()`]. pub fn with_thumbnail(thumbnail: Thumbnail) -> Self { - Self { - txn_id: Default::default(), - info: Default::default(), - thumbnail: Some(thumbnail), - caption: None, - formatted_caption: None, - mentions: Default::default(), - #[cfg(feature = "image-proc")] - generate_thumbnail: Default::default(), - #[cfg(feature = "image-proc")] - thumbnail_size: Default::default(), - } + Self { thumbnail: Some(thumbnail), ..Default::default() } } /// Set the transaction ID to send. @@ -322,12 +310,6 @@ impl AttachmentConfig { } } -impl Default for AttachmentConfig { - fn default() -> Self { - Self::new() - } -} - /// Generate a thumbnail for an image. /// /// This is a convenience method that uses the @@ -335,13 +317,15 @@ impl Default for AttachmentConfig { /// /// # Arguments /// * `content_type` - The type of the media, this will be used as the -/// content-type header. +/// content-type header. /// /// * `reader` - A `Reader` that will be used to fetch the raw bytes of the -/// media. +/// media. /// /// * `size` - The size of the thumbnail in pixels as a `(width, height)` tuple. -/// If set to `None`, defaults to `(800, 600)`. +/// If set to `None`, defaults to `(800, 600)`. +/// +/// * `format` - The image format to use to encode the thumbnail. /// /// # Examples /// @@ -349,7 +333,7 @@ impl Default for AttachmentConfig { /// use std::{io::Cursor, path::PathBuf}; /// /// use matrix_sdk::attachment::{ -/// generate_image_thumbnail, AttachmentConfig, Thumbnail, +/// generate_image_thumbnail, AttachmentConfig, Thumbnail, ThumbnailFormat, /// }; /// use mime; /// # use matrix_sdk::{Client, ruma::room_id }; @@ -363,13 +347,13 @@ impl Default for AttachmentConfig { /// let image = tokio::fs::read(path).await?; /// /// let cursor = Cursor::new(&image); -/// let (thumbnail_data, thumbnail_info) = -/// generate_image_thumbnail(&mime::IMAGE_JPEG, cursor, None)?; -/// let config = AttachmentConfig::with_thumbnail(Thumbnail { -/// data: thumbnail_data, -/// content_type: mime::IMAGE_JPEG, -/// info: Some(thumbnail_info), -/// }); +/// let thumbnail = generate_image_thumbnail( +/// &mime::IMAGE_JPEG, +/// cursor, +/// None, +/// ThumbnailFormat::Original, +/// )?; +/// let config = AttachmentConfig::with_thumbnail(thumbnail); /// /// if let Some(room) = client.get_room(&room_id) { /// room.send_attachment( @@ -387,13 +371,13 @@ pub fn generate_image_thumbnail( content_type: &mime::Mime, reader: R, size: Option<(u32, u32)>, -) -> Result<(Vec, BaseThumbnailInfo), ImageError> { - let image_format = image::ImageFormat::from_mime_type(content_type); - if image_format.is_none() { - return Err(ImageError::FormatNotSupported); - } + format: ThumbnailFormat, +) -> Result { + use std::str::FromStr; - let image_format = image_format.unwrap(); + let Some(image_format) = ImageFormat::from_mime_type(content_type) else { + return Err(ImageError::FormatNotSupported); + }; let image = image::load(reader, image_format)?; let (original_width, original_height) = image.dimensions(); @@ -409,16 +393,48 @@ pub fn generate_image_thumbnail( let thumbnail = image.thumbnail(width, height); let (thumbnail_width, thumbnail_height) = thumbnail.dimensions(); + let thumbnail_format = match format { + ThumbnailFormat::Always(format) => format, + ThumbnailFormat::Fallback(format) if !image_format.writing_enabled() => format, + ThumbnailFormat::Fallback(_) | ThumbnailFormat::Original => image_format, + }; + let mut data: Vec = vec![]; - thumbnail.write_to(&mut Cursor::new(&mut data), image_format)?; + thumbnail.write_to(&mut Cursor::new(&mut data), thumbnail_format)?; let data_size = data.len() as u32; - Ok(( - data, - BaseThumbnailInfo { - width: Some(thumbnail_width.into()), - height: Some(thumbnail_height.into()), - size: Some(data_size.into()), - }, - )) + let content_type = mime::Mime::from_str(thumbnail_format.to_mime_type())?; + + let info = BaseThumbnailInfo { + width: Some(thumbnail_width.into()), + height: Some(thumbnail_height.into()), + size: Some(data_size.into()), + }; + + Ok(Thumbnail { data, content_type, info: Some(info) }) +} + +/// The format to use for encoding the thumbnail. +#[cfg(feature = "image-proc")] +#[derive(Debug, Default, Clone, Copy)] +pub enum ThumbnailFormat { + /// Always use this format. + /// + /// Will always return an error if this format is not writable by the + /// `image` crate. + Always(ImageFormat), + /// Try to use the same format as the original image, and fallback to this + /// one if the original format is not writable. + /// + /// Will return an error if both the original format and this format are not + /// writable by the `image` crate. + Fallback(ImageFormat), + /// Only try to use the format of the original image. + /// + /// Will return an error if the original format is not writable by the + /// `image` crate. + /// + /// This is the default. + #[default] + Original, } diff --git a/crates/matrix-sdk/src/error.rs b/crates/matrix-sdk/src/error.rs index f74e30b806b..0b74ff4737b 100644 --- a/crates/matrix-sdk/src/error.rs +++ b/crates/matrix-sdk/src/error.rs @@ -404,6 +404,10 @@ pub enum ImageError { #[error(transparent)] Proc(#[from] image::ImageError), + /// Error parsing the mimetype of the image. + #[error(transparent)] + Mime(#[from] mime::FromStrError), + /// The image format is not supported. #[error("the image format is not supported")] FormatNotSupported, diff --git a/crates/matrix-sdk/src/room/futures.rs b/crates/matrix-sdk/src/room/futures.rs index aed304f95eb..c68e441a852 100644 --- a/crates/matrix-sdk/src/room/futures.rs +++ b/crates/matrix-sdk/src/room/futures.rs @@ -35,15 +35,12 @@ use ruma::{ use tracing::{debug, info, Instrument, Span}; use super::Room; +#[cfg(feature = "image-proc")] +use crate::{attachment::generate_image_thumbnail, error::ImageError}; use crate::{ attachment::AttachmentConfig, utils::IntoRawMessageLikeEventContent, Result, TransmissionProgress, }; -#[cfg(feature = "image-proc")] -use crate::{ - attachment::{generate_image_thumbnail, Thumbnail}, - error::ImageError, -}; /// Future returned by [`Room::send`]. #[allow(missing_debug_implementations)] @@ -275,8 +272,6 @@ impl<'a> IntoFuture for SendAttachment<'a> { #[cfg(not(feature = "image-proc"))] let thumbnail = None; - #[cfg(feature = "image-proc")] - let data_slot; #[cfg(feature = "image-proc")] let (data, thumbnail) = if config.generate_thumbnail { let content_type = content_type.clone(); @@ -285,6 +280,7 @@ impl<'a> IntoFuture for SendAttachment<'a> { &content_type, Cursor::new(&data), config.thumbnail_size, + config.thumbnail_format, ); (data, res) }; @@ -298,19 +294,15 @@ impl<'a> IntoFuture for SendAttachment<'a> { let (data, res) = make_thumbnail(data); let thumbnail = match res { - Ok((thumbnail_data, thumbnail_info)) => { - data_slot = thumbnail_data; - Some(Thumbnail { - data: data_slot, - content_type: mime::IMAGE_JPEG, - info: Some(thumbnail_info), - }) + Ok(thumbnail) => Some(thumbnail), + Err(error) => { + if matches!(error, ImageError::ThumbnailBiggerThanOriginal) { + debug!("Not generating thumbnail: {error}"); + } else { + tracing::warn!("Failed to generate thumbnail: {error}"); + } + None } - Err( - ImageError::ThumbnailBiggerThanOriginal - | ImageError::FormatNotSupported, - ) => None, - Err(error) => return Err(error.into()), }; (data, thumbnail) @@ -329,6 +321,8 @@ impl<'a> IntoFuture for SendAttachment<'a> { generate_thumbnail: false, #[cfg(feature = "image-proc")] thumbnail_size: None, + #[cfg(feature = "image-proc")] + thumbnail_format: Default::default(), }; room.prepare_and_send_attachment( diff --git a/crates/matrix-sdk/tests/integration/room/attachment/matrix-rusty.jpg b/crates/matrix-sdk/tests/integration/room/attachment/matrix-rusty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e004351249ecec34cddaa8d4b1efaf9fd7b13044 GIT binary patch literal 153924 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 xF>tb$WaZp)KDYZ26PM|C6=TbQ20 zA=2)8`NL10m{OKb_wlhk)FWyOE_rKNe_<)p&Y0|?@QMm|+3)+LEzQR;8^lN1rstQ! z>bF{6^`U+9FO8~)s~d;T&pV29^JqiO{t1Su7@RA*W9+60+XJ`(;)KC(-RC;?&(d=eSJrS zt!42II!>jdeipT2SZ%ZLD^||QS85=CIwN}$Mx{b)I>aHx3ud8fiw}Wvt|fWyXF+x5 z*zqyQ$xpMeXJdq9RRo8H6V8Wu68Uat3xgBL$N=AtPp>MAs0GCLXQPsKyvRRJ7}gF~ zr>6KB!2?im^NFc~oHy3SobWvLUzhN&MQ(+Eq8C&79Ww>fDcIQyD4QX;_*3OL2NR0{-QHJ%u$3;% zJ;%%0j03jBqO;;4r`N7JH#{pO3*Bc5{gMiSAC$JOsV<4LeifC%L}Qc0t2RmE#8Yvg zkX;b(`j3x(F1Q{N&nbJII9oHE;%eUoR?3Z)c7RLtQH%l_^0RcY9`s%pCUQnL)vIzl zs)4`8+@R61m*sgtD)v8laj|Z=DMRdh&^_Sf*D*RE4lAyZW0jc#J5LsyeOLFmT@wd^ znM`mKE?_@HS?{qa#Gx+*KzOJtbMa=D?0(+Itiq>ak1ZV!LbG0+LcdLrgJ&mSt6z}t z^|e`Bf-VgnJB_5HpKT962om74CAqj&#A&?q0G#|;p!B&7CyXheV|BM`hywm*LMUNK z6}WF? zS+uGAHX+@`>jk38pV+ntVr8SCsE8m}lUev*r48IY%CJ+2Cx`~wz6kR5YpP&THGHhN zWScBzWi3?A;cLEQvK1-k=_*p7qq{g&j~My(?U}l4r+FCr;;KrX`OKPwGm;dc<<7j6 zMLY)mn8pBVsTo zY$L7HpF{Q3C@zKQ|Zl7!#AMq>&L zR*7k%$KED@U;IwgiUuDzy7*(` zqtw~RGyW--fi1%2W3PjT(BMd#{o`MBH<3rUU1Q;biLJXD=F3f+$YeixRooNjX;iWB zu<9@07cJy$`}T~^$kmng)%e?OS6*yN#ZsNr8vkGCKvJhfTOlmFuFs7@xSo@6yW3f+U_2%;9GGumj)Q5_>LF!;b@hL&M}Opc8wS zRheq3x>BpJ31dcY4#Cgg2jB)XQd3_qmmYs>rPFle?Ikg*Vh~6##z}-fO(&^{h zU^7i9NHxkDy1XvR`C>pc*mz`J?Us2jK%nHWAJ-%*BV;rndRW&&^$pMVu7hrC&ju8dl#xrf zeg`#D?zV^1}&hZEilzmHBtFY&$;i z?%GEULAMTjPO%wB|KXZO(eT5WbPZGz_(3w3x1+E0*ckcw(`GR#iI&CYG;nJ?xXsyi zs|t7D>!|B<>AyX+Hcbc%SR-(}9VS^}lo1KrA}vEjQn=1(UgCNJ%z z?9S@vGKnu$(3nnkWR;KU#A<}U0o4p$s{&B&;jk*^nV8Lcd;ibdcSVMWY(WK@sr7S;vK&;9Mzt z5BXSEV1Wj$&bK1LakW*+_{8>E4%$9~VAAY1Yk_`DT_hS^T=P} zi*%nF8_a7Q80?I8)7pU3Y{~4`lNNB-l&&4$EQ3+Uae)%9OQO&WFrR}(Yqa1ZN=Si6 zHyu3PSnpqJ=xPVT5Te%hEk2`GqPlCdEIXFMun^Te|f)yx{_^*oO? zx_ReG?Pun>Z(IZ}JP^fA!aoOnC6EVz%!+>PvHOB(r`lU^bzQ)6TYOwr|KyXvnbvpv zJJ7}{P8#x{q3U^bR@Ghg*!26zlN)5ui`v)s0YM@e|dxaL1l@B>_zxVAn1g%V!ZqdoN5_!%7@Qi=d?a zOObK4i`9Z86`NS^Mi#wp<2{ z%k3$5?vqN+FRLKLpi=b9pO(Vq_kJmSorMapf0^xh z+u8t~t-RBS{4?;CZrKULSOR=5_KZ1%^coqUC9YF@V>|UDsaNO3k;;{n@EFp38lpAc zYF_Ub^E_=r%kRIqwjp1>*$yN$VmjeJq+S5GrlOnq3bVs&N>3vn36S$BH$ByDs~(cG z{C%3{?8$apGc$LGd9@Y54NVxWfz1ny&@w8x%c1$`7RRMyCNJ;CeZ5z5uQBvOgWJ7? z+MmK!teK9ffmL<~$b=I4UVay!q89_@mAajIZo9nwtsp{9#>yAG8n56YL+v6`@Re%M zN6)x<{|ioQPIHmzc@PHNFt#p%duaU2SM)N!(M}47=hr@l6K%RLY&l@d{oVkSZ*$AO z#Mfinix|D$Z%?sg$*zMo@& zL^xa$BW)w6*3HCdVzy}7XHzlfZ^C)-@&KIddEd}gVCYBjG0TcWC*9&mHO;V3&BFCt zcB`pJb;{+Xs3`T1?SDOb%T69jpaITFNyg&^sLf-~=aS{#7dGldWOF*Nez{Shx>w>t zbf9rMd6_z6w; za6a;GZr38;mJvhr-nhE9`^H(!4+kJc)ur6g!s#EZOl@1mNS z>^>hIHHI5YNq*=4(=)~*jFPc6{D9=YZnG_1qODiX%_J8A=;r!-LVlVA)!CBSGNuaW z(OZ2;C9{IxZMOKDQP(KHO<8iKFV&x{I!8HxE zvtYvsyOuMh50)CJC@<$8Xk+vx^W#43x&rF(Fzim1<9wWPPyrkLz1$#Uo-k9DzqeZc z&q{lEcp@Fv5?1`)8cMHiYI7*z;koI zynn)bKb&tF$rvYlpR?DRbNyy)N#LmILUGynnUqD{y9Ydb&){s6fVA&i6_gK?qE5k; zM~1#UlKZt9?k(U+Ud%T*QraHg!m-kQW_mWjt9xCKIL(2|bOue6YyR_BgZud+Rdx6y zVyLuE3H@EoTUOnfjAjBlbz?DE9jdINb zt|)b5SnEWp0u2hZF`c!4cbD+g@dOfIEx(us>_YccD0k1C(-tATy17b%;>N0y*W#1* zuimquSEZ7iAD#qelf^e*K4);(P-BEp1#3t1(fI6Dxnk>){E+zQJ~UZn`1k`0Dag^4 z)6s=gnIvPt2Kz`+aEEqJCuSeF{OS84yM)9R6Gkancq8%p{oHS7duU)b4L#2qPC`)1 zFBYhI6K7&cX&Oli9Y;XK#+v@)uH7FWDpn=I=Q1G9dM(v;M!_msbAu}yaV)zqeqzS~ zVmvxIQJ$#lHJ^H(W(Ena)eW?K{$Q{#ZeTD(iiY3(RW%=$iuBn3=Rh7vA1BY=bB_MR zewj0SLzkm1T-@zbB(0>~{6Vywij!nsf-%s_vr_Vz zq;-vmo~NfEvA{-#yx!NR7rpzj7fbkEYx;PQ4YDuelz}`9#6>E3ySOCWpU_KTwXo6qJr}cEtN<6xyidb-d7}E;`T-J%R_kehgr{mBkxl zi!5!Be(&w8ePJ;FA0TD7-YmQCd<7$$-#$K_&JKLi{Ht625LKJh*zH__I`3sY`jpRwS|UA({G zn}Y-zT>X;ywG~At^KVS!RjpW6R>)AwY3Czb4+g_upPsM!Jq-A|H=W$v4DNahd}@p} zVdj^iwC3t|oJ+c~=xjnnF1_<6Fe!H7_&qwG3?v&4QQrGF)4yYRt_x0jS4EY*m-aZt zT2h>vwvO&h^%wPaC|0UkqvKc!-jBAw9u8;tau0X1l0Ub0eJ#qyd<{;_?|}$Rw;Y&% zs|_NA95L9_&k+n>TBW6{z?ME{rp-zx_>NQ>hxTleW7mJ4ElqKaYgO*s7u^lC@f!4c z#o^6$wsBD2;EYwF`0zgGY@rNdX4YT6rna5O`f}~Uw#DTiE>J%#b!A=tm$;y0TJ*m$ zfb@R=o`13&ewuDk7t>B&)~stPV+*(Vs^~|1aq8O|4Pfpq`yLIemjuNSLwcQ#WqC=SsauR;BdL9WZhfd{h=0 z>TG6m!-`lh`)b?RiV*8JvsyiE4tS?xe6E(C9jQz}@l@R^@eZP?M0~pPMBXHc`VU~A z^Ng+cIr$4_K5=$PUYHXEzENPeP$9Iu8C_nDQ@Kh(N<`bmLKN=9GYH@{P_=! z|La}f1(b=OdA@X$#(Yq6d?w-6B{fKR5_T65@(s)5#hDT%HM8*zBbCL8z+?wu1Q}rJ z@1gOKpYqfhba?%WwJUd3Qw=q|b1{CXaM2VzoyXVh08M0WP%0}jLw#(V39^IVUnsV; zE?#kunXU+I36***N-48-!cy=Q}9Y{**%85Nchc z?%;Z4G&{U0UCM=Eu{UgOjotl*9Ia0IGp{`}U23 zDmHHS1w&On+`>E6njBR4pDrAvh2C6^>lYc2K0La%usH5OQ)WZ1xeBsE&cd!*9FZ(4kW11fDnq(Ms!fVcIJ~O|H4atj; zjNn%QMBqUupv)+)MLC;I22;QHcbOZ63+l{-P87dPC8W9rd41efS3nz&G}nTyoAKSx zrNt1xdvapFqIB(U@+JS_sItBI-26Rw^rtgpZCT+zPc-v`1V@Mfs3&25(DHr1sXp&5 zRP}KFi#?K}N0ze*4jRx9)0?|eskKUFuAc;YRHPC;&ZQ(Ez(1_rcRFKWc7x|%yEu`) zm529Vd=~HfP3l)-8*kPLtL1S+rjsLNyaxSg2B&e6Y13nxim`+`q_t+-n0#qU=@{u5wL)Dc`+zlN8YcaH`_W-BIT|&) z0o5MkuX}>0U%sZ?3ZKKcC@3qRv~4ina00nF@k?^IWvn`l7`e~^YW-QRP&|d=v;92M zRoN%^P+ezD>RK+*`#C2KCD9Ixz8Qo1MfK}h-CyvoRuMT7a?<)chkXargH|BLqR3wo$CFh40cqw=9ZyxC&iqHF1EHrOVIrr+29!Md)sb*VBf%C^8Xt>ek=Ijws3X^HraFk)c7- zUxVH-;U5)J^-tN(OmDZ``FVGPhtb3zAo@{5gQ9#G{);TSiAhsz_Jkut#(0%+e`GiC z!k!-Fg9n2`2LjE8C(ubS*Na78pU7QY{fy#y61hBzc69>Pv-O$dIW`tNkDw?lLn7m}^Ti?lG>tgYusaC6?@eGea<~}c%=1)h(N{^?EJ>Url177Bwh7h6D=ekHyDu1NSiX~`r%w{HkiT>sBWD+_V`3PEQ z^&F_f4F@}D!*Ly{ZWUcB<$gjj{8ry1OSaZ&1_LR<`)vRu6&rmRUOfD8 z?~uA-73rf@A%3P@;%^iOgle=it9~7_PZBh<+_&J!`w5nZYHDxcbVx}yBLEm z;%#aN@o#@dX#b1rV&Zej&3aZCGF4VK)0}J6agn7${sEC;YE>09!~0A{29p@HQ2faV zFt#VN7-`5b_)$o*R)k}c-OKPEtEGkWi!`|E__RQ+za4IK%Rf%kKXE)ozqZjgR)&s6*OjD$CkYXGVtD8q_4jor3B^vmP7sHKm@s9b87e6{oi6 zl8g_N2l@MdwlL-MME35Dd4vfKx}3CWPhQ7}Uj0(Gp=QCjYd`1|G!ZcvrJF9Vpx-qa z?!3oH2-nv&ZvLH86sMR5WGoY}bR~EvGPV9krhR1ip+Co&zpCn`Gq@FKRc%MqGs>Ay zytMp_A0%;GoMJl3`g<8~N*;i25=dC$uNqyh)P@0>1iiFX3TY9yF&1jIdf#;2l(Yh= zbbs*?dMy-CzJ0TnWZYiqF0{yaB$D*{68Pxo?`$FEq$9C3;!DoVc*IY`NMI*ZxzigV zBc*H1f_K1p*f^?VLZ_?H7(L2zUA~N8G0c%f^+Wfd_wZ1IENuP4Gq_4txA22YW1!Uu zj^lKO9zX)?^UoxFr5)V4`TQb=2DGUmBbq!QyTt>0R2)FKU-`Z!)gv+?GJ$@jJt2%v zo+aV(bNw>yN9aCDOdHqGqwcK3NNB4vhF_`T z0rXv7@JoK$3VwZ5t#l_FH+wWZdkW0qpI&cw1J_Tr{hGZDRPtLc zR1UPR=W2f{=NJE={pd0dWlE z??3DnFbWM3k#k>&U-r;UD!{kM7Y%I${%lcL((}BY5-*d&96i-iWm!@3D|aRb zlz{z)B=x0^j{^xD%G$D7;$C#_rbJYR&!q<7U;GD1vS^|S>$ZauYgG8<8b`T)2&`%R zZAWfq#^g?hu|+P6=mYO}Gle=Nt)>lcHX0Oq+uwTnh4v+^TK{z}d10muk{BY4S=tV+ z)ba93+Wa%-wI{pzSot4dt2~4m&MpR_Lw@>;jJII3KIYp0)g&F+&@my?Wv}huIux(2v4d&!ZRhIL+v8sR@g?mg7sqfTn@nf z#nKiK{1i!bD2Ek7bu#>e>kL{Uav*xVuR?|9W=9C6 z9a>Zu)Y^`3@7ur0i&?65r9c6e3 z?|GQtut7H{+wFEA2O>57V1Z;k5T<10VmAG3^bF-ColYyl+j6{PY(sH2i z)q!}{H8h)*;!y0*^v$Q#h@-6o*P#PU%tNGAm$oJBw5|B;dT|jhXH}7Bkb#@}-8sEB zV@2i_)Z4XL`t73rLI)9)=cv@-MXSz#fUbly89YN7AGl(GXgs1w6%m6{Y1H<|zS@1B zd$I%;UhStwgO2G=ysn`pi_#P&$XF#e7X$wkLbUiBz$S>=%$ERc_Z{G}9 zF*m+)tR0gQ0DNvK`&y-OQ4!dkn8Zs3`GnA$tDFh>`vyGr$Y2m!xUY?*KJSyIo4W=P zyLR_$%#L)|*{!JCz7>6cFPb`x>}4J_qv99LvywC{}* z8L@**$?vP+zn8e-E+_?fRILa>F5We6N7|^5s#tK2;4&>{i)Q-k?s#d{9T07QXvs>b z{r9}cy5+Y;q|acb^1Bb-(2^^Q=zE{EGIjg0MUN3YKKIpJh|J3jIl?cUqUgjt(m$*3 zxbv;TvU-z6PY1xN(^l?*ksp<@4R{1}{xT&XGoMRLRUf|83$QQ|aoteP_Z!|mjRAkr z6)h}LKXAVItl0Vz9OH#8KGMT-U5(Z`MXR>Z@ZV!Mtel$qbzvnHcA>i$-vC5wr{)sV z0k^wA4$DV#xIsZrVCTkJZS8lUmMuFLxc8(}DO%ER*X?p*GJq_(V zH->+?XtQ&88$#|>2uA1a#-LDaeq!|c69w(M&$)D75_F*>-zH73W7aB8xTVn$!<1`+ zI6%x*V593Bf;!W7CyC5ldB?A`xh+*+bywXCiVu6?sjvmklJPRN8-Cfv9E3Y#=^|=3 z*P&d&#wgYAQI~3xY5h>IX7O5@(RkkU{LAL_pT{JEf=~4cRFWdBJ9ECq zRjXz}6QFN$q}5$mesZG_k@*hYDqfR+IWq0cf^V0eedPCQ6!<5>1@MK+KYs7F`zT9} zG}o{gh&+`QS=glsNbe1vWK!it&p)!aR54o`bvJaMY*sA$h0AiH)U=YGe>{mFm0ZGwzz>k)4{OiL_%_C z0PnZ6{G3sj!IH z(-?&9#u-dn%BaLnX4<23AA*BqRa?|t8=dA;9RTB8%lmEE4}-cg&S@+KM3&p~Bdd+VcMw7o9mbyg3PGhI9FTv2onYTD1f8W@qZ+1-lMk zdqEIsASqFZ0}36X5aEiFM;gM|cBaE5OXeRFqShPL#|JKJM!9Z3jYeev-7z?Znf*}n z_mPU$I^TJMR5sEB8aXD_H2Fpg5>ru{$lfgzf9Ec?AT|VfaDJR9+H9a^rAM^N`ztd1 z5~p|7SPoq?IPgUanVGB{8JEwV<^6V@x3Z_^SCR7FD&J*7o-cHNs+tVpM(fvvvcgLJ zL*{sYuPeq*Xi`mL&(gi}p3jnFKzgf2D!yxf|Gx0=L0XJ&X62ON=r($G0x|oafUawBMGK~1*Epbp;poV0)DSnLZ zz{fY~ z978x~PdAC^jW^l9MS>N$RdJ6uk}OB>oc)i5Agriy3xnWDYthVC>g;0Lqx4|W5t8fT zd1;LwNL%v*gZb(&|C$fPXkOCxoT-W+c0zjvP+}z$!ygd;0pee~*z6lE?0NP}36TK3rc`BHen8CdH@Xem2Z{18H6qP}qbFkS)!6zG8yuY@*c+7oV zDWD1EA6!S0hOpo=s2MVio^CFG4*c4EIA;&~*yV@6O6E^d-adsQ9Ze}~wfm3VVZ3^yNG4Ukyok^HFrY=EPX zekcD>d_^VI{Bie_n1IBypX`(@DaYsLjWnh(o@sQAVwvNE}11 zIy@=QuGw`=gHK?ya>jECw8R5sNp8kU7#|H;9$yXv5Iuv6zp_=1<3t#vY=?Ov!HO>c z7s|pXo=X0wDn=DULh{k$5HXUW)uPRy8;9fwebhWl#1V=p)T9 zGanTyLnz;il>)xLZb4Br+@!ljFw>+d&qE1iNf8VjB?nnZ@QU*eZzLp)TtDg7DD75J zLK!0684!^E+*4Jo?!oF_qN8PPP*f6Lvrwhzn6VqBRZLDIt@E72-jn^6Al~Q{wps#o zO6B_8T({{;xrv6?@rtdrKKdUO7ojqi?&~X`IQeM-?~~R;1DL7ke*lnLo+g>5(wgs} ztWl@Y-JTOCb<5kyB`mCNhTN7C9xLCmAjh2fh_PA)@tq3MD~`d}0jYzm zocLQQn~UhL>U@`;;!!X_@4R4eF}x3WM;0cDp;xpVQ5eqS(@dgP)oQPlX80<z&2h9vy+JQ*B{C9gyri_xF^MgC>y@OhAHNiEbVK zE)lhn4Pp_e;S?oj?N+WDkc`#lbt%s7DyNz5d9D*j!_%KEMsd1Q=^(k+)rL9l%78bB z=hlID%~(Y3?J&$Wmk(HbyM3tnXtKJw_KPPZ|kFT<}e zTq6p~r9001yO$D8x4sfVP!H)Z(Uvq-JdijBT}LvbO|+V(1``XcR0!I{sD+qkizvC`;U>&4I7d#q3g{>J>wwt3;<9Oo za606Fo&myFYUE+Q=-J_{b8YHNw3GW-l|Bk6_HH4n=(%H)Flhpz$GO^xrn0l|xqeab z^2kkD#Vf$HY4;vwEH>I?Q z0_{VCd_fs6?W`%-Ebgyz`+4=Z9J;q*Flqd(vaB|su4okIFUo7T?+<^zZt6+*h(?Cz zcvgZt?q~eN5F5GsHt4^k>d&;n2Lu2UGbLe;aQ!)|qVz*Dj=eyJGu)8s^`=#7^On&S zI`i~YnT08m@p$-2G-Q60CTU|gq1S7CzGF#cviw0IaK2tfy7M4? z=rC6|Qoa73_Eg$NDk#=H zbVcNFgAV-?_Ofp=o`bL<(|3ZEcW7d5`x_T`Yq|na#i{*A9;fD!l_wdS*;sK<;cCWKTER?*7bA$XTmClvF=v9L&!f7Uzk@SBDig(n@7Oa%vKc z3I}&Hy8vY`^X!WrRW9J=v3i1s#);rd7>3_5*q$R|Pvt2ZvPL$%kUe6ySum5&V6#{6 zKYB|!5Uh;uEdB>TQZWzy2S~Wdi7p}wrs&TVd0sDAKgDn>02xj;1#b&j)I4#)HOju# z)D)$>K1kNA;aZ_g9xuqHW!pb5&^AXeGpyM^9c)Gsp|%xHzNt-9&7Z_GRz7dD zx`$XcJqusDP}uJ(cM?myCncE>cyyW=e7M*PWIMVTnC%F`jP@@7wsu$Y5>+U z1IY^R2NtLUeGj^+G))GHz+HV^>TQqpvM<&;Hm#AEI}P{(rt6x&>h4i7%+Q58Yb4@9 z(Xa1DVS6)5@^f67y+W;d{s`XjZ6@14-W;RYjgc#d?cGHo(3$L?hYv0zp8^dr5d<*m zDEP+0nFWPoKuEY%r7>?+?wkP|qYqiZ55Rtx(|ici)88(!Z$A;tgEDfx83Q;@Ai|Zi ztY-mq#3a97wAGRfg*Ht0$%VC}5i|pQarDte2wdZMoDDhB^~S_tcN_!u1aB_p0Tlpw zfPqf+qa1~w<(h78;$m*g^gDu^SoDti#@XP(71>2`c!6v&>3H#C!C>yre@G>Q=y$PY zWVB_N0t@}FoLzTZfO20`!C=lop9Rnlx?@_G`|UbdlW`nB>R{YTh?W5L-i|3U?y6v! zWGnynTZgtkqJQw-r862@l_4pb=>~{klwCr_jfD|)b5i*|v`J^eIv$&(KUVxhI|g2L zko*|sN8lzl(Ked+7_c-t_fODG2ak1aC%!a(&CTb(9JJg~G5Ob>MYT7ZJsk=A8FY)G#kNRT?(yF61pv&Ijgqb12-eJr(_09Dlf z7;Ms%xE7h`A=8mY?o_IYrag5jkBvVN+vof*=A10ZWv77A?9PU=qf0;m@}M0M;=O7g ziXn{wUwn|XAo5dIpXF%$%zCEsK8*~0T7Av%8uIA0!oJSFs+O81fm`+3;ift9j_ew9776B;j?VYj$$PlA3xzCL(KSYc93?I7aWs=Em2&l9~XBCr_!z%NB#u|+|&y720#iboB|w8 zRS(oIBQQQ;1W`1F!}eJ_oo@W=EGV8favtw-M4uSoW5(ZmmnqM5!^JFTf%dZee@jRlDthXLxy}{1@60*THK!42NcKOcrgq52 z3{8%IQIwwNlsoQ1TL}&I?BAlrgZO#J7@Q4%Oxj|0j9Ku{4xt^A(@wa__5ekq@-Thy z`kH)Fy+iT3n#n949`iRUv@@q0$s6aeHb< zv!Ot~k+M%nHc9~*wY?eLj-iN6CZ*?X`g9^%IUJ!=tSUhmOV`9opRRbh=DoYb=imBWUL{> z@+WWVo#(xLYk%lOhjxz>o~XdAGm3a=|@r&8rN6FQx3i!@_1!bRx5iy zT2-~%HqGo&c9k;C3mDA>-3is`T>NM z_ntVN7U3+&gx^5-VLeZx3$jeeDpdqiRM5Q-v}7vNphbXKf9@bHnNxKZ-qolET^xSvU9JklV?iySWcCVpQEZu-uwg1 zU7C5QDriu``RpIb1(XMA`Cy3RMs{T&{Je&!`N}~ppY#3x1AJ~<^IsuDphwUppa!H3 zKX^Pll}kJur;fZ5nm!oa@)17g%6piJqGL-IIs}2W25LjPnm)a2eHP|1z3{cxemyov z6hf1rqDQKvu*uD`e&L37Gy8#Ej8HCU7?^P~9K{?Jz`JLH*?p{5M~y2n zX(#De{2lV|Ur}s2?U+DQN#|cv`6aWpJWof(m;g_o%P<~O{@24e>Fg}GSO(3?LTT38 zW_~itB}z&rP>@<9J61SSN2Gyqn2pMSLv1zhtZln#fukjJI+ZK-fZ*?NVfmE>@qYl@ zO^~#!KD()~bs<~#Li^juaTfQ0hdD(OS|EM@(r|7;#atc5?v3vs$MF_6;KN+pTVM9i zKW*8q=_;%=^Bat-vZRdCpsghU!N;{oh(lSGRUYvlp|z`;57(4oW3r9I3D{ex9{t#4 zvdAUxQhs3g=ADlH_v@Dto`4ZX2cNV>5u2?mI?Bl+OfE!4U73JUa)8I9qXdRCsUWUn zBO*e4%eQiZ!5s|)7fqxf1B??7T;>G26HCZch;9cEx0TlMC@@OS@Ol)583k{&UX|M1 z*%3s^Jn~pAN%=AL6d&86tcIhrN8 zS3@Uzsce5}{Rp3i*2qhE9m((4U|!_q;m=6Xs{UR}8oTpKK&bBSk)}2Q?Nc;I^Xq@#7j?l_sxx zo`&D+wfVeOZauWY$AC$H&fOOx^+;LhnBI{)C4(<+Gs$hgMr7ocYWh)EaOFz$Oy4(- zhloQ-=DN3jP@BJ*%T+~6Y%zxJnE%9kw)=LWITrLG!)ytcZbbY1<4Z3Y5y~=6$jSYk zuS$r;z)hv`O?Q!>u11>nqKK0Q=hTaK)pJgx6y-K6?4VKGExDEHof8%(2rK-cFOlis z(Y7m%thFmqVoOwoXg0a8{S@=*`RSHuj?^a5$($9LUJ*f8h9E9t8~(k*FORvj-<-gC zZ?u=ecBgGP5Zas>Rcn(vygijz9i%zm;!I{Q>iP*cOkGo{2S=Gr#)(1`>GAOX=}+}6 zvccRUqKn!=Fh?`CFIdM0w`ektQz;-s|2ifrh_29&O*Q7jpD(#GtbJr(TN=Wx6z>7N zj!lW!fuoxj{N7v~pQj__95f-ieFF}3Y1Il{-DAtV(M2?RMvRQQ@)JuuytfHy zg(@R``e57V(KbZM_qGkL*N-!Q$2$L&lonKcDV|G-**Tu(d6pu9S%h(DE(NO!gpxX_ zQX5RsKB+`>^#$G>U=cfQcD(ypa$QwzX`K?Y$=cyGZ2X~JO_A_~u2@`ElDNB6Vy7#V z>bX;J(w__CtGk~?2+p8_2W>xdG=yBL#@>@E<4DS_QE?A!i~o*`spHe)UiLc%!L3~& znMH#f`D>TYaU{*$A8mA=VHTtZGFuOZXrS!j9UDZ*Y^cM9l9ffHa9zSDO0PDRoBa%3 z!;Ip8UG30}grgl4mkhr6Zqx7h({-Sx=hEq_aQ-mlY%hvr ze(J=REa%Pz2R2(1G9B705kim@-QAGbT<7g-Js+f}StKNgo$?7#O#o?K&1Am*GgI+K zMIzMDPLqjg=I1xVp@Mo1XcWqXFRp`V2R-lsaJm4Fdlkb*+Sa_9wnwnYWrmyd{z@A@ zd_XGM)w@{tLZqTV*aK$+ob$&&QfuR~Sa^A8^MucGw9gSfPyvxD-(g^sR! zlPX3Zr`UsRiK12F?zAvkJ}W71`&1@)}+U>LN*xv)9K zgbj~atKctosK|#wU-)`TdTdff!82iYr(}pg*!6VZ?`hJ1vbe1=A6yjAtG`_TmQv6p z%Z{~v=#d!WcPjn^>+G607Jst(ijC2VE3tc!moyx1#(Yw^{or)IDzx(%O2~iySC~;w z{qwuA(U%)rflvSJ{_(cFDL-D&PMw)<+eUEetH16mqif-$+l|YWd zpk!lbz&8ax?anN|7O%w!=?{f1mMpf0(g@?dwuNfPSx^11tCr8!+onS7dStioZ^w8K zsl=6SLhOUK5wII(xbk2D&LMqh%vK9rwCTs1$bMq^p-*`gRxx3WJkFj~B`By|`ho<4 zrmy|<2E_!lpm@*01_oWE2t7J=83*}z^?4XBlZ{(gEQl%W00|nC{adTN-#+}NP`LZC42xGcakAhZq{6Qrt zY-VG0bA82atNWCWrjMBt8NY)&C`W)aRI6*mdCk>-G3qLU%V@cwZ}LhgYTQ+vL0$qX zsP{R|r|w*tzih0C7nP)e?0ooWZ%#0eo}rO(6H5y6_VK_;EFybhfUiQ{zRN<(Wk3Gu z3!~FehaB8m2LXz!k!5-MOFtOZff(O+*r0F!{l2mBo91afjycv`^@SBXF9LFBv94EVH*Jh!kOsBMS0~{O-WwW*|=GFI@PxP4E-uYRA zK??A8(hq?&24Q4}L+6)q7d5gE>W@F=oX;^$4kb%6I=7Rs9H7;cGT+CAl@3?Q5|32a z#lE9~jL&bY<3rIpTw>m_EpCMK`MZ|1{pnYmFIOX0<97+cO?BvQ%P2Cm$UzR?6lC~w zDV|97!Bo=wJI~2c27E6J`y1EeCps=^gC#@F67@3p@jdV^AE?BXlc-W$jFvahly%v& z&)9yu1&-AwuF5P{#V&&$vutTIKZC~v2T~wqGo92yyV~isD%N#bXSUd&N#+fp_q5{$ z32Bf*u0l&|s)ENGPXh_IG2qrGCe(${`I2GHadYX;hRVRqTU!RIzg|g)ad*=@jhUi4 z%f?5(1RUuF=M*PLWV_ZELuL&rn^$Fv*tP=u7XBDl4(X6-lgj#(vN;=I*kor zjmwPB*@YhpcVqv^=@x|GXy_wA;a8pbWQ4vvvCtMQ*Gr?MtXed&q;+0!4uSEQbW1jlQmt+3W}75bIe))7rN&E`%S(1CUr9s_1|-Dr6x|iDmnh8 zA+d4KKg-Dz$==^@erU)zI`ccN`Dr%&s+vkKAT_|SXS0RowBRSQf4d9K9@sW9M|PXf z(;97<+22eHlfG5m_$kjnv9x-z`>Af4YTCHIxMQ+nCg0GWw;&s>P~#2}B!Mj$gFf!u z6$`%e{jxJ}7CPV4&90hcgD)qv(a}fyYivvqV+y2puihK_D-$fz_Ni^Lv=M%mcOWP; z0C9#Tr0wyAS}6u*qPrzln*jTi>cv~h%vdw_i?OjjZf0OXvez(>!rZj(dqoN5x%EGI zo>~tq?$Rdu-MZ00I?F>ya`GmbJRCnucADJ;#s zIgoonDmJjf5K|^N;E{JLbVcY!10mL9^6k73tO4q~(6ma@QhbO>%CI;S6UQw))dUMt zm7Jq-fD#$17JP|wZK)gUvS!-bB5O7U) z(MRm8HJtY^p6F}tHRjBfjq$Zcz#(_*y4E-Ep^lP`O@4nJ`DzFW-G`PDnE zd#K7JFlq1u6Ql0Wm;2d|VX$B4aRk;aIFXGNPq$6j-&zl3?q|-iJ;LLJF08Tw5c2pv z*TR1sR>A!KrGK7X3zI6FbFZoi>g|M4{3=-!m}GH%$^A@G%3nI}&+Hq^xI^lFzD9Yx zwcO?m(+iA~V3}hv=EnffRD~PLoc0Ew?buxAyMKu^H~tNXi~^jdtxZZYV3@Fg8BskO z<|QxHL$xgAk=IQfS%Fx*@#u)VC!utFS=uv*m9lP>PNDhvN(X>JU0d!8gTO;AVv-`%z zCiAT-bebXQYY1IeoD@T%=p;F7taKy(NQXO`J$U3Vmw`F>-HL<1sT;uIHBXMlNYLK)e=n0-nYBBKu2oySrFvd)HgAngD2Ys2emfgr?;i znvcEaxBw?_*jOxITFo@6||`qR{nZw_X^WV!rl@xMcH;Kjd81dk=MG^qD2AHRSY z9K^75KdHK63EItCZ#|_iPUJ{Kzh2FAu`?-3n3f;>DBre8#~kJvDfZS)4y7mTNtQgA zsk|Y&VVV$1%aQL-V4liT+QS7t%&P5z#Rs)m&=sB*MQw?q}YKbNbd4iBoBxV13bu#@5G?ep787N?g6F!9n@xFp83qrW>0Dm>j- zLHNUy=gUjeZz(O-P4D6L>DHr9>FjA?elX!-Z$)Xy+Jfs)$npCFIADP87J5_yKc0iW~r7P{JVOuUwAv)i61!@8_HU)F5c@-^vV+skgXKu+~-_~ z6#8?l^avc!R7(d1e1c<`OxuAnkStjVi#`aYL$hxD+peXh)k&!bN)j12n5 zG1%@4=|tSEg>SqNj-PID0q;Ua>Vsv&#g&ju0`)*&qGI*i zVu-#X^EZ*p&_O7YTdp@L>Y_8pFC1l934J!+U;f5_ir;o5AsDS9n=XDupJy_1M2>0> z29my+^CB`T?}Ypf&GlY^HkieISinNbA?a74{m^CQZN9#??RNNixNyA7TOeh3YZ%DA z*e-=Vo5x>9z&MajW<9~o|4P;zK7DF|=!XT5_rqtm28XiI$uvjTP;#MaDH(sfwj09v z&;J2#)E|qU#M%F%l#xw#TaQehy;lWjfMrLG%g27R3N38ZZpVPdrb!#^M=r@d*{6i}9ilEBm($E$fil)}ZMVeQEpC!5~26 zC*dnm_g89i*w32EtF+av-o{l`I%XI%<$HvdulHJ7J4b&!t1UL#`34yM{FwzHqv6*D zeQ*h)nQ>j2mv&%+x_3DLef6dZ0Q%v_>iy`@#_=0-tsDx7yczo=qWU#JEUfFrv3x>x z#uJmhwdE1LZ-SohW~1)_!{a6#97McOWDa?AJA}%)6`EJ^*to>kww0I&v zUp^SRdBOCKG1AOA!8SJb8y*ur#&=A8e>~sz4e3oP1Wc**H^)06H!fcgX0Yb#uMY-nv5GM6*UWrteNDGzZ6L~q%X z5p^4tn$LU0>7aacvi7Y-CxXU~`S$a<^~%%cob#4*Z+9i#_0COY^+WGX`K-I!4V z@T5LQFLgw1iJM6NX+=xYhi3Ohasg(}K}I|lAOweZsLxBMYI@$~U^n=HT))r+gPuP? z#`Qmd5W@Wp*>9$zjjZ@|<{IbYC*T}PF6h^haqv{G@CcVm?N9rqp?;nv7I!5)nPUz; z_F``x4-41)=|1UjIF1wxrYf4pdFn!(wKaMeBYjE;l&&&*Dh}v zl)dS=6JTB#CxW5)Ptny^PG$se>t}1&NI!lwDd`a4!eCRx{}BwJy0bvnAIV4+X$6GI zfUJ1?SDBWW>cOT4e%L9+E;ZAR2wHu|q`HrSxu{;P3u;r}WV-4r(=p!FI-AZ*Is~CJ zAFk_f|-;}i(T%^9+D_0sl9v$A!xyWd1Ni+VfB0YDxcz+{A)y}7}d}m1c zS)ImQ+)t|fXft;?D6x|JXD4hYBJKd?4?8D8FO=HC9T25s^Sx}mHC<|8Rb&riMEJOX zG`5y1JK#AK9OQtI+Oaszbl^s5`jUT>rN!Vy|2?x^IkHY{@4lW?d zs3>u(P?c#d6kCd9|9O?GGRLowAYIb+hOK3v1M;8K>mRa=5wqxegvYv_^+J-Bwym z!3X)e{^RD9ceLF2?;Vpkkq~6sP}nnvQ4O(5bLaiT!Krwqk4(j>l1!P&R`e^*K7rT( zHe8T-cpeDkAI(>5!zUUb;BQ*_IoVt_svqUT@dNSgv3}0ES^^9QX(6+vzSNLoV#+85 zlgOYvH_@Udkj-5yAF38lOXwJ_IV@7zP;5Kc^}87qqz61hF%Fott5~&$4}v*UProE} z>JK?fkmjac(jF^s)^3897J3XcS<~d!5@(B7e~PLKUx+N8h3gy*K%(x|j8-jdgXj=QcNm0)vYPbYfK zE4#p?b5 z8-DEkh(}pZCgbX^jsFYP10Td9vcg@i_!X?8jq}L{vzmkmO0+d{nomV1cvr=$N%wOB zQ|K&WYfu1ZJ@a?3aO%NTtsEm>KVTfiAz}U9_q)$s3~qR;X?9+?}^_JEo_rZfzqJ0s{4K z&~_iep_JX7`t4;@c8yGa?|&t<8tY?kt%XRB9~@L?g4My$|0&62{{zb5)z9%yF4tMt z^$E&Xq|*QK|INAoNBzTwS!i$6K|UH6;W~fiE8xZ07NyvjS7cOm6tgt>PG`|`j3syb z>la-e!}LCr{e-uz*iZ1XY0Qs;rlu(M5$vQ*E@*JH@eUj* z-A*u)Vv-EzRcc7Q8_S+h)~!V-Bln^a(5T$!s03u`udJ=qIM^hC$^i$~0KD^@i87V8 zF0|Efn3ao&kN{`Cp-}uFzsDipRI%9Di22tb)%l!~^fRCC!$7}k0QnF1CI)jr*C@)M ziif;93Q_}|{|$((PoPF?u6EG^pRb`pma+m+Hhrbna#B)T;yj|?-FIz#R`+trAV#_$;io{H6BK=-`+8Q3+gVM8q;`pm_ z>5G7$RSZ4^c_)~8A6Yz6OS3;*s|v~q?*8b0Gor;b?vg)v*eN#Wd;)J03C}bdy$Jg- zBojIGX{b}X!O4~ZbiKCrD+dV5>J$!0GQ?ehoiRMin15n3O=DyBnIS~fB*b; z3@4Bj#Df4wf>{MkjhYcdeH5MS^S|CQV*$}$h!v)?FC}ID-PT*+PZifqaw{E!7?;jJ zU8ZzKIRwosSEE%>Sb6X3{1#ldIeE`GHQ3?P7YS{?&yX$wU%9$l!|`?T`S!qjCD8_-OFR@wziLDB`vqA^z_URq9?}fdUc+;8}oU4x8%ytuj9o$`29LZAHWBbz~e0R*)8pLZMvaFe{gaka=;HS>AR^zxDs9non>cZoV{0pzk3U+kry|zM|)`@H0I(3 zpSypwybseJ)p-{;hikx$X*F(fk!P;&sxz~@?IhihWC5oilP-CP-_KetqIf&TBCh-s zC1H7j*QxDOLLRyGIH?E%y3J{;sp*u&M?dj(gVlUDb+bQ`Co19)kH8W5xs0I!qm8j*fFlm3w^Y}5u%+WgPyFf3PyuH!vqF@`MAnHgZ#BIN6R_?D^Z zS=jQ(cj^mT)?U@yh(={s=m!Y(rW`5BOT4K0L*DueiU&IJ^ADfq+G0J2m@-jzJ6=Lp z;PXqH%W&El*B{}eqIK6XTNco5zv>7G$i>YCSn|SQtdw43oKUcyDOvbf629KXO6dEA zuHS9>N2EtbTIzG*Mow}!uJl2N}-P@?d|-S5seM5(En=bBIr zR37Z?7>cCqyB^~T#RyHzSU_B;CKjAPHovo{7cr|;gpNdoaQ+vw9Ee zg;JuK;U##T%t-N!@=~0w=@Sl6qS&+_V=Gx;&yfXn6;{-e#1PrjIt3KkHeskc4>K5E z7QE&Jl*RP}Mq6CSF#{V^m(1eaK`amm5Rn@yNcK|^u?L|PXmEA@pw%w#W z+i9^W+5=2uiX3idUW6ZjiPqlUd!U8v*q45y-!$p;*D3`kRI|2;h0>l_VP{M&SOF5y zBi`{w8STG3Dm=;Vo{pa~zc|M{?);r z0A(~m1(?4nteqa7Kr`CSylfHc{S~_Y5vo=jc&`ijg7l2f#e2w>RTV41NwV;b{`4vR z)LUq9BXHJT%9C~;M%!{}#zUFCnG$+rh-a^~x>>pn*a3?lu+TmHk+pNS@C7nKWa2HK z8ZVoUl|=k}y8B$NMeH}o5*ow8*XKKVowR^1#s7@u1^=MQF55UB#(povmmk`G;PDnP zT9m5_sH)t0Am|l$@v1nSm)37)8VPVuEV)a6(Vj2}Zrtcez<-O$LgK3DDkQSa5L*nZ zoJ0oWB43p5LlNp-A=fubXZ;cVozm^jCN5+SBEno7NP*S6+RAwrbK?twDp;iXSYX18F zu66djH;{{Nd!;KEgR5iKcW(nxR;8Hi3nD;)aRWyLod;$&S$+SOY0oJJ4k$Vtv(N5$ zyr*^o>$DZthQEFM>lWH18A;YaZ_r!8}1rd*;IB zTaiwOjYv?W00fqIw;N1`-LR!D%+(tt6%igsxx4#(0fj>tf1(72jxAXKy?!8_!T8$E zmp%?sd*Z00X#fA#U_GC7=6+;bh|7GTE>G1^Nz>PFqPdrB$HhUg#`||zpp??TK$9O_^xw5Zvf?WYgngZu1nl$<+_;c2?t)Aj7mg1PK zDA#j`JXSOk+_|_(@V}J-&&a;LCqT9CUQaLI_k-~o9KthI_!l6p9964%Hv#_S30tfZ zGc43d?-(qmXz>Wc(iNjOEvV-yL6#kUh3AFGLMR*BQ}vYV!BZ}pnkwzbpLiUOM~fIS zQ=O*hyJe%Q=c=1teM2u!4Olj33y5iC;<4JUx?k(lM?=hER$N6tR_NCDA!A71YdM5r zK=QM8&Wefq@xdh5e**B?RHh)K>ent|pnAct&becKKw#~>XS&PU%LdW|9c_9p zdagW^yY+*m)w(^IC^PShTaL_t$kedFew?4@q;f%B6YWci;J5n+dTQd(om*B;d)B(V zApp~=d?(gj<51l9oP_5fG0hq+Pe1O;ivJ&u6?S`qs=Hnd?V~kp%H^DD=W<~wDp!U0 zM4eLc@@cMo^3hJcBI@l#EXXR@z!IJvF$|1+BF(|eprqU&(jwRrHp9k>7GQtxY=Y5m zk(7r0t^eV~Rj;3`5^YxS{3TbeY86fv~bSoIlI>QPr$K;WUmE7d-Ou&2B5lzG|07; zk!Qmk(Td#reQcq#hA=@imHM@A#)uS6ol-SzJ_UujQ2#ytb`AOn-OR{+hV=#g+38s8$AXh5irk>1o2j=tz;@-l!Oj$< z)ympIU61RgaO}5Fv!A_-5KR&FSi1>|R~50I+Q#QOrgHK^XThFZCohP1qEpy6Mi0>y zUfn=gIlU!0!$ThF1;@R3*$(mYy`MG}9AW*G^0COENZM|xvGULt5KD9P9+l?X`k~vj z&!tsvd;}QEWFxjObVviFLFCqMLCL4^>%r--HOjSOFx6o=kl)d<`QsAP$;rQl$ z>x`<4VBh2^=);zV%XJX#Qn>_G+FjG)73(4aEIhwTb4xoO_$t_H9%3#^BC=ukc)6d9 zmL79GxA#v0!w$BY)8tjJpSm2=l{wXckHODqn@K;p!zIC0 zscXzMK4WWajH9qyt&eMX6YedW?3NsmVn%Isd>N3Z9bC%y=AYf|Ej7fiZ0MJ*p-+>A zQH#nOr5%N#UkO3Q)bLh_uKmLFxNGzu&6hrjLLZP{wYBm}E4!kW!>;Qf>5a91wdJqU zRG$z?1{KFkPIlPuWB+pNK1&)V5bkx)WC4ZuK;$)!+wDS(&b{j4anhX@MP~QM+l>MK zKw8BM**t}R8AI4zOh!a~;{G*|U|K7m&uPqWIv!v8vrFV|Cvy6uQDqaNFdL4jjstyq zL>n)577d~tRb{exG2c0E&nacy^zAcr-(DCq*$|k4_r39UVs0OBQ@$^Rxb}q8VgWni zK|1l}e2T{755@oCJfdMxe3Iu(cr3luP6;1M_!Q$+0oc)YTpjNJs`Y4DI5t6V6=~7n z2PY9&mS;GZ9CS6xOLJS`YJiMwX|vjO@*ptv{E8KzW z3Eh~-ezS{Uj)r=|Eymrd!@r0;3RLBPA#By^c`NXPV6N!ZTDp)44PlajP z9G&S&(u)0Un7F{EZ}&b9emFW z)@IT5)yu7P!=&WdwB2c&fHBpT=OZTnCsxayi6y7}Tdhs$^l;VuBsE!gZfk3HJTm_f z9!?hPPsKK#kkLkef_@TlW*3Fl1mkHj!X`yow$x9no9A?%Y?o}I(=982@Hp76ouQ!1 zv;q5WYSM(?(M%Df4zX|@8oHS`1d43c4&%FG_Sg*jU7pp}5SjYVI$1ZY;8W60`YH~{ z?*sWHxMQihteWbdSHnQ7VXaJLN5E&ggA5ND*kN(EKu=zOS)hNWmS=iAUZt ze4yQm;P1>2X#MxDiEp(&rj1XU0?Kns+;8(9)q#vKLFDxlK%W_*fK@Amd$OSP+ML8 zP2uhSWOuK0Tg>@oBdC$Ls@$dY=#61RrXcUG0{vgNn`LbX)5T2mWi{YPT7O`!-G12m zv&wdzwbih*t3U3>kp;NOuIZv-dQIfv$M;U0Ez_e{@h4vaqDuCyHnNX33)@NX)1nH|Eetz5i<`S#Y1CQD9CN!?*v z3}gZrqw+K^Ncu!*u`A~!dYQMc4i0V&wsWcDncomH2*vTxSo5d%CKg3r_TcT60_VKy zjU6kk1HL5VTjJUJUEr`;t$g*nsWzaJGEGZ}ANZnEsi~(uqc?FT7Ihiuf7UlIUf6#O zob+%P!I==DMN)4;>7X{%_^1_&0LjYv6+MlL<*;O@zs2dC%A@jJw+k~tJcvL{M}aa^ zr()Wyz3fQAZS+v~rWIbIRD}a;IB&ka#t8cuqp+PuG3STa*!b`;hWgzc2^YCeCHHh( zYQ-V4)GW={S8X$G?e@!ijH3VcVR&)L8k8uH;YVUA8W@r2zd+pEd=v;Mink*gIjFWWncwCU4ok45$0H?B(}y&V z9EFBRl`59<&b-K>t`VGMX(-d!c8{;9eOw?&knLHz#mkV~w{f5uzA`48d3$u7fhwx7 z&!|DOp^u4o>F!{YMXU{eR9YdGTt{*a^ojL%okUkOH z4;>)8EN#-2)2z+CzLjcGgLYj=rPh6HcZX=K)9}7THhL^?iZ{Tw;$$m?aGu-heH6p9 zC+~%DsQ0k((jI2^YY0lOz*j=`vG$+hA3nZHEQhd`WP=;7;-5I))v8q}1-$44(L~rt2W2gVglc`!cNeH@7=3OT;1lP;SwJs@O@rOhmio9$>rw{<_ zzJCQ6XDzZPnf%0MmxmD=5yVhuEwt}VPCX%R`T`D8FsG(!v08j)jd1>!`~yG9dRJUz z_X!8QShCz9|Da5PA+UtKE4d41SW;}gh_6iarup3mmS|z^U(p|_bQE#^*9Y}qh#D%i z7{ZURDB21%SkY;#nSoz$#;DgNAG(Xiev{WC@Rr1JS7BPvR^)2@3dw*8qPT~`+8v6E zu2T>TTVfAcb!Dr@`$%opQCF?)@6m@?f|GLs&bS*BtqE(~>yaEEyjH~8h+`m`FeuC( zb$@N=do`9ogXWu8{@Mr5#77@{~{mWZ2eHIYCnqPk|*gmuN(>izaj2M|DX zrvZJF42>|yCf(B+FL^>1>!Oicvt%VJ4#{DrT;5#WQi{^PEL9n1yp1O1o_l%&er40S z*HMhW4jD);W&JMzYU|S=hmBB^^`J>4?Yr3Eni3?xs5^}|T9UTtt zVU4WvF-7Tb0%({H*Ps0p%zN@y(~91a74oG{-)7r^Pj-GeCq4`Lw&$+br3R^$;M-ZV z@or;ofbzChipDZJc?Uoj7iN{Yo%I9A!4kEvd~SD4QlLxQ8)!Egr- z7ZDjb9~11=FDZLWx3^xjl~W&I{LWRM@g}qBYFpwu_2D-^klWUzsTT`xL8A8hP5Svi z1^PK%EZNmGFQ3cic_uy`Bz?3eMTfOV(Zb@2u|B3{)^8`A_X_o~9sQ^+3c_f!N(~wucR`##Il57$7)>$R|Xl>eZs91f0>)W$0b#`EeK561=!&LZx zK-3f;8s&To?sO_B`jEb~8vcQU$e%qfKmL*IN2H;Sc)$FF^p~_Mry$LE2fb;PorvK_ ztlDaO3=>M8JVUOIj~kW_4ORarN^ujg5%q<$@u&9D;Sy|P^v5L2b30k;3y6mi3Cme} zZ4D@Bk*`Jf>&&L825!gvXvzzfw(~ybbMFKcbzmM0OtOdq_4$8^_}$xhEgjfu`j+7t zPT5bayvPE1QIi6{InnXkDtZYf^ra?A%jbF}b|&*3U}?1XkXl{Wz^^;0RGWE@Ib@Vk z`Ou!C1tXU~R24h?SbDCz3v~czyoJ}!VQM2&TltCg;av?bJ=&yb2uh*?WeQFwma-6) z3%hJyb8-#kfy=eAzSs0Sivu~VISkTfFerC#5DUf^f3tKUGavpm^U)DboK2s=9LW@~ z>8BmpWwj9rWfA*SivEPkDGkhKs*3mtN^y=>8BLifW`4R?>8YR5`fuRL2`ir$hy|iu znD-17s{ikEI&TzT)#oOWZrH!*TD)>nLO9zE^`!)w652bmrM+C;Cn`Qen!!Brt7ihZ zt*Cc&(Ymk#YVg78^SvxW2)XtRfakC$EBS%=pybEkH$^C18Ed(Xf0Na~^{4lgn11Qg zI)|+em;Pc?ghb@)qmmQPm|@e=WGUL0217_e?v{POidS0{vDHY|+737|95jU^r~%bpvfK_bj?ilU1qC{6g~;8@E2aEM;C0f&U%*^{a=hJrpit zIUtWrVj1GMrK(g=WhOpvyY|OmRfvNuD~p4ISkx-6;bO0MV`%_nBe=}iYaxmXhO?ry zoYBg=My6|riC>+>NLfI<9Gld})czlltA_jf{=R%1w#v&ECm5Q2Kl&;sL*eo+fi47f^ z#RMJX_zl|6I3@SFF35k?bu~f0FSDQooA-~qfBUyJVh~K0!`|1^H?#>R9o3yJelK8s zKi#C2{md=;QtaO)AiVXNv_!<~HqDpoII_+BaH28*W4sh!ptjiVe1DtWFS%G2FyFgb zupR--rDshP3!5D1YrngRa`~ENxX^$v=mQ1fo3BO5C<&F2;>%=b9>^+GEsM1ci3GoR z%uKs0*|UeJcqP`t*_>46yevw)ZUzfiCSYk8b;vZ|Z75YrQWkwIuMB7k3Hss!xwx!m zD6-*Cx}yQ`f8(UqHBi~D5D=(pR~1`U`^}{kjpuH-jbp_|x`=i&|APWL`Sjk+rx0iP z2|DgI-s`ETyi^%}5~20$>Cpb13U6-S{28VA^i#$B>i!R9>Y)ENdjA78_V#` zg@j8OO&Stc)k>H!{f3fJwaMly#rtBh9|(`@K!iCzV z^0tL*XJ53NdK`6ht$zUToH*SC#( z=uZ{RaLu)=?tvd8dV|}4s&Ox6oJVwC9aw;8=lr9%96C3EdyD_J7+S39J!U#Gl)JQs zDk1M4im{H=%HnYJbKCXTsF)I=Caj6yTa;Yz;q_7?l@I+Sc3qI)Wer_2If7mFLEfQK zWP_fg8p`@f2Kt-}%gavJ~~=)O|;laT-FTX&lF4P>gPZZ7i;D7-TypwRf6c4EH`Hi+hxUzTCY`2aQ7)+XT^ zvu1}BDeQH*hFk&<9knh_s~>6JpNl;jz9anm_S}a3heIcZ3*7>cD0vyghL)Jf znEnlTY%JWIa2;Ho*2#sYo`HVZh=Jl=t?~9V>=wZyW#2t_AhCc?Mh_1g?nc#!hddg- z(lJYqEv6ec{ope`zrAO&@0Ce=T!|&q;A+=~FAR1vA?wMxH=HU8qupXfB6=)kY}k+{ zCJ71cHi${>x%%3|+?+joNKT>fUbx+(cR`(^-9Wr>+Y@@RSb-g=sb zEc5cl)KS5AE9zfmYGdPhS<-@0?YKxri%!faQqNaiC;g?%@g&*M4w=GzG=P3cmf?z- zu@`I=zfM<(S$+b@5Q?RijVqM+4JryS?C<*8`4m<93do5V&v}?p`d~(Qtr4xvAq}gu zAPKx@_AQ514ve4mLL((w9g~^i>hs^V9Sy6d+y*5Nc?WzY71nt+qVA|!xCZaVwAysl z9gIO)Yq=w^t|tQpLwneby=sz5rnlu@F_Lm$a!74)u3cuYgm9n{XZS(LU78%@Tm57j zOTuu81QRavf?~P=&I9T2wtf=|dZ*~i)v+m?_|1F678LImHu1q@hcH7K_S0l$b2-$z zHd87d4+mKvtQwjWv4DN72GXs08vL?mdt3k-1M}+PK75}AyF!Gg5{ejP1xvUx9GN0g zSnSMTb)nhUtkZ1)Ck#eb{0tPRL&oIJ-AYt|a>DUBp5`Ci7Rw>4o(h=qy4=%U-X$qH zH4|vxFv~xmVc4VL=PiRCJty-G3*AU%Dm%QtW&(H-OwfoTlUcMvk+0IgX@mN31>E97 zg;LfVZvh+Jpn_sO$q^WWOm!#G_fA0%e`=TQ)c1zLGi)cgNHlNVYJ5(B7tr6RLQ`pH z-1f$weYHwf_TNg-#psArh0zJP%Ap@9g#|wJvEtY7v?84wtgW9#Lb8mCE>3M+P7B`> zVDMZC=wGx43;<13dL(aoz%928}F5|edmMqZH_y#M&`vZ?D# zn)&VS$8U`xRh$XOe(=c^UY+Uc<90?H#C`W~r8HUXswdKEf2H7L`A>pJcnTk3mY4$> z2R9J!I%qWc8L=q|3YW?Tx=qG{`3ha5;_tZs;5?SPZfF4|nFTC}D7xJ^A0mSoIBlx7 z7jJzTQQZGI_wbZs9fsv zD}MP$7vF+vLI}Gxga&t=-vCTzT~lwpRc;sisI#^_Z;IJ38nu`H!x{9?h?muexsV>{ z`ZnJ5d8m?HE=#|zwPqSrOQvcxVlJR(qriVuMQeswFNbCA)y=;i8y7esWndg;;9?EM zak!%GxzlXw;}?(<>=jnDD)!6$l;WVy-qM|HtO^okdUO$pk1srHAH)cyH94OBRX_hC zk;b;D(fAkrW=I98=ql;=t#+4_KqtC2!K6Eay97yH-Ew0k?U9C{Avm^)KqZz6TP*Y- zu+a4>FQW5#cEn8azryp01JAY)eAvQ`BOyz3wK$RhO-XTWTiA@ai9J~t9u9rq$RmH_ z$q|&culLvP1F8z!BDGTsk&5X9d6iakVQl)!2wV+ksPcm>prT+6R1CJD37MhzsD6!S zs6WYRmGp;iRt;z=<&zj}T?ETn1w}NyTM(hH{I7-6>rZ8aA?eI@=UOWxJ!E1SX06A zziR1askwG3@6ELX%HcOGKd={0%S!@_h%QH89Nov+pM@us=}I}${1)E|bL4_1J6<2Z zUiDJGWJTz~X~R2Zd<7P;$K6G1;Eqo2?Q?8A$B|HeasBBIp`zp{!j=}zn4Ufd##aL@ljNbjRU^`6_;6D`|3!?X9J&7W8Yf0IW`u9AyO~bbP@S$D)cDFO{6PJdBJfQOOa8rV(3n40cURMqkIxMY z9}-i8YroDl>z8RYTc|#n!2cD~kV43>^&`OQ@Ag z<;GaHw=>r(OQ+w@9sVui;_r>-u8bt}Df$(SgI%`#Z#{T(kqdoiBxp^<$za%4CC#My zv<<6V!}h0c$!=>oY+HskTl`=v12^stv%{v#fM76@3y|7j8nx0p)ois{O)=T(TQK>z zvB@SW_-olMlTRfe9MnMjEr`uQ1QnojZx{+OcV7R1VMbCAJ0z|K{>=t@43es_ZFS~W zQEnx4Z{VV>XE0-18>CBzu?6JjB2Fz4>r%>p3j-K-a~O{({k@8`-{C8n_k1{&8fq>v z=I|l-3Yy>@IPJ25Mq`_hVSYeb6!u(E@JlhZqM(EF6OZBF;$3|JQy;uH8Um|Bw;O9v z)i7o&*zV7X=ME#4nQ$#X$sI0v-#yt_SHGP9PEMGRl5Ic z|NJnerQE<30RhAQ!=XRuy-=915GxmP<*IE~{lNORKC>Z!P@{8>?dEa*KxO>!2ffvj zg;(^h%FJzF>UNt2w2|EV0R8`PWM`_$1}DrT<7)imcvFzd{Qy#5k&!B|aqm9$NZj#( z-ct5Oo0ly+ubbqE+~W649YlF4XC=6}WcBMe7!v8@w^+GqF01o6AIkXJ6}`lB5J$b4 zH~q{CLc~iZuMNtF>Fx4x0B)vO-g=iUD2n2B>q69Pm+-p}5i!gHfJO_vOFPCLgB$v? zgx8&Pjc#-OIx(x4XOzAvN{FgFF-%>F$-%s>#0ckXJ`T%mH5rnt--R6F-Ka{sFz^^cPuiYE`fmWvds4; zXuzMEP_=24%?%2VnrW@+5a zJ)jiC62%L%-JbE{r_?|eM^dFlD9rFtobIf`cb}}LNNoCxVX%=)Ud}v(5o!X-3I5MWGO@oU1lE(;j1Vpe9 z*QHgxp2Qtq#{4PM>dzqhsCVeml%OPb4STLEOLW_H{Q@OZhN6U>Y{WpojI7M4(apo< zEDa$fFNI}n=#7eAPDfq*++i1WrzDDfvnmC<>85pL03=rD-d`{M|QsMVI-)N?@TyM;=Tb1$Tl;Okz zxV~us6i+_pfT-*7@KsiY1aE<9m3LY!vI?5$rA|c$K(L|XuHPu1{(ruGgA7GC@esGU z202|#WUsc)vp{kMSp#ZenrYr$ujxLu-@DEol@OzcQZeI`WcB}W!dQt7cUI`n8*<*e z27Mv8;Z{b(lIMD?%m7)@;)sZzKzupgzGY8o>lVh{Z1nWszH*hlbmxEt!@z*o&yJ{o z4puleM1WGU5eG`Y8NbY&QPV+EYAwmjy$-)QUb&?+n2=j%TM&nTQ@queG=6J+c~|4s z(B<|)Y`r@0#RA0^?+J+kY@%){#oSdy9#ZsH#Q5G z)u36B)5eqiM*kQTs29VAwCZIr{@qafIav8-ZF0>Fpmx3?W*9gP9L#ZK0W%h#iLII4 z(cJgB@{hOhwu^idk=$t+-oDyxZ`;CFhr+7EJfI&Brqs7wsLg(_m@}$_Mc(vpy0D)D zEKnz4SzA_mpd@Ay!yloJh-*P`g~1bvI}GN~T6(Ru-iayEr))koN{th%r6E`G`e+ zDpNQcZsLJk3$HIrV%?%}g>)a^VgEl%qRYLgsgf5jI_lhA%6aHrE0aep*)~}UsPo)> z*s}h5>wep`$xb-84^;M~CE-f{Y-lD9z`2{(?0dI>RHEde^@v-2?2F6XhSAT?d;2?^ za<;*Pk?)IMFhkB?g>J5egVhCzdrFkKtSS_V3ulI@XLZro|5>y%#Bpsk$Ifsoxmnw) zPp=lko6nZ(whFLNOy26l#xn+c9~}}IjR@xh&X$aw_vIV*XO7T1ur7oeK?LDNDQ|8N zz9?~`Rc-u}mQgU8RFZ^E_iDFvF`V|i&2%ny0{y)`UT#b({IQG`6^`>H|JPN_|E-_> zBu*3%ia;O)d%4Oyi*cxuH+=uEn%GJFruK8ck2lFE<)RdOBJVKNhBa0?Vn92*aja4} zbdZ6nSY_dalksKrmWZLB#R@X_`&zSib>-1!-ioNoEYw;sdLGJ(=AIfWIQlbGKIq`O0*lY@+|W7$797J+w;KO(FOYLulT!ocYwimV+)h(h0_JA16Hxj z=#A6ayP3_Km`XGho0MT;YfRN<#^gO)8S>^9MeT{rt-j!XWa>Z~Dt0@5FNj$pMo4sH zcd#egy_sjRm1x1zNo$)*l=H@9Q!?}3qY-vHylg8eJb#bFMy$PiGQ73IJ?p>=OuEK? zaxY$BISSv{86Gk@F4dJ2(*~zVmdtp4zG`T@0amveIbpthHrU5fD(7pisG^il6Cd|+ zoK6IMX@|pZPSg=ITXMgKY~Um>j9jY>#nbkT?3muE*0DK|cxeg2SY?RR;cwlP*) zj%d10e8~6ecsme8`A=5vC;Al)4eWwE@o-VR#qx|=;JP{6Y=$( z*Cf(?CP^xd4RznNp)Y;;=%cLlW;lY)Ci?|fcui3eTdI(!2;9CIUwHqYmxFWg81csT z^KPbBxcA3zpdA(+_hQfdvdad|Gv&n@E*%a8u@dc9jdK392XR9kZ(F~;w(~RMp2Qn&s&e9oD za=BJHVt)qzhAT6)&(eVXq1oe#<+?c~)&WpZC1$&Ya0h$wp6 z=Tq@ubF5E-{>Q)n0VreN$%~qUb$#;}8Q;<-Js5KdsPGL?N*f=z8gU;aSd3L5cVv6E zIgBkwVyU-c5PlyX5iB)Y(enHBZ(d}lB+};O7Ow8(W7aq;D~6EKY)D?+ii%w*lIQV!Z?WZp{A40x3&_^ zzr`ps8J77?xG2QPetw1DX^NyQ=EYa)_ih(Ffcds+3KagRgADIDKnF~1r!5rbT;D=t z>a$6i@kV)6Cc)%Zw#P7~qhsU9An0Fj@|f$?dv}Xz)2^dh)^C^h>chL?^8@fqL|EDv zc7c9(iSqr{*8yooMF46aDt9tDygz#rb&o6wdS~ccL^nW-+wMC{IYlG|hg~@LU zaQ1d>nB_pym+W-M35jX;Wfv)b0_h8iQGt+enRf4jR3DZ{&P#AUl1g8_{GF%n6ts5Y zT*)@aw;MayYum>g|Bc#NX8ttnmuks!xjoT`M7rlE$GpF4r=5FyTgT5$j}ya(FMj8=Vjx7&4@28j__t&)Q323C&aq5KUZO|wYY*~rpS9&Sy4lv&@R7wbJF_rz-^;>91Eh)CCp z*=!wD8&U@IGzJ*}J85q+@D}eBs(GW}^mJ@I#22WJGgOT@9l*W~0PYb6f0iV@0Hq^VS#g{o?y(lGL>IkVuO$U5TAjJa5adFRYkc0WIEOi1>d(Jnp$7WGy~U$r`ggeYO)~YSHwuFfVQL zMtf5;uwY@;@PfF=K7)b(ugBnynUJ-YBwHx9T;x#V7zik z%t)ZXG}I+afPQfJ&9Ck>Fabk424(8bJpUo^LeQM#`2p|~s9L`4X(s>Dne5NgQ%6F`VGJk~^H^)KvVNbp@q?ePGYd4P3w%Oz$; z@)}*`QtIK2pguziUS%s}+m>})=QIW2#4E`#)<+|6qO<7NAJ3n6r2IoxJ6PT6qZ9A@ zy6BC55G5qAs?3U4pi0M-7S~+-^K^xrB2okBt`93#8lkm@|QUJWfxscn5jI{Af|_3ay|oh<{dj- zfKSxD<6dp_E8F>kd5(t3_IdRgSjfx!an@dNglJ$`R2;T+&HG-g(Jkiyu;F!cRm_tV zm3fnsba|Z2!DGCn6KJ$)m=2MDC~u1Za$^mX4}kn(DtxCLX#i{v1jxfv@boq&MTl1EaFEh zT_2aug{I^;+qy{bNvFDS=*5NKRSeio^ zv5gc8RxVMj0;9LL+1`vo@dcS+W6T*F}`Chv6+q)kw zPVmV$=fRni@4R0Yu)gT)B}&G2Te8$Qb0iY3#Ph}@1+i1rI@x;bP)vP{)cXs{wci-I zy3C6xsN>mVO+T^5FuO|Mbp88K^_ik1vwJ4X43Yg|FU$0bn+ky7F8ju!;g}DD4O$#< zLgG}Y{G*c=_4q{K?B#n6liZ)u@913hg(u;My!o_w^dMXHp5F&1O#k5!L)f`Syvh#0 zid`ae%c-nRKY#w5dv%%7+ZEQyijvvP!47c@_4finuRGp|MDhd0ZR2M~8>Z zj@|Ur?h{;UgB$iO?zD9w&O+Obw*vO;oEshtb<$3$N8p@^=`4NByr-kQWgk+TB>e(+ zc#k2)5+P8#C4R{Fvmn;qlWF-Tg0Z1Ssd4KeMD=y~4>zt@H1Q)ip7GzsD>>d{B3{Ar zw|@_>=V)$K4zR7a5YDC6={GJU3$9_n}-U!IZg0`NvZ!n|o z2i8UC369U#A95*=^%WintE;%njOs=)J|5NmE9`MDK~rqTAMXrnz0;ogzVkfK=ldy$zyQhv{X<>|ID1NO>Ry`NZ~dsVr_0H2KBnQf zHYAbL8YWr}Vho>gr^E&wU~qzGkO}``6EZ04sAR@7 zMXkhv2t!_xCR1jLk?f!W%290aMl)G}4J_1$JuG%1_72gplT|*-#@^AsP>;B!#qi3vmy)AC^vmYyXk*L?qmHo{=QZs~^}fG=`3tBpne^x?>WdQ^%YqANPfd%2$r zT$%l}cIQl;y>2qneR4%&raUM?;RRohoQQhO65oT@$}9yq!QsOzOEq_81dny0NuibU z91ePRgC~xQhd)s|=VceyNPN*#))HI0M3qYWc9#>U5H9O^H(-O~>wjo>pwkS4nO%p% zBEXep7(~Py#hS{IW#o;G{`TPd);CB*^3_uh*R*r;GGAK6h>hj zY_@zUYUveH&T;)6K1{8roVx0H8)=^5C}GR58*vy*tGs876(ad$9)&ncLTectqk*oC z{B1yg20DF-zQ#HxyILA|CUb8Xw^RwgMN!S6QEU?^Is$TzXi7s*%_p&2x+Sh`1d6wk zYD=x!{sFyhs7ct>efK^3k5rDY+R&!!0Q1^ZBmJ{s`-{GErP}m@U)8P?7vvFp+1{Mn zg!GR>xkY;u#QLM_32ShCb4LKhZ?;aM$VFKTFKn2j=+l)(&^xITaRjoB$3~}%g zrLD5Ii7DLSKKZpV<42OoTNj`&x9=P?m-X?3uMvech^>q}sX#-5%?QOK_Mwbv_&Qb{ z6Os@eocm;>KHaL(&-0AyqQCh%$#3CInBC3*5E$NsD9BvGxj$tWSlj$HlmO@afeMyo zJQ7ODnZ#Jz3zl$(F}FtWdzn)+0}N)6DV1|#d#@_e0gX*9#z)>p%nrHP=^lS>{wdsn z2sB7}_j(X|Lp9gtKBJ~{_Q{*MSAsz)sTSwUC0pEj0hP$-y6qhD=W+gbNNRPg?@nEb zz9yPAwo?MlR-bAxeG?~ogwd$8ag%WT+EFTAb*1rJIAK-}$30;m1G{Ns(~m+7?G#5>zg=#)%&a;!1<5&rbP8OE z_QXdcCIC($9AWUYy#P>2v*Na^>xu)}qJyxa$rm)Wo_F16YWqQK<^Chcissg7-*y7^ z!nargfBUmOeRtX$y(=#@(~}>w@m52;&1bNkXbRX{W9cJrVskNK-q&7dYk{fA!@&V1 z?o<0&P3Ns+bck4rdLWwzm-ed()2rC2wnAH>W2AGBnpn1mkoEaseKSftIPWsY*Q%X+UOCr;RrXu@ z{fhdXou;47Mduuz1hk{CcttKzb|C`AxSCm^;3*=yJ%1j|==E6Wc6?t!Thv-jEYEmT z3{eh%XTyyO*9M1u;7d>GlKOy=*V8lFcO5@VbfbkAOz-N1NE5#(FaMr zS-AKR1-GM<(xo1h3yLGVOClsR>=lI|o!1RYQx*lG)aPOsbFa!XMY(jDhKt|-QhY+; za`kS+cAg@y37dFdNpz8+N|~7;U5goC;AGoUrkqZ~a}W#i^LW~@!lloOu^r@$QLc5 zZwIuhH*n{ckXROsb&<7irrG|y{zIEJB`pOb)2l;7!0gbmKl6@E&_IJmDAZ-<&kKj- z=~ppXxqa_^^MBvL4)d+Cl_q~c+j*5^nplW_-vCpN_lLdLSx22$O=bklV!!k(pHZFU zb%OEg0aS<*p%3`ocGk5Hzt>ND8GPPy%VdOS-TlF_;0&L4Byz`uIOlhkqSOf-?Lsmq`5hfOabBNr2XW_N{|sN7|TX zdJ~W1Gae0>>1RNq+U*Nqp;lp;mDt505Hddyo-1q2(@yx{xNHQdZ{VJ&1|N}QgF{+? zjsHEiO*k|Po8aXEyKOft;$0a_Ptll)KKoTHb?;c4a<(b-YaQoRjD?c0AA*NiekMQ? zB@USjm^{E|ygL>ICszX@pAI)Y+DmW97wr!$9g}W(c1%$l&7oxLBRdSNDU#bZI&|UN zY@v=Lx&A-ZH8wiyOPJF&VV}WZ6c@ms5rkLl-dwM)lbF$#}XpUpOF}Cd4!<1X7#TIU8ZQP)|Xl<6_Y88Zju77#fK>RC7T^#5@V6- z0)G$LKcHs`ut!+vOc=6d9Q89c^>b7mIC}3{os{F!R_4rz0C&QyMS?URA#`@Fdp_4y+?*y;_eOLQ;s zIGp|QfI*6Mfk+DHiZ3|J@<$A>_1E~(|7cqQ;O8J{C%wv_G!IpBdA}9TvhyC6HQ=@| z3nu5i?7VKL5+O~#bln^PZ0678^(A8|iRFg)ivpU=x7@qE^`W%ih6|m0c4zCEn>hT3 zGjCV!N$lPMNMa%#xv$Us)6D>yofQjs35ihGs}tSGx)X7%)N5yc_UdV~gg<4{$5IcL zl)ekXk)*^pP@p?s+8!S4Uf$R&K|@~@AiV}&l3^GR4jI9^k$=jyd4=-&SkbMqv9ovg zxDpp*qO+1))8-Jv)rGD@`X>-ii4EABvPf6O{JA^3j25cpjKg;?gOB84cd#QB>W4ml z5l4v^<}1C(i89@$N-xwiLS*MuVfE!__gmzfa5g}&)pyw+;%Bf;Ru43Byo1J6FT?o3p`Db36BlXW7^Lcxoev?E5?Ps2seycrY@DaD`;)+p9 zW_eSSU-3*=wPA5Z2RenKhIgqRe$BrW@$k#P9sDg9kNiiEnn0riAtc7!>KG^&f<@GN zyzD(r5jJiFd#;XUM^qc6!WE2TU2BMAgy}Xk8A(Di;MS~cn)%AahDYS83G&61jQJ*J z?#qq>>JNUm<${mcOW+fZY-TLJty)w0G?Niu9PYD0Cq0{t(El8jIKuuNG)pwZ!_;H- z(3k*v$COU+O-HroiNwic5{UN*rBW5n`TZ=@YQ{)cP)srV0TMj(~v8rTu!N1nhKh+6`_1opw`!iN||Jy z=>Qo;nM1JY{=+bOw)ue;^lh&cuNUvCq^i7HxK|PJq6b{nL#jR`DbeYPUirQcj+YO4i^)kG^u@M8#l|WDC6X|XHwy*DH@F&+Sn(x$f3{dVoaQfR-ciqguE0$7#S|pZr*g_GF&q9%FgW620rP+H76+th5vRZ= z=fq$!QnWTVUB0+7&wu#eh`>Fao>wN70Q39zzN@=wTurTiCo60e zhV4G86>XxiskNqPUdl$daVLI>??o%4PI=>1dA=O}k6wM86C4Qk=Y7Tit6nX;|7{-@ zPPZJ*mhjRx8}^bs*7l$gx;Q)hLfy$gm{&h(KLt9MRmMg9@Oo+uhbt=<6O%Bw<2!Tf z>eNlE6Mt=7btX8$*U%=brPfJ5Lv}|LGpHMD_&IIsbo7iA-^MI?t=_n~`;eX5sRT5S-;2jA`O83O2M)V6l*U z-^wSZ6*GBQdg@|t>m^es8miRoZa|G$ZSXg>qLeetq_kak5a|3}V8kzqn;;lBWzUtg_3_ZlQOuwh_J{(Xv;4SLvBa)1lUWi{PK#&3Yg7YyIh>z9w^Xmb;<2sj{mfs57mF_hgD> zg+4}YFM^{Jv@ASG(4a5^`anN_^Pj3iIe&nt&Sw}e+>@GB%*tWj zROx8`cHPf2@8=74OtK#1ijsZJw>U`mub^7*lUNB~xcr}sC1l}9z54L%+Y|GF^NJlI z_UB02Yj2o&oIqz}1I)WyF915#w0P&uJ|X}6UUKcCzYsl^_Ny{1>(@emoE(>x6;JoX zKjY=F;&dFY7Hp;Z@=#4YWMX^>zT-3&EA#;kc>lE5kjw}M1WRH&A;f?{V@pkKEP1Ju zZ3&d+qUDZb?k=N0{|Yk&HlY_iM=oA#3n`KACC}P*>J2tZ99X9=I?S&qir!?GV`83; zkB>?_w~3Lupo{Tl-qk^>Mw|}&`qr4I%`Q;EX(HH-mG6d8249uu_v(Th2+hT>j7M1( zog>~uDg0ZZWJJIfP=V0=-k+Pe)YUvKdY)yVs{H&rx{e_Bv))nn#%5WbgiP8x<+~nU(Oa<)pT4kZKm>k=pd|NOX1m5(5A(%0#B6VUV zIP=<7p8~Frrdr~>1C#z#=iizbP|wOMYX+friT(#hU%VFVhzn@SaUQ-+zxP+_&9>Lr zIt>pX_54$Yp8;H0ZXQX|onUQpbI2`K{i#4zm1uULoCCS!gtnJEwc-2rPFI?IA2H>t z=X^-XtKIILTL$a$ltZes&9mSP3p;;tfYuh4@~El)+r~4N-?$m4e?aTc)!oG3M693$ z37W05GGnC`b2o@+6|7^)YkCCJXOF}aYc=v)?}8GIwMBsSLEyg}bRWgyT5kG;n1BiG zN8&_%!p^vP8PS7HUK>kYWK;Ovr~q^MJ6KBohTV*HfwRVp(o!Cd5~$A%!a(3siU$7r zJmFg$TF&6+4->^~bo~%ON`ai|b{;eNthF~YUfnTk96Xeh^#rwMrSX_NyYcQ0_MjR7 zXi|@`}<2{Q}u{_<{}XD^5sc#vMyEj zrYZ=b=Pyd=3I)C~h0i*K8wHNJde6lyYfx4bH*(IX2uLRXv1cY@LJ(PewhB}f8@HYE zDp7Q!3XOv_cgF6N!V51Lh(d41vk1Del~RQ8$ftNL`T32$gd2hj>y2Sc$ue6;!^KTK z4G(|4;faEBqh1mZnMeHZOjd_9u((P6UTjoQF?qq^)HO>VT+7bV=tH#)r9-g-W=M_q ztt+}sb~S6|b|vjr_Z@a}|DiTF}X{MBLj>bt1Cq_hc;$f zo?MxZ66eEx4W_3)BlP!(sFw;6pneUa2aE%KVWn9nCp2!J%#f-aw;o`-aTqE!tp@$&gMOldWf*{pxIsiG+wvZ{|3pFh;u?>>VBbM_(c2^ZTK7RofWy_YH-`t`Oqz# z3E+!YJzo~mbbUQr6<_+n@mrVL2DkPfiIVfRxRp<5iH6T;`OPfR)b2b6em3jy$* z$w(}6@FVJTn_a6YaD0c{)$YSqCurr-m^Up>5>GX~v>T`pbsIKm!Z-YeH7ul9nAXOl zp;URz+?1d8B}XAY)u3xkhNNWf1D0<`vi6EBg2l@Zn@lH3khPeko()~`>AuhRqi^@I z(99&UKRzaB48bQZt{g{7;56G!xW3y{V*J^suaxJ`fUcT~IB;TSqcMF~mnhjq)DAoP zQ`(dys3$_`?T=G{GsT}oA#J8pV=XIp5*>1j~gw)Xis*c$vA$3-_uhyg=P;Ii;?u=j@G;wdnd_iXF7&0n+*K`pZ%5{CBddLA=3)bQULH@d z>JpBgB057f?RIaeEP)CoK9Rzvj!L*?xoW!~Fb3*%Yj*iJWizg5*{eV!_n>RM5nh)w zj|0#r?8!-v&c5PC5W5wX6UB>r6(0Y9vQN`@3%wM}kF3MU{gba-W0ulq$Ya5z=ESCslaMe_^x|R7-$Ly-s9T4NJZL zvn{o&|4B~^Ol3SqhaPleR^&;c27`{J2IsHkdG{RgJM10x7RlYKjWYFMTDeirH#`{_>N$aFxi1m*X#Ix;`6gS;s6O2mm+H*pWy=Xm4nNkey?m4Mr zJqOj)dV{pOnK%847Lilr3L}yO(<2M+Nu8mU2d>tMpSw$6-@IBVyy1r$#x zb5Sn{*-O=d5b`r!qSaz-5DIBmWHUAM6w`53#do6jGrLdr)wL3^$b>Wwz!ms%`iY{{@9J$3x-z7$I zd~s4TuvHP$ustIArf)`@7`7G_aZGEh^%lLlkCUcjD}ZFwQeSLDMXff)oV_S| zSN+&TT2?SV?2s`-se7yv;rMJk_v#{NUvt?;W=ftS%SV~1-@%lC4fLz$GTobxGRIaf zz}UQ7w`&sDWGT6<*kN~G*Z+oT+yX)Vw1WyNtxM4PU+73r<^H}IL9HJ`Fs!hBG)#K9mJ1(b18cR z^0>gSx|%4@V=gYCM2Vj%KLDP%Pw>4P&9@-Ja-ERzW6fs|I_}}Qx^THkO&X6|DQJDp zUxc$`Y>DPadqndh(nEqr?AbG~%jci*Y|UB+|p$V7Kg4+>Gr_;z`J?mGJ@<=}?((XA^Dbu`tVN#ANjX zF$|YoPjJY2Kb1T4{G)L#KaKYV#fDk}byJFuE# zhstioVyhPmLR`UrXkw~7hG%{~-v05tc*idZ4*f{x@};2>SZG<+)@Sk?TBo=rzFeTA zEZ_;`UqjGdU|*pO#@+qsTauk^qz&F?YIkBIlS*5~T3#I7A$Sq$$ zeXx0KB3v6v>dvZ(dyu0#kwbmfus<5?2QTK)S9)%v_PGe3Tq!&yh=S)Ma!}Gk4iICn zRNb+RmyfgrM^a-?2Xai$?UKM(+{@l$#b!x*SXi|>V#iHhqJin=`D59*vmcmBpQ_9u zo1xs?+&aUlGBWd5g?yz&C5ATND^hN&8y0YKD^Y<+b}{aoj<#jg`2#fI8%n*50PR~aFwNg9TW_P0lzY;!v-Ga^Ax=eL1 z1)bg9uU9w=ndqnA51Qk`CT;?0Ma#XzC6w zZW3d21KO@F$wT;FSox!B9IkfHQDmQ}+idn0o*_b>shem}wJ^AXzchM@RCgTt6*`L?M-xkVJzD$-lu*lz90-p7@_Ag4- z(P+`ksI>p)fN}bHxh8@sdiD7%t#%6}ZOhH@?bBxHos4#8+_YqD&h+%8O?)?VHlxNb zZ!VwZe?Xc1{=*KHKZBj|6-T%ah7LDdnnk@ zq|k)(Wii)MhNL@D78Ls5AFtTGVpGlf?MJ?$%@hjcouaGpehK*)zDwHbY2qoQ?Rpmn?eZjnB{T6OL5D%k+p8*T88aluAfZVZrB~N{{xxw) zw+%tL^{6Uj;XMhZVk`))Dso!Q32X8gR=yRxx~2Rmy8HwXxr- z`6qqFU&3g#=Fi+qqWS!Kqo-?I268>0>Uu!^b8j>6i|dn_@2wVjg|v@Dc?Wk7>@~*a zeoLJ)Ro7I1w6suUHVq)x;e2c9dQh;~zk?XA6UZq(&9sO=QOez%V}e-#D|$U5`+SYW zRy`0F3U|-?V|!Nh{O2XQ(H&3%NQY9^x@K!&)Su-%qybJ4)(JNtZY*sLFe%2aV!qh) zjUUdZFt-_jrKyKJU zWVvn^n_~?63QBgd+xYre$0fG)K?3_P)KB46G5Ple*=l0M!vs>Dc!E36?d|Cy+-b%@ zD2gYW$oZsV$nCn+G<+CH#k!tbY(@t-HM-vkgzKK{?nE4qX1K!o_y z5Q{G5eIUW?@&}kZbn9R0z5+z(VmCMCgIag4do5mI>agMNl!-w5dmjCd&cHLqR25P3~S@qHmR{mlDA62}6;;79dG3oJ&8c z+T}o7$AuhDT|tajuYau)|1ZTO{x8_^|Lr|Mxz3v*RI`@}(jiR{n<{EA6ijU6bd(K# zOaGUOqYSJ~FVIiVD#%#Q%Y+>XFUK~>p|Gs(xVo9A=9YZjEh46VoqkUiV`(=0CGe}c zU$%6dH(Awk9geDX%4vWpsGXN|9oT?G0D^_zvvma^L>aH$VoyPoqn6BI7k-7cG6@(--Vd2|yVW3?4YRMUd6(M+>4Zi!wN7GzG;^QSoyi%}36We= z#jwP0Swer;^Ioy#8&95f`UNO>DAB4tnpjG{Up$t}8AG(e`?dy9y15Snbea0=mqx60 zrG{4Zod%m!) zi|ESc?JdhQWfV{SkX9t(*2eOjwLzSm$rMge%YmJdP;qg6Ou++5Zcd;=f$`o1hK zuEdwYhG!o>@>ld_eYy!+wqlplwR3i6EWV`*`9LFDV3nXqRY<7;U+0H++A+!WY;d6% z&tyrjYlvC%Taof_=<|q6&jPl8+jcF{{a!0oO05niH@)K=CLpIq}ANdZ4M(IQ7GiBldvw*4w>t z%)dx;Cyn>f9g69tA>|IQfe@BjZc9wvro&-@4KXmND&L0@f$;d!=F3Fk#B=;7PC~E%ZGYYd!Ee#vEeh`7OUEZ$4pPisjv>_4nw=JLGM=(rf(7H|V)f+r3)Jh8z z@%p}?$^K||!tsu-6O~lzwT}t->7OT=*ZE$!!Ejz<+HIG^#v|+*>ru=p*Qzvza3H(s zjY-m_w(5&5Xk8tS^2<>A`6u)6n_ho0xfI(S&rZ8PwmPR$X!#Y~jK}yOZ?es*(+Ad| zgg#6lXiajdDgdA#2Q5rDI+FsvM*3R!h0#m(rrdL_G&g0gRu6oH4cwSzB^=`>i}k$1 zJIb8r=YnU=eC1iM{c(_d-@anpvUELYpCgd{%bNS^L<6PW_25#@sb9Ui%g*RZ1degB zY^sodH$319gtLhFxqV!hADUNc_;^;e_wEd*hT>!4JI{sNrQ+ac z!d}7B!DLioNacbgGTq}h(=IXccI%FmURF==wBhrEB-w8U>!%8ZZ^Qb3U*bDWkV_o> zv3y)YN3L3b*Zc8}=3f<2f8_7&?^_9ckI1Plgw^1qVMi(Fxe!Zp`|}ihZ2K&|_fLZ@ z9?UGsHL|==5pb=o&W)LK_5H6L@uKGa|aS z>p0EP*H-e!ISA$O6zqe!{H{=V;l>lexQsJ>cy{I9ACv^qmhMna;bVToC`E8}FK!UwWW}J$g`4U&64qIN!1;wNJ0cQw1g4I!E zst{Cci_XipjZa4l9~*8d>K(n|e3!=wbJ+osDTS>e$r9BUghL;JkE}uu@HgE9T{O)zJS;zv%YEr7;k)ai|*8}6q_)Ew{d;d8yP z4!hl?$hg)g%-x;dDL6Jf@;UJYU#^88FTX$WG6bjdD1OV*DKIG!n(@r1K(bdJEO&BJ zMx@L_91E&sCQB%kPvu9C(VbY_O^-Dg)wvhco0o{@d5%@MDenBe_aK(B{A*A*;HNcV|{1QiRY6fw(w zp+rhgr6-T5GSk&s4m66`RySHpEcFHB6w}iNPklSkw;=rU8~0<42uz=IUx;6hkt@nk ze60oorDNg9)Hx==ukeaBnx%<}BsqlE89O|8AsTP7X8f5(Jkk%A{;@=*k`oT`n>rU( zperoIGni_RpetgfQ*2G4hm(@u6sLM~3|_c~9BN~>jLJw-vq?peA)+fV+R>HRCrJtN z53-}1=hYOfaHbVCrLj5dWoW?*X#iDHOtTogV3JDYv@$0KADUxopU>Df_<%8U^u6_( zgqYBUqBqOa8;_jhN6qs-t-*2;RmL}m9WDHB_2-NAG5DsnjRO*e=IdR(9>4iwTbxiaDcCX8Dd(Ru#s5ZG8@3xnH;9v)gpu8Z@ z7W@<>RqtC_4=;*5p2?#T@eM(8qMnuyUx@t^ab;@21oB&j1`sL(Y@}TE(GED3_XW&7rpo#DFsI&K-ve zL+zV?3Us=?$gZ+EUvG3m^xbf|x=$TIb1@A5>DQPXFO`61X`rxkWGpF8dwGd%T4u(z5T1M z${i+RA@9A!$+_-T_9{$c!DX#UoCNs?gf4MKf??*!E2uYC;|HC9D3%{Xkj}7MjAnT$ zeiG=scA0;*U`h5~4YMu5n05&h4FwS+dRzVhaky1{5P}-ZbxqkOmp9_h`W{lXCm=4P zaz9>Tt$6@%IVxCMlII58@5wiML*okMpS1RS5BS)1!+Y;i4_Z~1s1Lip@H2#mtB(lb zD*0u*mNUoA_>><7UzI5uDh?BY)3okg1ILm0Ie$n#aOSPSFK!YcY@bIDInyk} z1@fupCV^6YMTewXsmOm^p&+i?gP1~fWm_9hy*QbbaF`qFk4YpD3t)wFcB`J1y8RD`=7K@A&xG{@kY-rMG9V4i+5$^=&u3f* zDDPp$GpX@vq4=$KDJTbiJjF5FdK|veYGeCZTgk<@oW93A0nU|R_ci0T^lx>W>E^N% z4$HTS=@l3ID~^$1JOW0ePm&vYKzwqWbRT?^^zf@6k6y&%gt=c0Nwxmu;_0LgQ!D1_ zmdZ03l7Gr#CK?dhGU+#mU2qdo-j8NOT*73jZ$OBnOK$eq*gCaGj67R~fM>knktHGu zY)U|eN(vL7`}3}wdn7J0UzrnCbhUGhZKk$}c`{uScU7RIVnfhCEc<;DcgnM>DvF4; zyL2;dIRxFv12h@Y{1w*y^T+bxZByS5tL8&mR^+3Zfu7tA;`72dRr@8J#%?QAYIq>H z>EVWhedYBVcn1AHy4)|`!2Fc&1zslQFwTfz)&{1Q7T-2k1mGwZ(389Ebu+9|p^Q^a zwFPhyg@jkq%(^hYB(JNqLK92&E>Mfndqn}BW!<|)I%46{&oXO=NI=_+;t`=g8)A^? z1zX?_m5I4DbP_8bzfVCz$O>1$lO+ym;a@< z)-}e^)q)oq0XiyOTF7fZr(QsYNB~-8+a3XlXy`o#=eumNMWQ<$%ZW2-+nhb@Qm3nR z_dn_i_+OOuEoohhR@g4cl3xXNA;3w{!+hSZ7BX=iLmRiqq z8*~Z$j|rur3kRdj(*|&7$D`_)krk?7X(Qe?n*C9-TMR};c-{+E3Nuu2hK(P- z_*^`na81WAyTp0}U9Qyj`xY5vUSNgHn3{Km4lMPzkC}X<@1QDFZ#%BmyfNyxbUQ0F z@lv~a?v#PzBQBA`*gp!6!le?ZRV8kkY_?S$(Y!?=-H)c=tyou*#-qCJqu`4DlXg2fO8(da_9I` z1x`FWH;n)(8 zKMG}h9(r*fMNe??+C8$xmS#QSeBn7iy)|qWx5SJP4gU4cY9($*Gq@z3tYE%*DrB)g zrVG1BxqY(4?9RxXeB3_nVl>^|4k?V^TaM|U+(P=O>#0Qe-lj^-^H;J%-!r%vHTXT& zrUY&oh|uJ{vopvJ;{5U2c|&6k^_G}j+@<;CJQMXQYR>(Te_i0DpX_cX#^M&T4BwKC&vwuK$zee!8 z0yhuIfe-@gfJyPz<_eX`*-cgVEU!$A;{@qR&i9y2k(?x*i_7VK*X+4)5NU6?ESjvmJ@B=RW|YcoAB2i8SPPiNeW5=j=oeqXcp@< zN8If*nW-0fwyb{WE;OYc?hIOBBN}3GGvNxW6i=Te`_GQpMagEzGdC~lm!m0a1k3RE zklQ|wx#g{1#xpplI~W}tmK7D2tfpAy3r!d4IouxBx=z}XMwCk&B^o0b24S|b?`FB; zIe!v%qF2Rsu0a;LG2g(<(6NnEk4p2x$K2%&!JFL65@J`tpNi!Jj(h>W5&+{)WnLZ> zn!MPrLfkF#fTQ!s8XX{ zhML5Q8mO%=zS?8rQ=YB^3(EUkw)&s=$~1g+`_sCL&eUyAZ53=5gef*t`W}lb<-cGR zE|_WwcvKJGCJ=5fT6pY{lnBeoOxxs$Y%iq9Q?C`8@Kv+%ytx3XvyLsH59Q?q431?! z;Ia|hwL|w&$*>d6mm{xcjKqE3zFZ=ds<4{_VpLug8v{tdjRt5-EbjV~ch&v!I``U~ zXA%#}^Z+XmrB*aG?w2(ydt=2mC}AT7HEdolyNq?$DL^iH-utBiB+sZ^?}C}K6UrIvecjEuQQlx=9dhs58X;I1e!=M&HloH{{{#C z9gDwX@wW#4H>-gM44{htM*`dbQ9J#=@BQDU=l%We{(YL@-|_eljK{}{SL9FQXVTpN z_BQ|acK_DE-x~N^1AlAaZw>sdfxk8Iw+8;!z~379TLXV<;BO85t%3igHSjrb)A=#A zg0#;+ATJH?$gRh;U$bqJ{A?h2AM(eyhF+a#%iliC9$3n~N3Z@W5{Sp8-FmThA`b?g0<%!)3!g3_9BiCiDj0OZavAgbi^knG_9HwYp;ehU~s?uAWWNaqEfv`#jv z2^qb>=j1_)|7u{ZZA8As+a>3meYVjHH;Uem z+S)wWsX(tI;51o|iq9#d{_aM5vb)29qPvfceyj?Y+)GmODV^DSG;Bq(b>L4%jUDFf zr_Al;Gi2I`4-PrinhzLRUHNbfbe9`gxf@TB+E=W-u*&GOc+ zexamKQ_C^01X-L7-U#6M2r3#6rr@-a_;Twp-GOdPECG1%(xYs9sizb+a#XrilkSs#7@$pv^_xc%uk{u*(a2R~e9@bC+TV}s4@ z(;)@WJxCg2@oR)K#n%Ylz_Bd^%p>CAW$EGMh=*jzQ%x<>#1W7ls&isQHXI9__TO_v zkp?Oczfk6>s2>xiA|8S+!2Ln9!0EJqcp9mXt-l6kQEKqg>HtsvIB@Wf_1ECIJfig> zK)VWl(q!^+Zc##A=aTR&Por$zkOKL$lu|iO!x9Fqs{sVMX@<@%;PdR%hUyy%3`}y?09WAdKa>9r=Mc_; literal 0 HcmV?d00001 diff --git a/crates/matrix-sdk/tests/integration/room/attachment/mod.rs b/crates/matrix-sdk/tests/integration/room/attachment/mod.rs new file mode 100644 index 00000000000..175a0378815 --- /dev/null +++ b/crates/matrix-sdk/tests/integration/room/attachment/mod.rs @@ -0,0 +1,521 @@ +use std::time::Duration; + +#[cfg(feature = "image-proc")] +use matrix_sdk::attachment::{ImageFormat, ThumbnailFormat}; +use matrix_sdk::{ + attachment::{ + AttachmentConfig, AttachmentInfo, BaseImageInfo, BaseThumbnailInfo, BaseVideoInfo, + Thumbnail, + }, + config::SyncSettings, + test_utils::logged_in_client_with_server, +}; +use matrix_sdk_test::{async_test, test_json, DEFAULT_TEST_ROOM_ID}; +use ruma::{event_id, events::Mentions, owned_user_id, uint}; +use serde_json::json; +use wiremock::{ + matchers::{body_partial_json, header, method, path, path_regex}, + Mock, ResponseTemplate, +}; + +use crate::{mock_encryption_state, mock_sync}; + +#[async_test] +async fn test_room_attachment_send() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "info": { + "mimetype": "image/jpeg", + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" + }))) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let response = room + .send_attachment( + "image", + &mime::IMAGE_JPEG, + b"Hello world".to_vec(), + AttachmentConfig::new(), + ) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[async_test] +async fn test_room_attachment_send_info() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "info": { + "mimetype": "image/jpeg", + "h": 600, + "w": 800, + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" + }))) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = AttachmentConfig::new() + .info(AttachmentInfo::Image(BaseImageInfo { + height: Some(uint!(600)), + width: Some(uint!(800)), + size: None, + blurhash: None, + })) + .caption(Some("image caption".to_owned())); + + let response = room + .send_attachment("image.jpg", &mime::IMAGE_JPEG, b"Hello world".to_vec(), config) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[async_test] +async fn test_room_attachment_send_wrong_info() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "info": { + "mimetype": "image/jpeg", + "h": 600, + "w": 800, + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" + }))) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = AttachmentConfig::new() + .info(AttachmentInfo::Video(BaseVideoInfo { + height: Some(uint!(600)), + width: Some(uint!(800)), + duration: Some(Duration::from_millis(3600)), + size: None, + blurhash: None, + })) + .caption(Some("image caption".to_owned())); + + let response = + room.send_attachment("image.jpg", &mime::IMAGE_JPEG, b"Hello world".to_vec(), config).await; + + response.unwrap_err(); +} + +#[async_test] +async fn test_room_attachment_send_info_thumbnail() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "info": { + "mimetype": "image/jpeg", + "h": 600, + "w": 800, + "thumbnail_info": { + "h": 360, + "w": 480, + "mimetype":"image/jpeg", + "size": 3600, + }, + "thumbnail_url": "mxc://example.com/AQwafuaFswefuhsfAFAgsw", + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" + }))) + .expect(2) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = AttachmentConfig::with_thumbnail(Thumbnail { + data: b"Thumbnail".to_vec(), + content_type: mime::IMAGE_JPEG, + info: Some(BaseThumbnailInfo { + height: Some(uint!(360)), + width: Some(uint!(480)), + size: Some(uint!(3600)), + }), + }) + .info(AttachmentInfo::Image(BaseImageInfo { + height: Some(uint!(600)), + width: Some(uint!(800)), + size: None, + blurhash: None, + })); + + let response = room + .send_attachment("image", &mime::IMAGE_JPEG, b"Hello world".to_vec(), config) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[async_test] +async fn test_room_attachment_send_mentions() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "m.mentions": { + "user_ids": ["@user:localhost"], + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" + }))) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let response = room + .send_attachment( + "image", + &mime::IMAGE_JPEG, + b"Hello world".to_vec(), + AttachmentConfig::new() + .mentions(Some(Mentions::with_user_ids([owned_user_id!("@user:localhost")]))), + ) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[cfg(feature = "image-proc")] +const IMAGE_BYTES: &[u8] = include_bytes!("matrix-rusty.jpg"); + +#[cfg(feature = "image-proc")] +#[async_test] +async fn test_room_attachment_generate_thumbnail_original_format() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "url": "mxc://localhost/AQwafuaFswefuhsfAFAgsw", + "info": { + "mimetype": "image/jpeg", + "thumbnail_info": { + "h": 600, + "w": 600, + "mimetype":"image/jpeg", + }, + "thumbnail_url": "mxc://localhost/AQwafuaFswefuhsfAFAgsw", + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://localhost/AQwafuaFswefuhsfAFAgsw" + }))) + .expect(2) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = AttachmentConfig::new().generate_thumbnail(None, ThumbnailFormat::Original); + + let response = room + .send_attachment("image", &mime::IMAGE_JPEG, IMAGE_BYTES.to_vec(), config) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[cfg(feature = "image-proc")] +#[async_test] +async fn test_room_attachment_generate_thumbnail_always_format() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "url": "mxc://localhost/original", + "info": { + "mimetype": "image/jpeg", + "thumbnail_info": { + "h": 600, + "w": 600, + "mimetype":"image/png", + }, + "thumbnail_url": "mxc://localhost/thumbnail", + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://localhost/original" + }))) + .expect(1) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/png")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://localhost/thumbnail" + }))) + .expect(1) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = + AttachmentConfig::new().generate_thumbnail(None, ThumbnailFormat::Always(ImageFormat::Png)); + + let response = room + .send_attachment("image", &mime::IMAGE_JPEG, IMAGE_BYTES.to_vec(), config) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[cfg(feature = "image-proc")] +#[async_test] +async fn test_room_attachment_generate_thumbnail_not_fallback_format() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "url": "mxc://localhost/AQwafuaFswefuhsfAFAgsw", + "info": { + "mimetype": "image/jpeg", + "thumbnail_info": { + "h": 600, + "w": 600, + "mimetype":"image/jpeg", + }, + "thumbnail_url": "mxc://localhost/AQwafuaFswefuhsfAFAgsw", + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://localhost/AQwafuaFswefuhsfAFAgsw" + }))) + .expect(2) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = AttachmentConfig::new() + .generate_thumbnail(None, ThumbnailFormat::Fallback(ImageFormat::Png)); + + let response = room + .send_attachment("image", &mime::IMAGE_JPEG, IMAGE_BYTES.to_vec(), config) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} + +#[cfg(feature = "image-proc")] +#[async_test] +async fn test_room_attachment_generate_thumbnail_bigger_than_image() { + let (client, server) = logged_in_client_with_server().await; + + Mock::given(method("PUT")) + .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) + .and(header("authorization", "Bearer 1234")) + .and(body_partial_json(json!({ + "url": "mxc://localhost/original", + "info": { + "mimetype": "image/jpeg", + } + }))) + .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) + .mount(&server) + .await; + + Mock::given(method("POST")) + .and(path("/_matrix/media/r0/upload")) + .and(header("authorization", "Bearer 1234")) + .and(header("content-type", "image/jpeg")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content_uri": "mxc://localhost/original" + }))) + .expect(1) + .mount(&server) + .await; + + mock_sync(&server, &*test_json::SYNC, None).await; + mock_encryption_state(&server, false).await; + + let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); + + let _response = client.sync_once(sync_settings).await.unwrap(); + + let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); + + let config = + AttachmentConfig::new().generate_thumbnail(Some((1400, 1400)), ThumbnailFormat::Original); + + let response = room + .send_attachment("image", &mime::IMAGE_JPEG, IMAGE_BYTES.to_vec(), config) + .await + .unwrap(); + + assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) +} diff --git a/crates/matrix-sdk/tests/integration/room/joined.rs b/crates/matrix-sdk/tests/integration/room/joined.rs index 5c8bc1203bb..191062d40c2 100644 --- a/crates/matrix-sdk/tests/integration/room/joined.rs +++ b/crates/matrix-sdk/tests/integration/room/joined.rs @@ -5,10 +5,6 @@ use std::{ use futures_util::future::join_all; use matrix_sdk::{ - attachment::{ - AttachmentConfig, AttachmentInfo, BaseImageInfo, BaseThumbnailInfo, BaseVideoInfo, - Thumbnail, - }, config::SyncSettings, room::{Receipts, ReportedContentScore, RoomMemberRole}, }; @@ -20,15 +16,12 @@ use matrix_sdk_test::{ use ruma::{ api::client::{membership::Invite3pidInit, receipt::create_receipt::v3::ReceiptType}, assign, event_id, - events::{ - receipt::ReceiptThread, room::message::RoomMessageEventContent, Mentions, TimelineEventType, - }, - int, mxc_uri, owned_event_id, owned_user_id, room_id, thirdparty, uint, user_id, OwnedUserId, - TransactionId, + events::{receipt::ReceiptThread, room::message::RoomMessageEventContent, TimelineEventType}, + int, mxc_uri, owned_event_id, room_id, thirdparty, user_id, OwnedUserId, TransactionId, }; use serde_json::json; use wiremock::{ - matchers::{body_json, body_partial_json, header, method, path, path_regex}, + matchers::{body_json, body_partial_json, header, method, path_regex}, Mock, ResponseTemplate, }; @@ -336,279 +329,6 @@ async fn test_room_message_send() { assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) } -#[async_test] -async fn test_room_attachment_send() { - let (client, server) = logged_in_client_with_server().await; - - Mock::given(method("PUT")) - .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) - .and(header("authorization", "Bearer 1234")) - .and(body_partial_json(json!({ - "info": { - "mimetype": "image/jpeg", - } - }))) - .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) - .mount(&server) - .await; - - Mock::given(method("POST")) - .and(path("/_matrix/media/r0/upload")) - .and(header("authorization", "Bearer 1234")) - .and(header("content-type", "image/jpeg")) - .respond_with(ResponseTemplate::new(200).set_body_json(json!({ - "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" - }))) - .mount(&server) - .await; - - mock_sync(&server, &*test_json::SYNC, None).await; - mock_encryption_state(&server, false).await; - - let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - - let _response = client.sync_once(sync_settings).await.unwrap(); - - let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); - - let response = room - .send_attachment( - "image", - &mime::IMAGE_JPEG, - b"Hello world".to_vec(), - AttachmentConfig::new(), - ) - .await - .unwrap(); - - assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) -} - -#[async_test] -async fn test_room_attachment_send_info() { - let (client, server) = logged_in_client_with_server().await; - - Mock::given(method("PUT")) - .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) - .and(header("authorization", "Bearer 1234")) - .and(body_partial_json(json!({ - "info": { - "mimetype": "image/jpeg", - "h": 600, - "w": 800, - } - }))) - .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) - .mount(&server) - .await; - - Mock::given(method("POST")) - .and(path("/_matrix/media/r0/upload")) - .and(header("authorization", "Bearer 1234")) - .and(header("content-type", "image/jpeg")) - .respond_with(ResponseTemplate::new(200).set_body_json(json!({ - "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" - }))) - .mount(&server) - .await; - - mock_sync(&server, &*test_json::SYNC, None).await; - mock_encryption_state(&server, false).await; - - let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - - let _response = client.sync_once(sync_settings).await.unwrap(); - - let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); - - let config = AttachmentConfig::new() - .info(AttachmentInfo::Image(BaseImageInfo { - height: Some(uint!(600)), - width: Some(uint!(800)), - size: None, - blurhash: None, - })) - .caption(Some("image caption".to_owned())); - - let response = room - .send_attachment("image.jpg", &mime::IMAGE_JPEG, b"Hello world".to_vec(), config) - .await - .unwrap(); - - assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) -} - -#[async_test] -async fn test_room_attachment_send_wrong_info() { - let (client, server) = logged_in_client_with_server().await; - - Mock::given(method("PUT")) - .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) - .and(header("authorization", "Bearer 1234")) - .and(body_partial_json(json!({ - "info": { - "mimetype": "image/jpeg", - "h": 600, - "w": 800, - } - }))) - .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) - .mount(&server) - .await; - - Mock::given(method("POST")) - .and(path("/_matrix/media/r0/upload")) - .and(header("authorization", "Bearer 1234")) - .and(header("content-type", "image/jpeg")) - .respond_with(ResponseTemplate::new(200).set_body_json(json!({ - "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" - }))) - .mount(&server) - .await; - - mock_sync(&server, &*test_json::SYNC, None).await; - mock_encryption_state(&server, false).await; - - let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - - let _response = client.sync_once(sync_settings).await.unwrap(); - - let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); - - let config = AttachmentConfig::new() - .info(AttachmentInfo::Video(BaseVideoInfo { - height: Some(uint!(600)), - width: Some(uint!(800)), - duration: Some(Duration::from_millis(3600)), - size: None, - blurhash: None, - })) - .caption(Some("image caption".to_owned())); - - let response = - room.send_attachment("image.jpg", &mime::IMAGE_JPEG, b"Hello world".to_vec(), config).await; - - response.unwrap_err(); -} - -#[async_test] -async fn test_room_attachment_send_info_thumbnail() { - let (client, server) = logged_in_client_with_server().await; - - Mock::given(method("PUT")) - .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) - .and(header("authorization", "Bearer 1234")) - .and(body_partial_json(json!({ - "info": { - "mimetype": "image/jpeg", - "h": 600, - "w": 800, - "thumbnail_info": { - "h": 360, - "w": 480, - "mimetype":"image/jpeg", - "size": 3600, - }, - "thumbnail_url": "mxc://example.com/AQwafuaFswefuhsfAFAgsw", - } - }))) - .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) - .mount(&server) - .await; - - Mock::given(method("POST")) - .and(path("/_matrix/media/r0/upload")) - .and(header("authorization", "Bearer 1234")) - .and(header("content-type", "image/jpeg")) - .respond_with(ResponseTemplate::new(200).set_body_json(json!({ - "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" - }))) - .expect(2) - .mount(&server) - .await; - - mock_sync(&server, &*test_json::SYNC, None).await; - mock_encryption_state(&server, false).await; - - let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - - let _response = client.sync_once(sync_settings).await.unwrap(); - - let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); - - let config = AttachmentConfig::with_thumbnail(Thumbnail { - data: b"Thumbnail".to_vec(), - content_type: mime::IMAGE_JPEG, - info: Some(BaseThumbnailInfo { - height: Some(uint!(360)), - width: Some(uint!(480)), - size: Some(uint!(3600)), - }), - }) - .info(AttachmentInfo::Image(BaseImageInfo { - height: Some(uint!(600)), - width: Some(uint!(800)), - size: None, - blurhash: None, - })); - - let response = room - .send_attachment("image", &mime::IMAGE_JPEG, b"Hello world".to_vec(), config) - .await - .unwrap(); - - assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) -} - -#[async_test] -async fn test_room_attachment_send_mentions() { - let (client, server) = logged_in_client_with_server().await; - - Mock::given(method("PUT")) - .and(path_regex(r"^/_matrix/client/r0/rooms/.*/send/.*")) - .and(header("authorization", "Bearer 1234")) - .and(body_partial_json(json!({ - "m.mentions": { - "user_ids": ["@user:localhost"], - } - }))) - .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EVENT_ID)) - .mount(&server) - .await; - - Mock::given(method("POST")) - .and(path("/_matrix/media/r0/upload")) - .and(header("authorization", "Bearer 1234")) - .and(header("content-type", "image/jpeg")) - .respond_with(ResponseTemplate::new(200).set_body_json(json!({ - "content_uri": "mxc://example.com/AQwafuaFswefuhsfAFAgsw" - }))) - .mount(&server) - .await; - - mock_sync(&server, &*test_json::SYNC, None).await; - mock_encryption_state(&server, false).await; - - let sync_settings = SyncSettings::new().timeout(Duration::from_millis(3000)); - - let _response = client.sync_once(sync_settings).await.unwrap(); - - let room = client.get_room(&DEFAULT_TEST_ROOM_ID).unwrap(); - - let response = room - .send_attachment( - "image", - &mime::IMAGE_JPEG, - b"Hello world".to_vec(), - AttachmentConfig::new() - .mentions(Some(Mentions::with_user_ids([owned_user_id!("@user:localhost")]))), - ) - .await - .unwrap(); - - assert_eq!(event_id!("$h29iv0s8:example.com"), response.event_id) -} - #[async_test] async fn test_room_redact() { let (client, server) = synced_client().await; diff --git a/crates/matrix-sdk/tests/integration/room/mod.rs b/crates/matrix-sdk/tests/integration/room/mod.rs index 196d5836e3d..1dea955bc1c 100644 --- a/crates/matrix-sdk/tests/integration/room/mod.rs +++ b/crates/matrix-sdk/tests/integration/room/mod.rs @@ -1,3 +1,4 @@ +mod attachment; mod common; mod joined; mod left; diff --git a/xtask/src/ci.rs b/xtask/src/ci.rs index a4e4732680a..6bb8e888d90 100644 --- a/xtask/src/ci.rs +++ b/xtask/src/ci.rs @@ -69,6 +69,7 @@ enum FeatureSet { Markdown, Socks, SsoLogin, + ImageProc, } #[derive(Subcommand, PartialEq, Eq, PartialOrd, Ord)] @@ -218,6 +219,7 @@ fn run_feature_tests(cmd: Option) -> Result<()> { (FeatureSet::Markdown, "--features markdown,testing"), (FeatureSet::Socks, "--features socks,testing"), (FeatureSet::SsoLogin, "--features sso-login,testing"), + (FeatureSet::ImageProc, "--features image-proc,testing"), ]); let run = |arg_set: &str| {