text:
<?xml version="1.0" encoding="utf-8"?>
<Abilities>
  <Ability Id="189718" Status="Changed">
    <Fqn NodeId="16140967935222461717">abl.agent.kolto_probe</Fqn>
    <Name Id="814832605462528">Kolto Probe</Name>
    <Description Id="814832605462529" OldValue="Summons a droid that heals a friendly target for <<1[%d/%d/%d]>> over <<2[%d/%d/%d]>> seconds. Stacks up to 2 times.">Summons a droid that heals a friendly target for <<1[%d/%d/%d]>> over <<2[%d/%d/%d]>> seconds.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.0185">0.023</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.0185">0.023</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.37">0.47</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier OldValue="6">5</ablDescriptionTokenMultiplier>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="530978" Status="Changed">
    <Fqn NodeId="16141167895569678310">abl.agent.skill.medic.surgical_precision</Fqn>
    <Name Id="2280533144895488">Surgical Precision</Name>
    <Description Id="2280533144895489" OldValue="Increases the healing dealt by Surgical Probe by 5% and increases the max stack limit of Tactical Advantage by 1. In addition, Surgical Probe immediately re-grants Tactical Advantage once every 10 seconds.">Increases the healing dealt by Surgical Probe and Kolto Injection by 5% and increases the max stack limit of Tactical Advantage by 1. In addition, Surgical Probe immediately re-grants Tactical Advantage once every 10 seconds.</Description>
  </Ability>
  <Ability Id="789784" Status="Changed">
    <Fqn NodeId="16141054721972980023">abl.bounty_hunter.kolto_shot</Fqn>
    <Name Id="3392096450904064">Kolto Shot</Name>
    <Description Id="3392096450904065">Heals a friendly target for <<1>>.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0">0.0425</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0">0.0025</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="1">0.45</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="231439" Status="Changed">
    <Fqn NodeId="16141003354024328215">abl.bounty_hunter.skill.arsenal.tracer_lock</Fqn>
    <Name Id="994022936018944">Tracer Lock</Name>
    <Description Id="994022936018945" OldValue="Tracer Missile grants Tracer Lock, increasing the damage dealt by the next Rail Shot by 6% or reducing the activation time of the next Healing Scan by 20%. Stacks up to 5 times.">Tracer Missile grants Tracer Lock, increasing the damage dealt by the next Rail Shot by 6% or reducing the activation time of the next Rapid Scan by 20%. Stacks up to 5 times.</Description>
  </Ability>
  <Ability Id="801667" Status="Changed">
    <Fqn NodeId="16141158554336791000">abl.itm.setbonus.endgame.theal1.heavy.03_02</Fqn>
    <Name Id="3443133547282432"></Name>
    <Description Id="3443133547282433" OldValue="While in Combat Support Cylinder or Combat Support Cell the duration of Supercharged Gas and Supercharge Cells is increased by 5 seconds.">While in Combat Support Cylinder or Combat Support Cell the duration of Supercharged Gas and Supercharge Cells is increased by 3 seconds.</Description>
  </Ability>
  <Ability Id="817998" Status="Changed">
    <Fqn NodeId="16141097842199652946">abl.itm.vanity_pet.astromech.astromech_pirate_a01_v01</Fqn>
    <Name Id="3513274658193408">D4-V3 Pirate Astromech Droid</Name>
    <Description Id="3513274658193409" OldValue="Summons a small astromech droid which will follow and passively observe you on your adventures. ">Summons a small pirate astromech droid which will follow and passively observe you on your adventures. </Description>
  </Ability>
  <Ability Id="189224" Status="Changed">
    <Fqn NodeId="16140972679316748888">abl.jedi_consular.benevolence</Fqn>
    <Name Id="812710891618304">Benevolence</Name>
    <Description Id="812710891618305">Heals a friendly target for <<1>> health.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.108">0.134</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.068">0.094</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="1.75">2.28</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="50">65</ForceCost>
  </Ability>
  <Ability Id="223737" Status="Changed">
    <Fqn NodeId="16140924432183218666">abl.jedi_consular.noble_sacrifice</Fqn>
    <Name Id="960943097905152">Noble Sacrifice</Name>
    <Description Id="960943097905153" OldValue="Sacrifices 15% of your maximum health to restore 8% of your maximum Force. Each time this ability is used, your Force regeneration rate is reduced by 25% for the next <<1>> seconds. Stacks up to 4 times.">Restores 15 Force and deals <<1>> elemental damage to an enemy target or heals a friendly target for <<2>> health.</Description>
    <Tokens>
      <Token Id="1">
        <ablParsedDescriptionToken OldValue="10">0</ablParsedDescriptionToken>
      </Token>
    </Tokens>
    <CastingTime Status="New">1.5</CastingTime>
    <TargetRule OldValue="Self">Any</TargetRule>
    <CooldownTime Status="Removed">1.5</CooldownTime>
    <SharedCooldown Status="Removed">16140924432183218666</SharedCooldown>
  </Ability>
  <Ability Id="189247" Status="Changed">
    <Fqn NodeId="16141059242457548004">abl.jedi_consular.rejuvenate</Fqn>
    <Name Id="812809675866112">Rejuvenate</Name>
    <Description Id="812809675866113">Immediately heals a target for a <<1>>, plus an additional <<2>> over <<3>> seconds.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.06">0.07</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.02">0.03</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.8">0.99</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
      <Token Id="2">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.013">0.016</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.013">0.016</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.27">0.32</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="30">45</ForceCost>
  </Ability>
  <Ability Id="189280" Status="Changed">
    <Fqn NodeId="16140973052868464274">abl.jedi_consular.skill.seer.deliverance</Fqn>
    <Name Id="812951409786880">Deliverance</Name>
    <Description Id="812951409786881">Heals a friendly target for <<1>> health.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.1345">0.161</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.0945">0.121</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="2.29">2.82</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="30">45</ForceCost>
  </Ability>
  <Ability Id="189283" Status="Changed">
    <Fqn NodeId="16141138988703553639">abl.jedi_consular.skill.seer.healing_trance</Fqn>
    <Name Id="812964294688768">Healing Trance</Name>
    <Description Id="812964294688769">Heals a friendly target for <<1>> health and consumes 40 Force over the channel duration.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.046">0.044</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.046">0.044</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.92">0.88</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="189288" Status="Changed">
    <Fqn NodeId="16141124664572085544">abl.jedi_consular.skill.seer.resplendence</Fqn>
    <Name Id="812985769525248">Resplendence</Name>
    <Description Id="812985769525249" OldValue="Healing Trance critical hits grant 1 charge of Resplendence, which improves the effectiveness of your next Noble Sacrifice or Salvation.
