From 9ae2fe5bbe9a9ae76c1794adbff2afd214ba91f8 Mon Sep 17 00:00:00 2001 From: DarkGod <darkgod@net-core.org> Date: Tue, 14 Apr 2020 11:59:23 +0200 Subject: [PATCH] moar necro --- game/engines/default/engine/Entity.lua | 29 +++ .../default/engine/interface/ActorTalents.lua | 6 +- game/modules/tome/class/Actor.lua | 25 +- game/modules/tome/class/Object.lua | 12 + game/modules/tome/class/WorldNPC.lua | 2 +- .../tome/class/interface/PartyDeath.lua | 11 +- game/modules/tome/data/birth/classes/mage.lua | 8 +- game/modules/tome/data/damage_types.lua | 16 ++ .../objects/boss-artifacts-maj-eyal.lua | 14 +- .../shockbolt/npc/lord_of_skulls_archer.png | Bin 0 -> 13134 bytes .../shockbolt/npc/lord_of_skulls_magus.png | Bin 0 -> 20871 bytes .../shockbolt/npc/lord_of_skulls_warrior.png | Bin 0 -> 15802 bytes .../tome/data/talents/spells/death.lua | 41 ++-- .../tome/data/talents/spells/eradication.lua | 228 ++++++++++++++++++ .../data/talents/spells/master-of-flesh.lua | 4 +- .../tome/data/talents/spells/spells.lua | 6 +- .../tome/data/timed_effects/magical.lua | 72 +++++- 17 files changed, 431 insertions(+), 43 deletions(-) create mode 100644 game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_archer.png create mode 100644 game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_magus.png create mode 100644 game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_warrior.png create mode 100644 game/modules/tome/data/talents/spells/eradication.lua diff --git a/game/engines/default/engine/Entity.lua b/game/engines/default/engine/Entity.lua index 4400a211e5..ffbbdd1dda 100644 --- a/game/engines/default/engine/Entity.lua +++ b/game/engines/default/engine/Entity.lua @@ -940,6 +940,19 @@ function _M:addTemporaryValue(prop, v, noupdate) else base[prop] = (base[prop] or 0) + v end +-- print("addTmpVal", base, prop, v, " :=: ", #t, id, method) + elseif type(v) == "function" then + -- Only last works on functions + if true or method == "last" then + base["__tlast_"..prop] = base["__tlast_"..prop] or {[-1] = base[prop]} + local b = base["__tlast_"..prop] + b[id] = v + b = table.listify(b) + table.sort(b, function(a, b) return a[1] > b[1] end) + base[prop] = b[1] and b[1][2] + else + base[prop] = (base[prop] or 0) + v + end -- print("addTmpVal", base, prop, v, " :=: ", #t, id, method) else error("unsupported temporary value type: "..type(v).." :=: "..tostring(v).." (on key "..tostring(prop)..")") @@ -1041,6 +1054,22 @@ function _M:removeTemporaryValue(prop, id, noupdate) if not base[prop] then util.send_error_backtrace("Error removing property "..tostring(prop).." with value "..tostring(v).." : base[prop] is nil") return end base[prop] = base[prop] - v end +-- print("delTmpVal", prop, v, method) + elseif type(v) == "function" then + -- Only last works on functions + if true or method == "last" then + base["__tlast_"..prop] = base["__tlast_"..prop] or {} + local b = base["__tlast_"..prop] + b[id] = nil + b = table.listify(b) + table.sort(b, function(a, b) return a[1] > b[1] end) + base[prop] = b[1] and b[1][2] + if b[1] and b[1][1] == -1 then base["__tlast_"..prop][-1] = nil end + if not next(base["__tlast_"..prop]) then base["__tlast_"..prop] = nil end + else + if not base[prop] then util.send_error_backtrace("Error removing property "..tostring(prop).." with value "..tostring(v).." : base[prop] is nil") return end + base[prop] = base[prop] - v + end -- print("delTmpVal", prop, v, method) else if config.settings.cheat then diff --git a/game/engines/default/engine/interface/ActorTalents.lua b/game/engines/default/engine/interface/ActorTalents.lua index 4cfebb6bcc..a5ed4288c6 100644 --- a/game/engines/default/engine/interface/ActorTalents.lua +++ b/game/engines/default/engine/interface/ActorTalents.lua @@ -1140,9 +1140,13 @@ end function _M:talentParticles(p, ...) local Particles = require "engine.Particles" if not p.__tmpparticles then p.__tmpparticles = {} end + local ret = {} for _, ps in ipairs{...} do - p.__tmpparticles[#p.__tmpparticles+1] = self:addParticles(Particles.new(ps.type, 1, ps.args, ps.shader)) + local pp = self:addParticles(Particles.new(ps.type, 1, ps.args, ps.shader)) + p.__tmpparticles[#p.__tmpparticles+1] = pp + ret[#ret+1] = pp end + return unpack(ret) end --- Trigger a talent method diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index ef9465b819..440743211b 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -4554,6 +4554,15 @@ function _M:onWear(o, inven_id, bypass_set, silent) -- o.wielder.wielded = true end + if o.talents_add_levels_filters then + self.talents_add_levels_custom = self.talents_add_levels_custom or {} + for i = 1, #o.talents_add_levels_filters do + local id = util.uuid() + self.talents_add_levels_custom[id] = o.talents_add_levels_filters[i].filter + o.talents_add_levels_filters[i]._id = id + end + end + if o.talent_on_spell then self.talent_on_spell = self.talent_on_spell or {} for i = 1, #o.talent_on_spell do @@ -4626,6 +4635,14 @@ end function _M:onTakeoff(o, inven_id, bypass_set, silent) engine.interface.ActorInventory.onTakeoff(self, o, inven_id) + if o.talents_add_levels_filters then + self.talents_add_levels_custom = self.talents_add_levels_custom or {} + for i = 1, #o.talents_add_levels_filters do + local id = o.talents_add_levels_filters[i]._id + self.talents_add_levels_custom[id] = nil + end + end + if o.talent_on_spell then self.talent_on_spell = self.talent_on_spell or {} for i = 1, #o.talent_on_spell do @@ -6786,8 +6803,14 @@ end --- Called if a talent level is > 0 function _M:alterTalentLevelRaw(t, lvl) - if self.talents_add_levels and self.talents_add_levels[id] then lvl = lvl + self.talents_add_levels[id] end + if t.no_unlearn_last then return lvl end -- Those are dangerous, do not change them + if self.talents_add_levels and self.talents_add_levels[t.id] then lvl = lvl + self.talents_add_levels[t.id] end if self:attr("spells_bonus_level") and t.is_spell then lvl = lvl + self:attr("spells_bonus_level") end + if self.talents_add_levels_custom and next(self.talents_add_levels_custom) then + for id, filter in pairs(self.talents_add_levels_custom) do if type(filter) == "function" then + lvl = filter(self, t, lvl) or lvl + end end + end -- if self:attr("mind_bonus_level") and t.is_mind then lvl = lvl + self:attr("mind_bonus_level") end -- if self:attr("nature_bonus_level") and t.is_nature then lvl = lvl + self:attr("nature_bonus_level") end return lvl diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua index c92055cb10..de09a04454 100644 --- a/game/modules/tome/class/Object.lua +++ b/game/modules/tome/class/Object.lua @@ -2055,6 +2055,18 @@ function _M:getTextualDesc(compare_with, use_actor) use_actor.__inscription_data_fake = nil end + if self.wielder and self.wielder.talents_add_levels then + for tid, lvl in pairs(self.wielder.talents_add_levels) do + local t = use_actor:getTalentFromId(tid) + desc:add(lvl < 0 and {"color","FIREBRICK"} or {"color","OLIVE_DRAB"}, ("Talent level: %+d %s."):tformat(lvl, t and t.name or "???"), {"color","LAST"}, true) + end + end + if self.talents_add_levels_filters then + for _, data in ipairs(self.talents_add_levels_filters) do + desc:add(data.detrimental and {"color","FIREBRICK"} or {"color","OLIVE_DRAB"}, ("Talent level: %s."):tformat(data.desc), {"color","LAST"}, true) + end + end + local talents = {} if self.talent_on_spell then for _, data in ipairs(self.talent_on_spell) do if data.talent then diff --git a/game/modules/tome/class/WorldNPC.lua b/game/modules/tome/class/WorldNPC.lua index 9ad69ba50d..d52f4cdad3 100644 --- a/game/modules/tome/class/WorldNPC.lua +++ b/game/modules/tome/class/WorldNPC.lua @@ -187,5 +187,5 @@ function _M:tooltip(x, y, seen_by) end function _M:die(src) - engine.interface.ActorLife.die(self, src) + return engine.interface.ActorLife.die(self, src) end diff --git a/game/modules/tome/class/interface/PartyDeath.lua b/game/modules/tome/class/interface/PartyDeath.lua index 5092cbf225..cca7a45e88 100644 --- a/game/modules/tome/class/interface/PartyDeath.lua +++ b/game/modules/tome/class/interface/PartyDeath.lua @@ -26,6 +26,10 @@ module(..., package.seeall, class.make) function _M:onPartyDeath(src, death_note) if self.dead then if game.level:hasEntity(self) then game.level:removeEntity(self, true) end return true end + -- Die + death_note = death_note or {} + if not mod.class.Actor.die(self, src, death_note) then return end + -- Remove from the party if needed if self.remove_from_party_on_death then game.party:removeMember(self, true) @@ -34,12 +38,8 @@ function _M:onPartyDeath(src, death_note) game.party:setDeathTurn(self, game.turn) end - -- Die - death_note = death_note or {} - mod.class.Actor.die(self, src, death_note) - -- Was not the current player, just die - if game.player ~= self then return end + if game.player ~= self then return true end -- Check for any survivor that can be controlled local game_ender = not game.party:findSuitablePlayer() @@ -138,4 +138,5 @@ function _M:onPartyDeath(src, death_note) profile.chat.uc_ext:sendKillerLink(msg, short_msg, src) end end + return true end diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua index e59263825c..ef7e303de2 100644 --- a/game/modules/tome/data/birth/classes/mage.lua +++ b/game/modules/tome/data/birth/classes/mage.lua @@ -255,16 +255,16 @@ newBirthDescriptor{ talents_types = { ["spell/master-of-bones"]={true, 0.3}, ["spell/master-of-flesh"]={true, 0.3}, - ["spell/master-necromancer"]={true, 0.3}, + ["spell/master-necromancer"]={false, 0.3}, ["spell/grave"]={true, 0.3}, ["spell/glacial-waste"]={true, 0.3}, - ["spell/rime-wraith"]={true, 0.3}, + ["spell/rime-wraith"]={false, 0.3}, ["spell/nightfall"]={true, 0.3}, ["spell/dreadmaster"]={true, 0.3}, - ["spell/age-of-dusk"]={true, 0.3}, + ["spell/age-of-dusk"]={false, 0.3}, ["spell/death"]={true, 0.3}, ["spell/animus"]={true, 0.3}, - ["spell/eradication"]={true, 0.3}, + ["spell/eradication"]={false, 0.3}, ["spell/spectre"]={true, 0.3}, ["spell/necrosis"]={true, 0.3}, ["cunning/survival"]={true, 0.0}, diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index 91791c504a..5fcd7ec72f 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -4308,3 +4308,19 @@ newDamageType{ return realdam or 0 end, } + +newDamageType{ + name = _t"boneyard", type = "BONEYARD", text_color = "#GREY#", + projector = function(src, x, y, type, dam, state) + state = initState(state) + useImplicitCrit(src, state) + local target = game.level.map(x, y, Map.ACTOR) + if not target then return end + + if src:reactionToward(target) < 0 then + target:setEffect(target.EFF_BRITTLE_BONES, 1, {apply_power=src:combatSpellpower(), resist=dam.resist, cooldown=dam.cooldown}) + elseif target.summoner == src and target.necrotic_minion then + target:setEffect(target.EFF_BONEYARD, 1, {power=dam.power}) + end + end, +} diff --git a/game/modules/tome/data/general/objects/boss-artifacts-maj-eyal.lua b/game/modules/tome/data/general/objects/boss-artifacts-maj-eyal.lua index 27e25496fc..902ded6247 100644 --- a/game/modules/tome/data/general/objects/boss-artifacts-maj-eyal.lua +++ b/game/modules/tome/data/general/objects/boss-artifacts-maj-eyal.lua @@ -1749,7 +1749,7 @@ newEntity{ base = "BASE_GAUNTLETS", define_as = "STORM_BRINGER_GAUNTLETS", inc_stats = { [Stats.STAT_MAG] = 6, }, combat_spellpower = 12, resists = { [DamageType.LIGHTNING] = 15, }, - inc_damage = { [DamageType.LIGHTNING] = 20 }, + inc_damage = { [DamageType.LIGHTNING] = 15 }, combat_spellcrit = 5, combat_critical_power = 20, combat_armor = 5, @@ -1760,10 +1760,20 @@ newEntity{ base = "BASE_GAUNTLETS", define_as = "STORM_BRINGER_GAUNTLETS", physspeed = 0.2, dammod = {dex=0.4, str=-0.6, cun=0.4 }, melee_project={ [DamageType.LIGHTNING] = 20, }, - talent_on_hit = { [Talents.T_CHAIN_LIGHTNING] = {level=3, chance=20}, [Talents.T_NOVA] = {level=2, chance=15} }, + talent_on_hit = { [Talents.T_CHAIN_LIGHTNING] = {level=2, chance=20}, [Talents.T_NOVA] = {level=1, chance=15} }, damrange = 0.3, }, }, + talents_add_levels_filters = { + {desc=_t"+1 to all lightning damage spells", filter=function(who, t, lvl) + if t.is_spell and t.tactical and ( + table.get(t.tactical, "attack", "LIGHTNING") or + table.get(t.tactical, "attackarea", "LIGHTNING") + ) then + return lvl + 1 + end + end}, + }, talent_on_spell = { {chance=10, talent=Talents.T_LIGHTNING, level=1}, }, diff --git a/game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_archer.png b/game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_archer.png new file mode 100644 index 0000000000000000000000000000000000000000..713ed34cc420658f6b39a02447d67aecf8935822 GIT binary patch literal 13134 zcmb7rbx<A6w(rJ0xNBhJwt<ao+}+*X-Q5!iP9Q*V4esvlPH+kC?ht~#eCM8X-~Hp( zt9ny4)7@*9{FYU9P4z@7D@vgu6Cnct05lnCan--0@ZUQa5&rM9J;cfO??C7-q3y2b zWa;i@;%Wg9F?TYxppbDev9eILFfsRW8MWXC0AN1bsB61xE6DSjIXSSH{KLcI?cn@Z z8UWxI@^&^cv$JrgFtxC<aTK7uZ11L|urU{))Z$bCDL9K+SldYZx>~6DDyp0L+L=Mj zDTM?n_`P}mDsZrHH=*!$uy=Ih^%kJ~mtNk#^MA;!lobDBakmqo{4Y@23d$5>POcUd zoGe_-W^7<~3T_As8y5(|4rZcY2eEOpg1A}PIG90fydW-K4hY4+FUr5xT+J<cRmCO$ zZR_t!fYRFC-I<q_)yvC^#fyW*$<>OL4FZ9%g4kKv*_r=xFuVCUx|?`2JGxQ*M}xS9 zo0+SPv%8IxBgH=&O-!9U+yyBABK<EH9Gn#t{#&u5+rI<#H)O2dCeEyEEFe|~hkyL~ z7q^?cs>T0>@xOArsrxuvu&P?PIeEC6{mq9Z)qjNl#_s=Z=pV+vXn2)eZT=?3#9rLV z%)`OL(OpJdfb#Df7IPbOUM_PBQ#Nx>c4i(B#Dp0F0dp{$T0l&hxp+8CIUzjkmh69X z^>01@n>-IEhZq<n#>p+lA<D)kAp#MTfJlmpv4OZbCE2(+*#9Fd<LKsY;%H{^AKNy6 zZU0*q{Qs2Y6?3&Pad&c6cXG1-PZcOzJGnc#SvxsXh>87^bua~;mW`vilb0L)KWX|e zuf;7~Z9FZ^C0(5yDE<{^UYq{~0~;5&r3skBoY~C8(t_Cp3^r%xfw1u~bC~mRLri(h z*|^xvDE}>Q{y*aPUv>JI^4AaN|G?ojx3sV@2XU}5bMsiTGqbT-a56*whLPFalAW84 zi_-!G;xeOT{R@%xpVIjsrSu=t-}?M#`rnQ5ck$n?W#Ra@pIrYoPQTpB2LOQ8SVmk# z-Fx*c03nrRu+h=uV${crOX^&9HMs$6Oh;4{&lnqyzyv1TuXhOQ6Ab*W)iV)j3sup$ ziVe{W+nmWh0r)XVQ>UHLrf|}QYeI1<%jjM?Hkw-dYRh1AnkeA@{!HG>BddGrNvY%n zGtY+Tw^v}o*5-=`UT{4i6K;zMU<Jj4(xU^If_DD@B5m$UymvqzRUTz>3mz^jpa#0j zkuXY*UuWN|h=k>50WW0p-RYkGB!H4s_*4x18EJ1k(szrA`vOh1PruEVdBAI^o~(GC zT7m$X9ZL(q3u`45kf`Ru5LW)4Q2sR%eVP2x#bs<5E;x!4Gs9(<;~eHrBCqJx2?Qnf z>LLh=P!fd>AlMFjuT01_X-Bqv9wRg~0~Gs{G`+jn0$32k))Ba2&I3YecX^3yVjrL; z4~%HA%vIh|DcNpvCi1yt?lmf^<C!apgy4H!77sz~)34u1dX)pP=J3vUr|6I3wY|j< z1pswa%ri1<ZsD-jC4ATKD8ccwuwd}5<+6Uw(@eskz4j|W7j^>%uoHw8{1|nOwliy$ zE!9_VeV`UGvFA04EhsNr`Kpuw_=E<nrA5R^JoE;U_r6E{OhcQnVGjK=VuyBzFpnoD zZ8oHqY8(#lJp;h5vB1oWT<(bs+Tn^VQOXvN0H;{ne1oov#|4-sIvvbZ9Mnw9pu$20 z<fMxSk3F}5cgeuBAbw|dfC=czjhwRd&kVpi^$Il|&Sti82!PgmuZ30bXQ4_0B1FWJ z`(Am(-|r7}@51GLZ6hc$ATNjCvXxN~C6B+gn4e9ZVOI^nRr7Pja@ty<if<T?>yf7b zLENjbeQ>G9lWHGo0mAa>gch@CHu4x^j5titU|T54#qUuPK6^kkDiB(|*+GgJhm+JW zxJ~Jyz<Kx153x$2?1TVj(iA9edZJ(=C5Azk6^{~G+(<Np(lX5*+?YFEdBlNW`)AVy zR?$*5`#J%TYa;5bt(q^d8W2oMjS50W+n`{^n#_;s`BBrbBK<A)SvJ*EyY|%K$cZ!< zK=l1ZWe@2+21Xl9=Q6w1AVbfn_?ZN{CoW<JFkhpG7vSWdBKgX2lq#8SmNe_W=B0#O z6&isKWZL+xY}|nlzzG*LJQ#w(g=Tc4568>&zQ3LgdDW|Ga<x@hXk&f<(P85OfBIdD zg3ek}Cq_(sqH+Ig(@`wxDdfT_@GWmV5gV#_*oarPbL)k9F2%3`!GL(+cjWIeO2cP5 z0El;ch63$@yHEF5_N}1)Sm7~kcgIegzVFWBDwfrhJ<A14S}jxPXS|u8C6|P(*hFG@ zFfdDaZbsw8a~s|_U8f9k{wW%#DRQ4odhdt633VKAp>*p6zI_jR2(Ioh6b&5~8q)`$ z+rQK-<QEWQzcA0DJT%p2bhYeN8%BFSYaA*RfJ502N#@=qRbrw(yHg~4$d6&64RH%{ zV9}BSGl1qOab0!Czf5y7O6gePhZXNj$BSBJFI#VKJryS>j`-T@QM2S;J0Qb7l1JwS zvf%{g<%;G(hG1m`%WC0?q6wwI(;Lz}Y3u8XKc-tAE5dO#IhozpehAx3g*CW6ny7lz z_P9q*d_*l(4=VD+sANAcRR~Cq=#bD*)t4(Z9p!88S-Q4EnByHF?yDC0@+{xw%Cg&e zzaX-|&n~=wO7D4w3Ld`Vf(=G1En(BPy@fH-CP(^Gq@LV@lua%C?u<Co)rOZ?Byi+! zw#a;R$*??@z(x3iDJg7To0P7O8%d*6%qu9!(853zPhZCmloQ<wU%Ny@n3FATc8?NC z^~nycR|*8W0K`>7vua21&?Fb(kUyH-iEtbrdH<Y=JmAaX!WK`2<!3BUYY_gBE!d$v z@}r4^iM;Oy0EIO45o7~<MaPctiS|soUA~N|G%00VQ$rKcl?#_+ZM{<~;BuOF+biCL zNL+pl7~%+TRfcpKo*I58E#7yitj$oMQ!bvVOiskpsEy?o#_}Z@0~ZdlOb47X8LXAa znT60Cd9+H0r6|lIKk)0L0R1kEwyOAVh9cyKLCzv;@WRiRW+L}jSkpI=35i29T)KvQ zyAYO_v>T`=GM1UEYn>$TquyZ*Xwk#Z$2H8H?a27Fi887oeeLHo%*@cP+nMS1Itg+o zf=zNc`-oWlA+6o8DH9{h6SdM}6Gt2DPHw1cuO7v7I%7Cz0<Bxij2TfsABT9%mQ7I{ z5K-fC@T4*^0ee5(zxPHsk~9S_!_UObj)b2=%InpGUJRWi;67jwM9#vFMsS=W?-`#m zZvJ}iqiPE_D~X4NHpiJX#<~T1R_MeeWdP}v1*{x4d$CROi`rCII*+s4<2qgjaNOgf zkVf+#E$_0qk?VO0E{l<X@S&L9ddeJM;R{A%kjk%!60*n5-CUTQRFHntD<s&mFk<jM zdL@(}XknAl8adykJqIPmz+=<3$x#AkN0>}YSZOJx(0!-PJef7*D~Uc~6zlR)QiGw8 zo8KP=jB*H0m?U=VsnGii1ikMdpF)H?$XAE~1o*2Mp%Q<Ba}7>^rniq+F7n;&<5bE& zf8oQS7)8TRSqPUAF8OJlSV8|7dLcZKI5L*zhQHuB2h@I=$in9~eQ+{&aluh19F0L} z)$MnH-XrAsvLsd6@p5yB+eB&Uwq*C2A?f|Gx#~sLy2T2fsF*aN426@{RudN13}g4X zvYT-5171Bnv7Cw{cx}I~?9aDQ?FKI<4enH&yWYnh&koncMAH6Uq{bi|#j+yX)9=&3 zW=?dV<#gGcl_AO5>6<3cOf+i@QKT}SnM*KD4<K}S$G^#Ss3Ia?{9C}T>#AN8-Gp=` zq`Uo9ZIk2}q7n-Y7J{w<ASs%pRV3tgGSVk%m)Z92ctAf_Fn!f10@6Tl<f%zH_>n(p z_Rr~M=LGQLT!w9)>$GjBe8JU-9!!K#CyXWHoUwfy#RZ{e7`RU*1xm-+UA|9rRGa-Y z`v8?7et;oWlpwyDpdFnh_&fbHvc0<1erzKAA+4Ns6@o{t08uWrX-$3i+H85L7o|BC z-)%5$L_{7}zE)l3BYel^_Rq*P=K#8T@s?3Ld<qF?ruAbr^Okd-F7RTGiF;5Q&Hkk_ z-*q}@Yo+qUq2W>A<|*_nM^6;Z%ILgCR~$x5RFtB+_Lv<tk*Rrhd4Zl*aBXhJkL7Q> z+UJ3lqH3qT5HV!0Aw-L`Zg)0%Y1n-?v#4--Q1yIwe9yhHpf|Ui>h67J@R~)X;aO}( z$L`+2MMOkyr|-E<PdZWoq{l7=k8?E0C;Z?iiJt2fk0Od10(P&b7+L9SOLoHmkj3=h z7m*{&DQL$%Ah8wEcMVUvf%k*duOY&4+U_3OHk-X=K&t)3pW$lN0;J@ZHfx-MGi-<j z4R(_>T&jk92d8DxBgQ<cb(S^-4v%?`>1NiqwFm1OhX(JJ__e;lQ5uQjG32wI4wE<4 zT@7z;+X-DZ_yN~lR``J@e<)-U`4#45RTgkcYX;_ome+Ub@2~YwyBs(sK5TB(mAb(b zMnw(P>Cj`yEhF16x-)%)8;02}a$}IqXHqzv{JX;dr$k#}My5(fk1z3Or@2+sd-#-D ze3wW8ep|g!b$GZ+(d}|yF)?i5D7~vy`MBccw^oJUj;MeptVI`QR+|4N{IzaX8$^H@ z`j!{j5$z6P!rA)*DMs&*R4}MX8G@#OD(5&l$?>}*{;uUozV1=ke=6iU-p{&uNnduC zyERT15!HCeG#QI3wH9|7_$g;IDdS<bV6(l{Wd)9VRp3oNp`V4e4&nhKg87s{AW)od z{%g$T#t&Edny6jnX*)jiER{6q-f4lJsITRbkb98x3alk&n;Abr*E=?_oT5m{_ohcj zLVZxj-DfvNh1f?s&M;WdbaX}tCD3UWOvAa=z-~;L`1z)MYEtM;7S1%#BhhY5SQG!U zEBEC^ZL->bN=?1%cuJ`86&l%T01XP~DVDN}AhX@qqrJYRD&tl?CtLF(^S-^>s0q`T znTt6}U92`}U}7f!M@fFNS$+6ur=GWb=UqFwHA1)rk>28ssD@jE!y309%3a1c&vFT} zWd$tIYQ3&i3`q8>IW6*S9QWf}Oi?L6jz6wFN8V&@{Yf-HjGh8V4l1So6T(FoG>+f8 z@miNAh$~?aS4O(3^&w*oV+%sX)a6k-TKoL8`RgO{3YL<~zQLw%+djq)^~x5kcq%0? zJFEo5+f8ELL1z}H1zC~2%pI3_;;c!LdmF$EOXlmIDxE*7tvC@<b(axPngA)Hih)|t zt0Q-4O)RY6)PxBF5Objz@{7>k%y|-j|A_+DxhpSoW#oT+^bLg-GvSbvrXY%iPRs3` zNNe2cYg91K6+*?EN<()1bH@wv(}hwV_~kGE+dm5vSqPu(a^W>_@Xp68@Hq{;z?wu7 zcLne<igMOOfa%LO@EI#3S=U}s2DuPvgT!>2z}n)<>dP@v&ak^Ln1{5@q2#MA%pUuj ze4Pkd^uqmPp9C>C8APYu?rgzoALZ-=a|RZAMv`{U7l1AzQB(HmY2Unvt1nL3WAg#` zLa@Cez=70^0s{vytPm_vx!Ysc9P-u+;8_%`^3q3#V|iWaIs@>Zz&!KYbC^6|=3K~J ziiob&azY1FD?UNX2Jy(^L+nlBite?40Bl7>^O<&klI)ufOtr2T6u2E|CO!NRPdKz@ zNKf9=!NyvFHw*qz1$UKtC?G~vavAv84oDB~9eWC;o@kW|g(2PND#m6qY_^mV30Sxl zJD==axf*e|ex#;LSt=NkMC@_V(6I8$BsmSSxsFM56IQs#G3Kn_`lZ1bJZKJ8eYt@? zN$F_4y2~o$8Gq4EJ`dH*Bk(BLLgh-dzE(ok+AH*clMad<;hii(1#+)1Abq{ZwGNc0 zB;rK(%+9PW>)kn1y1_<Tb#z^;Od2*FRRIs8S#cJArGhh16j=C@y~WIut8!6MoY0YQ z=1v~Ce*Fu^=ocNLjpt%a8uo2U_1fL!muCK}S4PV>dP1ZPv}p)_(~^lEYFM{4x*bZV z;&>(@T5eex(#un|p78q!L9R5i`5fWbQG__3^VKNuA!XtZuAuwcb*1kM)9~6Ow!;s2 zB@rOF81TI{+iA0&n?bK~ZJ32l{DQnv7GHPqdF**UDo1Tzr(RSBUWEV@q=&PN{wF0i zE_cG`+I$>|v>iP|C@WLKQnJbstYn!%h=w$z>@_a^ZtLe|w*Ov{menHOWWJ23)|yd% z$Qy?3XF+KQH~}_No#-nG3f@Ex`U@Nxh#!nd;)&97elQ(Uc$;zO-iFfDSQBtb>!+IW z^=fGB8>yZWNM03@Mh#HcKD9TiO(`RsK{LrT4#s<)+g5MGvi+ph(4UcdmX-j5Y0%!B zzq+bHC<|gqj>3)G$MKS$KdF-?Q&*zEYkml)gx?~H+@JoT0;M?I?`(>z^SCXwrYp9q z%v-&*(PDf3vKhGTro}a#F(;h&rw39KfYzkekp@Gxi@mkrz!%(a35R0I3H4<T1wLG= zXFCP^D+WSmNvaFSUNGKSAipiL=`#<nl9m7DnA=$CPZw5_hEE@5crjwzcUwuSZPQzu zdNOwD#^9zC#_SmVlzKaAm(A|cJ)4%&Y*t0Zo`bpYQRH-MOKg32_VQ)wD6%JSA`rk- zI0s)9PMZ#yOYN}08a8AnJeD6|L(#6iGdVJt8HQDIF(}!r4r1U=HRrWx`wHsAKhcxI z(&H(h!5QCum$yU|!Haa~MU#}I6<*px<Z;~rZV^5li}Si6?2)YFMarNsAUAzwFkaiW zwmz(zwwx@4?Oox(d>F28ot5S_8%NC7`-)o}Y2gnN-xDBXJ>v1N>1vx8bVrw}um7G! zoJ+XMl|7LXH&U@Fiyay{?^<vTgya0;t|NcF$hK37k=i%A{X+D<dV2XQ=yuxZ4c$m) z(5kQYuIoTdDzdBVqbbJf!^Z36z>SYakp;(O&mgw1uCBhpk8tdt_REg-mWR{nXhbK) z!QWm#85^5J<9N#oOTudaMKbMnjvyJ`ZAbZjLdWgTUx=;RX&u7Zg+UA|Pf2N%h>d;c zQOuQ<Cut{-9%9fyIGv{28G$t)7PL<}SW^cRW1(MdOPFDpKH`hvHo2jieW4j&(2d9o zX)q<1-m_!?b1zwOSUq^&e*?(jDp)@_AR?|;(U%~#^5qD;+8*XPIN3k<!zlR0HD+n? zW9Vz??Pt3hPk+1`Z8cQhGY(nVF2jYb^n4GNVtl}*LzN3{`qr6S(+2f<Ngwu)QfFSU z>!IsR>+`<8yY{bulH{<eB>055<Yv}pbm&lJ@A}3J%T`P!7meqgXeUI!sPe)xLX<ga zwYm}cWzlwpU<Xl^1%1lzj4rA2BFm}*RK-@<F<D21w80D!cyPL6?)H7mpp=BTZl^rt z@0Ip)>GUbo>XpmKdnooz9eRWHpbybMWx&KfiX|D%l40in|L)6HgzlHDgDj<YsUWYV zM@D3gi`9D%<9%qM-vgD;JuhJk;(5bjv9LoXvYAk#-tyFZL6To(CDrLs@=Dm9Ea}_2 zT#<9>kx@UOF`-ktCYFWnrkUI0!VacKh3~+ee}OwPR09s8s^M^=wn|&@7>3|{&4-Z5 z>$w|lo|Jc&wJR5hZ*IDE)azp5oLF070XfobI=bgl5+J^mxSkk>-84gAQs5%fNmkb8 z1o|-NkQrY-rh+7pq@^X(+MqcRqMD_YnUx0e*-3Nvv^Ps9lpM7+sSjpzLV`Bmb~B0- zx;Iw~261Vx`!D^mBhr8^k9ktPJREv3?(`xvG|Y#_>UpOUu7M%46B!GLtL^Q1OCwM@ z<CSdu*mGbB+VFwnskemfYdU4HXdSP>vxB8<Q<}Uu5XUV}N|cd;duaxYZ#8L|w#!^s z++f*~>o03wqNI~+UeJ{|hRjPsq}Jd6Tp#;=1Isz{wp9DD>O1mS3+8YiWnbNJ(BwD_ zb||<p?@xj*@mdj#F_Ym@-?T)PG^><HevMl1BBDe^2X41n@;R3Vj8F+v!;e0dQ5;2! z64Q7T{TfHk<rROx-O!|NUOk;zT}x|Tp4uHQJ~(8>qfmD(a&GnF0A}w>Tib)Da+@-K zJV0@d#P<B8u;<tnnmz+wtiZ(LeVb}>7dx_Gp^?+9e5$>spt*UDF-%FbdxpfBy581A zp+EEL$k<8d@hA6zY}v5d5i88%j$|%%d*eox+2=^Lkn$RF#sjLY&}0r^`J~9>qt_>s zNufmk$2SBdKNZH<<W$lUV3-p>sH~r6?-6Zrv7SQ(W+0#X)(Sd%U%0IEQ(4V51(_U7 zGO)*rTOZYvo19W|2w^f-qe9buTNEuBE`ZfxO+{1xi1p4#AeR+{DPL5G_ES69>5??< z`XyQqf7-etquckXuI{v|BeO2Gv`~rv{+BAce6<O|hfHy>3>Hl2eD^d_q{__%vgZ=c z_cPwKacxc3G$`957QlV7rt`~hjGrF-Wecop7+?+}$f8eAU_;?2@J}ogQ<=VF6S>db zo4%XULk~=`4u&92%YYGB0{iQ}Wm;p=)dZtNRa{Q8G{jG>hu~3`?*^x*r&P!&{>Dq$ zow<97oLk~rT0uNX%Ypgzm-;!w_uT1gR=S<`HU*iJ7(pv-3eDv%8d!>N)>^t&FXz6} zu1kLs^QmaLD}TS{Wb2I|Oq3e)+VcgLc^Rf{s%z~`tmyJ4Hf{gT2(i$+wL7fN6e5)` zWr7kAAl*tit%62~CxOX&?ftbx<|{~%G&SmsDu8Lb=6JmEJkjuTZdgHf@Wp=RE>=oz z+_qW1R>zB&$k;wuI#)Hd3MuTUok{a2sfdnFAOeBJS3X7ed!uzu(7>|*T;4`ciNiWS zt=9^zKWu?#=<NZH<rgfq;%m*R?)&7d9HUO-j~WN8GZ#<SP7UgkK<g-LOyHn4$)uL! zr4N1X?bNMurPmMkkKZy=exzt|<A3nF=nUll+F=2Fjo<gnx_&mYM{pz7rzq1cOnFd~ zH+B!*0w=`Bq5UYD=50o&k+2yKz2(@hVAuDXjBmF^?hpfgCX+ZNQSrB72!)NM;JErY znJP^2`K!^Q2-e+?ozt=o{67z0#8nIyx!M1ip@?}eW$p%SJ)H;0+bQAm+|36?t*0^Q zJt~Wy^Q@ExTuOD%M|H5+fN?@t_{k9*hQfx~)!oiBah)8x)7mc>vZ4d;MmYB^i@`1d z&odb!I11Le`N2wu%VmgP+2OGBVA;4Zp?2v(wn_(aeLT(+LoOl`cv9ahd4f_8CS2rq zZ<B4X*6s@_*0_Re@>6?0?;|_mvfV+c;S?-gpUPmBTv;|-n$#svVEvdj3weP0_OjW@ zew&}1%n2&nn>Ol32G1{)K+*ZjBp`rre2@+2kk{AS9cE2yk|}d)gN*ObGqTN}`n2#B zIEPavTw|wfOOEJ`JZ=rg_$0<LDr!!}anfU$<aIpmSvBoj_903Box(rQ$msm}5?O;a z%kLs5xAfLy!X{k67-ndj+98p~I(l8X$Jh9m*9pDU>t>=^G^HrOBdn$~qQJmuv+on_ zXAj+)xZ0`%QD{a81uCj9FR@DzdssRSmnZeGwE6NHPzv`k<K1De`c-x*wYd-*xj51_ zn1O{UL&dhs&HL!<E;WtJK}W{2Y)38~QruQ|N-j2j>G#*A?l$LreOBB$-PpcS*c1gK z6RsYbtlV0KSV=mf0Z%swCO2ZL3<18JMwPxAQ<)*d*eZ%M7yj=vcO6*(HTPz>lwC<J z3_)0EN?b6KWCiJ?;O{xI6mA6*>3jw%24PJRA@e=A!$lBrmEnQ+OMLt8?;#n?aYY|{ z1l!ef)+J+N(P#=@qsCjjcCPukV~<q_)KUovwhS_{A_mip#%n1jaDikAtr$rYyBvj= z^^j*^Mr|6mrfcLuan~iW{aPz$(!8$5)ZecoDNUNVb@(jS&Kwz=1W&sc*rVy{aa+}f zdSd#WtEZ#{_{BJQ8ot}H5z0(YvOJ~c-{m<Hu3DG~v=kqTdwSN1waP&%vo&FaaC#DB zCg1W*{i58_*{>cq-%Q~ouF<dyr2eD}-WM9J=nDqR>-6FIa&`!p*^zYlVFwLJ45e;{ zFK*e+bOk4RJC}fbk4BA(U4a=;55rZ@)y2M$6cGONL{pZOn35&z{St{B8Vx%tK`aMF zK}&C2t73k8w-iC-fbKS3RoJV&&BX|rCA~3eWN9<0??IQVIkcpu^%-2Ma8X)D1M$L@ zZh|%)mb!$mNMt<J?(TNL3^=BNNIu)6{}Vw5-PM8#hipWQgakGh41;c1<&p?b!*NwC zo}wNl*2|mSyWL#vmhyKC&&u<U<zd+b$m6ymJ_f}=29=Gz5K<|Geb%?5*fS?15@^G3 z$lAK}mV`GSJCooPtcI-hJ#bd(O~H!OBXK!H-)mv*AFdbdXq!R{gUHwJf4S8&(QIYt zh=h7;u0<P^E3R%xZ9PZQRHGGr{d3AG6oA%+x>jNjE9URtQ9YF*=sl+mq-9$3J}l7S zIB=T{$$9hcMfEzCLonl$=Nd-w;$Ke;gPqAyEHt((8Zbr>LZ=-}VUpKeoOZ*laC9|b zul(hjv)SKDfoMztoV>-u^-4u9CK`9gfrsUm@n&q=SDa_${&ZfcHJ_9!Pa_$pkk)O< z+O(I_k0*ZP@nw{_RN7u6Tx5hTy-XKZ;-)lRHCO<cpcJFn{W1>!C2U7s>zvKXq}A(m zz5F8EP%+5%d3yv?hPq;Aza{9Y@E#XrVzWd?^gH^OA%~b^fkM?OAM^_T+tmpjroyOv z;pUm)#u0-Kcs+|k+IG)8XonJ*iL_4z#EY%d?!?&CCUg>-?PFwby$UU)rbvjp_;q#v zMG6GKiBV4W(xaheBOaxKhx?Lt{Mo1B`3Ef*nR7oy9~{&uYnF^D%N|8OPH(%(iJIU> z?dwlD&3Q(x&+Nanha=KU=~+9F!vWo7=k`x5{TXAXKY6a6{d-QY^-H2wGA2m4tyW%E za(z!Iw^%9we7fIY4Q8%BK@J^W6uFXHu1d*Y4n<-6_7)7y+%#ZUnjD`AB~)gs9ei)X zDRWkch=_xKu-{qzy0|xGeY1{dd*(q5Pme5dv!lV}cqCclq$Z7*opI1XVJxPH!}Y+v za^Pj>71o*5pGCmh7*t*3ZI3iV9Kv!KUwrY{kS|M8v1qiDcCnc2wNqEXMT9Of5cmX~ zWW&j$Uos5bCUU&)^8u;x|8Usw4Xyd9Gh2q{M5pIB{3t#3AU*zYSOsZ%ZT(`I<L85u zLGnS5Gw!44gq`$wmzZD*g(gdy1ysD?>+lrg#j_s*J2@G0x_DESV&If@9TEW}D@0`^ zhK6bvN+Kn`M?Z)zBWgHYkvthek*uZ=8#8iSzEpUOeHGj&YDdShQo-ftD)l?FGHFz@ z(oi3c2wBv%76Nb&`w5O!(}+DIK@5J|MoQg;!5(+ndl2yJIo?I+O@AshKKDmoUi;N} z6WLznJ7A!HQ7K^M^Ef5+x+A1Qw$t~(v^TT51-L<G(@7b0P<r3yiqCpjvo687NZ0Bt z<QzIlaUY8BeYH1ws1yMEaS54T3bxsGt*dEk>TV7cnr$PaS;OH>)>QS?)z1D|S?|r( zJfC;-3S#*<o8Q{vlH`>PpKD`2J}AKWyr#so+)@RtUBMp#1cP`I;OIqQVPkylY4Dtx z(4tTXtgYCW*Aii9+dm0oP#be&=W>|JF>hXl6%YMUdRCWE{N?>#pYfFuoGlueFRvct z^xhvI=xgX&bLy32sAlYU(%OCYduLaQ3@Fov4(DpaGrp4s$YqTSmDrDghoP)_9~^cN zVD^iu8%@<2+h_93F`}eT|4h<D+qX+0h?%=S$oa}4c%S?ovA&rb4@pc1Sa>=z6`pYM zfa@T}u(Cl6$6pzmNdXY~8cd003`&JkW5}E_vFf$vK}%OE>g}<{f)#_N*vgztHHD$| z`*yZf+8?{Xflo?y>hS1A>eIj4@MqSf!aO?&(azmCb)(kj^zN#3>9W<{LSkW@wVTKJ zLW?YLUQL~F;DHngW!yS|FebHwe2bJQcj@hR!EFS=`9MxXf}V5Dz_5J$u*om_JbOnr zoO>;GSv>fwgvx>Zfx3!Ezp}ag447@+fY<$Gq)Z!J+ttz|fd_)wa_>g1(m9<=R|>yb z7d=e6B$w=VF3N-FLAsg^A&^FdE%~yIJB+=hO-=%{3&6RAlc0`s&<c7^7|v-qJ(<?} zdqSgSo4ET|T!a!n=<T$fyaPzW^G0se(&9U{E#}8QC9(7t`1X_o`HZIsGxPx*1DN(M zXF{=BQA$iwOA!}I_<@n>Lr;ocPZLdALu1E~g{T6WD%zG$vtIn6fa*CZ{aI=n1}LQ% zp(X;N1a$LN48o!iWT(zpYTnLx(CIQ!C!$UVTZ=*k5~J`d%9b~)<#rkYXOpBjlP92I zN53j`Q5=zxWd5vu$9=ajdOjw9zo~c9Z-0C;qW!M_@Kn&&B<Oj`>WCPRy4h0qch5t} z3)gV6z?XOBa^?dEx5nphNfK-a=ueNzCC-!;J2tK=Pj^rZ37;6O$wb1Un)hV;z!{9e zZsW$1Q85n8-wdXB+AvjLL?ZB`zLIk=o>E8g-d5Iq+Jo>P5#pB!e}<luBXn-zfB}y5 zK4nqOw2GY0vg<>>eiN8+p?e|{4jE5tyD5KsaRH~OJqq5=6uPl?ybUVP?jG6O7<8Ah z*b92>P&k7t)_e!K$u6YY7yi_&SGeFzXa1aWApwX{z06z`_hH_E`!RtE(N~#Z*xu}M zAkvh*g4~L|YRc!F>2jKsqwk&{Mk%0u(p?l_DmsbG!wuoIm^nk%nUCEm3fTe~jSmz! zG5z2f8<xfKDL5ljq52oqRpAN;J5K6;uA)583J2T@1>{>QRzsnrr#BGPbZ+>zO=Byr z*b*#GDte&T85HXdrsHY}xE(tP9g9k&18z_;?*xnS?F7#pU9wDIzJ_^Fropf0W1Ef& z*Vo92YKG-1uZT}bLZ9!n;tnKA%fpLZHPzc%p9_D_{I)C5krFK|t$yCRj&weB@5qaj zOdz7!Q!X`|J|Ts~Gnq@o%aaoB;-@(7nUge2^3j)K<d14Is)9rO@OkCFPt!nlT%{tg zG$u3lO0zWnEK(x4+hye;y8ER^aF4W)jxH*n^2;BQ9I6Qz;}<VIX>9Pk3Cb7%CC})v zX5D}qf1=)gFAty=rJ<am+M}$E0YM(HST$u&&O(@dWd+E{C&oKP*Mp%Veq7OzW2Uja zTKb?cdtUW8XpJtKcv;cWgRO5q!?dk6jSazNP{maKzT}J7rx@2Y)4WL)s%=38lM}!q zpV9D>QT&PHjs{yn<IWut={eoD3S~Y`yw71%!DFmuIEnu-ZI$^^N5?p}@rS6rshJ9G zhhD<vN<WTTIFC|XgvDEXVef?k9BR4;S1$|ZP=ZRa2q`sh9BM0)NkoPXRp}X*Vpj)d zK@fcoJes>->XTzp$QyWmq239z@6t^o>lbwRI)=D!Iimn&u;$f&_xu*t+WuzLeY7T) z;iMB|889#Xy>@+P;0q_zi-m+v9!jSY#rbk$rA7&U^8DF!6{}VGD?b|<=5goxEAP{C z;WE7e+I_4t8YGPYf@$2VQU0=Zyd)+};s?`%=twCpS~)Ue*o*|a*1u5=*Lr+rIEYil zQA2?Y$zrKnFqzmgFf!sjBWxN|%goryA>(QkBJ!otxA_;Yz5l)t_CL-DC7$LCM*q_? z!3PFVi3O{g3E(hSUSVvCOd|$IsS0Ts9%Y<V>i58#DmqxkX3*W<;_Z+}MjJ->YcG*O zuln&*e-gSxwH+sB4hG7k6&+_cApbG4OHOs>x@;Qblt?Qdb8Vb7IP!QJACrPE<z%Tw zNNUTMXUHmKZ`DUlo!rhBO>et^?!FBR5cw)cz5MQ`(s*7t9GDxZy?qNf5+!z+9j6nc z#s~BG<1^RlmzjYJi|iLB!il8VG2t@|&zI}AQeK4uEZ3Zk9dT_WsSN@YM1-1C*?j;8 zH5lLp-iW5I1{JLtgQTv>gNTc|yU#LnKqy}_<Tiu)!EGzImCVX2?HR>p@`C!bn4y`Z zb-9>!&BZa};Sfv~Kq>kka|mIYwfBClU(sgU@?PlfyYe(<_o;-FW5vjqWM8_~=ZUK2 z$m#4&(B)XNMDsww@yWIH*??Vp+#O12jgD&16#j=F7rgVuj@bq>mYy%(4~fx-dew8$ zC90P4bEd-~{ZpR^fN~nuhICPH6Voosj-kyf$Qc7E6|Blg*-SZtRs(wsYTmMxW6|d~ zlg;aR`Ysn^IMb^0cZp2TeWwn9jo}eP7@!29-gAb#!fd%bIUZp5+5?{<;J9fs0#E)v zee0?^+X2qY-*ITQFgB)n-@7>$*n@PIz?~IKF0@$P<+;{RYgk&{Kq^=rsdR$UWm$^S z;MvQxs19vl{8pHune_p~z1sKlcV%qSezn7Dhn(6MH313gjgQ}#@N6%Ss8q!qvaRVH z&8*RWJ>Su7<sQ~5KOrHjq4KdrhhEclRRzqsbA)ZC3DE&?7=oB*y#ji<h6yN|KKTRT z9G-5fJ0<m7MhxHf<)RoUNG)lw8APsgcowS{e!Wi|1yncgbt$Q+m&}jDL|H=Zrx$u9 zi#f_6gnZ`uS&C9n^v7Wk*FuEAI~HeQYPHe6UqNqHe*5>q_Xj&tfloUXs)WMuuzss< zTPF*iTYJLrH<BNq5o;2;!^V8jYLre9pn`k3sCEa%GI8KFB)*YoV(Gg-JLZzhWr_Fx z=;E<k7-ZTl+26t`bry$FUU!or5K^Ew4JP4*4k#}(iN@BEj@osuQI6%*^ZtPjEa=^H zwzBKdGOQ2kC++rsy77CvSqj(q-m%D$IWk#EErKKZHqZpyV%w+`_Bdi}hH8dxe7u{E z{JcLkkCr`p86;VkpTg)|Gm%ci@p}rpzl{ljChHrXX_gHqNA@h0q}i^=V@ZibJx-09 z4rj@TWHMfx#~3tHuSi=F{t>#=#oCQ`!1xq1G8j`&<-P$cb%O>{&&*^a-r^RMUT@B; z^Glg2^cxis2C&!OGD4Yw7T;8<IhJbD0s}D_<Flhc--{IyMLxlwS5fK0j?ZeI!nh5q z-dB-@jcg4eI}WV$vnd*dslf!0_XvSYBhi5cN=kxnfF_WPFz*CwAcm>>OwxogFW&a- zH4@(pj+(hU1;@M#(|mxv7Uj$eJV83Drx!{O632)x-ObM_b5(dSn#g?3E1ECmeC%sg zu;ZfOj=`@ra{!LIt*ux>GVI0^iXv8FXoI3KW-ppPjT}HC(y1A06GCJ`U!1$<nkQ12 z9GR6nJI|_OZm3Xi&G#XsM2p3<^i}-iE@#j_pM*xootJDBInA7f5Q*jv{(Wi$xOB>F z+|#Q_IG-|;YatxF@2Z0in=rtoYKQn4^DbK~{_*D}0(9)(Ll+cW+<_H6QM{w?Tt}N9 z4tqQfpF-?QVQJfZpK0H<d(X9!SZ{rBYfe+y|M;SGVoKj!-Z53q4u3Bz!;^?_pAzTz z=A~6`)jr0ex1G+$ZbC!8f#ps0E$V~zF|;g#2$m~y|258d2B9@WZ~r=$w(c~bc>z|N z9f}k1_c(;9eO{%o8CN#7qFFbOiP)g}dCnlz(<Wk`jA+ifCQb<|;bAZ9sB$8L#h~R@ z9R&Vr5I)N}u+c*PA$9iCByE2povg2qFO&l2e3B`4gq4PZ3a5Z&5S$-qw&C2lL@J?C zTUL1tR)im_pN*MIFjMjKusict_Q(jpq=-^y`+-Knte0aZ!bP_S;XE|^hp;6ORx^=j ze9Gm-GJE^!D>CqsLMU;<s-8p_o^ezvT6yHYUi$h(j;MFrQ8cvqT&%RXYLP8~SWofm zAICQxt7=7F(8kZ(@bqV=iqhqEqR9jCLJOaQ0$<C*eK}V0IQ~U}l)2rQ2mi{qZO?TB zUuqfKkA*l$)y-ldKB1v`A7!wwI!~OJ#W;%E%_a?OHnFSkVTh%~Zn5W<+n_Ewk7TgV zV4dDI#+zY+->2tNOL>$(Cog@)jXqdln5}8G0>SjLQO>P=-?S*j2e#dfNLD}ZyF%dG zI_c{81Ok_R8~7S8{@g|v<NCG)Q<mBpQzV_BAh%uVeN7i-S64~|b0D@8hX4B57Z?$G z!)wP6)`e~qX8pM$)M|N68}D`RYY16JuS14YMQW^@F#1YJghDn*Hr=e~tBCO~z;PbH zD9Quy%@a-1FhC4IVe;rt#y8}}Lp4}g;p;<zAf+;cb0L=I*3Q3WOWOT5{xGA?Wf05c z0)|-St#M?$4;R)xY&6!+u5c%=za$%Z)n0kB_FiW9+dcBX$BWZsOz!M{WR!~zWG`%b zVWbk<EhzT=BgL)X;i<@v1ykveg{h;F9q~gozW4J%!;g;r3v1YLv{<T~S-Z>YpqOqd z{NO{81*(%ul7P3ieH2GIq&`ly;>BC)KyG;pH;OF9(6+>=oy7b;zKs+}Z^$Xy)B4No zd=o+jjjpdMar)ZsE-Pu=#22yOA75VLhZLP(?+yD7sXs>cxl?-RXlbDz9T9tzQo62< zTrC@e6QCNxJYd3Glk=qm*zT%PB`QJ{F4aSsku$0^#A+-WAD__|V~e|E-E!e4EUfc! z$r_=Hb)NTHqZ{{8GQcSxIa4S(;o%SV12;>u%(~)@_*xYh>g<Eh1<f@tTQ2=Lc|J(P zZeh}C@$D5!Jhg=8IW~hDl=ob0E#Mp{C+dk{Wk2=FIZqHz|1j$4?1wd$8ocu6d+|ql zu|+NWL|CVb0bg63YuS>wYZIo`1+Vl$bhD~MLAhaVWGnFnjUp^+c8z>F)VRwc`CC-o zNMp}5z{G#Jp9%#cB$Dg4{pd!Ys1G-a9Vd0&i!QkZ>AXtpzq-L*ZhU%!O|9$Fq7#;1 z{1BIS7cFoFt!0=T4DUz9?hIcSVP3~mx^*w^zx95_U>*p#gzIUyG4EoP4}P&fesA!H zf}yoP%I0Kzk^S5}i5cv@mKt-rfgb$M*aP_C+jE(SL}~iZA1*QyisDtG#-aZQ<mO`G literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_magus.png b/game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_magus.png new file mode 100644 index 0000000000000000000000000000000000000000..68a473b3f510883827062b143a88e59749e1d373 GIT binary patch literal 20871 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_warrior.png b/game/modules/tome/data/gfx/shockbolt/npc/lord_of_skulls_warrior.png new file mode 100644 index 0000000000000000000000000000000000000000..9be69ee59bbff16824c013ac0bea307468385f0a GIT binary patch literal 15802 zcmb_@Wl$X5x-RYn*AN&6cX!v|?rwv-yE_CJEVx4;Sc1E|Yj7t>u)!T}zJ2yS_xw0@ zf8DO?W&O(YT6Oj6?idxN&*&(`C{R#P=&~}BYJYptzh^KK!r!(%#L4z=N8~Q0<F4*x z>F#Cf3W5@|a54h{WF1VcKx!aU3m=zJkRTKkY`Bevj=PSc0>8PF1GDKrG|b)(&VRX~ zpaey{olVW{K<)rDkd=+25b&bC8wjwm5CUp*DY7a$OMt9xWPDvg>b^=E=Dv33d=@|v zVSu1F|6c(PAa_%Mw}ZW-8^5;@@LzKI|BnAzW&r~JMdEHJ1pF^hI*KX)2`5(&fQy-% z$()Uo9l*oK%*M^i$Ii(JU}t6HVPWNAVdG$8W#eb%=I7u8{QCg@)#hqp$*(3U{cl}= zXF@=0cXwxg78WlrFJ><eW+zuG7B)UUJ{DGX7It=~zZ6VvK926D-b{{e6#tPR334-c zwQ+X0adHIwBhl2%$-`X;_!sGanc(28sQBN49o_!zsJ|{_@iuj4VPj@xad7y@u76Rx zxvPQxFO2_{+D*g98N{Lna&z)<HUAqAON#$6|MlJfThTv+f6?$OyW0E>imAP%levcj z$kAO^QV96>3bTcc1wXe1$c)W`i=By=mCuxkkB^gs$qdA2#>CCbVaCPB%Wld3H&*|a z^S|-4adPpna!W|?NO175u}O*X^6+p<NQ$$ui?K<wbFhm4hga6o&E3?|9P}UEHh*>h zn^*k*$;&U{3Nm$fa@BBhvj0yOs8~C>JGogqIRhjl{)sv#fL7ba(Zb2gjqaZ?{g>5} zAXghtkcG6XlLO#ie&)CNUodc(n{%+4@vt*-@N%&KHJy{4$<&mMkBJAwVa~-4;<Di7 zF$Mmc-{ODx@4xc&@5*00oc{xd-@+0EvS8(4W8&epWM^Vy1936&{dFUgg(W)=8#fn- zm6h8Z$nqB=%Ri~}KT_#GOMmn8pW%NO#^1?*mlnwJZ#}vGEgXk1w+SdHz6n`LF%9q4 z(@vjYL(MeiuKUa=fhB{qF~KM(@(@u>B=wBkqhDHU&};Y&i+}q<hlaJ|#?=n3c1?)Q znxa53uX`~J3_A@uTym06c?o@5)<t#OeV*TeX}42;+aQCu%I5R&^WMFhbBpHR<tZb( z+S_WU>dw0m_MwsYaS@oupqIl27$t`7|F6y4`x`~)I%1>1+ts~iO11HW^i$i@uDtQ= z<3Xj?#9PYL(`!(BA>I3V?OQ(G_C3?f`&8oVeqaq8zx+eyRx1p){~J*1H1Gv{bNiy) zb$@RK9Ykx&rgQEYuiqae`~>GWITUw9XBjXgq^s`iB8?TZcYPmv&`4X;AD9iAY}!}X z4ZC?}zx|36I3;z6LX+oBZSz6LkzR;|>_|DQZyG5pr*GX#_?ydOI-rAu_d|U{H1|`K zwWE=8_;is762eOm)|)jD93d{bwp5im=Jx@)enO|WH*H%k7W?YnKUwA>SgZLgkw%DS zv>9)&l>y&%Ct?)L&g9XEeGmnMN&#*SA><K^X#<m2$gO9Td#l*O;wN<^yX4u{m2Q38 z&cGV2{Z+cyhCg1$-15632O$4_Q!oCqeS;HJ17)eGmFll;h4~q*K&g87jkxP@wf8dM z^Wdzxgu*l-Fq|OaqP9NWEQB7bIG!yFu28I45=V+Jont69d7M}A<gwcvx_fYes#&l? zH6%6_B_0JP-yxS(D~WTFTVO5c=?G3c7%62$(v(m+ApzC$C+&bNC2ex~iWUX8f`r^I zB_0xflAiMB3<V!PEvlJ8HZ|kl1jVhe&0^Q2MApJ|V|<XH4Ss8yfnCVG)Ge&*#^4aH zP!ZEWlDFRX&E$>s0LqF>mLCl%I1~M*PST{s38TGo4(HQMfL+4rqm94HB5$Xp4y8qM zA!JML5h^HunuQ*uD*A3!7fU;?p<!XbuOO)@>x$}^BDG|kE}bBf3S(3PM`~*VUy(@q zwgMYlUJ<J`QU7Bnn$eUVPFt5Gj@3cPQqnvgDb!{`hnc1>687EWHe)9Aqy?Ry>lk-+ z6<ao40vM+t4@8Lrud^2YvM}WIh_EfZ&`tSiiHn*{D^~<mp_1L@g}h{psFVZeMc{Bs z6n{?yr!U+X2dW5PL%hiEBqnS1bfFC6Jj^&#@-T4lSS2LGzo3Ll<7QIUg%c$-@RGy) ze#b0Q8$)Y1l}&JnYK<onA4KkwAWry*%KKRp6!Ih-79{ha-xs|fJ?MJ$tVj5O{Uf4} z7`Nk(zX4LkK4O0RUWDvkcQ<xrk`nntyxG3)j!YIj=S#iC=I@V3ko3dU0>=|sLXeqA z537_mw|l}l3}Zhcrew@_cGabjZBp~w$Yh1qdDBF(Ce~EMNa?;pJtj6(A{%#iaZ@PF zQ9O8bj>-|Ws@*1t2lP^DQO#J_?`T!bKRuZ1O8F?n%!p!-lli{)r<cREsa$e2$immn z-q@(wue!db!C5nPuCnZ1=J^wod2-1EMLM!2yc%_xm_1*kv+$A2NdGWB{xD3+Vas9F ztwnVqk#!Cm0fjngQhQW5Mwo%rp!<H)QmMjJhCm!m9lgrIlB{}iq}2MJP({uxLe2)6 z7=8IU?47)KuW-<XooORF!xp_Gv-GH|F!mioPPBfsLpv8`l2U&~kqq)$BA4}GEx z=NUY8v~re(t^<W!02Ss4Ko#`ak;Um(g|m8BREDtFnDkY8e-h951o1eChj4q4#KTeT z#0ZI9v48KtWW_%y^_3%7Bd;BLJc{~ha>r9v>6-2%qG{m(P>vKZA$<x&!UWvw16U_9 zMPnh$S`D}o*A=w9n7n!5V%dCSm_Ku}-mDUQDJe?0mZm-NMcV;cN!e?kdS5yV9O-0J zam#7V4i+UtTj_P@`}vSikYDnW`-)mQyZv1PT7r0syjdXP3cO&KpB+6i_~c6BKa@2L z8};xfWKBREj)a4G-&ixHRoK(m+u~$wpak(~sTlZ;U}8RUn)4%zqpIRSA5JP5EabfI zYxs*<UzwZ!LYu}ndU$K<mtI6qEvwsK!NoI;rhQZ>YQ~MGWuO+tQ0-aT157{<N-DIE zy^>&w!Nq_jSTKKeyvfx)WyR&Jhi)R&?2KgDj%G0Fc$WaG*kt#qb7<S>!+X+*SR;FY z>k5>~1>1R?Yb(TmBJ8U&_(4cKgoKM8X|b|qL)<`BOgcuTn}d6+gs+llml7N5H<YRQ zLMJy4?@vdH_oux4@3|k-$+8D0=TXH?Bt7MN-#EAG<i+~whKy9Oxdyea`3hP^lQTx^ z5PAvs=Fj?scsD?9+RPT-R9$<c$P@(}MbSs()ZxB*+#Idj6I5MbE-Og%UOc7_x`akS zmbh?|2ZeNjX%VIKMXZJd1u;@ej}_@p9#8)QI_BYF+8LtW;uOQ}eby06{r)a6-QZQ| zed6Lqx6_ocL)Z70;7CmagZ=_s{N7WYWJG}bpqNUmKN&MtrZWa#<S=5RG%mNj9vNZL zVbFmH%8TCPucC7ICa}HJ*IN9#TUt}~WctKr_h#MJbaCgq!=S6Ofc}(Y?-uw=8K^(w zH|a&RANA09P<Ie&%*q|H;nYlYskS`P*7c*-Y#8Iw58(gEX53*DnAA@QXI6(}Y}JEq z^*5dO1m`*V-~S9}6I`x9ZI8+l$`ziet;@uRA(@-ADi?+$X$_phZrhM{RZ*KX5T=@< zf2cT@)cs(a{xH4v)Uc<1_wnoNtrxyCs!qKl=;iah(EArP?e;~sZogd}yRV&3yN$Ei zUDw$!G2qJ}y%j?gmu@JIlYpm~usFM9v=eg`Tfm@dv~?0By5|uJSt7?)AZzOf7p*9~ ztBgu0n%6c;G`U@$VW6iT;{;6SkH;sN89d*Ep!3k{sfcXbo5C;(W4Y@~)@0amtd}-; z>;={oTDYylbExFVWq4O004PUk8fl!z*n)$%n4PfzMjQR|GxiExIUQr%?0Kndn-Fwu zJ(+$}71A<%(EZvgbS*9C(95J<yJsnff&TTY=!!oH7%+Z$NVd7*a$oZ{ZQE)ugaoX+ zVR*l-yrg45RAP*614frws_K51D8f9&)R0ROZ5O5L#f2y4Y3;4Z1T@2txTqt)Xm;57 z8N0X_`EP1eD^2kol8h$qUB8`QhIjyki#Uvab&O{1C~1A^@kEDC#T&sGSYiTnQvpB1 z8A^5BEiPY2j9}ojgiwYN1XCnUnc-iuv_A4YC%8G|v1h%U?Wups|Dvp8dFw3|@cgO! zoS0d;3%OpWIW&X&CFym%Uw~}=N6Yixr&9a9@x=4YrQAiHaaBgiJSP(c>?)R76u#+G zdoPznQO*Wh^zr0WD2@4*AS#Uvt~5;lSFli!@7keoaif=ea;bd!94pdjkZ|X76l4eA zuWIhM=0~arUj(fWTTzG^(zLK0sR~1Cu6&5~_yCq0Fj<eVq%t?x@R7A_FLyp032DE` z^EJ~U#E&>ukQ#Ycl#phKrs*y>;C=J0I+U_oOF97(c_Hk&)BlVhMwxL%L%=8kXN0-l zdA<B4f4$}Egvjs`Op4RYUfK`D6V0WBQ4GNomHrMBL>bR^`@Z@qNH*vjOqL$XJ(}{< z&yucQFT=SXpLTsnJNI|vWUDPJ))K!8Y`?=FAj0okZSMh#qs?vE4nLNPSEak6bJ_Kn zB)#>1Vr6JF(5{?sGc!#+Ia8Q~z<$kxHkzOpd5Jq|zUtnfHA3k!ey<G~MGg9Sz1>+y z=~14w3ERzl&gc44)BRlQ5QLThNM~Bw642N=^lC`GBK?6th?`6qn*zo8F<eF=U=!nZ z`BK5Zj60Gh_0sTpkowo_xqVXp!)#jI1ZyFq`JVv@g<7@ND2}p&v?SJxrzAZZ{=R{y z&mRPCQ8-zXXgHImBIsh+x51(u!mMNvI@4FT#hhb0qHB1Zmu17mZyJ8rJEop@>z?@G zmqUQqT0U-FV{9qavf|3P_%B~}(7sDTE@y4`+>)zg@*j`Yw|vgpViFNu*q87@#w=N; zCM!M<0_=|1;Th%OJKSh24@UbwYSvs62*BytW(Qn?x98$Zr$#78>go3t>Pt5QMwc%$ z?>*nTUo_eIji}f1{SurdgZi)XSeic8m0P#LVjuJ_pQieRltjm(gm8f2M24ZDdR(v( zz|*qmc%?)zX}c4K%49kT+IwAwpI5eZ(%_NzG!>min>fEtCaYCQCY?gspnl+u1_KBm za4kaJwLfhQ=&W+zf7!oLE6mEB=L0pQ`CFron&pUE&j6*JjS~;^M0Ji-S%>b)@T0bx zV)6`@eZ-)Z4H_d8&OR2j)+9GsI9B>k&P^5PbTRAl=DT}%UG0Fi(;CFY)C|NH4dNMx zzW(O?#ctL^Y%zfyvSt1TkAXH5wgS|PkV)(#`at^WQ!Vy5>Q;y@PSdTj#g@mtr7RB` zDZgyefV+|t3vw6~96fc;F2p^Hno<KVNi2Ore^s|?*Q_!BT<~s_?38%Kwp1LQq$u(d zzVPI8U}uN{gItJUT_>%xAqt}k?<bM2AePr^e85R8LYXv`6!+4kjp`q*Fti-PgUd81 zgJ_aS+fZ4HRCr9{7#*0H%nxE*24hGD`tZU?KhL0UB|bJRf9aS(z+Q6pNz8sF2)b+t zAreG{B}EI}u3Wpjo7}s&29qy+YqL>sbC?49fa0-NtN<{kBbihI7F(BtkU{a%UoDsN z_YOfgqgf-uipJa?7{SBa_t@G9fg~10f+a(N#l02b5Bg%xn@@N!EnHQ4F!^2{y>4sL z!_uSPL<O*{`xF}fG_fT41k481$ZTr92BhH>ra&24+*UCp&d38pKF5|2ZFo~m8T2xu zDF}qiZB3}8lPqeE+C}w)<8)ZXpB(PB1jReS?rakXiBpSs3pQ`*Z#nfsB9{`Zj>xa8 zNrvc#ZU>?5=!)nCCS)&^a10Tba6c0Z0g$n6f{|%wH=P3gTAId~OLcuHe`C(Is}V}L zk}a1eHo?vGMq=Hr#?4`XsE;~)bi!mN{-x~)SoqRV1w1tR>1)ho2a;b7y>v?!&T!;) z_V6SCB}RdYTXZDW{sr_+zd>RXqmIE5i#ObxcV0NDfs`1VEUalp`?Z4yaNGLCueX`Y z`2}WuM&I<a4s>%H{{xSY%pGTwAD?|jhN_-J&frF*Xs6+MF=4#SXhkJgCnSnzsvKom zte}fZT!qPw?v5mpJK9Pj#nPukYfk3NqSfnT#eKv=>yU)=af8|T3i8GGXtTp*g<W$L zPM?XB@hSO~a(YVaBq&0S8>5Zumrv!sXjb0-mM>K#%t75poN^!k5vgIV04SV%0sXSu zUG>b8s4`v%==Ea}X<s!Uzhbo<iep!4fd<hMiojqw!gnJ=<4|S9WKEW2?rb(Y%76lo z5=Ao9%(~c951zn#uCdvJ1d0<av^bVNHRCPF?EDVhzQSZfHB{G(sI+!~O%R&}SXrxY z-blfLM4D8>@dJ$`Ks!-%V-Id12_xCK>iHL02j+)ME0GU6w1+B0suH#zzm+S-e7E@# z9_^gKa!g{2gx(Px;`(x=O&0hHUK#v|#AGr-++|HI6Ic{Eo+=nkXh~{}gN+c6JwVIz zZ9X%`bEJA1RS?RA3Py;}C&_y?CgyWqO+0&`i?v$c#}~z7Dhzdr8lwr2q$U@ZQ60n> z!B7B;KnR5}DdY1l)I!U5S~CfFCN0;Mq-&r0`ZFnu0UOR(5<jT{7s^y@T=~_uHY^wl zHETOqXt!t#GZcJT@ilX2BKq+;Hx4Wig0^V*15g%*aTf#(;V>~W*r|bz==nim)HN$Q zJE-6lwP4XcFKO*REUfg=l)LalhiDfQ2mSG_T7^zxUkE1*64KB*r#WSb<>$(8mI_@N zusO21c*xl0B4rHH2e~SLkc%`%y&4xa)GNpr(HqQ!C)t%P%?lbGTEd5_PnR#>I8PrF zvO^1CP$5EO877x79K+<yxS~|L{)Y#zbNW10NLHx@2kg+osC|)pW-l{P9#Y7n=%g^X z`*0Emdy)&-;Oert>Y#Q`h2x(pn_d|j&j?b8x*shu>f{PnHi=OTKe6$M2@_6W?hFzd zrfH0-Tql=}hgJk{Bc(iapfxn5@WOCW;amEmkdG##wo0#Mj#G45I@9l{pUKay7zF!V zAArk`?`^8l3yyT~FG-^EC2r!udVti@a8>`?fa&|ndNnT;c1hNHtPh_jtqgUS9{*s` zn1<vm!cL^4Q(dbl5KEZ<siNW+6L;-LLG^_%6BWnAIxp8_Bj|TWgWFnW^~REhCj&pm z<4Iweeg;RE%gdgIoP@Z0-$oMf8d2OxU{KV+s12vav#AHjBJ$O<^66ulZU^Oclk&S; zuL1!9#g3(Yu4p3!@+CXJ)EV~ik>D?H#R8VLTc+`PY9mfuiKiOG)AuC91%nZ-&>b-k z*Yu)`N4k)TopK1JOfaR+E$bPKZN8Aj#3RllTl53APqBL#q6|LakkbgFjF_0O|Lo<G zG75%TWKY^HgHN16CpPM@@kYPrJ#YeSZOm>pl`k>hHBB>%{9JK=hKHA&^*{Q^!JJg- zGKTkE#y4ri#m<@SIpi>T29+0wvIlAE$D{JkImm4p#3tqgt#XKL2S2W=Qa&hCJKp_8 zo$=27h%lvuz)knVxl9%u>6n$X&aS+nH${U|{4bvfJgp=#;7;FLnmZRh?0yG{Wc+|B zaK|k~Dh6X-8%Q7*YzLibu!xyyc_drdnUT?X#sRu{@T%r0t9Qt<K*dwPquF5~@Z-8d zgRI#s|KOM7)G7G>eV}o}{f?FTwPai}cw3VFHUox*HIu#wG3pVnit|wWgzLqDflr;2 ze--NckU{{foV=MgMYNy@%>2Gh`0$R#e1R((U)(-iP)df>fMW~EUGnmMk`4TiNF8ho zEI2()A2Dp>!Uc3tPzODALjKUp7vmOr`+$pXgUf5H#F-W5r0K&rOyQ}0R||O7?OhMM z5h*)u99^!Fz<$c{j-;>i$c#*&qIDRwTo!JQgv$u0sl|wmL=lE_?<1SX?Is~P9}5@- zY~+ea11Vf@w(uqRHNoLr49_;oaxPzTgAdGrDN0L!Mmjnf0bW9v6keNcd3=>6Ea%TX zj%LvD!4OFq@jkm?=XFdKGSnG4+yQn=nZNh$+&slBhzcf<l*pF;NVN2Wq?wZlt6Jv9 zb^qmlodGvZU-GF>1c}e#7oMa%wGj8leOcH?l5c^!AL4(+_S}vR9P!pZDTRHbtu|)& zN^seI#E}ay`>sMtJe_cZVTaSdcO~*-yGFtzD=0Zc7?X6m7);)j-3!+&hJ|1N$kTkI z;6O1+d;J``eB0l!pokTr5kog}t{_1%;vR!hh<Qg0CHzqi2G%@;QWcAiei(*SjC1Q! zqf+Z@<?rv9X(u+|MyASfm7dkDQvv2_PiTb!5vawydZrV|tFqJQIWAFVgYI+#zuCu% z@lV>4b6Nc8*}bR+Ulb3KOdrmX<r!|=Q~6zHwf0FqO<7bAHlChRL`6;e9X$&7SLk=C zSGNXMlOh_?0@FCRS8;1dryEWu%KC6klS0rI%X}IMzAV~LCD0ilmyOJ+5JtG5%SOR- zph)WOfLI*aaCw*)zBiin+p1JL(iOu>=mprT#Y<Nf6^^Vg>E)l1weJj$|G2SxxX@%h zwm2K3Dk*NvB{{pGNl8(+;gytA#Fw~BfWtxXJ~SvWs{J;LG*Ext`eea^kcB8i&Oc7= zzaYs@eNI%{`MT9aYCz&^YQN-QVG)QVencMcMp6#)<%ij9UWiw4mxlHa$X|R?4j0=% zagp$<JC|Y5W~7Nbm{y#`)H`$;0cwcXd|V0sjCvHG6g2}!DJr;dQd6u^iQemCNGXvZ z=@B9HG|Iz07fxlG&$NDZ`-|w2W@xxui<IoJ%Dxq`BnUG5ZRAKY!XgAYt1Ow0@OUpv zJRR!EPmLW1771Jfc|tABP1O4(jnP9#aSUxFH6phX5cT;mIOSHH7S*TV3p9>#>bLT; z1Z+)Vm}Uk7{7I^M{^{^k6yrs*I>dwVpZa-dr<bu-?hUbg5*~W`i^1173#UcV=unBi z=pdLFj3m`?A1Egfl=K7~l^xQyt&d;bCR7w=2Y}KA-Z@$Mv8SJRGk(vL_F8E2s3#>8 z)dysKat>=@ZySsAiCrrae#G`W-1PMbez=J<2re%Jp{76E$-544R@EAG-Mi7>X{@{P zy3rx|is1ZY7d6y1K(tdjeqa*M7KJ50YNcC2#S??1_LT@VYrx)eckhM(Nu(I7)z<<L zBA}BSF@b9qWKd5W|6FpyUzGrdc%U6wN7JMDNftk|q+GK)siNXBKFS#%x={=-0}eIm zY^Uysj1Ze6s}C6iql>`>Le+%mB8V!cb*(ahIvhYVlpHcEHz+0OnuKlav7<M)sRjfl z7XlJ!Yn5EEVV4hZP`?3&ew@|Z$8dti{_M9mVff=){wkK+4S6iJM;ek?sKUyuj%Zs@ zb6+Kxj2n=;HYScxwl&4UnP||j_*ES#5ShJXzh+w37snX?<?p^;r2x4O*{<ond7lAQ zaeG7!H~G98CcK3w3Z6#!ru_nO87vjVF8|?Mb|SEFSE@w`j-ab-SUYpor2}2Ag`ieH z)!)TW`@%m(t}Zg{<xj=mM_<I2F)?OfSmYs!O>+1nfoq#BL4Bqw57O7S(LKLACvTIb zdB+_4ZK{^L_`8L<1pFn=c-oXn{y~3IW=8Tgu#LR5cGkEr2i7q>e8&$`2-1G%)$E&o zm%#VLfIr1#e{yNR_9CFyInM%*^YhQ%k4x|EA0Zqx)N_LgJxx;h(kP)JWir^bszAUi zQ*7P(!JulzDJRM>wc0t8JKn_m{y~>XZ|LgdVZIZ7+#oj^Ve}AluzuC_lI@`fb<@xu z*^s;f9eEJ9DR?+791e5cM&~%AUEas{Jk!dejIk0mRs$tM9Kaxl43qJL(xGantIN@^ zTE&~eEsWdGY>ZHtzr;H|cdF$q%2yqkr2;w9xa!A*_Sk4*yPscoJf-COSogZpQ^GB( z!S$dxc*^)k0qgIl=8lt)+(e;OkyU8%65mGYq2^o#k_R8jq|hpWagq&bjD}ye-Wj3b z!dBCL%$eTC?KJ!&`KPn9h^{W-(73Cz5J$x&0rDT)73{50C5O@zcZhz9S8d|pb<mgv ziZ$D}YRRG=`LnLhQklE^TQ?R!H51d^^VWUWRR^EYGi&Y#Z~1VEx4ZO!C56<=PhDq~ z`GMQ5sJ8(2s@T#tBS7|d!Hq5+LzD+&K!#fX<JE|Okn7@GSd`;O65_x;k-(jc!Dlib zgC)+~hNh<EzweepqbN@9(B-+SPUt2<Y<8c==prV-Cdf#c8aPy9F)%H3uxRkTxW<jI zzfzv%(+RpzIr<_oKE<EvDUQUX+N54_y)O{T4+=h#vouqsO2VQSWv6lokY0_9wW5x0 zTW2;;Ce>?I14KIRm)MMxa&vNU-;SHsI7J|n?yY&rl*MBnu;L#ynD!C_Uls^9XwO&q z1$~y3H~lXUgWVT(g_K?8BCII-7GYJ{Nq+K2PcoSVJH5;di~LTFmFipBet6(jh1;PK z>2h8vDs9^zau!W!F;V;}1D8)AjK^xWv48?q#7%jf8*`GLuqt++n6Pvn;=_D){)eRe z*LR{XsElfCVRp5K?dcQ8nG(`N41i2hRVq2Oq=FtdHF|rKmfUT)hQDw<FUV03JYqO{ zem@u?s_o+^81vHfcG_L&bl)6*Do)A585HU$pVw}Dx7hO{ds^+W*389&Nh7F610^Lv z@fLVQ!IGMMCH;)FV4*Xyy$x9TX^uF}R!t&nZSu@ZLClrxUj%AE!{N$_vbMoyyUAr0 zTef}>yBfvWY$xt<nQ+DU0-UX9vYEq>Qb7!*l?q=b#~+zoKC(_Bg>5B&SwB}|XVay? z@%Re&1>u;mvh+F<EgtQQa`N?3j@aF&^Fx%-x!wkAajd;k_*@5yJk3fYzv0*X;BfV0 zE;<hYTcz(#=}Gs^URZPI?HHGnK#<KX72(Ve^`sW0$9HndPh=r5L#wN+l7Uu!PaH{1 z>0db`Huwx!jIJLF1-h;$cJQrAcH40}FnE!%SWY;j5wLomO|QJwRch!*jAM#_OmJ;M zLgB?%nFhQum~6baAAYl6djIB|yl1<{qG<ncw^z@q7-t^;_BG&nesrgy<pb+lha1L{ zR@RKWheryBb}jX~nh^C({912>CnnQ(#Mw674I*_m$Mb6>HHEkBds1)Djq3Ne?`<DT znC?@JGf=0QpbnZlDQI#zp!1sDdx3V-+cMIs@V5HUE_NWt$l^929+eTP*=exY3goPE zwQD7l4f{=N!mgfcywhzYO9T^{fvnm$XwisX&iH8!BktmH|1hRMfIntfL8?nAAw}O% z<rF3uOd#mL|CV#^%5HH)d=UXeA4cqr+gXn{aG>AsRe@7sn?ngEAtK(*(G~HVBz72{ z%B_G|3sxtw#vl`ZN!D88M71*#F$8P<4qARXZhrZM0Z~H<jt9BNtOj*f$e^54R%jI4 z=c@y~NLG~b@d<yjhv%Ho=W0e^RS!}%sx%-l`FM|qGm!}y8Rmh*3#RWl+D{?GU+3!a zZ`{>5pzf=Fjf(j1`C)D%7xD6S9mo4<FNR94d0Inokb<t@KXNBMpSQCZqA&okCob5d z`!!t6;>U;QxF}|P>)>OL%E()3(?@HghFWcS%0<oh5sA&`WwDL>M=aPYfQl+s1jfdx z(Cm?^Xo$!=igKgw$GLog58&IN`&UFdPB8}-ld>{M{BeD??lCOREnp@i!_VVG!3Vi^ z{hLv05s5q2d_iS%FIEfsA%uD>;hryU@)gAy6d$JzKWkU%h<_mEQy6O`ZuQ(N-B)i8 zpt$tMDCq5o|L(tYe&79ccTL~{Kd9doh=y|1wx29NlFp<**UJ$7-uAsG8FK+WMF$dO zwC!xlCl~-Ln3RJu4k1K^udtNs6V~P7fm{(a7nv1`5<g7M%wX<_j`Mj7h-!w-8PHMY zRe`_vYah(7Ca+P;DkIgaY3P7l@2wX_um?|bZ+TzhIwL$i3*3lCnfdY=pCD1AJ-bu` zUnO4^4U3#>=q%!Z4u&Zy`;~{F<Dxtxm6h533ajRn0K|mS;m^YFX%!+Db2Wn|o{sih zTbCP(R{l<nbd#JcZx}`|{vQt7Z5Qdy087)r+w>i|^?N*W>Z}O?hdDhH;=P_unH8nz z#3OV9qIR3(oawg3iccR42kzHhQRy0*arUYAhZtC>#|b7WDr3Xr$@`SW@N^wpQ4m)e zZj&V9I^<N-Wmsw$sGcFNHXN!x_AUHk1b5N<uR(9$EXFyelMnCDsHhbjQl@0QNvWd1 zA&kdB?{2ZKu8RWR=1Q45OAOsM6D9Z47#vwuEV9m@h60zX2A9-h?V^>S+Xspi=3q|f z=oc06V)rbTPyz-CjlY=J9CF!pQ2hCTBswy<PaSf6&ZMNbL#?3%FEiyZ8hAAQb&9V` zu(JDoT%Y^hex(lN;Ilz#Dos<n=}zQhF+RWVC-MnE<bO7SO&);0kDVo{$Bw;Dj$5|0 zVV!MpU9^Yl;C`&8K2y~bNG?~D@6={r{M6I0oK*bzc^>DX4pA!f`NcD41eIvzCyp>z zI4iw;ZzM?G%c#+F@z<}hODpD1GmnF@G`Hv65FBxHYlZ!4JDJus=#<&+4=V-L`$8!8 zZOeLcsQCs*^z7nB2-E$kLOcNU=H57$@TI#}F^L!(j1;<=+Q8>^s_F0BLOc^EgnV;z ze)B2Hf-Z->5>ZDzJ)#GQBJUBYZEz!L`qg0iDuDR%8Miq5>b6*h3u*z%`UzEB1P5xe zcjtRs+|={aHR6Xr?~|#{hELn#QloqVWOmd2P(hk_GJ#*kInlt{Spv9^&-oIPGidU_ z6*ZTQxeo*`olNQ@^dV<ohH-uihATg?|4RHb+6<V}8}~GOe?Shoq{Zx4sBd*wH0j+P zq(q>0X5EuoiHSjm>E&fOg<Y#);Yh3AQ&;zuUW!l?z6hX|Xxh}b)xUh)Xg}D#p2QGr z6f&ID>nM*RfkVpwAywCrl$3*&WV*H=L6y~iSVK8HXJ4rNwsQTlsV|hALxp-;x3_l( z?lw#kxCpfSqrFuvdGejn^ODPhPHm|EYPY7l)wMryF{hB0uij7tlvY|OEEXvlyTX?n zs-2l^K5;V~8EUsPZRZn1b{fMJB2_CI{ZZC^Hx!w)d}V)SQW*>|<%pw!8&z7(pP8Gh zv#3&wiR^%&O=IL8E>apjXV1@`Z(%BEyt@{?ED6?)bQHl2-sWcj5G)T3x=Oy&?DtrU z=IG>pcn`%?l&OR0d&TFF)AZG_(y@2#OIe=;6U-_*bR5+Q+>;u=_R3Eyd{EXiG$jPp z>ho=tVNYHS4J=<ivbTS5V*+v$`HR|;LbS$~UTht9he$S_0%l74h5d|4<0~8Ma|NBN zL@J(CJaCb%_7&9#6x9%Rc8KJl?)tJDG{lgEhD`;-a*$HGp90?>SZbM$_jJ|oKh~TW z+&%PCz6l4UP|I@43ABP>^29d-@TEWOba$%*DTMRw6OT;HD>*kdSs=Fk<1Y~4C?Y#$ zhb6%FtJIi~)zLKn+OEF|opIY!ju@4bC(F5w7$<h6EaqVf?_3c8`(YO?%5@ZzvI`Td z-DbS1EDgoQn(z125X2;CLYSVu2wR?g19eQ`cc~P}F>4>dSkSBkfNDM-i^?n%Mnsx9 zDn{ptv{?h7@2ya3(43G@!*^tVSi;urfm2zfFGDqm&jHJhRIcJAFA_eEl0TpyeVD`V zTT8?5Z-g6Ag1oBQ{7PO#HCc8?e)@`cId**|cR@l|D6moPAUQi}e5*Z>O)!CD-RC}* z{j~_rfbHz@n<^%finxMi46+P*GVknMHF+{29TA6>XY-+Ohr@%pMzS`GUW*EeL@0b{ zD!xH$JTNT=G19k%J?$w-FP1@jUYk-cl>mQwZY29%P&tuPU5}_H$=|JJif+EOgMtkd zj#RkRj8g}@?K7-i@c6*W;xiCtGjV23K3=dIFwX$fjcw$3=fu-ikE77BYd~JcaE27q zzWP`#k&^GfH@1nSUU~&O8c1Z1As|N51Ukv@`8{E8afD^1g=b{(#@e}L=oB&f{j?dV z4SLvqKI7G$pI>A6Evoy7!m7fo>CGUDS;0YP!7=~oqY6|wb+v;7WmI|6;4{!2IZ`{M z&l?v1f-l)8|IRPLZR&H4a(myU6NcKKVO!)Chh`Wgf)tLgj6h$vLou~nAPja#8{>6T zqCmvgwGY~HF`3%?CzQJTadmLV(AmYvev-pWNk5~1{zm?JR_E@OL1xWq36Cx9z!<L= zD#vvgukaxH+6F+uL#?`e3JN;)2;(|LBN9hP$Cy7`YnqMO*-6d5_Ry6wE0F|~*9E&b zHUsN|oeY}5jJj={hO{0AiBV!M*`EUecK+rueGGLSRwhFMHHxq#CG-#R?u>fMHSI61 zu9xsuN!f2l2z4gEGby92Jsgz)ASF1dp9!^RzA-T0n}YziVdL7<jm%?}%}!QoEqpZ8 ze6lUqxo-8!YBBd%RMcBju`6EKED#;c%OS}mjWWsvZItg?l^lX#x8boW1Bax_E}!@I z$UjqK5pe{wjfXWjb&rCJN#U29fGq4E84GY}22cb?W6eoFUC}F?WX_*&B`l`%ge<<R z$ySH6B$7Agy~n&g=|lX=Pkh5El>!fUnadMzoME?DsKK0bs~b{UjQWy8!<8k!%2U$C zKk8~?t9d@UcOI-Hymq;xUW~gZAP4<C&at)*9QPU%z<5zhfZ^~Ig0Iiq8<!R%RLT5F z=(rynTEgA_(?>sE{96c|)=nkj({L<Vfa5b)icv#BX{qM^zBx}hOWl3LJuP-PCs)m{ z>eP=HbQU9I9!=mvu&SE!9DY_RzSsR-nJjqH4YpF+Oe}!Kd1q~eSg53T_Ixj(16YDI zIf*qbhjok;z#f^?^9AN=*=;)IGE88kuT3F=>6BXRY=FR>?m1;)Q8=*wNyFCRjH{&8 z&%*LE5|_fKZor2@FiDgt!n_HjFRUtT<C@fz{Oo)m%u^Ikjmw5mFz{rXaJd)adcSo} z=--^mG!b-*zI3e!S8{Qr`e#+C?FJr#z%~o^C<{O}`l*2{W#H9Mq|0thO64b=;tQ11 znCINdsh=+MzZ;g8mN`Q7kDTnCdYt{u?}rAfbWU1@TNZj0R!0fJC)T_5uRC-mgI=T# z>o2xAnF_GzWKQ-ZmmqZuWt$)AIKUGUmzdK~GZ0LqYgJ&(j%4{RHvmT;-o*kzPmca! z0*QegWz#Y9lifY5^}7ioA=SU#=(^H3qqm?L109P5LL}O(E{w*+60-wWuR>1}l~NxW zuQBg*O4VGH<KqX7gZxJ-5aJDl6ZZ=?QJfa|*S*3?gq?%E(o4^GSMiTO61IWpw}xV{ zopf^Y(+9F<Eqq^D$(1jbr940JOaB7Uwe5=M+FzVeJCvRh41GqJXN_7SU?_0DURsuY z4#h<#idmV(N5(Xo(;V{hpzhENxwx87OQL6ofS<T$PB**2Q!FB0_Veknek-?2#x%yB zkG~tNHak)$$tAH-4f2~iAzI6t<LM=KZ=b4}H1{DVCPK{R)fX)ZFWH6hlkNQJ#9}mL zOMv9k(a}*2R*tXo#bJAEt!t5IEM<d=aNy%u3=Fz(LOs26iWKy(7J$j@U)ZkGGeFvo zr&BP+=PquF7kNe#1Sl&y(FDOR3Jq-Bc?;GcA}#V5nRQ(fRR3ZqqtdoRP@W*$imS=@ z**rBasXH=1+qjn36{{5A#<8nGGyapDDc9Js$xI%ROQhhH@td2eh}XCX0HoAkIDer- z#oISJyhA`q$!wEEih0EwSvNYm2ep**jQ)0{C#JC3k;-y3RWisIp07+Wz;U~t$oGA# z2Dl&XPo3#(vsV;1^*+DVXu2D5=nmn=?zTi0>lg39Pz%Q6O4|X{nK}o7{N+UlJ?j%m ziOx5<)Q<6Rsr1&3c;VVTc}-T*sUDmOj7qj)B}ORQVsnf&lC~9+AKlty{QTM*yrxN& zH8r~G8SDPw&vP!;gzxSLdXESyxp>co=o)hdz1@tt)TcB!>SmH*@bTCbv8GZ#MoV?X zM>YuK9TZ!snx*|pvZ7XOvV9Cy-f){1LJV9A4AF4F%zJE<HcO1Bh+D$#!is6mf<E;h zU6_ZL-pt_SG+-9=w{TbL{(Z~3%(qTHW!dl)fx7m7lG!^Jk>cpxWSSN3wGc&eV}cx6 z1irlD-C{<BCXQZ?|0+AbtxBI}wk`jOd<^jhA4Ww}-E1Q%Ua<2lQzN9qD>{FCBlufK zn8dK-Lp@(<tq_lmW?_##r{OgPnIV*T!xM??F!YxRhspDYW91-U?fTI_zndqy*Z|Pm zQeSp{W;8bgL%<YEnsBnQR8k+n%i%wEwr6BYy)U}<uI~~w^*aF;CNLpnLpjw5nv{~o zX{+DWgg<i|dBSJ%SSjgM!WMwXG$OY3B-6qJ2w2WqJwV#yiLPy~<x)6-6bN^2=;N`d zS#^l8SkCk8PR^P($&sSMp3X>W)(%v_3%#&E3WLT!8x5wR!B3WL-J7wH1<$F{eE~mO zBK{7i?NOTi7bkB&)fD0PyH6A<;xLRRzqVOv_P|Hv13OBwv{G{V!f3B5>wK(veoxEG z>xJJ9Lxrv!>`C@TBdMH>*f?N}SX<Aww?7(fq=SR*W?lyplR2jk3lsMi=HOBDf^G~6 zI>W*k!+ojE6pm{JTAhU2{C>mwJ(bG!8#Whkd9fJdRIP4ic1p){5<PmzqmDwu&Fh(t zkz>kMNv?Z8KAkiPLT0*X<EMP&^%JH#Ur=0^ezLE0x;+yrJ@RhxPvk>-$=snSc>Cs$ z)akb?$O7E>*?jkys;=PqXc=?HKiiYPl&-NkjN_4saHns%7S&;@8>&1+`lu%DY%gE{ zYgO10ycFQbh-<m0)ZNqG>MjUd(Sn;bmqx5NWCI8YO}1W#?VJ!ixcMj=UsZ$!jn2GZ zj%1=FWnC|m&+{*35ON2jhRgVO=&L><xno-9M?pURs-;nO+EN12a^OnV`Cp2g{{90B zauR-e2=eN;zG?jxVJL7<c71oT=@DuUNO)rOhb;yg&^7)=zbr`+u)*4Clwsd(>9eYW z7(_7iF%NS633jkEO`4^}@0SLv!Dcc;87HefM`K0fS3}<^yY&2@!nIlZ9L8;51Rrjc zEKGquC-h%l?xkfEHXvOuLtmU6Vbc)RDmsRrmPag(W6X<%%+tqRs1b72x8Elci+)fQ zr=1v4C5!V_!$m@G@nfllHBUgJYRs%wGIu4B2nuKD^LBsR{v_CB^Zu6G8BH1RqaorO zl#dbmaRi<YhZdv=r-|efb@p?l(SyDdJS|^dfJw)%hncYUwEUYdUWx66n1kDq{(efB z(EAe8xW^CZ<85BB?Kf^(HPqE-OmvV-E9g@gXws}7BflBsd$+c3+Pu0wW!DI|m~o=O z`}|!$tt{$5IjABVDq}vJ%bM8N2f0<>0Vg=$>#~xxsK_a3B9o)Y0yz2HA6OB4c&&&> zuO1Ee!8AN6XMTy^MkLqB0(zB;0|$)x-xmg3BV10Zo0YV)t%8bjZoX)GIV$nG(x+OO zOCMzUYbOo7NT;^Ej1y<jus2*$$se3PD+xW1>TT6bY!(Iy>e=w3w(G5hJX|@g_vk)% zVig&va&|vtdDao6>g~OyiiU*Xl!L}6Dg9w7&HXzCk>{GOd8G-Xw=D~SD8D7;R`qVf z(G<ZgdUV>mymZIkuVyZHX2&-#!P5|KL8FNPMTJ2sK)IKh=d0zh5TA|2LwtrqcgscB zP@F+9>P^>u=S7J$Gd<An&sASEMfso0Z(muH72tpF!Jg@JQt{SSg6^pp4z$jN#D5Xs z*Pg!h!eWrva>2XKf2k!Gd7s>yYkT~}W3C0>m%ki7_i@#XE1S#9p`K*poU^eOEWaL8 zh3N@%nWqgsbF~xIh&co7R!&P`I!hTT?R95RT#1Crw8$h9h|bvY$&cU({2u42G45hL zWbXdE`EA%_c9s7P^F>PQhxzl}UJkzujfd0pW?`?0KGe?Pw4gE^d4eusc~7gZ0<l#C z9zu;ir<H|T(ncqur<32sZ>vtvz4pz9n=Xkki)k=<L6E!jmiO&MUZ{^ZClb7Ra%$vm zMPp<NA2kZSbNGd=nM{DhgueyNggOXIi#j$#t+yho(60V)La<dl8~<~a4{3%Fe4%Mp z!N@4ORW1J34;wz+MppSQp9@Erox`rs&r$nX<UcQWX(0>h9DUbB#=IwD^zSFKP90Ig zXUVt`WTYgguS4hNRJ23W7H(@~Yc!pA^KnC?E586f3Opls;#~oh1wp2t_bI4N`ek*> zV>FszApmg+n%G9n8Yuo8sNPrGR9?M_d`e7Iq}=EhRYAPEF1}PM{$$5bZhP#T)`Q&U zXs@YK=j?^amxzf;$_^<j=4)z2%};o=!Ikw8Y<S2oJjzcm{g2<U^O`|Dh=k4IzL=98 z!(0_>CiEERgqF(ZwKMg8aCMGr$gZVHaJL_8{49T5Sg#$;_S5i!fBJWUsbj#cDC&XB zqDr!@vrC~fm7jkOlLhqFVyv{PnF%Nqxb2##WCA;uZb#=1@H>Jds$Tk4v%n<zi;;<H zn;IdbCw&3l{gS`Eglv;|M)SS{lKIjgGz`1@_kFbdjPk&X#7QSUvy@5KJdL3!+ue=( zm-+-g_+UAN4^a9Oc%t9*g^@0Lq|~IU0VtnzV7L6)+iP>S#!*L|DU(VKp!<b0=X1n9 zxMw3GJ{@{_d8G7Us3i}2MMEnZMN9{BGc*@|^Y)L-b5!=9CC$_GkmjhpIaaX8U%h(u z`8>^ktx!aM@fjfk4YSp^FPmex;5=$4{LE*s>5yL)_lrQ6fQlEfdBWibZozhx9@K|2 zKW+!pV>|WPZ6ZWb6xk_n)6fHM<NT?NOdT$?xs{EyvT?dT4-cl^aZi#p=TmF?ll}Y~ z+c{Ka^_E9F4zqe)y=*30D~<liIQU8PyFHI`%t!$!f4deK?<K?z-I%@T<{y`o<W!_= z3ORctsNzH2&+pH1@@IMOBbE9SH<mzVcl=G#9k!ssxzh88WuyiG7Kiy%!#V^JVX-V< zKe>p%mS93aiZ^x6zz^Y3=#3=lc!n^a@`bXtU^jHw8EubtuYAv%)A(`nd+Fw8)aNJ! z*-kBrtci9z!Y#iCPv*Ue__pZF$xNlJ`yCXI?9Z%rFh&oV5Se%HFiDj@1^bhnl}j-y zo0A?0txd4)M<}CBZ2*ee$E^~%NAt6?YU@9^CDG#*^C|2So1LxpLxNc%9TF}qH5|9? zmSeO{xLO&r*0Su22EybKE!b~sT@R7RLQO2b6L>V_IEsV5^|+4QYc{u*dj}H~okz)N zkIc@^<}>n>3AG2OyQLEcty}51rJ7>jtAPgLGY-WDJGm8Pdns^I&I2O%l=gclD^$59 zU_QkitDZ2_AaBnrh^vV4<H^0nDxR-f5R(Ps2G*PzT}eMa%urEwR@lZ`&fhQe-BNR5 zWY|=gZ>;Bst(w+L;Pq4i?V;iJa%ID}P~FlTsZ8`lbIntn#ofB=)$@2~d{-l2)2lew zKh&9Jb)9A6zf)pGvfN{BXD009uScR?^uA#~wB`qX?#I)QM2tE-Jvr(2aBgv(Wpa8> zVGPdmzg-gnSV3hP-)B`$(s-Wx>}^u`ZLz9WZUy<fCyPXvjv2kZ-%nlybnvC;SzaXr z*LwLMsk_{Tx5RUV`>a;G$AQ1A(^pSEE|jRN3$GZRQ@j$oX#f0OrTDd~9p&&%U;SZ7 zHa(X+YDx=A#HQdl?#1H#aB7rdy}@+S!^v;M!|4a37c5jQV&P}H#>N<5Y6(vgUdfI~ z)CMitRz0fBCKA4jQ_#Rj^o{fTOoRlEIt`TX;#YLK`PiLtqX5Oq?0MV_f}xi2j#8U3 zM9Zn+)~`%@3!PU(CpA=wg0GB3<=i7w+BM>N*p`uzLvJ2N+6>AuK5=gxlXf<fYc49a zv+B5TkE<|#nb6ESg5S(9uBcGmjsEPO*}lk!Nl09(uX(o0gx=-;G^y#lSiW?_3lVO1 zT}d_)i#|A*u&;A7-qNP|_(i$nddQCAmqBppq`*}-N33|B_kmAc<;8Lwsm)9SOoh$R z8(mM;g5HFP+iPj9o(}E)NQB)KkgsF&wcZ%J-7&@L?h_!OzgTb~0PV9p2XH_UHQyHu z<E;%Z5F^yl5=c!ON$p>Jj-VaZaXI-Q@Rj9gv-5o!vQu{PG#Tf{`mu1HVe{|K3yEic z%R9!yi)8}5@$f5mZnv)uwHf$*BCnVNl8e(5{|s6Aq&S{ulLBJ#IRMD#d-gXML{|Vy zGPOyL{dm!Isr`8j>+AY(Q2OqlCj#FteiKy7zmHhC&!uNF_kz$fUyL7iU<Ei*RBMXo jbqYI^SzeW)5um=f$0@a>&PDz6H?^#kl4OmzN$CFpvNztF literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/talents/spells/death.lua b/game/modules/tome/data/talents/spells/death.lua index c3af1defd6..d91e95c8aa 100644 --- a/game/modules/tome/data/talents/spells/death.lua +++ b/game/modules/tome/data/talents/spells/death.lua @@ -204,37 +204,30 @@ newTalent{ points = 5, mode = "sustained", cooldown = 30, - sustain_mana = 30, - getNb = function(self, t) return math.floor(self:combatTalentScale(t, 2, 8)) end, - getMana = function(self, t) return math.floor(self:combatTalentScale(t, 5, 30)) / 10 end, - getSpellpower = function(self, t) return math.floor(self:combatTalentScale(t, 10, 40)) end, - getResists = function(self, t) return math.floor(self:combatTalentLimit(t, 20, 5, 10)) end, - callbackOnActBase = function(self, t) - if not self.__old_reaping_souls then self.__old_reaping_souls = self:getSoul() end - if self.__old_reaping_souls == self:getSoul() then return end - self:updateTalentPassives(t) - end, - passives = function(self, t, p) - if not self:isTalentActive(t.id) then return end - local s = self:getSoul() - if s >= 2 then self:talentTemporaryValue(p, "mana_regen", t.getMana(self, t)) end - if s >= 5 then self:talentTemporaryValue(p, "combat_spellpower", t.getSpellpower(self, t)) end - if s >= 8 then self:talentTemporaryValue(p, "resists", {all=t.getResists(self, t)}) end - self:talentTemporaryValue(p, "max_soul", t.getNb(self, t)) + sustain_mana = 15, + getMana = function(self, t) return math.floor(self:combatTalentScale(t, 10, 27)) end, + getDur = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end, + trigger = function(self, t) + self:incMana(t:_getMana(self)) + if self:getTalentLevel(t) >= 3 then + self:setEffect(self.EFF_DEATH_RUSH, t:_getDur(self), {power=0.5}) + end + end, + callbackOnKill = function(self, t, target, death_note) + t:_trigger(self) + end, + callbackOnSummonKill = function(self, t, minion, target, death_note) + t:_trigger(self) end, activate = function(self, t) - game:onTickEnd(function() self:updateTalentPassives(t) end) return {} end, deactivate = function(self, t) return true end, info = function(self, t) - return ([[You draw constant power from the souls you hold within your grasp. - If you hold at least 2, your mana regeneration is increased by %0.1f per turn. - If you hold at least 5, your spellpower is increased by %d. - If you hold at least 8, all your resistances are increased by %d. - Also increases your maximum souls capacity by %d.]]): - tformat(t.getMana(self, t), t.getSpellpower(self, t), t.getResists(self, t), t.getNb(self, t)) + return ([[Whenever a creature is killed by yourself or a minion you feast on its essence, gaining %0.1f mana. + At level 3 the thrill of the death invigorates you, granting a movement sped bonus of 50%% for %d turns.]]): + tformat(t.getMana(self, t), t.getDur(self, t)) end, } diff --git a/game/modules/tome/data/talents/spells/eradication.lua b/game/modules/tome/data/talents/spells/eradication.lua new file mode 100644 index 0000000000..3e5c606312 --- /dev/null +++ b/game/modules/tome/data/talents/spells/eradication.lua @@ -0,0 +1,228 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2020 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +newTalent{ + name = "Boneyard", + type = {"spell/eradication",1}, + require = spells_req_high1, + points = 5, + soul = 1, + mana = 30, + range = 0, + radius = 5, + cooldown = 20, + tactical = { BUFF = 2 }, + requires_target = true, + target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t} end, + getResist = function(self, t) return math.floor(self:combatTalentScale(t, 5, 15)) end, + getCooldown = function(self, t) return math.floor(self:combatTalentScale(t, 10, 30)) end, + getPower = function(self, t) return math.floor(self:combatTalentScale(t, 10, 55)) end, + getResurrect = function(self, t) return math.floor(self:combatTalentScale(t, 1, 9)) end, + callbackOnSummonDeath = function(self, t, summon, src, death_note) + if summon.summoner ~= self or not summon.necrotic_minion or summon.boneyard_resurrected then return end + local ok = false + for i, e in ipairs(game.level.map.effects) do + if e.damtype == DamageType.BONEYARD and e.src == self and e.grids[summon.x] and e.grids[summon.x][summon.y] then ok = true break end + end + if not ok then return end + + if summon.summon_time_max then summon.summon_time = math.ceil(summon.summon_time_max * 0.66) end + summon.boneyard_resurrected = true + game.logSeen(summon, "#GREY#%s is resurrected by the boneyard!", summon:getName():capitalize()) + return true + end, + action = function(self, t) + game.level.map:addEffect(self, + self.x, self.y, 8, + DamageType.BONEYARD, {resist=t:_getResist(self), cooldown=t:_getCooldown(self), power=t:_getPower(self), resurrect=t:_getResurrect(self)}, + self:getTalentRadius(t), + 5, nil, + {type="vapour"}, + nil, + true, true + ) + game:playSoundNear(self, "talents/skeleton") + return true + end, + info = function(self, t) + return ([[Spawn a boneyard of radius %d around you that lasts for 8 turns. + Any foes inside gain the brittle bones effect, reducing their physical resistance by %d%% and making all cooldowns %d%% longer. + When one of your minion stands in the boneyard they gain %d more physical and spell power. + At level 5 when a minion dies inside the boneyard it has %d%% chances to resurrect instantly. This effect may only happen once per minion. + ]]):tformat(self:getTalentRadius(t), t:_getResist(self), t:_getCooldown(self), t:_getPower(self), t:_getResurrect(self)) + end, +} + +newTalent{ + name = "To The Grave", + type = {"spell/eradication", 2}, + require = spells_req_high2, + points = 5, + cooldown = 20, + soul = 1, + mana = 28, + requires_target = true, + direct_hit = true, + range = 0, + radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 9)) end, + getNb = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5)) end, + target = function(self, t) return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)} end, + on_pre_use = function(self, t) + for i, e in ipairs(game.level.map.effects) do + if e.damtype == DamageType.BONEYARD and e.src == self then return true end + end + end, + action = function(self, t) + local boneyard = nil + for i, e in ipairs(game.level.map.effects) do + if e.damtype == DamageType.BONEYARD and e.src == self then boneyard = e break end + end + if not boneyard then return end + + local tg = self:getTalentTarget(t) + local list = {} + self:projectApply(tg, self.x, self.y, Map.ACTOR, function(target, x, y) + list[#list+1] = {target=target, dist=core.fov.distance(target.x, target.y, boneyard.x, boneyard.y)} + end, "hostile") + if #list == 0 then return end + table.sort(list, "dist") + + local _, _, gs = util.findFreeGrid(boneyard.x, boneyard.y, boneyard.radius, true, {[Map.ACTOR]=true}) + if #gs == 0 then return true end + + while #gs > 0 and #list > 0 do + local foe = table.remove(list, 1).target + local spot = table.remove(gs, 1) + if foe:canBe("teleport") and target:checkHit(self:combatSpellpower(), target:combatSpellResist(), 0, 95, 15) then + foe:forceMoveAnim(spot[1], spot[2]) + else + game.logSeen(foe, "%s resists the call of the boneyard!") + end + end + + local nb = t:_getNb(self) + local t_skeleton = self:getTalentFromId(self.T_CALL_OF_THE_CRYPT) + local t_ghoul = self:getTalentFromId(self.T_CALL_OF_THE_MAUSOLEUM) + while #gs > 0 and nb > 0 do + local spot = table.remove(gs, 1) + nb = nb - 1 + local m + if rng.percent(50) then + m = necroSetupSummon(self, t_ghoul.minions_list.ghoul, spot[1], spot[2], 0, 5, true) + else + m = necroSetupSummon(self, t_skeleton.minions_list.skel_warrior, spot[1], spot[2], 0, 5, true) + end + end + + return true + end, + info = function(self, t) + return ([[Teleport all foes in radius %d to your boneyard, as close to its center as possible. + Up to %d ghouls or skeletons are created around them by the boneyard, without any additional soul cost, but they only last 5 turns. + ]]):tformat(self:getTalentRadius(t), t:_getNb(self)) + end, +} + +newTalent{ + name = "Impending Doom", + type = {"spell/eradication", 3}, + require = spells_req_high3, + points = 5, + mana = 50, + soul = 1, + cooldown = 25, + tactical = { ATTACK = { COLD = 2, DARKNESS = 2 }, DISABLE = 2 }, + rnd_boss_restrict = function(self, t, data) return data.level < 15 end, + range = 7, + requires_target = true, + getMax = function(self, t) return 200 + self:combatTalentSpellDamage(t, 28, 850) end, + getDamage = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 10, 100), 150, 50, 0, 117, 67) end, -- Limit damage factor to < 150% + action = function(self, t) + local tg = {type="hit", range=self:getTalentRange(t), talent=t} + local x, y = self:getTarget(tg) + if not x or not y then return nil end + self:project(tg, x, y, function(px, py) + local target = game.level.map(px, py, Map.ACTOR) + if not target then return end + local dam = target.life * t.getDamage(self, t) / 100 + dam = math.min(dam, t.getMax(self, t)) + target:setEffect(target.EFF_IMPENDING_DOOM, 10, {apply_power=self:combatSpellpower(), dam=dam/10, src=self}) + end, 1, {type="freeze"}) + return true + end, + info = function(self, t) + return ([[Your target's doom draws near. Its healing factor is reduced by 80%%, and will take %d%% of its remaining life (or %0.2f, whichever is lower) over 10 turns as arcane damage. + This spell is so powerful that every 2 turns it tears a part of the target's soul, generating one soul for you. + The damage will increase with your Spellpower.]]): + tformat(t.getDamage(self, t), t.getMax(self, t)) + end, +} + +newTalent{ + name = "Eternal Night", + type = {"spell/eradication",4}, + require = spells_req_high4, + points = 5, + mode = "sustained", + sustain_mana = 50, + cooldown = 30, + tactical = { BUFF = 2 }, + getDamageIncrease = function(self, t) return self:combatTalentScale(t, 2.5, 10) end, + getResistPenalty = function(self, t) return self:combatTalentLimit(t, 100, 17, 50, true) end, + getVampiric = function(self, t) return math.floor(self:combatTalentLimit(t, 60, 3, 8)) end, + callbackOnActBase = function(self, t) + local p = self:isTalentActive(t.id) if not p then return end + if p.cur_value > 0 then self:heal(p.cur_value, self) end + p.cur_value = 0 + end, + callbackOnDealDamage = function(self, t, value, target, dead, death_node) + if value <= 0 then return end + local p = self:isTalentActive(t.id) if not p then return end + p.cur_value = p.cur_value + value * t:_getVampiric(self) / 100 + end, + activate = function(self, t) + game:playSoundNear(self, "talents/spell_generic") + local ret = { cur_value = 0 } + self:talentTemporaryValue(ret, "inc_damage", {[DamageType.DARKNESS] = t.getDamageIncrease(self, t), [DamageType.COLD] = t.getDamageIncrease(self, t)}) + self:talentTemporaryValue(ret, "resists_pen", {[DamageType.DARKNESS] = t.getResistPenalty(self, t), [DamageType.COLD] = t.getResistPenalty(self, t)}) + + local particle + if core.shader.active(4) then + local p1, p2 = self:talentParticles(ret, + {type="shader_ring_rotating", args={rotation=0, radius=1.1, img="spinningwinds_black"}, shader={type="spinningwinds", ellipsoidalFactor={1,1}, time_factor=6000, noup=2.0, verticalIntensityAdjust=-3.0}}, + {type="shader_ring_rotating", args={rotation=0, radius=1.1, img="spinningwinds_black"}, shader={type="spinningwinds", ellipsoidalFactor={1,1}, time_factor=6000, noup=1.0, verticalIntensityAdjust=-3.0}} + ) + p1.toback = true + else + self:talentParticles(ret, {type="ultrashield", args={rm=0, rM=0, gm=0, gM=0, bm=10, bM=100, am=70, aM=180, radius=0.4, density=60, life=14, instop=20}}) + end + return ret + end, + deactivate = function(self, t, p) + return true + end, + info = function(self, t) + local damageinc = t.getDamageIncrease(self, t) + local ressistpen = t.getResistPenalty(self, t) + local affinity = t.getVampiric(self, t) + return ([[Surround yourself with Frostdusk, increasing all your darkness and cold damage by %0.1f%%, and ignoring %d%% of the darkness and cold resistance of your targets. + In addition, at the end of each turn you are healed for %d%% of all damage you dealt.]]) + :tformat(damageinc, ressistpen, affinity) + end, +} diff --git a/game/modules/tome/data/talents/spells/master-of-flesh.lua b/game/modules/tome/data/talents/spells/master-of-flesh.lua index 69f66eb374..faa4693167 100644 --- a/game/modules/tome/data/talents/spells/master-of-flesh.lua +++ b/game/modules/tome/data/talents/spells/master-of-flesh.lua @@ -132,13 +132,13 @@ newTalent{ summonGhoul = function(self, t, possible_spots, def) local pos = table.remove(possible_spots, 1) if pos then - necroSetupSummon(self, def, pos.x, pos.y, lev, t:_getTurns(self), true) + necroSetupSummon(self, def, pos.x, pos.y, t.getLevel(self, t), t:_getTurns(self), true) self.__call_mausoleum_count = (self.__call_mausoleum_count or 0) + 1 if self.__call_mausoleum_count == 4 then self.__call_mausoleum_count = 0 if self:getTalentLevel(t) >= 5 then local pos = table.remove(possible_spots, 1) - if pos then necroSetupSummon(self, t.minions_list.ghoulking, pos.x, pos.y, lev, t:_getTurns(self), true) end + if pos then necroSetupSummon(self, t.minions_list.ghoulking, pos.x, pos.y, t.getLevel(self, t), t:_getTurns(self), true) end end end return true diff --git a/game/modules/tome/data/talents/spells/spells.lua b/game/modules/tome/data/talents/spells/spells.lua index 0707f350c4..7b02b85251 100644 --- a/game/modules/tome/data/talents/spells/spells.lua +++ b/game/modules/tome/data/talents/spells/spells.lua @@ -152,7 +152,10 @@ function necroSetupSummon(self, def, x, y, level, turns, no_control) m.faction = self.faction m.summoner = self m.summoner_gain_exp = true - if turns then m.summon_time = turns end + if turns then + m.summon_time_max = turns + m.summon_time = turns + end m.exp_worth = 0 m.life_regen = 0 m.unused_stats = 0 @@ -308,6 +311,7 @@ load("/data/talents/spells/master-of-flesh.lua") load("/data/talents/spells/master-necromancer.lua") load("/data/talents/spells/animus.lua") load("/data/talents/spells/death.lua") +load("/data/talents/spells/eradication.lua") load("/data/talents/spells/necrosis.lua") load("/data/talents/spells/spectre.lua") diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua index 4dfaf38fdd..d614ad37a7 100644 --- a/game/modules/tome/data/timed_effects/magical.lua +++ b/game/modules/tome/data/timed_effects/magical.lua @@ -2001,7 +2001,7 @@ newEffect{ newEffect{ name = "IMPENDING_DOOM", image = "talents/impending_doom.png", desc = _t"Impending Doom", - long_desc = function(self, eff) return ("The target's final doom is drawing near, reducing healing factor by 80%% and dealing %0.2f arcane damage per turn. The effect will stop if the caster dies."):tformat(eff.dam) end, + long_desc = function(self, eff) return ("The target's final doom is drawing near, reducing healing factor by 80%% and dealing %0.2f frostdusk damage per turn. The effect will stop if the caster dies."):tformat(eff.dam) end, type = "magical", subtype = { arcane=true }, status = "detrimental", @@ -2010,10 +2010,16 @@ newEffect{ on_lose = function(self, err) return _t"#Target# is freed from the impending doom.", _t"-Doomed" end, activate = function(self, eff) eff.healid = self:addTemporaryValue("healing_factor", -0.8) + eff.soul_turn = false end, on_timeout = function(self, eff) if eff.src.dead or not game.level:hasEntity(eff.src) then return true end - DamageType:get(DamageType.ARCANE).projector(eff.src, self.x, self.y, DamageType.ARCANE, eff.dam) + DamageType:get(DamageType.FROSTDUSK).projector(eff.src, self.x, self.y, DamageType.FROSTDUSK, eff.dam) + eff.soul_turn = not eff.soul_turn + if eff.soul_turn then + eff.src:incSoul(1) + game.logSeen(self, "#CRIMSON#A piece of the soul of %s is torn apart by Impending Doom!", self:getName()) + end end, deactivate = function(self, eff) self:removeTemporaryValue("healing_factor", eff.healid) @@ -2035,6 +2041,21 @@ newEffect{ end, } +newEffect{ + name = "DEATH_RUSH", image = "talents/utterly_destroyed.png", + desc = _t"DEATH_RUSH", + long_desc = function(self, eff) return ("Movement speed increased by %d%%."):tformat(eff.power*100) end, + type = "magical", + subtype = { necrotic=true }, + status = "beneficial", + parameters = {power=0.5}, + on_gain = function(self, err) return _t"#Target# is invogorated by death!", true end, + on_lose = function(self, err) return _t"#Target# is less fast.", true end, + activate = function(self, eff) + self:effectTemporaryValue(eff, "movement_speed", eff.power) + end, +} + newEffect{ name = "ABYSSAL_SHROUD", image = "talents/abyssal_shroud.png", desc = _t"Abyssal Shroud", @@ -4734,6 +4755,18 @@ newEffect{ elseif self.skeleton_minion == "mage" then self:learnTalent(self.T_METEORIC_CRASH, true) end end + + local image + if self.skeleton_minion == "warrior" then image = "npc/lord_of_skulls_warrior.png" + elseif self.skeleton_minion == "archer" then image = "npc/lord_of_skulls_archer.png" + elseif self.skeleton_minion == "mage" then image = "npc/lord_of_skulls_magus.png" + end + + self.replace_display = mod.class.Actor.new{ + image = image, display_y = -1, display_h = 2 + } + self:removeAllMOs() + game.level.map:updateMap(self.x, self.y) end, deactivate = function(self, eff) self.lord_of_skulls = false @@ -4744,6 +4777,9 @@ newEffect{ end end self.name = self.old_los_name + self.replace_display = nil + self:removeAllMOs() + game.level.map:updateMap(self.x, self.y) end, } @@ -4821,3 +4857,35 @@ newEffect{ eff.turn_list = {} end, } + +newEffect{ + name = "BRITTLE_BONES", image = "talents/boneyard.png", + desc = _t"Brittle Bones", + long_desc = function(self, eff) return ("Physical resistance reduced by %d%% and talents cooldowns increased by %d%%."):tformat(eff.resist, eff.cooldown) end, + type = "magical", + subtype = { necrotic=true, resistance=true, cooldown=true }, + status = "detrimental", + parameters = {resist=10, cooldown=20}, + on_gain = function(self, err) return nil, true end, + on_lose = function(self, err) return nil, true end, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.PHYSICAL] = -eff.resist}) + self:effectTemporaryValue(eff, "talent_cd_reduction", {allpct = -eff.cooldown/100}) + end, +} + +newEffect{ + name = "BONEYARD", image = "talents/boneyard.png", + desc = _t"Boneyard", + long_desc = function(self, eff) return ("Spellpower and physical power increased by %d."):tformat(eff.power) end, + type = "magical", + subtype = { necrotic=true, power=true }, + status = "beneficial", + parameters = {power=10}, + on_gain = function(self, err) return nil, true end, + on_lose = function(self, err) return nil, true end, + activate = function(self, eff) + self:effectTemporaryValue(eff, "combat_spellpower", eff.power) + self:effectTemporaryValue(eff, "combat_dam", eff.power) + end, +} -- GitLab