-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: initial support for guardian druids
Add a priority list and action pack for Guardian Druids based on the Icy Veins guide by Pumps. Ripweaving is not currently supported. Also update TOC version for TWW 11.0.7.
- Loading branch information
1 parent
e8d6e7c
commit a931705
Showing
4 changed files
with
147 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
# Guardian Druid Action Priority List | ||
# Based on *Guardian Druid Tank Guide* by Pumps | ||
# [https://www.icy-veins.com/wow/guardian-druid-pve-tank-guide] | ||
# | ||
# Recommended Settings for `/hekili` > *Guardian*: | ||
# | ||
# - Weave Cat Form and Bear Form : **unused** | ||
# - Use Maul and Raze in Ironfur Build : **unused** | ||
# - Maul (or Raze) Rage Threshold : **unused** | ||
# - Nature's Vigil Damage Threshold : 70 | ||
# - Ironfur Damage Threshold : 5 | ||
# - Ironfur Maximum Stacks : 14 | ||
|
||
#actions.precombat+=/variable,name=opener,value=1,op=set | ||
actions.precombat+=/mark_of_the_wild | ||
actions.precombat+=/heart_of_the_wild | ||
actions.precombat+=/bear_form | ||
|
||
### Constants ### | ||
|
||
actions+=/variable,name=rage_cost_frenzied_regeneration,value=10 | ||
actions+=/variable,name=rage_cost_ironfur,value=40 | ||
actions+=/variable,name=rage_cost_maul,value=40 | ||
actions+=/variable,name=rage_cost_raze,value=40 | ||
|
||
actions+=/variable,name=rage_gain_mangle,value=(12+5*talent.soul_of_the_forest) | ||
actions+=/variable,name=rage_gain_thrash_bear,value=5 | ||
|
||
actions+=/variable,name=cooldown_mangle_duration,value=6*spell_haste | ||
actions+=/variable,name=cooldown_thrash_bear_duration,value=6*spell_haste | ||
|
||
### Tunables ### | ||
|
||
# Pool enough Rage to cast Ironfur, Maul, or Raze. | ||
actions+=/variable,name=rage_pool_value,value=((variable.rage_cost_ironfur<?variable.rage_cost_maul)<?variable.rage_cost_raze) | ||
# Barkskin tunable for incoming damage. | ||
actions+=/variable,name=barkskin_damage_taken,value=0.2*health.max | ||
# Frenzied Regeneration tunable for minimum health percent. | ||
actions+=/variable,name=frenzied_regeneration_health_pct,value=80 | ||
# Ironfur tunable for incoming damage per suggested application (see /hekili > Guardian). | ||
actions+=/variable,name=ironfur_damage_taken,value=ironfur_damage_threshold | ||
# Nature's Vigil tunable for minimum health percent (see /hekili > Guardian). | ||
actions+=/variable,name=natures_vigil_health_pct,value=vigil_damage | ||
# Renewal tunable for minimum health percent. | ||
actions+=/variable,name=renewal_health_pct,value=65 | ||
# Regrowth tunable for minimum health percent. | ||
actions+=/variable,name=regrowth_health_pct,value=85 | ||
# Survival Instincts tunable for incoming damage. | ||
actions+=/variable,name=survival_instincts_damage_taken,value=0.2*health.max | ||
|
||
################ | ||
|
||
# 4 Rage per auto-attack. | ||
actions+=/variable,name=rage_per_second_auto_attack,value=4%(2*attack_haste) | ||
# 3 Rage per incoming auto-attack, and incoming auto-attack every 2s with 1 mob. | ||
# Assume at 5+ mobs that we gain 3 Rage per second. | ||
actions+=/variable,name=rage_per_second_incoming_auto_attack,value=(3%2)+((3%2)%(5-1))*(active_enemies-1),op=setif,condition=active_enemies<5,value_else=3 | ||
# Blood Frenzy causes the Thrash DoT to generate 3 Rage per tick on up to 5 targets. | ||
actions+=/variable,name=rage_per_second_blood_frenzy,value=talent.blood_frenzy*(3%dot.thrash_bear.tick_time)*(active_dot.thrash_bear>?5) | ||
# Moon Guardian causes the free Moonfires from Galactic Guardian to generate 5 Rage. | ||
# Galactic Guardian causes damage to have a 5% chance to trigger a free Moonfire on that target. | ||
# This underestimates the Rage generated because we only factor in Thrash ticks. | ||
actions+=/variable,name=rage_per_second_moon_guardian,value=talent.moon_guardian*talent.galactic_guardian*5*0.05*(active_dot.thrash_bear%dot.thrash_bear.tick_time) | ||
# This underestimates the Rage from Mangle because we don't account for the Gore talent. | ||
actions+=/variable,name=rage_per_second_mangle,value=variable.rage_gain_mangle%variable.cooldown_mangle_duration | ||
actions+=/variable,name=rage_per_second_thrash_bear,value=variable.rage_gain_thrash_bear%variable.cooldown_thrash_bear_duration | ||
actions+=/variable,name=rage_per_second,value=(variable.rage_per_second_blood_frenzy+variable.rage_per_second_mangle+variable.rage_per_second_thrash_bear) | ||
actions+=/variable,name=rage_at_next_gcd,value=(rage+gcd*variable.rage_per_second) | ||
# should_spend_rage is 1 if Rage will exceed the pool value by the next GCD. | ||
actions+=/variable,name=should_spend_rage,value=1,op=setif,condition=variable.rage_at_next_gcd>variable.rage_pool_value | ||
|
||
actions+=/variable,name=rage_check,value=1,op=setif,condition=rage+variable.rage_per_second*gcd>rage.max,value_else=0 | ||
# Mangle with Gore generates 4 additional Rage. | ||
actions+=/variable,name=rage_check_mangle,value=1,op=setif,condition=cooldown.mangle.remains<gcd&rage+variable.rage_gain_mangle+4*buff.gore.up>rage.max,value_else=0 | ||
# Moonfire with Galactic Guardian generates 8 Rage. | ||
actions+=/variable,name=rage_check_moonfire,value=1,op=setif,condition=rage+8*buff.galactic_guardian.up>rage.max,value_else=0 | ||
actions+=/variable,name=rage_check_thrash_bear,value=1,op=setif,condition=cooldown.thrash_bear.remains<gcd&rage+variable.rage_gain_thrash_bear+4*buff.gore.up>rage.max,value_else=0 | ||
# should_dump_rage is 1 if an ability is coming off cooldown and will overcap on Rage. | ||
actions+=/variable,name=should_dump_rage,value=1,op=setif,condition=variable.rage_check>0|variable.rage_check_moonfire>0|variable.rage_check_mangle>0|variable.rage_check_thrash_bear>0,value_else=0 | ||
|
||
# Ironfur if not already up, we need more stacks of Ironfur and there is Rage available, or we will cap on Rage. | ||
actions+=/variable,name=ironfur_threshold,value=1+(incoming_physical_damage_5s%variable.ironfur_damage_taken) | ||
actions+=/variable,name=should_ironfur,value=1,op=setif,condition=buff.ironfur.down|(buff.ironfur.stack<variable.ironfur_threshold&variable.should_spend_rage>0)|variable.should_dump_rage>0,value_else=0 | ||
|
||
actions+=/variable,name=buff_berserk_up,value=1,op=setif,condition=buff.berserk_bear.up|buff.incarnation_guardian_of_ursoc.up,value_else=0 | ||
|
||
# Several of the offensive cooldowns give a defensive benefit. | ||
actions+=/variable,name=has_offensive_defensive_buff,value=1,op=setif,condition=buff.lunar_beam.up|buff.rage_of_the_sleeper.up|variable.buff_berserk_up>0,value_else=0 | ||
actions+=/variable,name=has_defensive_buff,value=1,op=setif,condition=buff.barkskin.up|buff.survival_instincts.up|variable.has_offensive_defensive_buff>0,value_else=0 | ||
|
||
################ | ||
|
||
actions+=/skull_bash | ||
actions+=/soothe | ||
actions+=/bear_form | ||
#actions+=/run_action_list,name=opener,if=time<5*gcd.max&variable.opener>0 | ||
actions+=/call_action_list,name=defensives,if=tanking&variable.has_defensive_buff=0 | ||
actions+=/call_action_list,name=heal | ||
actions+=/call_action_list,name=mitigation | ||
actions+=/run_action_list,name=bear,if=buff.bear_form.up | ||
|
||
actions.defensives+=/barkskin,use_off_gcd=1,if=incoming_damage_5s>=variable.barkskin_damage_taken | ||
actions.defensives+=/survival_instincts,use_off_gcd=1,if=incoming_damage_5s>=variable.survival_instincts_damage_taken | ||
|
||
actions.heal+=/natures_vigil,if=health.pct<variable.natures_vigil_health_pct | ||
actions.heal+=/regrowth,if=buff.dream_of_cenarius.up&health.pct<variable.regrowth_health_pct | ||
actions.heal+=/frenzied_regeneration,if=buff.frenzied_regeneration.down&health.pct<variable.frenzied_regeneration_health_pct | ||
actions.heal+=/renewal,if=health.pct<variable.renewal_health_pct | ||
|
||
actions.mitigation+=/ironfur,use_off_gcd=1,if=variable.should_ironfur>0 | ||
|
||
actions.racials+=/berserking | ||
|
||
actions.spend_rage+=/maul,if=variable.rage_at_next_gcd-variable.rage_cost_maul*(talent.berserk_unchecked_aggresssion*variable.buff_berserk_up*0.5)>=variable.rage_pool_value&active_enemies=1 | ||
actions.spend_rage+=/raze,if=variable.rage_at_next_gcd-variable.rage_cost_raze>=variable.rage_pool_value&active_enemies | ||
actions.spend_rage+=/ironfur,if=variable.rage_at_next_gcd-variable.rage_cost_ironfur*(talent.berserk_persistence*variable.buff_berserk_up*0.5)>=variable.rage_pool_value | ||
|
||
actions.bear+=/heart_of_the_wild | ||
actions.bear+=/moonfire,if=(!ticking|refreshable)&target.time_to_die>12 | ||
actions.bear+=/maul,if=buff.ravage.up&active_enemies>1 | ||
actions.bear+=/thrash_bear | ||
actions.bear+=/mangle | ||
actions.bear+=/convoke_the_spirits | ||
actions.bear+=/berserk_bear | ||
actions.bear+=/incarnation | ||
actions.bear+=/call_action_list,name=racials,if=variable.buff_berserk_up>0 | ||
actions.bear+=/potion,if=variable.buff_berserk_up>0 | ||
actions.bear+=/lunar_beam | ||
actions.bear+=/rage_of_the_sleeper | ||
actions.bear+=/maul,if=buff.tooth_and_claw.up&active_enemies=1 | ||
actions.bear+=/raze,if=buff.tooth_and_claw.up | ||
actions.bear+=/call_action_list,name=spend_rage,if=variable.should_ironfur=0&variable.should_spend_rage>0 | ||
actions.bear+=/moonfire,if=buff.galactic_guardian.up&(buff.galactic_guardian.remains<1+gcd|active_enemies<4) | ||
actions.bear+=/moonfire,cycle_targets=1,if=talent.lunar_insight|talent.twin_moonfire | ||
actions.bear+=/swipe_bear |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
local _, Private = ... | ||
|
||
if Private.hekili and Private.class == "DRUID" then | ||
local spec = Private.hekili:GetSpecialization(104) | ||
local name = string.format("%s_%s_guardian", Private.shortName, string.lower(Private.class)) | ||
local date = 20241229 | ||
|
||
spec:RegisterPack(name, date, [[Hekili:nVXAVTXXXFlfgwMKsIIKs0s21sg1jiU2iXWiuT5dbHhprUK8GoEh79q0kqG)27m7J72N3d6OI2cezE7SZ7DMzND3PdNE70jl8Zit)YObJUy4OrVP)WlhE55xoDs2JBjtNS1F(9(RG)rK)g8)sscirElsYdw4Tk3pzrGFec1JHX(lqSLgNNmhG8luiFv6(z)tY9bHb7N9vavPtNCxEqy2NIMENDk)AafBjZN(LHdUy6K1blwqyWssNpDYh5KC)SFezH9Z(hZZcIHF(1KG4KGSh3p7NdsZ2)5p4NsGHXH6zmPB9JUF)Spc)BsV9ZUdM0xZ3SnD)N)91zzBtF7zNTB3U(bZF80hibrP9NhV5SDX7otiWNsL)t3(a50mavNUcX0FS)Z7)8Vsay3qIwGeFcjlliAfOcwgNSF2SZwt1eZ2p7gjUQ3BXjE6(z)gX)bY(z)GF2(z)uCYM9Z8JaS8bIFI4dVfMxV8OCq261JoP)vkmLFXppKd9V6)NWhcaz9tjXrlZHP(bqHVW2CztRdYB406I)zfm7BxNqsxhBFsFXplpHG21)DWQay()O)glZ6YbuOlyc7qnwfOFX)BbBYb5Csg6Rqbz4fO6b9roD4Oth9g4tFkkilWhiDWMTXjG2kEjAn1mY(CpJTfEgHONbZwC7V9BO9XpfHyyFWdojEzqi43(clOYLtga7H5Nbt870v7fuKCGUBSjFqUCS5DWEDSP3Ehp28AHVhBc17(PbNBpWxW8Ns7Vnbv635ND81N9GFsG)DHKtWOJxhVLaXhp5b)WCY1dpjE71PeWlX2e34NCVx8sVS1eVDOIYkuRb7qw9GDhaM3s0AH85lar6haqa3LmqaWF)5I5zWZjGAXBECAM3Yes0Fgqw4LqwHYHpobHWmOjyiGPf5Z5IgnNnGRqRMqc4WinHAMYk)GiGgrRcftQZWrhpUxMFijkRpKSkuOFbfijnRBtqy26e)01EOENJ1XvXjZJbhU4DcgXBrUIY919GeEHHER9tZinalsuVguX9gUnpcrtPZa8TVcyB)msuC(Q1ILFzX7Nn3hJrYxpCcBPk8hXs1(1OE2cO1JYlc1Dhbu9nCuE37Tmg6q016ij0qfSGUj3NEpgUjJjA8qEbrWAcie4(zlOR3RGBVJJcpgKEz(3teAXb9h1dw6fMTU)g)VrP4pXxCGHClxDOtFG2SOhSzd5EiqTqGFMB(W6Qop2892opJZsxXcPveNQA5Ms49ZsZxTcCPrU2F72WG5CMUtkbaHNEGMDqKCOBfCk3OztHPpurqwKNncA3mD2HYMruYL69asmtfj7ZC1elfAezNFJzRQwaWWKjnF9yoLwLeVdX1FbKIHklokmAnjp5HGhqX6tqMaW)atfCWlws5yZlqGSMSSHg9r5)XJ9CHiGd1l1ppl(u)mmFBTrxijEPqEVOfE4S8yZsKn4LDg1J9fw8pwSIZviwPqlr2t4vXyDqii5dKeO0TrGgCxaAFgc2S476tr))innFdGDScQXhtha10RXFVd(oMVqNjyIqlewbJzrQ7C(lh194o0)8YoJpDy3U96G49bIh4pUjGKcFJxlsWYtq8fGu9AvGE3ygc9iHPKRpNfMnmoEbp23JyQbOAmQWXkKcscbfwfFllXbp6frxyZcqDig2jFldYXWF8twrYsBHk4oKxy1O8ix055WLhPhOhweN1xkfzFKb8Yc2qkvmAGCZ7hZ8v(LyKpllJxrIbkqyGSmib)6YKyyr7h9drSoxEEQ6JXm9bZFXg4cYicEJtFnTWCFy2VeayTF0C(azjbqu9e6yQSetlZC9ykygjVDDaG8CytcybobBaMsitm7KGvbB9DekZW8DJJcbZ(sGFzXlkT6OoTnwVnalw0UavZNYqI6YwX1sLdmU3G(dg7YcwHrVzQaMT8xO1NPPfweh9QmC7KZJZJe7FKo1pgJkDol3cLHC5OQ15ivU6llgXv5JnNIM1RAHSYQttABROZgZaIyvQu1XQ7JDcft(DpUepwxz8(zErKVL5TAEbZHF)y439CHFMReuytE4cpOoBGIjuNh03cYjeSu4nbBvdlU(BZj4AkQVYwA92usX6ea9Ripa(r)WpwvYxDcQTbtLG6Q8UKuEJMuvuNETBHA(Asr2gR0KQ4CP06H0g)gwtGCkgwbTIvCSeRSfuIWrP0kf8xWidwldpmA9SR6AmRCTWZUpd0(jKnWQG03b87rwKiPvMhFrV7YxUS)kGB7NVTkPRiYmx(Se8xsAVQvsih31AzUIZT6HuRG1Ba5ndPuTwwo4Ctu1sW3C9nFPYI8nBnxAIkB)7GTsG9Vd)UOyV4LlXFWyuEPGSvWXqLFZ93YsSwJPrN2nFvkvHEZGNEYYNlmZohN6s6Au5ICgOPVu3qjQHIIX8CHje)fpILRDclbyenk2g6AZuEBXWoUwmxQgdINLWv4SGG(p4hes1pS2hSRiWytvPITvwSFsHo94ofveVD9JPWgBfBPZBCAzYlB7yTIedClOAxSSA)OUJC46JEnp9uhLVrvtVZGrkeKJkgYi6(nd6kzl19QSyfDjoidbw(KusY9EGXSo5rakDjA(2NEIjrrZ9tIyDLqe5a7ywEsA88(c0Q6unb3XegVg9sO55GLyKO0aSKwXcnWpzvaVg3fKIHVdchUmOQYPG925vGpVIP6HSBTcziSf4eue3ukI01l8MaMgsiqYl6GfgbnnPHnOkoTL8NOTuLCN5EVvzUQuh2wZBzl5L8F695HHE3H14l)14y0kk9fPoo)IYVMKh5X(LhEulmLaVP4blVglh)DJXccWO3LlbyqCJIIewrhAIRcPlLIp)iqtT6ifvHQc46gGuSLf1d1gWiTYOQxRsmnNiWF8vvCnfy1K019lffuDYT6NaB6anMybBGtcGJI4CfH3UPm7H1Ey6GeMUrTKy10dizzd1Oajv6ehIFEZH2opRm0OR21zGnrlVk0SlG8uBW1TZjWA6GCCDXr2iHLMLzGD7h(HGuwhLg43kbRRNUwKnANdDPJmBSOS2U0ZeWKi5LHTvpJchWBKtHarcNh4hYwGtJ2H1hjnEzwQJXJWkpubZ6B54uTkseD3VxhrNBeHuJOvRakm)vRaNH0uGA9Cf(T3G(J7EJgzl3pZriZw2xRRh6G9PNJuBzFCsnM0oiSWe1wAZNNH2dsxLcXEirZjhQot2gtR4UYJEKdrXgqabPZFdB4c4T80tjKLyroiz6EeVnuyKFVSyVfbKBgoYetCpjE24hWQcH1YQAZBgAmpPQBTGt6gl1)mKU9H47jSC9BdscYsnGrUqiJbLQhYe5wZCWxuPyVnQOWaxBJfrGAXKkRUXyilf5uTDidt67bL27np0FNP94At7HyjL953q1LuFoCh266bvwbDL(Qo3n8rDCmKy)QdX2d90tQ6H3Drx3KB(JZdXeK0UDZceZx9YmvawdwTo7PN4FnBh2Lbrxd0rB6UGTeQB50j7aVq8YEmDYTyb2IBcdT5KVcb5v7NLq(p5aEGnNLgtpJI8S4nS(8IDuEfbBH7phebdn8Y3sV1aqH70XFLn28vSoqBDS(e6zlTaGPZWV1TweRiPAiwzmteV)ZwezOyhW7nRDs9y78M5TcqJbnbOPIpuRlRCGuwd1FL5PwjO1fNzmsjAVQg02SJfsqQoNFgdA4pN5g6sY)g7ko524QPYKhYPY6n1ivvGRd)KFAaJci)Sde5fc3Ob21zkN)HgVOmMlTMleBehtd5MX5AibCzwSYToprNcao4t2PjkRVxYxHzxY0oSgfKADxT6qEecPtuCw9OOKrh1EgT9hlufSSSMTHiRG5pVoT83vBbfmD1i5SAqIRStLfN0UeudDeNTQnoPhpRkyDTK)8QPR0woCqnjiSNah7tm)o3YAA8MaGJW2XNMVvs1r3anEIjzjbr3tVZaZ2p7tzSjLiF)xzN8n)2AuERFbZzy(c88vibytQXRBnENp)D6Ly9tzKnP)b2P71bZxldTF0JLuL3CCY3WRrvqwyjExW8(yhYhNO)DAhV5K5wgkaJ5FWBvE5NgjrzwVXlKiokZeGwESZr5Ba1m1)jmg7u6NO(A4hUQ8ApJvuJostNa(xRJte3i)PtOJGxv)I7qk8JVqFkaCt10pWUV9jbBrK18RD)HDDO)oVl0h4TG(GU)ZFpx(5d6Mp3UR9CJUZZn4cpdonZzwE9lQ80SPFze6QiaWOrbYEraWNldmn0o2nuvGYOOj0MBi4dMb(T(miyDgB)S3HhLEnDqSKQkquiawjIZolUF2rIlONjlyPdJLuxmyHYWnHD3NXkjFD9BSKxScjYyx0A1UztjLfz6ymllFNz2mUXBNojLinrb2X)vyo8NHdOF0dBnaG3IMH5uq0nT1tIlCqcEgEBMTdhPylwSPVpCmInDbX44wJXoWk9r7NDmnMqVIlYK7n3UFwxdEqQsuKlEDR5IX2rPuTGiEVS1491uzs66WlthxLkJK6QNjszR6wKEVP10dmCDKxjQ7YcluFV1X3qZ(0154j0mzD1s(FOpvaddBzdNr5gwA3wbFq)ruvD5TmwJvB8ddqM3SEmAuoS9XRUAGgh9D(WbK5ZAdZJSC7J)56Y7Rjip)p9azz122ROYx7dflFJ)1KPNLNMGSy4S2euuAFoGxpwtaA7JxqzjPzcCKRAFEKRm5Qw(qhuzlZAPq(Q9zwQnAXH8ijKz1AosCkB3(exxaow0a8mUxUdWMXMD)ukmJ(A9XtqzshP8cwkxiiVbzId3elgu3W)m(wl(EEOfvPkS90kCACO3JgqmLZeFo1CnIMw9yQDt7JmJjBBxdPFPl1W2HTxDzvkhcQnP9LfurdSfeKXxo7PPjRPbkeQ79uzr3p85)PIuLruwKPBcO9LwuvtKLRo2zJKPaXkKgBOCD6XAmdAQ3N5hMY)RFvk1)Emo0NKsvEjk2wQBs7RVtTOzPn)qTOfJ6C)fQM1AvdF)plLkvifBBBu7lB0IMq3b3uDyDpqvWHA7cCu7R(ZyJsocBqdE7esHnUkyuKEZnkxcjvsAFXFGKKqDkaMGFhkPbzCXq2ycPRyeLlCuShM43gFuu4J(vUqUobv(rII06K142YDeQUY4z6v2uOmhsfFh1uwN4Z2WmEAkYYDHXXTbPNKL7gM5KvwQC1fd0yshvqQwCMJxZcTkTcsEKKhufbYoM(UBWo0l9Ql0yy1StT)r8yxDkIivt9x6AOgv(AHKFLKSz5wavPGEyVNhxclhBTvCDuzyZ9AvcRAZjYYJ1PvEskHcBI7ufI75oQLt16QYeuPKsIb7N90tg96sr9xlCCV7QHsTizau7b0EgFAswcqxqTw6IDE7lmAOy3pvC65QffyRfpMv(()bpqjzfRXl5HQUCu9uDRivVtJgNgK8dmI541HVis5zgPESmgmiDXAXWwYRY8R7Q5AB6VYCQRYRXr1z1Pg0UxRg6bThMeJrB0JtQA21rjyQbwmF1qs0NU(34LdPPj1epRrh(R4ftjRsR6rb12ybhynIMpghtdB5JDssPA9bpPPtRs(AINkTWpb3x(ONKLteSlvaJ(kO0b5kzqCC82F5C9u2Lkc(JysDvQPUB)SRPcLGs63DA2T6GR6lF4piXVqpbAJWb984XzRNkOrZU8nPqXrnN3EHAJUKvqaT3wLc(5BimJ)VehTSyQ1DNeCZpqe2)gRxcuJc60j9GgOHjpQOpgspRbQt3WrLSqrXDz1EQ)fV4bkUrei3tqeVsOv(8JfFuPCofbDSmyIIRvGqzLGLxhHg4xQ6UxgywdoLLfsHP1aZ96I6cF2i3q(tVaPKXPn2EsXEsguKP4TvMDqt6gQCrzSKSqh(ACumFsf2CyU2QdJXPnvhULzC2nmW4OHSOcvlPHf1QrvG0qlQulhYSCOqAcL993DuzHuoFRh0IQgQ2RfmyGUY(D0n301(6EJd)XaiLebUFufmAx1RJaWK8tnbJhMjoyhbvLF(iY(DzLlu0dKw(manMIKLOYRT1dUBh0PvCjfyDpVn3Hv1MHzSwM2x(X0i43CT7(q1ILuUZI0AzMDXlAjFzUc1D8JwZrfRGTAiSC9E)Rr9lL0O46xLPurtLoBMVGznYz)UEu6VZhE6ePhqlFXKBZDTuTUdkUCjQbGw4KmL6RA2Ip94YQHCl2bQfAX()t)V)]]) | ||
end |