Noble Sacrifice: Activates without degenerating your Force or causing a global cooldown and consumes 1 charge.
Salvation: Consumes 5 less Force per charge and reduces activation time by 0.25 seconds for each of the first two charges, or makes it activate instantly with the third charge. Consumes all charges.">Healing Trance critical hits grant 1 charge of Resplendence, which improves the effectiveness of your next Noble Sacrifice or Salvation.
Noble Sacrifice: Restores an additional 5 Force and consumes 1 charge.
Salvation: Consumes 5 less Force per charge and reduces activation time by 0.25 seconds for each of the first two charges, or makes it activate instantly with the third charge. Consumes all charges.</Description>
  </Ability>
  <Ability Id="189289" Status="Changed">
    <Fqn NodeId="16140940771676259787">abl.jedi_consular.skill.seer.salvation</Fqn>
    <Name Id="812990064492544">Salvation</Name>
    <Description Id="812990064492545">Applies a periodic healing effect to up to 8 allies within 8 meters of the targeted area, which heals for <<1>> over <<2>> seconds. Once a target has received the periodic healing effect, the target may leave the area and will continue to be healed by the effect.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.01">0.0105</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.01">0.0105</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.2">0.21</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="60">75</ForceCost>
  </Ability>
  <Ability Id="779351" Status="Changed">
    <Fqn NodeId="16141082962393902841">abl.jedi_consular.skill.seer.wandering_mend</Fqn>
    <Name Id="3347287057104896">Wandering Mend</Name>
    <Description Id="3347287057104897">Places a mending Force on a friendly target that heals them for <<1>> health the next time they take damage. After healing the target, Wandering Mend travels to another friendly target within 20 meters. Wandering Mend lasts up to <<2>> seconds on each target and travels up to 3 times, healing up to 4 targets. Wandering Mend can only be placed on one target at a time.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.125">0.14</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.085">0.1</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="2.1">2.4</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="50">60</ForceCost>
  </Ability>
  <Ability Id="805790" Status="Changed">
    <Fqn NodeId="16140916556896222352">abl.jedi_knight.skill.watchman.cauterize</Fqn>
    <Name Id="3460841697443840">Cauterize</Name>
    <Description Id="3460841697443841">Strikes the target for <<1>> weapon damage and deals an additional <<2>> elemental damage over <<3[%d seconds/%d second/%d seconds]>>. Requires two lightsabers.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_WeaponDamage">
            <effParam_StandardHealthPercentMax OldValue="0.075">0.077</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.075">0.077</effParam_StandardHealthPercentMin>
            <effParam_AmountModifierPercent OldValue="-0.5">-0.49</effParam_AmountModifierPercent>
            <effParam_Coefficient OldValue="0.75">0.77</effParam_Coefficient>
          </Action>
          <Action Name="effAction_WeaponDamage">
            <effParam_IgnoreDualWieldModifier OldValue="True">False</effParam_IgnoreDualWieldModifier>
            <effParam_StandardHealthPercentMax OldValue="0.075">0</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.075">0</effParam_StandardHealthPercentMin>
            <effParam_AmountModifierPercent OldValue="-0.5">-0.49</effParam_AmountModifierPercent>
            <effParam_Coefficient OldValue="0.75">0</effParam_Coefficient>
          </Action>
        </ablCoefficients>
      </Token>
      <Token Id="2">
        <ablCoefficients>
          <Action Name="effAction_SpellDamage">
            <effParam_StandardHealthPercentMax OldValue="0.034">0.054</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.034">0.054</effParam_StandardHealthPercentMin>
            <effParam_Coefficient OldValue="0.34">0.54</effParam_Coefficient>
          </Action>
        </ablCoefficients>
      </Token>
      <Token Id="3">
        <ablParsedDescriptionToken OldValue="9">6</ablParsedDescriptionToken>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="793770" Status="Changed">
    <Fqn NodeId="16140933611231527384">abl.jedi_knight.skill.watchman.force_melt</Fqn>
    <Name Id="3409216190545920">Force Melt</Name>
    <Description Id="3409216190545921">Calls on the power of the Force to melt the target, causing it to burn for <<1>> elemental damage over <<2[%d seconds/%d second/%d seconds]>>.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_SpellDamage">
            <effParam_StandardHealthPercentMax OldValue="0.047">0.045</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.047">0.045</effParam_StandardHealthPercentMin>
            <effParam_Coefficient OldValue="0.47">0.45</effParam_Coefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <AmmoHeatCost OldValue="3">2</AmmoHeatCost>
  </Ability>
  <Ability Id="188177" Status="Changed">
    <Fqn NodeId="16141106401919918224">abl.sith_inquisitor.consumption</Fqn>
    <Name Id="808214060859392">Consumption</Name>
    <Description Id="808214060859393" OldValue="Consumes 15% of your maximum health to restore 8% of your maximum Force. Each time this ability is used, your Force regeneration rate is reduced by 25% for the next <<1>> seconds. Stacks up to 4 times.">Restores 15 Force and deals <<1>> elemental damage to an enemy target or heals a friendly target for <<2>> health.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients Status="New">
          <Action Name="effAction_SpellDamage">
            <effParam_DamageType>3</effParam_DamageType>
            <effParam_Slot>1</effParam_Slot>
            <effParam_SpellType>3</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.027</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.027</effParam_StandardHealthPercentMin>
            <effParam_AmountModifierPercent>0</effParam_AmountModifierPercent>
            <effParam_Coefficient>0.027</effParam_Coefficient>
            <effParam_HealthStealPercentage>0</effParam_HealthStealPercentage>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenType OldValue="ablDescriptionTokenTypeDuration">ablDescriptionTokenTypeDamage</ablDescriptionTokenType>
        <ablParsedDescriptionToken Status="Removed">10</ablParsedDescriptionToken>
      </Token>
      <Token Id="2">
        <ablCoefficients Status="New">
          <Action Name="effAction_Heal">
            <effParam_SpellType>1</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.024</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.004</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>0.29</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenType OldValue="ablDescriptionTokenTypeDuration">ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect OldValue="2">1</ablDescriptionTokenEffect>
      </Token>
    </Tokens>
    <CastingTime Status="New">1.5</CastingTime>
    <TargetRule OldValue="Self">Any</TargetRule>
    <CooldownTime Status="Removed">1.5</CooldownTime>
    <SharedCooldown Status="Removed">16141106401919918224</SharedCooldown>
  </Ability>
  <Ability Id="188178" Status="Changed">
    <Fqn NodeId="16141177761697288857">abl.sith_inquisitor.dark_heal</Fqn>
    <Name Id="808218355826688">Dark Heal</Name>
    <Description Id="808218355826689">Heals a friendly target for <<1>> health.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.108">0.134</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.068">0.094</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="1.75">2.28</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="50">65</ForceCost>
  </Ability>
  <Ability Id="794456" Status="Changed">
    <Fqn NodeId="16140915821216130380">abl.sith_inquisitor.resurgence</Fqn>
    <Name Id="3412162538110976">Resurgence</Name>
    <Description Id="3412162538110977">Immediately heals the target for <<1>>, plus an additional <<2>> over <<3>> seconds.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.06">0.07</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.02">0.03</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.8">0.99</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
      <Token Id="2">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.013">0.016</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.013">0.016</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.27">0.32</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="30">45</ForceCost>
  </Ability>
  <Ability Id="794193" Status="Changed">
    <Fqn NodeId="16141017099704152675">abl.sith_inquisitor.skill.corruption.dark_infusion</Fqn>
    <Name Id="3411032961712128">Dark Infusion</Name>
    <Description Id="3411032961712129">Heals a friendly target for <<1>> health.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.1345">0.161</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.0945">0.121</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="2.29">2.82</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="30">45</ForceCost>
  </Ability>
  <Ability Id="188285" Status="Changed">
    <Fqn NodeId="16141061930666388872">abl.sith_inquisitor.skill.corruption.force_surge</Fqn>
    <Name Id="808677917327360">Force Surge</Name>
    <Description Id="808677917327361" OldValue="Innervate critical heals grant 1 charge of Force Surge, which improves the effectiveness of your next Consumption or Revivification.
