-- PaladinHoly.lua -- Alpha October 2020 local addon, ns = ... local Hekili = _G[ addon ] local class = Hekili.Class local state = Hekili.State local PTR = ns.PTR -- Conduits -- [-] punish_the_guilty -- [x] vengeful_shock -- Covenant -- [-] ringing_clarity -- [-] hallowed_discernment -- [-] righteous_might -- [x] the_long_summer -- Endurance -- [-] divine_call -- [-] golden_path -- [x] shielding_words -- Protection Endurance -- [x] resolute_defender -- [x] royal_decree -- Finesse -- [ ] echoing_blessings -- NYI: auras not identified -- [x] lights_barding -- [-] pure_concentration -- [x] wrench_evil if UnitClassBase( "player" ) == "PALADIN" then local spec = Hekili:NewSpecialization( 65 ) spec:RegisterResource( Enum.PowerType.HolyPower ) spec:RegisterResource( Enum.PowerType.Mana ) -- Talents spec:RegisterTalents( { crusaders_might = 196926, -- 196926 bestow_faith = 223306, -- 223306 lights_hammer = 114158, -- 114158 saved_by_the_light = 157047, -- 157047 judgment_of_light = 22189, -- 183778 holy_prism = 114165, -- 114165 fist_of_justice = 22179, -- 234299 repentance = 22180, -- 20066 blinding_light = 21811, -- 115750 unbreakable_spirit = 22433, -- 114154 cavalier = 22434, -- 230332 rule_of_law = 214202, -- 214202 divine_purpose = 17597, -- 223817 holy_avenger = 17599, -- 105809 seraphim = 17601, -- 152262 sanctified_wrath = 53376, -- 53376 avenging_crusader = 216231, -- 216231 awakening = 248033, -- 248033 sanctified_wrath = 53376, -- 53376 righteous_protector = 21202, -- 204074 final_stand = 22645, -- 204077 } ) -- PvP Talents spec:RegisterPvpTalents( { } ) -- Auras spec:RegisterAuras( { avenging_wrath = { id = 31884, duration = function () return ( talent.sanctified_wrath.enabled and 1.25 or 1 ) * ( azerite.lights_decree.enabled and 25 or 20 ) end, max_stack = 1, }, blessing_of_freedom = { id = 1044, duration = 8, type = "Magic", max_stack = 1, }, blessing_of_protection = { id = 1022, duration = 10, max_stack = 1, type = "Magic", }, blessing_of_sacrifice = { id = 6940, duration = 12, max_stack = 1, type = "Magic", }, blinding_light = { id = 105421, duration = 6, type = "Magic", max_stack = 1, }, concentration_aura = { id = 317920, duration = 3600, max_stack = 1, }, consecration = { id = 26573, duration = 12, max_stack = 1, generate = function( c, type ) local dropped, expires c.count = 0 c.expires = 0 c.applied = 0 c.caster = "unknown" for i = 1, 5 do local up, name, start, duration = GetTotemInfo( i ) if up and name == class.abilities.consecration.name then dropped = start expires = dropped + duration break end end if dropped and expires > query_time then c.expires = expires c.applied = dropped c.count = 1 c.caster = "player" end end }, crusader_aura = { id = 32223, duration = 3600, max_stack = 1, }, devotion_aura = { id = 465, duration = 3600, max_stack = 1, }, divine_protection = { id = 498, duration = 8, max_stack = 1, }, divine_purpose = { id = 223819, duration = 12, max_stack = 1, }, divine_shield = { id = 642, duration = 8, type = "Magic", max_stack = 1, }, divine_steed = { id = 221886, duration = function () return 3 * ( 1 + ( conduit.lights_barding.mod * 0.01 ) ) end, max_stack = 1, }, forbearance = { id = 25771, duration = 30, max_stack = 1, }, hammer_of_justice = { id = 853, duration = 6, type = "Magic", max_stack = 1, }, hand_of_reckoning = { id = 62124, duration = 3, max_stack = 1, }, holy_avenger = { id = 105809, duration = 20, max_stack = 1, }, judgment = { id = 214222, duration = 15, max_stack = 1, }, judgment_of_light = { id = 196941, duration = 30, max_stack = 25, }, repentance = { id = 20066, duration = 6, max_stack = 1, }, retribution_aura = { id = 183435, duration = 3600, max_stack = 1, }, seraphim = { id = 152262, duration = 16, max_stack = 1, }, shield_of_the_righteous = { id = 132403, duration = 4.5, max_stack = 1, }, turn_evil = { id = 10326, duration = 40, max_stack = 1 }, } ) -- Legendaries -- Vanguard's Momentum -- Badge of the Mad Paragon -- Final Verdict -- From Dusk till Dawn -- The Magistrate's Judgment -- Conduits -- Ringing Clarity -- Vengeful Shock -- Focused Light -- Light's Reach -- Templar's Vindication -- The Long Summer -- Truth's Wake -- Virtuous Command -- Righteous Might -- Hallowed Discernment -- Punish the Guilty -- Gear Sets spec:RegisterGear( "tier19", 138350, 138353, 138356, 138359, 138362, 138369 ) spec:RegisterGear( "tier20", 147160, 147162, 147158, 147157, 147159, 147161 ) spec:RegisterAura( "sacred_judgment", { id = 246973, duration = 8, max_stack = 1, } ) spec:RegisterGear( "tier21", 152151, 152153, 152149, 152148, 152150, 152152 ) spec:RegisterGear( "class", 139690, 139691, 139692, 139693, 139694, 139695, 139696, 139697 ) spec:RegisterGear( "breastplate_of_the_golden_valkyr", 137017 ) spec:RegisterGear( "heathcliffs_immortality", 137047 ) spec:RegisterGear( "justice_gaze", 137065 ) spec:RegisterGear( "saruans_resolve", 144275 ) spec:RegisterGear( "tyelca_ferren_marcuss_stature", 137070 ) spec:RegisterGear( "tyrs_hand_of_faith", 137059 ) spec:RegisterGear( "uthers_guard", 137105 ) spec:RegisterGear( "soul_of_the_highlord", 151644 ) spec:RegisterGear( "pillars_of_inmost_light", 151812 ) spec:RegisterStateExpr( "last_shield", function () return action.shield_of_the_righteous.lastCast end ) spec:RegisterHook( "reset_precast", function () last_consecration = nil last_blessed_hammer = nil last_shield = nil end ) spec:RegisterHook( "spend", function( amt, resource ) if amt > 0 and resource == "holy_power" then if talent.righteous_protector.enabled then reduceCooldown( "avenging_wrath", amt ) reduceCooldown( "guardian_of_ancient_kings", amt ) end if talent.fist_of_justice.enabled then reduceCooldown( "hammer_of_justice", 2 * amt ) end if legendary.uthers_devotion.enabled then setCooldown( "blessing_of_freedom", max( 0, cooldown.blessing_of_freedom.remains - 1 ) ) setCooldown( "blessing_of_protection", max( 0, cooldown.blessing_of_protection.remains - 1 ) ) setCooldown( "blessing_of_sacrifice", max( 0, cooldown.blessing_of_sacrifice.remains - 1 ) ) setCooldown( "blessing_of_spellwarding", max( 0, cooldown.blessing_of_spellwarding.remains - 1 ) ) end if legendary.relentless_inquisitor.enabled then addStack( "relentless_inquisitor", nil, amt ) end if legendary.of_dusk_and_dawn.enabled and holy_power.current == 0 then applyBuff( "blessing_of_dusk" ) end end end ) spec:RegisterHook( "gain", function( amt, resource, overcap ) if legendary.of_dusk_and_dawn.enabled and amt > 0 and resource == "holy_power" and holy_power.current == 5 then applyBuff( "blessing_of_dawn" ) end end ) -- Abilities spec:RegisterAbilities( { avenging_wrath = { id = 31884, cast = 0, cooldown = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * 120 end, gcd = "off", toggle = "cooldowns", startsCombat = false, texture = 135875, handler = function () applyBuff( "avenging_wrath" ) end, }, blessing_of_freedom = { id = 1044, cast = 0, cooldown = 25, gcd = "spell", spend = 0.07, spendType = "mana", startsCombat = false, texture = 135968, handler = function () applyBuff( "blessing_of_freedom" ) end, }, blessing_of_protection = { id = 1022, cast = 0, cooldown = 300, gcd = "spell", spend = 0.15, spendType = "mana", toggle = "defensives", defensives = true, startsCombat = false, texture = 135964, notalent = "blessing_of_spellwarding", nodebuff = "forbearance", handler = function () applyBuff( "blessing_of_protection" ) applyDebuff( "player", "forbearance" ) end, }, blessing_of_sacrifice = { id = 6940, cast = 0, cooldown = 120, gcd = "off", spend = 0.07, spendType = "mana", defensives = true, startsCombat = false, texture = 135966, handler = function () applyBuff( "blessing_of_sacrifice" ) end, }, blinding_light = { id = 115750, cast = 0, cooldown = 90, gcd = "spell", toggle = "interrupts", spend = 0.06, spendType = "mana", interrupt = true, startsCombat = true, texture = 571553, talent = "blinding_light", usable = function () return target.casting end, readyTime = function () return debuff.casting.up and ( debuff.casting.remains - 0.5 ) or 3600 end, handler = function () interrupt() applyDebuff( "target", "blinding_light" ) active_dot.blinding_light = max( active_enemies, active_dot.blinding_light ) end, }, cleanse = { id = 4987, cast = 0, charges = 1, cooldown = 8, recharge = 8, gcd = "spell", spend = 0.065, spendType = "mana", startsCombat = false, texture = 135949, usable = function () return buff.dispellable_poison.up or buff.dispellable_disease.up or buff.dispellable_magic.up, "requires poison or disease or magic" end, handler = function () removeBuff( "dispellable_poison" ) removeBuff( "dispellable_disease" ) removeBuff( "dispellable_magic" ) end, }, consecration = { id = 26573, cast = 0, cooldown = 20, gcd = "spell", startsCombat = true, texture = 135926, handler = function () applyBuff( "consecration" ) end, }, crusader_aura = { id = 32223, cast = 0, cooldown = 0, gcd = "spell", startsCombat = true, texture = 135890, handler = function () removeBuff( "concentration_aura" ) removeBuff( "devotion_aura" ) removeBuff( "retribution_aura" ) applyBuff( "crusader_aura" ) end, }, crusader_strike = { id = 35395, cast = 0, charges = 2, cooldown = function () return 6 * haste end, recharge = function () return 6 * haste end, gcd = "spell", spend = 0.09, spendType = "mana", startsCombat = true, texture = 135891, handler = function () gain( buff.holy_avenger.up and 3 or 1, "holy_power" ) if talent.crusaders_might.enabled then setCooldown( "holy_shock", max( 0, cooldown.holy_shock.remains - 1.5 ) ) end end, }, devotion_aura = { id = 465, cast = 0, cooldown = 0, gcd = "spell", startsCombat = true, texture = 135893, handler = function () removeBuff( "concentration_aura" ) removeBuff( "crusader_aura" ) removeBuff( "retribution_aura" ) applyBuff( "devotion_aura" ) end, }, divine_protection = { id = 498, cast = 0, cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 60 end, gcd = "off", spend = 0.035, spendType = "mana", toggle = "defensives", defensives = true, startsCombat = false, texture = 524353, handler = function () applyBuff( "divine_protection" ) end, }, divine_shield = { id = 642, cast = 0, cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 300 end, gcd = "spell", toggle = "defensives", defensives = true, startsCombat = false, texture = 524354, nodebuff = "forbearance", handler = function () applyBuff( "divine_shield" ) applyDebuff( "player", "forbearance" ) if talent.final_stand.enabled then applyDebuff( "target", "final_stand" ) active_dot.final_stand = min( active_dot.final_stand, active_enemies ) end end, }, divine_steed = { id = 190784, cast = 0, charges = function () return talent.cavalier.enabled and 2 or nil end, cooldown = 45, recharge = function () return talent.cavalier.enabled and 45 or nil end, gcd = "spell", startsCombat = false, texture = 1360759, handler = function () applyBuff( "divine_steed" ) end, }, flash_of_light = { id = 19750, cast = 1.5, cooldown = 0, gcd = "spell", spend = 0.22, spendType = "mana", startsCombat = false, texture = 135907, handler = function () gain( 1.67 * 1.68 * ( 1 + stat.versatility_atk_mod ) * stat.spell_power, "health" ) end, }, hammer_of_justice = { id = 853, cast = 0, cooldown = 60, gcd = "spell", spend = 0.04, spendType = "mana", startsCombat = true, texture = 135963, handler = function () applyDebuff( "target", "hammer_of_justice" ) end, }, hammer_of_wrath = { id = 24275, cast = 0, cooldown = 7.5, gcd = "spell", startsCombat = true, texture = 613533, usable = function () return target.health_pct < 20 or ( level > 57 and buff.avenging_wrath.up ) or buff.hammer_of_wrath_hallow.up or buff.negative_energy_token_proc.up, "requires low health, avenging_wrath, or ashen_hallow" end, handler = function () gain( buff.holy_avenger.up and 3 or 1, "holy_power" ) if legendary.the_mad_paragon.enabled then if buff.avenging_wrath.up then buff.avenging_wrath.expires = buff.avenging_wrath.expires + 1 end if buff.crusade.up then buff.crusade.expires = buff.crusade.expires + 1 end end end, }, hand_of_reckoning = { id = 62124, cast = 0, charges = 1, cooldown = 8, recharge = 8, gcd = "off", spend = 0.03, spendType = "mana", startsCombat = true, texture = 135984, handler = function () applyDebuff( "target", "hand_of_reckoning" ) end, }, holy_avenger = { id = 105809, cast = 0, cooldown = 180, gcd = "spell", toggle = "cooldowns", startsCombat = true, texture = 571555, talent = "holy_avenger", handler = function () applyBuff( "holy_avenger" ) end, }, holy_shock = { id = 20473, cast = 0, charges = 1, hasteCD = true, cooldown = 7.5, recharge = 7.5, gcd = "spell", spend = 0.16, spendType = "mana", startsCombat = false, texture = 135972, handler = function () gain( buff.holy_avenger.up and 3 or 1, "holy_power" ) end, }, holy_prism = { id = 114165, cast = 0, cooldown = 20, gcd = "spell", spend = 0.13, spendType = "mana", startsCombat = false, texture = 613408, }, judgment = { id = 275773, cast = 0, charges = 1, cooldown = 6, recharge = 6, hasteCD = true, gcd = "spell", spend = 0.03, spendType = "mana", startsCombat = true, texture = 135959, handler = function () applyDebuff( "target", "judgment" ) gain( buff.holy_avenger.up and 3 or 1, "holy_power" ) if talent.judgment_of_light.enabled then applyDebuff( "target", "judgment_of_light", nil, 25 ) end end, }, lay_on_hands = { id = 633, cast = 0, cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 600 end, gcd = "spell", toggle = "defensives", defensives = true, startsCombat = false, texture = 135928, nodebuff = "forbearance", handler = function () gain( health.max, "health" ) applyDebuff( "player", "forbearance" ) if azerite.empyreal_ward.enabled then applyBuff( "empyrael_ward" ) end end, }, repentance = { id = 20066, cast = 1.7, cooldown = 15, gcd = "spell", interrupt = true, spend = 0.06, spendType = "mana", startsCombat = false, texture = 135942, handler = function () applyDebuff( "target", "repentance" ) end, }, retribution_aura = { id = 183435, cast = 0, cooldown = 0, gcd = "spell", startsCombat = false, texture = 135889, handler = function () removeBuff( "concentration_aura" ) removeBuff( "crusader_aura" ) removeBuff( "devotion_aura" ) applyBuff( "retribution_aura" ) end, }, seraphim = { id = 152262, cast = 0, cooldown = 45, gcd = "spell", spend = function () if buff.divine_purpose.up then return 0 end return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end, spendType = "holy_power", startsCombat = false, texture = 1030103, talent = "seraphim", handler = function () removeBuff( "divine_purpose" ) removeBuff( "the_magistrates_judgment" ) local used = min( 2, cooldown.shield_of_the_righteous.charges ) applyBuff( "seraphim", used * 8 ) end, }, shield_of_the_righteous = { id = 53600, cast = 0, cooldown = 1, gcd = "spell", spend = function () return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end, spendType = "holy_power", startsCombat = true, texture = 236265, handler = function () applyBuff( "shield_of_the_righteous" ) end, }, turn_evil = { id = 10326, cast = function () return 1.5 * ( 1 + ( conduit.wrench_evil.mod * 0.01 ) ) end, cooldown = 15, gcd = "spell", spend = 0.1, spendType = "mana", startsCombat = true, texture = 571559, handler = function () applyDebuff( "turn_evil" ) end, }, word_of_glory = { id = 85673, cast = 0, cooldown = 0, gcd = "spell", spend = function () if buff.divine_purpose.up or buff.shining_light.stack == 5 or buff.royal_decree.up then return 0 end return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end, spendType = "holy_power", startsCombat = false, texture = 133192, handler = function () if buff.royal_decree.up then removeBuff( "royal_decree" ) elseif buff.divine_purpose.up then removeBuff( "divine_purpose" ) else removeBuff( "shining_light_full" ) end removeBuff( "the_magistrates_judgment" ) gain( 2.9 * stat.spell_power * ( 1 + stat.versatility_atk_mod ), "health" ) if buff.vanquishers_hammer.up then applyBuff( "shield_of_the_righteous" ) removeBuff( "vanquishers_hammer" ) end if conduit.shielding_words.enabled then applyBuff( "shielding_words" ) end end, auras = { -- Conduit shielding_words = { id = 338788, duration = 10, max_stack = 1 } } }, -- Paladin - Kyrian - 304971 - divine_toll (Divine Toll) divine_toll = { id = 304971, cast = 0, cooldown = 60, gcd = "spell", startsCombat = true, texture = 3565448, toggle = "essences", handler = function () if state.spec.protection then -- Cast Avenger's Shield x5. -- This is lazy and may be wrong/bad. for i = 1, active_enemies do class.abilities.avengers_shield.handler() end elseif state.spec.retribution then -- Cast Judgment x5. for i = 1, active_enemies do class.abilities.judgment.handler() end elseif state.spec.holy then -- Cast Holy Shock x5. for i = 1, active_enemies do class.abilities.holy_shock.handler() end end end }, -- Paladin - Necrolord - 328204 - vanquishers_hammer (Vanquisher's Hammer) vanquishers_hammer = { id = 328204, cast = 0, cooldown = 30, gcd = "spell", spend = function () if buff.divine_purpose.up then return 0 end return 1 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end, spendType = "holy_power", startsCombat = true, texture = 3578228, toggle = "essences", handler = function () removeBuff( "divine_purpose" ) removeBuff( "the_magistrates_judgment" ) applyBuff( "vanquishers_hammer" ) end, auras = { vanquishers_hammer = { id = 328204, duration = 15, max_stack = 1 } } }, -- Paladin - Night Fae - 328620 - blessing_of_summer (Blessing of Summer) blessing_of_summer = { id = 328620, cast = 0, cooldown = 45, gcd = "spell", spend = 0.05, spendType = "mana", startsCombat = false, texture = 3636845, toggle = "essences", buff = "blessing_of_summer_active", handler = function () applyBuff( "blessing_of_summer" ) -- We'll just apply to self because we don't care. removeBuff( "blessing_of_summer_active" ) applyBuff( "blessing_of_autumn_active" ) setCooldown( "blessing_of_autumn", 45 ) end, auras = { blessing_of_summer = { id = 328620, duration = function () return 30 * ( 1 - ( conduit.the_long_summer.mod * 0.01 ) ) end, max_stack = 1, }, blessing_of_summer_active = { duration = 3600, max_stack = 1, generate = function( t ) if IsActiveSpell( 328620 ) then t.name = class.auras.blessing_of_summer.name .. " Active" t.count = 1 t.applied = now t.expires = now + 3600 t.caster = "player" return end t.count = 0 t.applied = 0 t.expires = 0 t.caster = "nobody" end, }, } }, blessing_of_autumn = { id = 328622, cast = 0, cooldown = 45, gcd = "spell", spend = 0.05, spendType = "mana", startsCombat = false, texture = 3636843, toggle = "essences", buff = "blessing_of_autumn_active", handler = function () applyBuff( "blessing_of_autumn" ) removeBuff( "blessing_of_autumn_active" ) applyBuff( "blessing_of_winter_active" ) setCooldown( "blessing_of_winter", 45 ) end, auras = { blessing_of_autumn = { id = 328622, duration = 30, max_stack = 1, }, blessing_of_autumn_active = { duration = 3600, max_stack = 1, generate = function( t ) if IsActiveSpell( 328622 ) then t.name = class.auras.blessing_of_autumn.name .. " Active" t.count = 1 t.applied = now t.expires = now + 3600 t.caster = "player" return end t.count = 0 t.applied = 0 t.expires = 0 t.caster = "nobody" end, } } }, blessing_of_winter = { id = 328281, cast = 0, cooldown = 45, gcd = "spell", spend = 0.05, spendType = "mana", startsCombat = false, texture = 3636846, toggle = "essences", buff = "blessing_of_winter_active", handler = function () applyBuff( "blessing_of_winter" ) removeBuff( "blessing_of_winter_active" ) applyBuff( "blessing_of_spring_active" ) setCooldown( "blessing_of_spring", 45 ) end, auras = { blessing_of_winter = { id = 328281, duration = 30, max_stack = 1, }, blessing_of_winter_debuff = { id = 328506, duration = 6, max_stack = 10 }, blessing_of_winter_active = { duration = 3600, max_stack = 1, generate = function( t ) if IsActiveSpell( 328281 ) then t.name = class.auras.blessing_of_winter.name .. " Active" t.count = 1 t.applied = now t.expires = now + 3600 t.caster = "player" return end t.count = 0 t.applied = 0 t.expires = 0 t.caster = "nobody" end, } } }, blessing_of_spring = { id = 328282, cast = 0, cooldown = 45, gcd = "spell", spend = 0.05, spendType = "mana", startsCombat = false, texture = 3636844, toggle = "essences", buff = "blessing_of_spring_active", handler = function () applyBuff( "blessing_of_spring" ) removeBuff( "blessing_of_spring_active" ) applyBuff( "blessing_of_summer_active" ) setCooldown( "blessing_of_summer", 45 ) end, auras = { blessing_of_spring = { id = 328281, duration = 30, max_stack = 1, friendly = true, }, blessing_of_spring_active = { duration = 3600, max_stack = 1, generate = function( t ) if IsActiveSpell( 328282 ) then t.name = class.auras.blessing_of_winter.name .. " Active" t.count = 1 t.applied = now t.expires = now + 3600 t.caster = "player" return end t.count = 0 t.applied = 0 t.expires = 0 t.caster = "nobody" end, } } }, -- Paladin - Venthyr - 316958 - ashen_hallow (Ashen Hallow) ashen_hallow = { id = 316958, cast = function () return 1.5 * haste end, cooldown = 120, gcd = "spell", startsCombat = false, texture = 3565722, toggle = "essences", auras = { hammer_of_wrath_hallow = { duration = 30, max_stack = 1, generate = function( t ) if IsUsableSpell( 24275 ) and not ( target.health_pct < 20 or ( level > 57 and ( buff.avenging_wrath.up or buff.crusade.up ) ) and not buff.final_verdict.up ) then t.name = class.abilities.hammer_of_wrath.name .. " " .. class.abilities.ashen_hallow.name t.count = 1 t.applied = action.ashen_hallow.lastCast t.expires = action.ashen_hallow.lastCast + 30 t.caster = "player" return end t.count = 0 t.applied = 0 t.expires = 0 t.caster = "nobody" end, }, } }, } ) spec:RegisterOptions( { enabled = true, aoe = 2, nameplates = true, nameplateRange = 8, damage = true, damageExpiration = 8, potion = "potion_of_unbridled_fury", package = "Holy Paladin", } ) spec:RegisterPack( "Holy Paladin", 20201027, [[d4ZdnaGAKkwpcLnjkAxqzBaj2hc42iA2umFG41Ic)ciPVHankse7eO2RQDRy)e(jcrnmrPXrQkDEKQgkPQYGjA4c1HasDksuDmsLJJqOwis5AKiTyOA5GEicrEQupMspxWLrnvr1Kfz6sEePQ4VaEgsLCDszDieYNfYMjPTtQYHPAwie00qOAEKOmssvvFNegnswgc6KiK4wie40kDpKk1kri15qiPFd5R75VtEXhmHzjmRUSesqmDeuPknlO8UOpMFh72m8i(94K8B9hzOxi1p34PDEh70BqE65VdinOLFtvvCGicub1OTO0WXSisqnSKAgVw0yHUAbQHL0cQVX1wtruMJ)o5fFWeMLWS6YsibF7Affc(UxsI0BQnL454VtCW(wFes9hzOxi1p34PDeeT(iKezBHWzOqsibjcfscZsywbrliA9rijsu(eXH3MnuHN)2IqMesXeE(bR75V5XXnC60EBHBXW1FJRPQI56Xt0orakGErHPf)2T1IM3QlKXniu61bt4ZFZJJB40P9ECs(TtSaLd9aGkAkaKkqmsbdF72ArZBNybkh6bav0uaivGyKcg(2c3IHR)2IqMesXGfyOhtTKyqM03jiKkJUfsDzfsqaribTqwUHNclWqpMAjX4XXnC61btxp)npoUHtN27Xj53EGspF4aa0jgccyrq382T1IM3EGspF4aa0jgccyrq382c3IHR)wjczIX1uvXGoXqqalc6gGeJRPQIfk3MHqsaHKGczMcjUMQkMRhpr7ebOa6ffMwSqQCHeeqeYeJRPQIbDIHGawe0najgxtvfluUndHKUfYSVoyI)83UTw08oWqpMAjFZJJB40P96Gv6ZF72ArZBpqXdaLBmifV5XXnC60EDWGYZFZJJB40P92c3IHR)gxtvflWqpMAjX0IfsqariTiKjHumybg6XuljgKj9DccPYescfsqaribTqwUHNclWqpMAjX4XXnC6TBRfnVD94jANiafqVOEDWe85V5XXnC60EBHBXW1FJRPQI56Xt0orakGErHPf)2T1IM3XOArZRdwFF(B3wlAEJB4qyNiaKkqqJKKHV5XXnC60EDWe1N)2T1IM34goe2jcaPc4ALg58Mhh3WPt71bRl7ZF72ArZBCdhc7ebGubuStXW3844goDAVoyD6E(B3wlAEJB4qyNiaKkqigUt0BECCdNoTxhSocF(B3wlAERNpeXABGIHbakNKKHV5XXnC60EDW6ORN)Mhh3WPt7TfUfdx)nfYqpqmsbdXsS6A3sijGqM9TBRfnVtRE7WafYyEDW6i(ZFZJJB40P92c3IHR)2IqMesXG56XteddabQLnjmit67eE72ArZBsejpfasfiYGG0)6G1P0N)Mhh3WPt7TfUfdx)nUMQkwGHEm1sIPflKGaIqcAHSCdpfwGHEm1sIXJJB40B3wlAERfyGTyYWRdwhO883844goDAVhNKFhbrtuaigUKUba6r8B3wlAEhbrtuaigUKUba6r8BlClgU(BLiKkriTiKjHumy0rlfrYtHPQzmaq2s5WigOwswijGqsCHeeqesLiKGwil3WtHzHAbpXWaaD0srK8uy844gojKzkKXqwpGiBcthgD0srK8ucPYfsLlKzkKweYKqkgmxpEIyyaiqTSjHbzsFNGqsaHK4czMcjUMQkwGHEm1sIbzsFNGqsaHK4cPYfsqarivIqIRPQIfyOhtTKyqM03jiKktijUqQ8xhSoc(83844goDAVhNKFtYqoJIYdaQ(e92T1IM3KmKZOO8aGQprVTWTy46VbTqIRPQI56Xt0orakGErHPflKzkKkriX1uvXcm0JPwsmTyHeeqesqlKLB4PWcm0JPwsmECCdNesL)6G1PVp)npoUHtN27Xj53qNyjTjJaa(gba5eaUwvO5TBRfnVHoXsAtgba8ncaYjaCTQqZRxVtSQRzQNFW6E(BECCdNoT3UTw0826gdGBRfnaMnuVnBOagNKFBritcPycVoycF(BECCdNoT3w4wmC93uid9aXifmelXQRDlHKUfYSVDBTO5DGAztcaPcuumaCJOkgPfEDW01ZFZJJB40P92c3IHR)MczOhigPGHyjwDTBjKeqiZ(2T1IM3uojjdbqQakGEr96Gj(ZFZJJB40P92c3IHR)gxtvflWqpMAjX0IfYmfsCnvvSad9yQLedYK(obHuzcjD92T1IM3MnIQca0rlfrYt96Gv6ZFZJJB40P92c3IHR)2IqMesXGrhTuejpfgKj9DccPYeYiBsiZuiTiKjHumyuid9abkKndmit67eesLjKr2KqMPqsHm0deJuWqSeRU2TesciKzfYmfslczsifdaKDB92T1IM30rlfrYt96GbLNFW6E(R3844goDAVDBTO5nfYqpqGczZ4TfUfdx)nfYqpqmsbdXsS6A3sijGqM91btWNFW6E(R3844goDAVDBTO5TfQf8edbcfCZGFBHBXW1FReH0IqMesXGzHAbpXqGqb3mymit67eesLjKr2KqMPqAritcPyWOqg6bcuiBgyqM03jiKebcPomLkKeqiJSjHmtH0IqMesXaaz3wcPYfsqaribTqwUHNcZc1cEIHbaYnIQW4XXnC61bRVp)G198xVDBTO5nfYqpqmCdKV5XXnC60EDWe1N)Mhh3WPt7TfUfdx)nOfslAcSf61IgmT43UTw082IMaBHETO51bRl7ZFZJJB40P92c3IHR)g0cz5gEkSad9yQLeJhh3WjHeeqesCnvvSad9yQLetl(TBRfnVnBevfaOJwkIKN61bRt3ZFZJJB40P92c3IHR)(TBRfnVdulBsaivGIIbGBevXiTWRdwhHp)TBRfnVTOjWwOxlAEZJJB40P9617yiBrK4E98dw3ZF72ArZBZgrvba6OLIi5PEZJJB40P961R36XWWIMdMWSeMvxwcj4BfoC2jk8MOqgJGfNesIlKUTw0iKMnubmbr)ogIuxd)(nUh4erEER)id9cP(5gpTZ7qmBpyqrPVE9d]] ) end