Skip to content

Commit

Permalink
feat: initial support for guardian druids
Browse files Browse the repository at this point in the history
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
johnnylam88 committed Dec 29, 2024
1 parent e8d6e7c commit a931705
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 1 deletion.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ The following classes and specializations are supported:

- Death Knight: Blood, Blood (Kyrasis)
- Demon Hunter: Vengeance
- Druid: Guardian
- Monk: Brewmaster, Brewmaster (Equinox)
- Warrior: Protection

Expand Down
3 changes: 2 additions & 1 deletion nerien-hekili-packs.toc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## Interface: 110002
## Interface: 110007

## Title: Nerien's Hekili Packs
## Notes: Nerien's collection of Hekili action packs for various classes and specializations.
Expand All @@ -19,6 +19,7 @@ main.lua
the-war-within/deathknight_blood.lua
the-war-within/deathknight_blood_kyrasis.lua
the-war-within/demonhunter_vengeance.lua
the-war-within/druid_guardian.lua
the-war-within/monk_brewmaster.lua
the-war-within/monk_brewmaster_equinox.lua
the-war-within/warrior_protection.lua
135 changes: 135 additions & 0 deletions the-war-within/apl/druid_guardian.simc
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
9 changes: 9 additions & 0 deletions the-war-within/druid_guardian.lua
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

0 comments on commit a931705

Please sign in to comment.