Consumption: Activates without degenerating your Force or causing a global cooldown and consumes 1 charge.
Revivification: Consumes 5 less Force per charge and reduces activation time by 0.25 seconds for each of the first two charges, or makes it activate instantly with the third charge. Consumes all charges.">Innervate critical heals grant 1 charge of Force Surge, which improves the effectiveness of your next Consumption or Revivification.
Consumption: Restores an additional 5 Force and consumes 1 charge.
Revivification: Consumes 5 less Force per charge and reduces activation time by 0.25 seconds for each of the first two charges, or makes it activate instantly with the third charge. Consumes all charges.</Description>
  </Ability>
  <Ability Id="257137" Status="Changed">
    <Fqn NodeId="16141143145991194120">abl.sith_inquisitor.skill.corruption.innervate</Fqn>
    <Name Id="1104395005591552">Innervate</Name>
    <Description Id="1104395005591553">Heals a friendly target for <<1>> health and consumes 40 Force over the channel duration.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.046">0.044</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.046">0.044</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.92">0.88</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="188291" Status="Changed">
    <Fqn NodeId="16141012138626181515">abl.sith_inquisitor.skill.corruption.revivification</Fqn>
    <Name Id="808703687131136">Revivification</Name>
    <Description Id="808703687131137">Applies a periodic healing effect to up to 8 allies within 8 meters of the targeted area, which heals for <<1>> over <<2>> seconds. Once a target has received the periodic healing effect, the target may leave the area and will continue to be healed by the effect.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.01">0.0105</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.01">0.0105</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.2">0.21</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="60">75</ForceCost>
  </Ability>
  <Ability Id="791923" Status="Changed">
    <Fqn NodeId="16141141796785834825">abl.sith_inquisitor.skill.corruption.roaming_mend</Fqn>
    <Name Id="3401283385950208">Roaming Mend</Name>
    <Description Id="3401283385950209">Places a mending Force on a friendly target that heals them for <<1>> health the next time they take damage. After healing the target, Roaming Mend travels to another friendly target within 20 meters. Roaming Mend lasts up to <<2>> seconds on each target and travels up to 3 times, healing up to 4 targets. Roaming Mend can only be placed on one target at a time.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.125">0.14</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.085">0.1</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="2.1">2.4</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <ForceCost OldValue="50">60</ForceCost>
  </Ability>
  <Ability Id="782687" Status="Changed">
    <Fqn NodeId="16141113152532997283">abl.sith_warrior.skill.annihilation.force_gash</Fqn>
    <Name Id="3361615068004352">Force Rend</Name>
    <Description Id="3361615068004353">Summons dark Force power to rend the target, causing it to bleed for <<1>> internal damage over <<2[%d seconds/%d second/%d seconds]>>.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_SpellDamage">
            <effParam_StandardHealthPercentMax OldValue="0.047">0.045</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.047">0.045</effParam_StandardHealthPercentMin>
            <effParam_Coefficient OldValue="0.47">0.45</effParam_Coefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <AmmoHeatCost OldValue="3">2</AmmoHeatCost>
  </Ability>
  <Ability Id="804556" Status="Changed">
    <Fqn NodeId="16141103997558890260">abl.sith_warrior.skill.annihilation.rupture</Fqn>
    <Name Id="3455541707800576">Rupture</Name>
    <Description Id="3455541707800577">Stabs the target for <<1>> weapon damage and deals an additional <<2>> internal damage over <<3[%d seconds/%d second/%d seconds]>>. Requires two lightsabers.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_WeaponDamage">
            <effParam_StandardHealthPercentMax OldValue="0.075">0.077</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.075">0.077</effParam_StandardHealthPercentMin>
            <effParam_AmountModifierPercent OldValue="-0.5">-0.49</effParam_AmountModifierPercent>
            <effParam_Coefficient OldValue="0.75">0.77</effParam_Coefficient>
          </Action>
          <Action Name="effAction_WeaponDamage">
            <effParam_IgnoreDualWieldModifier OldValue="True">False</effParam_IgnoreDualWieldModifier>
            <effParam_StandardHealthPercentMax OldValue="0.075">0</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.075">0</effParam_StandardHealthPercentMin>
            <effParam_AmountModifierPercent OldValue="-0.5">-0.49</effParam_AmountModifierPercent>
            <effParam_Coefficient OldValue="0.75">0</effParam_Coefficient>
          </Action>
        </ablCoefficients>
      </Token>
      <Token Id="2">
        <ablCoefficients>
          <Action Name="effAction_SpellDamage">
            <effParam_StandardHealthPercentMax OldValue="0.034">0.054</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.034">0.054</effParam_StandardHealthPercentMin>
            <effParam_Coefficient OldValue="0.34">0.54</effParam_Coefficient>
          </Action>
        </ablCoefficients>
      </Token>
      <Token Id="3">
        <ablParsedDescriptionToken OldValue="9">6</ablParsedDescriptionToken>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="531253" Status="Changed">
    <Fqn NodeId="16140926552195505492">abl.smuggler.skill.sawbones.emergent_emergencies</Fqn>
    <Name Id="2281714260901888">Emergent Emergencies</Name>
    <Description Id="2281714260901889" OldValue="Increases the healing dealt by Emergency Medpac by 5% and increases the max stack limit of Upper Hand by 1. In addition, Emergency Medpac immediately regrants Upper Hand once every 10 seconds.">Increases the healing dealt by Emergency Medpac and Underworld Medicine by 5% and increases the max stack limit of Upper Hand by 1. In addition, Emergency Medpac immediately regrants Upper Hand once every 10 seconds.</Description>
  </Ability>
  <Ability Id="793118" Status="Changed">
    <Fqn NodeId="16141171674478100600">abl.smuggler.slow_release_medpac</Fqn>
    <Name Id="3406415871868928">Slow-release Medpac</Name>
    <Description Id="3406415871868929" OldValue="Injects the target with slow-release medicine that heals for <<1[%d/%d/%d]>> over <<2[%d/%d/%d]>> seconds. Stacks up to 2 times.">Injects the target with slow-release medicine that heals for <<1[%d/%d/%d]>> over <<2[%d/%d/%d]>> seconds.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0.0185">0.023</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0.0185">0.023</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="0.37">0.47</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
    <TargetArc Status="New">360</TargetArc>
  </Ability>
  <Ability Id="793548" Status="Changed">
    <Fqn NodeId="16141067618737264747">abl.trooper.med_shot</Fqn>
    <Name Id="3408262707806208">Med Shot</Name>
    <Description Id="3408262707806209">Fires a quick stream of bolts, causing <<1>> healing.</Description>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_StandardHealthPercentMax OldValue="0">0.0425</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin OldValue="0">0.0025</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient OldValue="1">0.45</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
      </Token>
    </Tokens>
  </Ability>
  <Ability Id="232416" Status="Changed">
    <Fqn NodeId="16140952257753990220">abl.trooper.skill.gunnery.charged_barrel</Fqn>
    <Name Id="998219119067136">Charged Barrel</Name>
    <Description Id="998219119067137" OldValue="Grav Round grants Charged Barrel, increasing the damage dealt by the next High Impact Bolt by 6% and reducing the activation time of the next Advanced Medical Probe by 20%. Stacks up to 5 times.">Grav Round grants Charged Barrel, increasing the damage dealt by the next High Impact Bolt by 6% and reducing the activation time of the next Medical Probe by 20%. Stacks up to 5 times.</Description>
  </Ability>
  <Ability Id="790247" Status="New">
    <Fqn NodeId="16141155277639998280">abl.bounty_hunter.rapid_scan</Fqn>
    <Name Id="3394085020762112">Rapid Scan</Name>
    <Description Id="3394085020762113">Heals a friendly target for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.104</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.064</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>1.63</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>diagnosticscan</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>1.5</CastingTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="329878" Status="New">
    <Fqn NodeId="16141139537866833779">abl.bounty_hunter.skill.bodyguard.healing_scan</Fqn>
    <Name Id="1416815221669888">Healing Scan</Name>
    <Description Id="1416815221669889">Heals a friendly target for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.186</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.146</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>2.99</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>healingscan</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>2</CastingTime>
    <CooldownTime>10.5</CooldownTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <SharedCooldown>16141139537866833779</SharedCooldown>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="838836" Status="New">
    <Fqn NodeId="16140945120212199385">abl.placeables.stronghold.technological.bounty_terminal</Fqn>
    <Name Id="3602773186707456">Acquiring Bounties</Name>
    <Description Id="3602773186707457"></Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <CastingTime>30</CastingTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>true</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <TargetRule>Self</TargetRule>
  </Ability>
  <Ability Id="838930" Status="New">
    <Fqn NodeId="16140955167985332146">abl.test.jjary.consumption</Fqn>
    <Name Id="3603176913633280">Consumption</Name>
    <Description Id="3603176913633281">Consumes 15% of your maximum health to restore 8% of your maximum Force. Each time this ability is used, your Force regeneration rate is reduced by 25% for the next <<1>> seconds. Stacks up to 4 times.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablParsedDescriptionToken>10</ablParsedDescriptionToken>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeDuration</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>2</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>consumption</Icon>
    <CooldownTime>1.5</CooldownTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <SharedCooldown>16140955167985332146</SharedCooldown>
    <TargetArc>360</TargetArc>
    <TargetRule>Self</TargetRule>
  </Ability>
  <Ability Id="232110" Status="New">
    <Fqn NodeId="16141002760491448206">abl.trooper.medical_probe</Fqn>
    <Name Id="996904859074560">Medical Probe</Name>
    <Description Id="996904859074561">Summons a probe that heals for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.104</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.064</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>1.63</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>resuscitationprobe</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>1.5</CastingTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="350637" Status="New">
    <Fqn NodeId="16141175570821009605">abl.trooper.skill.combat_medic.advanced_medical_probe</Fqn>
    <Name Id="1505974447767552">Advanced Medical Probe</Name>
    <Description Id="1505974447767553">Summons a probe that heals for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.186</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.146</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>2.99</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>advancedmedicalprobe</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>2</CastingTime>
    <CooldownTime>13.5</CooldownTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <SharedCooldown>16141175570821009605</SharedCooldown>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="229244" Status="Removed">
    <Fqn NodeId="16140968531121379995">abl.bounty_hunter.healing_scan</Fqn>
    <Name Id="984595482804224">Healing Scan</Name>
    <Description Id="984595482804225">Heals a friendly target for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.165</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.125</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>2.898</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>healingscan</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>2</CastingTime>
    <CooldownTime>13.5</CooldownTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <SharedCooldown>16140968531121379995</SharedCooldown>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="791948" Status="Removed">
    <Fqn NodeId="16141108756614757758">abl.bounty_hunter.skill.bodyguard.rapid_scan</Fqn>
    <Name Id="3401390760132608">Rapid Scan</Name>
    <Description Id="3401390760132609">Heals a friendly target for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.114</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.074</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>1.873</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>diagnosticscan</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>1.5</CastingTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="232173" Status="Removed">
    <Fqn NodeId="16141069425170611977">abl.trooper.advanced_medical_probe</Fqn>
    <Name Id="997175442014208">Advanced Medical Probe</Name>
    <Description Id="997175442014209">Summons a probe that heals for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.165</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.125</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>2.898</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>advancedmedicalprobe</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>2</CastingTime>
    <CooldownTime>13.5</CooldownTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <SharedCooldown>16141069425170611977</SharedCooldown>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
  <Ability Id="790102" Status="Removed">
    <Fqn NodeId="16141103729474213456">abl.trooper.skill.combat_medic.medical_probe</Fqn>
    <Name Id="3393462250504192">Medical Probe</Name>
    <Description Id="3393462250504193">Summons a probe that heals for <<1>>.</Description>
    <IsPassive>false</IsPassive>
    <IsHidden>false</IsHidden>
    <Tokens>
      <Token Id="1">
        <ablCoefficients>
          <Action Name="effAction_Heal">
            <effParam_SpellType>2</effParam_SpellType>
            <effParam_AmountMax>0</effParam_AmountMax>
            <effParam_AmountMin>0</effParam_AmountMin>
            <effParam_AmountPercent>0</effParam_AmountPercent>
            <effParam_ThreatPercent>0</effParam_ThreatPercent>
            <effParam_StandardHealthPercentMax>0.114</effParam_StandardHealthPercentMax>
            <effParam_StandardHealthPercentMin>0.074</effParam_StandardHealthPercentMin>
            <effParam_HealingPowerCoefficient>1.873</effParam_HealingPowerCoefficient>
          </Action>
        </ablCoefficients>
        <ablDescriptionTokenMultiplier>1</ablDescriptionTokenMultiplier>
        <ablDescriptionTokenType>ablDescriptionTokenTypeHealing</ablDescriptionTokenType>
        <ablDescriptionTokenEffect>1</ablDescriptionTokenEffect>
        <ablDescriptionTokenSubEffect>-1</ablDescriptionTokenSubEffect>
      </Token>
    </Tokens>
    <Icon>resuscitationprobe</Icon>
    <MaxRange>30</MaxRange>
    <EnergyCost>20</EnergyCost>
    <CastingTime>1.5</CastingTime>
    <GCD>-1</GCD>
    <OverridesGCD>false</OverridesGCD>
    <UsesPushback>true</UsesPushback>
    <IgnoresAlacrity>false</IgnoresAlacrity>
    <LoSCheck>true</LoSCheck>
    <TargetArc>360</TargetArc>
    <TargetRule>Friendly</TargetRule>
  </Ability>
