쿠라
악마
몬스터가 주는 경험치 200% 증가
떨어지는 아이템 희귀도 % 증가
monster base type attack cast speed +% and damage -% final [33]
동작 속도가 기본 수치 50% 밑으로 내려가지 않음
monster penalty against minions damage +% final vs player minions [-25]
몬스터가 주는 경험치 100% 증가
떨어지는 아이템 희귀도 15000% 증가
cannot be stunned for ms after stun finished [2000]
cannot be stunned while stunned [1]
Q'ura
SpectreN
Area제물의 정점, 매혹적인 심연
Tagscleaving_weapon, demon, flesh_armour, has_two_hand_axe, has_two_handed_melee, medium_height, melee, no_maven, physical_affinity, red_blood, slow_movement, unique_map_boss
생명력
833%
Ailment Threshold
588%
저항
40 40 40 25
Damage
125%
정확도
100%
치명타 확률
+5%
치명타 피해 배율
+130%
Attack Distance
6 ~ 13
Attack Time
1.5 Second
Damage Spread
±20%
경험치
125%
Model Size
125%
Type
DemonBoss1
Metadata
DemonBoss1
레벨
80
생명력
11,712,936
방어도
73,441
회피
7,124
에너지 보호막
0
Damage
1,079
주문 피해
1,611
정확도
462
Attack Time
1.005
경험치
87,395
Ailment Threshold
3,968,618
Chill
12,549
Shock
12,549
Brittle
70,995
Scorch
12,549
Sap
34,670
Melee
Attack, RangedAttack, MirageArcherCanUse, Projectile, MeleeSingleTarget, Multistrikeable, Melee, ProjectilesFromUser
기본 공격
Base Damage: 1714–2571
치명타 확률: 5%
Attack Time: 1.5 초
강력한 일격으로 적들을 쓰러트립니다.
skill can fire arrows [1]
skill can fire wand projectiles [1]
MonsterDemonCleave
Attack, Area, Melee, DamageOverTime
Base Damage: 1714–2571
치명타 확률: 5%
Attack Time: 1.5 초
1초마다 272.1의 기본 물리 피해를 줌
공격 속도 50% 감소
corrupted blood cleave stacks to add [2]
is area damage [1]
MonsterDesecratedGroundCyclone
Attack, Area, Melee, Movement
회오리바람
Base Damage: 1714–2571
치명타 확률: 5%
Attack Time: 1.5 초
재사용 대기시간: 5 초
주변 적들에게 피해를 준 뒤 목표 지점으로 이동하는 동안 연속 회전 공격을 합니다. 무자비 또는 연속타격의 보조는 받을 수 없습니다.
주는 피해 60% 감폭
물리 피해 35% 증가
공격 속도 180% 증가
이동 속도 150% 증폭
cyclone extra distance [30]
cyclone places ground desecration chaos damage per minute [76848]
desecrated ground art variation [1]
is area damage [1]
MonsterDemonCleaveEnrage
Attack, Area, Melee, DamageOverTime
Base Damage: 1714–2571
치명타 확률: 5%
Attack Time: 1.5 초
1초마다 272.1의 기본 물리 피해를 줌
공격 속도 50% 감소
corrupted blood cleave stacks to add [8]
is area damage [1]

Object Type

version 2
extends "Metadata/Monsters/DemonBosses/DemonBoss"

Actor
{
	main_hand_unarmed_type = "Two_Hand_Sword"
}

Object Type Codes

