From 5c7ef1bbef892aa1fd4cb90c8aed88401e503c8b Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Tue, 9 May 2017 16:58:04 -0400 Subject: [PATCH 1/2] Subspace jammer item Jams the three devices that I'm aware of that use subspace communications: Headsets, PDAs, and Communicators. All three will be unable to communicate if in range of a jammer. The default range is 7 turfs, the battery that comes in the jammer is a weapon cell (just to make it a little harder to find replacements) and lasts 60 seconds. The range and power use are variables. Speaking through a headset will produce 'soft' or 'loud' static depending on how far you are, allowing you to sort of dead-reckon your way to a placed jammer. You can just carry them, otherwise. I've got no experience with adding tator items so I'll leave that sort of thing up to you guys. --- code/game/objects/items/devices/PDA/PDA.dm | 7 +- .../devices/communicator/communicator.dm | 7 +- .../objects/items/devices/radio/jammer.dm | 91 +++++++++++++++++++ .../game/objects/items/devices/radio/radio.dm | 8 ++ polaris.dme | 1 + 5 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 code/game/objects/items/devices/radio/jammer.dm diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 667adfc712..88f69d8011 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1083,7 +1083,10 @@ var/global/list/obj/item/device/pda/PDAs = list() if (last_text && world.time < last_text + 5) return - if(!can_use()) + if (!can_use()) + return + + if (is_jammed(src)) return last_text = world.time @@ -1158,6 +1161,8 @@ var/global/list/obj/item/device/pda/PDAs = list() // Do nothing /obj/item/device/pda/proc/new_message_from_pda(var/obj/item/device/pda/sending_device, var/message) + if (is_jammed(src)) + return new_message(sending_device, sending_device.owner, sending_device.ownjob, message) /obj/item/device/pda/proc/new_message(var/sending_unit, var/sender, var/sender_job, var/message, var/reply = 1) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 42c8e4949b..018be58705 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -169,9 +169,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Parameters: None // Description: Simple check to see if the exonet node is active. /obj/item/device/communicator/proc/get_connection_to_tcomms() - if(node) - if(node.on && node.allow_external_communicators) - return 1 + if(node && node.on && node.allow_external_communicators && !is_jammed(src)) + return 1 return 0 // Proc: process() @@ -182,7 +181,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(update_ticks % 5) if(!node) node = get_exonet_node() - if(!node || !node.on || !node.allow_external_communicators) + if(!get_connection_to_tcomms()) close_connection(reason = "Connection timed out") // Proc: attackby() diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm new file mode 100644 index 0000000000..b66957aa61 --- /dev/null +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -0,0 +1,91 @@ +var/global/list/active_radio_jammers = list() + +/proc/is_jammed(var/obj/radio) + var/turf/Tr = get_turf(radio) + if(!Tr) return 0 //Nullspace radios don't get jammed. + + for(var/jammer in active_radio_jammers) + var/obj/item/device/radio_jammer/J = jammer + var/turf/Tj = get_turf(J) + + if(J.on && Tj.z == Tr.z) //If we're on the same Z, it's worth checking. + var/dist = get_dist(Tj,Tr) + if(dist <= J.jam_range) + return list("jammer" = J, "distance" = dist) + +/obj/item/device/radio_jammer + name = "subspace jammer" + desc = "Primarily for blocking subspace communications, preventing the use of headsets, PDAs, and communicators." + icon = 'icons/obj/device_alt.dmi' + icon_state = "shield0" + var/active_state = "shield1" + + var/on = 0 + var/jam_range = 7 + var/obj/item/weapon/cell/device/weapon/power_source + var/tick_cost = 80 + + origin_tech = list(TECH_ILLEGAL = 7, TECH_BLUESPACE = 5) //Such technology! Subspace jamming! + +/obj/item/device/radio_jammer/New() + power_source = new(src) + +/obj/item/device/radio_jammer/Destroy() + if(on) + turn_off() + if(power_source) + qdel(power_source) + power_source = null + ..() + +/obj/item/device/radio_jammer/proc/turn_off(mob/user) + if(user) + to_chat(user,"\The [src] deactivates.") + processing_objects.Remove(src) + active_radio_jammers -= src + on = FALSE + icon_state = initial(icon_state) + +/obj/item/device/radio_jammer/proc/turn_on(mob/user) + if(user) + to_chat(user,"\The [src] is now active.") + processing_objects.Add(src) + active_radio_jammers += src + on = TRUE + icon_state = active_state + +/obj/item/device/radio_jammer/process() + if(!power_source || !power_source.check_charge(tick_cost)) + var/mob/living/notify + if(isliving(loc)) + notify = loc + turn_off(notify) + else + power_source.use(tick_cost) + + +/obj/item/device/radio_jammer/attack_hand(mob/user) + if(user.get_inactive_hand() == src && power_source) + to_chat(user,"You eject \the [power_source] from \the [src].") + user.put_in_hands(power_source) + power_source = null + turn_off() + else + return ..() + +/obj/item/device/radio_jammer/attack_self(mob/user) + if(on) + turn_off(user) + else + if(power_source) + turn_on(user) + else + to_chat(user,"\The [src] has no power source!") + +/obj/item/device/radio_jammer/attackby(obj/W, mob/user) + if(istype(W,/obj/item/weapon/cell/device/weapon) && !power_source) + power_source = W + power_source.update_icon() //Why doesn't a cell do this already? :| + user.unEquip(power_source) + power_source.forceMove(src) + to_chat(user,"You insert \the [power_source] into \the [src].") diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 74d9a4b8ed..8456faf7f1 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -362,6 +362,12 @@ var/global/list/default_medbay_channels = list( /* ###### Radio headsets can only broadcast through subspace ###### */ if(subspace_transmission) + var/list/jamming = is_jammed(src) + if(jamming) + var/distance = jamming["distance"] + to_chat(M,"\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.") + return 0 + // First, we want to generate a new radio signal var/datum/signal/signal = new signal.transmission_method = 2 // 2 would be a subspace transmission. @@ -503,6 +509,8 @@ var/global/list/default_medbay_channels = list( return -1 if(!listening) return -1 + if(is_jammed(src)) + return -1 if(!(0 in level)) var/turf/position = get_turf(src) if(!position || !(position.z in level)) diff --git a/polaris.dme b/polaris.dme index dec43b6f73..f155a12189 100644 --- a/polaris.dme +++ b/polaris.dme @@ -799,6 +799,7 @@ #include "code\game\objects\items\devices\radio\encryptionkey.dm" #include "code\game\objects\items\devices\radio\headset.dm" #include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\jammer.dm" #include "code\game\objects\items\devices\radio\radio.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" From 60889202c4465b4ad273c2d6b008e816d501113c Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Tue, 9 May 2017 20:45:03 -0400 Subject: [PATCH 2/2] Moves icon --- .../objects/items/devices/radio/jammer.dm | 6 +++--- icons/obj/device.dmi | Bin 51066 -> 51528 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index b66957aa61..9e99e1837f 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -16,9 +16,9 @@ var/global/list/active_radio_jammers = list() /obj/item/device/radio_jammer name = "subspace jammer" desc = "Primarily for blocking subspace communications, preventing the use of headsets, PDAs, and communicators." - icon = 'icons/obj/device_alt.dmi' - icon_state = "shield0" - var/active_state = "shield1" + icon = 'icons/obj/device.dmi' + icon_state = "jammer0" + var/active_state = "jammer1" var/on = 0 var/jam_range = 7 diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 5e6d88e0a3c6c0fbcef46ae158279f58059e1bfe..336f8dfe9ca6529e358c535cf800995662f80912 100644 GIT binary patch delta 9776 zcmZ8`2UHYIv-XfdBuQ4X0wNhDhea|X5+tL<7g2H$khBAcfPh5FC@2U@mYkQI1<6UW zZdMZ2zn9-;_iT-{0vN9tJrzkdc1Ob{mRt^ z0N!MNGwF?)m7(n+#k_3dk?Yr1L zmK+YZngtlagn+vzoql!SYc`A4E&-0T0C1bqXg%RMj{N4swk7Pl0d{M8zPb+uh zZ1nX%i8sP!x#SlTtB(Z6CvwQ{80i@G2B-yQPYS#aIQ+e;b63H4!-S-=K3=z>NW_8U zJwu!frTx$bLE35Kto(zei<us!Ezr(%OUG%SqnhaQEnWN8qxr`=DLm9MddJ&m zKli{eCo**}$V9z+Dp^jA!!VwO@++$+bzt0E;J!9I4RlgT*ci*TCJ#);Ys*QR+&n2f8H=S8x~oS^z;M~5^e#Pm|zx7u&lcBKcb?4MZOX40KQ zL`RMqH9u`0yAx)jD#gZ}psq9c#a@t%-K08CO%wl6{ydT@m4?$=2C~fq3^S8T2c1i0L{ol{oGKNkFnEB0!K6_3gW3J&7Or@Jm-(OL# z%#WE08!BNp88eM8Pf78LRN(SzteaG4u2@f{tv-X8?~ZR^=7O}GHI=(oxlKQ2{pyU5dHNf~fb?TRYuze@;p25*dZMaiz9+v& zMJL@3X)jRzhD;0hD)xyU;`*7VeEdYza$Wwxf`Z>mY>BMdia*;*eZ$S%`=8cj@Hv@%ro`44>qYu=V1-`HBvL zuU|n!y;TtHiMMLQ#K>81?Edxx+ne7lRbokszq}-?#>6yUkFxy{yEM$JDls$PoO!!i zop4-%Hq=TV4@-VUm1ljo&hAT|m1ZzM>AfCRO|?1^1Wf4upJ4KVcWJVuS*P2bj=Pzj zFXr$6@w9LDTpLKsd!TvLcUpQNhAMoP5^3H7)?XO@!Jin}>jPtxm#J>M263M$)tnn9 zCDp&-{<^a4z93%_FLHKM8O_JXw@*RZ7I-=!F^~n-oDmZ;FI!><$TgS(K3L;GIPUrO zrSTm8nxCR$VMP@i3G8As1>^j>Iu8+bIs0ZxsdSP2CGze4U7pj~#n~JZN>+g&@dsd$ z)=7|4s-@Fsc;!=Og@v|#{?5SqES zy~I1?^z8l+-`ep8;Z>85JfZ+VraP8)ZWi2=lfUo~m?=k$m+Qnfv*Z^Rxc#b{T+YCu z)sMq|>s<9#Lv$3^%x_6N_hV$qc4g;)&_Fnz%d>?oZw{yU*GJ_2+sz-$(Bcw)HwQ28 zME|_>Udh=g1OTH#dVb@^+*j<`)o9nGBpU~fyO_B#*VmXFL?GNSuqB37Hq5p=hBI*W z5up2c?wjUn)ql~30huyh*BG?eftM0QL9PS>=@)Xxdt+yFKBz29c+NIEX6LAojf@@O zS@0l-#PH~V+|Nd#KUxhEp;ss(DlQy{CKmJG`U1b5t^wV`jsXHqYe>`5OJgEQw!Y0h z_qA@7_HCXu>Br z=qfN4Zy-{-!bclI^ST?GE+JlaF~QQ(S1#Z;a#8(i30x~-c6|nhu}O}B`}tY$i-rm)xJM8HDw+g|1|oK?8e?aoNNNTXvneDF(9$xdzu#seU7;xEfZ73)|SI_ zi!jZI;jytX4s?RsQ`Rj2h^YW6RpD+gMIxyf3;kXd^8Vc&3ZH)VU86$2#zfTeVneC3 zaoS1kPm9#W=4AAs0gmWlOH=#DOZ1vg|KA}$9By+@0sj8)C64b!6B?G@B~gH1_L1*t zXNR7xThU*Q!d19TYIuZ}aBFnhY2@`b4da|G1Nt_a`6aQ>`lhC271Kqa#(mlJ6nAcp z?Bha}i_O!I&>-y1*6(fL=ZxgQ11uE^iyK`CMEiZMCqibhnvy;^)z39FkoJ)pa3BIg zLqiu+vZ!nqHysA*_wd|T`T3bb4-*wn?V)5&!`E<#wJ=O zyC-+{mM0VG2WKTI;Qpq}hve7dPsfx98_cum2jDNFpEZQRFAOg~T+Kag`+oe9bIh|f zODbn0funp7{4=$TTf{Q^4C^2qKy!^6j+9lYKl3lLWXFb9jtgAyDyE%!X3mSbc77n_ zB4N>vSSqPH9AgX4MyKYRs=~}Zyy1fW&jagn9=yd|qP?pAth&Dv+UUJl<~bqU-=XT4 zD`4{{tnbVjV~oqfDdJ7k#U9viZ{87~qrUuhfC}Vz?mj*?mR;0%Jt>JdBMG-$5vwOW zp-hLDNG5{!UCI}1NVmx z*CPA+-RFW{N;g%a2%V~WW=B^&`($E>3r9W`PyYeT6#LT^NfR6AFhJe;F5 zEsQ)^Cg9e0`K5*OO)uZ|`T}J#w&|%-#kN?~tLbG7AGxl+MQEXISkI<N)g za`E10PsS&Q7RU+XY+??^#df~9&u|SNLiyy@bDa4h2_Yd@{SN*|62A2p(g?Aj4Sgt^xan z?qunok?3JzHr5 z$glsCFru%okJ7C_&d<%Q+(-!#myaOdi(<_3rGY}c?}7@^DNrX5Z2}GwM?Y%F=ry7; zJuQbYeoULfi2tc~GhL99J6(pwCnSUvv{$`3|CXX%@(TEC^^3M^L2jN9SOXb^GzXX18uuAU!&6U3~$jK2{uJgYO?5C+R3?$4>~>JxfcLC|1RBw8m_d z2mE7KUF~TujMbEcx z4O^bD5)q}-f#zMeLf0Cg8e2Afv=cF%GncV!!tL1|Cg`1|bEYg%hVo$w3IJ5oRWyC$ z*YO{^olm*Z^N@ZoB?$-&T>M^0@HnVlFWiqNuHNPXFEa5-U=wL-kS9fO*}wEMopRV8D?Jfczrx~52ytw$s6?#iW> ze#b%a$*+)7D$tA!_jz|4SI(GheY~e`eW0G9Yi97hPuRI)jAqvHc!2;R^#2zKimq?J zloo<-rxTfHOn?zTXUS@ zG%97KWzcD?{_NWW*D}<5#-EVI9)z^)e!eV5KV9-{_VC-8!X;2ZIcc*Mn)cPv%zyf9 zNsZ>E9A3KpJQ13Y0-!E`BZ|);*g~Wu&_)z19O65Sf0q7uU$yCI=${a9$TqeQgdefD z6Ops~l$`0j8uY3wGWVz}cR0Q$t)1!x8@RuhkYX<4iZ@Z@$I6a&)Ly|~5J%%h#5f>t zy;%vmB|7GM=f?7ljmcrlseSt?Y(w_Dg(~cVm@q559PE}YyBnp`=JvLnHj0eWg(1Kh zR!y9o%|S?rQc_eD&Xfm@qs+nys;UNq`;2gKx)Ft$P;to*hC8m0!kaqqS(r&UF_PklCD4AN)%psX}8ixcPLwy*9Ec~V2mLg z98ywDPhGM?(CmjanfAnoL46K*=R!JN&e(tMkFbM;6KJ@xgmLNZl37JF-H+6XJFaR{dLSlpyPtO`3tLO*UMamm6R@C{vZZWo1-MA zS+bbR$-2|-&Mp9kRLxSDxpc;2d;T<$0C6c*bIxh0{a=F;ZcL#uRj1)+wiximded>E zkNLhOGZ9iSSWv|uEJILat(TAh0cG+-&T0H#ZORZGrV~$d*})3hY=V78)d(ATbRcGt zyeHU5C#wq>__JR}*-|G%@|cI6lp-f-mNjVFZcgyi2H_Vqq1%Ft*A>4Pb@Z1uM)yQ$ z1(9qWVYO92*wemFPxt%C0@3 z4a2Z*K4 zgd~VBss4(atC2$judtRi2-0)^sS&{6{@|VvgJ_B>=RxuHrvr9+P|I&8W^FWu&Vv~x zbi7X)kP`-Wa=Dv@y&5Ys>3GKcuHzMRUMhc1oKIQyw3r!({4f*JwLO-|m+6M=wTk;U zw3ThtmmqIV$0LTrf(ow``iw?CkHjmPQ8O11FLaf13 z2FPkE<$ofeq@)A@&_j&5_RL3S&N6ydIaE>TYE6CkK2bwitQfC$PlM?5b*m% z0=ml{j-{5cZwt>Y)VqPio@U#0QYl=`jft>Hm}YJN_6CzxIV|TBmNEv9Ctg9Y;W@m@ zHc0a$TA#yApjF7&_QhXDIxew4(_eYODqT_~ioth2(Yi14OYAh>Foy%tVSG}e#)NN+j)!UXQ8(mejrdaXsu?Fq@=)BTj z;c*;a>0T#Jy9wW?8FQO~+cIKtz6sjv`eWd$%iQF$AxcC^Pld7JmqQfu9S|nN7(Q9j z%Kdc2P2h;Y5I(s>(cBXzzE|9u`#$lnhw=NIzeE1oyWyR^&$8b4VB>dYpr|3=l48V- zj&=e9_Dnt2OeNa<&bt4N0K9vy4?q7X2}2-YE=|Wqs`V(L9*f}M{heU~uc|5!b`imN z{2!sM#Yw{kKNJfU3z}ZigBn${rFtCW7IGB1Gs<1**AMDL2~D1jnb!{=?h8@^>T{=V!Y6K=PrdT$H7nvj&EMd=AVk4f*-{XpHu-+Sr;!n8`{s! zW`06gjO>+Q2`FkD{Z2h*OSP^wXBJzFM=okvRBvM6EHV;4Wb57px5M)1fkj7wR%Rdt20{K+xAxphm50XdcxppV@Bpabki? zgF5{>r|!y&z_k~k(0ePbm07GqI?Ds6(?8?L2|5eC<^bl?IbrZRHDT(`2c6pxlVXm| zdsT8giCmy&Jm42GfM`B+XOuo!uD! z^nrKDKU}bb_SUYCsYOd*X>nJ+j-bmVc60%Q{>(vQ_9_k3eQdrsN0!*}ks>Y6=L91# zuduJL8kZ*n$a-zjwY7r;4VXIu$qJEtK)|ivsG0Y1MZzICZuT zMo=BouUU)h04doI^_v6+CI(YT!au0V7s3uBRLid^M1tTK;0=suBVAS!I$&O%5*+oJw+bxMmDjb^xoI zX&vhVZeKn`uoa>Ms99M4puKfLf)I}E^70!e4zl-ll9(P?Q5Svr;7mVaJM2!d@&_w% z2eB3teeXGh z+n;HoirrwOy4&|?PiExiZG6SezWerjZ2vSKt5u-C2)&Z_Kkey%=|!D;1%YIr4(V{X zw^y4FMYBXPj@p)YK3dSzhW=sd1QR{*$oO*wPKF)y+-o);7kjG~tJW^Y`oClQaEpr@ zHkSFgX37NK+@2^t@^gcD<>$Zl^Z*GVXNC((mSKUj_z)4-r5!*7nn3`#Wmy3ktCVCSs%l^y1Kh>Ly}Qznh?R=@O5DYWGKtIY&IBZ zAhysxs_fbTbY;#kQ@;lmKJu4DUWsd8sCN1Hb6};I&CN|NAOM0m?uo+m^fVCkO)F&! zej_&vTe1t=vrzpj1bhq;ZX!_3UVUq6?u&9`VY&HB# z>d@ez+C>Sj2jt~!+Kk5fOvpp|iF9d5I|TkWGBj5Ih4*CWtq5k&3voOj9?6H9>t7fa zL)FCIw;#0n-pgqGS^BNKKZ;61HV2mr51IGXGz_p572Z0NZ+#r!B}9FfYjlJf4TXdGY6q=HM-W3=xY}B z2t6~*PqIWMdN^a)Zoif)mF~~=CVT0NnF|icQ_=;ZE4g%p!Q5j>3gG!DQ$T!4%&?%Y z+U5JxRC)jE06EtCFRqucP`?$m?E(NHBja{Y12VND@bD$CzoJ0;O$e0{B{ z&%J{!I@f^PU4kR>XEJV!fQ_x~tN;Xt--Wqj@D?Suy6<->dz0UB0xU}=(9D<-N?my2 zd{61_EM5oOlJmGz=Y4sfijMc6&PguxWSPsh)UDMCLGPnR!RCv}Vsrb8e~w-NiZ(V} zz+&RBj3x;tC<^s4MDX$R7v^kl9BK$R$vZ~{iOV&Pm)muAZag<56ts-gx)R{}(UJ>N zI674tp2Xg=_#P-d!+*{k^g~646q|XfTnMfTePGV+Z;ky=z6Hjq;t%OSk*vO0c?n>*279@yW?Q*Qp3baG12t=qhCSmy8>XCrr=iTYFcW2hU zhn1E%QkJ5kY(&OcqD4KyEPH^~=aGe`X58*y=$$BInI(j*bpk2Ss|jj;l?>3Fgn6g?|c?&qu>Bhe>H#JTx%9;g!Rn{24q^3ytv%kMZlCI zBsSQBepx2+Pc#MMI~D>GTbuwu#HOk8(15lxEo19=qV5=Xz9OTIv3;7~PtvHpJ#X;1 zDR>xbj1#B!WLtOyg1q~}lt1s~&1YLpd!s#L?gLTj8M&#@_&D4g=2V?@nD{wC*}0=f zXIu~7)SK9&-cKJ+Lv5YCzSdUD4D$a=6FGuO9#}A_$-oU2I8I!q>3t^=D)5ySrFd_@qYTaX%yN$F*dR~?xU|qLX0-V zdFw&1RYRXvH>lOB+Y`%dLEch%!Yhg5b$nk`B=Gz+>VKC@wo!u8WYnr>cF*a-jLud5 zimNr)gbcbXH4gZm3u*kD-8y0>wt{L%IW5BQn6BC)QkDuMNIAol;xjXyP&`ltXBpAI z9;>6jk~xT*8^*=M4YTQyW!dC~x@#Ec{xXkCbp4=WWyO)_Z*9BrZ>>*I4F_2wRW}F7 z_JJTdJ^h}=RDZm;MB6c;w3F72DQDku5lI`xBIA2&H$Lo#sz1OSuRo#xJ=iDpc^ z42Dy$Fi`|@NDvTlB@ya@ErXfTZ?mo?uMDK!pQ^BrwU`|%0KqGBcymM216Le)**;T) zu$iB;f4{E&;l{f2T*35}x&MHog>d{j4hVQ+h!bDm8YGp;0nrg=jQus< za;9r@WuG;M7w>4mFlvx1&gEa$BWDr~TjA~&`6t4@M$Ttv=B>}8qs@F=&MIvsg@qwO%%mDxLT^L;qke2(Er3Z@<$B@xDs3f1yh?2-$55V^Wz!EysMtKpea0klV%K%nIQS0y ziGk%9m=)NkqLTTDBDaA-#$C~{lmj-G?@(2>uXnf?NCO9l|yXfvdXPYX&1#A}zBJ zd;L6}wtH(D*6! zGYeymSvgzuBUA{>9y_AMP67&~I1LmbT5CIwbO2K$qQRa_sF9#WxDUn7$v; zfh9>1Hl{+g!h?sYRq!5DceVE#jyn(E_Mkom?!S4K0OP9*dp@5WlkhgT?QQg=^D`3_ z{VIgHa;91y+&YY{r7GJ^WHEIKV>X{iSP!-k_k+5{wi}p+Bb0 zzLY3rG9DQB(E?m&k-xLL-~@l(*P#|!A!1is8qZp46r`xZCq?`4zMtD4y6u5v)l1fW zf7H2xi#R}jognPT6-Sx2wXqVP43pX^q-b$yEVG)EfF0r|v*x6@{@ingMlt9&2~|_V zsF9h%=U6O5tiRt&_f97YQ?|}Ifk|2F0Tm@0*`dXiPF+x5oUAW6)bK|00BvrTRzK(D zWBdF-1{rNPva8EzuA|vZdduphFU9#W32OM=zJ1>}uMAn2D{$LD*;f(Njh{19G*sqC z`~~w>Z#`3F6ygLenHi{`FE%IpuHG|fQAsT=HhF^xgEh`Z2{bBlU8QdHi|V+QSuvRu zBG7Iv=tK@;W;Av*4k?_fJ;l$t-CGK7yXxBbd)f0O`z2c`S%0uw05xR<62P%d1$*rQ-%spM9yJ_Qs(1xjH0hrMc+{H`MmJo5daf^KMCl>pT7a zyGlYgz9^e_We43I3;BJ6Jx*b>X{%5rR88isw0XBJ zlh-=lOG@cZM5S=b{5)|b+s6`?Gx{mtJ#`~*?QgBpWfT#!jH%b!>z)jl)D>!jdTazW zh>b0Yeh%ZivN+3|*I{==x2?%9Qx&5|a->td>Ce-UEFxp^v101R<=L6aF7o_*P{(8o zPpm|I<7_Wu+LXv1XK_{)`D^*nM?;OTJLdL~K&RQG;I93xzAp(i?~8_W)YAD_N~e+o zi*CLzG9FJpwCA3=6wswj-<(3mLdN#cbyuUG z7Y4kecDAE@lWy$m<{X=una%ODM#k`GZd?QB|L~AH^DM;oE4EssPWT~lg@Ca=L2a_j zu8>>nWtCRnI39o@(U{yy1^mo3s=1Zjn$k|gmp?PErq-64Xxre0)(4pl9p+{R8LLp# z`fkLEUp!xr-+j2-xX-0}xH2mB+WO>rr3C$)7AGv8i0V|P_uHKF+ZA&ewwkSY^S#e?d3TJ!Qfxwow$!6EMY z_X%PL4XYR zsCUSyZf1712?4(T_SKDpuJ(YHwR8JJFetupSH)N7*mK+I9%cJW?u}h$zfu*4lS!G{ zavI_**y)=oD|jcKGz!*7TD8i!n#iqoSKR4mj(>!G%`;ROx^b>0AAd%3AomnRj*j>DpsTzEN zi$@VaIIc?=NtCny2Lke@iOR)dJ{j4jf{oPAP2_7 z#EOtB*zgC$RZON`T2|JKL*AHOsL@Y}tAm@*$eMQET<8g#g;>0Y`~zh85-baz$jQw; z=}`Omvjm`#Gi(2|amQlBBjV2)7DFU7&8fy2BY{5y5!*qxXn{`w+XZLua8wQT$EkU! zS(Y6(pY<_~@EUSi+BJ=Fc31x6)w5NSVTTGve|q*C!YLTdq(!sF&F9}DdiEsvASRj6 zA)n0H$qb4#jY(>Be9#&xmKf;oXLN9I_@f!~H=+RoaIDK{M8|e@-IiBS5R_Ln9~qlF z4f%Lm-qzuHvpvGLT<^8|ra7Yf-r<)!CTJ<0IAA&zOOJZ zuX^Xms3;Q~o086MS=t>1e}Dhj9}-$)vAO`F6#VEXn4PAL;8z0h*vE(LNbO!i)sAa+C<-LKEzSmXgxi&6B(-r#37XLDajzZ@#}WZ!go=6NtPB) zs9CRMT7Ze0J3a@lnh@<fI{2!5N)o5Fd_0vq&*NqS4}wH;|Ow4HRBdp5DE* z5})eah(nfZ8${EFgfqn(bjyMJ?RlF7k-}Z7DCS`7Gfr%Ml5+P(hW%5lf&0$Pam_(I z1_!8Z*C&y}L=tkTE~uVRzsvJVS0|)9HPPzmik{7i4QcVepm8O_FB?F7;2QKAZOR zUAjsw>cE!_t~!5Ji-D z?|+HJ3gr$#lmUy!p8@6y1;zZsFkS|BzUOOGcpu*&e}9E`7`9gWZ*B zm7DidQsdur-JZV4FIAM5mh*ffjIyg6*6s3WkIjb@KRy~6rKB+k{|i?=Ew=_g<#mNOh`MX3Dg{Q<;16sCB)F+6xkmG~ zP9j9R;swpFbo5F@=XC%jBj@%su6<_(*&J(a6Wby+pm>iHQq-Q>rKY6B`kky{xZr^< zlE-g$Rq0#I`Jd07?{(XPvQ zwuh@8+(iEh=>7<;q(`P?X@G3_%WvO`1ya;{PX&_F;mYfv6mv_Vt5*y`HPGd9R|%RB zT^~?wb6BacBPL#|{V+O&@U82D`B)k`u#ArPtU=EoXNi?uX+~7&Cthr8Ypc+{w`fV( zU@JrP;^D~vVxL@qK(iPK1o#bg5TZqfhURc*(34v=(AYQ$pPu?{A64e010CJ3Q^je> z;$OV5QOh$kxhI$wApmLs_OkC}FRL?`G|n&>hnA5c>tQ zA=wjbV1+OIix7xjZ;k&ZIm9v(51RAGR)5Wd6nMUiRodeNE%4qCf!G9|mkRw2(W^h2 zE8g<`e(vw)Z))x8`kDQ98ew>NSP^ep@sZM-8UGbmJECu7q;qr4`-@$TJZwIE(X$Cxz47lzFN?^G`Ymbz zrzm|3lpcSI5S!P!N&f!*d#_S;ra1zf=IE%k8mF=9r-8AB&}<*2!PKRaQl)A$-zBLR z7!jG8<5%OgUS8*syLd?6$#lt)=7K}3KVesI2GTQ%;EEU(ESWUm}ifGe|ZC*O~3J_JXuOW6zR3LB?fGzt9* zplc2v6Xeot(J4kX9ME zP6@=z$B{N$KV{_X{(v`|2+b2$vQs?X-t8%cAEI|OR)qO=og)z?u`zl>hc3&^DESI(% z`j^}ZE4*Vu#Gjs$Dsv3~45I08*#_}*nx(@Kf4e=FddkGs6rE~k{kT~8``9{?8gBIe zHz2j4VNMi*w!oUwW~!zkkv7>AGkn#;6H?;6U;-|ceG6N=1^_l|-aXl2F=8Khl~1FV zJszi(pLVB~H_xdlJ@MK#aQSP$G&s@$eH}%IN>VmHN|oM2x=Kdrdo=r%k309ILL8YDJ;UfR1Sj9U^C%?( zpslBHM1PSV%GXM+D=a6S1gFQhB|vlBku0vqSsTPG*u&Wwjupoi)sv=F0^x8-8(Q$y zV*6mJvsX4cT0ra*V`L;Qm!L(?{ZtW@mmjB=nA(q#(cyof>lL zz)l!>&GmR@Deb16SR*Vwto~wHb&oIgh;tf18bapAlZ4V+T1Kp^4AYe^_--M2 z9G3OZ-}=c-dbCL*y3X67dFL2;&1a;rl1b0sz>_$yZq{&KbuZ4WDd*$73c4515E~TX zmDqEtUSELa$)Q+AMoJIgs^g22Kmwb+QP8IbVfejwB5+bJ>EX5nh7h;4p{(aLT)icL zI|v2FXOk-P{KM@i=rjeZDq{9Fi|NgRr1e6m4N&;JOq1xvva6DJJ)^hR>UN)%As{WU zpt&+eH>l9qJFxbna}5W6xW$10^d!?))Ab^TM$)^DKRF!AHxww%xRRfT9PS2VgGptO zZUOTUCOe@8L+5bi4>_fVe?b)F44P2e-&j}-8h+&K*v}%ywYDN!8}~50 z!PgF3YT%#NNU=bggga0{eZSM{V@+4h=x`I$1+ts^G+z`HKzHfiQb++HA^8Jo_r}0S zHvVq|ik{vXz(~r6auiNRRXl%w*t!MVJhEYQ5AJq;7yW~C_K#-t^FuQ;dSG>|oc|lN z@?@{3?(lb8JAmTXM#9%mdLtq_CIbQB&TIUK?yGWR+7M@FS!$}!7)JVE-+2#1HzN;v>e! z!lrctd1?m|ZVUJVp2a4EbHnEa1;xt0w1@F{nKHd59M*p;5Jn2;VJ}U$ZR)*n9)f{Z zu?;fhF+}wm3+u<*$Lxy@*Z5LnaskBTq_s}tFs+?Yp(yvwn9R>1CWs`* z9UCdE!+A}J{nj;-oG$oFXt_@8Qtz1{$1~CpNsxRkPS+`y3(Cr7e;3W!(`z_L|AIG4 z(?l*k<6R*SD_azQ{5k911?i=tZb2IVc=?hA>afX2H~ICpM`%LntPHgEvY`ld0_28! zrFg0!Nkj}fgApDko&|{3Nzd;&of0=2Fo#7=n%tsdq4cN;n zKX|ofa@YL4L3D$Tk!v1Pv~s51HU&uLceufkF&?d6Vw@MAMb#G10J|lr)aS8>2PmDLZqn9?`(q6AAciaY z1a%5AFqMw^>dDWkrNw$+XALdBj2>Dj7vCj${3rE5K5>|I(~eYz_sBlzm)R3CCWYL? zahJ1g&FrVPw4*>|1C6FYR zv<_@Gg&iWJMxcLeR7h5q$*joOqR;>niDtQYp2S}L8UG`21TkX~e|`Jnq%D`l+jGO` z3YA}2N0=AkB`8g^+J-=l&(|J$^s#yx8%8&a8`ZVEd2K8Uc-_;G*$tA0oA8f(OL_^`leDA)@gvFtPkph* z4R`20QEqUq5nbxwA3tl5U9)r;G|NGu$@kl(e4+R{F#cj`_XGsWIeyQMsC7Re@T+3+ z1E@;;*0-x_CN*BZ*~fnup#_Tt&as(4w6jCF!ytV7koqnkh1&+8?rSrmQ1J*IAaZds zhB3dK`cIvIKKzT0q0o9nSp@j#JsKG4w4%;+p<4t;>jw z!agB^`!4*EWS=6$6b1Fm)1qX;?LE`FeSV{MkB*iT^L|iwP3e|zxv0}Z6=Jz4e8c*Fbk(zZ zcyqA~2>Uv8cnihP?Ld4A3Re1@WTlZfN#5Ej$GK%yIYRHyxG5bo(ugeg;^)py;7eX3 zgI;2a(DcKW0b$B`aUio!MiN)^J6|u6n;wj6hBH;9ra9Ft zT>d(d^H>rtyoFnGCXwQdr;TOA{h{(_c65cJB9{y8uk6Pd_LIw!=)-8Hc`m6axng1H zf4VXSxb7dcXDp-si7X&|#xd?(J>PUDsrB>xe}xuIfYdjc=+Qf@|B#S{?y7DO@I}2@ z!H5?l6@sKx?Tr~9N3t2;(S&yz92dR@qlMo$q#f&Ef`U)6+0UL^EHY6 zEkaqrwPF?hKC?9XZdZp-outcR1JIfLB{VI=?N*Rnza^z3B!^=&IpYt7{?}if=F*G0 zsWnOe19RYZ*sNOy1}rj|DUQeeS*@d`HVu5!128afFO(Hw^xvZs)Rbvi>L)L-%%_UL zs{{&#^<3%+-YpL3_6V8_Mx(HTKD;&5|I*IRPy zWQW~(GOVa9^77PR*M$w>jxu zR##F|0uXN{tz6+33UdfsTgXLQoka;CB~qr8TqAcg%1$qMzhnh@Bz;0?JSv-F1NV>4 zgO7Jtk1}WK)vdz%J3BSo$B3ygEo)yn9BLBBiQg|-UNz^h0LM?RdL3hYZ9e!1PAfIJ z1T%d^HKMQoh1h@N=XAy_Z%WbPr>nf_1wIaLAND@Iw z;x+s&+E4|bk3)ebm|o&+QGp&)s2!DICrAe9W3AO7;&T$?8?+FC+8eK}!!n@;s5Q}< zXJ6bg*nLpE>%{=n1>MNEc_gCNj4`1b@7mX%A;q11)@Vpm;Kr8L;;+j-_8%>_FV{i@ zhA$-A7-x|InL)em6Qu{rOk`p<@cY$d12CGk1Viq6#xcS6v62Dz?H`QktkdT~FM3?Y ziJ;H?g_N)=!=xg%!Cf0FM4!v~M*YCwV^Vh-4?z};T;SGyY>=|Y^o{!*{88Qu?GQj3 zGevU1hIP=9fc03ynDfgjb=>NYbX=z_OsyavLPzAV0=mZc^MkkjkGCCuwYLY{eGbP} z@7Iixjj){ZzRj~!!R@aJgX*DMnIEM|{PY&VU`t%Ti7&d;5H{R!V43Rp`7Ng2voQ&T z)&wGa`+P}PeWcw;G(GT~sk1oRN#F$#g@u=Zrr#<7LGH4KBo$@w2LS;AR%rv9Nwy)O zeHUrXw6*J^zo3fvt=SvcTQJ;VLD`{N<7a9u<-fTGD9k{+Ij#qOd z9$g~+=fTfGT4GM1Au~kaveLc%=jE3>#l=747}1^W5o+KBAYhkt+st#;jrdLH@lOBP z;{nFpCnIU`F0gIU@&=B64H4z|a)K~qFXyigQD@eU&(+khL37}< z%+78Y7z(hHYJIr_szw6wXdlHdsLd-+-*iUd-IUrn-qt)xRyoUlQq{NSN%NIgMY}A? zsF(<$$hO*Z)pKb~=krrlzK04d?#N zPfsDFLZhZ^AwcNkgH^;G9&4iOrF5Mc#%-@ zUFmyk6Vd*PCq{HR=l2iq1ppvfSu*#z_Rx-lf2e@8illo+c+fQ2Xc3GbyEoyxV*cR2 z(0NG$Q+56&TMN7@0C4NpEdY@ih&I}uv@cYf`S&HBNvo(#ZML|$xa5n)|5@`>=ZR~q z$C{a%4&Ob0R!T?rv0A*m~0O@l}$5^{e%Rch|00cOHtpET3