</Abilities>


text:
importScripts('bower_components/platinum-sw/service-worker.js');
importScripts('bower_components/firebase/firebase.js');

redpajama_set_name: RedPajamaGithub


text:
package com.openbravo.pos.scale;

public interface Scale {

    public Double readWeight() throws ScaleException;
}


text:
@charset "utf-8";
/*
 * artDialog skin
 * http://code.google.com/p/artdialog/
 * (c) 2009-2011 TangBin, http://www.planeArt.cn
 *
 * This is licensed under the GNU LGPL, version 2.1 or later.
 * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
 */

/* common start */
body { _margin:0; _height:100%; /*IE6 BUG*/ }
.aui_outer { text-align:left; }
table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
.aui_title { overflow:hidden; text-overflow: ellipsis; }
.aui_state_noTitle .aui_title { display:none; }
.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
.aui_close:hover { text-decoration:none; }
.aui_main { text-align:center; min-width:9em; min-width:0 \9/*IE8 BUG*/; }
.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
.aui_icon { vertical-align: middle; }
.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
.aui_buttons button:hover { color:#000; border-color:#666; }
.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
button.aui_state_highlight { color: #FFF; border: solid 1px #3399dd; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
button.aui_state_highlight:hover { color:#FFF; border-color:#1c6a9e; }
button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
/* common end */

.aui_inner { background:#f7f7f7; }
.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
.aui_title { height:29px; line-height:29px; padding:0 25px 0 0; _padding:0; text-indent:5px; color:#FFF; font-weight:700; text-shadow:-1px -1px 0 rgba(33, 79, 183, .7); }
.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(blue/bg.png); background-repeat:no-repeat; }
.aui_nw { width:15px; height:38px; background-position: 0 0; _png:blue/ie6/nw.png; }
.aui_ne { width:15px; height:38px; background-position: -15px 0; _png:blue/ie6/ne.png; }
.aui_sw { width:15px; height:18px; background-position: 0 -38px; _png:blue/ie6/sw.png; }
.aui_se { width:15px; height:18px; background-position: -15px -38px; _png:blue/ie6/se.png; }
.aui_close { top:4px; right:4px; _z-index:1; width:20px; height:20px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -112px; _png:blue/ie6/close.png; }
.aui_close:hover { background-position:0 -132px; }
.aui_n, .aui_s { background-repeat:repeat-x; }
.aui_n { background-position: 0 -56px; _png:blue/ie6/n.png; }
.aui_s { background-position: 0 -94px; _png:blue/ie6/s.png; }
.aui_w, .aui_e { background-image:url(blue/bg2.png); background-repeat:repeat-y; }
.aui_w { background-position:left top; _png:blue/ie6/w.png; }
.aui_e { background-position: right bottom; _png:blue/ie6/e.png; }
aui_icon, .aui_main { padding-top:3px; }
@media screen and (min-width:0) {
	.aui_outer { border-radius:8px; box-shadow:0 5px 15px rgba(2, 37, 69, .4); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
	.aui_state_drag .aui_outer { box-shadow:none; }
	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
	.aui_outer:active { box-shadow:0 0 5px rgba(2, 37, 69, .1)!important; }
	.aui_state_drag .aui_outer { box-shadow:none!important; }
	.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(blue/bg_css3.png); }
	.aui_nw { width:5px; height:31px; }
	.aui_ne { width:5px; height:31px; background-position: -5px 0; _png:blue/ie6/ne.png; }
	.aui_sw { width:5px; height:5px;background-position: 0 -31px; }
	.aui_se { width:5px; height:5px; background-position: -5px -31px; }
	.aui_close { background-position:0 -72px; }
	.aui_close:hover { background-position:0 -92px; }
	.aui_n { background-position: 0 -36px; }
	.aui_s { background-position: 0 -67px; }
	.aui_w, .aui_e { background-image:url(blue/bg_css3_2.png); }
}
.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
.aui_state_noTitle .aui_outer { box-shadow:none; }
.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }


text:
package org.springframework.security.samples.contacts.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.samples.contacts.entity.Contact;
import org.springframework.security.samples.contacts.service.ContactManager;
import org.springframework.security.samples.contacts.web.model.WebContact;
import org.springframework.security.samples.contacts.web.validator.WebContactValidator;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/**
 *
 * @author Luke Taylor
 * @since 3.0
 */
@Controller
public class AddDeleteContactController {
    @Autowired
    private ContactManager contactManager;
    private final Validator validator = new WebContactValidator();

    /**
     * Displays the "add contact" form.
     */
    @RequestMapping(value="/secure/add.htm", method=RequestMethod.GET)
    public ModelAndView addContactDisplay() {
        return new ModelAndView("add", "webContact", new WebContact());
    }

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        System.out.println("A binder for object: " + binder.getObjectName());
    }

    /**
     * Handles the submission of the contact form, creating a new instance if
     * the username and email are valid.
     */
    @RequestMapping(value="/secure/add.htm", method=RequestMethod.POST)
    public String addContact(WebContact form, BindingResult result) {
        validator.validate(form, result);

        if (result.hasErrors()) {
            return "add";
        }

        Contact contact = new Contact();
        contact.setName(form.getName());
        contact.setEmail(form.getEmail());
        contactManager.create(contact);

        return "redirect:/secure/index.htm";
    }

    @RequestMapping(value="/secure/del.htm", method=RequestMethod.GET)
    public ModelAndView handleRequest(@RequestParam("contactId") int contactId) {
        Contact contact = contactManager.getById(Long.valueOf(contactId));
        contactManager.delete(contact);

        return new ModelAndView("deleted", "contact", contact);
    }
}


text:
package com.uber.rib.root.logged_out;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Pair;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.jakewharton.rxbinding2.view.RxView;
import com.uber.rib.core.Initializer;
import com.uber.rib.tutorial4.R;
import io.reactivex.Observable;
import io.reactivex.functions.Function;

/** Top level view for {@link LoggedOutBuilder.LoggedOutScope}. */
public class LoggedOutView extends LinearLayout implements LoggedOutInteractor.LoggedOutPresenter {

  private Button loginButton;
  private EditText playerOneEditText;
  private EditText playerTwoEditText;

  public LoggedOutView(Context context) {
    this(context, null);
  }

  public LoggedOutView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public LoggedOutView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Initializer
  @Override
  protected void onFinishInflate() {
    super.onFinishInflate();
    playerOneEditText = (EditText) findViewById(R.id.player_one_name);
    playerTwoEditText = (EditText) findViewById(R.id.player_two_name);
    loginButton = (Button) findViewById(R.id.login_button);
  }

  @Override
  public Observable<Pair<String, String>> playerNames() {
    return RxView.clicks(findViewById(R.id.login_button))
        .map(
            new Function<Object, Pair<String, String>>() {
              @Override
              public Pair<String, String> apply(Object irrelevant) throws Exception {
                return new Pair<>(
                    playerOneEditText.getText().toString(), playerTwoEditText.getText().toString());
              }
            });
  }
}


text:
#pragma once
#include <aws/cloudsearch/CloudSearch_EXPORTS.h>
#include <aws/cloudsearch/model/ScalingParametersStatus.h>
#include <aws/cloudsearch/model/ResponseMetadata.h>
#include <utility>

namespace Aws
{
template<typename RESULT_TYPE>
class AmazonWebServiceResult;

namespace Utils
{
namespace Xml
{
  class XmlDocument;
} // namespace Xml
} // namespace Utils
namespace CloudSearch
{
namespace Model
{
  /**
   *
The result of a DescribeScalingParameters request. Contains the
   * scaling parameters configured for the domain specified in the
   * request.

See Also:
   AWS
   * API Reference

   */
  class AWS_CLOUDSEARCH_API DescribeScalingParametersResult
  {
  public:
    DescribeScalingParametersResult();
    DescribeScalingParametersResult(const AmazonWebServiceResult<Aws::Utils::Xml::XmlDocument>& result);
    DescribeScalingParametersResult& operator=(const AmazonWebServiceResult<Aws::Utils::Xml::XmlDocument>& result);

    inline const ScalingParametersStatus& GetScalingParameters() const{ return m_scalingParameters; }

    inline void SetScalingParameters(const ScalingParametersStatus& value) { m_scalingParameters = value; }

    inline void SetScalingParameters(ScalingParametersStatus&& value) { m_scalingParameters = std::move(value); }

    inline DescribeScalingParametersResult& WithScalingParameters(const ScalingParametersStatus& value) { SetScalingParameters(value); return *this;}

    inline DescribeScalingParametersResult& WithScalingParameters(ScalingParametersStatus&& value) { SetScalingParameters(std::move(value)); return *this;}

    inline const ResponseMetadata& GetResponseMetadata() const{ return m_responseMetadata; }

    inline void SetResponseMetadata(const ResponseMetadata& value) { m_responseMetadata = value; }

    inline void SetResponseMetadata(ResponseMetadata&& value) { m_responseMetadata = std::move(value); }

    inline DescribeScalingParametersResult& WithResponseMetadata(const ResponseMetadata& value) { SetResponseMetadata(value); return *this;}

    inline DescribeScalingParametersResult& WithResponseMetadata(ResponseMetadata&& value) { SetResponseMetadata(std::move(value)); return *this;}

  private:
    ScalingParametersStatus m_scalingParameters;
    ResponseMetadata m_responseMetadata;
  };

} // namespace Model
} // namespace CloudSearch
} // namespace Aws


text:
package com.planet_ink.coffee_mud.Items.MiscMagic;
import com.planet_ink.coffee_mud.Items.Basic.StdItem;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;

import java.util.*;

public class TrainingSession extends StdItem implements MiscMagic
{
    public String ID(){ return "TrainingSession";}
    public TrainingSession()
    {
        super();
        setName("a training session");
        setDisplayText("A shiny gold coin has been left here.");
        myContainer=null;
        setDescription("A shiny gold coin with magical script around the edges.");
        myUses=Integer.MAX_VALUE;
        myWornCode=0;
        material=0;
        baseEnvStats.setWeight(0);
        recoverEnvStats();
    }

    public void executeMsg(Environmental myHost, CMMsg msg)
    {
        if(msg.amITarget(this))
        {
            MOB mob=msg.source();
            switch(msg.targetMinor())
            {
            case CMMsg.TYP_GET:
            case CMMsg.TYP_REMOVE:
            {
                setContainer(null);
                unWear();
                if(!mob.isMine(this))
                    mob.setTrains(mob.getTrains()+1);
                if(!CMath.bset(msg.targetCode(),CMMsg.MASK_OPTIMIZE))
                    mob.location().recoverRoomStats();
                destroy();
                return;
            }
            default:
                break;
            }
        }
        super.executeMsg(myHost,msg);
    }
}


text:
<resources>
    <string name="app_name">Client</string>
    <string name="title_activity_chat">Chat (Client side)</string>
    <string name="action_settings">Settings</string>
    <string name="enterUsername">Enter username to sign in</string>
    <string name="enterText">Type message…</string>
    <string name="signIn">Sign In</string>
    <string name="send">Send</string>
</resources>


text: Municipios


text:
class AddPostcodeLocationColumnsToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :postcode_lat, :decimal, :precision => 15, :scale => 10
    add_column :users, :postcode_lng, :decimal, :precision => 15, :scale => 10
  end

  def self.down
    remove_column :users, :postcode_lat
    remove_column :users, :postcode_lng
  end
end


text:
<?xml version="1.0" encoding="UTF-8"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<flashbuilder-config>
    <!-- Specifies the express install swf that will be used in the HTML file generated. -->
    <!-- The implied path is {flex-home}/templates/swfobject. -->
   <express-install-swf>expressInstall.swf</express-install-swf>
</flashbuilder-config>


text:
'use strict';

describe('Service: suggest', function () {

  // load the service's module
  beforeEach(module('edumaterialApp'));

  // instantiate service
  var suggest;
  beforeEach(inject(function (_suggest_) {
    suggest = _suggest_;
  }));

  it('should do something', function () {
    expect(!!suggest).toBe(true);
  });

});


text:
package org.apache.druid.curator;

import org.apache.druid.guice.JsonConfigTesterBase;
import org.junit.Assert;
import org.junit.Test;

import java.util.List;
import java.util.Properties;

public class ExhibitorConfigTest extends JsonConfigTesterBase<ExhibitorConfig>
{
  @Test
  public void testSerde()
  {
    propertyValues.put(getPropertyKey("hosts"), "[\"hostA\",\"hostB\"]");
    propertyValues.put(getPropertyKey("port"), "80");
    propertyValues.put(getPropertyKey("restUriPath"), "/list");
    propertyValues.put(getPropertyKey("useSsl"), "true");
    propertyValues.put(getPropertyKey("pollingMs"), "1000");
    testProperties.putAll(propertyValues);
    configProvider.inject(testProperties, configurator);
    ExhibitorConfig config = configProvider.get().get();

    List<String> hosts = config.getHosts();
    Assert.assertEquals(2, hosts.size());
    Assert.assertTrue(hosts.contains("hostA"));
    Assert.assertTrue(hosts.contains("hostB"));
    Assert.assertEquals(80, config.getRestPort());
    Assert.assertEquals("/list", config.getRestUriPath());
    Assert.assertTrue(config.getUseSsl());
    Assert.assertEquals(1000, config.getPollingMs());
  }

  @Test
  public void defaultValues()
  {
    configProvider.inject(new Properties(), configurator);
    ExhibitorConfig config = configProvider.get().get();

    List<String> hosts = config.getHosts();
    Assert.assertTrue(hosts.isEmpty());
    Assert.assertEquals(8080, config.getRestPort());
    Assert.assertEquals("/exhibitor/v1/cluster/list", config.getRestUriPath());
    Assert.assertFalse(config.getUseSsl());
    Assert.assertEquals(10000, config.getPollingMs());
  }
}


text:
package com.intellij.xml.breadcrumbs;

import com.intellij.ide.ui.UISettingsListener;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.fileTypes.FileTypeEvent;
import com.intellij.openapi.fileTypes.FileTypeListener;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupActivity;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileListener;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.VirtualFilePropertyEvent;
import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiManager;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;

public class BreadcrumbsInitializingActivity implements StartupActivity, DumbAware {
  @Override
  public void runActivity(@NotNull Project project) {
    if (project.isDefault() || ApplicationManager.getApplication().isUnitTestMode()) {
      return;
    }

    MessageBusConnection connection = project.getMessageBus().connect();
    connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new MyFileEditorManagerListener());
    connection.subscribe(FileTypeManager.TOPIC, new FileTypeListener() {
      @Override
      public void fileTypesChanged(@NotNull FileTypeEvent event) {
        reinitBreadcrumbsInAllEditors(project);
      }
    });

    VirtualFileManager.getInstance().addVirtualFileListener(new MyVirtualFileListener(project), project);
    connection.subscribe(UISettingsListener.TOPIC, uiSettings -> reinitBreadcrumbsInAllEditors(project));
  }

  private static class MyFileEditorManagerListener implements FileEditorManagerListener {
    @Override
    public void fileOpened(@NotNull final FileEditorManager source, @NotNull final VirtualFile file) {
      reinitBreadcrumbsComponent(source, file);
    }
  }

  private static class MyVirtualFileListener implements VirtualFileListener {
    private final Project myProject;

    public MyVirtualFileListener(@NotNull Project project) {
      myProject = project;
    }

    @Override
    public void propertyChanged(@NotNull VirtualFilePropertyEvent event) {
      if (VirtualFile.PROP_NAME.equals(event.getPropertyName()) && !myProject.isDisposed()) {
        FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
        VirtualFile file = event.getFile();
        if (fileEditorManager.isFileOpen(file)) {
          reinitBreadcrumbsComponent(fileEditorManager, file);
        }
      }
    }
  }

  private static void reinitBreadcrumbsInAllEditors(@NotNull Project project) {
    if (project.isDisposed()) return;
    FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
    for (VirtualFile virtualFile : fileEditorManager.getOpenFiles()) {
      reinitBreadcrumbsComponent(fileEditorManager, virtualFile);
    }
  }

  private static void reinitBreadcrumbsComponent(@NotNull final FileEditorManager fileEditorManager, @NotNull VirtualFile file) {
    if (isSuitable(fileEditorManager.getProject(), file)) {
      FileEditor[] fileEditors = fileEditorManager.getAllEditors(file);
      for (final FileEditor fileEditor : fileEditors) {
        if (fileEditor instanceof TextEditor && fileEditor.isValid()) {
          Editor editor = ((TextEditor)fileEditor).getEditor();
          final BreadcrumbsXmlWrapper existingWrapper = BreadcrumbsXmlWrapper.getBreadcrumbsComponent(editor);
          if (existingWrapper != null) {
            existingWrapper.queueUpdate();
            continue;
          }

          final BreadcrumbsXmlWrapper wrapper = new BreadcrumbsXmlWrapper(editor);
          registerWrapper(fileEditorManager, fileEditor, wrapper);
        }
      }
    }
    else {
      removeBreadcrumbs(fileEditorManager, file);
    }
  }

  private static void removeBreadcrumbs(@NotNull FileEditorManager fileEditorManager, @NotNull VirtualFile file) {
    final FileEditor[] fileEditors = fileEditorManager.getAllEditors(file);
    for (FileEditor fileEditor : fileEditors) {
      if (fileEditor instanceof TextEditor) {
        Editor editor = ((TextEditor)fileEditor).getEditor();
        BreadcrumbsXmlWrapper wrapper = BreadcrumbsXmlWrapper.getBreadcrumbsComponent(editor);
        if (wrapper != null) {
          disposeWrapper(fileEditorManager, fileEditor, wrapper);
        }
      }
    }
  }

  private static boolean isSuitable(@NotNull Project project, @NotNull VirtualFile file) {
    if (file instanceof HttpVirtualFile) {
      return false;
    }

    return BreadcrumbsXmlWrapper.findInfoProvider(file, project) != null;
  }

  private static void registerWrapper(@NotNull FileEditorManager fileEditorManager,
                                      @NotNull FileEditor fileEditor,
                                      @NotNull BreadcrumbsXmlWrapper wrapper) {
    //noinspection deprecation
    if (wrapper.breadcrumbs.above) {
      fileEditorManager.addTopComponent(fileEditor, wrapper);
    }
    else {
      fileEditorManager.addBottomComponent(fileEditor, wrapper);
    }
    Disposer.register(fileEditor, () -> disposeWrapper(fileEditorManager, fileEditor, wrapper));
  }

  private static void disposeWrapper(@NotNull FileEditorManager fileEditorManager,
                                     @NotNull FileEditor fileEditor,
                                     @NotNull BreadcrumbsXmlWrapper wrapper) {
    //noinspection deprecation
    if (wrapper.breadcrumbs.above) {
      fileEditorManager.removeTopComponent(fileEditor, wrapper);
    }
    else {
      fileEditorManager.removeBottomComponent(fileEditor, wrapper);
    }
    Disposer.dispose(wrapper);
  }
}


text:
package org.apache.polygene.api.service;

import org.apache.polygene.api.composite.ModelDescriptor;
import org.apache.polygene.api.identity.Identifiable;
import org.apache.polygene.api.util.VisitableModelDescriptor;

/**
 * {@code ServiceDescriptor} provides meta information of a service.
 */
public interface ImportedServiceDescriptor
    extends VisitableModelDescriptor, Identifiable
{
    Class<? extends ServiceImporter> serviceImporter();

    Class<?> type();
}


text:
begin;

create table #prefix#webpage (
	id char(72) not null primary key,
	title char(72) not null,
	menu_title char(72) not null,
	window_title char(72) not null,
	access char(12) not null,
	layout char(48) not null,
	description text,
	keywords text,
	body text,
	extra text
);

