From 809be06373bb75e7adbbe9c8e7e315e00a1dffe2 Mon Sep 17 00:00:00 2001 From: Akrilla Date: Wed, 14 Aug 2019 19:59:46 +0100 Subject: [PATCH] [TMC] Baton rework (#45377) * stun * stamina tweak * 5 units * 2 hits even with chem * Update stunbaton.dm * This is a good slowdown * new chem + confusion * overdose * h * update Co-Authored-By: JJRcop * less cheap * better overdosing * typo * *= * confused * overdose tweaks * tweak * no var * typo Co-Authored-By: moo <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> * * * tweaks * stamina batons * knockdown * Update code/game/objects/items/melee/misc.dm Co-Authored-By: moo <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> * number tweaks * maint * 2 * cooldown and less stuntime * tweaks * conflict * text --- code/__DEFINES/traits.dm | 1 + code/_globalvars/lists/maintenance_loot.dm | 1 + code/game/objects/items/melee/misc.dm | 27 ++++++----- code/game/objects/items/stunbaton.dm | 37 ++++++++++++--- .../chemistry/reagents/drug_reagents.dm | 43 ++++++++++++++++++ .../reagents/chemistry/recipes/drugs.dm | 6 +++ .../reagents/reagent_containers/hypospray.dm | 8 ++++ icons/obj/syringe.dmi | Bin 7282 -> 7628 bytes 8 files changed, 103 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 407c5912fe8..62bb4c8be68 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -82,6 +82,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DISFIGURED "disfigured" #define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_STUNIMMUNE "stun_immunity" +#define TRAIT_STUNRESISTANCE "stun_resistance" #define TRAIT_SLEEPIMMUNE "sleep_immunity" #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 17773473b4d..e68d44c2959 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/extinguisher = 11, /obj/item/hand_labeler = 1, /obj/item/paper/crumpled = 1, + /obj/item/reagent_containers/hypospray/medipen/pumpup = 6, /obj/item/pen = 1, /obj/item/reagent_containers/spray/pestspray = 1, /obj/item/reagent_containers/glass/rag = 3, diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index fedf8be5894..f4b976da962 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -174,13 +174,14 @@ var/cooldown_check = 0 // Used interally, you don't want to modify var/cooldown = 40 // Default wait time until can stun again. - var/stun_time_carbon = 60 // How long we stun for - 6 seconds. - var/stun_time_silicon = 0.60 // Multiplier for stunning silicons; if enabled, is 60% of human stun time. + var/knockdown_time_carbon = (1.5 SECONDS) // Knockdown length for carbons. + var/stun_time_silicon = (5 SECONDS) // If enabled, how long do we stun silicons. + var/stamina_damage = 55 // Do we deal stamina damage. var/affect_silicon = FALSE // Does it stun silicons. var/on_sound // "On" sound, played when switching between able to stun or not. var/on_stun_sound = "sound/effects/woodhit.ogg" // Default path to sound for when we stun. var/stun_animation = TRUE // Do we animate the "hit" when stunning. - var/on = TRUE // Are we on or off + var/on = TRUE // Are we on or off. var/on_icon_state // What is our sprite when turned on var/off_icon_state // What is our sprite when turned off @@ -189,12 +190,6 @@ var/force_off // Damage when off - not stunning var/weight_class_on // What is the new size class when turned on -/obj/item/melee/classic_baton/Initialize() - . = ..() - - // Derive stun time from multiplier. - stun_time_silicon = stun_time_carbon * stun_time_silicon - // Description for trying to stun when still on cooldown. /obj/item/melee/classic_baton/proc/get_wait_description() return @@ -241,7 +236,10 @@ add_fingerprint(user) if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) to_chat(user, "You hit yourself over the head.") - user.Paralyze(stun_time_carbon * force) + + user.Paralyze(knockdown_time_carbon * force) + user.adjustStaminaLoss(stamina_damage) + additional_effects_carbon(user) // user is the target here if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -291,7 +289,8 @@ user.do_attack_animation(target) playsound(get_turf(src), on_stun_sound, 75, 1, -1) - target.Paralyze(stun_time_carbon) + target.Knockdown(knockdown_time_carbon) + target.adjustStaminaLoss(stamina_damage) additional_effects_carbon(target, user) log_combat(user, target, "stunned", src) @@ -385,9 +384,9 @@ item_flags = NONE force = 5 - cooldown = 20 - stun_time_carbon = 85 - affect_silicon = TRUE + cooldown = 25 + stamina_damage = 85 + affect_silicon = TRUE on_sound = 'sound/weapons/contractorbatonextend.ogg' on_stun_sound = 'sound/effects/contractorbatonhit.ogg' diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index efe2d999f72..283de3fc31d 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -12,7 +12,10 @@ attack_verb = list("beaten") armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) - var/stunforce = 140 + var/cooldown_check = 0 + + var/cooldown = (2 SECONDS) + var/stunforce = 100 var/status = 0 var/obj/item/stock_parts/cell/cell var/hitcost = 1000 @@ -131,15 +134,19 @@ if(user.a_intent != INTENT_HARM) if(status) - if(baton_stun(M, user)) - user.do_attack_animation(M) - return + if(cooldown_check <= world.time) + if(baton_stun(M, user)) + user.do_attack_animation(M) + return + else + to_chat(user, "The baton is still charging!") else M.visible_message("[user] has prodded [M] with [src]. Luckily it was off.", \ "[user] has prodded you with [src]. Luckily it was off") else if(status) - baton_stun(M, user) + if(cooldown_check <= world.time) + baton_stun(M, user) ..() @@ -157,9 +164,16 @@ if(!deductcharge(hitcost)) return 0 - L.Paralyze(stunforce) + /// After a target is hit, we do a chunk of stamina damage, along with other effects. + /// After a period of time, we then check to see what stun duration we give. + L.Jitter(20) + L.confused = max(8, L.confused) L.apply_effect(EFFECT_STUTTER, stunforce) + L.adjustStaminaLoss(60) + SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) + addtimer(CALLBACK(src, .proc/apply_stun_effect_end, L), 2.5 SECONDS) + if(user) L.lastattacker = user.real_name L.lastattackerckey = user.ckey @@ -173,9 +187,20 @@ var/mob/living/carbon/human/H = L H.forcesay(GLOB.hit_appends) + cooldown_check = world.time + cooldown return 1 +/// After the initial stun period, we check to see if the target needs to have the stun applied. +/obj/item/melee/baton/proc/apply_stun_effect_end(mob/living/target) + var/trait_check = HAS_TRAIT(target, TRAIT_STUNRESISTANCE) //var since we check it in out to_chat as well as determine stun duration + if(trait_check) + target.Paralyze(stunforce * 0.1) + else + target.Paralyze(stunforce) + if(!target.IsParalyzed()) + to_chat(target, "You muscles seize, making you collapse[trait_check ? ", but your body quickly recovers..." : "!"]") + /obj/item/melee/baton/emp_act(severity) . = ..() if (!(. & EMP_PROTECT_SELF)) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 1c80a5358bf..8b91e30cb64 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -440,3 +440,46 @@ M.emote(pick("twitch","laugh","frown")) ..() . = 1 + +/datum/reagent/drug/pumpup + name = "Pump-Up" + description = "Take on the world! A fast acting, hard hitting drug that pushes the limit on what you can handle." + reagent_state = LIQUID + color = "#e38e44" + metabolization_rate = 2 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) + +/datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) + ..() + +/datum/reagent/drug/pumpup/on_mob_life(mob/living/carbon/M) + M.Jitter(5) + + if(prob(5)) + to_chat(M, "[pick("Go! Go! GO!", "You feel ready...", "You feel invincible...")]") + if(prob(15)) + M.losebreath++ + M.adjustToxLoss(2, 0) + ..() + . = 1 + +/datum/reagent/drug/pumpup/overdose_start(mob/living/M) + to_chat(M, "You can't stop shaking, your heart beats faster and faster...") + +/datum/reagent/drug/pumpup/overdose_process(mob/living/M) + M.Jitter(5) + if(prob(5)) + M.drop_all_held_items() + if(prob(15)) + M.emote(pick("twitch","drool")) + if(prob(20)) + M.losebreath++ + M.adjustStaminaLoss(4, 0) + if(prob(15)) + M.adjustToxLoss(2, 0) + ..() diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 7049c3da0ea..0b66c232c85 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -47,3 +47,9 @@ results = list(/datum/reagent/drug/happiness = 4) required_reagents = list(/datum/reagent/nitrous_oxide = 2, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/ethanol = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) + +/datum/chemical_reaction/pumpup + name = "Pump-Up" + id = /datum/reagent/drug/pumpup + results = list(/datum/reagent/drug/pumpup = 5) + required_reagents = list(/datum/reagent/medicine/epinephrine = 2, /datum/reagent/consumable/coffee = 5) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index d792cae884f..c1100bfdcc3 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -235,3 +235,11 @@ ignore_flags = 0 reagent_flags = NONE list_reagents = list(/datum/reagent/magillitis = 5) + +/obj/item/reagent_containers/hypospray/medipen/pumpup + name = "maintanance pump-up" + desc = "A ghetto looking autoinjector filled with a cheap adrenaline shot... Great for shrugging off the effects of stunbatons." + volume = 15 + amount_per_transfer_from_this = 15 + list_reagents = list(/datum/reagent/drug/pumpup = 15) + icon_state = "maintenance" diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index dda0dcbc244486b164e57c9b7cb3ba9a64ca24e6..0b763dded78a59a82cb570dc01dac704db77ed91 100644 GIT binary patch literal 7628 zcmb_hcTf~jlOH5X&RG_aC<1~jpyaqBQ9wb-ISVLATy`Z(RzPx)jN~jigGvrdkPIqW z;sP!#d*k0NC!=nnamrp-(2XiAk@>#QMD zE56i^!`+y(!)w1?;OWmC3ryUyz0pkiY-TC1Q4>++p8);g9>QJ&)u@GD)EmjoN_>8t zT$0y+`lCK$!OvpeG2|{kSqt^W(**Z58%rNmt6;~;LYeeoD_j|}gFQ@r)qkJS5pFMR8?VP9)BBBt-7;1@~^Zr94~k2ak# zR4oE#J*x%^9=C_3FD?#`iSN(B)3!5XOZw6%K<^uMoljZcHwZi ztdM}fow~ZZJC12pHx5`HJtP}4H#Z**!4g%F{S1X~n%yTPB_$;X1$`{8tYn%g=zmuz z$oxnQ0VQB&r`6XuEBAa)^6cpr+`{w=lHiSH-a{SWV*?&Zlj#<`SR7!9{~Qv3`l!30 z(9^%{;n}_S)?`q_;z5(G*J&YKA}rfGJAG#A-*ZCu4mlI&tWo^}XX5>#C zHLz_KIjC^w*wl2YlW(=jZ~1)|@0QqVmb({0AmgA5REP-@MxnpGex?(9UAd zFHO4oNxDePLlQg2Lk{}=AKrq?^j`z;Kb^8trhaT)J7*JDFot=|lT3H=ko3B^r2Q6T$I{$NEO>`<{q#PU?dMS?9|%#{^bNrYbANXmrmc+!SPZT9 z_>|>`U~5X$Yca&zkO!Uu#ohPs-v@wEFaCosmA|dn0vDK{W|NbcuXjkw(%G|_DUXX@ z(UtG*MN*h^R(&KR>5nfItt_(vs($}WRt}_TMWfu!gGWsb^9#CG-2vv`csky%uN|-` ztbBhLA!t!MH;Y`p6iFrns@$_4f7tjHa5E4whMzYcQHkd+`YfowU#+munkMN4ftk$C z&0T+5mi<~`Nb=P$P39Oi8%?c&XnkH9^jBmcU!tg*qoW{@Q{QIlGBij|WCYCOdHB*H zJHnp5usNd3D=i`(6cS1W2f$+F3yHXj02a}-!2#W0j_YoE^+Xhb3zt_ZhrC_>uyJub z^G&3O;CRcUiT|&KOp>t=h~<-cdGT}`4|PzwlsbE%D0+2o z#+#AJ@14T&GwP)PNyR1nCO<#Wym(>4o5kaCp++Zp9~&B`b&rScmW?iNPFENgmHx5Q zOb=s$?|0iute171c{G`%fD1aJ&cP?+d6?_+#~aXqP7G8#x~G~x-a5CrZ(RupI?i?=~AtWM;NLawf^volj6(+v{9J5fB}9az*-!VSGlFd}_}a)8v% zOUt0SvJ`niUP8)ne90SfIqYM?J7;}$d)L`XPnPbhu{>*tM*)2~ zg-AhJS+x2RToV?TJgJgt39{$9xv~pxrK$bOm5Na@$M*7$=b}e z`rgG4+nGV3LN9)|PyseE9qzvusxBf6R*$FS!c_fF0U)s5o+_}~or`($>=b{+`6Tr! zM^vPU&Qa|TuZ6ZYWwhGOLY-{N@SZmmY!VI_7J_YiO|9gDfls1$SH{NTcN1Fct8`70 zUw09wr9XcD{FVq|ep|s*mD8}mJr*FJExagovf{In$^My-g?MUj0kWjj=MQ+X7MrBiemi{aqOEa}&v-=WR`+OD zAS-e-V&dr3`{-{k4iWG>mU3>w2FfiY&Grxe zK3?A4Hf9kRIZ=B@)mk|ucJFF%bh@G8GkejU>qmz$2p-VNVW^u`Z9UNK0OgjIl@-u( zh8M7m7@hP%taSv;qy5bnIhPRM8jNf@KF_weL4J*9i~2J#GDcQ*>@JJ`O8QXWkq{>g z<1n~HArrSI3s?KuUMReLL<(@;=T$W!1{w!~-InieB9bZ`g6+`{wUmtsr#v=fKF zhgu!~8s7bt?#8$*jfFI))jS95t+4w0{XUC3n|^FcoACGg`W}D7R^KMOTUH8t`F>h| zSxQh<3{i)%qGH~Xn`+JFZbeTUb9qB6iywM)_rLU)=1`F1Mk5EXvZ-UQh_u^NqSd0& zl{h_1$45Gb8C6Yk@(}a7#+zvzx(^x{h*rSV)g0YARhckUe(7`z=(WA%--Cy|jSs6w zg&i@VG*co9|!>x$-~+5<7fK#5AU=yndn0#AwcWQl#Nldr(jPf0Cet{ljgIfuPZi> z3xFAC+j^Bvas47TUsMwraL`43Csotuchd%N?w9QY4Oqgw)duZ5IyyRN`oSZbNr?6d zkXO9R8WZ^wJ;pR7NeiFj(Oj{4dj|~`w9wh=S4Cwx7FD`u#b7&?`vUqVfmh?hZA&0t zEKtVJ&)?RUFjzf?&vs|}Kpsy|Ddp0^!GW4z0eQaY`Kug45iNG&7|>J{a;KfW)m@Pt zA?RUg0dT~@jx}`K&^=3G0$>woBKeAMzRn}h=jM`AeN9#ri&a*1BF7X8wKXBo@M6)) z$n4qI4DF(SlF7g7l=z8@Lnqywo$35JIj>?e8{1h!h*-|K> zwQ{5O4Aac?(!o9AHuQkOlP5Q#3l&UFGr4XSz;>@--_Nbb_rHEo@KO%u!@L1E;Chz- z@9~$($%&xA4o$6vH5wj^x^)H8B|l#fsag0`ikGC{cX>l zizE>(^uW~A)Phz0bLF&^9_s<}2@ek7ko<R;B+RTV=maulgJ}N)I}@r+*vM zotbiFTU*{%e0)XRar2fj})PEJTjBfwXNgIzw* zWJV~gyXM0Uzx_f4sH!{hlzF|&ECIOx!M&uV^4Wp)3_#!^Kk|9l zFUqLAaeneoWu%g~yo8ie2#Ju3jAToa=^jfzyT|ij!AD!=%QK$5dP6Ky2s3Hy4=}}v z*`}W^gE63zC@XJK^?`gsj$IgB{@~@y42?|MJ~|2pjc7C~pAPl{N0R-UTO9_EyFvza z%MVV^@_ccDCfAo!Pnn+ozN8&9?D_7sL;klt=(137M(sJo1oQ1zS7l*p5X%3M;N{f_ ziY^G=$wolG5KJt={HWA~2(ZbwZc)lL2f~f8+ea^lDFiZIhoI@Jo=t0*pU2buYjG}& zQ#Rtyz+K}ZDCeoNv!r8*V+7oN+bq%OO)PR8UdT&JH}^`>*~zI8RHIMfTw3&3js66* z6!p!?$q9Pnf{=UDP!g)?TawG2-~Pc`K4?XKEZBEvd%F;fb>?&2WuE>wLxb#V0rIsp zBG{8{>@_sRv?K75m#=SpyIC7V@qqJ({95_b9l?aJ1da1CV8$m*M%($wiflTz>ta}B zWfO)S9YLEok7@F*``r-*n_#eUC4l`m-R`?$Yvt&MbC-OC<5rwRu6Pc|;rK(`1d56& zyAm@G8^4fWwps5uwimZ#Hdu~eTFbjmB_Ip75hEke*29>D^Q#N}K4wRy0BC)e;8bot z;{3q!SwKT%ta0^5Y^}!(acB7zV-(@*ufaiUCAe>&Vsiqbp4#^~K-X5bYkdw-O2a2G zp-gi zy(i*k%-m){+czLFC!!SCg^M5nkVxf$Y;>(eXa2ekvvt}(IB4QW5gj=t=fCU~Hew6=jw6WtDyx}_Po15&abXL7#-PXg8r&`mCeLc z|L}+vQ?!dOj`iu?U=vTF0K=KAg=}qdX47W(=zN!O&3?w$vrtI#D9ts_`6apI*B8I` zAQe05Ee)%^kBOUW^;dQ&%a{LTJitZ}(T}vlIjF$T)!6K8gzJ0*i%ZM?lMI##Avw0K zV^rmN4DpPKbeVa3?gJ6bgxEs<*LIEe?_Z_e*%itQAAO|Zv#6*sp#prCY8W8be9VI3 zrOgChO(s^JDV^sIN*r8rX+5iBGG<^lWVKUgi*jIO4k^>f{e}Wbi?1X@sJRRtSp-0V z=6?H|*xm`M=+UC0D+k_OJeYrg#DtCuc06{QW6VWjeR8shA@7vra9oBXuHta+A?^qT zDObq|@n|+lNy--OheC&jhycq8bOx_JtBNqmPK_+Z? zcv%vSxSaLD=pqb36&t0vQ#0biq%Hl(d|2t}+_3h}QAJzt$O3yI}=ITz{8? ziCeaYjMy7^>g(3?hSPk6n#1TZH}N_I}@fuMEOD5`iti zz?R|=*bZ?AmXRr$8Vqa~ub_G^e)(JXACr{rXsX%CK8;QA+u9@Sy4qJGP83)>~ zHYN)&@{#^ndEAi5yu^DjlD91_n8*S6nQ?Vq9lgfjKDjX?z^8S!9U+33FV;*5x1S^3 z6%g)=OBRkcy1F%pPBRMvI>V#FIu3RkI@nDf263R>{&e+N`E?=ONR7?nFy^WD43neT z#bke9_|4mtG$Ar=5`QC#Tge~jJuydI4OacUiIQKqL?0fs4Z&eFC{|9vQxvPmVv^xCKu!iB_X*zC0Qa97$V|!<<_OLLkHN+C z+2ykra4~FKoh0`MLqu_xK%f0ZM_zX17S6NhN7YYsgpT*-{y^W!ee-mV>dS{GN!y4P zUUN;vz!FD8D+gLMQ%YHL`PHw4h@W{VlU4_s!EYl(fK+n}-Z{BtyL(ro+zWR0#l`qv z)!yDc?=yu(LdCnUa>Z7i=Ns9cmOt;Ch*3N7m-%!;n2R!mTI8R*)SNqnuR*e1FGCo` zboS@gJ>qndix~$e* zQqkxp-sFiGCtr-<|9>lA|5_=`JvTx7$gvo?VU14vjOE`wtmC(4%DhiUA7!!J`_@BR zq8zPEBmq`pXdAj<^t>bSgzl}+0I>@QO#`~Rx}1|j4_<|_6lxQ)Q*sJvm@sC_l%xw5 z4CIElukjXJqkryNJfEF&O^v6L5Xhj$B zh%wQbWg{?DA9_v7^7B;!)F+e7s<%nc*YU3%^bu=nydFFWC29T$&W)tq)9^A=_Ip6C zU-a#Rs{P2Ff~7}s)+}$^XYpg9a^F9Dtb?$|{U^RjW4Gkeq1y8?B_*AqWQrG*THyVlqUBfZECTBERV9unN=)SVyEPVw)^%ZYC{{)KdXK(&q+UQL@0oGmNqOaT z=-;gC^dEd0u_fJ5PGKzf;T%abfJByc)gtMx3RA{6w$q3A zbg@$s`>(tq{%k@C9#ZP~H5}+BO-&6sV8PDpyU?aG!@m|hgap-<)z#52zLtJIKW|IH z0Z6zmM6_L;zTH1tdY$fazp|J_-XG%#$lZK6IKTYWzRlN71^ULF-2ZfUHJ9p~6=7$` z$7dhcXH-N-C3`~sdVlGL!PD<_Kl4ot77SEJ0>;=kiNA$=YZ!>M;+Udp-?*@g!6;yCkD*mUwQ!v~BX z4~=g#o&a|=pNrvX0dO#?`ig;H^LAt7I^GXuS1NiRc0ITw74sJm-qAYA)aD0~1Q+9qab)$C znOfS!-Tsh@D0oWEzS}qHJegPA!n^Uzsm)+O?P-xKqmG3 z*C=qAKmWz}Zmm-7k#S1RT1ic@2b*EY7;jtD)(muKq`u7(;{%Y3FTy9cR4T?BqqIj4 zR)@cFM1j!NdLd>l!ajh7o#C^6^!3**rYKvBR`eF+FyJjSL^p!k@81EJ&uueXz2`%k z9wjQ!LJb~x$@T9o7b~6*Y^|&QF8E@LH(SVCTD&gi3D@q|1!5-Ln+bS-a&IYYc-^(H z0U^KKs?RBdwq#V;pHcfZ0KGjIA$~LwT%6N<^P?u0(b@Nk9HQUuQp|u&*ro?8L5>Du z5MIo|%4#*fq%ldmgvn#r2E}0pW?R|h-QYoE_!w#0f8j^WI~=hu+2)-wgKL7|Us^z2 MRa>P($s*|A0P>n?P5=M^ literal 7282 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