From fcb50c2814b4fc0449314f6afd29dad5adf03b6c Mon Sep 17 00:00:00 2001 From: Jesse Pinho Date: Fri, 24 May 2024 14:01:00 -0700 Subject: [PATCH] Add ID filtering to AuctionsRequest; add local_seq to AuctionsResponse (#4472) ## Describe your changes This PR makes two changes: 1. Add an `auction_ids_filter` to `AuctionsRequest`, so that clients can make requests (e.g., with `queryLatestState`) for just specific auctions rather than all auctions at once. 2. Add a `local_seq` property to `AuctionsResponse` to indicate the local view service's own knowledge of the sequence number for an auction. (See https://github.com/penumbra-zone/penumbra/pull/4385#issuecomment-2111256876.) Relevant changes are to the protobuf [here](https://github.com/penumbra-zone/penumbra/pull/4472/files#diff-03b7341d5bf81ab9c8d8542d220d5ba4ae122bd3837531309742b685d7ec1619), plus a couple TODO items [here](https://github.com/penumbra-zone/penumbra/pull/4472/files#diff-9f4ca4cefeac93c9275a2f9d962d6670f6ab1c1381fd3d7c806f9316e3779ccbR986) and [here](https://github.com/penumbra-zone/penumbra/pull/4472/files#diff-36188e6ab5083e8be9d29039370cc523cfcfede683b223327b2d90e3f75d40c7R461). ## Issue ticket number and link https://github.com/penumbra-zone/web/issues/1059 and https://github.com/penumbra-zone/penumbra/pull/4385#issuecomment-2111256876 ## Checklist before requesting a review - [x] If this code contains consensus-breaking changes, I have added the "consensus-breaking" label. Otherwise, I declare my belief that there are not consensus-breaking changes, for the following reason: > Only touches Auctions RPC methods. --- .../src/gen/proto_descriptor.bin.no_lfs | Bin 99467 -> 99489 bytes crates/proto/src/gen/penumbra.view.v1.rs | 24 +++++- .../proto/src/gen/penumbra.view.v1.serde.rs | 75 +++++++++++++----- .../proto/src/gen/proto_descriptor.bin.no_lfs | Bin 533234 -> 534187 bytes crates/view/src/client.rs | 1 + crates/view/src/service.rs | 1 + proto/penumbra/penumbra/view/v1/view.proto | 19 ++++- 7 files changed, 96 insertions(+), 24 deletions(-) diff --git a/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs b/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs index cb5f8b9377fc15a61da07be47f5ef6ad339b0300..6e23fc5c3fa90b2ae6af49ab1a84a133ac4ac9bb 100644 GIT binary patch delta 20407 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 diff --git a/crates/proto/src/gen/penumbra.view.v1.rs b/crates/proto/src/gen/penumbra.view.v1.rs index 345079773d..b2656ba48d 100644 --- a/crates/proto/src/gen/penumbra.view.v1.rs +++ b/crates/proto/src/gen/penumbra.view.v1.rs @@ -1,3 +1,5 @@ +/// Filters in an `AuctionsRequest` will be combined using `AND` logic -- that +/// is, the more filters you add, the fewer responses you're likely to get. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AuctionsRequest { @@ -12,6 +14,11 @@ pub struct AuctionsRequest { /// If set, query a fullnode for the current state of the auctions. #[prost(bool, tag = "3")] pub query_latest_state: bool, + /// If present, filter to only include auctions whose IDs are in this array. + #[prost(message, repeated, tag = "4")] + pub auction_ids_filter: ::prost::alloc::vec::Vec< + super::super::core::component::auction::v1::AuctionId, + >, } impl ::prost::Name for AuctionsRequest { const NAME: &'static str = "AuctionsRequest"; @@ -27,9 +34,6 @@ pub struct AuctionsResponse { pub id: ::core::option::Option< super::super::core::component::auction::v1::AuctionId, >, - /// The note recording the auction NFT. - #[prost(message, optional, tag = "4")] - pub note_record: ::core::option::Option, /// The state of the returned auction. /// /// Only present when `query_latest_state` was provided. @@ -43,6 +47,20 @@ pub struct AuctionsResponse { pub positions: ::prost::alloc::vec::Vec< super::super::core::component::dex::v1::Position, >, + /// The note recording the auction NFT. + #[prost(message, optional, tag = "4")] + pub note_record: ::core::option::Option, + /// The sequence number of the auction state *as known to the local view + /// service*. Note that the local view service may lag behind the fullnode. For + /// example, if the chain hits an auction's `end_height`, but the user hasn't + /// yet exchanged their sequence-0 (opened) auction NFT for a sequence-1 + /// (closed) auction NFT, the local view service will have a sequnce number of + /// 0. + /// + /// Dutch auctions move from: + /// 0 (opened) => 1 (closed) => n (withdrawn) + #[prost(uint64, tag = "5")] + pub local_seq: u64, } impl ::prost::Name for AuctionsResponse { const NAME: &'static str = "AuctionsResponse"; diff --git a/crates/proto/src/gen/penumbra.view.v1.serde.rs b/crates/proto/src/gen/penumbra.view.v1.serde.rs index 6640e583bf..1fb7de41cf 100644 --- a/crates/proto/src/gen/penumbra.view.v1.serde.rs +++ b/crates/proto/src/gen/penumbra.view.v1.serde.rs @@ -864,6 +864,9 @@ impl serde::Serialize for AuctionsRequest { if self.query_latest_state { len += 1; } + if !self.auction_ids_filter.is_empty() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1.AuctionsRequest", len)?; if let Some(v) = self.account_filter.as_ref() { struct_ser.serialize_field("accountFilter", v)?; @@ -874,6 +877,9 @@ impl serde::Serialize for AuctionsRequest { if self.query_latest_state { struct_ser.serialize_field("queryLatestState", &self.query_latest_state)?; } + if !self.auction_ids_filter.is_empty() { + struct_ser.serialize_field("auctionIdsFilter", &self.auction_ids_filter)?; + } struct_ser.end() } } @@ -890,6 +896,8 @@ impl<'de> serde::Deserialize<'de> for AuctionsRequest { "includeInactive", "query_latest_state", "queryLatestState", + "auction_ids_filter", + "auctionIdsFilter", ]; #[allow(clippy::enum_variant_names)] @@ -897,6 +905,7 @@ impl<'de> serde::Deserialize<'de> for AuctionsRequest { AccountFilter, IncludeInactive, QueryLatestState, + AuctionIdsFilter, __SkipField__, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -922,6 +931,7 @@ impl<'de> serde::Deserialize<'de> for AuctionsRequest { "accountFilter" | "account_filter" => Ok(GeneratedField::AccountFilter), "includeInactive" | "include_inactive" => Ok(GeneratedField::IncludeInactive), "queryLatestState" | "query_latest_state" => Ok(GeneratedField::QueryLatestState), + "auctionIdsFilter" | "auction_ids_filter" => Ok(GeneratedField::AuctionIdsFilter), _ => Ok(GeneratedField::__SkipField__), } } @@ -944,6 +954,7 @@ impl<'de> serde::Deserialize<'de> for AuctionsRequest { let mut account_filter__ = None; let mut include_inactive__ = None; let mut query_latest_state__ = None; + let mut auction_ids_filter__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::AccountFilter => { @@ -964,6 +975,12 @@ impl<'de> serde::Deserialize<'de> for AuctionsRequest { } query_latest_state__ = Some(map_.next_value()?); } + GeneratedField::AuctionIdsFilter => { + if auction_ids_filter__.is_some() { + return Err(serde::de::Error::duplicate_field("auctionIdsFilter")); + } + auction_ids_filter__ = Some(map_.next_value()?); + } GeneratedField::__SkipField__ => { let _ = map_.next_value::()?; } @@ -973,6 +990,7 @@ impl<'de> serde::Deserialize<'de> for AuctionsRequest { account_filter: account_filter__, include_inactive: include_inactive__.unwrap_or_default(), query_latest_state: query_latest_state__.unwrap_or_default(), + auction_ids_filter: auction_ids_filter__.unwrap_or_default(), }) } } @@ -990,28 +1008,35 @@ impl serde::Serialize for AuctionsResponse { if self.id.is_some() { len += 1; } - if self.note_record.is_some() { - len += 1; - } if self.auction.is_some() { len += 1; } if !self.positions.is_empty() { len += 1; } + if self.note_record.is_some() { + len += 1; + } + if self.local_seq != 0 { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1.AuctionsResponse", len)?; if let Some(v) = self.id.as_ref() { struct_ser.serialize_field("id", v)?; } - if let Some(v) = self.note_record.as_ref() { - struct_ser.serialize_field("noteRecord", v)?; - } if let Some(v) = self.auction.as_ref() { struct_ser.serialize_field("auction", v)?; } if !self.positions.is_empty() { struct_ser.serialize_field("positions", &self.positions)?; } + if let Some(v) = self.note_record.as_ref() { + struct_ser.serialize_field("noteRecord", v)?; + } + if self.local_seq != 0 { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("localSeq", ToString::to_string(&self.local_seq).as_str())?; + } struct_ser.end() } } @@ -1023,18 +1048,21 @@ impl<'de> serde::Deserialize<'de> for AuctionsResponse { { const FIELDS: &[&str] = &[ "id", - "note_record", - "noteRecord", "auction", "positions", + "note_record", + "noteRecord", + "local_seq", + "localSeq", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Id, - NoteRecord, Auction, Positions, + NoteRecord, + LocalSeq, __SkipField__, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -1058,9 +1086,10 @@ impl<'de> serde::Deserialize<'de> for AuctionsResponse { { match value { "id" => Ok(GeneratedField::Id), - "noteRecord" | "note_record" => Ok(GeneratedField::NoteRecord), "auction" => Ok(GeneratedField::Auction), "positions" => Ok(GeneratedField::Positions), + "noteRecord" | "note_record" => Ok(GeneratedField::NoteRecord), + "localSeq" | "local_seq" => Ok(GeneratedField::LocalSeq), _ => Ok(GeneratedField::__SkipField__), } } @@ -1081,9 +1110,10 @@ impl<'de> serde::Deserialize<'de> for AuctionsResponse { V: serde::de::MapAccess<'de>, { let mut id__ = None; - let mut note_record__ = None; let mut auction__ = None; let mut positions__ = None; + let mut note_record__ = None; + let mut local_seq__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Id => { @@ -1092,12 +1122,6 @@ impl<'de> serde::Deserialize<'de> for AuctionsResponse { } id__ = map_.next_value()?; } - GeneratedField::NoteRecord => { - if note_record__.is_some() { - return Err(serde::de::Error::duplicate_field("noteRecord")); - } - note_record__ = map_.next_value()?; - } GeneratedField::Auction => { if auction__.is_some() { return Err(serde::de::Error::duplicate_field("auction")); @@ -1110,6 +1134,20 @@ impl<'de> serde::Deserialize<'de> for AuctionsResponse { } positions__ = Some(map_.next_value()?); } + GeneratedField::NoteRecord => { + if note_record__.is_some() { + return Err(serde::de::Error::duplicate_field("noteRecord")); + } + note_record__ = map_.next_value()?; + } + GeneratedField::LocalSeq => { + if local_seq__.is_some() { + return Err(serde::de::Error::duplicate_field("localSeq")); + } + local_seq__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } GeneratedField::__SkipField__ => { let _ = map_.next_value::()?; } @@ -1117,9 +1155,10 @@ impl<'de> serde::Deserialize<'de> for AuctionsResponse { } Ok(AuctionsResponse { id: id__, - note_record: note_record__, auction: auction__, positions: positions__.unwrap_or_default(), + note_record: note_record__, + local_seq: local_seq__.unwrap_or_default(), }) } } diff --git a/crates/proto/src/gen/proto_descriptor.bin.no_lfs b/crates/proto/src/gen/proto_descriptor.bin.no_lfs index 23c5f98bf9afde1ae105dfb0903936c9457b2f32..c2fd4bd1f134c9aff4f19c3160df9b9c093cfa26 100644 GIT binary patch delta 33606 zcmZv_36xdE^}c;io#77MKy#bP2I11oLo=&@prYbDB$}wvB#O{TCkTcHiTU}@1r<>g zMMaK+GbThuoNWj}K}DPuaaIIH5l{p~Q55leb`AG*vOd;gt$z2ZdTZCNU3IE<)v5c< z>cRuB7N$M!{qwQl$LoSz-0qI3W5dgjd4nTwO+)Z+FYS5b;_~I**$sbQ?hVLzFE!lp ztT$BkI3(BNqH!0UdqM4l+DUbz&#kYWbaCD2+WIy<3tsok&~WUi@%6Q*gJF2PLmu>j#J6`voWhNJ#a_T7~E4+Lz7o9QkwBwKYU4@FD_`rKKxaO3KISv2! zp_d8NHZPvB!TWvu?FR3a{r;M!lw7h{fFk- zJe2KAhA!Q5f77`!^Lg>YUEZaG&nx8)$bDWZx0wID<^{_Yko&w&U2+HO+$0wpr|Jr2^Zq#1$)?Q0GOomug=Jis^PVg$<667wWnmfDu{!syr&)4& ze?t7xZg0;?vo??gsPslpd8sJ)bz>y!(=bZ`;+6c@4Q8WCzrC9(NL31 z-c&~R$@w-mdl}g$w>>adqYE$3`%~j>-+6tDQ%kwaDST>K-li`n_tZ+)zUAbedSHiK zcY2n}hyRya;CWST3rE-1kDgR_eregXx~?m20A_ z;0GG!9E=3gLF`k;qv>ATt`6$FJ$g$0rB>v<%%hW-#DRg1DuC)Tk8Wb0LUox(Kd}(1 z%e-E_b4`WGPvxU4Jax6_o5w!346g8UZF22$kvyguf*D?LV0C%n_z9!O#~=LYH9Y|- zMItWGHOr+G6*VL zm6&K81T=9|tE0*XS9w9-QUb9LfBYTw+LPa6E@#(dJ?Hzy6QUyKN7aML!Kd=Pu8x2+lDvOs4B24-Mc8}}5h z*gK$`g)JDH!MtoP*LG0Zd@w&=|C2Z4toaE?7LDe6j4!597?**0*G3G?!0OIuqj>Q} zw|l8KJddHm4=`(RyO%jICnLWv2E5aYZ@5^UFdBfKce*lw=y|8>r9g7t>2(;Wiv&`} zo!-GibT9R#m)`BErM8!XNqx7MYneNd9srb*7RDF+?45l4LT6enrXmZSX|;fi3%$w% zwBKt11ugWLbo|XSkzkP*R9F2eetN&xGXC9?s61}J-#cR@Qq!R%o3z;?uSsQzN7`(W z*W$oL0P!NP&@qReMn`(-;&|D9Z{f(rjj5Q^1dAI}iMK5FT9}bT3X`t6SlsC~M}^># z`0ii4H%30vn2HHb@QBx>c}WRrk4LEr>wI;1^Jl$uo7_>- zvVr!#)$uZ4jXZ0$7c?_<7coVz_VSfRF$B;*?*-Or1RH_1mI%o4yw^ORyVe*71zz#g z$g01`7y7D0JT*{%IvauM>%Q_){}r#SomF32`xWm%GY<1q=Vlx>M)Wb$D_)>cRCgWN`HMfJ~&dp{mr}1Vp=?1sfXEW6+IW(6U6&j9&y5iGUm%y~-9Pg=ou98t0H# zA%Y}FM2=5NImS~5n($LzCnZjK=OJj42*~oOSJAvw2tKf>aji4tK#S>*tj< z6dikOLq%2{=T&cQT;(h&w|dPhnIapD=JLU|_-{GYw|ZM+wR5D~=2f=Lb+YNo^1=4_ z<(%qL+}@b4jC9+D&$Uo_KKQz^L6~BTAknp)9AA6+#Dq=q!H&k>(u5oc5_>cu#}2Q; zdO;BrHq8e+y`Xi;Vok|{zzm_{22IJb(`(VHq*k+hu&Z&7X5>JSViV;g!t<+)v}sLNtG(d`;An|vcxU`R+&ioKxU#@ze@k8P?h@ttxYw0SeCo6lC z3W6a*;M@!WIrd79SL7uk)Chj|;^s}%tHqxir!)^pDHE4Kdi^xTnnngB5FH9=1~VXC zW}32-4j`pYQ>Io3~N4MwL0@z6?jvyIJeRC6EtL8^md!O0E(W-NE7hgy-grh!b>D%7^J~XXoNz&5@Y+*%A?1i=J!OfqR(>8#m>$2zq&ClIQYV$N=;8s($s zRO;h+P+Qft_?#l(D5^%H>T0JdhysA703fQacB%s5U+q){!oS+78i}fFlwH7rU;;WO zQFV!jVH$YY(lvza*op<1Kt3O14v;zdOSOS%dODxjm15#mKZ=K=|x2l%O-~D zMMV_rA?a6pB zs4_>tsqErIKg14iDjRFi0t$Uo*;s=XQ0$w^#u`LGf_3p%2def*t!vCA1LeBLOk#+2 z%ElUWMwr%#RqvM`8Oad$etdF!wRqV3i4A0gdtcdkC}|*hUma*7JwVB$`t;3>*9@3% zeSA;{HDUPrgh9r)^-0sp__p4SERn1-fw)e8Tqm86K2fR7@x~5J!ah+M)6>&pvQM4s zfG7rNS_ugMr;Z;8|EJD%fbf6nTqiBY+T>m?AeexTNldoM4PZqc>(ut;0)%Rld%2{= zbv{?h#GXJ<0UedN&gZJkjN&|n>2uZ2_!$tU&sEoMEU;9N$wymN>TBgywQ3wijGJ~; zmBpb=Phr}wY}f_}({@GJrXNPg z=A&II^$SL*{x2hRs8$`$-lYgTNO@T?!Z*$cAXEpM@_-oO8)pO{<$dFf0HnNc#0ast zdsejB6W>y;ZY}OfD8vQ!BotElJ&Jt@>GEWOVvoGTj51XId!@|MHLEKRbjrxu|NDeV ziu+#W5422D`R^4W1ei{P8Mv4Ck9{fuRG_1hKDbxexDRQe+N%yQEdX>u(B^1&L_qkV1R__VzQx%RvI^jMAg{dYk3G8yPgS_qcseT990$|#&;)N72 zYJXCI%t7`i1;`v^e^P+VLG~vFgcPtpDIlbP{Zha~O>u=B0UJJY-nzB&mV~4W9GWi}B+F z)rrlY^V5~Nqgh@cmquJ2R}50eRIm1ftX`{WF;-pemp92BYtvEqn)t7S)bZ78e7owC zbh2JqA)|A5*+oR@rcs8v=%;6P_u34y=l+o>aI zDf%V9jp-af>iv@6%{864@=Hn6i7US(P4{Wem=>du`%jGTUD3 z+hHcBXWMK24jprEVIs7JbA7`Zhp01Daecxe)9v+1^T>32ed1v<-Cmz~SQ<6gCu*jJ zQq(l&;Ni!~ZcmV!1UHDW%$(N|8390dVg zK{D^&m=q-Q?u~whYhamoZ}hvF2_vmYIUD_+##dT_DQKgA(9qm&d5z>0A&<>*zeClo zKbBF-=A;z1Ac3V3fIUcHg;|x6jZ!xI>?6vM3#63IexbjE6tdax)h}1nWe_ge78i%9 z|95UVWo%2zD5s2VNf{DG+2-3}J*U{J1hRK+$|$FdZGKlXtn-vIw)y=J%H3!xLWJe( z_?+Qt&Jj&0uHK&NgeBbccVXB!oq8U8jCp^vI`99&15Y6|=0N)Ir z?|tIBvRuw7!ZSblv44d6zY!JC{FKmCK=V^V!(k3!Nu3I4eiC(_GPWU9GcA7l2=$*4 z&7qmbdePdnIW*IP((6V7Inx5WY|g3X&`b+h!o6f@@@x~v{~4iPI3^FxjD#i+&5VR5 z56z4q@5Y!sG&6!;HMwUDO(mOff$CiKSiEY4D#Y84R0~E_LWt1mRSDs&gs>9ASwZPF zSP9{*04qrtJ*Qd_VhD5?{YU^rvlF5g3}CYZ8%F0TM6&}MMh8MPTZk^zL@kLl#77*h z{x-5DEH@-9En&GKu=}<-)e@E)0=pvwgyn{S9if>X0c+`rz+@#coPhc@CO{THDead8<|98;T z#Lz(h19e)SnzR}b>em|SIsCta1iGhpMcSs=XKkR`SKSa5PC4~ABZn4_o>-VLG2VQN zn$s}mBz3VGX(}euZ4#QkQ>Ld@YZIf$)M{-|VRpoMs#)1p?2Nxjwb#YVPgPxeuS@DH zIT}OM(y)Wg@mAdASE^&5w~`z(w`vT@q2YR&VwTC;a%02qf2BB2wlUFD=4TrdJ%wXq zP+^95@}TF&V2F8d0cpIA!LU>H6i}dkJp2?r1eA#%Y%)VY{Q7As8n!7ZMy5lX+z3EQ zirM5w03bY@WCW0H;WAnAZH}9tu6{jibHX4e0XDndPZ}6DyWS6kVYBpp*{zb7=GH*( zR-IBNyH#6V#|M!QXgWR+BW;zAFa5VXAAJ?1E{{zAmG|IRL8e9SMzLSHOfq*j9QhkH z*DLOJY9U3f-GL1y1Ie^IumNBoYV8hKE{cx;vES~Xt(jm0asJ&wS98>)T;{jm25Nff zo78$!?Aw3F0&^O-Ld*=7pTOGUk&7 z&%BVRm4#SyUU;BcpO6@9&I`Nur(P6*BS&$l?kZVR^ohfC6TNf7W3lF~OxmmB2mheD zRP(3V2GWnv?$(e6K@V*rz2$LRJmQb4Wt{z^YE^w(B2c(Uqv`si`BqyJo(RQs1Hb(3nx6vo!ojvrHB zm|8b^T-}5mk>v5C{&q>Be#-eZ_JmlULg6>#Moli%)%Pxp9yNY^9UyMvMH@R-q z_`1KR-Gsu#Nn=Qf_@dfLV<%3!P-oXw>|GdBJGOSzWYJeRFDg!%bkRg9YOJoKVc{ti z95JC#ci~0jYcH&wFqs?^ClscRs~bJ8FnZiXa-i?T$x_Duuj#1vl={i2RTw>SLVaER zWH<_=&Yw61lTB`HydwG)MoqXxw4Yozddm1wlN#H(w`iIBUp+K;EsaAhdyX1Eb<`#G zJ*^&flk5Mt8GB=oLeB}?MZ{r}8P>1W(8+%WjAhp)%#MI|sGP$-;KY3E^s0#~YrcA=d|7+|C z7mpfWtQ+%RDW}$rACHHLHwei@ioo5pBDxJH7RHXM8;?e&d&&zD2QNVe<(0|sAg{NT zq21*w*Du7CA-h~QFI{_O`|yCC4%4?+hQ!|=l6gqEyvtU{{uuShIjfTrX2!)DM4Okt3w-};wc5J4v8LZF$F;Na@?#|Z9DtrqyPy|y_^&vFR_)wgm!2jtSuTU&oAHjZ>efHLnG_(a{Wp^WWVQchSmDM~ zS?#|W5-~6qlGXm3VYQhVLMV)3&4Ao$Z6OXcMDK>`!+7%r>bc^(VcP5um$P5W!1`Vo zm@`EhQw#!g)NaIY%!Yr}u|reb6sB9-I&nfRAAA-D?d)sU9AHCWP7*+(Wa{x*$TqXF z0tb_b=O=Xn8-c450&;vVRdPANo5P^9Eu-jbD(VWuY!#G*(OcA%a9L zpB!H_Rtr;YNgBu3VP6EUaS)JW3yo7O6@r^>ZJb4V3W6j{NS3Whd;0R;-`2S9;`<1a zy365~ZH?=WJAT=?rfILJCC=}Bl_txV(ji^l@qw=z*In8fK~i@)-11f9x-&E19tLeo z=9Fay0&~<>8c`0pY?o;bURK1-$gne1ChP;kc0lK5vYos$wEHFMmNF7QW_F-2(erwl(#!-buNC}m`T=<--h-$qfRFY!xpv!N=BHz4O!8c?ndZr zPpHf)ubgh9p|bR$cM*(2kn^?3A zroEvJEbtVjy`c>(0Abo2+GRz#A^^58)Td341VFSeA>yz;(8d;c3empM#uk7O?F;Sd zLc(RggnD(+zg$)qzl1id03sjItS*3f$1fqPi*~F^%JGfq@kIWCJ^T%-;?@v_K9Aj(iw5T03)HKc?DXUBK^Mg9J`*^xD26Kz7EF(HuZ&5rB>t!X}*6Q!2e z>Phr(PQ+Huc_`IXsy8=2a*{fK_*|zBLduvM*+mJEEOVm@v!e<`ow*U`Vm_C5T2ral z{P>ee>WkmaPbkFq=O+|Wqxq42>yrhF`H_9=0~urHNA|4`WR#j8@z$4Bds7_Xwz%VD zR_(Vr2WYAtpfRMr8onSeo2D{;-`jA}WOah~$9ofB%Eh<^(6|K;Y0gE?Er1lX$hiej=e2IpRAy!O zi(CBq(EAex`P$-s=MbcU;eO{3Kp5_K4k6Lq2gM=IJf*30tOuP}fXD_kUID}`4?3@C zmX98eQqNhhkXY`+QKn7qduh{V;ucTDtEQ^Ge|W+vg^-e-aP|X|=Ly%QK$LpIwJ8w$ zJ>l9ENSi((Z7RL0nV5d5Gv84_i~u(F15*2?&VE3h+IA}-1ud0swZ!O3tyaWyE>RDk zy&|EIwqB9wDg~~H?4+%kZtE2hBe)EnKy+OZbu?>YAiA!IdiU4;wwW~bO4D!o8%0+p zrAR}sbj`$5N?GZe2`D*TGfD9LS=~%0H~P^n8^1&^D9A z%Ab#jj*1m4q?KNbJ6xfL9L3*g_M+1ah-NQ369UQjqH{qYn!Ok?#=kGIi3+jKTMfrt zsy_72ekt&dVaTN}zo z!TKoEGWU+uy}1~1OT*%#de8gg7N-?birV7p4kXhSS9c&~vRSia}uJR$4$kzK)pgc4n#}0ut)atW9e8K_`^(jk;?Bq(*p_tC5IZA%U|Z@=xaXTl?T*aOGMJ`8 zVEQ4DruinaQ!gNee-pJcfjA&W_$IPD-9U`6JBrMf7Z4-tj+%Ea)4tkV3f?2WdibzC zNdeOKdz_b&h646DF9lM-9`RD~q2_}28Xw|s6y2Nf=wlkrhjTGt?}vaz>iNbuY`yCNFc&Ytrhv zhErzpzA0Xl&Y6SIJdpOiHXWD`#56{21ZJ|S1!!|^+D;L*03EJP+b>?U0OhYub6iDc zup%JA>~zpc&tNr%6M^L{N(xA4r>Td0MyHeLJnTW01dz^7Gla^#GcRghpH}983K^C9}te4(tLShw889i({?qG*P{i{X(QwM+=NN2F*ltzi%t^5G&ju&0ll!u3%ogP z4~l`P7|>D4IgXptHVDmAsBTU-H=CgCm?{1N}?rkqLi!w<8*V^G!pWU#TkrJw9GAOdju@6vKQ(N*Mt$HF?0HFBJKht*YtT71?m<6R4(4PNH+XbZvNU$hvPxfnU1jd0yz~_9D zq*;abd69ts)i{fAAV{*96peCFyZh3C`Pxeuq;(OPuY|M!&im4gn6hxJq#Dr!Y4vD2 zz^^&&jsR;SG1dfP>j%>IAQ%w32h#QfKp@3EkY>ZN8Jz;i!NLd9y&uJD(rZP)HumDQ zU3Utu#BL9k>?Q&jm!t#fqeb*Y(t;!prGt^W*J=St9{w)@b$BEl9A(>z(fskWT3Tu= z8LuBtr<++b>frqoNz;HyfWSl;DkZuP;S=ei4Kj&@6i=pYkY8gXFdHLUK$a)dc4I^Y z;D)sQ_(EfHATYZwTA)*~>tZaA*2~iBX>EBio)-|3K;kSfFQH{_{NXWl%VdC*@dt?I zmr0K>mggk|TlLc=%j@sf{+(Ff)0SUu3@vs>0ONle3yNa-6=GKzFC~fWy+4%>Mp#1= z#aoqDt4oF!E3HbWB%B2>7|AQ zJ)iD4*cw{K(&y8M4zq@4$_(4^S4xIf;^J!(Lo03Q7ZMjo0ON~^p_TUVmlB6YK#G^s z#ga$+`RKK@db4C`>BX<5(=DypbiDBObWpH{Ht|9PCiYZmv-WCi9?%s zAp+;n5--I6-bg%}_#nH`u5E-u2%Mp1va&91138s? zWLlTD-+2T5e38c-lQ$mC0YcdNyk9c3FNS_AF*L_Aao4vKLnA=JcM?PU+R*Qc{~Cuz zK#KR0k%KP|KTN9)*3S5!yuvK6;VepOVexGB5qOJlP^%(k-Ql-IS=uZUk>tE%(^A9qWMr{3**080q7J|c}v;` zyhQ-T*0i0{YitDO0H+p^V{4iNoTep0vFo;^Pk_mRz{F!Ehe<&^){MwS)cz{1c9-lb za})&5u5v8ltF(=JRqA62U!_}_i3Je5ekBtNV^?-`AnUrjyE^(B%uyF8wN`gjwPHK*>RLYr{@6u&W%}AzWM~xxW z8cMWD4sU%QKRi!$?ESsWp!G{eFAN$(a%fnvIev(Lo~NqY{*dGlXKxJSD`Pcq0Qr7Q zH!*urmAWN?t`KR2AJZ)l$Sqb($Xev1>6z3`4X59tdU=)8GnuN~!?N6HAc1nX!`$jcGRo=8d2QwA{>$jcscIdd|$)*tQnXdNVV&8;gJh zS7ice&9p8w_oluSz5QyefqlinFZ>K;nyV`GG(|f!!0t>d@c0I zb6uv=%(#JYT$f?Fai!tF?l;Dl-=?lQ?8byb-i9|O6k>)O6AF15-Y66wc(hf^d^A6k zS`Z(9yL!K3eunVOWzEs9rBw9!h5>h|D>9>>chpFsem-LtR6wYo&$KZ6i9o2IHw^%V zwDy{enx8fEZ!oFXWLRQeou<*jQpko((7Wn~_<%*~-C*MA(Nh|}TcjRPMZ~6=bTT}9 zL&kpIqy;c-$W)qU(*jD~kYS{erq%*h^cynmdgUr|87sh68!`v>%)Ke!F-saqHcRQN zRAGeP$LB;teWCWRqef3|=;a;pV`I2-h+n#+AMd@m^HF;1U2Wzy){qb4?dxL8$0MII+w$RaY%+EusILaGsG zTbMmTEkKJn%R*ARmI%PNWP_e1+sHc|LBc7k$y*w8%3S4^YzxzKikd@{aQ}}Zh2z$2 zFrY*#?=J)isVppSZA>cfuv@b&WO88INZw+%X8ZM*vxX{Ym5=VqrdDOWstsPFk9j7K zi?=?eK5TYZHgiDkuefF_@tTG4y2sVu{_7@zm~CaEq(F*Vn57rX zTcVYC=Dk_9(t0MC)c0m{Eppe(_sd`@V^RFT6Y7TIB3CIbrc#Tt))TdWoQty76SaVn z7GNtr7{}PU@$vE})sUlkY%D7T z;)wS<%W8opXkj*iwE!jV&$0$)r(<#Nq)S@(ddEXy)q9ac(9LCa%4dOfV`@@$lC zlvZYG%d^ZT2A9$zSrL!>w;DQbMK&sHlvYf%BFl+Uad1%=e||b^mpvLALDCE|MSD8i z#H>Jd3KV%dORQfUTnni2(=&6+761K)-16X$+tuq|H2mpb;T)xIQt`g~!zZiq=j8IE zri`A<8K-mW#?+rnn@_Ht)FvqS@!AK%0hJZ@;qhbYkI|2+m&A`h5S|`CGS!7VP(Vm#o>x!WeYy@^rShh9X*Q$80bU_*<_EL9oGuh2v!4y_6N4iE$D4aLKs91j*$JA=;C!fdpG>!u4 zGgcR#UpIlXUsLMkP|$fJPC5F#!uW|7)Qv9G)G(fnn#>U@PO8ZXq6;TZs^xr}RIt8q z$;2szQDesFCr1><)=uR>)uh_`i#W5zDJGtFBk}mUKi7`GM2>o0P&=8EMsi$RdTZ=) zE!sFbvv!qRz4+(O(dhUvFN$hz_3VWLJR;?-Ub~+9WeTJ{Zk5ZUPSzQDxFG(E7oA$O zfJ^pl8X43Vc*MEo{YzgX%K~m{({Wtgk8Y2*d(p24+@55SPIJ4LHghA=kmYu{K(a^7#89ECgn==#Da>W$U)t6i~_+aVABp@EhjY;NCE+Bf`>Gd69RhRyDr+4&7W-c<#1qpniRdp!2c zWLBetD+}H2X&@O&J^NXqiL@;A>{n+%Xcx+LX>~d)M2q51essYAnYk?TxPVeDNAyLW zc&$vZ14uS~`_VF)x#&>K;`l#))Nq9Kw8icU8y-Nj*ef$9DuB=|_IjE_NkC{8dj}uF zWi!G8S`x2PQUAeWizP|vVv8l7o!INk9Dz*iUy_XzPl{aXsn%7?{kZ?3Ub~`g1&+v# z;-K8QOauNrVd7NUV50V0-I)p(*VRttYkqU@=ed0fr%WWRIQajhaY^*)%kf<7aegf) zImhT!W2cNCKVjmS+CGJ2CQi!9WJ69l7JC=!Q-MkuXe(i zbH~-zT`+F)dA$qgbCgk1b24v|Oj;&%qmx}yI~hI*_=a2;R>x^Z>8%q+*Vgnabf0(; zH2Gm0qSJ+fCfz zBvXNBJheJLGmH*y&X+Q+^*4rc$ri7m=i)oU=$JvzdG;GaEhhhS9NR)gSw=>;m%WVnY(>YDUh!D%h_ykm1I-G}1ead%@@78d|4AF@70)hf ze6jGW9)WL@S9&tge2BqA{gfA-eTr7Edc;}9wuCX(dZ~A;ZKX}udYMl8l1v?VSr`8$ z9rdkQ=P9$sHqn=LUbWeY1H!h>V-ol~>Zl_xZ^y5uqjOGu+YPWL{PMO(L`M_=lI3l4 z`JKMv;yo|*rBy(J6z_SN&bbR<3#D;C@YH(l^gA7A zDBhNdjvC5cPiEPt#SncYH+@MfYXOCRt)f%njLO*Fjsl(@Uo`K%~c*dq{*l1ED-FDN0djG)a>@`#+JFVW4G7YeEw#x z?AR^uDfz%%U)k|p{6%?mY|VFWeqiqA_|9u*R@Xpu{!XruE9fksAL4VGMAgL~-0O+E zE2#Ak?j}TYv&9b{7Z!^F&CM1+cjutc7e}Rn11q#EG|G17^PSw{p_hhwir3B3v^6HIj;M&y9+kb$8~@9+M0O}5UQWO{sS!)@w5G& zI>A!OiA5Sv#HHU8oaJ<&m^e(_HEm8IfL<1}}9Mx+ll0v(eaYUH9T({*?X(=^q_^g^Id zP=A`@n|Wg@PBl(X?y-?$jX*~w#~Qil%4~5*`dH(1b%5&=a;$N>>SgZVjkx9|xJ;Fd zF5mA09a9sSxadkw&atUTVzjzUwR1+74|p$AC8P5J@8zmwboq!E=%|`Pb-5}tuck=J zF+NU#IHSu)yqBwz(fNk=3Z;&)W|Yr(ui&(|qiP1#74Dvqh!1@Qb~FdyfKXkbh97P% z#do|j5~bu*UZ7*DfN4gelpIf*ktijf^3D*Y063OSgH^p-+qv8E-Qg$C6A&fVvZYE?2B+E^z?*M&$JD30Dqj^d# zh`kn3kLL3fv9*(g+PpM$7C?B5Twrpj%}9dz@qb!G z!%v&9?3TBrlb6YSxvWH9a#}#f`EnJAOobwO``)J1Ka_dNfk}Ux;^E1fSHF7ih)--8 zojUN2L?QFmy(3Y`ymh&FsblU0n-QYB;#XTnCk?zy+0PB2*9zUGs=8W*%v<*^#eE*e z1guP0QN<^XsKtTk0x4zp+MlYG&9pj6D`f$^wC61cB39w zs`ILnn(}IXT;&eP{Yp2Io{v4Lfa;n|E@N&Qds%hqXX|Y4 z8hcp{9AtUfb9_}_2xo?IU%pv+Rk31`Wn|=YEf?4A#@DxxY6iZZ@S4lJUQc+<^9oCE{Qv&s#82-wAV5ITZgFGX$Z{r zfT$!Mu#StKZJo?5UF+0A2irPvPuDw2y`gkv22S!><}G(+IuQE z$kLd*xZYC-o4x5BlTS)b_3y$&0d`n<#|GqR1M??IZEdl=+;xZsd@*8;Emk;d&2GCCl2 z#ULQtr%5pgDCScs#^|T-Z}^N8Z1JwcyT2dE#sjx1ebaxDqXPNpD}A$^ z4z}t~rrb?x+WEMu%}fG8&;rfZ6+l$juG*Q<9S~)=n@bb*Rc$*}>Km)9{u0VvQm31L zm(mM4rkX%#!DjJiykM8RLDBfYF2w=R95!Hz{;f*MZ(DGU2gQG@hzpBxXu>@z^@A-> z8gP%Y@lM@*+_`2Z*rwfpdiq_IJ2y!Dy=r47bEeV0mjOj+nd$wgQu{2ed^Pl=GY+5k zvp6!<(BJ-33!wWRURZx}wID6V`AKRatbE0@U!|t|{LF+@M5fyN#X4s)+0mczO!MQ1 zJ4I&|r}@^{=7XJSzBRV_U}u`IZ>UrOpUqtEr)Iz>bb7w+XXK|@>}NAq__hi8A_gsi zr4M8%`U=NtzL&Yeu{O&WqnUo{YD+6~@0q^6ZIQ1e*eCbxVjKi5&{Q5s+N*qf2_}%r zU*+4%^O?Xkerk?om3jCzz76hk+MmO|zUo_bwrq}G6h~d6^9CR=>Y8r@X8Sh4Z@vwf z?c>O&Q&SG|bH3MCy{kq_=)HgZVwb4HaR|&hi^uwT8*}pt5T&m7dG|<*aPIy_KXs>7 zO6K!7`nbpv$*Mhjoh{sJYEoW=(()%G><5rsD(2bDP-fAe{wtN8GA=bV#o|e0~_plq2ux zJA7uo7D^(y$LTk(+3 zvG_iSI1=%wpIR25&?~BG_NdRLx$=`g`b5Oz@s+)ZWH~WKKXl?h`?h zO1G4PpOi|UH;})H;BeEQsX9=exvB$E>Pc7imeP1jrRu*wh`%Lno@5l#rOp66CF4>t zz{7SE{b@h-Y8=%>4>fz5vvNeU?Uwnf__>XY6A3$XEHChnAK#d*rKpJ~lo^ zXQ7zqeC{?L96!=0>Kp&LPt>9Yf$2Q0wEoZe9F#GcMgQmgPMvdq(3#PHO}w~IbZ(zD zu7|YJ?Xbp;EkLrYk+EftIBY9{uf#+8MmP3(#aB)#@xE95mgbN=X(W-)*@k0isMh)D z4L|ixyti*Ove_Fxw|&a*gtZn|dow<{UvzNIo6c+qA$rr#nvMX3=uMxK-BQ`sV$-+d zhxz$W^)G&a1+|3` zlI8<jQ+1d-co)7>I!tXhs1bX+QR>%?lX_ z>&HHeBpJi17_UF^Q=eJdDw2NU+lyhVg!WTknIH@ZTA<+plJ---@8Mc^Ahe(QM;@g$ zsuF8$^3`$np)87k=F?vu>ZkpWlBWj+VDfJAk2zMW)HWY&_EXq zg)P4N(vQyyqrPpxJl^8l9T}jgyv>jA45Q)0HKb!~bJss=0U5UWc56lpD0`c9bqRU2 z#h0S(zS`->2M~>K4JQ3|NiS1tpcJqperRA+Q{3U(jTtQ_-45Sw%xD3;JAAt_(^i5* zTv_+6Z;h}UmnB*4~Y)yb9s_SmWh`Kb_yYxNlcN8^n_B#b^IV5B`#=b`E|gZP(2qNDoEO!CO`a%PY=<5fHT zrOM2J@k*NHKqfjtYPK}V@Z+wLi{hk%A1JMHZD21}20;uo5nLdI*9P`$4IoNfE7!vv z2Vr{xdh-sA+Qt<_qQ1pBfxh2e1s#~X1gW|9R=N%l+!)xakUL0WHwE@L*FY2oG}9>{ zX>SVJb=5TnQrJxa@A{)DtiYj*Al0^NaKRn{sW%(eQzlK4`*kjepBfVN>=_4ol1;oR zAKe|cS6xC5aD8b=0__+LT6lmdkIUvg33Z!th;F~I$CI4nA|c)xQugd%lr4J6C` z;?^?!cgaT&2C0XvCS6GRU|?tKT||>5f!(w zBuG7BX}gm25m&*kLd!*jW*Y|tEzr~tNZLnT{eaNwiwLEDU8R1H#|I6keviBQArz^r zACN4MyZUwG_*jryW)P6D$T?_XTjn)LpyuCos0u3#Yv}@!7I~g&7 z(5?yivP~-5J0HCiq+YeGy-E2}km;NofU>=X^_4(%t?JD6I`LJ9N4<{&nj0i}NZMBd zdrc7#)>i_%9 zyfkHGsu8QLWALpS8hb}XUE|x2V9AKUWfr@w3$o^eQc{z7UBHKUQo%m?=$#<-iB+W! zDc=d0#K~E+KBCHdaWI0jX74#Rgrs>d$eK4U5VrRM-nhMW79M^OPa6^SsrkU!qK|I4 z51cK4WcfgBVY2Xw{V4uWvV7#+q>r9!^QgXJn$KJXLHIb(I2e$$p9OY*9SG}ZfxdKxfHd>lFM`xoOWTj6Uj!Mm z&D~FEw>Vl5v_L}(B<&VQ3xsxyqwSxMz6?^^Eo*;Lei<-zl3vwcSiiziwPE_JqR@hk zGx3zfUj_Em84%j9oTm=RM>~SlH#qHZ-mJO3W2o%Lro3<4#Q zlp;S^Jy3l0m$?10%{N@)*q;6gO`U4{9Sb(PEX7T<1>zn zx(%2S+AqBa>T?n^!X9Q80HmB5A$FEuk{&3xeasA1pQ`ThMJEOA;+Kz$S{D(R=H@X4 z&J5d{2rQ7yGea8`9F&h{g{d1u6BHao%2|Bir2Tr3H2F25eQ|@R4$!=~fuy}Av=b8` ztk;N2(j^A*$um>Z&`yp9X$J(F2oCsEzr0rkgV5- zy${ii1|;kC;ZSoI{UA|sPH2B;3gY}SnHo7ZJ zEeyS?KJi~p_Ya7VJt=D6>@J~}=)fUDeNR03q-eAxw{ib{qr3^oVps*|!=Z2kjpV z)vC}048Wv*Os=YZT{b1bLfQ~_J~dif-QaGY(_%VIgWNtRKTazGGA@r>|0=q)({g59 zdY?#(Nw+-2-`{kE2v){V{wjLw4=Y3a1*RmF9=I~p8%ii9bkBx1_y(f=fX2Cj`l+3+ z0IAcnA=8zY#X3XT4h>T;$6x$9dg-JW!;Jj&dk_qjioE3R#{%W}yLu z@uiT3#%y6cG#|YlrZ&YtpB7!)@AWWaZcRQ^jQ2*U)?4F&A$dcLcRn@&N|Ed0Wv54D zI<0fI(_*T+PHe}aT$7ND@5M*_CVH_Gw^f=;^CY2sHu9d_JjlHuCLw~4;@-cF?l|Wo zcb%Xl6ytp)m+47W50!E^IOBn+D$p1YNMRd7Ydj!T-5|z0LTBaSr*W4vq9gl$>U`)> zZSPN=4*|*Ysrb;jKqjDFi^tFtpg__sPc z17X@Kc3v)hVVJb~*YU$=Mk_je9oo4(LXn2)3Ozgl$@BHhYtM=ru01O~_ND(1Q{$_1 delta 32846 zcmZ8~2bfev)^=Cjx^=tnZci z>)4;T*F3jH`JL-o?`%FHEMK^dH5FCEQ2x2sjeUCGlFO6vQ1tEBw^y#Ge%#64s&XjE zJsdQb@$r3gpY4nPKifBVa`}v1EH3zST)nuP-JX{hX7=jY=Z}5*_5Ewx)@|G8{;V$S zX3thl=7$+he%%#+$^9Mw1nQYR?8)%t+g=zX{l>91E{=%~y zLb?8un^_RH3Q48n_SnDFgk!8#_U-XnVdqc?#$!qE4)xhF*0s|eT$7LtD!wBFH5~ec zKzT<}*9;*KsAfUfT*tBX<9Kh2af4HoyRteS+Q8X+S!*hu8x$a&34Iu?OVo zDo5HLMQGF{d|bzdx!tQ~oM8X#bZAr*vCEpb2w{o%hJg3;V*5!VC-%M{H{(4Ov z0?GX?T3V7I={>+pQubQ_mIu--0azZ$sPDdk<$_>kM$bU>$7|IIi*@3eN$&}@=M-zz`H6JwOeFq9M$(4QMC>Q>UHxVv z_7ipLh0V~icv3#eV)NCNr&%F78&AM&#gi;v9WjOAXk%go1xzzhc}6kRz6}hfQ4G~@n1IGG-okuLaSv3$j>-eo7>0IX;-XCg)@tma zj@*o@lrn{=7{Q9|M`5625?~t3&^Qbeb!cN5T8D*T8p~P~w+yq1%8MoC(~M7Ip84*f z8xv2nutr!rl=PWuWxQg)vbw49Ok{>RVPM3lkMS%k83_<^Jj<^U36RowR;zZJ2>~WB zQL8Aku-D%Q40>c}+22ahAv;2e=CTB1{Tm5#HEyAP%t&2&o=A#$YRx$|>gIV7M*=yT z7xgvhjRBLczd&~kSkw>(!ZF;*7g_9E#xPKLf?Dm1EM6z1{@x=6E>LsNvm5SM;K(6F z1{b*I35X~QSiN>SgMc7kz&du;t<$5{`7+}l+SUn-&@Z#FYIqF{9*~k)tgihpyRPSA zr&BFP2^Kq@Y5^iHX8AR>nQH+OTFfxVc-%4}z-#LJ|FVDfdaW`O)y``yD?c5PYUedp zrA{OO(`&4-emI|5Dzw74)Z7c~#cSTGOocg%c&joMS;Skcis>>aQ<%9xfG*=pM+HGS z6ZHyKGBxjaR!1$q$X@FOiD}Uk2Xh$&$;wOThbp0*B?}^fCaF_5M89UV29xZ>S)})v2_z30^ZrU^K zuKAJNI<=Yc%Pw0NB|u%@I+jt@GEyeiv1(?R@U-gJvHA_d%ZWk2@IGUFqw34~WqF^m zphnn(bSJdMZBTPL@Aa1rOyrm{lNf1kU|82sS4`nR{{<7)ZU`HJ)e;F1;|rFT3?~|; zpecRD_*T|cb@ur9GW>1Yw8v>|{EB7NwmGK?{)*Kxy)3>$HD6ILYZT`}HCvhN;vl-p ztt_vW)s#n?+REy54sWIQiVEMR>Ii;&$u^c{`V7yf>H{=W4M5~`8>?C)Y=`zPl5!`D ztx+!v-nR8l7O$-vsvv#sV*I>qsKDUZ#e$6RCa43D8tM-!;qyQJ@du|iEe81yPHiMW zyxmT18XJL8n-(C(Zc^K$mKk`jN=e>Fo%ea`Kkj8B3QW_Ny%d;ggcPq}Xv~8kiXjo>U^+$$q^QiFF;Pf!(%1$;RwO`_pIL5RIuTgIp~?l0BL)Off#ZmA zhzh)pTOFZMpFos?cX;6+``=f5PwAkt2g`<)mY)fD2Udhnk$w}1e1hfWV|Hxx8zx1C zx-P+66;)I&Nr-S2EWc{lz=q36ic@NCf;UQ?s?3*xaHojR)mLUxoUW`R%&tigWj_-! zPP1gB)vTmAQ`vyB5CeipMOlb(hUHqDcmP_>PKsZdsGe40Hljdax>TymY()8$RjHQF zR!&l!tsElHpf!l8Mdqi~I`&I9MU z%3<>m_M9myEDU|KyukPr1qCYG=QY*v44(aG2%PmG z00@6)Rb8?43}rY^D*_ml5JWMk&l=7V;|m%}C=m#r;%Z+8-S23 zhJc_N%k!!`2&%EXpq9-P@;)xg6wQ?ZU8ZQb7#A^7$25-Tnc)c&VK9xOOwFdw8`H?7 zV9%&GviRKY&qN&5aX-T|a%}R{aX-Uzt2l^A&+zIs!g8)Tkp9&2@!7mH>ozswph0bOGMng15pUyF&Pd1rA zj^~!I%;ov4I|ezY3<-|85eM~DbGe-n3NFDhmlrh%pEAloFZF`TO7hX&Ux+9IP`nW7 zlX|Wfc%G|Anw7u6;j}qtD9~*!Qk#?fzo|tLMI021qFhi{wkT2soDG0=$rD30f?n(u z&Kufd!rMU5l?Uzyzzk;>G{b#`*Dy0&Lqg_ zv~XzIeS`ZC3RT^zyk`LaUFnc}LseFlUlA{Su=K&ZOCJu^TUB|lxcM|RRKHh7<=0l@ zD|mO%x;%v_-A9qJz=;8v>+%FI1|VkLMHq$sr2K@()~jAMdHvKU9HTIm*{4>v&KWci z$_!}u0l~k{X%7(m>s%`X1phkM%6zi+Po4IFzy#=+XsY(9(_SNd)}gKX073OBsjmsL zDwA>pkNu>=0^T^afy1FlS(TL4FI-lEkN}`b01#RI!etc@{9m}N0)qbwmsLqw{gPV` z1rV439TR2sOPhi(e_eBiU!|jV|n|io?u5*#PhucTi)CSfRB;`RKJF4ET%Uh=o z^0;a20cr7PXH7sz2GCR-AozcF{D9#9*;x}Ha`>~erhv3~$PF(*U;=bZG`bveeOL;g zb!a=h0D|g}8(spkrX!pi#}g2!038)s(-EFw`f+>((-B_Vm>wXQj_}4!u+HKlo|Gqe z>@;Tu)e3u-4ju4t+1+sR_gDMs@%+>Y9w$Gk5OGpMg;N3$(gQT<0V3-aP6>cWufiz- z5b0GoCB!K+C%N@70D%e6F;SB`$ukN~lfq{my1sES0D|fyhljyr3Q9P|t*0igl>q3d zNC~I7_0-@im`-u)sR0DjDGpCfYbYU+lxKNtw8sjH{znO?3wga;&vN)2D7^$J;WwuQ zAY>iTqz4Ek{N|JZi1dDQN&rN9zmXCYnR|kAb3qNR&u64AL=AafUa@qDvK5Rw%vRkyU@XSy$S zIe-v3SnAnnCLnUK)JvKU91uBJ>Y)R#pbk8w>UgJoLQ6iBb$=(~pz41o;-Kn($4eTw z1mb|>9S?5mg`Va>{jV(VR>BvtTUSOLRPigFCPHoXE4^IP^Z~)K(rawG4M1pOrPs_X z=K-OKm0tVK*ifKMBJ65)X=~o%_SF$Tt?E}t{A3NQy>nI z(uSb^+`dP+->3oBvcCM2)_fqlV||naSxWG(BxW@Ze~9T;HC?lwhq z;((WQ3$LXjkmq27$2Y5|+wyDjHh4jP*b_?&$f**)Q2X2R-bG({BB57jS`4jz;bmrp zSK4q${7coh9q&{0rDxZ96pq#^UwT*yyKump)cXjR+T__)Hie^pdXtBBIknl4Drbww zyV}f>zZ=jrG<-xu+v3@IBOsFA;?*$C0ubfi;x%zqM@GCQsyZ^_EmU=TL!(-7Z7(0+ zp5Mc|Z;z6osrL5B!f2|!-LoA`sHfW7y?XV-uc0F37M%OaTXy7s=Ba%V2hFwjMb$%d z?R}Aj(Oi39WMKiaxi89QK$MhCqYixh$>Xl>$k`0&)Ik&SpKLlQM(0(dW3%I;Oq;tUI*+q2=A1-}x$ltKd{?NdO{(4{O;L?Z72K;qs>BE038&Eow z_PC+n1Z?ntmyu<%tR0(`AuLD3Uoc<yyDIf`9B)vpXT;Qqx{p{{-~F0 z)?kQ+{2%qOOGv#dAhLhdD{SK+vVYWT(K<}&8i(hkLfzAqKk?TLq)`#2flW+6+k=N3 zyO@Bs2M0tN6&`k`O&S?Uqrz)!dT@M28Wmof4&ie&^o5+ei5 z4roSTS!b1z1DX*cJur|nXM{*+CkHem1hVs?(G5H~V+0n1udCOu;Dze5%ecBC7laTx z!dwuJi3oE+I7Zmza>#Q*I7VP8_qid2%V&a`e>q>T?z)_d?h_)OJn&42c*r9(K_p%O zk_Vm%qD67I#_%MQVzPSW3cmV^B(gI(qDg{gazv8^&18`t_>!QRETAUxorgRh4h5mM zFy84(01!=$i1N{8O%>LKj;|n^Dy$0~5JXdn=%1RX3LFc9cPSXG?s}AWP=D>gFTcDB z_#kw8ssg_0!fw@uybAcH3%eHt2)^k8dqHCuHCz;8w%Xl;k4w!K)>j>BUp1idRRf|$ z&KB@h({2UM<}2qg)xB zCJM{S5B20b`EAQwSs+IKmI>SZ01<1M$ThQK8%bbROwA7v&2O2oLn0uW-!g$A@i5h7 z2F*R*SM{#qM{j#SN`R&w??(wx0p1t6W;+#8kgNAaTeFV_hy>mj?R(ku7!r72T-Gx@ zW)eVYSE>8@@Dr(3Q35pdt%?$$T&xndlgiNZl2rnZB2xmIm#h-?T04jYR*B}VwBj?M z_>Tn7*L`RP^`Re$j7$?!_n{F?C8)|YrVclQYUv}9Z9HZ`{~y$0@zsRY2+n<-BRyaL zNJP+mohP+Up`Y!7*DaVV3vV7+I&2`$S>ZqB71!|lx$1KbpWVw8jHcEIXiPLiZ?A2S zltPoK?IPD~c;l;P#V%q)*c%mlr<&K7H!j{8m6u{vhRBwN^=yn?LLD8(YqiUuA#Ya{ zkLFaBA>wKHJxwh$Xf1J|{EB`YhwKhSxutp8fhf1caX{pnULJ9f+XJGrncD!O3J-{G z{q)q2p#I#wukHvk$Qllrj-Uqs(mNETL-U|Rt|P!#q;tr11b`qqL>&Qb182}8@2F7! zKF_ZH0|1DQMntsjf7JB=_zI$yHw#|43%)#p7M7#SJmm;d8WT(O%*`68}o#T1lgyQ6%x zGTJ#I0q_{#?nh~is1TUlB`we)Fz?-JG=cBWmY3elzhT{<^{xG9YKQu>zU|fkDU_dU z+~9!F#Irs$F_ZenOiFZ4`J=b+**rBT;vfr{o81co-}_)XiOTu1;0E$90D<+L_+H|_^ndjABUNt^RvtOe@1+j*lR{Ao6R^e5zQ zo{t4VGp!=M-SMK@aXW8O^kU_3q{9G9ocks`=L4*1~{uq40Lx=W<_wU}a(n0sYZG*F#Lx+_O8dO*c>BEB_E5wPW6SP zQ@2()LaH2_AeWx{?nf~Plf4ty&*#?CJzJp>jSDL^uwh?9~m^PuxxPQ zL;WAtiBkMWko~5me;-i#(6GWs2bK;Falo}~Fb=l%A5``@h-`|coc#w-xc+w!Ds6^? zPNsUPd%X>6N@E&yBKxA=a+PnlNHTT*y2{5EiH%Hyj$gC6gEZ*)aOS>Fqgp2QiEGuD z_wYAwTN@=nUEb&(q*4N(`l(XVa>q)aZsztJx+^9(@nZ}b~AH!iJAYD`Kdl$k(Q} z`GMJ6%*2Kn8s@jYFsD*9MlukX4Rb9(bNbe=QPcKdx|`TuIR>?L2%;F&P`6i(0ldQ( z=8#XONMUJ@D3F-_eoBPe><%(0nn7gJB<4Hc9+U)v0RcMGq@z^d`SwU6zJlvJzm_u< z8ZE!`n=}hwqt$#S3`y?w`BC31n2mjNI@w)5^nSSeQ+xfOx-FAF67{1mYTItx9Djnq z>^*}-@5%n?V~f)C<2c)b<#<#kU?Xrvf&fL@M@4cmfPeBuLz_klXIl^jl6vV>Nee&u z@Tt2fD9irJ*`j6$L6j{IG4@x^7F2a0svJ){3?Xop0|8ZD041m;{ORU#dWI6}iBtSkjHLxkf#H=9mC&>f&NGun$h z?%SOJd-dOXg32gIr&IV`#8mI`W^C-oc6Pe zTj|+pCWjm3tgn};>arnRb~_spWq|0cZ&#@Z38J&UU8Mqo=&WxircvxKh^QLUq&O=npOUd>?4+0+Fi%NLipd3#MP2o1wdZfVa}WHDN*XP# zW&oj?(bDP`5D`a9t6M;5X0(J4ohJTSWH#fZp7>t@0HSdb5$z(4lUBv}s>50p1A=Ir zv??ZV(F9fT4}P;+{V?~hnjo#7v$UQ8jh+Ef#0k>Q`?HgBl8n7(i%7nqNfJ8*cOh%p zRKzJNYbd|F`xKWa2$9efY3I6th%!aynk_m&v1Uj+89)?J%#e060En(JEjV z{@m?4Z5r7Wcp;g_W!)D>3DEY_LT3~Rg9H{jqX48h&M2~JlD60y1%O7@x&T46*ck;N zh!#t06o4RF?2Lk3f3Iqz=$lQ8!B?G803jNnF$zFvUl+!QA%xvwDY(e zUC%2dI(6z#0g=%avc6en0V1O-WXm?X<>pW|uQHXS-uMTXT~|e^P-U-jb%c;eWtFQV zKpoRIT=J`~p*p&~&l*=fIl6iPP4xhxENfi#Ez0)2bBCdDZ14O3QOLX}=Xr-G=irHG8_XOX?Zrd7hP}AM&)Q3P6 z%GEO_gOyIP$R(wS|r=7I| zBAwG@tz=7igwDFAI0{YiY{WxN@vJi?gapr7XG(xNrfrI}lW<;DjN-SqI`6C~Pg@b7 zu_8cZ`aD_Dcn?#AB&G;KYmWJ~wm8xPkWL8Dfzm`YN!gqjaC6oI2!w#f3;?0li9trb?kNGm zH8H>~4eB@n!89>|yGoz@OzJ`EIaT^JpPPCv;-DNo7g(29Qk&9qf!$I91jlm$ZZnwN zKgmv`E_s{CvR8 z_FhuEk^vnRxlf*tGDVBR=Yu>~HRMWuo{Yg{3N@nwdzvVzeaV21sU3MrRFo@PEvg`C zJQoNJDiz>3(Jr#?d|X@#V*f3Fdjj9dQZK@-p;uV>)O)=Y@Wp}g*8+p(r64c|%mK-E z76f)NtuX>XU{;t~fcjhz*cB!T5MW_o4~J`P1jc|#kfJsG!XPJC+dN5tU#=X5I3S3k zm=Kj>pmd7@VeS$U1Jy1B<^qZqfOAoRK9g3G`6z~bCE#yj+gcx;h5%IziP0t?bp1+T z&lCZI?v=n^Bm+cpuLRi7%0Z(5#2K|$f|hSWYt(82vCMM0@1_P75ekH174o4E9$Y|4uTx3M(qt=7F7)} z0zhC~4*BFR2H~owNc2#lv)3lQag}}Jfw;md8g9MS0biR|G-+vd5YX)( z)VA^NeH4hMCO%;VfWUOxIskO=QGnjX#Xx{HPHQO&LFI(RsSN@|SrcfrnM8m;jv9sW z?m^%hh4JovY?=|7ICA|-z&E57O~Wt*PR}$9e-h9^#+24973!0qekZGF>PtTfx^}aQ z#)KJc-8ZBa&B?^qMT+KH(Vs>p4gna~M~dd!!as`)8Ulp)JV>Q28eYVW0pF5VG_~T5 zK~UAIO*;_33`C(-v~eIpV4P9;)`9qCfMu#tw00nFa*Cz^q-O}6p2>j-``Z*L8V*C8 zWscf_aUeqA+5iMPgl+?*Xyp2O6xI|z*od==PR!hl{f1&l-3 z#-ec|4QwUb(~35C)*?mYoFB~f>qyZMfbyG2(VkZHHnLx1&=4TRw^7eQ_t*mdgVi(a zkA|?Ff%R7dQa8UVohD%ffWUakbO7jJSAYeTQ8X@_V4@xMz~=G^1g-~$05QHZJun$G zY(6Qz$Al$J>0FWk9FUkjD;+`y(f7GX(a84hfbUBynucWvoT6#{ygRTSYlH^d?x2?0 z3;={d?+$Pl+vu6j74HsO?}H9fx(L_-hDGm57aEup{hvtD5P))Tq-boUBE*k@xE5MK z1~D&?`vZO`ZND^}?+*fV9}S;Ltp_44nrjFL(Epn?fDVBo9|)`moCKga7}!a@#ztUH z1Zn|d91L(G(A0!adi^^hXd>N z%GcZ7hXd@knI4(uD2HicVf2bE9*{LYnYLe_)OsXRtFP61w2~mD^?EGQD}ta5$14j+ z(I*1Y&swyvExIBQf6zxR^5HHz6>xJhBAGn!&(+2A&p<(| zz__>|(+qSP+6$ZJ)N3b@j*DlR_NSxhI5o@=qXi%x7sugmnuAxNY>tofHd+rr$Rwa? zDS%)bAGh~y0Kqjr-q5^N00^e>@m8(F5#%YTqC2QbYR4@8RQE{{2hD#b#qppDX|{?U zuO`Lw&GG>d9FyW$JB>CR(EAiMb2cA)>6D0qhW05D1*u_5M4=Z=M6r{huBs;Gtaxm; zx@!*Kkvl66chiVGsSj3m`fsmWJ*Wu7k z_r&dmAT0pZo_M~gH!VQYd*bLfsjjsE9*RBj+AYG|Fm44<)}DBs=HXX#*O$V8aV+AE=xh)x&|x$&o|kK;`5ZZJZsTsgK^_lkZ#P3Z=y; z)S`s7EiFLIMG0$LT7Z-mC9G{}0V;b@!rGP*pl%l>P}%)#V&GV!-hY?h&~r)U#K^Li zI1N%vvaBVEDrR?D3y|271a_zC3O)(I{JQE}&L8XbdSxaun%665n~di5guNrDBZBGm z1bj8SoCY9RrZV5--(R_`G8Ng%vdUCsE6Wo0E*w#jcVt-tGlu(3rpQn5UIM2mTffiC z^507&^1|L|W(bP4H}t$*z4|`Cs`2uK48y!I;Xa@!%M)1AbW4XtLMv3ka(-#!6$zQB z6qaU-D-xL1bV`SXvFN?{moiZ?)#M z2MG;MW3k!H9LytYokovg4TLdk6)HRyRB)@hp_y!>4mXu0?I1<2AvRlbfQX}5?dE!< z07Q-zJrZ=CrohJ;Y9^Qcit)gYv|-5FW-$1qX>ft@A<7H}!zO2|wzOHQnkR3-6FuoD zWLC3SU}hKygDA7;4i>86Lf+Sj zhQNhUG%CbGR?T=3;Ilxqh4g66`!tH;)jKpf9Qnp$hHA@r)>ADJvV)rL%T9Muzlu+0 zfJZ>kE@2twECV2Dm$2sMIFNok53u7US~pmJFJ-Yet!^j-OBrr#c0+>tIM5r6cP%JU z^WXPsss(Xbcnt(bJH~(T2DA4Q0Fl2p7&a+M=U8pNjWJhTiw7-6{BnjNne1K*kXAXpiqKUPqK20< zzEW*T$S!%yDPRjtsH=B{!ZTsTsTEALwDC>Fu3*KTA^`|jFgOyZoA%reYx0b~l;8hR%cEdW=JVUlB#%nre(PNgw z>sXQ595IhHtYaAUZqZRduwISMkhk?)@7j@B53grfVp9eHk%9H*RVz;G#tkg?gUtY~ z8aJ?b!|*<^`BbMH8Q;vjf}2(SOJrTuH&gb^+sML#@Cwug0+7}=sSR1OyV{c}WtUCN zx=8dlux(=4P@x*u0;If&!51};jGvYa@@vL-fPWG*30#^b|C#qS3-fIPy0W)X0zKMo zi?~f?Z;QAg0QWZHzDMUw`xCdTE3)OisqM@wBo-^?(v_E1#a>8Ji<}74Ky{ zuF1{K{k<$um&|GpcH}v;Yzetx?^$q=l zYF@6qviP7I2Fz9bgRHh$Apj!J2kEV-LLCL@u&RxZDD`3Y#F@FZewg9? zQPPRIwSJh@HW#aL1s%)xC^ecB0-6pHAHj5l*+V0MDAW;_Yg(DPy?%t%uqVMJO<9gI zyMX}&DnLg?Zib^Q!&D=_g6b%%Y8pEr3UZX;1{d`clDhX}uD=8V6QEWB0g4Ac`Di|)Yn&Q!!xe9h=AIpSOXD1oIAxxRCbnFb+QPHuplPsgNjZ4SQPO>i7 zI0&kftnc-f3a8F~aZm3_P8aY19TS~9`-R!dq4)}>Usw&(3IRQMS$|=;6>C(5gJ-AQ z!2%xfOr&(&w)>Uw z%dHye!riaf<#JRxp!${BHv}YZ_7SXa&L9DT>Q~nNGOHm`SS?gCSvRF#*OTwrj)7)zm} z6Bk%fa|c0offct7|Ee1xuG{_2RGVt@u425ZWF}TPkBT_Iv%0RTl8Ey=Yf*x6gjyOd z*Ns#kR+Bxh9f=b-mY000BYDC#d%8w9l2(TC+1qi`7nl~|S7eGWA&0DqAuQB6ckEFyqM-$cZ>atnhI1cx~wM1=3(edh3 zb=kMwc=rsH7K3g)uVJ1%)B+HWr^gAp+K347jC!Po?0(}j-0neAI2ufz;dqFE201N2 z#Amo&u}T_vCviUAK4Arn@RK-7dY$IgqwZuSYRZ1?CPx`EqweG=LuS;SOc}b`Mg-9m zHM*v}w%rtN4}^nWXJ`s9XlyfNM%^hKH};JR^k&{PN;CWE^4;PUCgWxmseP zL1r2~PSM+@2&~lT0(sR~LC9V{_s$^Yj3g)}kElmCqy%Epd7J<*)U z?NJR$7%d3`<0RJt#F)pcJ0*B2J(HM6YSy-hI0!MHi*_~-z~F$uxNV4oYIHttR1$?i z@#ph4ZEY?w@qCfLHeJT+w*Mrh!G_QZ=iteDso~-1-D4An9c(Z%BLi zCUa!dOX;zmvBvg%61>SpOEvy#?;kx~Fq%6->I?;;K=dZB-Xu*#HvT5P0n^du0Dbn` zTr@6dthU_8s;WALvhGa~MCGJ#m-7a$kY*0LoC;}(@uJWQ&R3<0X@0YUW7*hLXC3bYkUsjLRF z!>#K$7MP|w&8s`>@Pun5K<%yL9Xi^Q;N_jqIR7GD61t%98OI5|?wS|x=3ueLMel-Q zTzgT+-;!0;n+;^qjgWP)oaU*W4ZNe-kCmQzY-a=SNiVokH;6Y~zT|vMIuV+NeaUeW zx|2>szv!}AHEJlk+_;$wXKCgUm(9GX%e;BUWpk8yT;<-%`Svs~P0F@X<~wL!T)oD| zv3j$iyrknd5ii6D_f5nL0hIC$@tO?jJKEpk7?G;DjI~gG8p+HQpfhNE2En%+TX06r z=7RROm}p>9L-)$$E*|^duB6E3cJa75oTe@AJ8s{}2108CG_x*aci-{GW=>+P?mMnu z>rT;yUb&mc{$pv$aqpx7ffmqs(u~>d;kAuh#~9rn^Ddfxdg(_z;bvK> z`hRqfPU*_u$Mxb3?=J#^7T7HKOttTGkEEGO-^XzZFN6*-EkD3x1?H+gNDpxR6288E z|1*yrw&_ug{miXTP1n~UH_-t?a)5fZnxcF42z-dwFcUaaX@{s2A)VtM@KGK+ZfR*s zebgxjmv*rrGR4q0dO-{5Zn+ZcF;@z6{r4D^f>?2pqJqaxfwcy`IY86v3ewKaFl$_h zz?7e>vL^B`sb8G3&8>-FoU+ZWiC>(uackiWkDax-)N^ber(ajFw-$bNRfr1-$R%L< zegcyI)v=oE3cotmoMcL#4S2GpPN7!&y# zapo8MqU!&e%g)!0^Q?asLXvvc(F%wt<2+263?prljq{3Vl17Y-7{_@H+J}qD6{U|2 zPg1`&mrIH#dE6`k%mLv^UMm&_q@@lz3K%AE%kUyd4JAy4||~ZfE!2fu$QG~wUT$W z!{6{-%=GN41rRCB^b#gPK%_9!gIApH*Wd&hJ=RguTHcO`wBs{7ibx8Y?In!=311O$ zwucGLwK^gOsky3ZiR{~AF7E&7?BgI8qRjOIyZ5f=-g7;8Xa^wcSOC4CCYH$3+!s6? zQ7(Z9JGu+J*sIEGC5v+wcz7O@9GQAU_hofiD>yP=cG)o-xG#GN<2*7OxG#Hf9+3j7 zQo@T#0rwU!j-pTr7Q3P&3`(%r6}>8L#Vnzs-`#3S6orVExI!ZgqAa08zhO5C-|}Ls z)vDI=^_;hGRtY|9yCt|xJ<&$?E?(wzVfFx*c{q6eWu=OCwt|5 z?BU@)`jwyRWNM!%*Lo2)WtQgP9ODi5D-3nH>@!^sa!WKLAA7Enbmv#{hzL zi-*+_<+cEw_SatQTT5GjpkI6TwZ{UY{l??Q`vL@7K*Ixwu-|yCF4Hv*2-o5!!RA89oNXl`ZVqyE~a2Yu}zfDw0_*ZWGHrCLe3!;2lXIjV)AJ3Nd|)E(9$ zzrrq$|KO>-glts<7@u+0+U&ppQkK8>)L#;^dp8ZyFMRJ_cGChx!1E?%D@F^D_V?7# z$=6W}Rweg%{6|&i64@oWhXT@M8ggRZ>!~`SY^a{OM8;ElJ-Z>JKZ16zXE$WD0JM8O zyCGAHoI?9Ne!w$_G=LF)pJ!d|wTSyC5A$VeJV4MEpxKZCMA)A^yCDMz=AXO2>;_mmbA#*9}zIIX`_G0Hfbw?-JE%z|>)7ZrqqBdpc zm|EOPPA)#?It2(pb`-zhibHF|GoIZyLLe}o@vwH*&|DV*MA+Xwdu|>O z8Tp;2D_4QEEML;AlQQ#~Wwaxlu3(pFE>6ELkYu%G{4hd=#BIBq9 zM0TGQ8D2tUp&k%jC_eIe08xnS=z=3`jRVPW1?N)$_E5mKvO~fS3KMP{Y z2O&va`2Z2+Wmmo?xGf@LuiA_>LC9BJ`I=BhmI%B2076CpO`i#fuuI%SPk>-uBC6m= zDxtNeI7hxz#0vF_vMB;CHAcZjv!r}O#NM*$HN&SjgdIqmQF?E>^nj2aph*u9Vc&G= z0V2IODLtyC=1I9s#L6vebA(JSbF|Hg_8nnIRUps;nqeOhf!`5DX8#rtwC@PGYN$hL zPWpV;HEbaCaDYayfcmSo8$d*T*XcFYA}QY&u@7vPS|I5Au7+Dsj+P5dt1nqKx>qS)1mPxr%#8z9@mI%30U~|4LGTV|^@rGREf`;V%xuS<`c^#m6 zB@Q1E7O%vaVgrJ8m9Xpa;-p+7VxL;pVuV~n+Pf00#l*T+@PdNQs&!AlQ;` zwoLFDq1TFpv3fx8t`!(MsrxD>{jF0iddjP>S{Fqjy{!`obE^+w5M`afZ73>WNm70$ zVqe>=lpy410`oUIMpQys*`QYTl>ORnaBL7F%m$G#11=!gHV6#3Ep-%p+(3vc+=7bq5*fS zus$Y)L7c5Z`zUEUXo&>RVSpAlN*hF*rbk{Z`mLc0jOxE9^0< z)|l$<6tV9tZEFPGDdJ|UyEW17aYXB1qADlhP9UvZOL%=xvB#~TtKt<0n}gdTcK2wfQY+~UX;8B2HY+w4~p1% zp?{g7|`%G^RA(#%i-W(82hp0EFA8Tz#nK+_e>LXhg zA93Y?kffrC>97D1 zBXHi6>Y<&UCZ3@op|OsGvlM5A%DGlHDLE_bMcj7!)WliQ%*+n}kj)J9>)Y zoKW{%D=(op2u*!MigfU-pmE6pBF;I|A9Yymlk$Ryjq;7-tvy0sfb&-yc6+Mxi*6(b zLMZ@E-2)=*MOXKLV7*8=p*GPT7f~@ib+e`R+5!PhzW}Je+I|5Laep`c0>y<94EOE0 z4FrV)n#uu0)ZxBW8X%$$_w_hRQGuS+?*h?9JV0a_*o+#0i2I~(2TMR5+76cO$tp(p zyqm5KAVdW;b_$57Bm9<^xUYyh!tY|9oNiB99O>Ji5&{BD0lO@dZH)A-J>fIrj-*$h zjHZyzQ@))Jw&!%-2C%73hfL%t-&QxiBI;AVRx^k=sAE!2^kdK3ymUm!iN2j@b|f>JL|m#i-z5LpU@4|xdgDlo5pJmud;iK2Lh!a4@<;jg9dG;gUK|Ca7WlTWcbJed zqI=i3E;%67AD}UAK>gLuUjR|2cYVxXHjs9@U{BPKeW>RBNq&Cq3O{as3%CmvWTkt? z3RYVzuhc9Yr4Tb z6{p1rxPhLE!@CV8AOxGRP%Rj*F5WDgsJvU`!?!_T_Sz{5DRdLPgGNohE9K=Yr%)gi zAJ8Zi5XpY!TZICm_+ODi>E|T7Ql7q1Kine!(CQm!R}hla*%ct7d_#6Mjx^RSDR=s@ zy{g}>a%|2{KVGc&M7mKXzEk^em47P1ONB=F5Q6DDr+Yv!;c3FA;Rn<{x>4%?QDwKu imG%DP+X+8}B=v(_-DLqH&VR=Ax?Ps{x;?n}^Zy5cS(q&V diff --git a/crates/view/src/client.rs b/crates/view/src/client.rs index 3c4c5803c5..769213cdc0 100644 --- a/crates/view/src/client.rs +++ b/crates/view/src/client.rs @@ -983,6 +983,7 @@ where account_filter: account_filter.map(Into::into), include_inactive, query_latest_state, + auction_ids_filter: Vec::new(), // TODO: Support `auction_ids_filter` }); let auctions: Vec = diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index cb2ea54a54..9219f075aa 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -458,6 +458,7 @@ impl ViewService for ViewServer { note_record: Some(note_record.into()), auction: any_state, positions, + local_seq: 0, // TODO: implement with real values }) } })) diff --git a/proto/penumbra/penumbra/view/v1/view.proto b/proto/penumbra/penumbra/view/v1/view.proto index 191512ed3b..a4d6aec6c8 100644 --- a/proto/penumbra/penumbra/view/v1/view.proto +++ b/proto/penumbra/penumbra/view/v1/view.proto @@ -147,6 +147,8 @@ service ViewService { rpc Auctions(AuctionsRequest) returns (stream AuctionsResponse); } +// Filters in an `AuctionsRequest` will be combined using `AND` logic -- that +// is, the more filters you add, the fewer responses you're likely to get. message AuctionsRequest { // If present, filter balances to only include the account specified by the `AddressIndex`. core.keys.v1.AddressIndex account_filter = 1; @@ -154,13 +156,12 @@ message AuctionsRequest { bool include_inactive = 2; // If set, query a fullnode for the current state of the auctions. bool query_latest_state = 3; + // If present, filter to only include auctions whose IDs are in this array. + repeated core.component.auction.v1.AuctionId auction_ids_filter = 4; } message AuctionsResponse { core.component.auction.v1.AuctionId id = 1; - // The note recording the auction NFT. - SpendableNoteRecord note_record = 4; - // The state of the returned auction. // // Only present when `query_latest_state` was provided. @@ -170,6 +171,18 @@ message AuctionsResponse { // Only present when `query_latest_state` was provided. // Could be empty, depending on the auction state. repeated core.component.dex.v1.Position positions = 3; + // The note recording the auction NFT. + SpendableNoteRecord note_record = 4; + // The sequence number of the auction state _as known to the local view + // service_. Note that the local view service may lag behind the fullnode. For + // example, if the chain hits an auction's `end_height`, but the user hasn't + // yet exchanged their sequence-0 (opened) auction NFT for a sequence-1 + // (closed) auction NFT, the local view service will have a sequnce number of + // 0. + // + // Dutch auctions move from: + // 0 (opened) => 1 (closed) => n (withdrawn) + uint64 local_seq = 5; } message AuthorizeAndBuildRequest {