create index #prefix#webpage_access on #prefix#webpage (access);

insert into #prefix#webpage (id, title, menu_title, window_title, access, layout, description, keywords, body, extra) values ('index', 'Welcome to Elefant', 'Home', '', 'public', 'default', '', '', '

Congratulations!
You have successfully installed Elefant, the refreshingly simple new PHP web framework and CMS.
Getting Started
To log in as an administrator and edit pages, write a blog post, or upload files, go to /admin.
Developers
Documentation, source code and issue tracking can be found at github.com/jbroadway/elefant

', '[]');

create table #prefix#block (
	id char(72) not null primary key,
	title char(72) not null,
	body text,
	access char(12) not null,
	show_title char(3) not null
);

create index #prefix#block_access on #prefix#block (id, access);

insert into #prefix#block (id, title, access, body, show_title) values ('members', 'Members', 'public', '

', 'no');

create table #prefix#user (
	id integer primary key,
	email char(72) unique not null,
	password char(128) not null,
	session_id char(32) unique,
	expires datetime not null,
	name char(72) not null,
	type char(32) not null,
	signed_up datetime not null,
	updated datetime not null,
	userdata text not null,
	phone char(32) not null default '',
	address char(48) not null default '',
	address2 char(48) not null default '',
	city char(48) not null default '',
	state char(3) not null default '',
	country char(3) not null default '',
	zip char(16) not null default '',
	title char(48) not null default '',
	company char(48) not null default '',
	photo char(128) not null default '',
	about text not null default '',
	website char(128) not null default ''
);

