From 0bc6b737f58f621224394b13fe1045b44ac272e5 Mon Sep 17 00:00:00 2001 From: Ciaran Fisher Date: Sun, 16 Aug 2015 22:45:30 +0100 Subject: [PATCH] Added Signal Flare MEDEVAC can ask a pilot to pop a flare --- CSAR.lua | 222 ++++++++++++++++++++++++++++++++++++-------------- csar-test.miz | Bin 474450 -> 475176 bytes 2 files changed, 161 insertions(+), 61 deletions(-) diff --git a/CSAR.lua b/CSAR.lua index b56db8a..79869f1 100644 --- a/CSAR.lua +++ b/CSAR.lua @@ -216,76 +216,76 @@ end csar.addBeaconToGroup = function(_woundedGroupName, _freq) - local _group = Group.getByName(_woundedGroupName) + local _group = Group.getByName(_woundedGroupName) - if _group == nil then + if _group == nil then - --return frequency to pool of available - for _i, _current in ipairs(csar.usedVHFFrequencies) do - if _current == _freq then - table.insert(ctld.freeVHFFrequencies, _freq) - table.remove(ctld.usedVHFFrequencies, _i) - end + --return frequency to pool of available + for _i, _current in ipairs(csar.usedVHFFrequencies) do + if _current == _freq then + table.insert(ctld.freeVHFFrequencies, _freq) + table.remove(ctld.usedVHFFrequencies, _i) end - - return end --- local _coordinatesText = string.format("%s at %s - %.2f KHz ADF ", _woundedGroupName, csar.getPositionOfWounded(_group), _freq/1000) --- --- local _setFrequency = { --- ["enabled"] = true, --- ["auto"] = false, --- ["id"] = "WrappedAction", --- ["number"] = 1, -- first task --- ["params"] = { --- ["action"] = { --- ["id"] = "SetFrequency", --- ["params"] = { --- ["modulation"] = 0, -- 0 is AM 1 is FM --if FM you cant read the message... might be the only fix to stop FC3 aircraft hearing it... :( --- ["frequency"] =_freq, --- }, --- }, --- }, --- } --- --- local _setupDetails = { --- ["enabled"] = true, --- ["auto"] = false, --- ["id"] = "WrappedAction", --- ["number"] = 2, -- second task --- ["params"] = { --- ["action"] = { --- ["id"] = "TransmitMessage", --- ["params"] = { --- ["loop"] = true, --false works too --- ["subtitle"] = _coordinatesText, --_text --- ["duration"] = 60, -- reset every 60 seconds --used to have timer.getTime() +60 --- ["file"] = csar.radioSound, --- }, --- }, --- } --- } --- --- local _groupController = _group:getController() --- --- --reset! --- _groupController:resetTask() --- --- _groupController:setTask(_setFrequency) --- _groupController:setTask(_setupDetails) --- --- --Make the unit NOT engage --- _groupController:setOption(AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD) + return + end - trigger.action.radioTransmission(csar.radioSound, _group:getUnit(1):getPoint(), 0, false, _freq, 1000) + -- local _coordinatesText = string.format("%s at %s - %.2f KHz ADF ", _woundedGroupName, csar.getPositionOfWounded(_group), _freq/1000) + -- + -- local _setFrequency = { + -- ["enabled"] = true, + -- ["auto"] = false, + -- ["id"] = "WrappedAction", + -- ["number"] = 1, -- first task + -- ["params"] = { + -- ["action"] = { + -- ["id"] = "SetFrequency", + -- ["params"] = { + -- ["modulation"] = 0, -- 0 is AM 1 is FM --if FM you cant read the message... might be the only fix to stop FC3 aircraft hearing it... :( + -- ["frequency"] =_freq, + -- }, + -- }, + -- }, + -- } + -- + -- local _setupDetails = { + -- ["enabled"] = true, + -- ["auto"] = false, + -- ["id"] = "WrappedAction", + -- ["number"] = 2, -- second task + -- ["params"] = { + -- ["action"] = { + -- ["id"] = "TransmitMessage", + -- ["params"] = { + -- ["loop"] = true, --false works too + -- ["subtitle"] = _coordinatesText, --_text + -- ["duration"] = 60, -- reset every 60 seconds --used to have timer.getTime() +60 + -- ["file"] = csar.radioSound, + -- }, + -- }, + -- } + -- } + -- + -- local _groupController = _group:getController() + -- + -- --reset! + -- _groupController:resetTask() + -- + -- _groupController:setTask(_setFrequency) + -- _groupController:setTask(_setupDetails) + -- + -- --Make the unit NOT engage + -- _groupController:setOption(AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD) - timer.scheduleFunction(csar.refreshRadioBeacon, { _woundedGroupName, _freq }, timer.getTime() + 30) + trigger.action.radioTransmission(csar.radioSound, _group:getUnit(1):getPoint(), 0, false, _freq, 1000) + + timer.scheduleFunction(csar.refreshRadioBeacon, { _woundedGroupName, _freq }, timer.getTime() + 30) end csar.refreshRadioBeacon = function(_args) - csar.addBeaconToGroup(_args[1],_args[2]) + csar.addBeaconToGroup(_args[1],_args[2]) end csar.addSpecialParametersToGroup = function(_spawnedGroup) @@ -440,7 +440,7 @@ function csar.checkWoundedGroupStatus(_argument) -- stop wounded moving, head back to smoke as target heli is DEAD -- in transit cleanup - -- csar.inTransitGroups[_heliName] = nil + -- csar.inTransitGroups[_heliName] = nil return end @@ -887,6 +887,74 @@ function csar.displayActiveSAR(_unitName) csar.displayMessageToSAR(_heli, _msg, 20) end + +function csar.getClosetDownedPilot(_heli) + + local _side = _heli:getCoalition() + + local _closetGroup = nil + local _shortestDistance = -1 + local _distance = 0 + local _closetGroupInfo = nil + + for _woundedName, _groupInfo in pairs(csar.woundedGroups) do + + local _tempWounded = csar.getWoundedGroup(_woundedName) + + env.info(_woundedName) + + -- check group exists and not moving to someone else + if #_tempWounded > 0 and (_tempWounded[1]:getCoalition() == _side) then + + _distance = csar.getDistance(_heli:getPoint(), _tempWounded[1]:getPoint()) + + env.info(_woundedName.." ".._distance) + if _distance ~= nil and (_shortestDistance == -1 or _distance < _shortestDistance) then + + + _shortestDistance = _distance + _closetGroup = _tempWounded[1] + _closetGroupInfo = _groupInfo + + env.info(_woundedName.." ".._shortestDistance) + end + end + end + + return {pilot=_closetGroup,distance=_shortestDistance,groupInfo=_closetGroupInfo} +end + +function csar.signalFlare(_unitName) + + local _heli = csar.getSARHeli(_unitName) + + if _heli == nil then + return + end + + local _closet = csar.getClosetDownedPilot(_heli) + + if _closet ~= nil then + env.info("GOT CLOSEST") + + env.info(_closet.distance) + end + + + if _closet ~= nil and _closet.pilot ~= nil and _closet.distance < 1000.0 then + + local _clockDir = csar.getClockDirection(_heli,_closet.pilot) + + local _msg = string.format("%s - %.2f KHz ADF - %.3fM - Popping Signal Flare at your %s ", _closet.groupInfo.desc, _closet.groupInfo.frequency/1000,_closet.distance,_clockDir) + csar.displayMessageToSAR(_heli, _msg, 20) + + trigger.action.signalFlare(_closet.pilot:getPoint(),1, 0 ) + else + csar.displayMessageToSAR(_heli, "No Pilots within 1KM", 20) + end + +end + function csar.displayToAllSAR(_message, _side, _ignore) for _, _unitName in pairs(csar.csarUnits) do @@ -987,6 +1055,8 @@ function csar.addMedevacMenuItem() _unitName) missionCommands.addCommandForGroup(_groupId, "Check Onboard", _rootPath, csar.checkOnboard,_unitName) + + missionCommands.addCommandForGroup(_groupId, "Request Signal Flare", _rootPath, csar.signalFlare,_unitName) end else -- env.info(string.format("unit nil %s",_unitName)) @@ -1155,6 +1225,37 @@ function csar.inAir(_heli) return true end +function csar.getClockDirection(_heli, _crate) + + -- Source: Helicopter Script - Thanks! + + local _position = _crate:getPosition().p -- get position of crate + local _playerPosition = _heli:getPosition().p -- get position of helicopter + local _relativePosition = mist.vec.sub(_position, _playerPosition) + + local _playerHeading = mist.getHeading(_heli) -- the rest of the code determines the 'o'clock' bearing of the missile relative to the helicopter + + local _headingVector = { x = math.cos(_playerHeading), y = 0, z = math.sin(_playerHeading) } + + local _headingVectorPerpendicular = { x = math.cos(_playerHeading + math.pi / 2), y = 0, z = math.sin(_playerHeading + math.pi / 2) } + + local _forwardDistance = mist.vec.dp(_relativePosition, _headingVector) + + local _rightDistance = mist.vec.dp(_relativePosition, _headingVectorPerpendicular) + + local _angle = math.atan2(_rightDistance, _forwardDistance) * 180 / math.pi + + if _angle < 0 then + _angle = 360 + _angle + end + _angle = math.floor(_angle * 12 / 360 + 0.5) + if _angle == 0 then + _angle = 12 + end + + return _angle +end + csar.generateVHFrequencies() -- Schedule timer to add radio item @@ -1163,4 +1264,3 @@ timer.scheduleFunction(csar.addMedevacMenuItem, nil, timer.getTime() + 5) world.addEventHandler(csar.eventHandler) env.info("Medevac event handler added") - diff --git a/csar-test.miz b/csar-test.miz index 8f6183d02a40adf6d4e1e1dbe472abc706809584..8e40790331f417f23a49c9240f822525e9e00e71 100644 GIT binary patch delta 10018 zcmV+-C*9c6`W&c$9k3tfe;~CGN3)L38eAp-0M42K00;m807FwjQZ8(DVeLI@bK5wQ z-}5VAO-)70P>LkKl59L%j_oAA#E-I+OzmdoT(n3@oKU2er0i&>GQa)08xH~?D9K4? zcCYSODMuuMMx)W_7aCx@&5j0#S8OoKqIto_X~vF^2J9%xqMP)Ff3beIxBH;oX79r+ zkJ5zoI(^n=y}idz9@DD_qukHf0sH;)11vT;84gd+Uk%vHiz{|^IvAW@oU`MT!Rf2> zlPh*xxu|*v|GZ10B1b^1advWi^8WCMeb;Mv+Fjqc+cxfYjJsX^?&{@UNN z`Le_!DI!kAInsqiIl#gwZS}is7A1=U z(2vGOQ%NBkGnx`j;D68zR7Yyy4UCzDgajC#o}FC08wxzb1na&`v%^!UHTL72u**Y2 ziQmHy(FTK3e+%N)ahA>i<0zR(WI7r{uwqqP+}W@rD9J5! z3fTPKV3J(a6!^@-JohJ|n2X!xT!iZR6y`nBe=Gta0wW?Ji8?e4CD)K@IUTcQx}Zr3 zk}ZaUDBcp*-z7jrmZtL@Ci!GqumohpEWHH+#VPPhn52uzlw%dAesBz0z)wbq)-It1 zt&F3|0vI!puSiUCn1JsDTTR$BjH6LHN6~}=C4?Wjobs6;MCkzg0bm<9p$|YiFuVJU`(lLyHF%Bf}VBd==Og55xet?w1v4G;UC?^(tadLQc zaXw%_U7Qc$&()i)4fOGUSFcCBnh)}A$wt#~^f5=AWivsTN0TJX9{4$^m7+OAefq}% zOQIMQ(a*`x$)iW?^~pbETW#6a7JKvve_x+PgCU!OF2W(Y0b#>%K*C^)ULsTFI1E&5 zyR(nebP7X?1P6(QQMUmbmVL((qfF}P<`7<$bt@=W1kE0CuL{4t(01bT}CWS;8VF_Jo ziV=KqgwwdD3988Fxom(%0^W0&f8X7in$&fKKxjx}knb6yB<7uzWB#Y>g|JR{p=h$0 z-Grn}$r#DGl{ErU1jftA&$0-N5}`LZz<7DgO@}}>mlr8&-atN zhlC#Dm4(G3OMvh3CQP79^eawBz-l9$8#F8M8S=$7O2j$zBL~ocg(|}T{{eI+0?{DT ziw6YRM3a;CBDqQZENEV1FVBIsTea;&A6ygcgR1(A*)_t~W7m9=D!kXgz+Nd3cvX6+ z-pZcV_ZSBBHP}!w8s;(Tf4?jaSa=J}BIXwT=0${mWfDn$|13>T@V0qPPjy0ZcJWx4 zA(S~hiklLUDz5MbLh@&lBal$^0O%5drY_K=bTEt7Nivs9kRjYDu$?Ht>b+fF+o%o{ zfpR#_d~mliVr~zBwn2zh?5j8uRd}gP+l{ArmwR zeX|`H^~nUfmRy(Eq-e}E(|4DmU-q^x0ckef&TsL}6u zNnj!t${L-H6G*4iKoeDeUA|}=&&xqDIS;Lfy5<|e?HqxxY{X{ob{l;i40R?UMoe!q zP#g(Os6{f4mpIw(MMbR19ZNgDDnctxGP|9J4^}sSLA$U}K~uM5h@Qb!(m z@}mQyf9K~)^J|r%#7Oo=DntuGmlEu)9Rc!<$c9Q|;lVQ0teNFpqq|$3T863gp=MqY z<&@(rrI^B=&&ihF5pGDa3OqyFNPzEz1h=U%mO|lx%MB0XDI+XNeEr!WDNy_m4zEDe z5x<*)qDDLfDUT9~2>o675CdB&aP&M&N1zbVH+t)ItXkw8LVG-}!-KFLGy=$Q_A2_Q z97oODk;V8+G&nHM!*#J`Y@mh&uO!WEd-4PyV$3HNIC;e~9K1>G32CgIug8iG`VR;UUV)1t$@-8ONaWnLqKPM5=lV!4P;fU7}ak z@2aS@US^fZ6t&-RbQAIxs)Dg!HD#426j7L4MZ-63c(tsqMa1$`YIwm=(8A@wMY96@ zEovB-Fl2=Xe-5gkOkDF^BRJ<0ay<2^UBkU)SvjW_fAdyMA}-xUQ%y_mIITQrunfKE zdP+EunlKk=PDC{-r6X$B)({qTToMQ+1&`54MZ_KCG^TjsEleZBz@Z351enRdDDYvV zg(YyM_Wf&R>qcQ-iIE{jvi5;cdv2S@&_AOBJTE94n&1_Y+?BZ;ee|TG5VsNxozM-&+Elu`4t@pv-Hv7KQAG0^Fe`DYqutpgz(8gc55XEJhlSOec z7BPn=AJdlT{o`J@DqCRPjzI$z0Ggtnvy{ImQYu2OrMpbT zfi!-~{P`TFFR^&TU6x1BseI4Fw|s4&@biz(fAVv56mu%?>IN^w{lb-nctMHjKqHV7 z(Xz@02$Y3qDTp>-A=9NE(#rbb8DCX@c?OSQR>1$boCz8TGa3AVujX<62F96K$h;AT zFfId+qffMSiURiK(RQiDrlF5)$3T`r#b?d6SgPrdNODVbMV-%eFP$$c4?nNt)W!T* ze;Hc;p`6;Mapd~}l&%GkFK&vch(iKm z3q%BXt%4G(zyyn|oHJ~X&l)h?!UFC7YzdE40!h0~`9Uxdrv7bMwF&mRYn#JmcWR0x zZnm& zv0S4SM_3m|_EaPtu~8cEj0ZmsKZU>c`66nm9aKRn(D1_L3-)kOzI|Bwj9da5#qomi zr#ud0RfNw=HCt8g6N;C^Q;!X%fBpnSlZ}!p=Eh0B{z|0uR!4?(s0N`lAwktJ^1|as zT2h!5fGKNra)dFP`3cyXWmBFp0HudxwV)@AePI(4#LDQ6zP=#iQl`5^Lx3qsI490Q z^HAy2plK8n(--Fw>epkQFu}vg-|+>4C@|p4;Gb;O3j7&m=V@*i6_UZ}f7zA%@S!1y zVB0YK<%D;IEVd}n-%O(*2orZLl&iuT_^dxihng#GMGO5knm9(S&!vAUmz4XKJ4}E& z)F6lqsa=67z#ib9IFP3E3D-eELekA|;-=S!KaD{e2N5v%*-k_7fgWM_dibZw7>sSO zCJx^;EM^wKM*wP)X6Q0;e~cWpVxRE2V!5}% zJ(W|3g0le8Y#|BnL^xb$^(AM%rNMN79e<3!+}xU2jJhCn`8#V?fAC)OSCRzUdmcAF z@{{8%x~-XWIcCvuEBxfsC3` z*9vO(hovj*xWtOcf(B2A!WmtxwpF7VB3C=73`GiYcp_2W0LNSDsEFT?b0HSLgh%a%2iBQdjp|ygx%#TDY_+wn3vpkmgKa*IljofkR^ zNTVNy98=W!mnSs3lEA*Qq2^ z9jV}hu9H@k)g-^(2iL-t11VuJR&+<139f3jDQj46AL5!R;&Y1jZsKUFeF1(4=`ES~ zQ|ce(Ag5yUhM%(nhAb@jmIxru@yX$FMf>8WR-X9IMli1ua4@VA(sZrOvFCXNdaYIc z1c*VpxREo5(Jl&Fo>voL>gS2rB}B$Spms^!e`UDYk8fX<05=^Ko)rDZK}lvyz|@Tw zpj@`QRXcj+^yO`)#hcSZlk+`iSWlv(YXOI;VNSQV$~Dj-)>xNunu5rG6E0tK>&&3Q z>9NRzyyig=qXAW*-R3~p$8br*Atx6~ppfrU!Ighk^Fg`qPR?z)6|ZTaQi}5m65^Gm ze-?4lDCp1GHuw-VMw&4|w6Dk%P!fuJJgk9pjALtcW*=U_`8+3!b}f07qQbSTv-lU8 zIV7d;VbYiy&t=n4dq@X!$JYmwsiYLBRHtPMX|;e%;)>Cy!~n9{mmr}$WrlMnfZd=u z6Q_5S{KvhzTo7;ULxDSgS!wCp(rdNBfAT>5&jILq8Td>yD=cQL&3&VXtOm=98Bt?8 zfYm%e(f=~dYP7CBvDB&#t*L>J1t8|q6%uN5DbGEK{k&kixSgIWPAOa9F*Pe^x4y5? zA%-QD^onZJkv$GS>cvc2N&`skdDmrevnoJzL62cfhq%{($v~Q0)0fvyQ z%U0S{kxAx!buwh9=UaMR-GtQ@2siunl4KgHT+VtcMz2FM>NG*QCU$)v$o|*tP?V@* zfKTk^<*^AoMg+~$MDFyCa&0%ce<3jhrUqB8H@$u@)41=~S0(+qDP73DxZo&0EXYa3 zXETP{j<)Ulr9GVlx``*#T$-Tv1iQ_O}w$Q0Mhl9h*E!HrZN%2@q+ds6*JW)YNTpWlo1FR&E zxpKT(@R__mkz{iXlq#vMe-FA7ZSjrH>cr->k-41g5kHy$EQRflGgn08&#<`fr%kl7 zf3-U#npJFZKW=yQk`@~QO3!%7Gp9sWLCNo5VirodzOnJ|ijRNsZ0oR7N^ZnV$t`y5 z&k_|Sz;wqPI=l$B*jv;?cu)u(gmAOu>jK!-jxiyP`M9m8+ly^qf8bl7hD-PnQLj%2 zToWRAx}%9?c54%wI5Y#9rkcaL+wIz}zD{-h{EN+K{*`q9N4iiBDp)0VHj!x%oJ6jX zdh+@rN~_MSr-ila*$OyG_a^p{$&J&2{$3$`lpID`Nvl@5zqU$hZaZN@Z%lL|Pif|{ zAPq5u1+*pU$d{=Ae}gP!VojO?b?Gcb%P^$PyE(#9)CU6u!QP?Ld1m^eHWLxn`uRq6 z`}*Z^6yL;@*8v;!4vljl@cKHlT3*oYngLS#o~st<^8=>|S|N=UNP5!gvYL{3wc9*) zISo-)Z#l~-PlXb?EhQsdy3Ufd>tkJ=rMq<=DJHPkzkatfvC^9LS2j!uqwYDb!)zl@KJ-D~dV8R{FJR$MJ;AukFsY@}XUqF;VPGQTIpI-H^0v zq{gbd#yFS4*fXn{l;O{HtdE1z=r zkusxjy^Yo=f0Q^Y(o_ZQT-)sQYwb{OFaq{sgnj*KQc%A_Yq?mzl%d9t%yAW2Nr#O_ zeh5^@6V%Efa}7QW-xYWsqfm%45~U>@^i=*m4qVMSCa$j9&-8owTQ`aXNvh$2&4yZm zs`@D|XM~U6SFO*e&H)z zp%JBYee6r0G{f{Tj&Z_NGu+e}b!y99n zGnpQtjU{V&J<~DdDy%3s=ZQlK<?u6 z#M}p~;PB%3g3Z$$o%E&5g`yF~_^?s944~kd0etvs!{|n*En``zG7ZYQ%t5}#QFg=R zDS3^>DR&$)R~$;Jo9$ILV#|wbzv@vC8cZYPTW3jCEZE9}O{iv11iaQH$GE}jq6Hz- ze;F@oIdS7U_etWx6)8Tpa{WP!z}nu}69gSjZCX);qrkAT=G+=I5H${1yXT%8XLwXR zW(009BAb$-I#Qb$pblYtenBzwEjp*3AL!0)r7^AnAUAJGDQ)8A3Mj2hr6Ni_2j|!_ zub%Pf!OE!4y~KfojGN2{C*xL0Ej@R4e?tDVl9V|Qa*^#)_#b&5Ep+YY1hi*_Kt^$t zM57LSm8JpvHNB}Lc7>_diKwp?Pv1f`xuwt=9!0X=leLH(fp#mi*VUshUFX5eTity=TJ>$6$8He)E1SuP@xG+LQByXJH!J>g!_07D41DK3_we>17y zQebXCKtioK;)P0T=e5y;XHkAgN!iVo_7DKQjmA79#SXT~eLq-G;r>8-gS;BbMKh7U zkEh+rFCXybqaebsAJ_-l*ctkIN-yuQH0r)>0&t;kFX>laN6D{?%wgK$P83&bF5|JZ z8&wV0sC*|YnyZI41}%5gY_%Bhe`HEI6%&R&P5?_HRL`NL9pUAQnq(4w+mg$K9&6xN zcIa~e8puj?r#ve;Mqe};1OTpWGL zgE+B{9n?6?jt4fe|CHP=8V=}ptc;!4yF!z zuEQ4iYjqSLox9+v9?@;5yF$mW^{5DozC4hss{DDF^SJ!r7O!b7RjlJ+Im`r1GN6nK zNgz}FE?=(3hGF1TFQAQMw+1SGl|>88(aaG8D(22amD_m!Xl)f>NeV`+okCiB7RM;h zaYY%mN==BefACX;M|j|56W_~oq@x)CXtwHjmXlR`S~FMknt6)XeJ4`2HTOKi%Sjph zLI8drK(<@WXfP7NG!we%;3kU0BR^=FW0hjE@0FJDaok+IMGsq0aCoDSvT1RU4Q3=>D3LXFcj7f3l)*X_d+S)ivrc;z* z0FZzz{!%q`9+M9%;Z^lwvSPi6h;vWFM+dyYNeJK4ZeiB7xyfR%xNQL-z7#{el`I0aTuJ|fo%(Zve}<|6+)T+6IiQH&E+}tNyom54LG((LJd@W| zEVG(Hf|qO9z6_@$3OrmWS)n0Rk;mS*YxYW{R_LyPqjk;N)*IK`{Y&gL`XO{i$b;0t z;p+S4I1~9n>&(yd#f&!eV5bWHf34E0iC5YZbF>z~Vc1JhXpG^1-f)`((kqMiOYxq7>D1w;z~=wTiYABkNWlC-)P2PN zZ>d;6CIGhC4*W%Trwd*qKHZ_GPj%e20|y#6Ow5u4clzbc z{`T$)FuU8Gu6Dn(quuO3f7NR4_Kh2@*xpn9MlaTX+Uu-ne8sqylu-bAmvr-R+s z34?^titawqvFU1r=s(>zO70uDJkc6>s=w*?wAOlE=pT@@>#?Um9k#Q(i^j;l$M*K& z*>?Xa{J|Id`#O~YC$`_EqCf%<7#V8p@8F5(U4*sU(p5-So`2(POTLa*0D9H5&N z=)xXj3;X+2LS$!kXqtBk2UASzJ(9vLeWJmlOh{0wC+$SSy`C=p-CDrY)BZ&Z|i zjxr37yVH#^sDyHWhxk!ToFBi?g^nsH8XjYCm)RQ;g&}Ay3EC3I^~pD0_?M<2nr2tmDxyk&>oO|Rvfp5)bBsEOpf5#8hO}=iV3aUbUbmUNq zPe|2{B`BW%(_<-b{v(Hy4~`tlVj5-jBY8m9!~c&Z`!|l|t}&L5AkeDswc}c6on(J5 zGlNv)^*W$N_?tEBl!MVp!4tPrw2aLUUe*yz|5id>Z)5;b2G{_;VDYwEo?A@E2iNe& zyTu>y$GOg?f1Sr+t(VnowvjYgwf&LBVNL-Qu*2DC_81f9g%r(Gagd8F`r_S?9iGw= z=Tkh#z-RL?8;4*?^R4VqLD=PorxHKPSh@{IotZx=Bd+g5pmtO&F{$!7>vp=k<|cs4 zxcaI0^wgD321m zko8?KqlL>bn*&QlqebkmZ4Trky_rYsG3#&CxK+hM1+>zgpQ*El^pOna&B{o77V_qJ zX1E{dOFrsQGjhY!&EO|vbp(vcSGf6FIb=(6a1DcU%+=XMZXwX(g}1)A|& zLkO67jN>!~xyheFV|{3gR|T)FWwlm~*(+eZz9~GVMCa|(U~WE_zM7K_DVzpwziU3N4YUb4|Rj~6AIWH~!N8nL4|k8iRYf5ryA{{EwGm;D&! zMVzIq?+;j)^$(sreL}Aujf)^>FW7GnkFeP2vy0~O#r=!v7#W_1Z8J)g9 zKe=RgwTr6z_~(5Zmjwc1t+SKklOKmi?5lpu)9wbw-L7%BXWZ@Ucb6x}2#Gx~!0&Bb zlq{RDAW2v`imJd&%)+9&@!mfx2 zC4LV-L>mlBe=UhyCwVppjN^1Fk?}Q#DCXI1G|rL?=f@rbJfa(5KYBF}@>}R5qNB#z zV?CtfG>@XxV|`B3&|?Gqbw7(sD6xybvph(r5ew1~K*K#kP>f=<++W+Wt9M%3_({#dlc_@MD;cf1)-!i^AwG7z>!=EX%`kwZP%r zMS$;NEZzp?leZaA{rLEdwR;^;dvZ2n?LIs?dwmJN2Jq|UGJyeH0UGl~l*d8B+PfX- zNA+SJm3cg7?Y$1sgxZYL0GP$sun5NEWgd)IlBVzSXdIJJ%qC(+Ewa1>f@%Of=y`;a z@TwbTe`A=1C7YGy;`x&&_wjA)&$8(>F8yWka^uvjE9 zFfOp*b(*Eu>_#F^4Hbe^@q7-=2gx{(?zK5K;#^F(@c%rx1-X_j(-0BGqOzWVlHNh5 zfXzP{Oj?MV0-t$Q6u~qSb8)wti%`9o!MsPBf5jj~U_>M&QHO@1;u=ydrxUiymNY3r zvL#Ru#aqe-`vj=WvushoB%jVomV%6!XLmrLBm;hl(rh`MajcRo2#-Mv1nC&j+9$N2 zl}S8Z0%L~q6^Tg>6Y!m4t0|jBNj%OLD4I~9MDU}KQ$7#EI2&O<0Bq|f3IM1N!`s3J ze-OhofW8Y>DX82ePKX*H@swC59m5D1<3I`@`(DmqvXR^iLZlRq1r(ph1+n1Eli|_D z`H1~=aef7VE`QkBLLdKk{d&x+1t8y6Y&?s`w*}%Xn+c;Lo~BX$C@4U!lbMiOYR#&#Q!yZ4zf7fU6=!(ri7vT`yfUsdWAW^tOFOjJV90n@3 z>mTAYoxzYI!9gM|(-bBKG{VKmWBG(rryv^!AhkMTOo&uhnXpf|qR8&kC?qN$!63j0 zg8GC4y{6ZwzUe(LAUO4Po-G$-uRI6_Dg&4Se4t@AOz}NZjx>dwT2~-Ei@0=Ge`WzI zNxvW~z{t-S8fN!#IU{q0s~iB2)T5`+7RiV_o`SGR3fB)r4$f7%77BRQzH!mXmE0ak2`{!ADg17B!da4tOvx~=~ z9HA`WQPP%xRB?qj5RyNW9D#(Q2SAq?G{{j4W;AmgS@aW3XG4YeN&H)vLK0x z4?2$Fu&-`6O78%`Bx@IBp8A0QJSf|(5e!ba1if_`6^r0LWnUNYujMI{dU`KAoej+} za05W&!o*xdJFU2Cf4&6UGDo|JGYk0cDc&uz1y^Hh0a0bY5U^g!8N#^-;r*ly!AMN1 z-zv88jG<%?o`48+Mw=H%{4LvW?z$8d+dQ|Qkv!2Kh>3`%x;+is#youH;AeDf$OH|e zz-$LbeL96M1wNE_G;qcX$49S^}gr2lqUe~bCPlR2-z{n zC`q^Z>^x&fGw|ehTHvVmI<^$aBeML({1YZYQ5jWlV8s6FB3Mmkkx=G>)*oG;{CIMH zb$#+*Cr4LkL~D~ObW9&LSz08Sc{oOr_T-mn41QwE!ktTOvNc$J%9>@R$}>V2GIoK^ zIe|e+zN4^>f1srOhz2WMvJV3fpT)1pu{AP{wXOijleYmuYY*_>J^1E z(($ToRg-k!_NTM+mAdf=e2vA~Ytaz8az~e^?}#Hye;|nqLwt@dDQnprCUSlaPb5n6GQ+3h@hu)6s(+J&VGsv7NRfzZbXJy1TDI`Y7i zAHN`ae?HWj->3{FMzS|jAzBE!lwg132#{|?HdK}f50;^3%`N8|-QD`sGEAip4fBd9 zryOS~#T52@PImN;a6^jK;2F|J0(>tdxJ`|T6bdi6-0(1-GRBg`*AEU!f#QEOyaZ84 z{B8=02JsMPJW3=Y^!L#>7}&~yqZfHL28D>$f1B@Hwa7Vy_IO-}2Vs3Q0?2UoYWk=e zN6p)j#rR7!I55t`b+Kh^poRpmB+G4k@&q4Z%sIhO0XR4q6X0G6nw99v04*i6^Hqr) z1Fk`mO*;}3mt(nxciYz~xtLU42+lAngE%Rqba%{0tn;(-qpKRfyVR^y*$t~AC@Jje zfAYNo>C1WUa-4+8L(35|q)=z2Cj1#8>$HgEt!{FfRtho)BK&eiOs-QAFQN(+1(GzF z9>B1C7^Si1)o~XkLXDPtR{(tnQGx7E~*755ww{kpz~QU z4dPU)dJDk_cr;s~S2pOWsI*>YoyZimf8TR-Q}Pz-f^kqcWtArsQN9{s#H=()`nokaYVf)gCC^^kJm`0#GU0Vf1%jo z9Zad3u|pAy7%-KAQsB#23sd0A?T>Gi?Hfl$EoO!nVkaTI5UQ{_uwv+?aS0w7l#k42 z6!Dq?a2d$~)bRuWalQ7Ip0+VHFtR5uF@V}?;FYkREsggztqa26F8kUaOxO=^er4c8 zuvQgS(D+2S8s)pJAj{)oB4QJ5e?I0NL5(N?foUads1EHipdE@%CH%qzEk%7euMrZlmAt6q*r)2VFVLjl6q3d*3kt(9G%(^ybh z8)aUA`-hDMcp-_|NFzcGv8wonMyrDJ48&TX5a>~FXjOf9##hu|oxvmEe}4EMmoh>7 zU=~9V@|8TU+rTgriOp4#rkgqOG2<;E_uD=yoZm2N-x3 z+(mUge$ZRbwz0sJBww}8{)NoDk#|X&9)UBJX9-`0;g7iACm**h5sQiysIa3wvLQXE z5?8=?R^?hjSV6c3MCt~?cvtQPo`a;JoI;2oR;Wa z0}FBqA)RZk|El)Zn4ftBRf^eVwK7c6{RSh=9p2xC#wz2l4$(0Gf_z$V+!_LcSl~nd zXOI6F{M<1O%cd}@f6<5|q6!0iD)N2UI172QL6AfrqhAJn-9m=(Rs~TONh;#X0sCfD zz5S+g*SPR9isJ=rKq(Z)f&`B`JxHWf+7U{L;i<<)vtSAm#zsjMbK@jme<4zOt7Ag| z)Z;&z9FR_fSV`9Mv8>ofRm(3B#(WOme_LzHGX|h?F02;xe_XB4Y(j!q8#vKJ`!XbC z#!6@iFdGP`#5pJrDt#KZjbdU3<5WVmc+7JZcqI2L9-EIt1Fnp_$yTkHn^AU=6?Rb} z9E@Vpp{n@dLrV}rH#4f2Q{ELan&MD@GmFD8O5L?kvcak4l^GgW%G8Q?5oPEcnkgrh@~7eZPoS)v5X*+ zAh9Hx8y~$b6Ln-4sF*X~90Be{!T*!JLO$bW>hkE#-z=g9$R12R~qX zVhR`vS&!Y*B2vk2Q<1w(>WF7}u4st~Lm5zGS2H>68x9ox{A{ubd_SBe17Q@amx z%nP@d7SA+!gz;A7RCGT<3u!W`BOFNwfAQ*s!x?joj88Cu-8liJZ=Lg;I7-~c)uy7v zy)KJ*d`qj^QY@NnG*DMA$`XMUQ7f8OB;6+cOs8gq-nE&{R%s1miJKIY@ml%cwt`gJ zMtja4%vB0n9=>+24|BX4hf-f9mdi~%EnbkROVs5{#;7s0#6#Kj25+Z5nknXUindMS zXsVR_AfZ5amG%!J27nhjG>UFlDGDq|S8TG(0Zy*-4B=*_dDwmXc|(@6!3sKXjR*|@ zB%*4|Qg%ls{*3xZ>A#uSHxU%9e}o~6O1>Kbh;w{0Jg#Y9+)v7L&e<5|RSFJ<@m?CP zjmhnN0bhr@u9pBY%$7HD-Z0v}Ke~1mXWs+qe z@PCL_Z@6t{P~h}fBp_b%5Qx!$D$wn6AnZ0;(QwGAh4Lrj+e2{4-PL?pZFrM2Tke5t z8>m#myoQ8$Whq6RG79>4Y!^I;1{2K~AllGliYE!hJs#G;ImWTGKBW#X;C!A8Mcaiu z$_?Q<)>-_sj2x2DpJ33KfBMd4(NKFx2Xm{{2a~C!6sT3F^$2ORfJEYIF`(6Vve;K3 zpFCxRa~FW!pfQtV_mp+VeY!#rZxTR(`(RaT>5rw?dUNHG_@4vNwKDLTW>i?r*qC%i z4_O12H6xxEIq61E@6{8-GeTs1eKH^wrEr*fgz=MoR zN?y~3Iqm`&Lb54Ee`s4pCYkf~$rU?2-_h&p2CS|?xY4hdB*Rc8Q8rsKdL5Ecrzy%c zvEBNG?0>`7K#3}b_rx|@9+|-NJJ2Xi(6(_K5<_5WaOGyx>$fU@`qTQVq(3*L zOSuUa+{AB6auM;_oT0X({qjL&O{bx5;>kQUlVrH%@_UX+f3=0R-Z^J#Wu<{@5l9cD zq0fFIRUie_I1lFFc5(mfYj6gZt73@de$+MGwqE|ilQ6H z@0_1hu?m#i$>G~sxJE6n22A&^wuVLHpg`&6>^V!MR3+uoS%a}%6%&EK^pULY}NjBF&sgm02pgY4A-{`DPY>ufK+GLOUnE+rZ?B32@ z@r-|k#rJJ=(eclo zZ9Y4t%tB04++oMTJXKKw%rz{a!^?1oy+u8QCv?yW1UDrMbt#EW!{L(3YelU!(#I@`#BQX$sS2^9U`&h<42u2uD#L3=jl+k4opc z>5JM-L|E$w3pH)1m*+tIA*Q?z*r0c09Ke9rf0von@`7$R43OGzT(>~Kd*L)eYoxIP zNl*PAYbc3Vx65Ofvj}zdjC22QE`PLi6l@>GTd>(GmRCWlOIX=U)uioHhS1#jGH1mRl4BwhAQmH{` zfkYb5q-)44pK|w+@}h9HjaDd>I4iSE1?^n>+w^PWP;M~-_F{y6{mZ1Fenr+|v3@B- zjh|KHDzcUiTaEk`P#uphtA@-q_%M8zf8cqHBO%I2lvZreS4s3Za195DxVmaT)9>YP z-6#?ysfP!)8)^lr?x(n%5k7ujv_7LkCtMN4{G>HHTP%ztvY2T73Ky zHC7!Jq^rrbi*pKwMwH6+u`hknTxG)~!3k5(Z&QcEsewbsf(PIotf3LS<2B-5XB_*w z$)n)5_GZ&8(rsM1i5aFlW>7(I)k`3rQa?Q$+uLY3wJszKwDq@M8N-jClGO&hUAHxkPB>q%BF}&Wk))djn<;DO< zyj$YVUzxHX4nf4s2dm)K#qkAOWCc3uE13yJBZ~21qi_{K!Oi-7_!`6Le@3S*V_B#& z4a%mxLB0V|cEjW;c}>LeavU;O97?L2?KyWmTrV;XOvZQJjZ0*4|RI?`n zUK>(l++cOlf{^KO6}6nWb)8R1;lULtKDKiGL5#r0-q;fa9ZqdpQG}z!u(Iad8Z;0! zUa)T8JvYwqjCRZi++swweAAbp@t;?uEO?NMY?m^)Gp~S z7(!@Faj^`YY4e5xbNc}jYQxzoR8l)AjUGIYiy@_Cw>#QH0Q5GV@Qf5Y*d}-VU_piZ zBkc|HY9trUMDji!e={pTIlz~X!Wch0V4oyo=jZDQy}ZNHsQY8ne@lIH$)NT+PJdbE z4$}_zp}1Oe8IP6SsA{-I&1X46UwQWF!XT(SQ4Rr03>Y*uU6C~ zlknS)Tqg8b3qNl|=kRMFYtfzRxX$y8arUFtRkUHaJVn>6f8|UeSCiA2ou4^5>kP+Q z+KhB_wZ*e*&dL(m`(;Jp#-lX_VV7y`Ogv6l6BZ#-lN2V$DA8!-2PvNjw9PUp9aBiF zXS22$%F%Oi^d%4GI6bKXid{lsRp>``N|j1MrAn6)ICscqsfCWJ16XZgCdp|FGiF`J zsYiB*Y?<1pf2-;$(NLFCHtG;G#)d_4OgN%uw;T{Kjc8z!b>e>6a_|qJQj?{Rj0Ji{CM;& zAw=dun&jeK=sLoE7s8`|55D~^@Es_8@pD6;gJ<=bqEE+k3j}u+g6bnpr{e2PTVkue zkz}C#fAVq@(s?vNq-Btl`U?KmWi;W7!UmID@zf6PnJw!)WAx*Ue{8DTt@iWjJ>Tp6 zujrsBKbj>O&MAhhPN+{`R5o~$hz*$XQ+%T*V6V6>8m>u|Ia9MF=EW2R%g}&_;GVZ! z4$3BXM%luyIF#n1s$Og0M_TTsMMF)qDD4X(f1aO5v-M{m-1g5#yGvJ6)_OGVUPTHpl_)g&MK$L=#4@pgCe z!x^o;Ky5jcKBf+OuA>(CYjqYMox0$u9?`AeTchJQdQ^nPpyxEo?WLq^dFC!ZT?YP( zf2V1dM>?B&+7Sv{eOE=ZsJ57Ac&)XWZ04ht$~xa6434}OfR;~i*P-f!)8gLfJ1I)p z`4e)4=(p`zQoPFj;S}mH;z_2jqKbRy-FBQEu{NzP{9tIL0;lpLrJAMh5Km;zShl|f zNPLRaDg25Vegd&jvyow_TrZ%_+@8r}e+bj$G10D*x$xEd)Om`p1Z44-s-g3kd{}eT z)C-5vZiVj{Pa|L**zt)T$kcd^mlwkLG+`=le4L(Mrw;0l57c@KWD9~ z2%p5)k|LWvs;2s0TaQqIPx{~YTmMM$LmmRKueP5MmU^UPL%%sZt%oXH01|o_hWM$V zbQzb?TxM_>hZix*e-Cia6Nw3ne;0!=6laT^0hCjK(pFnLYbPV=r;rG)S+{0UhwUM6 zH0+r*MCzZdwi}H>GC@y6_M+12RzR^P0%hOv1D+qsjO)&}gw!#Yhijs3bM1yyCAsvN zW#zk|#P4m3<4DC3iUpm%xxB%#sG_6-t_U~VA9lja0Y&_FL80%I3rB_^e|i;4p2_RV zE2^(W;pG~(&%^16674ROtk4ju$z#o&FId(vY;rIbIQ(T zuM(Kw^u@2bl~t+p1uE>m$M}zdVQzgC=7=cdf7ITstarca_5O}q5ahdoSO1vjve>!#efo{b=^RmrhJr*#(6?Gr;|2xWY$JP8U+k?MA#C{K) zAbh$(lbIvot#JCG}kD1UEIbCe+?t1AE9`-w~vQi z4}nF4Sx_n7-KTv|yV=ujz@yvmY4`nszhB+<`-j@y?%trfIo#b}17?5M?`ijYd)m$6 zGp*+Sz_`(h9X!)-^kRc&eSb~kdnRVjjF->!Ci=Yt9qge_7$k&NbpNT2O;01l;Mt*3 z^3cHLsn)ae~2eY6J-J$7&i&vpmT;19kyJk+TSII+VX z6$KJ_z{pVJa1ReR?IEoFzD@~zLgdg#^eHrUFo0$W%>Dq+MeQRRFxD0&2ReE1@YFs0 zv)c!uv-^|~Jn-041a^Rk5nW8evx5VTa8C~ou-!w66?-}ue{h`H9`zbg==YxvRDnZ; zu|IgKcM7W$)3T@7LF&CIez4c4mspXoLU=uW5c>T-;sD*GBe}81*uvogKw*QSj^e01bciVrt5jwL9b|I=eBZ~h~P zk`Im?%5oOx%_I4OtcU*}OZIOZ%Y9=k9dVd-Up>WTe}*Q>{+(RrQ;j$4fCk}j)@)J^ zMkfVN+|AH3Ha`v3L@@o>