# Sprint VIII, by st
#
# An extremely short and difficult survival challenge.
#
# Defeating the boss will place the orb underneath you.
# The boss arrives at turn 150.
{{

  crawl.set_max_runes(1)

  local bag_of_meat =
    "orc hp:400 hd:30 exp:9755 name:bag_of_meat n_rpl n_des n_spe n_zom " ..
    "col:red tile:mons_bag_of_meat generate_awake ; ring of slaying plus:30 " ..
    ". war axe plus:9 ego:none"

  local meat_berserker =
    "ogre hp:500 hd:50 exp:19495 name:meat_berserker n_rpl n_des n_spe n_zom " ..
    "always_corpse col:red tile:mons_meatzerker perm_ench:berserk generate_awake " ..
    "; ring of slaying plus:30 . battleaxe plus:9 ego:none"

  local tyrant =
    "lich hp:500 hd:35 exp:18691 name:tyrant n_rpl n_des n_spe n_zom " ..
    "never_corpse col:lightred generate_awake " ..
    "spells:haste.34.wizard;airstrike.17.wizard;" ..
           "summon_horrible_things.34.wizard"

  local meat_hydra =
    "eight-headed hydra hp:1000 hd:30 exp:18231 name:meat_hydra n_rpl n_des " ..
     "n_spe always_corpse col:lightred tile:mons_meat_hydra generate_awake " ..
     "spells:symbol_of_torment.80.natural " ..
     "dbname:meat_hydra"

  local dread =
    "wraith hp:500 hd:50 exp:40135 name:dread n_rpl n_des n_spe " ..
    "never_corpse generate_awake " ..
    "col:lightred spells:symbol_of_torment.34.natural;" ..
                        "hurl_damnation.33.natural;" ..
                        "call_down_damnation.33.natural"

  local large_bag =
    "two-headed ogre hp:400 hd:40 exp:18974 name:large_bag_of_meat n_rpl n_des " ..
    "n_spe n_zom  col:red tile:mons_large_bag_of_meat generate_awake perm_ench:inner_flame " ..
    "; ring of slaying plus:100 . giant spiked club plus:9 ego:none"

  local destroyer =
    "vampire knight hp:500 hd:40 exp:26057 name:destroyer n_rpl n_des n_spe " ..
    "never_corpse col:red tile:mons_destroyer generate_awake " ..
    "spells:blink_close.90.wizard " ..
    "; ring of slaying plus:200 . great sword plus:9 ego:heavy"

  local plague =
    "sea snake hp:500 hd:30 exp:7595 name:scourge n_rpl n_des n_spe " ..
    "never_corpse col:lightred tile:mons_scourge generate_awake " ..
    "spells:poison_arrow.27.natural;" ..
           "venom_bolt.27.natural;" ..
           "poisonous_cloud.27.natural"

  local sculptor =
    "skeletal warrior hp:500 hd:30 exp:8175 name:sculptor_of_flesh n_rpl " ..
    "n_des n_spe n_zom never_corpse col:red generate_awake " ..
    "; ring of slaying plus:250 . great sword plus:9 ego:none"

  local observer =
    "great orb of eyes hp:2000 hd:30 exp:37370 name:observer n_rpl n_des " ..
    "n_spe never_corpse col:red generate_awake " ..
    "spells:bolt_of_fire.16.natural;fireball.32.natural;" ..
           "smiting.32.natural " ..
    "perm_ench:invis perm_ench:haste"

  local accursed =
    "royal mummy hp:500 hd:40 exp:43230 name:accursed n_rpl n_des n_spe " ..
    "never_corpse col:red generate_awake " ..
    "spells:smiting.90.wizard"

  local meat_beast =
    "sin beast hp:1000 hd:40 exp:77316 name:meat_beast n_rpl n_des n_spe " ..
    "col:red generate_awake perm_ench:haste"

  local wretched_soul =
    "phantom hp:500 hd:50 exp:11916 name:wretched_soul n_rpl n_des n_spe " ..
    "never_corpse col:red generate_awake " ..
    "spells:bolt_of_draining.50.natural;dispel_undead_range.50.natural " ..
    "perm_ench:invis"

  local fleshlord =
    "hell knight hp:3000 hd:60 exp:204209 name:fleshlord n_rpl n_des n_spe never_corpse " ..
    "col:lightmagenta generate_awake " ..
    "spells:slow.55.wizard;haste.55.wizard " ..
    "; ring of slaying plus:400 . great mace plus:9 ego:none"

  local vile =
    "molten gargoyle hp:7000 hd:80 exp:1667630 name:vile n_rpl n_des n_spe never_corpse " ..
    "col:lightred generate_awake perm_ench:haste " ..
    "spells:dig.26.natural;confuse.52.natural;" ..
           "miasma_breath.26.natural;call_down_damnation.26.natural"

  -- Uniques --
  local servant =
    "harold hp:650 hd:40 exp:35261 name:The_Servant n_rpl col:yellow " ..
    "generate_awake never_corpse spells:none " ..
    "; ring of slaying plus:130 . glaive plus:9 ego:flaming"

  local captor =
    "sigmund hp:850 hd:40 exp:143519 name:The_Captor n_rpl col:lightcyan " ..
    "generate_awake never_corpse " ..
    "spells:sentinel's_mark.30.wizard;haste.30.wizard;ensnare.30.wizard " ..
    "; ring of slaying plus:200 . triple sword plus:9 ego:heavy"

  local defiler =
    "edmund hp:1000 hd:50 exp:67304 name:The_Defiler n_rpl col:white " ..
    "generate_awake never_corpse " ..
    "spells:fireball.60.natural;poisonous_cloud.20.natural " ..
    "; ring of slaying plus:250 . demon whip plus:9 ego:heavy . tower shield plus:12 ego:none"

  -- Meatlord shadow creatures will be tzitzimimeh
  local meatlord =
    "dispater hp:10000 hd:60 exp:1116161 name:The_Meatlord n_rpl col:lightmagenta tile:mons_meatlord " ..
    "generate_awake never_corpse " ..
    "spells:shadow_creatures.44.magical;airstrike.44.magical;conjure_ball_lightning.22.magical " ..
    "; ring of slaying plus:27000 . sceptre_of_torment"

  -- Unspeakable shadow creatures will be (a lot of) starcursed masses
  -- This is the secret boss.
  local avatar =
    "slime creature hp:10000 hd:100 exp:470129 name:The_Unspeakable " ..
    "n_rpl col:jewel tile:mons_unspeakable generate_awake perm_ench:haste " ..
    "spells:shadow_creatures.25.natural;airstrike.25.natural;smiting.25.natural"

  function blood_monster_definitions(e)
    e.kmons("1 = " .. bag_of_meat .. "")
    e.kmons("2 = " .. meat_berserker .. "")
    e.kmons("3 = " .. large_bag .. "")
    e.kmons("4 = " .. destroyer .. "")
    e.kmons("A = " .. servant .. "")
    e.kmons("B = " .. captor .. "")
    e.kmons("C = " .. defiler .. "")
    e.kmons("D = " .. meatlord .. "")
    e.kmons("E = " .. avatar .. "")
  end

  function weapon_creation(e)
    if you.get_base_mutation_level("no weapons or thrown items") == 1 then
      e.kitem("{ = ring of slaying plus:27000")
    else
      e.kitem("{ = axe_of_woe")
    end
  end

  local border_top =
    "------------------------------------------------------------------------------\n" ..
    "------------------------------------------------------------------------------\n"

  local border_bottom =
    "------------------------------------------------------------------------------\n" ..
    "------------------------------------------------------------------------------"

  function meatlord_stuff(data, triggerable, triggerer, marker, ev)
    local you_x, you_y = you.pos()

    if triggerer.type == "monster_dies" then
      crawl.more()
      crawl.mpr("<red>" .. border_top .. "" ..
      "--                    </red><lightred>You have destroyed The Meatlord.</lightred><red>                      --\n" ..
      "" .. border_bottom .. "</red>")
      crawl.more()
      crawl.mpr("<red>" .. border_top .. "" ..
      "--                        </red><lightred>You will die a champion.</lightred><red>                          --\n" ..
      "" .. border_bottom .. "</red>")
      crawl.more()
      crawl.mpr("The Orb of Zot has appeared underneath you.", "orb")
      dgn.create_item(you_x, you_y, "orb of zot")
      crawl.more()
      return
    end
  end

  function unspeakable_stuff(data, triggerable, triggerer, marker, ev)
    local you_x, you_y = you.pos()

    if triggerer.type == "monster_dies" then
      crawl.more()
      crawl.mpr("<red>" .. border_top .. "" ..
      "--                    </red><lightred>You have destroyed The Unspeakable.</lightred><red>                   --\n" ..
      "" .. border_bottom .. "</red>")
      crawl.more()
      crawl.mpr("<lightgreen>The slimy rune of Zot has appeared underneath you.</lightgreen>")
      dgn.create_item(you_x, you_y, "slimy rune of zot")
      return
    end
  end

  function create_and_tele(x, y, spec)
    -- TODO: could we do away with the secret placement room altogether?
    m = dgn.create_monster(x, y, spec)
    if m then
      m.random_teleport()
    end
    return m
  end

  function blood_spawns(data, triggerable, triggerer, marker, ev)
    local phase
    if triggerer.type == "turn" then

    data.spawn_count = data.spawn_count + 1

    if data.spawn_count < 20 then      -- turns 01 - 19
      phase =
      "" .. bag_of_meat .. " / " .. meat_berserker .. ""
    elseif data.spawn_count < 30 then  -- turns 20 - 29
      phase =
      "" .. destroyer .. " / " .. large_bag .. ""
    elseif data.spawn_count < 31 then  -- turns 30
      phase =
      "" .. meat_hydra .. ""
    elseif data.spawn_count < 45 then  -- turns 31 - 44
      phase =
      "" .. sculptor .. " / " .. destroyer .. ""
    elseif data.spawn_count < 60 then  -- turns 45 - 59
      phase =
      "" .. tyrant .. " / " .. accursed .. " / " .. meat_berserker .. " w:5"
    elseif data.spawn_count < 75 then  -- turns 60 - 74
      phase =
      "" .. dread .. " / " .. meat_beast .. " / " .. meat_berserker .. " w:5"
    elseif data.spawn_count < 90 then  -- turns 74 - 89
      phase =
      "" .. wretched_soul .. " / " .. meat_hydra .. " w:5 / " .. meat_beast .. " w:5"
    elseif data.spawn_count < 105 then  -- turns 90 - 104
      phase =
      "" .. observer .. " / " .. tyrant .. " w:5 / " .. accursed .. " w:5"
    elseif data.spawn_count < 120 then  -- turns 105 - 119
      phase =
      "" .. plague .. " / " .. dread .. " w:5 / " .. meat_hydra .. " w:5"
    elseif data.spawn_count < 135 then  -- turns 120 - 134
      phase =
      "" .. fleshlord .. ""
    elseif data.spawn_count < 170 then  -- turns 135 - 169
      phase =
      "" .. meat_berserker .. " / " .. destroyer .. " / " .. meat_beast .. " / "
      .. fleshlord .. " / " .. dread .. " / " .. meat_hydra .. " / "
      .. observer .. " / " .. plague .. " / " .. sculptor .. " / "
      .. wretched_soul .. ""
    elseif data.spawn_count < 210 then  -- turns 170 - 209
      phase =
      "" .. fleshlord .. " / " .. dread .. " / " .. meat_hydra .. " / "
      .. observer .. " / " .. plague .. " / "
      .. wretched_soul .. ""
    elseif data.spawn_count < 265 then  -- turns 210 - 264
      phase =
      "" .. fleshlord .. " / " .. dread .. " / " .. meat_hydra .. " / "
      .. observer .. " / " .. plague .. " / "
      .. wretched_soul .. " / " .. vile .. " w:25"
    elseif data.spawn_count >= 265 then  -- turns 265 on
      phase =
      "" .. vile .. ""
    end

    -- here is a representative sample of what this spawn pattern generates with
    -- two spawns per turn by turn 150:
    --
    -- Monsters: The Meatlord, 25 meat beasts, The Captor, The Defiler, The Servant,
    -- 20 eight-headed meat hydras, 23 observers, 13 tyrants, 16 accurseds, 67 meat
    -- berserkers, 17 large bags of meat, 16 scourges, 33 destroyers, 13 wretched
    -- souls, 20 dreads, 161 bags of meat, 36 fleshlords, and 16 sculptors of flesh.
    -- 480 monsters, 35685031 total exp value (33124737 non-uniq)

    create_and_tele(39, 63, phase)
    create_and_tele(41, 63, phase)

    -- this isn't in order to spawn anything, it's to set the monster list for
    -- shadow creatures.
    if you.turns() < 230 then
    dgn.set_random_mon_list("tzitzimitl / nothing")
    else
    dgn.set_random_mon_list("starcursed mass")
    end

    if data.spawn_count == 30 then
      create_and_tele(33, 63, servant)
    elseif data.spawn_count == 60 then
      create_and_tele(33, 63, captor)
    elseif data.spawn_count == 100 then
      create_and_tele(33, 63, defiler)
    elseif data.spawn_count == 150 then
      local m_x, m_y = marker:pos()
      local mons = dgn.mons_at(m_x, m_y)
        if mons then
          mons.dismiss()
        end
          dgn.create_monster(m_x, m_y, meatlord)
          crawl.more()
          crawl.mpr("<red>" .. border_top .. "" ..
          "--                      </red><lightred>The Meatlord has descended...</lightred><red>                       --\n" ..
          "" .. border_bottom .. "</red>")
          crawl.more()
    elseif data.spawn_count == 300 then
      create_and_tele(33, 63, avatar)
      -- No message for the Unspeakable.
    end
    end
  end

function meatsprint_score (won)
    local time = you.turns()
    local score = time * 100000

    if won then
        score = score * 2
    end

    return score, false
end

}}
NAME:      meatsprint
TAGS:      sprint no_rotate no_hmirror no_vmirror
TAGS:      no_item_gen no_trap_gen no_pool_fixup
ORIENT:    encompass
DESC:      Sprint VIII: "Arena of Blood"
ORDER:     8
KFEAT:     { = {
KFEAT:     J = x
LROCKCOL:  red
LFLOORCOL: red
NSUBST:    ' = 1:& / *:.
{{

  dgn.persist.calc_score = global_function("meatsprint_score");

  local meatlord_marker = TriggerableFunction:new {
    func = "meatlord_stuff",
    repeated = true
    }

  meatlord_marker:add_triggerer(DgnTriggerer:new {
    type="monster_dies",
    target = "The Meatlord"
    })
  lua_marker("{", meatlord_marker)

  local secret_marker = TriggerableFunction:new {
    func = "unspeakable_stuff",
    repeated = true
    }

  secret_marker:add_triggerer(DgnTriggerer:new {
    type="monster_dies",
    target = "The Unspeakable"
    })
  lua_marker("J", secret_marker)

  local spawn_marker = TriggerableFunction:new {
    func = "blood_spawns",
    repeated = true,
    data = { spawn_count = 0 }
    }
  spawn_marker:add_triggerer(DgnTriggerer:new {
    type="turn",
    delay_min=10,
    delay_max=10
    })

  lua_marker("&", spawn_marker)

  crawl.more()
  crawl.mpr("<red>" ..
-----11------------------------------------@@------------------------------------11
    "------------------------------------------------------------------------------\n" ..
    "------------------------------------------------------------------------------\n" ..
    "--                                                                          --\n" ..
    "--                            The Arena Of Blood                            --\n" ..
    "--                                                                          --\n" ..
    "--                                                                          --" ..
    "</red>")
  crawl.more()
  crawl.mpr("<red>" ..
    "--                                                                          --\n" ..
    "--                You descend into the pit of gibs and meat,                --\n" ..
    "--                    The sunken abyss of the depraved,                     --\n" ..
    "--                       The mill of turgid gutspawn.                       --\n" ..
    "--                The writhen instruments serve in adoration,               --\n" ..
    "--                     Immured beneath a rotten throne.                     --" ..
    "</red>")
  crawl.more()
  crawl.mpr("<red>" ..
    "--                                                                          --\n" ..
    "--                  Before you lies the servitor of chaos,                  --\n" ..
    "--                           The cleaver,                                   --\n" ..
    "--                             The blasphemer,                              --\n" ..
    "--                              The destroyer,                              --\n" ..
    "--                               The Axe of Woe.                            --" ..
    "</red>")
  crawl.more()
  crawl.mpr("<red>" ..
    "--                                                                          --\n" ..
    "--                            Vessel of Makhleb,                            --\n" ..
    "--                           You are the unmaker,                           --\n" ..
    "--                          You bring the rapture,                          --\n" ..
    "--                     The murmurs of the thralls rise...                   --\n" ..
    "--                       The theatre of blood begins.                       --\n" ..
    "--                                                                          --\n" ..
    "------------------------------------------------------------------------------\n" ..
    "------------------------------------------------------------------------------" ..
    "</red>")

}}
KITEM:     + = ring of see invisible
KITEM:     * = ring of protection from fire
SUBST:     1 = 1.
KPROP:     - = no_tele_into
KFEAT:     _ = altar_makhleb
KFEAT:     x = rock_wall
COLOUR:    x = red
COLOUR:    X = magenta
TILE:      x = wall_hell
TILE:      X = wall_crucible
FTILE:     1234x+'*&J = floor_demonic_red
: set_feature_name("permarock_wall", "unnaturally hard bloodstone wall")
: blood_monster_definitions(_G)
: weapon_creation(_G)
MAP
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxx3111111+1111113xxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxx111111111111111111111xxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxx1111111111xx1xx1xxxxx111111xxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxx21111111..................1111111xxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxx11111....xxxx.....xx.xx............1121xxxxxxxxxxxXXXXX
XXXXxxxxxxxx2211111....x...........................111122xxxxxxxxXXXXX
XXXXxxxxxxxx221111......x.........1x.x.......x......11122xxxxxxxxXXXXX
XXXXxxxxxxxx1111........x..................xxxx.....11111xxxxxxxxXXXXX
XXXXxxxxxxxx111....xxx...x..........................11111xxxxxxxxXXXXX
XXXXxxxxxxxx11...xxx......x.......................x....11xxxxxxxxXXXXX
XXXXxxxxxxxx11..x...............'''''..................11xxxxxxxxXXXXX
XXXXxxxxxxxx11......x..........'''''''............x....11xxxxxxxxXXXXX
XXXXxxxxxxxx11.......x......11x'''''''x11..............11xxxxxxxxXXXXX
XXXXxxxxxxxx41..........x...11x'''''''x11.........xx...14xxxxxxxxXXXXX
XXXXxxxxxxxx11.......x......xxx'''''''xxx..............11xxxxxxxxXXXXX
XXXXxxxxxxxx11..x..........'''''.xxx.'''''.......xxx2..11xxxxxxxxXXXXX
XXXXxxxxxxxx111.xx.......x'''''..._...'''''............11xxxxxxxxXXXXX
XXXXxxxxxxxx11.1.x.....x..'''''x.....x'''''..x.x.......11xxxxxxxxXXXXX
XXXXxxxxxxxx*1.1.2xxx.....'''''x_.{._x'''''...........11*xxxxxxxxXXXXX
XXXXxxxxxxxx11.1.xx....x..'''''x.....x'''''.x.x.x....1111xxxxxxxxXXXXX
XXXXxxxxxxxx11.1x........x'''''..._...'''''............11xxxxxxxxXXXXX
XXXXxxxxxxxx11..x..........'''''.xxx.'''''...x.x.x..x..11xxxxxxxxXXXXX
XXXXxxxxxxxx11..............xxx'''''''xxx..........x...11xxxxxxxxXXXXX
XXXXxxxxxxxx41..............11x'''''''x11...........x..14xxxxxxxxXXXXX
XXXXxxxxxxxx11..............11x'''''''x11..........x...11xxxxxxxxXXXXX
XXXXxxxxxxxx11.......x.........'''''''.................11xxxxxxxxXXXXX
XXXXxxxxxxxx11......x.x.x.......'''''.....x...x......xx11xxxxxxxxXXXXX
XXXXxxxxxxxx11.......x.x.................x....x.....xx.11xxxxxxxxXXXXX
XXXXxxxxxxxx11xxx...x.x.x..............xx.....x.....x2221xxxxxxxxXXXXX
XXXXxxxxxxxx1122xx...x.x.....x........x......x....xx22211xxxxxxxxXXXXX
XXXXxxxxxxxx11122x....................x...xxx....x1111111xxxxxxxxXXXXX
XXXXxxxxxxxx3111111xx.......xx.x...............x111111113xxxxxxxxXXXXX
XXXXxxxxxxxxxxx11111xx.......................111111111xxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxx211111xxxx....x.....xxxx111111112xxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxx1111111............x1111111xxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxx111111.........111111xxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxx3111111+1111113xxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX-------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX-------------XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXJXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ENDMAP