create index #prefix#user_email_password on #prefix#user (email, password);
create index #prefix#user_session_id on #prefix#user (session_id);

insert into #prefix#user (id, email, password, session_id, expires, name, type, signed_up, updated, userdata) values (1, 'you@example.com', '$2a$07$1QeR9mu2doQxY0uBcpFlrOIfDxq0BwpR8FsImCgWvAL4Fz9jDByxi', null, (DATETIME('now')), 'Admin User', 'admin', (DATETIME('now')), (DATETIME('now')), '[]');

create table #prefix#user_session (
	session_id char(32) not null primary key,
	expires datetime not null,
	user_id int not null
);

create index #prefix#user_session_user on #prefix#user_session (user_id, expires);
create index #prefix#user_session_expires on #prefix#user_session (expires);

create table #prefix#user_openid (
	token char(200) primary key,
	user_id int not null
);

create table #prefix#user_links (
	id integer primary key,
	user_id int not null,
	service char(32) not null default '',
	handle char(72) not null
);

create index #prefix#user_links_user on #prefix#user_links (user_id, service);

create table #prefix#user_notes (
	id integer primary key,
	user_id int not null,
	ts datetime not null,
	made_by int not null,
	note text not null
);

create index #prefix#user_notes_user on #prefix#user_notes (user_id, ts);
create index #prefix#user_notes_made_by on #prefix#user_notes (made_by, ts);

create table #prefix#versions (
	id integer primary key,
	class char(72) not null,
	pkey char(72) not null,
	user int not null,
	ts datetime not null,
	serialized text not null
);

create index #prefix#versions_class on #prefix#versions (class, pkey, ts);
create index #prefix#versions_user on #prefix#versions (user, ts);

create table #prefix#api (
	token char(35) not null primary key,
	api_key char(35) not null,
	user_id int not null
);

create index #prefix#api_token on #prefix#api (token, api_key);
create index #prefix#api_user on #prefix#api (user_id);

create table #prefix#blog_post (
	id integer primary key,
	title char(128) not null,
	ts datetime not null,
	author char(32) not null,
	published char(3) not null,
	body text not null,
	tags text not null,
	extra text not null,
	thumbnail char(128) not null default ''
);

create index #prefix#blog_post_ts on #prefix#blog_post (ts);
create index #prefix#blog_post_pts on #prefix#blog_post (ts, published);

create table #prefix#blog_tag (
	id char(48) not null,
	primary key (id)
);

