From 1d258388c94f62d494ce7bcb3b94e3f3496d801b Mon Sep 17 00:00:00 2001 From: Casper3667 <8396443+Casper3667@users.noreply.github.com> Date: Sat, 22 Aug 2026 13:19:45 +0000 Subject: [PATCH] The takeout box (#23068) This adds a takeout box that can be crafted from cardboard and found in the kitchen dinnerware vending machine. Food (made and grown) can be put into it as well as liquid reagents to create a meal. It cannot be taken out once put in it. When all food in it has been eaten, it is turned into a trash item. The box itself can be eaten from with any utensil and can be opened and closed with alt-click or using it in-hand. dreamseeker_RghC7jk3th ### Asset Licenses The following assets that **have not** been created by myself are included in this PR: - Takeout boxes | Path | Original Author | License | | --- | --- | --- | | icons/obj/kitchen.dmi | Tomixcomics (Aurora Station) | CC-BY | --- .../structures/machinery/vending/service.dm | 1 + code/modules/cooking/plates.dm | 164 +++++++++++++++++- code/modules/materials/material_recipes.dm | 1 + html/changelogs/KitchenTakeout.yml | 6 + icons/obj/kitchen.dmi | Bin 5453 -> 12501 bytes 5 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 html/changelogs/KitchenTakeout.yml diff --git a/code/game/objects/structures/machinery/vending/service.dm b/code/game/objects/structures/machinery/vending/service.dm index 77771bdcd75..86a44ffe512 100644 --- a/code/game/objects/structures/machinery/vending/service.dm +++ b/code/game/objects/structures/machinery/vending/service.dm @@ -38,6 +38,7 @@ /obj/item/reagent_containers/ladle = 4, /obj/item/storage/toolbox/lunchbox/nt = 6, /obj/item/storage/toolbox/lunchbox/idris = 6, + /obj/item/reagent_containers/bowl/takeout_box = 6, /obj/item/reagent_containers/glass/rag = 8, /obj/item/evidencebag/plasticbag = 20, /obj/item/tray = 12, diff --git a/code/modules/cooking/plates.dm b/code/modules/cooking/plates.dm index b125e4f3f4e..7ca5d7d42d8 100644 --- a/code/modules/cooking/plates.dm +++ b/code/modules/cooking/plates.dm @@ -15,6 +15,10 @@ Plates that can hold your cooking stuff can_be_placed_into = list() atom_flags = ATOM_FLAG_OPEN_CONTAINER var/grease = FALSE + /// What utensil, if any, can't take food from the object + var/useless_utensil = /obj/item/material/kitchen/utensil/fork + /// Is the content liquid? + var/is_liquid_content = TRUE /obj/item/reagent_containers/bowl/mechanics_hints(mob/user, distance, is_adjacent) . += ..() @@ -30,9 +34,7 @@ Plates that can hold your cooking stuff /obj/item/reagent_containers/bowl/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/material/kitchen/utensil)) var/obj/item/material/kitchen/utensil/U = attacking_item - if(istype(attacking_item,/obj/item/material/kitchen/utensil/fork)) - to_chat(user, SPAN_NOTICE("You uselessly pass \the [U] through \the [src]'s contents.")) - playsound(user.loc, SFX_POUR, 50, 1) + if(!can_scoop_with_utensil(U, user)) return else if(U.scoop_food) @@ -40,7 +42,7 @@ Plates that can hold your cooking stuff U.create_reagents(5) if(U.reagents.total_volume > 0) - to_chat(user, SPAN_WARNING("You already have liquid on \the [U].")) + to_chat(user, SPAN_WARNING("You already have food on \the [U].")) return user.visible_message( @@ -54,9 +56,18 @@ Plates that can hold your cooking stuff I.color = reagents.get_color() U.AddOverlays(I) reagents.trans_to_obj(U, min(reagents.total_volume,U.transfer_amt)) - U.is_liquid = TRUE + U.is_liquid = is_liquid_content return +/// Does the utensil work with this object? +/obj/item/reagent_containers/bowl/proc/can_scoop_with_utensil(obj/item/material/kitchen/utensil/U, mob/user) + if(useless_utensil && istype(U, useless_utensil)) + to_chat(user, SPAN_NOTICE("You uselessly pass \the [U] through \the [src]'s contents.")) + playsound(user.loc, SFX_POUR, 50, 1) + return FALSE + else + return TRUE + /obj/item/reagent_containers/bowl/on_reagent_change() if(!reagents.total_volume && !grease) grease = TRUE @@ -109,6 +120,8 @@ Plates that can hold your cooking stuff desc = "A plate for dishing up the finest of cuisine." atom_flags = 0 icon_state = "plate" + useless_utensil = null + is_liquid_content = FALSE var/obj/item/holding /obj/item/reagent_containers/bowl/plate/feedback_hints(mob/user, distance, is_adjacent) @@ -228,3 +241,144 @@ Plates that can hold your cooking stuff var/image/over = image(icon, "gravy_over") over.color = reagents.get_color() AddOverlays(over) + +/* + * Takeout boxes + * Food is converted into reagents when put into them. + * This avoids needing to track the individual food and lets it mix easier with other reagents. +*/ +/obj/item/reagent_containers/bowl/takeout_box + name = "takeout box" + desc = "A disposable takeout box for packing away a meal." + icon_state = "takeout_box" + item_state = "takeout_box" + fragile = 0 + shatter_material = MATERIAL_CARDBOARD + // A bit overkill but it lets the chefs have plenty of space for creativity + volume = 60 + useless_utensil = null + contained_sprite = TRUE + drop_sound = 'sound/items/drop/cardboard_sheet.ogg' + pickup_sound = 'sound/items/pickup/cardboard_sheet.ogg' + is_liquid_content = FALSE + /// Has it been filled with food + var/has_been_used = FALSE + /// Is the box currently closed + var/closed = FALSE + /// Can it be folded? If so, into what? + var/foldable = /obj/item/stack/material/cardboard + +/obj/item/reagent_containers/bowl/takeout_box/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + . += "Click with food to put food into it." + . += "If it has food on it, click with cutlery to scoop some food up." + . += "Use the box in-hand or alt-click it to open or close it." + +/obj/item/reagent_containers/bowl/takeout_box/feedback_hints(mob/user, distance, is_adjacent) + . = ..() + if(reagents && reagents.total_volume) + . += SPAN_INFO("It contains [reagents.total_volume] units of food.") + +/obj/item/reagent_containers/bowl/takeout_box/attackby(obj/item/attacking_item, mob/user) + if(closed) + to_chat(user, SPAN_WARNING("\The [src] is closed.")) + return + + if(istype(attacking_item, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/food = attacking_item + + if(!food.reagents || !food.reagents.total_volume) + to_chat(user, SPAN_WARNING("There is nothing edible left in \the [food].")) + return + + if(food.reagents.total_volume > REAGENTS_FREE_SPACE(reagents)) + to_chat(user, SPAN_WARNING("There isn't enough room in \the [src] for \the [food].")) + return + + user.visible_message("\The [user] puts \the [food] into \the [src].", SPAN_NOTICE("You put \the [food] into \the [src].")) + + has_been_used = TRUE + food.reagents.trans_to(src, food.reagents.total_volume) + user.unEquip(food) + qdel(food) + update_icon() + return + + ..() + +/obj/item/reagent_containers/bowl/takeout_box/attack_self(mob/user) + close_box(user) + +/obj/item/reagent_containers/bowl/takeout_box/AltClick(mob/user) + . = ..() + close_box(user) + +/obj/item/reagent_containers/bowl/takeout_box/proc/close_box(mob/user) + closed = !closed + + if(closed) + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + to_chat(user, SPAN_NOTICE("You close \the [src].")) + else + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + to_chat(user, SPAN_NOTICE("You open \the [src].")) + + playsound(src.loc, 'sound/items/storage/boxfold.ogg', 30, 1) + update_icon() + +/obj/item/reagent_containers/bowl/takeout_box/on_reagent_change() + if(reagents && reagents.total_volume) + has_been_used = TRUE + update_icon() + else if(has_been_used) + turn_into_trash() + +/obj/item/reagent_containers/bowl/takeout_box/update_icon() + if(closed) + icon_state = "takeout_box_closed" + else if(reagents && reagents.total_volume) + icon_state = "takeout_box_full" + else + icon_state = "takeout_box" + +/obj/item/reagent_containers/bowl/takeout_box/proc/turn_into_trash() + var/mob/holder + if(ismob(loc)) + holder = loc + + var/obj/item/trash/takeout_box/dirty_box = new(loc) + if(holder) + holder.drop_from_inventory(src) + holder.put_in_hands(dirty_box) + else + dirty_box.pixel_x = src.pixel_x + dirty_box.pixel_y = src.pixel_y + qdel(src) + +/obj/item/reagent_containers/bowl/takeout_box/verb/fold_box() + set name = "Fold takeout box" + set category = "Object.Held" + set src in usr + + if(has_been_used) + to_chat(usr, SPAN_NOTICE("\The [src] is too dirty to be folded.")) + return + + if(ispath(src.foldable)) + if(contents.len) + return + to_chat(usr, SPAN_NOTICE("You fold \the [src] flat.")) + playsound(src.loc, 'sound/items/storage/boxfold.ogg', 30, 1) + var/obj/item/foldable = new src.foldable() + usr.put_in_hands(foldable) + qdel(src) + +/obj/item/trash/takeout_box + name = "dirty takeout box" + desc = "A greasy, empty takeout box. It should probably be thrown away." + icon = 'icons/obj/kitchen.dmi' + icon_state = "takeout_box_dirty" + item_state = "takeout_box" + drop_sound = 'sound/items/drop/cardboard_sheet.ogg' + pickup_sound = 'sound/items/pickup/cardboard_sheet.ogg' + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 9067572b516..0f84a5a2a37 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -191,6 +191,7 @@ list( new /datum/stack_recipe("box", /obj/item/storage/box/blank), new /datum/stack_recipe("large box", /obj/item/storage/box/large/blank, 2), + new /datum/stack_recipe("takeout box", /obj/item/reagent_containers/bowl/takeout_box, 1), new /datum/stack_recipe("donut box", /obj/item/storage/box/fancy/donut/empty), new /datum/stack_recipe("egg carton", /obj/item/storage/box/fancy/egg_box), new /datum/stack_recipe("candle pack", /obj/item/storage/box/fancy/candle_box/empty), diff --git a/html/changelogs/KitchenTakeout.yml b/html/changelogs/KitchenTakeout.yml new file mode 100644 index 00000000000..d41c64325eb --- /dev/null +++ b/html/changelogs/KitchenTakeout.yml @@ -0,0 +1,6 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "Takeout boxes now exist. They can be crafted from cardboard and found in the kitchen dinnerware vending machine." diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 5efdf6223cb0c8a4f76e245ea30fc388ba7af4c5..36041caa71bc16360c0fe4d6630a91a84eb626d0 100644 GIT binary patch literal 12501 zcma*N2T+q;_b>VcL?Bct(%UN?fe1?P2#9nMP&z15gwT77bdV-UlMYH15a})SqDV6| z=>bA7ks4}Fc)$Oh^WB*<=ibaDlVtW@d+%qj-zvYgqII>^$iR$X0079;pFDmB03geo zH_>g}KjBt|nz$dqe$QWcJhpLv;`dC%Q^*P6VLN<>)Oyl1g27CRx6|QnQxjzfs&mRvST9noQ+V$R#DtZL^XM5UM z^w>enZ6Vgct8qn|!CPd{_Dzq;=fo`%qVepClg@|W^2KT<4x+L2Mp~-;<(1b`XV196 zV~sF@$JWQM8bHE-9D!yAA2_lwlDdkhsqo3H2;+v?EA@U9heOFoJ_7`NrwIm=8*Khk z|DH+Zz8oZBiKVeHYC2YxW_$7{nCgo}{epw9QJ)6&YF6~KzjXm$9N@-8T?j7G@6O@A z#N>8^WJ;<@5|*Rl_8qMQek&V3P)8jeC%o|i!~A^6B5|CQ zaPPnLpVo zGm?qJ>=u!^`7B~(>8%d{;CHzt(0<&Pxx617tS)ohP~PjhC?zBvz(1PUhYtW1yM|k! zwu=+uN1E@W<m&{=wQ|vKl(X0EjW^p`A@1`ww#z$T>e0%vr~MaB<2KE!?&Iz zsBE*GlqM4JC(aMcm8O;OnQ9f?hK+wO%B}1(l*N}(5dwsW4sOlp^-3XuTyp7-$j%n`6KByMz{ z@u6bGZjuq4f95Nc$GLc0TDoD54RypR8Bo=Tu8ozt&l9xv=jed1AEi@}?kwy?vx9Hm z0?lS-{kylO5O;X!BO~RpJFe(>W!ciIi7fY0er$tY`%|zxw$k&#X(nn#9&2iPm{JuL zypL@w;VFELsWh(R_nN10*f94*D7($ry&$*R5!*LUHQc>Uhn>6&z;L=xkFy zH2gHbA93hWi2lO1L=;|C0gWQS?yEDv-M@1Ln2EvKPcf#x7Xnz(f08!U9Wd9{2OO0G z+>yYd^IJwOzW)f7xqd6mkogm(Gkzw@01ui)*V2Y93NmXt-f>;f*)PkhU|DboP^)!r zh-}>alxh}KNRFKU9-Qm^N9bZ#bIfr{5>IP48OZotA}1$)%-TJ9 z_v_T1XghThZDUVjWriH2?7Hri4N$knOBYxYHoVerUHE3;vEWU?(4~jm4Vv{>yk`WW zW;CD74{g;vb$_z`@dP)M*lPY}<^mVTe`Z>4c}-sqUo3C-k%@#APSeD7pRP0*MTMT6 zJu&Pk4mvMwb>82>9?v$s=PM>lJw>dT&xyP+nQirdu>a@Ztq@sJ-w6D|#q~d1QM~dW zsEnMi54bO2g~%)@MP76;UBu`c*4-JDztCJb%?`$zd>x7SON>2FOTQ>eyg5`!7+=8Y zytjqx(U{s`@Jx;19#X?jrPXax#8+}4rZfVG>mRS0EDFo;7S({vI5WasFSwd+M|7Po`ruT?Xw0D60p3u8t7uST9$C=?u>1-1H25!0+22QovHZAf5nuG%(lH1V`y_ zZH;0{fDiUlm1aW0a%Zc_3TMgF;Pfu<`fQ@?CWRCgQnOT70){&tMrZ zy@izrv5ltlq>rPdW$vPWS4z;aY}8#K2DteSQ4}NK_Aj zOFpckbTgZ5mGzDe8SwF*E#@{EvIiQmW_V@jwQab81OVfmnbrGgZuZOq zl$VP3Z@!YVJjL;S4W!1ze)KDCnpgdCQ$f=j03dGMfWPKGhd?#vhI~>=6_;J9jKn`D zQ^MdW6s#VD+=(pwe@s6PgBWy#)f2+qCo707fGARjypJv z^Q{4BB+#m`HJ0)=04bj^q?{wmH|#=C9pRhJ{mK;A34+BjOa4AQAUVitd>~0tl%~U& zD*xWvJn7PScCDEO!fz$(gQ`9bFe&&1#o2n#Gc`WJsyaae?;aNtE26&rVsB%)U9F+W zO;mC!YNQ}N_cMIb%4x3g!T90(y{LRIHOeX`HTWQN6{>AP{{QNmIN|AI8sY6 zms2=6WwSDpGt&PB85tRa6wydGg?!fLR8?-q3do%+R?afmqvD~f+1WDQ#5Y+K+%bZb z;h(MTZ4`u8r$0oun=Y`kH)E^(>07pRp$!V?on8-ao0pICo0=rY4+Gg^2~%8LQ8RRJ znD~)*QFC00kE5j-8F5i9rx}mhFl7Xxd_zbnUL? znxzZ?xOUmz^CB-)MQYf-qQJ)?VTn3?9~sHYZEkk_bfFIjA^vdol)EJDEz#|C)-e687nmIV*^Ol#CGMIH_lA_AU#cAR+YPo;!Ag~Bo^<3rv; z^1|`yMnlJi?<#|hcmxoZ=&#e1KnG1_z|_~5$=<#R#__t0JCTAN=ZqHCbtN=S(%x9 zp10e`8!Jrgai6HnM=gPMZ0iK#9|i!JYJ2^I;3JCXpxkFhMy{tjk_T=hTdZzRrZ&9- zlWzlw(02(DVyL+qfep#%Q~>}5NGbLXbfMMvomc|Nd21s? z_DY>C_<2D(MeE%kDO*4ht?l@O{&Vwp7+-Z-5BQ+XrJjf^n~z|U;IVCw&qXIjk6!i>WH?v(oTbxy)2t*U{g~p25&L~)ya92(UhJKz+dhPnxD!Q; z--ZNQN516KYPZ*nv7Tv)`!@Jz5>sgHHdAOU=4y7$Bo3v?mhz1G+QvahmNb}ueHQMv zg5PHnM(|-qD5|mYq5UgA$raE0U$fG*l$Dj=V9-c6de7O~Ub@{wh5lPbSP0X-&q6S* zlkg0BXXB;Fyu0?8F+t-0N9jjzZ+YcW>yFAdv(s>2bZN$l3+fU#@U9EJb2~W7&80M$ zH}O*P-yTYNPD{wBv&Da-zC_F&3BR&4Gvtn+`DRFcwy%F-a?7pL zQP*cuxRK2pA@=z>3An2RG$?N_o*f1P0wmrZoMl{x#wVtApMVG#NGt5;BU#6e;Bz#_Ty&bMEAilN^Q4W5)r-@OH- zH#ki2&n72=OJJZ5y0W0R4h~=If|nGpM0+EO^cHJoAw;(zfDaBi6V9(*70R$TlX(yg zSa)+O0{Adnjnw<4-(FtLs7^o)3^avdN8Hv~e$0TFHSb*Uq^2v>q zu6YVq$hNpRYWT6D@-efM-VejJ{Qh@13!t++dZp0Mkt>0Wv_41>{y4Q6;CQ4HsX{O7 z7uLFX^iUTq_UO@%!H1;OJw%oOI*i}){O?eGL#A=ObYTu@jrYEJ%N|KkkXY3?+8|QV zQu;q*W~D7?z|)^TE&Nf~vueFEYmu{^sdp0a+MDC^q4!9$`*%-)9rZ07Q6|SGe=1Bk zo!p5KCkyv~D2j`MavK4Z1H@T#4dJdbQ zT>ICH#5@dW+9LCRD0U;3DiWNoH+?|NQQ3O#=eqvYgxcWj`v9H~4p}+U`&Tkzdz!!A z|3D=d+29O&@#nT-#hx#C+R0DwBnDz=8d8L#KHs)sOqJDez^Fcewm0Ib5^cYdf%y`A zf>?#DuVZ{2P5(tz7WYCHcfZs7AIE&9Rqm8q(1CjLo@6oAk*NI2tnI0)(+M?1xlz@x zoj*0bIABswHBi5Sw=JWTJ%sNiuf$Wek#k#wer_LD9D8Rg0h9LJdhPVdu1frzBR(jx zruw*>kS!pQSQ^{Mzw}?Eddh?c4$Bg|DTdXi1QN|DigJx})v zJT^L-$RHQc$Q;2yF-%Mdz|r}1o46utkr zZ4d5RNdfquO4#PNkHUgx))j$fE)q`xG+AJWUmo6VVA0X2!~RAeElLjR<_Vbz-`^Dk z%aVI20x;p{XET+s%t3et>@H`vX+FMOsBNG=J%O4p<+?~ z5WXTlu(4E*SA@=%d=*h@&lla5Mjm3iH_L{nAcd)fS>SwD=S8CwcM<<;QBhIIsjH`^ zE(gBCI4{2Z)z?CL@srG)12uoPZ$sdWJf+(J6NZ$9hgtry40>ZxmL*%uAD}Bw^em~Y z6!HtM1~UL1x4?@FZT_gr)9seDV#+>4N&w(+L1~c7A3?_Qoe2M2DWsqerpyHyyWn`~ z@ttR0h})7LnNiWyLA-l8SJH(hPiV?q&Ip^sN$8B{WvPIlbS#DG{EIl;9Y~SA5C2vL z?7cLjb-Q7+lq-V%7|7>ld0$i; zUfqNZQuYeqr5k3OC-RntkT1&1pcCocM%kyJdV+x+b6Ac3^(?o&KdKiN^JS(-SUiR2 zb6pL(D3kjE#5WIG=70+R^*M$LH&*W$o1_%jv4JH3l071Y$9@yW{%mZlg0{*dDy+X0 z%f2F#P0e}b_NfakEiV@KGQ!p3Iw&KkO;f0<@$1{>^MLGt>^m!KiwhqzaB+O2|4Ejq zh4b@SEY;TbE}~e++(P&ii=&Xbt9P(pXzh>%z02SB7gpcSgvbf=Yh3$Stwqf^M~yV+ zvbJm@s&|%Uf`ig?5_l)|XRCUNd9t!fw-%I{ExfaqDA&-Qh8;m&X?YaWc@P1f3dh>t zV?S-JXSxb}3w+<3d?^v2T$TzB!m&5eLsKE$-iSW3<>)4z=(@L44P^lti)gO=3s~U} zmJ1r#;kt_@YjJZU>ZfggupE|}QK=BMa(QOe>=1jv#8^k|N$?Blzd&FctsKGnfdtvt zS69Kx#2KKzf%sj>FQnQ3li{=qC*z+nt{;cCe)H-F-}%D3(_{`tsjUZ7x&NlM%cN#n z%+$o4xZG3hP79kMm-x9GoMF7%=Xqg4J%8KC)W`U1JGj5D{BauRQ0}HDm-^s8M0E$d zlNH7h``IIf74bb0p13OA0KtKpd>%EAfC9YuydVt;D z#qjliJNW;C`K=r5t8c7;TJpP}|Av&AeFWuQ-hc6p9Z~&C&G)P@L5`|Bf=t77!LAC% z7l4cBI5u)a=>Y{E@Zx^Jy0mo%40MnVVeU~cti$ulk^Crxa4HD{DWn;c8`?O$eTy@1 zymY&XDjb)Xl>}SI=bav2q>R7MmM`CA*Mnb>SxD*IMb@*dhUHP+2C_?9-i0cH5J=uRbJQ?)Z1>Hcgjl89s1JC1r0VK|Y7X3~b#j=d#o>(84C>{O6y@ z0EYsl;;+J-9&F!g&bh`3kP+PRN)kK1AA!68*U`zTDcch1km-$}ycq8sObhcHtf+^b zd4v8W9W_5}zN=xH2Oto=vK{oq?I+B-aM@st0(v=1hhhzPzB(icWZ@HW0i+vz*uQkq z0qj~5VVmD^FnD)XD7;O`-lTHpr17p#K-vi*s`<+&*)6r~L(YI`_D}mWo=wE?V&wK1Fls1qkq- zcCBZh)~_Ak+E`-jV1}=Lh|Hlhsec&Veu=7%k+z*TR%BwOBSGSL`ji!>{pI(<&|_jp zk*L`Xjm~np2&HMK+;!gW22c$xob=EH!~pK`vESOy(CCcSx%cwy(A{YKXM--L4CCT>3rPal_w~bF zPXM%&qPENj>APXZXKoG3)o3o7Mh{CC_)dc>F4$gLk&~cMxce|by*%{qoY!FX_w!?L zCkcR3lEuXPnT-BL5kLs5(zfV;JmyWAej6c}y+C9Qcdl?U3vLBVb8~{&B?2HSzS_MD zgsTSN!p;8*+V2ww8v6mfI<<#)Es82i9JMu`<=?~&J|i!$jk@VuZ<0aFX^%(DxES!( z$)P}{8j1-I7mnZ+cHdQS`QNfEMIQn{0{MoCLG8%JP=nanxgHhHM(E-Z?$@~I{+h2h zT92<_6|b!~lpB6axt^Uw1ay?U{kap`l@{tfDo)OKKJA^^Fn}C*P#krBex5XVE3gBg z9O!Z9jv>6pNIy95S#i>ddB6;(Y5mfbwln)B^D_5z^`12@E#eX%yGgtob-Sm8$&t?j z`#v0la)W~g|A;}`>d-l&=B&w_&FefdsO0)71(f$fQvLlTu{PJc+yM;X=&cliURWr_ zFwGWqJSWU{I4c905@JZzK>N5Yn-!a!d&xN_@FC6jl#vd%WbRp8u`yI@8 zDItv1aJf$epm#qsxr?^>pC+Y6vIT~<20b-1CmemM_i?d^6VX7F?Bv=DJB< zVnb3R3e^$@<_+}`CIP{7_RF8PgShrJUQy~3AreE=ABl^v%MQOqi!jF$0y6n%)KZ)O z3A5zROS6=g;G19;!qihrYDJC9KXj=gg$afA@zeDvam5MwE0oI1=p3mNdObvOjh*RX zJmv_YLrr%+O-csHNM4S18_%D3A&Lwe+G;(bw|Av<(QX*+w$+EeOyR=zh$5|s>$r!G zM7ZRZcQa|Q$Tot-v+*lbdLLmB%OWnfA5<3Bi;aIK9k5)d0O+ zF3w$vr;5{kb>o=Hn`>~aw5MWTNjUlrlUqE(8 zMml8nhq6aV@H2K;EyNxb6;e)K9lLik3A{IaEPKx8cof&S+b*?UT(Ftj^4?kJQswim znxZX6Ge$T*u=Jk2_umRn6MA-k{ z;_8~%_e@+~QvK3rE%&Jy8hUsajMNS6a@e>FjvO|V9@NSY3hu|QK@qeO<8lN-XPrYM z1IYbiW&wPRt@p2?x7gzD**eX23=r$pfX^hZNsAiVCmX3L=EVRa8_43$`bR{ExrR zeE))~%U?n{G-mNz)ip9cunxN{*40po8uR#lRD`?9qAl-Qr@h_)lNpQZQcyG!d? zKEsjG=6xf@>}!-ly%k$-PnBSIJ`Mk=u^l|ihmbScnWqvr(3ODFPJE2B7e^z>n2HLC z?}dDo&cT0C5o9p@beaL4yEBcfiIySN;LLNIoYARUKDy%T z*YQVEg&~#F1o)V1={?#T`?I&*`m`cq!qTfeC~|T#Cc|ivJ)Z3pUq^IV<*<_fc}2*k z8f%$UX{J)I*)1vBx4A(d^@}+iFM7MuN|4)k`_#c!nK1@tWsSip`%_gGo!dbdur?uT zYwM;_3?n0>N9@lM$hLN8=wDJ6UsHl`bRI{AMiAJn0eXAg>8N|W5`BCX(ptYv%kVlh zlI-|moEiLtkuXj}?ZRYjk+X&4DUxlct9C?N3OQgn2;Jf;Mwt~aaWTUw&JUh}zj_Lg2L6ww@-yKnQ$Z(E!4HZ~uzsg0 z2O?Jz{U&OO&RQ33^(VxU5TkB~l)))Jm+XYo_vZUM?BnqiU&74TGzE@R#Q7|uGvXb_ zHMq(y2t_|Z8{{S=PC6vY6mFnF4nF^k>OAsR)btOtGcd1e}R{($QwyD>t4y#!EIlKY;x$OBM9F4J}D# zqmh-AE77w?zYOR3%%Y#+wsM0$Qvi4bB}yk2_sMx{WMbfT_pFp_sU!l4W@3A zq01ajHWs5HpPE4~;n2UUwanv~R4?m9AI?9fl<-Ja)|KYX{NGmEp317?kpJ;K+P3K5 zjZb&a);m3R53tKRI;Tz%_1ENF4qW6|KcXq=IYzq*n@Z*pU!<+LAg9 z?z)+?c zQA^$oF0`6yl40uUuM{ERMe7M+7#TqV!5y_$_s988LB8(7`bgWBD+wRp1$~wFH=CG< z#~iq0+J$eOr>4EUWwqN=Qbqk`xWlJ^lL6S>PC3cX!O@68vC1x%WSbl&D zC1LndxP-=IHpoZeTfCoNcHWfHI`03Ue9-^qbN)^A{^P86hza4N4B;g6>t01j_UpgJ z<#Abe?Xk&0@oih|hLjyk#Dvb(p)2TDUAG>DJ9}zr<*kc75(E2HO1<{T?u(<0kWd7a z)oH$dA$O?E@eEua!VHv+KHs(aT{ovAeKXukQd{5&ST| zuXAv*;T&1%Ob3JTSCJBGB8$VmhJ4OjK@R+4;(=XPoy+`P}gd0PL+g@NP6qT80= zk}Oemjk?<^UV2DKXzwl=&2i>ax@4ruPVDa@e&@`Rq@rN3HES8$q}0@h#$!-$^VW62 zqR$Me%>4OV%}x^sDNp|K)L|RsWW=sbg}d26IZQI_ta%2T`H^j9P6-zB%$ump>{0mM z6w5V=6GzZ+$x||}RA(Nxx#!R(2mAVQI?Wl1EIHk^Hkc z@yW!%!8!-*IZ<+|>@rTcBa<3BTi>DQNUce$Q!2LndrIak&0FQ z>&qm8F}HcKs3(qby$1Lu3<^c`eAB3fXYn%0E%epiXpkV-WQPCFehtbf_C3J}vU`G< z32cqDs{2(Q$l5EJQS>u1pROif%14&F+R|1gSzHCiOK)Pje~f=$ve|b;yfI3ceb^Kz zde}@#*#SyXZagTmQw%aCsUe>E*>~!eMp5~P$2(gX@on0DqQ7(n90LD6(j4$?FtTDs zcz2^P{-8YAboG3bOz?fHP1OSQZ)oM{L-n5r=w?#>n5!g;G5v(@Ja=hJR@+2fkBD#0 zv|%x9)Z78;owPEa-AL7=#GiLO_~P!p`YkiE)W46GiEjV%os)EGqNlucC9qc!r*fk2 z@RGV7{*uUQ;VpM$4r5{eLD})(b3~T56|QaJNQv$-DF-j;C%(1@#s4kD{6E6`|BoFQ zj{3lkE8At5xA`?KGz4AwRr?;k$x_E>S9H;COqW7;;G=wzCv)yPzS($Qf42{Gy=@GcLm=?!`u5_96jY78pGwRo~^-dyTn-4rB-{+Kjh9kjg z=lN%1V5{SU<=*#k6>JuBK`kZlEq>po%@~0&dijOt`uWcd490@j;=~sq*XH^4PqNbf zUE1#DzMr!_s)@vU5|u21!-vsV{6^hyI96SLN@Ttl4%%=iqy)pYv!zf3Rn!&i<5vp5 zF`;ugOyY0KRO6D;3W*xo&rkQ+)G=kdPJSmZt1J9ZUkD}ej*8^v|3F!8c^;dB`eg%% z!}DsCoE#j-XKn{lyTmMKf(ZD7dq)flEA~bfc$G=mBrw^F>d!%Av1ozqYb2=g=CnpA|`|hH-x^c6c_6@6J^nE;jlen*rqT3D`Vvl zABO+OgYK3|or6JW>0>@;1Jr)Cz7JUE~`K3-n=yP_{$W&YR5dF%B4I_kr!=RE_E zCTO!&%X=!?go%5`wZ>^y?2i{NT|yn>82drwOx;@>0?psdU4VUZ86ZT++y$kC13!|Q z<(6ud2k<@IyS1&8xn z+-3h^{_^YOau&*lOZC3#9IX|L!>I`rCBtC5XASdmFl{1BHgMb7%NgYkN$l>FnXuQ6 z_shNJ%`@Rs6vbvJa8fd!nfv9@t?@IX&@>^@=ArRRI)_DH*@{87-^B7=?}V8fWuAwQ zs$LAwf|730y4-0FvYFERaF%h`jMg$=tfkevm|1M!J#}oe8n>Fg1dl0bScvf4VRn3+ zlU#B&F=XUry<-Nh+HrTdGG@nJR7y$VYGP5+DXb`AW~%cn1=~x}U;7KYr?bk6_@a^4 zy1tPW49yjoZJ2BoOuah949pNl;o(iI*Uua3%L(b}ypy)#7N$T2i~~bB}4Xq@{^nN6!xYruT^J0vQPt zs%*~Q3oH8^3!6mX3t1ue$BujirS$AzO~YHWha z(}NVDL8XUP*Buk5h{YesEb{Fh);jSYgH<|beqs;8>7}8sPiD#-znHT44H7k+WXhW= zlDt@0EZbJ}H7ntccN-*yK`1*2Ml(-Fg0J1zdZ=}N&8u2;HaPzIXMA@0_ZJP6?k?Vd zoW=O~xLxp}`|)hCPVSry_;ofsE4WgjKPt__=lRi`Z(RCA`y@)9I+^%&uQfC8Xe+i6 zD(jwfQ@eoL+|yIC4i1}jACYyJA9b9qADYhmT3xLd0Wo-X z#Em^^Xx}|=#I;+v8i|FG%O2_aW_KyAXXe6FofqL|=0!^=F>$9EPT{JTHLB#L8cMdk zw*P9P$r6UxrCm@gR92dD#=b#{jw6og9rW2b&agSk##rPD-1BZ_ri|xVO zWl*A^H*s_bC zo;VHEN0$q&Q|_jzT>#DOFnr$U@A9t>?AR32aE(uINSw%3+WVw~Nee6%3o+;KPj>4m z@~HWjV2;68Di<3;uvLv6LrO7J{i82z;rAWAWBwgL(##IvYK}L3G5!#*^({UlZqJ178+yC7KJR) zjBJtYWH9`EzW@F1bMEup^Pc-W_qp%6_nh;b$5s|bEKK}N004l+#903p06>Mhn7Rx! z7f2(gt?`BO(8|olptG~n=8n_*miJ#L#?H^r6_r#&BBQPB9K^-Ml-0CsZ%BALz>7R! z$vTXF;^H9)#@gE2-LjkK1@Nt{t;EE{iuBvIFj$r`;5R+}{QSI=rSwBzovyAf91iE@ zpj-e4xB-DNKDsV0E+tG%h%1n?0Q+aRZ9Jju=`1X0CMJBIaZjbErM_6UF?HRYJJBpG zZ~!3H@5*x!$U8ynX`HE#Fc`_jW$vVqt3>scp1#5srXj+0_FVOR*yB4r{c?Y*eSqrM zjUxZx;K9Mc&CSh%f`avp-x<%Ie*5-KQtEO{OiW!}U2t&l($dn<&=3LN#mo%8U;wUR za&T}!BodXBl)TWGX+pL(!UT)O=H%o|OiXB(blrZ+-2Dk&%&u3WwpvxWwwA&4olFMMOl31FwI~@w}rc z5oiv(AbDnH=IH2XeSN*5q2WS3JUkp27!ab(yYLKv>cK4wYk=;`w8zETDbmLNfxdgN zYmj%q18=lH01*BnC)eCR9tKXF3SfG+QGMq2!#qc3u)G!H-icyPs`piU-CTDi=bBnk z|Ce~gXuBG`VcJf(YH#_DppN3QGa2Po^Rv2pJlMhPRoYcrbe(%y&RU2Q2JCLL*24S+ z9b#!g`3Tc-yi3uF8_8*cmM-Q{X(k>c+Z3@=Td=1!BzeYec* zcEif2Bj?nyAXjQv11|Z^Gp5q#xjb-Tt%2`nb7#9g+Xr`SW|kW(@4ozHYN=~B*;Z;i zRF7}mvxTq*?WIyTo6@(=*P0Ws0nvk8Ckwp*!i1B)5)0yB@7kNvVqHhhAq^O4#w3HKhz z3$(5=pT*73o=eX13JQ#R=zNaE#rEqFII~gW!un^DcVGljJsin|S?R@zvwsQ&o>TZ` zK=VaG!B=5-;YFt61}DAK^ElGu$BbijIVThw1<&Om>#Ajpr;>2731Sw}!@Y5QaHa^+ zx)K55d{Hv8dUVdrL4bRHaYJaSJ;69K(8BSnqe{JCvw*#G2Kd}&Cb`j~7s&jbz{&Ha zB5jGeRjZ9VfH1e!YuddsmCgu(dYd^R*c3&1$#RKub}LMFR)k`r3#Zmq2q&~eTuQ30 zxOt5CQ>go9MXTKVX{k@h+k~l^k+?ry$TIWctGdjFmTBgRoB8~j+&s}CyIKgN;j@K` zYYQ3qsLS}``JQxf?y}IQI!UOJa4Jr%pZ?)KP7?Wl7fC8W&qK?^3?13wF6_bS89DMd z()`|JX=p9c*n_u5T85W@C{Q5i1 zxX@|JV-OP0z6Ox9;)sq3+TB<(uNiIa@+^r}4I82cN$(bp1q`ESv5lv14Y!f2iYTfV zC50#Z!4N`(sf>CVQ6EbiGpR46mN`i63n>PZM60s@D^N*uNa=CP*zr`@4w7E^p$Q5>LA@#@oXn zcuh2bNAT4qw8pVioBj{CjN$evtp~3?6P!TqT5J2aS@dPu0ON^p!{lTTC$=VuV{`R~ z<5m0w9)&h+Vhd)Aa`JPo!{HICDakdvC$lKd>$*8EBqHW)Ljspq_}uwOtVC|EEpI5c z9wva;KKx?!wr@+M{DDH(^LCg{?5b(!_L{7!TKLlR)w$Gpo@ zpB44M`WXSxs;TSYb+V9D!-FFBA5z`0-dk_n?oAKiDzub9x7tU6L^asPGZPpc8!8(d zYS`eQ%9!oK;7U;a=Sao2gDt+dM%5^4B;ME2Tv6(zU#P1+6lD{*uzJCCr2*qZB6>d-P|+ORx_yk1MvILr(qnVbh+$L7!~ zUe=5Cn#ygim`B_)c>hPHliz#>_m)(djMAnVJN)>s!ujQR2$vW8FiZ7>9nTZW8wba` znYsaYoQ>?UOk8j`ZrXnOigPhrKaI&l^TJl-M>g(CEqXTDUiS@M2SWW*6bh1UXVayH zC0rg!vRBp+7%pSz6D0`t+2E|324L7Xq#AR~P2+&13k(Yk%m1YUCoHBfJ{eLIxclkj zd5#0k;^Gp|@|`+*U9jPFXr0m6DA&9Iwn&sfXH5HJnO(WAW`oEe+M5JvbHV;qDsEXl zQoELH1KTsju%Ixe5-ssu!nrpj%>oP#sp4v4#S^$pE4k$F=Vrjs_J+N#r<%TVL(}QeLBmPc~D2J#7i`TCCOe-b9CLy}<*m~4p zROebTNpeYXes*AMYKwqNt!2D>eD&G+N#iZa($L)#_ELVV^8-uVP2fNDnc}6Ea@=S0 z7w3hLt%x(leB|Hq%t>8M4K4}%Y_DwIc)l1`?VM+{E|e`%7Gs{tc-Pq}I-yw?bMpzU z^_gP26E2PU)e-`_$RI^fmuTtEB(aLKw;v&Apk`#eItL*GQaPkNcy5pd9gt;^3Xl*6 zhwmq!a&#;OzL^r|4FD-xm>P%6x5}5x$KENX(wWmzfb4LtH*8pQ$d|cE*HKT+5jL#CjaIEo1#(G^=M0CNvyV5p@@p-%;Gw1k&2t#)6aGtqBeL-(9Ng zpOLc|awT6KC71Y2@@D(f`<4oIkL8*~`QOtr;6=`dc3#OqaXh)kKId|At)Y?&ZoggZ zH+qVKdIPgja2br|@WVw0)%NJ^QgQ94*~^v!NJRKptD+bj$a%LDPU-G>V|86Hf6;!9ZquTK6&zzrS6vP|ZxQ?O zJ?TL2;d|xlBHPSByFs%6J_zVjoe`#TTM(KjxBn+eLH+uXhc`AZ@RAv<`F{YT1!&K4 zr_1j5lpQm&e8$=o4g~%iT0x>>aMXkVpTuI40I@OVd=onh{_&?&pWnt0S*cihnLOr% z-`ocr9o*w77S(Ee3-3w$v5kZ^Pnz{Ux2~zOqJh4tNu4x6(_tx*^@UGKztyc(JiS*B^UTX8__Dr5uzfCKHV1IQ`x*+j4CZvA%86|lNPgRSOXfrq3 z&aD5~a`Y^=y&6LfiRUR0b!zs3C%{;1-4(^ zk72LrStMPi^iBs!LG_B47J|I7$>S+VMkiP<$_&%{nhtm3{cywaeu2|f3kdGmW~45s zw+eONA%sat6*74m zkA#ZEFS$bq-1|?`gNOu@-Xg$IpkX`a79H~HQe*QRvsInJM&D#_n_=*Lnd`XXh~ zt)3xt&(Y5kb_`J##l8bu;r(N(rFn;Lit3K>O^>1*JGlHF5l2|l&9eTX7-aHEB6#lM z!1+0|#Ra~`tS{iWrg1OeOs~qGV;OWf$6PKkiC*T`{rt&!rz=93miG^eHSGi7c8T&#<3)@+68NF7PTLOL2nh&jVK8zNju zEWhZpH%0M28JkHTeodi3uwuAwK&H-yIi7UG>$w$W;>@;DHtP9Wtul>fM~v&{3ihR zxm=yO?nSk8y)eB1CPf;mv*rhkpK7YLDIBAZq+!sr+eX*$f63imtXhwL)pGo*`kJ$s z#K@Pv9b_~}?$*Diyqm;`5n;Fx(dz2z4xujHZq|>GfdG03=MTmK(hkniH!zxv=IsCF z8(xk%mti29{8Fv>QMdl~ciYB055I`^!Uous^MCr46cw4hjpvteLz=NPOiui{B-ITt zp-rMFbvy1})j8v(7|`4l#1%;h>c3r6e&knZ6);hkvT$CX6}}i4J5}M(%JM(s@tF5D zPIgv7Ljvp?pzMFL^L)BOZeNvUzJaSc~G!@eXz{YY^X0 zV(iYYft`_xuKKbsig$Ya@75MRny|L}nJyu)>O~;Sk0zRjk0^-uCk@pV{33mVTduXk ziZb~yLOq4KBa_HVV6nTzg)i!MAq@RKfc?ikMkINmOVhci>_bI*=LF*4fLl|f_VX`e z-KVz2C*<}5Ygj&CX~!_yZ-}zb>1xxkdYpQ9rMZvO^0%=4OQ4}>zL=iHli}iiof1msLHBAchDF}Is4E-f%~@bn~6H| zm36Q0?;jrSQz@1de-DypB{hjolt*g!N@2;Vy8XB{IEPkWi7sKXsOZwkg75p}RKA)` zsF_{Zs|YgHc#W&QRDP>g&E&eM84KL`Dwb{DTQ(wW)Ae+Kg;+u zE+qL(qgqZyZ2f6Nk>OiWNl;VZo>kh3J2oDS@ZBVHaZivfwc8`A+4bZ$T1nb(8x^4G zCB#{#U&b+|ieoA*9o=DWnqmZ0#JJ+Bdk?M*rPHo_cmK5U6J#%np}A|*8Ug|tJtcme zf|S>G7Omf{i9QyQDM`VcjMB%Ns|U48F!#7*?kpHAt6f>`KB z(etjR$(M;R&d*`tQC++7@!mIEQ-wQETsm@n3#54F+D-4ffWLn8H8{FzRq~6lKq9}B z*Pl6-n|{f^CoN~ho)iFMNR*|vu3)%Ie_s^{q8~voQmHGAy_p1@ z5+Gc^p~upcGIpOqh&7iut6;TcX`4QNxceBN%-;p}pqgV4x^=_nme@kTbnPceE7FCv z`!1ruY{>t&LC?kK;aKVCJD{6(Lf&ElQlGgkb4*uDXEVNf9Y8Y|aO%`kN)GX)3VY1F z{CQ}wa^tv%i9b4n{S_iShEFr<$O!DV{McK$+&aJ&d_jj{!rhFd|AmeJz21+2{LoN| zmnSqE=;vh5E4@be1odCd;)mneE{B&JNgXxegBJP$)(_Bhvn9A~zYd3+sla*x+!bRS zUE}w*m4k2(;#b8wU?wWW{<9%)YL?~1TA?KBBsk^wk!Hir()hMdnKRDu1C)J^7`$EP z@AGPtlf%^VpB?iE%Te3&zcKfR?jLvo|7}4x+^g3n#>{tLGwxR1FXLU_@@d-tp8My3 z>UsRUuSy3$N~%JAwOq;q>K!)yy7}95Uf!SkS-16lxlc`F4RCVy&PxBphuwe;*a_g& zT=Pm^!OvrUvFT{m&EqSiGBw(2%kH@hbxVgAZ>nYTWoskM`+?QNghyfIqb&1Isb|lz z*wQv^+zLuY<+~GZ5Ly$H{)^iQs8Ti&tx)mx#Z5sbjRN`7XG*5x$1L^a1> z_!SHuUO}1R9k+sAk>flcuUTEh$`u(X|sNK;`^|k6)=qth>Ep@xn}u7^M=*q}=s&vax= zJ+Y1VSV}`Sm#(^!bMvSU}9jQUwaLO`9BVT BV5R^7