version 2
extends "Metadata/Monsters/DemonBosses/DemonBoss"
-- src\Data\Spectres.lua
minions["Metadata/Monsters/DemonBosses/DemonBoss1/DemonBoss1"] = {
    name = "Q'ura",
    life = 8.33,
    fireResist = 40,
    coldResist = 40,
    lightningResist = 40,
    chaosResist = 25,
    damage = 1.25,
    damageSpread = 0.2,
    attackTime = 1.5,
    attackRange = 13,
    accuracy = 1,
    weaponType1 = "Two Hand Axe",
    skillList = {
        "Melee",
        "MonsterDesecratedGroundCyclone",
        "MonsterDemonCleave",
        "MonsterDemonCleaveEnrage",
    },
    modList = {
    },
}
-- src\Data\Skills\spectre.lua
skills["Melee"] = {
    name = "Default Attack",
    hidden = true,
    color = 4,
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "Strike your foes down with a powerful blow.",
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.RangedAttack] = true,
        [SkillType.MirageArcherCanUse] = true,
        [SkillType.Projectile] = true,
        [SkillType.MeleeSingleTarget] = true,
        [SkillType.Multistrikeable] = true,
        [SkillType.Melee] = true,
        [SkillType.ProjectilesFromUser] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        melee = true,
        projectile = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_can_fire_arrows",
        "skill_can_fire_wand_projectiles",
    },
    levels = {
        [1] = {levelRequirement = 1, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MonsterDesecratedGroundCyclone"] = {
    name = "Cyclone",
    hidden = true,
    color = "2",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "Damage enemies around you, then perform a spinning series of attacks as you travel to a target location. Cannot be supported by Ruthless or Multistrike.",
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.Area] = true,
        [SkillType.Melee] = true,
        [SkillType.Movement] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        area = true,
        melee = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "attack_speed_+%",
        "cyclone_movement_speed_+%_final",
        "cyclone_extra_distance",
        "cyclone_places_ground_desecration_chaos_damage_per_minute",
        "physical_damage_+%",
        "active_skill_damage_+%_final",
        "desecrated_ground_art_variation",
        "is_area_damage",
    },
    levels = {
        [1] = {120, 120, 40, 1230, 35, -60, 1, levelRequirement = 4, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [2] = {120, 120, 40, 6205, 35, -60, 1, levelRequirement = 9, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [3] = {120, 120, 40, 10185, 35, -60, 1, levelRequirement = 13, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [4] = {120, 120, 40, 15160, 35, -60, 1, levelRequirement = 18, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [5] = {120, 120, 40, 21130, 35, -60, 1, levelRequirement = 24, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [6] = {120, 120, 40, 24114, 35, -60, 1, levelRequirement = 27, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [7] = {120, 120, 40, 27099, 35, -60, 1, levelRequirement = 30, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [8] = {120, 120, 40, 30084, 35, -60, 1, levelRequirement = 33, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [9] = {120, 120, 40, 32074, 35, -60, 1, levelRequirement = 35, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [10] = {120, 120, 40, 35059, 35, -60, 1, levelRequirement = 38, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [11] = {120, 120, 40, 37049, 35, -60, 1, levelRequirement = 40, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [12] = {120, 120, 40, 40034, 35, -60, 1, levelRequirement = 43, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [13] = {120, 120, 40, 43019, 35, -60, 1, levelRequirement = 46, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [14] = {120, 120, 40, 45009, 35, -60, 1, levelRequirement = 48, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [15] = {120, 120, 40, 46999, 35, -60, 1, levelRequirement = 50, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [16] = {120, 120, 40, 48989, 35, -60, 1, levelRequirement = 52, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [17] = {120, 120, 40, 50979, 35, -60, 1, levelRequirement = 54, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [18] = {120, 120, 40, 52968, 35, -60, 1, levelRequirement = 56, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [19] = {120, 120, 40, 54958, 35, -60, 1, levelRequirement = 58, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [20] = {120, 120, 40, 56948, 35, -60, 1, levelRequirement = 60, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [21] = {120, 120, 40, 58938, 35, -60, 1, levelRequirement = 62, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [22] = {120, 120, 40, 60928, 35, -60, 1, levelRequirement = 64, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [23] = {120, 120, 40, 62918, 35, -60, 1, levelRequirement = 66, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [24] = {120, 120, 40, 63913, 35, -60, 1, levelRequirement = 67, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [25] = {120, 120, 40, 64908, 35, -60, 1, levelRequirement = 68, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [26] = {120, 120, 40, 65903, 35, -60, 1, levelRequirement = 69, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [27] = {120, 120, 40, 66898, 35, -60, 1, levelRequirement = 70, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [28] = {130, 125, 38, 67893, 35, -60, 1, levelRequirement = 71, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [29] = {140, 130, 36, 68888, 35, -60, 1, levelRequirement = 72, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [30] = {150, 135, 34, 69883, 35, -60, 1, levelRequirement = 73, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [31] = {160, 140, 32, 70878, 35, -60, 1, levelRequirement = 74, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [32] = {170, 145, 30, 71873, 35, -60, 1, levelRequirement = 75, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [33] = {180, 150, 30, 72868, 35, -60, 1, levelRequirement = 76, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [34] = {180, 150, 30, 73863, 35, -60, 1, levelRequirement = 77, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [35] = {180, 150, 30, 74858, 35, -60, 1, levelRequirement = 78, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [36] = {180, 150, 30, 75853, 35, -60, 1, levelRequirement = 79, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [37] = {180, 150, 30, 76848, 35, -60, 1, levelRequirement = 80, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [38] = {180, 150, 30, 77843, 35, -60, 1, levelRequirement = 81, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [39] = {180, 150, 30, 78838, 35, -60, 1, levelRequirement = 82, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [40] = {180, 150, 30, 80827, 35, -60, 1, levelRequirement = 84, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [41] = {180, 150, 30, 82817, 35, -60, 1, levelRequirement = 86, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [42] = {180, 150, 30, 84807, 35, -60, 1, levelRequirement = 88, statInterpolation = {1, 1, 1, 1},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MonsterDemonCleave"] = {
    name = "MonsterDemonCleave",
    hidden = true,
    color = 4,
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.Area] = true,
        [SkillType.Melee] = true,
        [SkillType.DamageOverTime] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        area = true,
        melee = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "base_physical_damage_to_deal_per_minute",
        "attack_speed_+%",
        "corrupted_blood_cleave_stacks_to_add",
        "is_area_damage",
    },
    levels = {
        [1] = {150, -50, 2, levelRequirement = 3, statInterpolation = {1},  cost = { }, },
        [2] = {235, -50, 2, levelRequirement = 5, statInterpolation = {1},  cost = { }, },
        [3] = {320, -50, 2, levelRequirement = 8, statInterpolation = {1},  cost = { }, },
        [4] = {406, -50, 2, levelRequirement = 10, statInterpolation = {1},  cost = { }, },
        [5] = {491, -50, 2, levelRequirement = 12, statInterpolation = {1},  cost = { }, },
        [6] = {576, -50, 2, levelRequirement = 14, statInterpolation = {1},  cost = { }, },
        [7] = {661, -50, 2, levelRequirement = 17, statInterpolation = {1},  cost = { }, },
        [8] = {746, -50, 2, levelRequirement = 20, statInterpolation = {1},  cost = { }, },
        [9] = {832, -50, 2, levelRequirement = 24, statInterpolation = {1},  cost = { }, },
        [10] = {917, -50, 2, levelRequirement = 30, statInterpolation = {1},  cost = { }, },
        [11] = {1002, -50, 2, levelRequirement = 31, statInterpolation = {1},  cost = { }, },
        [12] = {1062, -50, 2, levelRequirement = 36, statInterpolation = {1},  cost = { }, },
        [13] = {1458, -50, 2, levelRequirement = 41, statInterpolation = {1},  cost = { }, },
        [14] = {1854, -50, 2, levelRequirement = 44, statInterpolation = {1},  cost = { }, },
        [15] = {2250, -50, 2, levelRequirement = 51, statInterpolation = {1},  cost = { }, },
        [16] = {2646, -50, 2, levelRequirement = 54, statInterpolation = {1},  cost = { }, },
        [17] = {3345, -50, 2, levelRequirement = 57, statInterpolation = {1},  cost = { }, },
        [18] = {4045, -50, 2, levelRequirement = 60, statInterpolation = {1},  cost = { }, },
        [19] = {4744, -50, 2, levelRequirement = 65, statInterpolation = {1},  cost = { }, },
        [20] = {5443, -50, 2, levelRequirement = 66, statInterpolation = {1},  cost = { }, },
        [21] = {6142, -50, 2, levelRequirement = 67, statInterpolation = {1},  cost = { }, },
        [22] = {6842, -50, 2, levelRequirement = 68, statInterpolation = {1},  cost = { }, },
        [23] = {7541, -50, 2, levelRequirement = 69, statInterpolation = {1},  cost = { }, },
        [24] = {8240, -50, 2, levelRequirement = 70, statInterpolation = {1},  cost = { }, },
        [25] = {9049, -50, 2, levelRequirement = 71, statInterpolation = {1},  cost = { }, },
        [26] = {9858, -50, 2, levelRequirement = 72, statInterpolation = {1},  cost = { }, },
        [27] = {10666, -50, 2, levelRequirement = 73, statInterpolation = {1},  cost = { }, },
        [28] = {11475, -50, 2, levelRequirement = 74, statInterpolation = {1},  cost = { }, },
        [29] = {12284, -50, 2, levelRequirement = 75, statInterpolation = {1},  cost = { }, },
        [30] = {13093, -50, 2, levelRequirement = 76, statInterpolation = {1},  cost = { }, },
        [31] = {13901, -50, 2, levelRequirement = 77, statInterpolation = {1},  cost = { }, },
        [32] = {14710, -50, 2, levelRequirement = 78, statInterpolation = {1},  cost = { }, },
        [33] = {15519, -50, 2, levelRequirement = 79, statInterpolation = {1},  cost = { }, },
        [34] = {16327, -50, 2, levelRequirement = 80, statInterpolation = {1},  cost = { }, },
        [35] = {17136, -50, 2, levelRequirement = 81, statInterpolation = {1},  cost = { }, },
        [36] = {17945, -50, 2, levelRequirement = 82, statInterpolation = {1},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MonsterDemonCleaveEnrage"] = {
    name = "MonsterDemonCleaveEnrage",
    hidden = true,
    color = 4,
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.Area] = true,
        [SkillType.Melee] = true,
        [SkillType.DamageOverTime] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        area = true,
        melee = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "base_physical_damage_to_deal_per_minute",
        "corrupted_blood_cleave_stacks_to_add",
        "attack_speed_+%",
        "is_area_damage",
    },
    levels = {
        [1] = {150, 4, -50, levelRequirement = 3, statInterpolation = {1, 1},  cost = { }, },
        [2] = {235, 4, -50, levelRequirement = 5, statInterpolation = {1, 1},  cost = { }, },
        [3] = {320, 5, -50, levelRequirement = 8, statInterpolation = {1, 1},  cost = { }, },
        [4] = {406, 5, -50, levelRequirement = 10, statInterpolation = {1, 1},  cost = { }, },
        [5] = {491, 6, -50, levelRequirement = 12, statInterpolation = {1, 1},  cost = { }, },
        [6] = {576, 6, -50, levelRequirement = 14, statInterpolation = {1, 1},  cost = { }, },
        [7] = {661, 7, -50, levelRequirement = 17, statInterpolation = {1, 1},  cost = { }, },
        [8] = {746, 7, -50, levelRequirement = 20, statInterpolation = {1, 1},  cost = { }, },
        [9] = {832, 8, -50, levelRequirement = 24, statInterpolation = {1, 1},  cost = { }, },
        [10] = {917, 8, -50, levelRequirement = 30, statInterpolation = {1, 1},  cost = { }, },
        [11] = {1002, 8, -50, levelRequirement = 31, statInterpolation = {1, 1},  cost = { }, },
        [12] = {1062, 8, -50, levelRequirement = 36, statInterpolation = {1, 1},  cost = { }, },
        [13] = {1458, 8, -50, levelRequirement = 41, statInterpolation = {1, 1},  cost = { }, },
        [14] = {1854, 8, -50, levelRequirement = 44, statInterpolation = {1, 1},  cost = { }, },
        [15] = {2250, 8, -50, levelRequirement = 51, statInterpolation = {1, 1},  cost = { }, },
        [16] = {2646, 8, -50, levelRequirement = 54, statInterpolation = {1, 1},  cost = { }, },
        [17] = {3345, 8, -50, levelRequirement = 57, statInterpolation = {1, 1},  cost = { }, },
        [18] = {4045, 8, -50, levelRequirement = 60, statInterpolation = {1, 1},  cost = { }, },
        [19] = {4744, 8, -50, levelRequirement = 65, statInterpolation = {1, 1},  cost = { }, },
        [20] = {5443, 8, -50, levelRequirement = 66, statInterpolation = {1, 1},  cost = { }, },
        [21] = {6142, 8, -50, levelRequirement = 67, statInterpolation = {1, 1},  cost = { }, },
        [22] = {6842, 8, -50, levelRequirement = 68, statInterpolation = {1, 1},  cost = { }, },
        [23] = {7541, 8, -50, levelRequirement = 69, statInterpolation = {1, 1},  cost = { }, },
        [24] = {8240, 8, -50, levelRequirement = 70, statInterpolation = {1, 1},  cost = { }, },
        [25] = {9049, 8, -50, levelRequirement = 71, statInterpolation = {1, 1},  cost = { }, },
        [26] = {9858, 8, -50, levelRequirement = 72, statInterpolation = {1, 1},  cost = { }, },
        [27] = {10666, 8, -50, levelRequirement = 73, statInterpolation = {1, 1},  cost = { }, },
        [28] = {11475, 8, -50, levelRequirement = 74, statInterpolation = {1, 1},  cost = { }, },
        [29] = {12284, 8, -50, levelRequirement = 75, statInterpolation = {1, 1},  cost = { }, },
        [30] = {13093, 8, -50, levelRequirement = 76, statInterpolation = {1, 1},  cost = { }, },
        [31] = {13901, 8, -50, levelRequirement = 77, statInterpolation = {1, 1},  cost = { }, },
        [32] = {14710, 8, -50, levelRequirement = 78, statInterpolation = {1, 1},  cost = { }, },
        [33] = {15519, 8, -50, levelRequirement = 79, statInterpolation = {1, 1},  cost = { }, },
        [34] = {16327, 8, -50, levelRequirement = 80, statInterpolation = {1, 1},  cost = { }, },
        [35] = {17136, 8, -50, levelRequirement = 81, statInterpolation = {1, 1},  cost = { }, },
        [36] = {17945, 8, -50, levelRequirement = 82, statInterpolation = {1, 1},  cost = { }, },
    },
}
몬스터가 주는 경험치 200% 증가
떨어지는 아이템 희귀도 % 증가
IdMonsterAtziriMapBoss
FamilyMonsterMapBoss
Domains몬스터 (3)
GenerationType고유 (3)
Req. level1
Stats
  • monster slain experience +% Min: 200 Max: 200 Global
  • monster dropped item rarity +% Min: 0 Max: 0 Global
  • monster base type attack cast speed +% and damage -% final [33]
    IdMonsterSpeedAndDamageFixupComplete
    FamilyMonsterSpeedAndDamageFixup
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • monster base type attack cast speed +% and damage -% final Min: 33 Max: 33 Global
  • Craft Tagscaster_damage damage attack caster speed
    동작 속도가 기본 수치 50% 밑으로 내려가지 않음
    IdCannotBeSlowedBelowValueBosses
    FamilyCannotBeSlowedBelowValue
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • hellscape boots action speed +% minimum value Min: -50 Max: -50 Global
  • Craft Tagsspeed
    monster penalty against minions damage +% final vs player minions [-25]
    IdMonsterDamageVersusPlayerMinions25
    FamilyMonsterDamageVersusMinions
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • monster penalty against minions damage +% final vs player minions Min: -25 Max: -25 Global
  • Craft Tagsdamage
    몬스터가 주는 경험치 100% 증가
    떨어지는 아이템 희귀도 15000% 증가
    IdMonsterMapBoss
    FamilyMonsterMapBoss
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • monster slain experience +% Min: 100 Max: 100 Global
  • monster dropped item rarity +% Min: 15000 Max: 15000 Global
  • cannot be stunned for ms after stun finished [2000]
    cannot be stunned while stunned [1]
    IdStunRepeatImmunityMapBoss_
    FamilyNothing
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • cannot be stunned while stunned Min: 1 Max: 1 Global
  • cannot be stunned for ms after stun finished Min: 2000 Max: 2000 Global
  • Edit

    Wikis Content is available under CC BY-NC-SA 3.0 unless otherwise noted.