create table #prefix#blog_post_tag (
	tag_id char(48) not null,
	post_id int not null,
	primary key (tag_id, post_id)
);

create table #prefix#lock (
	id integer primary key,
	user int not null,
	resource varchar(72) not null,
	resource_id varchar(72) not null,
	expires datetime not null,
	created datetime not null,
	modified datetime not null
);

create index #prefix#lock_resource on #prefix#lock (resource, resource_id, expires);
create index #prefix#lock_user on #prefix#lock (user);

create table #prefix#filemanager_prop (
	file char(128) not null,
	prop char(32) not null,
	value char(255) not null,
	primary key (file, prop)
);

create table #prefix#apps (
	name char(48) not null primary key,
	version char(16) not null
);

insert into #prefix#apps (name, version) values ('elefant', '1.3.10');
insert into #prefix#apps (name, version) values ('blog', '1.1.4-stable');
insert into #prefix#apps (name, version) values ('user', '1.1.3-stable');
insert into #prefix#apps (name, version) values ('filemanager', '1.3.0-beta');

create table #prefix#extended_fields (
	id integer primary key,
	class char(48) not null,
	sort int not null,
	name char(48) not null,
	label char(48) not null,
	type char(24) not null,
	required int not null,
	options char(255) not null
);

create index #prefix#extended_fields_class on #prefix#extended_fields (class, sort);

commit;


text:
package resource

import (
	"errors"
	"strings"
	"time"
)

// Item represents an instance of an item
type Item struct {
	// ID is used to uniquely identify the item in the resource collection.
	ID interface{}
	// ETag is an opaque identifier assigned by REST Layer to a specific version of the item.
	//
	// This ETag is used perform conditional requests and to ensure storage handler doesn't
	// update an outdated version of the resource.
	ETag string
	// Updated stores the last time the item was updated. This field is used to populate the
	// Last-Modified header and to handle conditional requests.
	Updated time.Time
	// Payload the actual data of the item
	Payload map[string]interface{}
}

// ItemList represents a list of items
type ItemList struct {
	// Total defines the total number of items in the collection matching the current
	// context. If the storage handler cannot compute this value, -1 is set.
	Total int
	// Page is the current page represented by this ItemList.
	Page int
	// Items is the list of items contained in the current page given the current
	// context.
	Items []*Item
}

// NewItem creates a new item from a payload
func NewItem(payload map[string]interface{}) (*Item, error) {
	id, found := payload["id"]
	if !found {
		return nil, errors.New("Missing ID field")
	}
	etag, err := genEtag(payload)
	if err != nil {
		return nil, err
	}
	item := &Item{
		ID:      id,
		ETag:    etag,
		Updated: time.Now(),
		Payload: payload,
	}
	return item, nil
}

// GetField returns the item's payload field by its name.
//
// A field name may use the dot notation to refrence a sub field.
// A GetField on field.subfield is equivalent to item.Payload["field"]["subfield].
func (i Item) GetField(name string) interface{} {
	return getField(i.Payload, name)
}

// getField gets the value of a given field by supporting sub-field path.
// A get on field.subfield is equivalent to payload["field"]["subfield].
func getField(payload map[string]interface{}, name string) interface{} {
	// Split the name to get the current level name on first element and
	// the rest of the path as second element if dot notation is used
	// (i.e.: field.subfield.subsubfield -> field, subfield.subsubfield)
	path := strings.SplitN(name, ".", 2)
	if value, found := payload[path[0]]; found {
		if len(path) == 2 {
			if subPayload, ok := value.(map[string]interface{}); ok {
				// Check next level
				return getField(subPayload, path[1])
			}
			// The requested depth does not exist
			return nil
		}
		// Full path has been found
		return value
	}
	return nil
}


text:
package org.drools.compiler.builder.impl;

import org.drools.compiler.compiler.PackageRegistry;
import org.drools.compiler.compiler.TypeDeclarationError;
import org.drools.compiler.lang.descr.AbstractClassTypeDeclarationDescr;
import org.drools.compiler.lang.descr.TypeDeclarationDescr;
import org.drools.core.base.TypeResolver;
import org.drools.core.common.ProjectClassLoader;
import org.drools.core.factmodel.ClassBuilder;
import org.drools.core.factmodel.ClassDefinition;
import org.drools.core.rule.JavaDialectRuntimeData;
import org.drools.core.rule.TypeDeclaration;

import static org.drools.core.util.ClassUtils.convertClassToResourcePath;

public class DeclaredClassBuilder {

    protected final KnowledgeBuilderImpl kbuilder;

    public DeclaredClassBuilder( KnowledgeBuilderImpl kbuilder ) {
        this.kbuilder = kbuilder;
    }

    public void generateBeanFromDefinition( AbstractClassTypeDeclarationDescr typeDescr,
                                            TypeDeclaration type,
                                            PackageRegistry pkgRegistry,
                                            ClassDefinition def ) {

        if ( type.isNovel() ) {
            String fullName = typeDescr.getType().getFullName();
            JavaDialectRuntimeData dialect = (JavaDialectRuntimeData) pkgRegistry.getDialectRuntimeRegistry().getDialectData("java");
            if ( ensureJavaTypeConsistency( typeDescr, def, pkgRegistry.getTypeResolver() ) ) {
                switch ( type.getKind() ) {
                    case TRAIT:
                        try {
                            buildClass( def, fullName, dialect, this.kbuilder.getBuilderConfiguration().getClassBuilderFactory().getTraitBuilder(), pkgRegistry );
                        } catch ( Exception e ) {
                            e.printStackTrace();
                            this.kbuilder.addBuilderResult( new TypeDeclarationError( typeDescr,
                                                                                "Unable to compile declared trait " + fullName +
                                                                                ": " + e.getMessage() + ";" ) );
                        }
                        break;
                    case ENUM:
                        try {
                            buildClass( def, fullName, dialect, this.kbuilder.getBuilderConfiguration().getClassBuilderFactory().getEnumClassBuilder(), pkgRegistry );
                        } catch ( Exception e ) {
                            e.printStackTrace();
                            this.kbuilder.addBuilderResult( new TypeDeclarationError( typeDescr,
                                                                                "Unable to compile declared enum " + fullName +
                                                                                ": " + e.getMessage() + ";" ) );
                        }
                        break;
                    case CLASS:
                    default:
                        try {
                            buildClass( def, fullName, dialect, this.kbuilder.getBuilderConfiguration().getClassBuilderFactory().getBeanClassBuilder(), pkgRegistry );
                        } catch ( Exception e ) {
                            e.printStackTrace();
                            this.kbuilder.addBuilderResult( new TypeDeclarationError( typeDescr,
                                                                                "Unable to create a class for declared type " + fullName +
                                                                                ": " + e.getMessage() + ";" ) );
                        }
                        break;
                }
            }
        }
    }

    private boolean ensureJavaTypeConsistency( AbstractClassTypeDeclarationDescr typeDescr, ClassDefinition def, TypeResolver typeResolver ) {
        try {
            if ( typeDescr instanceof TypeDeclarationDescr &&  ! ( (TypeDeclarationDescr) typeDescr ).isTrait()
                && typeResolver.resolveType( def.getSuperClass() ).isInterface() ) {
                kbuilder.addBuilderResult( new TypeDeclarationError( typeDescr, "Interfaces cannot be used as super types of normal classes: " + def.getSuperClass() ) );
                return false;
            }
            for ( String sup : def.getInterfaces() ) {
                if ( !typeResolver.resolveType( sup ).isInterface() ) {
                    kbuilder.addBuilderResult( new TypeDeclarationError( typeDescr, "Non-interface type used as super interface : " + sup ) );
                    return false;
                }
            }
        } catch ( ClassNotFoundException cnfe ) {
            kbuilder.addBuilderResult( new TypeDeclarationError( typeDescr, "Unable to resolve parent type :"  + cnfe.getMessage() ) );
            return false;
        }
        return true;
    }

    protected void buildClass( ClassDefinition def, String fullName, JavaDialectRuntimeData dialect, ClassBuilder cb, PackageRegistry pkgRegistry ) throws Exception {
        byte[] bytecode = cb.buildClass(def, kbuilder.getRootClassLoader());
        String resourceName = convertClassToResourcePath(fullName);
        dialect.putClassDefinition( resourceName, bytecode );
        if (kbuilder.getKnowledgeBase() != null) {
            Class<?> clazz = kbuilder.getKnowledgeBase().registerAndLoadTypeDefinition(fullName, bytecode);
            pkgRegistry.getTypeResolver().registerClass( fullName, clazz );
        } else {
            if (kbuilder.getRootClassLoader() instanceof ProjectClassLoader ) {
                Class<?> clazz = ((ProjectClassLoader) kbuilder.getRootClassLoader()).defineClass(fullName, resourceName, bytecode);
                pkgRegistry.getTypeResolver().registerClass( fullName, clazz );
            } else {
                dialect.write(resourceName, bytecode);
            }
        }
    }
}


text:
module Selenium
  module WebDriver
    module IE
      class Options
        KEY = 'se:ieOptions'.freeze
        SCROLL_TOP = 0
        SCROLL_BOTTOM = 1
        CAPABILITIES = {
          browser_attach_timeout: 'browserAttachTimeout',
          element_scroll_behavior: 'elementScrollBehavior',
          full_page_screenshot: 'ie.enableFullPageScreenshot',
          ensure_clean_session: 'ie.ensureCleanSession',
          file_upload_dialog_timeout: 'ie.fileUploadDialogTimeout',
          force_create_process_api: 'ie.forceCreateProcessApi',
          force_shell_windows_api: 'ie.forceShellWindowsApi',
          ignore_protected_mode_settings: 'ignoreProtectedModeSettings',
          ignore_zoom_level: 'ignoreZoomSetting',
          initial_browser_url: 'initialBrowserUrl',
          native_events: 'nativeEvents',
          persistent_hover: 'enablePersistentHover',
          require_window_focus: 'requireWindowFocus',
          use_per_process_proxy: 'ie.usePerProcessProxy',
          validate_cookie_document_type: 'ie.validateCookieDocumentType'
        }.freeze

        CAPABILITIES.each_key do |key|
          define_method key do
            @options[key]
          end

          define_method "#{key}=" do |value|
            @options[key] = value
          end
        end

        attr_reader :args, :options

        #
        # Create a new Options instance
        #
        # @example
        #   options = Selenium::WebDriver::IE::Options.new(args: ['--host=127.0.0.1'])
        #   driver = Selenium::WebDriver.for(:ie, options: options)
        #
        # @example
        #   options = Selenium::WebDriver::IE::Options.new
        #   options.element_scroll_behavior = Selenium::WebDriver::IE::Options::SCROLL_BOTTOM
        #   driver = Selenium::WebDriver.for(:ie, options: options)
        #
        # @param [Hash] opts the pre-defined options
        # @option opts [Array<String>] args
        # @option opts [Integer] browser_attach_timeout
        # @option opts [Integer] element_scroll_behavior Either SCROLL_TOP or SCROLL_BOTTOM
        # @option opts [Boolean] full_page_screenshot
        # @option opts [Boolean] ensure_clean_session
        # @option opts [Integer] file_upload_dialog_timeout
        # @option opts [Boolean] force_create_process_api
        # @option opts [Boolean] force_shell_windows_api
        # @option opts [Boolean] ignore_protected_mode_settings
        # @option opts [Boolean] ignore_zoom_level
        # @option opts [String] initial_browser_url
        # @option opts [Boolean] native_events
        # @option opts [Boolean] persistent_hover
        # @option opts [Boolean] require_window_focus
        # @option opts [Boolean] use_per_process_proxy
        # @option opts [Boolean] validate_cookie_document_type
        #

        def initialize(**opts)
          @args = opts.delete(:args) || []
          @options = opts
          @options[:native_events] ||= true
        end

        #
        # Add a command-line argument to use when starting Internet Explorer.
        #
        # @param [String] arg The command-line argument to add
        #

        def add_argument(arg)
          @args << arg
        end

        #
        # Add a new option not yet handled by these bindings.
        #
        # @example
        #   options = Selenium::WebDriver::IE::Options.new
        #   options.add_option(:foo, 'bar')
        #
        # @param [String, Symbol] name Name of the option
        # @param [Boolean, String, Integer] value Value of the option
        #

        def add_option(name, value)
          @options[name] = value
        end

        #
        # @api private
        #

        def as_json(*)
          opts = {}

          CAPABILITIES.each do |capability_alias, capability_name|
            capability_value = @options.delete(capability_alias)
            opts[capability_name] = capability_value unless capability_value.nil?
          end
          opts['ie.browserCommandLineSwitches'] = @args.join(' ') if @args.any?
          opts.merge!(@options)

          {KEY => opts}
        end
      end # Options
    end # IE
  end # WebDriver
end # Selenium


text:
{% extends "zerver/portico.html" %}

{% block title %}
<title>{{ _("Confirmation link expired or deactivated") }} | Zulip</title>
{% endblock %}

{% block portico_content %}

{{ _("Whoops. The confirmation link has expired or been deactivated.") }}

{{ _("Please contact your organization administrator for a new link.") }}

{% endblock %}


text:
from django.contrib.gis.db.models.functions import Distance

class BaseSpatialOperations:
    # Quick booleans for the type of this spatial backend, and
    # an attribute for the spatial database version tuple (if applicable)
    postgis = False
    spatialite = False
    mysql = False
    oracle = False
    spatial_version = None

    # How the geometry column should be selected.
    select = None

    # Does the spatial database have a geometry or geography type?
    geography = False
    geometry = False

    # Aggregates
    disallowed_aggregates = ()

    geom_func_prefix = ''

    # Mapping between Django function names and backend names, when names do not
    # match; used in spatial_function_name().
    function_names = {}

    # Blacklist/set of known unsupported functions of the backend
    unsupported_functions = {
        'Area', 'AsGeoJSON', 'AsGML', 'AsKML', 'AsSVG', 'Azimuth',
        'BoundingCircle', 'Centroid', 'Difference', 'Distance', 'Envelope',
        'ForceRHR', 'GeoHash', 'Intersection', 'IsValid', 'Length',
        'LineLocatePoint', 'MakeValid', 'MemSize', 'NumGeometries',
        'NumPoints', 'Perimeter', 'PointOnSurface', 'Reverse', 'Scale',
        'SnapToGrid', 'SymDifference', 'Transform', 'Translate', 'Union',
    }

    # Constructors
    from_text = False

    # Default conversion functions for aggregates; will be overridden if implemented
    # for the spatial backend.
    def convert_extent(self, box, srid):
        raise NotImplementedError('Aggregate extent not implemented for this spatial backend.')

    def convert_extent3d(self, box, srid):
        raise NotImplementedError('Aggregate 3D extent not implemented for this spatial backend.')

    # For quoting column values, rather than columns.
    def geo_quote_name(self, name):
        return "'%s'" % name

    # GeometryField operations
    def geo_db_type(self, f):
        """
        Return the database column type for the geometry field on
        the spatial backend.
        """
        raise NotImplementedError('subclasses of BaseSpatialOperations must provide a geo_db_type() method')

    def get_distance(self, f, value, lookup_type):
        """
        Return the distance parameters for the given geometry field,
        lookup value, and lookup type.
        """
        raise NotImplementedError('Distance operations not available on this spatial backend.')

    def get_geom_placeholder(self, f, value, compiler):
        """
        Return the placeholder for the given geometry field with the given
        value.  Depending on the spatial backend, the placeholder may contain a
        stored procedure call to the transformation function of the spatial
        backend.
        """
        def transform_value(value, field):
            return value is not None and value.srid != field.srid

        if hasattr(value, 'as_sql'):
            return (
                '%s(%%s, %s)' % (self.spatial_function_name('Transform'), f.srid)
                if transform_value(value.output_field, f)
                else '%s'
            )
        if transform_value(value, f):
            # Add Transform() to the SQL placeholder.
            return '%s(%s(%%s,%s), %s)' % (
                self.spatial_function_name('Transform'),
                self.from_text, value.srid, f.srid,
            )
        elif self.connection.features.has_spatialrefsys_table:
            return '%s(%%s,%s)' % (self.from_text, f.srid)
        else:
            # For backwards compatibility on MySQL (#27464).
            return '%s(%%s)' % self.from_text

    def check_expression_support(self, expression):
        if isinstance(expression, self.disallowed_aggregates):
            raise NotImplementedError(
                "%s spatial aggregation is not supported by this database backend." % expression.name
            )
        super().check_expression_support(expression)

    def spatial_aggregate_name(self, agg_name):
        raise NotImplementedError('Aggregate support not implemented for this spatial backend.')

    def spatial_function_name(self, func_name):
        if func_name in self.unsupported_functions:
            raise NotImplementedError("This backend doesn't support the %s function." % func_name)
        return self.function_names.get(func_name, self.geom_func_prefix + func_name)

    # Routines for getting the OGC-compliant models.
    def geometry_columns(self):
        raise NotImplementedError('Subclasses of BaseSpatialOperations must provide a geometry_columns() method.')

    def spatial_ref_sys(self):
        raise NotImplementedError('subclasses of BaseSpatialOperations must a provide spatial_ref_sys() method')

    distance_expr_for_lookup = staticmethod(Distance)