diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm
index 88b4969e8e..8cb372b0c1 100644
--- a/code/modules/power/antimatter/containment_jar.dm
+++ b/code/modules/power/antimatter/containment_jar.dm
@@ -15,27 +15,27 @@
var/stability = 100//TODO: add all the stability things to this so its not very safe if you keep hitting in on things
- ex_act(severity)
- switch(severity)
- if(1.0)
- explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess
+/obj/item/weapon/am_containment/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess
+ if(src)
+ del(src)
+ return
+ if(2.0)
+ if(prob((fuel/10)-stability))
+ explosion(get_turf(src), 1, 2, 3, 5)
if(src)
del(src)
return
- if(2.0)
- if(prob((fuel/10)-stability))
- explosion(get_turf(src), 1, 2, 3, 5)
- if(src)
- del(src)
- return
- stability -= 40
- if(3.0)
- stability -= 20
- //check_stability()
- return
+ stability -= 40
+ if(3.0)
+ stability -= 20
+ //check_stability()
+ return
- proc/usefuel(var/wanted)
- if(fuel < wanted)
- wanted = fuel
- fuel -= wanted
- return wanted
\ No newline at end of file
+/obj/item/weapon/am_containment/proc/usefuel(var/wanted)
+ if(fuel < wanted)
+ wanted = fuel
+ fuel -= wanted
+ return wanted
\ No newline at end of file
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index 39e2320a50..b50c405f4e 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -29,311 +29,311 @@
var/stored_power = 0//Power to deploy per tick
- New()
- ..()
- linked_shielding = list()
- linked_cores = list()
+/obj/machinery/power/am_control_unit/New()
+ ..()
+ linked_shielding = list()
+ linked_cores = list()
- Del()//Perhaps damage and run stability checks rather than just del on the others
+/obj/machinery/power/am_control_unit/Del()//Perhaps damage and run stability checks rather than just del on the others
+ for(var/obj/machinery/am_shielding/AMS in linked_shielding)
+ del(AMS)
+ ..()
+
+
+/obj/machinery/power/am_control_unit/process()
+ if(exploding)
+ explosion(get_turf(src),8,12,18,12)
+ if(src) del(src)
+
+ if(update_shield_icons && !shield_icon_delay)
+ check_shield_icons()
+ update_shield_icons = 0
+
+ if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power
+ return
+
+ if(!fueljar)//No fuel but we are on, shutdown
+ toggle_power()
+ //Angry buzz or such here
+ return
+
+ add_avail(stored_power)
+
+ power_cycle++
+ if(power_cycle >= power_cycle_delay)
+ produce_power()
+ power_cycle = 0
+
+ return
+
+
+/obj/machinery/power/am_control_unit/proc/produce_power()
+ playsound(src.loc, 'bang.ogg', 25, 1)
+ var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with
+ if(core_power <= 0) return 0//Something is wrong
+ var/core_damage = 0
+ var/fuel = fueljar.usefuel(fuel_injection)
+
+ stored_power = (fuel/core_power)*fuel*200000
+ //Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea
+ if(fuel > (2*core_power))//More fuel has been put in than the current cores can deal with
+ if(prob(50))core_damage = 1//Small chance of damage
+ if((fuel-core_power) > 5) core_damage = 5//Now its really starting to overload the cores
+ if((fuel-core_power) > 10) core_damage = 20//Welp now you did it, they wont stand much of this
+ if(core_damage == 0) return
+ for(var/obj/machinery/am_shielding/AMS in linked_cores)
+ AMS.stability -= core_damage
+ AMS.check_stability(1)
+ playsound(src.loc, 'bang.ogg', 50, 1)
+ return
+
+
+/obj/machinery/power/am_control_unit/emp_act(severity)
+ switch(severity)
+ if(1)
+ if(active) toggle_power()
+ stability -= rand(15,30)
+ if(2)
+ if(active) toggle_power()
+ stability -= rand(10,20)
+ ..()
+ return 0
+
+
+/obj/machinery/power/am_control_unit/blob_act()
+ stability -= 20
+ if(prob(100-stability))//Might infect the rest of the machine
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
- del(AMS)
- ..()
-
-
- process()
- if(exploding)
- explosion(get_turf(src),8,12,18,12)
- if(src) del(src)
-
- if(update_shield_icons && !shield_icon_delay)
- check_shield_icons()
- update_shield_icons = 0
-
- if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power
- return
-
- if(!fueljar)//No fuel but we are on, shutdown
- toggle_power()
- //Angry buzz or such here
- return
-
- add_avail(stored_power)
-
- power_cycle++
- if(power_cycle >= power_cycle_delay)
- produce_power()
- power_cycle = 0
-
- return
-
-
- proc/produce_power()
- playsound(src.loc, 'bang.ogg', 25, 1)
- var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with
- if(core_power <= 0) return 0//Something is wrong
- var/core_damage = 0
- var/fuel = fueljar.usefuel(fuel_injection)
-
- stored_power = (fuel/core_power)*fuel*200000
- //Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea
- if(fuel > (2*core_power))//More fuel has been put in than the current cores can deal with
- if(prob(50))core_damage = 1//Small chance of damage
- if((fuel-core_power) > 5) core_damage = 5//Now its really starting to overload the cores
- if((fuel-core_power) > 10) core_damage = 20//Welp now you did it, they wont stand much of this
- if(core_damage == 0) return
- for(var/obj/machinery/am_shielding/AMS in linked_cores)
- AMS.stability -= core_damage
- AMS.check_stability(1)
- playsound(src.loc, 'bang.ogg', 50, 1)
- return
-
-
- emp_act(severity)
- switch(severity)
- if(1)
- if(active) toggle_power()
- stability -= rand(15,30)
- if(2)
- if(active) toggle_power()
- stability -= rand(10,20)
- ..()
- return 0
-
-
- blob_act()
- stability -= 20
- if(prob(100-stability))//Might infect the rest of the machine
- for(var/obj/machinery/am_shielding/AMS in linked_shielding)
- AMS.blob_act()
- spawn(0)
- //Likely explode
- del(src)
- return
- check_stability()
- return
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- stability -= 60
- if(2.0)
- stability -= 40
- if(3.0)
- stability -= 20
- check_stability()
- return
-
-
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.flag != "bullet")
- stability -= Proj.force
- return 0
-
-
- power_change()
- ..()
- if(stat & NOPOWER && active)
- toggle_power()
- return
-
-
- update_icon()
- if(active) icon_state = "control_on"
- else icon_state = "control"
- //No other icons for it atm
-
-
- attackby(obj/item/W, mob/user)
- if(!istype(W) || !user) return
- if(istype(W, /obj/item/weapon/wrench))
- if(!anchored)
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secures the [src.name] to the floor.", \
- "You secure the anchor bolts to the floor.", \
- "You hear a ratchet")
- src.anchored = 1
- connect_to_network()
- else if(!linked_shielding.len > 0)
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecures the [src.name].", \
- "You remove the anchor bolts.", \
- "You hear a ratchet")
- src.anchored = 0
- disconnect_from_network()
- else
- user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!"
- return
-
- if(istype(W, /obj/item/weapon/am_containment))
- if(fueljar)
- user << "\red There is already a [fueljar] inside!"
- return
- fueljar = W
- W.loc = src
- if(user.client)
- user.client.screen -= W
- user.u_equip(W)
- user.update_icons()
- user.visible_message("[user.name] loads an [W.name] into the [src.name].", \
- "You load an [W.name].", \
- "You hear a thunk.")
- return
-
- if(W.force >= 20)
- stability -= W.force/2
- check_stability()
- ..()
- return
-
-
- attack_hand(mob/user as mob)
- if(anchored)
- interact(user)
- return
-
-
- proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0)
- if(!istype(AMS)) return 0
- if(!anchored) return 0
- if(!AMS_linking && !AMS.link_control(src)) return 0
- linked_shielding.Add(AMS)
- update_shield_icons = 1
- return 1
-
-
- proc/remove_shielding(var/obj/machinery/am_shielding/AMS)
- if(!istype(AMS)) return 0
- linked_shielding.Remove(AMS)
- update_shield_icons = 2
- if(active) toggle_power()
- return 1
-
-
- proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced
- if(stability <= 0)
+ AMS.blob_act()
+ spawn(0)
+ //Likely explode
del(src)
return
+ check_stability()
+ return
- proc/toggle_power()
- active = !active
- if(active)
- use_power = 2
- visible_message("The [src.name] starts up.")
+/obj/machinery/power/am_control_unit/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ stability -= 60
+ if(2.0)
+ stability -= 40
+ if(3.0)
+ stability -= 20
+ check_stability()
+ return
+
+
+/obj/machinery/power/am_control_unit/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.flag != "bullet")
+ stability -= Proj.force
+ return 0
+
+
+/obj/machinery/power/am_control_unit/power_change()
+ ..()
+ if(stat & NOPOWER && active)
+ toggle_power()
+ return
+
+
+/obj/machinery/power/am_control_unit/update_icon()
+ if(active) icon_state = "control_on"
+ else icon_state = "control"
+ //No other icons for it atm
+
+
+/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user)
+ if(!istype(W) || !user) return
+ if(istype(W, /obj/item/weapon/wrench))
+ if(!anchored)
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures the [src.name] to the floor.", \
+ "You secure the anchor bolts to the floor.", \
+ "You hear a ratchet")
+ src.anchored = 1
+ connect_to_network()
+ else if(!linked_shielding.len > 0)
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures the [src.name].", \
+ "You remove the anchor bolts.", \
+ "You hear a ratchet")
+ src.anchored = 0
+ disconnect_from_network()
else
- use_power = 1
- visible_message("The [src.name] shuts down.")
- update_icon()
+ user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!"
return
-
- proc/check_shield_icons()//Forces icon_update for all shields
- if(shield_icon_delay) return
- shield_icon_delay = 1
- if(update_shield_icons == 2)//2 means to clear everything and rebuild
- for(var/obj/machinery/am_shielding/AMS in linked_shielding)
- if(AMS.processing) AMS.shutdown_core()
- AMS.control_unit = null
- spawn(10)
- AMS.controllerscan()
- linked_shielding = list()
-
- else
- for(var/obj/machinery/am_shielding/AMS in linked_shielding)
- AMS.update_icon()
- spawn(20)
- shield_icon_delay = 0
- return
-
-
- proc/check_core_stability()
- if(stored_core_stability_delay || linked_cores.len <= 0) return
- stored_core_stability_delay = 1
- stored_core_stability = 0
- for(var/obj/machinery/am_shielding/AMS in linked_cores)
- stored_core_stability += AMS.stability
- stored_core_stability/=linked_cores.len
- spawn(40)
- stored_core_stability_delay = 0
- return
-
-
- proc/interact(mob/user)
- if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
- if(!istype(user, /mob/living/silicon/ai))
- user.machine = null
- user << browse(null, "window=AMcontrol")
- return
- user.machine = src
-
- var/dat = ""
- dat += "AntiMatter Control Panel
"
- dat += "Close
"
- dat += "Refresh
"
- dat += "Force Shielding Update
"
- dat += "Status: [(active?"Injecting":"Standby")]
"
- dat += "Toggle Status
"
-
- dat += "Stability: [stability]%
"
- dat += "Reactor parts: [linked_shielding.len]
"//TODO: perhaps add some sort of stability check
- dat += "Cores: [linked_cores.len]
"
- dat += "-Current Efficiency: [reported_core_efficiency]
"
- dat += "-Average Stability: [stored_core_stability] (update)
"
- dat += "Last Produced: [stored_power]
"
-
- dat += "Fuel: "
- if(!fueljar)
- dat += "
No fuel receptacle detected."
- else
- dat += "Eject
"
- dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units
"
-
- dat += "- Injecting: [fuel_injection] units
"
- dat += "- --|++
"
-
-
- user << browse(dat, "window=AMcontrol;size=420x500")
- onclose(user, "AMcontrol")
- return
-
-
- Topic(href, href_list)
- ..()
- //Ignore input if we are broken or guy is not touching us, AI can control from a ways away
- if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon/ai)))
- usr.machine = null
- usr << browse(null, "window=AMcontrol")
+ if(istype(W, /obj/item/weapon/am_containment))
+ if(fueljar)
+ user << "\red There is already a [fueljar] inside!"
return
+ fueljar = W
+ W.loc = src
+ if(user.client)
+ user.client.screen -= W
+ user.u_equip(W)
+ user.update_icons()
+ user.visible_message("[user.name] loads an [W.name] into the [src.name].", \
+ "You load an [W.name].", \
+ "You hear a thunk.")
+ return
- if(href_list["close"])
- usr << browse(null, "window=AMcontrol")
- usr.machine = null
+ if(W.force >= 20)
+ stability -= W.force/2
+ check_stability()
+ ..()
+ return
+
+
+/obj/machinery/power/am_control_unit/attack_hand(mob/user as mob)
+ if(anchored)
+ interact(user)
+ return
+
+
+/obj/machinery/power/am_control_unit/proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0)
+ if(!istype(AMS)) return 0
+ if(!anchored) return 0
+ if(!AMS_linking && !AMS.link_control(src)) return 0
+ linked_shielding.Add(AMS)
+ update_shield_icons = 1
+ return 1
+
+
+/obj/machinery/power/am_control_unit/proc/remove_shielding(var/obj/machinery/am_shielding/AMS)
+ if(!istype(AMS)) return 0
+ linked_shielding.Remove(AMS)
+ update_shield_icons = 2
+ if(active) toggle_power()
+ return 1
+
+
+/obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced
+ if(stability <= 0)
+ del(src)
+ return
+
+
+/obj/machinery/power/am_control_unit/proc/toggle_power()
+ active = !active
+ if(active)
+ use_power = 2
+ visible_message("The [src.name] starts up.")
+ else
+ use_power = 1
+ visible_message("The [src.name] shuts down.")
+ update_icon()
+ return
+
+
+/obj/machinery/power/am_control_unit/proc/check_shield_icons()//Forces icon_update for all shields
+ if(shield_icon_delay) return
+ shield_icon_delay = 1
+ if(update_shield_icons == 2)//2 means to clear everything and rebuild
+ for(var/obj/machinery/am_shielding/AMS in linked_shielding)
+ if(AMS.processing) AMS.shutdown_core()
+ AMS.control_unit = null
+ spawn(10)
+ AMS.controllerscan()
+ linked_shielding = list()
+
+ else
+ for(var/obj/machinery/am_shielding/AMS in linked_shielding)
+ AMS.update_icon()
+ spawn(20)
+ shield_icon_delay = 0
+ return
+
+
+/obj/machinery/power/am_control_unit/proc/check_core_stability()
+ if(stored_core_stability_delay || linked_cores.len <= 0) return
+ stored_core_stability_delay = 1
+ stored_core_stability = 0
+ for(var/obj/machinery/am_shielding/AMS in linked_cores)
+ stored_core_stability += AMS.stability
+ stored_core_stability/=linked_cores.len
+ spawn(40)
+ stored_core_stability_delay = 0
+ return
+
+
+/obj/machinery/power/am_control_unit/proc/interact(mob/user)
+ if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
+ if(!istype(user, /mob/living/silicon/ai))
+ user.machine = null
+ user << browse(null, "window=AMcontrol")
return
+ user.machine = src
- if(href_list["togglestatus"])
- toggle_power()
+ var/dat = ""
+ dat += "AntiMatter Control Panel
"
+ dat += "Close
"
+ dat += "Refresh
"
+ dat += "Force Shielding Update
"
+ dat += "Status: [(active?"Injecting":"Standby")]
"
+ dat += "Toggle Status
"
- if(href_list["refreshicons"])
- update_shield_icons = 1
+ dat += "Stability: [stability]%
"
+ dat += "Reactor parts: [linked_shielding.len]
"//TODO: perhaps add some sort of stability check
+ dat += "Cores: [linked_cores.len]
"
+ dat += "-Current Efficiency: [reported_core_efficiency]
"
+ dat += "-Average Stability: [stored_core_stability] (update)
"
+ dat += "Last Produced: [stored_power]
"
- if(href_list["ejectjar"])
- if(fueljar)
- fueljar.loc = src.loc
- fueljar = null
- //fueljar.control_unit = null currently it does not care where it is
- //update_icon() when we have the icon for it
+ dat += "Fuel: "
+ if(!fueljar)
+ dat += "
No fuel receptacle detected."
+ else
+ dat += "Eject
"
+ dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units
"
- if(href_list["strengthup"])
- fuel_injection++
+ dat += "- Injecting: [fuel_injection] units
"
+ dat += "- --|++
"
- if(href_list["strengthdown"])
- fuel_injection--
- if(fuel_injection < 0) fuel_injection = 0
- if(href_list["refreshstability"])
- check_core_stability()
+ user << browse(dat, "window=AMcontrol;size=420x500")
+ onclose(user, "AMcontrol")
+ return
- updateDialog()
- return
\ No newline at end of file
+
+/obj/machinery/power/am_control_unit/Topic(href, href_list)
+ ..()
+ //Ignore input if we are broken or guy is not touching us, AI can control from a ways away
+ if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon/ai)))
+ usr.machine = null
+ usr << browse(null, "window=AMcontrol")
+ return
+
+ if(href_list["close"])
+ usr << browse(null, "window=AMcontrol")
+ usr.machine = null
+ return
+
+ if(href_list["togglestatus"])
+ toggle_power()
+
+ if(href_list["refreshicons"])
+ update_shield_icons = 1
+
+ if(href_list["ejectjar"])
+ if(fueljar)
+ fueljar.loc = src.loc
+ fueljar = null
+ //fueljar.control_unit = null currently it does not care where it is
+ //update_icon() when we have the icon for it
+
+ if(href_list["strengthup"])
+ fuel_injection++
+
+ if(href_list["strengthdown"])
+ fuel_injection--
+ if(fuel_injection < 0) fuel_injection = 0
+
+ if(href_list["refreshstability"])
+ check_core_stability()
+
+ updateDialog()
+ return
\ No newline at end of file
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index fd98a140b7..ffc0cd5130 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -26,177 +26,177 @@ proc/cardinalrange(var/center)
var/efficiency = 1//How many cores this core counts for when doing power processing, plasma in the air and stability could affect this
- New(loc)
- ..(loc)
- spawn(10)
- controllerscan()
+/obj/machinery/am_shielding/New(loc)
+ ..(loc)
+ spawn(10)
+ controllerscan()
+ return
+
+
+/obj/machinery/am_shielding/proc/controllerscan(var/priorscan = 0)
+ //Make sure we are the only one here
+ if(!istype(src.loc, /turf))
+ del(src)
+ return
+ for(var/obj/machinery/am_shielding/AMS in loc.contents)
+ if(AMS == src) continue
+ spawn(0)
+ del(src)
return
+ //Search for shielding first
+ for(var/obj/machinery/am_shielding/AMS in cardinalrange(src))
+ if(AMS && AMS.control_unit && link_control(AMS.control_unit))
+ break
- proc/controllerscan(var/priorscan = 0)
- //Make sure we are the only one here
- if(!istype(src.loc, /turf))
- del(src)
- return
- for(var/obj/machinery/am_shielding/AMS in loc.contents)
- if(AMS == src) continue
- spawn(0)
- del(src)
- return
-
- //Search for shielding first
- for(var/obj/machinery/am_shielding/AMS in cardinalrange(src))
- if(AMS && AMS.control_unit && link_control(AMS.control_unit))
+ if(!control_unit)//No other guys nearby look for a control unit
+ for(var/direction in cardinal)
+ for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src))
+ if(AMC.add_shielding(src))
break
- if(!control_unit)//No other guys nearby look for a control unit
- for(var/direction in cardinal)
- for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src))
- if(AMC.add_shielding(src))
- break
-
- if(!control_unit)
- if(!priorscan)
- spawn(20)
- controllerscan(1)//Last chance
- return
- spawn(0)
- del(src)
- return
-
-
- Del()
- if(control_unit) control_unit.remove_shielding(src)
- if(processing) shutdown_core()
- visible_message("\red The [src.name] melts!")
- //Might want to have it leave a mess on the floor but no sprites for now
- ..()
- return
-
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
- return 0
-
-
- process()
- if(!processing) ..()
- //TODO: core functions and stability
- //TODO: think about checking the airmix for plasma and increasing power output
- return
-
-
- emp_act()//Immune due to not really much in the way of electronics.
- return 0
-
-
- blob_act()
- stability -= 20
- if(prob(100-stability))
- if(prob(10))//Might create a node
- new /obj/effect/blob/node(src.loc,150)
- else
- new /obj/effect/blob(src.loc,60)
- spawn(0)
- del(src)
+ if(!control_unit)
+ if(!priorscan)
+ spawn(20)
+ controllerscan(1)//Last chance
return
- check_stability()
- return
+ spawn(0)
+ del(src)
+ return
- ex_act(severity)
- switch(severity)
- if(1.0)
- stability -= 80
- if(2.0)
- stability -= 40
- if(3.0)
- stability -= 20
- check_stability()
- return
+/obj/machinery/am_shielding/Del()
+ if(control_unit) control_unit.remove_shielding(src)
+ if(processing) shutdown_core()
+ visible_message("\red The [src.name] melts!")
+ //Might want to have it leave a mess on the floor but no sprites for now
+ ..()
+ return
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.flag != "bullet")
- stability -= Proj.force/2
- return 0
+/obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group || (height==0)) return 1
+ return 0
- update_icon()
- overlays = null
- for(var/direction in alldirs)
- var/machine = locate(/obj/machinery, get_step(loc, direction))
- if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit))
- overlays += "shield_[direction]"
-
- if(core_check())
- overlays += "core"
- if(!processing) setup_core()
- else if(processing) shutdown_core()
+/obj/machinery/am_shielding/process()
+ if(!processing) ..()
+ //TODO: core functions and stability
+ //TODO: think about checking the airmix for plasma and increasing power output
+ return
- attackby(obj/item/W, mob/user)
- if(!istype(W) || !user) return
- if(W.force > 10)
- stability -= W.force/2
- check_stability()
- ..()
- return
+/obj/machinery/am_shielding/emp_act()//Immune due to not really much in the way of electronics.
+ return 0
-
- //Call this to link a detected shilding unit to the controller
- proc/link_control(var/obj/machinery/power/am_control_unit/AMC)
- if(!istype(AMC)) return 0
- if(control_unit && control_unit != AMC) return 0//Already have one
- control_unit = AMC
- control_unit.add_shielding(src,1)
- return 1
-
-
- //Scans cards for shields or the control unit and if all there it
- proc/core_check()
- for(var/direction in alldirs)
- var/machine = locate(/obj/machinery, get_step(loc, direction))
- if(!machine) return 0//Need all for a core
- if(!istype(machine, /obj/machinery/am_shielding) && !istype(machine, /obj/machinery/power/am_control_unit)) return 0
- return 1
-
-
- proc/setup_core()
- processing = 1
- machines.Add(src)
- if(!control_unit) return
- control_unit.linked_cores.Add(src)
- control_unit.reported_core_efficiency += efficiency
- return
-
-
- proc/shutdown_core()
- processing = 0
- machines.Remove(src)
- if(!control_unit) return
- control_unit.linked_cores.Remove(src)
- control_unit.reported_core_efficiency -= efficiency
- return
-
-
- proc/check_stability(var/injecting_fuel = 0)
- if(stability > 0) return
- if(injecting_fuel && control_unit)
- control_unit.exploding = 1
- if(src)
+/obj/machinery/am_shielding/blob_act()
+ stability -= 20
+ if(prob(100-stability))
+ if(prob(10))//Might create a node
+ new /obj/effect/blob/node(src.loc,150)
+ else
+ new /obj/effect/blob(src.loc,60)
+ spawn(0)
del(src)
return
+ check_stability()
+ return
- proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp
- if(!control_unit || !processing) return
- if(stability < 50)
- new_efficiency /= 2
- control_unit.reported_core_efficiency += (new_efficiency - efficiency)
- efficiency = new_efficiency
- return
+/obj/machinery/am_shielding/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ stability -= 80
+ if(2.0)
+ stability -= 40
+ if(3.0)
+ stability -= 20
+ check_stability()
+ return
+
+
+/obj/machinery/am_shielding/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.flag != "bullet")
+ stability -= Proj.force/2
+ return 0
+
+
+/obj/machinery/am_shielding/update_icon()
+ overlays = null
+ for(var/direction in alldirs)
+ var/machine = locate(/obj/machinery, get_step(loc, direction))
+ if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit))
+ overlays += "shield_[direction]"
+
+ if(core_check())
+ overlays += "core"
+ if(!processing) setup_core()
+ else if(processing) shutdown_core()
+
+
+/obj/machinery/am_shielding/attackby(obj/item/W, mob/user)
+ if(!istype(W) || !user) return
+ if(W.force > 10)
+ stability -= W.force/2
+ check_stability()
+ ..()
+ return
+
+
+
+//Call this to link a detected shilding unit to the controller
+/obj/machinery/am_shielding/proc/link_control(var/obj/machinery/power/am_control_unit/AMC)
+ if(!istype(AMC)) return 0
+ if(control_unit && control_unit != AMC) return 0//Already have one
+ control_unit = AMC
+ control_unit.add_shielding(src,1)
+ return 1
+
+
+//Scans cards for shields or the control unit and if all there it
+/obj/machinery/am_shielding/proc/core_check()
+ for(var/direction in alldirs)
+ var/machine = locate(/obj/machinery, get_step(loc, direction))
+ if(!machine) return 0//Need all for a core
+ if(!istype(machine, /obj/machinery/am_shielding) && !istype(machine, /obj/machinery/power/am_control_unit)) return 0
+ return 1
+
+
+/obj/machinery/am_shielding/proc/setup_core()
+ processing = 1
+ machines.Add(src)
+ if(!control_unit) return
+ control_unit.linked_cores.Add(src)
+ control_unit.reported_core_efficiency += efficiency
+ return
+
+
+/obj/machinery/am_shielding/proc/shutdown_core()
+ processing = 0
+ machines.Remove(src)
+ if(!control_unit) return
+ control_unit.linked_cores.Remove(src)
+ control_unit.reported_core_efficiency -= efficiency
+ return
+
+
+/obj/machinery/am_shielding/proc/check_stability(var/injecting_fuel = 0)
+ if(stability > 0) return
+ if(injecting_fuel && control_unit)
+ control_unit.exploding = 1
+ if(src)
+ del(src)
+ return
+
+
+/obj/machinery/am_shielding/proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp
+ if(!control_unit || !processing) return
+ if(stability < 50)
+ new_efficiency /= 2
+ control_unit.reported_core_efficiency += (new_efficiency - efficiency)
+ efficiency = new_efficiency
+ return
@@ -214,10 +214,10 @@ proc/cardinalrange(var/center)
m_amt = 100
w_amt = 2000
- attackby(var/obj/item/I, var/mob/user)
- if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf))
- new/obj/machinery/am_shielding(src.loc)
- del(src)
- return
- ..()
- return
\ No newline at end of file
+/obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf))
+ new/obj/machinery/am_shielding(src.loc)
+ del(src)
+ return
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 6344ffac0a..13b892f20f 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -20,145 +20,145 @@
var/lastgenlev = -1
- New()
- ..()
+/obj/machinery/power/generator/New()
+ ..()
- spawn(5)
- circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST)
- circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST)
+ spawn(5)
+ circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST)
+ circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST)
- if(circ1)
- circ1.side = 1
- circ1.update_icon()
- if(circ2)
- circ2.side = 2
- circ2.update_icon()
+ if(circ1)
+ circ1.side = 1
+ circ1.update_icon()
+ if(circ2)
+ circ2.side = 2
+ circ2.update_icon()
- if(!circ1 || !circ2)
- stat |= BROKEN
+ if(!circ1 || !circ2)
+ stat |= BROKEN
- updateicon()
+ updateicon()
- proc/updateicon()
+/obj/machinery/power/generator/proc/updateicon()
- if(stat & (NOPOWER|BROKEN))
- overlays = null
- else
- overlays = null
+ if(stat & (NOPOWER|BROKEN))
+ overlays = null
+ else
+ overlays = null
- if(lastgenlev != 0)
- overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
+ if(lastgenlev != 0)
+ overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
#define GENRATE 800 // generator output coefficient from Q
- process()
+/obj/machinery/power/generator/process()
- //world << "Generator process ran"
+ //world << "Generator process ran"
- if(!circ1 || !circ2)
- return
+ if(!circ1 || !circ2)
+ return
- //world << "circ1 and circ2 pass"
+ //world << "circ1 and circ2 pass"
- var/datum/gas_mixture/cold_air = circ1.return_transfer_air()
- var/datum/gas_mixture/hot_air = circ2.return_transfer_air()
+ var/datum/gas_mixture/cold_air = circ1.return_transfer_air()
+ var/datum/gas_mixture/hot_air = circ2.return_transfer_air()
- lastgen = 0
+ lastgen = 0
- //world << "hot_air = [hot_air]; cold_air = [cold_air];"
+ //world << "hot_air = [hot_air]; cold_air = [cold_air];"
- if(cold_air && hot_air)
+ if(cold_air && hot_air)
- //world << "hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];"
+ //world << "hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];"
- //world << "coldair and hotair pass"
- var/cold_air_heat_capacity = cold_air.heat_capacity()
- var/hot_air_heat_capacity = hot_air.heat_capacity()
+ //world << "coldair and hotair pass"
+ var/cold_air_heat_capacity = cold_air.heat_capacity()
+ var/hot_air_heat_capacity = hot_air.heat_capacity()
- var/delta_temperature = hot_air.temperature - cold_air.temperature
+ var/delta_temperature = hot_air.temperature - cold_air.temperature
- //world << "delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]"
+ //world << "delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]"
- if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
- var/efficiency = 0.65
+ if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
+ var/efficiency = 0.65
- var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
+ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
- var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency
+ var/heat = energy_transfer*(1-efficiency)
+ lastgen = energy_transfer*efficiency
- //world << "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];"
+ //world << "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];"
- hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
- cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
+ hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
+ cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
- world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]"
+ world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]"
- add_avail(lastgen)
- // update icon overlays only if displayed level has changed
+ add_avail(lastgen)
+ // update icon overlays only if displayed level has changed
- if(hot_air)
- circ2.air2.merge(hot_air)
+ if(hot_air)
+ circ2.air2.merge(hot_air)
- if(cold_air)
- circ1.air2.merge(cold_air)
+ if(cold_air)
+ circ1.air2.merge(cold_air)
- var/genlev = max(0, min( round(11*lastgen / 100000), 11))
- if(genlev != lastgenlev)
- lastgenlev = genlev
- updateicon()
-
- src.updateDialog()
-
- attack_ai(mob/user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
-
-
- attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
-
-
- proc/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
- user.machine = null
- user << browse(null, "window=teg")
- return
-
- user.machine = src
-
- var/t = "
Thermo-Electric Generator
"
-
- t += "Output : [round(lastgen)] W
"
-
- t += "Cold loop
"
- t += "Temperature Inlet: [round(circ1.air1.temperature, 0.1)] K Outlet: [round(circ1.air2.temperature, 0.1)] K
"
- t += "Pressure Inlet: [round(circ1.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ1.air2.return_pressure(), 0.1)] kPa
"
-
- t += "Hot loop
"
- t += "Temperature Inlet: [round(circ2.air1.temperature, 0.1)] K Outlet: [round(circ2.air2.temperature, 0.1)] K
"
- t += "Pressure Inlet: [round(circ2.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ2.air2.return_pressure(), 0.1)] kPa
"
-
- t += "
Close"
-
- t += "
"
- user << browse(t, "window=teg;size=460x300")
- onclose(user, "teg")
- return 1
-
-
- Topic(href, href_list)
- ..()
- if( href_list["close"] )
- usr << browse(null, "window=teg")
- usr.machine = null
- return 0
- return 1
-
-
- power_change()
- ..()
+ var/genlev = max(0, min( round(11*lastgen / 100000), 11))
+ if(genlev != lastgenlev)
+ lastgenlev = genlev
updateicon()
+ src.updateDialog()
+
+/obj/machinery/power/generator/attack_ai(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ interact(user)
+
+
+/obj/machinery/power/generator/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(stat & (BROKEN|NOPOWER)) return
+ interact(user)
+
+
+/obj/machinery/power/generator/proc/interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
+ user.machine = null
+ user << browse(null, "window=teg")
+ return
+
+ user.machine = src
+
+ var/t = "Thermo-Electric Generator
"
+
+ t += "Output : [round(lastgen)] W
"
+
+ t += "Cold loop
"
+ t += "Temperature Inlet: [round(circ1.air1.temperature, 0.1)] K Outlet: [round(circ1.air2.temperature, 0.1)] K
"
+ t += "Pressure Inlet: [round(circ1.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ1.air2.return_pressure(), 0.1)] kPa
"
+
+ t += "Hot loop
"
+ t += "Temperature Inlet: [round(circ2.air1.temperature, 0.1)] K Outlet: [round(circ2.air2.temperature, 0.1)] K
"
+ t += "Pressure Inlet: [round(circ2.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ2.air2.return_pressure(), 0.1)] kPa
"
+
+ t += "
Close"
+
+ t += "
"
+ user << browse(t, "window=teg;size=460x300")
+ onclose(user, "teg")
+ return 1
+
+
+/obj/machinery/power/generator/Topic(href, href_list)
+ ..()
+ if( href_list["close"] )
+ usr << browse(null, "window=teg")
+ usr.machine = null
+ return 0
+ return 1
+
+
+/obj/machinery/power/generator/power_change()
+ ..()
+ updateicon()
+
diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm
index 9e53367f2b..8fe7006027 100644
--- a/code/modules/power/generator_type2.dm
+++ b/code/modules/power/generator_type2.dm
@@ -12,131 +12,131 @@
var/lastgenlev = -1
- New()
- ..()
- spawn(5)
- input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,WEST)
- input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,EAST)
- if(!input1 || !input2)
- stat |= BROKEN
- updateicon()
+/obj/machinery/power/generator_type2/New()
+ ..()
+ spawn(5)
+ input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,WEST)
+ input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,EAST)
+ if(!input1 || !input2)
+ stat |= BROKEN
+ updateicon()
- proc/updateicon()
+/obj/machinery/power/generator_type2/proc/updateicon()
- if(stat & (NOPOWER|BROKEN))
- overlays = null
- else
- overlays = null
+ if(stat & (NOPOWER|BROKEN))
+ overlays = null
+ else
+ overlays = null
- if(lastgenlev != 0)
- overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
+ if(lastgenlev != 0)
+ overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
#define GENRATE 800 // generator output coefficient from Q
- process()
- if(!input1 || !input2)
- return
+/obj/machinery/power/generator_type2/process()
+ if(!input1 || !input2)
+ return
- var/datum/gas_mixture/air1 = input1.return_exchange_air()
- var/datum/gas_mixture/air2 = input2.return_exchange_air()
+ var/datum/gas_mixture/air1 = input1.return_exchange_air()
+ var/datum/gas_mixture/air2 = input2.return_exchange_air()
- lastgen = 0
+ lastgen = 0
- if(air1 && air2)
- var/datum/gas_mixture/hot_air = air1
- var/datum/gas_mixture/cold_air = air2
- if(hot_air.temperature < cold_air.temperature)
- hot_air = air2
- cold_air = air1
+ if(air1 && air2)
+ var/datum/gas_mixture/hot_air = air1
+ var/datum/gas_mixture/cold_air = air2
+ if(hot_air.temperature < cold_air.temperature)
+ hot_air = air2
+ cold_air = air1
- var/hot_air_heat_capacity = hot_air.heat_capacity()
- var/cold_air_heat_capacity = cold_air.heat_capacity()
+ var/hot_air_heat_capacity = hot_air.heat_capacity()
+ var/cold_air_heat_capacity = cold_air.heat_capacity()
- var/delta_temperature = hot_air.temperature - cold_air.temperature
+ var/delta_temperature = hot_air.temperature - cold_air.temperature
- if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01)
- var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency
+ if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01)
+ var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency
- var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
+ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
- var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency
+ var/heat = energy_transfer*(1-efficiency)
+ lastgen = energy_transfer*efficiency
- hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
- cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
+ hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
+ cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
- world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]"
+ world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]"
- if(input1.network)
- input1.network.update = 1
+ if(input1.network)
+ input1.network.update = 1
- if(input2.network)
- input2.network.update = 1
+ if(input2.network)
+ input2.network.update = 1
- add_avail(lastgen)
- // update icon overlays only if displayed level has changed
+ add_avail(lastgen)
+ // update icon overlays only if displayed level has changed
- var/genlev = max(0, min( round(11*lastgen / 100000), 11))
- if(genlev != lastgenlev)
- lastgenlev = genlev
- updateicon()
+ var/genlev = max(0, min( round(11*lastgen / 100000), 11))
+ if(genlev != lastgenlev)
+ lastgenlev = genlev
+ updateicon()
- src.updateDialog()
+ src.updateDialog()
- attack_ai(mob/user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
+/obj/machinery/power/generator_type2/attack_ai(mob/user)
+ if(stat & (BROKEN|NOPOWER)) return
+ interact(user)
- attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
+/obj/machinery/power/generator_type2/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(stat & (BROKEN|NOPOWER)) return
+ interact(user)
- proc/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
- user.machine = null
- user << browse(null, "window=teg")
- return
+/obj/machinery/power/generator_type2/proc/interact(mob/user)
+ if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
+ user.machine = null
+ user << browse(null, "window=teg")
+ return
- user.machine = src
+ user.machine = src
- var/t = "Thermo-Electric Generator
"
+ var/t = "Thermo-Electric Generator
"
- t += "Output : [round(lastgen)] W
"
+ t += "Output : [round(lastgen)] W
"
- t += "Cold loop
"
- t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
"
- t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
"
+ t += "Cold loop
"
+ t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
"
+ t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
"
- t += "Hot loop
"
- t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
"
- t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
"
+ t += "Hot loop
"
+ t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
"
+ t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
"
- t += "
Close"
+ t += "
Close"
- t += "
"
- user << browse(t, "window=teg;size=460x300")
- onclose(user, "teg")
- return 1
+ t += "
"
+ user << browse(t, "window=teg;size=460x300")
+ onclose(user, "teg")
+ return 1
- Topic(href, href_list)
- ..()
+/obj/machinery/power/generator_type2/Topic(href, href_list)
+ ..()
- if( href_list["close"] )
- usr << browse(null, "window=teg")
- usr.machine = null
- return 0
+ if( href_list["close"] )
+ usr << browse(null, "window=teg")
+ usr.machine = null
+ return 0
- return 1
+ return 1
- power_change()
- ..()
- updateicon()
\ No newline at end of file
+/obj/machinery/power/generator_type2/power_change()
+ ..()
+ updateicon()
\ No newline at end of file
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 941394d756..d9897de8af 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -106,187 +106,185 @@ display round(lastgen) and plasmatank amount
var/time_per_sheet = 10
var/heat = 0
- New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
- component_parts += new /obj/item/weapon/cable_coil(src)
- component_parts += new /obj/item/weapon/cable_coil(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new board_path(src)
- RefreshParts()
-
+/obj/machinery/power/port_gen/pacman/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/cable_coil(src)
+ component_parts += new /obj/item/weapon/cable_coil(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new board_path(src)
RefreshParts()
- var/temp_rating = 0
- var/temp_reliability = 0
- for(var/obj/item/weapon/stock_parts/SP in component_parts)
- if(istype(SP, /obj/item/weapon/stock_parts/matter_bin))
- max_sheets = SP.rating * SP.rating * 50
- else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor))
- temp_rating += SP.rating
- for(var/obj/item/weapon/CP in component_parts)
- temp_reliability += CP.reliability
- reliability = min(round(temp_reliability / 4), 100)
- power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2))
- examine()
- ..()
- usr << "\blue The generator has [sheets] units of fuel left, producing [power_gen] per cycle."
- if(crit_fail) usr << "\red The generator seems to have broken down."
+/obj/machinery/power/port_gen/pacman/RefreshParts()
+ var/temp_rating = 0
+ var/temp_reliability = 0
+ for(var/obj/item/weapon/stock_parts/SP in component_parts)
+ if(istype(SP, /obj/item/weapon/stock_parts/matter_bin))
+ max_sheets = SP.rating * SP.rating * 50
+ else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor))
+ temp_rating += SP.rating
+ for(var/obj/item/weapon/CP in component_parts)
+ temp_reliability += CP.reliability
+ reliability = min(round(temp_reliability / 4), 100)
+ power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2))
- HasFuel()
- if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left)
- return 1
- return 0
+/obj/machinery/power/port_gen/pacman/examine()
+ ..()
+ usr << "\blue The generator has [sheets] units of fuel left, producing [power_gen] per cycle."
+ if(crit_fail) usr << "\red The generator seems to have broken down."
- UseFuel()
- var/needed_sheets = 1 / (time_per_sheet / power_output)
- var/temp = min(needed_sheets, sheet_left)
- needed_sheets -= temp
- sheet_left -= temp
- sheets -= round(needed_sheets)
- needed_sheets -= round(needed_sheets)
- if (sheet_left <= 0 && sheets > 0)
- sheet_left = 1 - needed_sheets
- sheets--
+/obj/machinery/power/port_gen/pacman/HasFuel()
+ if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left)
+ return 1
+ return 0
- var/lower_limit = 56 + power_output * 10
- var/upper_limit = 76 + power_output * 10
- var/bias = 0
- if (power_output > 4)
- upper_limit = 400
- bias = power_output * 3
+/obj/machinery/power/port_gen/pacman/UseFuel()
+ var/needed_sheets = 1 / (time_per_sheet / power_output)
+ var/temp = min(needed_sheets, sheet_left)
+ needed_sheets -= temp
+ sheet_left -= temp
+ sheets -= round(needed_sheets)
+ needed_sheets -= round(needed_sheets)
+ if (sheet_left <= 0 && sheets > 0)
+ sheet_left = 1 - needed_sheets
+ sheets--
+
+ var/lower_limit = 56 + power_output * 10
+ var/upper_limit = 76 + power_output * 10
+ var/bias = 0
+ if (power_output > 4)
+ upper_limit = 400
+ bias = power_output * 3
+ if (heat < lower_limit)
+ heat += 3
+ else
+ heat += rand(-7 + bias, 7 + bias)
if (heat < lower_limit)
- heat += 3
- else
- heat += rand(-7 + bias, 7 + bias)
- if (heat < lower_limit)
- heat = lower_limit
- if (heat > upper_limit)
- heat = upper_limit
+ heat = lower_limit
+ if (heat > upper_limit)
+ heat = upper_limit
- if (heat > 300)
- overheat()
+ if (heat > 300)
+ overheat()
+ del(src)
+ return
+
+/obj/machinery/power/port_gen/pacman/handleInactive()
+ heat -= 2
+ if (heat < 0)
+ heat = 0
+ else
+ for(var/mob/M in viewers(1, src))
+ if (M.client && M.machine == src)
+ src.updateUsrDialog()
+
+/obj/machinery/power/port_gen/pacman/proc/overheat()
+ explosion(src.loc, 2, 5, 2, -1)
+
+/obj/machinery/power/port_gen/pacman/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, sheet_path))
+ var/obj/item/stack/addstack = O
+ var/amount = min((max_sheets - sheets), addstack.amount)
+ if(amount < 1)
+ user << "\blue The [src.name] is full!"
+ return
+ user << "\blue You add [amount] sheets to the [src.name]."
+ sheets += amount
+ addstack.use(amount)
+ return
+ else if (istype(O, /obj/item/weapon/card/emag))
+ emagged = 1
+ emp_act(1)
+ else if(!active)
+ if(istype(O, /obj/item/weapon/wrench))
+ anchored = !anchored
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ if(anchored)
+ user << "\blue You secure the generator to the floor."
+ else
+ user << "\blue You unsecure the generator from the floor."
+ makepowernets()
+ else if(istype(O, /obj/item/weapon/screwdriver))
+ open = !open
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(open)
+ user << "\blue You open the access panel."
+ else
+ user << "\blue You close the access panel."
+ else if(istype(O, /obj/item/weapon/crowbar) && !open)
+ var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
+ for(var/obj/item/I in component_parts)
+ if(I.reliability < 100)
+ I.crit_fail = 1
+ I.loc = src.loc
+ new_frame.state = 2
+ new_frame.icon_state = "box_1"
del(src)
+
+/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
+ ..()
+ if (!anchored)
return
- handleInactive()
- heat -= 2
- if (heat < 0)
- heat = 0
- else
- for(var/mob/M in viewers(1, src))
- if (M.client && M.machine == src)
- src.updateUsrDialog()
+ interact(user)
- proc
- overheat()
- explosion(src.loc, 2, 5, 2, -1)
+/obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob)
+ interact(user)
- attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, sheet_path))
- var/obj/item/stack/addstack = O
- var/amount = min((max_sheets - sheets), addstack.amount)
- if(amount < 1)
- user << "\blue The [src.name] is full!"
- return
- user << "\blue You add [amount] sheets to the [src.name]."
- sheets += amount
- addstack.use(amount)
- return
- else if (istype(O, /obj/item/weapon/card/emag))
- emagged = 1
- emp_act(1)
- else if(!active)
- if(istype(O, /obj/item/weapon/wrench))
- anchored = !anchored
- playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- if(anchored)
- user << "\blue You secure the generator to the floor."
- else
- user << "\blue You unsecure the generator from the floor."
- makepowernets()
- else if(istype(O, /obj/item/weapon/screwdriver))
- open = !open
- playsound(src.loc, 'Screwdriver.ogg', 50, 1)
- if(open)
- user << "\blue You open the access panel."
- else
- user << "\blue You close the access panel."
- else if(istype(O, /obj/item/weapon/crowbar) && !open)
- var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- for(var/obj/item/I in component_parts)
- if(I.reliability < 100)
- I.crit_fail = 1
- I.loc = src.loc
- new_frame.state = 2
- new_frame.icon_state = "box_1"
- del(src)
+/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob)
+ interact(user)
- attack_hand(mob/user as mob)
- ..()
- if (!anchored)
+/obj/machinery/power/port_gen/pacman/proc/interact(mob/user)
+ if (get_dist(src, user) > 1 )
+ if (!istype(user, /mob/living/silicon/ai))
+ user.machine = null
+ user << browse(null, "window=port_gen")
return
- interact(user)
+ user.machine = src
- attack_ai(mob/user as mob)
- interact(user)
+ var/dat = text("[name]
")
+ if (active)
+ dat += text("Generator: On
")
+ else
+ dat += text("Generator: Off
")
+ dat += text("sheets: [sheets]
")
+ var/stack_percent = round(sheet_left * 100, 1)
+ dat += text("Current stack: [stack_percent]%
")
+ dat += text("Power output: - [power_gen * power_output] +
")
+ dat += text("Heat: [heat]
")
+ dat += "
Close"
+ user << browse("[dat]", "window=port_gen")
- attack_paw(mob/user as mob)
- interact(user)
+/obj/machinery/power/port_gen/pacman/Topic(href, href_list)
+ if(..())
+ return
- proc
- interact(mob/user)
- if (get_dist(src, user) > 1 )
- if (!istype(user, /mob/living/silicon/ai))
- user.machine = null
- user << browse(null, "window=port_gen")
- return
-
- user.machine = src
-
- var/dat = text("[name]
")
+ src.add_fingerprint(usr)
+ if(href_list["action"])
+ if(href_list["action"] == "enable")
+ if(!active && HasFuel() && !crit_fail)
+ active = 1
+ icon_state = "portgen1"
+ src.updateUsrDialog()
+ if(href_list["action"] == "disable")
if (active)
- dat += text("Generator: On
")
- else
- dat += text("Generator: Off
")
- dat += text("sheets: [sheets]
")
- var/stack_percent = round(sheet_left * 100, 1)
- dat += text("Current stack: [stack_percent]%
")
- dat += text("Power output: - [power_gen * power_output] +
")
- dat += text("Heat: [heat]
")
- dat += "
Close"
- user << browse("[dat]", "window=port_gen")
-
- Topic(href, href_list)
- if(..())
- return
-
- src.add_fingerprint(usr)
- if(href_list["action"])
- if(href_list["action"] == "enable")
- if(!active && HasFuel() && !crit_fail)
- active = 1
- icon_state = "portgen1"
- src.updateUsrDialog()
- if(href_list["action"] == "disable")
- if (active)
- active = 0
- icon_state = "portgen0"
- src.updateUsrDialog()
- if(href_list["action"] == "lower_power")
- if (power_output > 1)
- power_output--
- src.updateUsrDialog()
- if (href_list["action"] == "higher_power")
- if (power_output < 4 || emagged)
- power_output++
- src.updateUsrDialog()
- if (href_list["action"] == "close")
- usr << browse(null, "window=port_gen")
- usr.machine = null
+ active = 0
+ icon_state = "portgen0"
+ src.updateUsrDialog()
+ if(href_list["action"] == "lower_power")
+ if (power_output > 1)
+ power_output--
+ src.updateUsrDialog()
+ if (href_list["action"] == "higher_power")
+ if (power_output < 4 || emagged)
+ power_output++
+ src.updateUsrDialog()
+ if (href_list["action"] == "close")
+ usr << browse(null, "window=port_gen")
+ usr.machine = null
/obj/machinery/power/port_gen/pacman/super
name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator"
diff --git a/code/modules/power/sd_DynamicAreaLighting.dm b/code/modules/power/sd_DynamicAreaLighting.dm
index 3caf18da5f..50ecfe89cd 100644
--- a/code/modules/power/sd_DynamicAreaLighting.dm
+++ b/code/modules/power/sd_DynamicAreaLighting.dm
@@ -318,12 +318,11 @@ Turfs have these additional procs and vars:
\********************************************************************/
-var
- sd_dark_icon = 'icons/effects/ss13_dark_alpha7.dmi' // icon used for darkness
- sd_dark_shades = 7 // number of icon state in sd_dark_icon
- sd_light_layer = 10 // graphics layer for light effect
- sd_light_outside = 0 // how bright it is outside
- sd_top_luminosity = 0
+var/sd_dark_icon = 'icons/effects/ss13_dark_alpha7.dmi' // icon used for darkness
+var/sd_dark_shades = 7 // number of icon state in sd_dark_icon
+var/sd_light_layer = 10 // graphics layer for light effect
+var/sd_light_outside = 0 // how bright it is outside
+var/sd_top_luminosity = 0
// since we're not using these, comment out all occurances to save CPU
/*
@@ -351,309 +350,303 @@ proc
for(var/turf/T in sd_light_spill_turfs)
T.sd_ApplySpill()
*/
-proc
- sd_SetDarkIcon(icon, shades)
- // reset the darkness icon and number of shades of darkness
- sd_dark_icon = icon
- sd_dark_shades = shades
- // change existing areas
- for(var/area/A)
- if(A.sd_darkimage) A.sd_LightLevel(A.sd_light_level,0)
+proc/sd_SetDarkIcon(icon, shades)
+ // reset the darkness icon and number of shades of darkness
+ sd_dark_icon = icon
+ sd_dark_shades = shades
+ // change existing areas
+ for(var/area/A)
+ if(A.sd_darkimage) A.sd_LightLevel(A.sd_light_level,0)
-atom
- New()
- ..()
- // if this is not an area and is luminous
- if(!isarea(src)&&(luminosity>0))
- spawn(1) // delay to allow map load
- sd_ApplyLum()
+atom/New()
+ ..()
+ // if this is not an area and is luminous
+ if(!isarea(src)&&(luminosity>0))
+ spawn(1) // delay to allow map load
+ sd_ApplyLum()
- Del()
- // if this is not an area and is luminous
- if(!isarea(src)&&(luminosity>0))
- sd_StripLum()
- ..()
+atom/Del()
+ // if this is not an area and is luminous
+ if(!isarea(src)&&(luminosity>0))
+ sd_StripLum()
+ ..()
- proc
- sd_ApplyLum(list/V = view(luminosity,src), center = src)
- if(src.luminosity>sd_top_luminosity)
- sd_top_luminosity = src.luminosity
- // loop through all the turfs in V
- for(var/turf/T in V)
- /* increase the turf's brightness depending on the
- brightness and distance of the lightsource */
- T.sd_lumcount += (luminosity-get_dist(center,T))
- // update the turf's area
+atom/proc/sd_ApplyLum(list/V = view(luminosity,src), center = src)
+ if(src.luminosity>sd_top_luminosity)
+ sd_top_luminosity = src.luminosity
+ // loop through all the turfs in V
+ for(var/turf/T in V)
+ /* increase the turf's brightness depending on the
+ brightness and distance of the lightsource */
+ T.sd_lumcount += (luminosity-get_dist(center,T))
+ // update the turf's area
- //
- //if(T.tag == "sdd")
- // slog << "\red lc+([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])"
- // slog << "now [T.sd_lumcount]"
+ //
+ //if(T.tag == "sdd")
+ // slog << "\red lc+([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])"
+ // slog << "now [T.sd_lumcount]"
- T.sd_LumUpdate()
+ T.sd_LumUpdate()
- sd_StripLum(list/V = view(luminosity,src), center = src)
- // loop through all the turfs in V
- for(var/turf/T in V)
- /* increase the turf's brightness depending on the
- brightness and distance of the lightsource */
- T.sd_lumcount -= (luminosity-get_dist(center,T))
- T.sd_lumcount = max(0, T.sd_lumcount)
+atom/proc/sd_StripLum(list/V = view(luminosity,src), center = src)
+ // loop through all the turfs in V
+ for(var/turf/T in V)
+ /* increase the turf's brightness depending on the
+ brightness and distance of the lightsource */
+ T.sd_lumcount -= (luminosity-get_dist(center,T))
+ T.sd_lumcount = max(0, T.sd_lumcount)
- //if(T.tag == "sdd")
- // slog << "\red lc-([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])"
- // slog << "now [T.sd_lumcount]"
+ //if(T.tag == "sdd")
+ // slog << "\red lc-([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])"
+ // slog << "now [T.sd_lumcount]"
- // update the turf's area
- T.sd_LumUpdate()
+ // update the turf's area
+ T.sd_LumUpdate()
- sd_ApplyLocalLum(list/affected = view(sd_top_luminosity,src))
- // Reapplies the lighting effect of all atoms in affected.
- for(var/atom/A in affected)
- if(A.luminosity) A.sd_ApplyLum()
+atom/proc/sd_ApplyLocalLum(list/affected = view(sd_top_luminosity,src))
+ // Reapplies the lighting effect of all atoms in affected.
+ for(var/atom/A in affected)
+ if(A.luminosity) A.sd_ApplyLum()
- //if(sd_light_outside && (A in sd_light_spill_turfs))
- // A:sd_ApplySpill()
+ //if(sd_light_outside && (A in sd_light_spill_turfs))
+ // A:sd_ApplySpill()
- sd_StripLocalLum()
- /* strips all local luminosity
+atom/proc/sd_StripLocalLum()
+ /* strips all local luminosity
- RETURNS: list of all the luminous atoms stripped
+ RETURNS: list of all the luminous atoms stripped
- IMPORTANT! Each sd_StripLocalLum() call should have a matching
- sd_ApplyLocalLum() to restore the local effect. */
- var/list/affected = list()
- for(var/atom/A in view(sd_top_luminosity,src))
- var/turfflag = (isturf(src)?1:0)
- if(A.luminosity && (get_dist(src,A) <= A.luminosity + turfflag))
- A.sd_StripLum()
- affected += A
+ IMPORTANT! Each sd_StripLocalLum() call should have a matching
+ sd_ApplyLocalLum() to restore the local effect. */
+ var/list/affected = list()
+ for(var/atom/A in view(sd_top_luminosity,src))
+ var/turfflag = (isturf(src)?1:0)
+ if(A.luminosity && (get_dist(src,A) <= A.luminosity + turfflag))
+ A.sd_StripLum()
+ affected += A
- //if(sd_light_outside && (A in sd_light_spill_turfs))
- // A:sd_StripSpill()
- // affected += A
+ //if(sd_light_outside && (A in sd_light_spill_turfs))
+ // A:sd_StripSpill()
+ // affected += A
- return affected
+ return affected
- sd_SetLuminosity(new_luminosity as num)
- /* This proc should be called everytime you want to change the
- luminosity of an atom instead of setting it directly.
+atom/proc/sd_SetLuminosity(new_luminosity as num)
+ /* This proc should be called everytime you want to change the
+ luminosity of an atom instead of setting it directly.
- new_luminosity is the new value for luminosity. */
- if(luminosity>0)
- sd_StripLum()
- luminosity = new_luminosity
- if(luminosity>0)
- sd_ApplyLum()
+ new_luminosity is the new value for luminosity. */
+ if(luminosity>0)
+ sd_StripLum()
+ luminosity = new_luminosity
+ if(luminosity>0)
+ sd_ApplyLum()
- sd_SetOpacity(new_opacity as num)
- /* if(opacity != new_opacity)
- var/list/affected = sd_StripLocalLum()
- opacity = new_opacity
- sd_ApplyLocalLum(affected) */
- if(opacity == (new_opacity ? 1 : 0)) return
- var
- list
- affected = new
- //spill
- atom/A
- turf
- T
- ATurf
+atom/proc/sd_SetOpacity(new_opacity as num)
+ /* if(opacity != new_opacity)
+ var/list/affected = sd_StripLocalLum()
+ opacity = new_opacity
+ sd_ApplyLocalLum(affected) */
+ if(opacity == (new_opacity ? 1 : 0)) return
+ var
+ list
affected = new
- for(A in range(sd_top_luminosity,src))
- T = A
- while(T && !istype(T)) T = T.loc
- if(T)
- var/list/V = view(A.luminosity,T)
- if(!(src in V)) continue
- var/turfflag = 0
- if(A == T) turfflag = 1
- if(A.luminosity && get_dist(A,src)<=A.luminosity+turfflag)
- affected[A] = V
- //if(sd_light_outside && (A in sd_light_spill_turfs))
- // if(!spill) spill=new
- // spill[A] = view(sd_light_outside, T)
- opacity = new_opacity
- if(opacity)
- for(A in affected)
- ATurf = A
- while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
- if(ATurf)
- for(T in affected[A]-view(A.luminosity, ATurf))
- T.sd_lumcount -= (A.luminosity-get_dist(A,T))
- T.sd_lumcount = max(0, T.sd_lumcount)
+ //spill
+ atom/A
+ turf
+ T
+ ATurf
+ affected = new
+ for(A in range(sd_top_luminosity,src))
+ T = A
+ while(T && !istype(T)) T = T.loc
+ if(T)
+ var/list/V = view(A.luminosity,T)
+ if(!(src in V)) continue
+ var/turfflag = 0
+ if(A == T) turfflag = 1
+ if(A.luminosity && get_dist(A,src)<=A.luminosity+turfflag)
+ affected[A] = V
+ //if(sd_light_outside && (A in sd_light_spill_turfs))
+ // if(!spill) spill=new
+ // spill[A] = view(sd_light_outside, T)
+ opacity = new_opacity
+ if(opacity)
+ for(A in affected)
+ ATurf = A
+ while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
+ if(ATurf)
+ for(T in affected[A]-view(A.luminosity, ATurf))
+ T.sd_lumcount -= (A.luminosity-get_dist(A,T))
+ T.sd_lumcount = max(0, T.sd_lumcount)
- //if(T.tag == "sdd")
- // slog << "\red lc(1)-([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])"
- // slog << "now [T.sd_lumcount]"
+ //if(T.tag == "sdd")
+ // slog << "\red lc(1)-([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])"
+ // slog << "now [T.sd_lumcount]"
- T.sd_LumUpdate()
- /*
- for(A in spill)
- if(A.opacity && A!=src) continue
- ATurf = A
- while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
- if(ATurf)
- //spill[A] -= view(sd_light_outside, A)
- for(T in (A==src)?spill[A]:(spill[A]-view(sd_light_outside,ATurf)))
- if(T.loc:sd_outside) continue
- T.sd_lumcount -= (sd_light_outside-get_dist(A,T))
+ T.sd_LumUpdate()
+ /*
+ for(A in spill)
+ if(A.opacity && A!=src) continue
+ ATurf = A
+ while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
+ if(ATurf)
+ //spill[A] -= view(sd_light_outside, A)
+ for(T in (A==src)?spill[A]:(spill[A]-view(sd_light_outside,ATurf)))
+ if(T.loc:sd_outside) continue
+ T.sd_lumcount -= (sd_light_outside-get_dist(A,T))
- //if(T.tag == "sdd")
- // slog << "\red lc(O)-([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])"
- // slog << "now [T.sd_lumcount]"
+ //if(T.tag == "sdd")
+ // slog << "\red lc(O)-([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])"
+ // slog << "now [T.sd_lumcount]"
- T.sd_LumUpdate()
- */
+ T.sd_LumUpdate()
+ */
- // end new_opacity = 1 block
+ // end new_opacity = 1 block
- else
- for(A in affected)
- ATurf = A
- while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
- if(ATurf)
- for(T in view(A.luminosity, ATurf) - affected[A])
- T.sd_lumcount += (A.luminosity-get_dist(A,T))
- //if(T.tag == "sdd")
- // slog << "\red lc(1)+([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])"
- // slog << "now [T.sd_lumcount]"
+ else
+ for(A in affected)
+ ATurf = A
+ while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
+ if(ATurf)
+ for(T in view(A.luminosity, ATurf) - affected[A])
+ T.sd_lumcount += (A.luminosity-get_dist(A,T))
+ //if(T.tag == "sdd")
+ // slog << "\red lc(1)+([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])"
+ // slog << "now [T.sd_lumcount]"
- T.sd_LumUpdate()
- /*
- for(A in spill)
- if(A.opacity) continue
- ATurf = A
- while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
- if(ATurf)
- for(T in (A==src)?spill[A]:(view(sd_light_outside, ATurf)-spill[A]))
- if(T.loc:sd_outside) continue
- T.sd_lumcount += (sd_light_outside-get_dist(A,T))
- //if(T.tag == "sdd")
- // slog << "\red lc(O)+([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])"
- // slog << "now [T.sd_lumcount]"
+ T.sd_LumUpdate()
+ /*
+ for(A in spill)
+ if(A.opacity) continue
+ ATurf = A
+ while(ATurf && !istype(ATurf)) ATurf = ATurf.loc
+ if(ATurf)
+ for(T in (A==src)?spill[A]:(view(sd_light_outside, ATurf)-spill[A]))
+ if(T.loc:sd_outside) continue
+ T.sd_lumcount += (sd_light_outside-get_dist(A,T))
+ //if(T.tag == "sdd")
+ // slog << "\red lc(O)+([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])"
+ // slog << "now [T.sd_lumcount]"
- T.sd_LumUpdate()
+ T.sd_LumUpdate()
- */
- // end new_opacity = 0 block
+ */
+ // end new_opacity = 0 block
///
- sd_NewOpacity(var/new_opacity)
- if(opacity != new_opacity)
- var/list/affected = sd_StripLocalLum()
- opacity = new_opacity
- var/atom/T = src
- while(T && !isturf(T))
- T = T.loc
- if(T)
- T:sd_lumcount = 0
+atom/proc/sd_NewOpacity(var/new_opacity)
+ if(opacity != new_opacity)
+ var/list/affected = sd_StripLocalLum()
+ opacity = new_opacity
+ var/atom/T = src
+ while(T && !isturf(T))
+ T = T.loc
+ if(T)
+ T:sd_lumcount = 0
- sd_ApplyLocalLum(affected)
+ sd_ApplyLocalLum(affected)
///
turf
- var
- // set to 1 to have outside light spill indoors from this turf
- sd_light_spill = 0
- tmp
- sd_lumcount = 0 // the brightness of the turf
+ var/sd_light_spill = 0
+ var/tmp/sd_lumcount = 0 // the brightness of the turf
- proc
- sd_LumReset()
- /* Clear local lum, reset this turf's sd_lumcount, and
- re-apply local lum*/
- var/list/affected = sd_StripLocalLum()
- sd_lumcount = 0
- //if(src.tag == "sdd")
- // slog << "\red lc(LR)=0"
- sd_ApplyLocalLum(affected)
+turf/proc/sd_LumReset()
+ /* Clear local lum, reset this turf's sd_lumcount, and
+ re-apply local lum*/
+ var/list/affected = sd_StripLocalLum()
+ sd_lumcount = 0
+ //if(src.tag == "sdd")
+ // slog << "\red lc(LR)=0"
- sd_LumUpdate()
- set background = 1
- var/area/Loc = loc
- if(!istype(Loc) || !Loc.sd_lighting) return
+ sd_ApplyLocalLum(affected)
- // change the turf's area depending on its brightness
- // restrict light to valid levels
- var/light = min(max(sd_lumcount,0),sd_dark_shades)
- var/ltag = copytext(Loc.tag,1,findtext(Loc.tag,"sd_L")) + "sd_L[light]"
+turf/proc/sd_LumUpdate()
+ set background = 1
+ var/area/Loc = loc
+ if(!istype(Loc) || !Loc.sd_lighting) return
- if(Loc.tag!=ltag) //skip if already in this area
- var/area/A = locate(ltag) // find an appropriate area
- if(!A)
- A = new Loc.type() // create area if it wasn't found
- A.tag = ltag
+ // change the turf's area depending on its brightness
+ // restrict light to valid levels
+ var/light = min(max(sd_lumcount,0),sd_dark_shades)
+ var/ltag = copytext(Loc.tag,1,findtext(Loc.tag,"sd_L")) + "sd_L[light]"
- // replicate vars
- for(var/V in Loc.vars-"contents")
- if(issaved(Loc.vars[V])) A.vars[V] = Loc.vars[V]
+ if(Loc.tag!=ltag) //skip if already in this area
+ var/area/A = locate(ltag) // find an appropriate area
+ if(!A)
+ A = new Loc.type() // create area if it wasn't found
+ A.tag = ltag
+
+ // replicate vars
+ for(var/V in Loc.vars-"contents")
+ if(issaved(Loc.vars[V])) A.vars[V] = Loc.vars[V]
- A.tag = ltag
- /*
- if(A.sd_outside)
- if(!(A in sd_outside_areas))
- sd_outside_areas += A
- A.sd_light_level = light
- A.sd_LightLevel(light + sd_light_outside,0)
- else
- */
- A.sd_LightLevel(light)
- // endelse
+ A.tag = ltag
+ /*
+ if(A.sd_outside)
+ if(!(A in sd_outside_areas))
+ sd_outside_areas += A
+ A.sd_light_level = light
+ A.sd_LightLevel(light + sd_light_outside,0)
+ else
+ */
+ A.sd_LightLevel(light)
+ // endelse
- A.contents += src // move the turf into the area
+ A.contents += src // move the turf into the area
/*
- sd_ApplySpill()
- if(opacity) return
- var/oldlum = luminosity
- luminosity = sd_light_outside
- // loop through all the turfs in V
- for(var/turf/T in view(sd_light_outside,src))
- var/area/A = T.loc
- if(!istype(A) || A.sd_outside) continue
- /* increase the turf's brightness depending on the
- brightness and distance of the lightsource */
- T.sd_lumcount += (sd_light_outside-get_dist(src,T))
- //if(T.tag == "sdd")
- // slog << "\red lc(AS)+([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])"
- // slog << "now [T.sd_lumcount]"
+turf/proc/sd_ApplySpill()
+ if(opacity) return
+ var/oldlum = luminosity
+ luminosity = sd_light_outside
+ // loop through all the turfs in V
+ for(var/turf/T in view(sd_light_outside,src))
+ var/area/A = T.loc
+ if(!istype(A) || A.sd_outside) continue
+ /* increase the turf's brightness depending on the
+ brightness and distance of the lightsource */
+ T.sd_lumcount += (sd_light_outside-get_dist(src,T))
+ //if(T.tag == "sdd")
+ // slog << "\red lc(AS)+([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])"
+ // slog << "now [T.sd_lumcount]"
- // update the turf's area
- T.sd_LumUpdate()
- luminosity = oldlum
+ // update the turf's area
+ T.sd_LumUpdate()
+ luminosity = oldlum
- sd_StripSpill()
- if(opacity) return
- var/oldlum = luminosity
- luminosity = sd_light_outside
- // loop through all the turfs in V
- for(var/turf/T in view(sd_light_outside,src))
- var/area/A = T.loc
- if(!istype(A) || A.sd_outside) continue
- /* increase the turf's brightness depending on the
- brightness and distance of the lightsource */
- T.sd_lumcount -= (sd_light_outside-get_dist(src,T))
- //if(T.tag == "sdd")
- // slog << "\red lc(AS)-([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])"
- // slog << "now [T.sd_lumcount]"
+turf/proc/sd_StripSpill()
+ if(opacity) return
+ var/oldlum = luminosity
+ luminosity = sd_light_outside
+ // loop through all the turfs in V
+ for(var/turf/T in view(sd_light_outside,src))
+ var/area/A = T.loc
+ if(!istype(A) || A.sd_outside) continue
+ /* increase the turf's brightness depending on the
+ brightness and distance of the lightsource */
+ T.sd_lumcount -= (sd_light_outside-get_dist(src,T))
+ //if(T.tag == "sdd")
+ // slog << "\red lc(AS)-([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])"
+ // slog << "now [T.sd_lumcount]"
- // update the turf's area
- T.sd_LumUpdate()
- luminosity = oldlum
+ // update the turf's area
+ T.sd_LumUpdate()
+ luminosity = oldlum
- New()
+turf/New()
..()
if(sd_light_spill)
sd_light_spill_turfs += src
@@ -684,91 +677,89 @@ atom/movable/Move() // when something moves
sd_ApplyLum()
area
- var
/* Turn this flag off to prevent sd_DynamicAreaLighting from affecting
this area */
- sd_lighting = 1
+ var/sd_lighting = 1
/* This var determines if an area is outside (affected by sunlight) or
not. */
- sd_outside = 0
+ var/sd_outside = 0
- sd_light_level = 0 // the current light level of the area
+ var/sd_light_level = 0 // the current light level of the area
- sd_darkimage // tracks the darkness image of the area for easy removal
+ var/sd_darkimage // tracks the darkness image of the area for easy removal
- proc
- sd_LightLevel(slevel = sd_light_level as num, keep = 1)
- if(!src) return
- overlays -= sd_darkimage
+area/proc/sd_LightLevel(slevel = sd_light_level as num, keep = 1)
+ if(!src) return
+ overlays -= sd_darkimage
- if(keep) sd_light_level = slevel
+ if(keep) sd_light_level = slevel
- slevel = min(max(slevel,0),sd_dark_shades) // restrict range
+ slevel = min(max(slevel,0),sd_dark_shades) // restrict range
- if(slevel > 0)
- luminosity = 1
- else
- luminosity = 0
+ if(slevel > 0)
+ luminosity = 1
+ else
+ luminosity = 0
- sd_darkimage = image(sd_dark_icon,,num2text(slevel),sd_light_layer)
- overlays += sd_darkimage
+ sd_darkimage = image(sd_dark_icon,,num2text(slevel),sd_light_layer)
+ overlays += sd_darkimage
- /*
- New()
- ..()
- if(!tag) tag = "[type]"
- spawn(1) // wait a tick
- if(sd_lighting)
- // see if this area was created by the library
- if(!findtext(tag, "sd_L"))
- /* show the dark overlay so areas outside of luminous regions
- won't be bright as day when they should be dark. */
- sd_LightLevel()
- if(sd_outside)
- sd_outside_areas += src
- */
- proc/sd_New(sd_created)
+/*
+area/proc/New()
+ ..()
+ if(!tag) tag = "[type]"
+ spawn(1) // wait a tick
+ if(sd_lighting)
+ // see if this area was created by the library
+ if(!findtext(tag, "sd_L"))
+ /* show the dark overlay so areas outside of luminous regions
+ won't be bright as day when they should be dark. */
+ sd_LightLevel()
+ if(sd_outside)
+ sd_outside_areas += src
+*/
+area/proc/sd_New(sd_created)
- if(!tag) tag = "[type]"
- spawn(1) // wait a tick
- if(sd_lighting)
- // see if this area was created by the library
- if(!sd_created)
- /* show the dark overlay so areas outside of luminous regions
- won't be bright as day when they should be dark. */
- sd_LightLevel()
- //if(sd_outside)
- // sd_outside_areas += src
+ if(!tag) tag = "[type]"
+ spawn(1) // wait a tick
+ if(sd_lighting)
+ // see if this area was created by the library
+ if(!sd_created)
+ /* show the dark overlay so areas outside of luminous regions
+ won't be bright as day when they should be dark. */
+ sd_LightLevel()
+ //if(sd_outside)
+ // sd_outside_areas += src
+
+area/Del()
+ ..()
+ related -= src
- Del()
- ..()
- related -= src
-mob
/* extend the mob procs to compensate for sight settings. */
- sd_ApplyLum(list/V, center = src)
- if(!V)
- if(isturf(loc))
- V = view(luminosity,loc)
- else
- V = view(luminosity,src)
- . = ..(V, center)
+mob/sd_ApplyLum(list/V, center = src)
+ if(!V)
+ if(isturf(loc))
+ V = view(luminosity,loc)
+ else
+ V = view(luminosity,src)
+ . = ..(V, center)
- sd_StripLum(list/V, center = src)
- if(!V)
- if(isturf(loc))
- V = view(luminosity,loc)
- else
- V = view(luminosity,src)
- . = ..(V, center)
+mob/sd_StripLum(list/V, center = src)
+ if(!V)
+ if(isturf(loc))
+ V = view(luminosity,loc)
+ else
+ V = view(luminosity,src)
+ . = ..(V, center)
- sd_ApplyLocalLum(list/affected)
- if(!affected)
- if(isturf(loc))
- affected = view(sd_top_luminosity,loc)
- else
- affected = view(sd_top_luminosity,src)
- . = ..(affected)
+mob/sd_ApplyLocalLum(list/affected)
+ if(!affected)
+ if(isturf(loc))
+ affected = view(sd_top_luminosity,loc)
+ else
+ affected = view(sd_top_luminosity,src)
+ . = ..(affected)
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 11af9254b7..b146a7bd94 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -17,127 +17,127 @@
var/locked = 0
var/drainratio = 1
- process()
- if(P)
- if(P.air_contents.toxins <= 0)
- investigate_log("out of fuel.","singulo")
- P.air_contents.toxins = 0
- eject()
- else
- P.air_contents.toxins -= 0.001*drainratio
- return
-
-
- attack_hand(mob/user as mob)
- if(anchored)
- if(!src.locked)
- toggle_power()
- user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
- "You turn the [src.name] [active? "on":"off"].")
- investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo")
- return
- else
- user << "\red The controls are locked!"
- return
- ..()
-
-
- attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/device/analyzer))
- user << "\blue The [W.name] detects that [last_power]W were recently produced."
- return 1
- else if(istype(W, /obj/item/weapon/tank/plasma))
- if(!src.anchored)
- user << "\red The [src] needs to be secured to the floor first."
- return 1
- if(src.P)
- user << "\red There's already a plasma tank loaded."
- return 1
- user.drop_item()
- src.P = W
- W.loc = src
- updateicon()
- else if(istype(W, /obj/item/weapon/crowbar))
- if(P && !src.locked)
- eject()
- return 1
- else if(istype(W, /obj/item/weapon/wrench))
- if(P)
- user << "\blue Remove the plasma tank first."
- return 1
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- src.anchored = !src.anchored
- user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \
- "You [anchored? "secure":"undo"] the external bolts.", \
- "You hear a ratchet")
- if(anchored)
- connect_to_network()
- else
- disconnect_from_network()
- else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
- if(active)
- src.locked = !src.locked
- user << "The controls are now [src.locked ? "locked." : "unlocked."]"
- else
- src.locked = 0 //just in case it somehow gets locked
- user << "\red The controls can only be locked when the [src] is active"
- else
- user << "\red Access denied!"
- return 1
+/obj/machinery/power/rad_collector/process()
+ if(P)
+ if(P.air_contents.toxins <= 0)
+ investigate_log("out of fuel.","singulo")
+ P.air_contents.toxins = 0
+ eject()
else
- ..()
- return 1
+ P.air_contents.toxins -= 0.001*drainratio
+ return
- ex_act(severity)
- switch(severity)
- if(2, 3)
- eject()
- return ..()
-
-
- proc/eject()
- locked = 0
- var/obj/item/weapon/tank/plasma/Z = src.P
- if (!Z)
- return
- Z.loc = get_turf(src)
- Z.layer = initial(Z.layer)
- src.P = null
- if(active)
+/obj/machinery/power/rad_collector/attack_hand(mob/user as mob)
+ if(anchored)
+ if(!src.locked)
toggle_power()
- else
- updateicon()
-
- proc/receive_pulse(var/pulse_strength)
- if(P && active)
- var/power_produced = 0
- power_produced = P.air_contents.toxins*pulse_strength*20
- add_avail(power_produced)
- last_power = power_produced
+ user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
+ "You turn the [src.name] [active? "on":"off"].")
+ investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo")
return
- return
-
-
- proc/updateicon()
- overlays = null
- if(P)
- overlays += image('icons/obj/singularity.dmi', "ptank")
- if(stat & (NOPOWER|BROKEN))
- return
- if(active)
- overlays += image('icons/obj/singularity.dmi', "on")
-
-
- proc/toggle_power()
- active = !active
- if(active)
- icon_state = "ca_on"
- flick("ca_active", src)
else
- icon_state = "ca"
- flick("ca_deactive", src)
+ user << "\red The controls are locked!"
+ return
+..()
+
+
+/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/device/analyzer))
+ user << "\blue The [W.name] detects that [last_power]W were recently produced."
+ return 1
+ else if(istype(W, /obj/item/weapon/tank/plasma))
+ if(!src.anchored)
+ user << "\red The [src] needs to be secured to the floor first."
+ return 1
+ if(src.P)
+ user << "\red There's already a plasma tank loaded."
+ return 1
+ user.drop_item()
+ src.P = W
+ W.loc = src
updateicon()
- return
+ else if(istype(W, /obj/item/weapon/crowbar))
+ if(P && !src.locked)
+ eject()
+ return 1
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(P)
+ user << "\blue Remove the plasma tank first."
+ return 1
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ src.anchored = !src.anchored
+ user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \
+ "You [anchored? "secure":"undo"] the external bolts.", \
+ "You hear a ratchet")
+ if(anchored)
+ connect_to_network()
+ else
+ disconnect_from_network()
+ else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
+ if (src.allowed(user))
+ if(active)
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ else
+ src.locked = 0 //just in case it somehow gets locked
+ user << "\red The controls can only be locked when the [src] is active"
+ else
+ user << "\red Access denied!"
+ return 1
+ else
+ ..()
+ return 1
+
+
+/obj/machinery/power/rad_collector/ex_act(severity)
+ switch(severity)
+ if(2, 3)
+ eject()
+ return ..()
+
+
+/obj/machinery/power/rad_collector/proc/eject()
+ locked = 0
+ var/obj/item/weapon/tank/plasma/Z = src.P
+ if (!Z)
+ return
+ Z.loc = get_turf(src)
+ Z.layer = initial(Z.layer)
+ src.P = null
+ if(active)
+ toggle_power()
+ else
+ updateicon()
+
+/obj/machinery/power/rad_collector/proc/receive_pulse(var/pulse_strength)
+ if(P && active)
+ var/power_produced = 0
+ power_produced = P.air_contents.toxins*pulse_strength*20
+ add_avail(power_produced)
+ last_power = power_produced
+ return
+ return
+
+
+/obj/machinery/power/rad_collector/proc/updateicon()
+ overlays = null
+ if(P)
+ overlays += image('icons/obj/singularity.dmi', "ptank")
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(active)
+ overlays += image('icons/obj/singularity.dmi', "on")
+
+
+/obj/machinery/power/rad_collector/proc/toggle_power()
+ active = !active
+ if(active)
+ icon_state = "ca_on"
+ flick("ca_active", src)
+ else
+ icon_state = "ca"
+ flick("ca_deactive", src)
+ updateicon()
+ return
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 5a9d966e38..a61cadbea1 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -13,99 +13,99 @@
var/obj/machinery/field_generator/FG2 = null
var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
- New()
- spawn(1)
- src.sd_SetLuminosity(5)
+/obj/machinery/containment_field/New()
+ spawn(1)
+ src.sd_SetLuminosity(5)
- Del()
- if(FG1 && !FG1.clean_up)
- FG1.cleanup()
- if(FG2 && !FG2.clean_up)
- FG2.cleanup()
- ..()
+/obj/machinery/containment_field/Del()
+ if(FG1 && !FG1.clean_up)
+ FG1.cleanup()
+ if(FG2 && !FG2.clean_up)
+ FG2.cleanup()
+ ..()
- attack_hand(mob/user as mob)
- if(get_dist(src, user) > 1)
- return 0
- else
- shock(user)
- return 1
-
-
- blob_act()
+/obj/machinery/containment_field/attack_hand(mob/user as mob)
+ if(get_dist(src, user) > 1)
return 0
+ else
+ shock(user)
+ return 1
- ex_act(severity)
+/obj/machinery/containment_field/blob_act()
+ return 0
+
+
+/obj/machinery/containment_field/ex_act(severity)
+ return 0
+
+
+/obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj)
+ if(istype(AM,/mob/living/silicon) && prob(40))
+ shock(AM)
+ return 1
+ if(istype(AM,/mob/living/carbon) && prob(50))
+ shock(AM)
+ return 1
+ return 0
+
+
+
+/obj/machinery/containment_field/proc/shock(mob/living/user as mob)
+ if(hasShocked)
return 0
-
-
- HasProximity(atom/movable/AM as mob|obj)
- if(istype(AM,/mob/living/silicon) && prob(40))
- shock(AM)
- return 1
- if(istype(AM,/mob/living/carbon) && prob(50))
- shock(AM)
- return 1
+ if(!FG1 || !FG2)
+ del(src)
return 0
+ if(iscarbon(user))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, user.loc)
+ s.start()
+ hasShocked = 1
+ var/shock_damage = min(rand(30,40),rand(30,40))
+ user.burn_skin(shock_damage)
+ user.updatehealth()
+ user.visible_message("\red [user.name] was shocked by the [src.name]!", \
+ "\red You feel a powerful shock course through your body sending you flying!", \
+ "\red You hear a heavy electrical crack")
- proc
- shock(mob/living/user as mob)
- if(hasShocked)
- return 0
- if(!FG1 || !FG2)
- del(src)
- return 0
- if(iscarbon(user))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, user.loc)
- s.start()
+ var/stun = min(shock_damage, 15)
+ user.Stun(stun)
+ user.Weaken(10)
- hasShocked = 1
- var/shock_damage = min(rand(30,40),rand(30,40))
- user.burn_skin(shock_damage)
- user.updatehealth()
- user.visible_message("\red [user.name] was shocked by the [src.name]!", \
- "\red You feel a powerful shock course through your body sending you flying!", \
- "\red You hear a heavy electrical crack")
+ user.updatehealth()
+ var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
+ user.throw_at(target, 200, 4)
- var/stun = min(shock_damage, 15)
- user.Stun(stun)
- user.Weaken(10)
+ sleep(20)
+ hasShocked = 0
+ return
- user.updatehealth()
- var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
- user.throw_at(target, 200, 4)
+ else if(issilicon(user))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, user.loc)
+ s.start()
- sleep(20)
- hasShocked = 0
- return
+ hasShocked = 1
+ var/shock_damage = rand(15,30)
+ user.take_overall_damage(0,shock_damage)
+ user.visible_message("\red [user.name] was shocked by the [src.name]!", \
+ "\red Energy pulse detected, system damaged!", \
+ "\red You hear an electrical crack")
+ if(prob(20))
+ user.Stun(2)
- else if(issilicon(user))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, user.loc)
- s.start()
+ sleep(20)
+ hasShocked = 0
+ return
- hasShocked = 1
- var/shock_damage = rand(15,30)
- user.take_overall_damage(0,shock_damage)
- user.visible_message("\red [user.name] was shocked by the [src.name]!", \
- "\red Energy pulse detected, system damaged!", \
- "\red You hear an electrical crack")
- if(prob(20))
- user.Stun(2)
+ return
- sleep(20)
- hasShocked = 0
- return
-
- return
-
- set_master(var/master1,var/master2)
- if(!master1 || !master2)
- return 0
- FG1 = master1
- FG2 = master2
- return 1
+/obj/machinery/containment_field/proc/set_master(var/master1,var/master2)
+ if(!master1 || !master2)
+ return 0
+ FG1 = master1
+ FG2 = master2
+ return 1
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index f4770c51e3..777b3fc054 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -21,192 +21,192 @@
var/locked = 0
- verb/rotate()
- set name = "Rotate"
- set category = "Object"
- set src in oview(1)
+/obj/machinery/emitter/verb/rotate()
+ set name = "Rotate"
+ set category = "Object"
+ set src in oview(1)
- if (src.anchored || usr:stat)
- usr << "It is fastened to the floor!"
- return 0
- src.dir = turn(src.dir, 90)
- return 1
+ if (src.anchored || usr:stat)
+ usr << "It is fastened to the floor!"
+ return 0
+ src.dir = turn(src.dir, 90)
+ return 1
- New()
- ..()
- return
+/obj/machinery/emitter/New()
+ ..()
+ return
- Del()
- investigate_log("deleted at ([x],[y],[z])","singulo")
- ..()
+/obj/machinery/emitter/Del()
+ investigate_log("deleted at ([x],[y],[z])","singulo")
+ ..()
- update_icon()
- if (active && !(stat & (NOPOWER|BROKEN)))
- icon_state = "emitter_+a"
- else
- icon_state = "emitter"
+/obj/machinery/emitter/update_icon()
+ if (active && !(stat & (NOPOWER|BROKEN)))
+ icon_state = "emitter_+a"
+ else
+ icon_state = "emitter"
- attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- if(state == 2)
- if(!src.locked)
- if(src.active==1)
- src.active = 0
- user << "You turn off the [src]."
- src.use_power = 1
- investigate_log("turned off by [user.key]","singulo")
- else
- src.active = 1
- user << "You turn on the [src]."
- src.shot_number = 0
- src.fire_delay = 100
- src.use_power = 2
- investigate_log("turned on by [user.key]","singulo")
- update_icon()
- else
- user << "\red The controls are locked!"
- else
- user << "\red The [src] needs to be firmly secured to the floor first."
- return 1
-
-
- emp_act(var/severity)//Emitters are hardened but still might have issues
- use_power(50)
- if((severity == 1)&&prob(1)&&prob(1))
- if(src.active)
+/obj/machinery/emitter/attack_hand(mob/user as mob)
+ src.add_fingerprint(user)
+ if(state == 2)
+ if(!src.locked)
+ if(src.active==1)
src.active = 0
+ user << "You turn off the [src]."
src.use_power = 1
+ investigate_log("turned off by [user.key]","singulo")
+ else
+ src.active = 1
+ user << "You turn on the [src]."
+ src.shot_number = 0
+ src.fire_delay = 100
+ src.use_power = 2
+ investigate_log("turned on by [user.key]","singulo")
+ update_icon()
+ else
+ user << "\red The controls are locked!"
+ else
+ user << "\red The [src] needs to be firmly secured to the floor first."
return 1
- process()
- if(stat & (NOPOWER|BROKEN))
- return
- if(src.state != 2)
+/obj/machinery/emitter/emp_act(var/severity)//Emitters are hardened but still might have issues
+ use_power(50)
+ if((severity == 1)&&prob(1)&&prob(1))
+ if(src.active)
src.active = 0
+ src.use_power = 1
+ return 1
+
+
+/obj/machinery/emitter/process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(src.state != 2)
+ src.active = 0
+ return
+ if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
+ src.last_shot = world.time
+ if(src.shot_number < 3)
+ src.fire_delay = 2
+ src.shot_number ++
+ else
+ src.fire_delay = rand(20,100)
+ src.shot_number = 0
+ use_power(1000)
+ var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
+ playsound(src.loc, 'emitter.ogg', 25, 1)
+ if(prob(35))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ A.dir = src.dir
+ if(src.dir == 1)//Up
+ A.yo = 20
+ A.xo = 0
+ else if(src.dir == 2)//Down
+ A.yo = -20
+ A.xo = 0
+ else if(src.dir == 4)//Right
+ A.yo = 0
+ A.xo = 20
+ else if(src.dir == 8)//Left
+ A.yo = 0
+ A.xo = -20
+ else // Any other
+ A.yo = -20
+ A.xo = 0
+ A.process()
+
+
+/obj/machinery/emitter/attackby(obj/item/W, mob/user)
+
+ if(istype(W, /obj/item/weapon/wrench))
+ if(active)
+ user << "Turn off the [src] first."
return
- if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
- src.last_shot = world.time
- if(src.shot_number < 3)
- src.fire_delay = 2
- src.shot_number ++
- else
- src.fire_delay = rand(20,100)
- src.shot_number = 0
- use_power(1000)
- var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
- playsound(src.loc, 'emitter.ogg', 25, 1)
- if(prob(35))
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- A.dir = src.dir
- if(src.dir == 1)//Up
- A.yo = 20
- A.xo = 0
- else if(src.dir == 2)//Down
- A.yo = -20
- A.xo = 0
- else if(src.dir == 4)//Right
- A.yo = 0
- A.xo = 20
- else if(src.dir == 8)//Left
- A.yo = 0
- A.xo = -20
- else // Any other
- A.yo = -20
- A.xo = 0
- A.process()
+ switch(state)
+ if(0)
+ state = 1
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
+ "You secure the external reinforcing bolts to the floor.", \
+ "You hear a ratchet")
+ src.anchored = 1
+ if(1)
+ state = 0
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ "You undo the external reinforcing bolts.", \
+ "You hear a ratchet")
+ src.anchored = 0
+ if(2)
+ user << "\red The [src.name] needs to be unwelded from the floor."
+ return
-
- attackby(obj/item/W, mob/user)
-
- if(istype(W, /obj/item/weapon/wrench))
- if(active)
- user << "Turn off the [src] first."
- return
- switch(state)
- if(0)
- state = 1
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secures [src.name] to the floor.", \
- "You secure the external reinforcing bolts to the floor.", \
- "You hear a ratchet")
- src.anchored = 1
- if(1)
- state = 0
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
- "You undo the external reinforcing bolts.", \
- "You hear a ratchet")
- src.anchored = 0
- if(2)
- user << "\red The [src.name] needs to be unwelded from the floor."
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(active)
+ user << "Turn off the [src] first."
return
-
- if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(active)
- user << "Turn off the [src] first."
- return
- switch(state)
- if(0)
- user << "\red The [src.name] needs to be wrenched to the floor."
- if(1)
- if (WT.remove_fuel(0,user))
- playsound(src.loc, 'Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
- "You start to weld the [src] to the floor.", \
- "You hear welding")
- if (do_after(user,20))
- if(!src || !WT.isOn()) return
- state = 2
- user << "You weld the [src] to the floor."
- else
- user << "\red You need more welding fuel to complete this task."
- if(2)
- if (WT.remove_fuel(0,user))
- playsound(src.loc, 'Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
- "You start to cut the [src] free from the floor.", \
- "You hear welding")
- if (do_after(user,20))
- if(!src || !WT.isOn()) return
- state = 1
- user << "You cut the [src] free from the floor."
- else
- user << "\red You need more welding fuel to complete this task."
- return
-
- if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
- if(emagged)
- user << "\red The lock seems to be broken"
- return
- if(src.allowed(user))
- if(active)
- src.locked = !src.locked
- user << "The controls are now [src.locked ? "locked." : "unlocked."]"
+ switch(state)
+ if(0)
+ user << "\red The [src.name] needs to be wrenched to the floor."
+ if(1)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ "You start to weld the [src] to the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 2
+ user << "You weld the [src] to the floor."
else
- src.locked = 0 //just in case it somehow gets locked
- user << "\red The controls can only be locked when the [src] is online"
+ user << "\red You need more welding fuel to complete this task."
+ if(2)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ "You start to cut the [src] free from the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 1
+ user << "You cut the [src] free from the floor."
+ else
+ user << "\red You need more welding fuel to complete this task."
+ return
+
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(emagged)
+ user << "\red The lock seems to be broken"
+ return
+ if(src.allowed(user))
+ if(active)
+ src.locked = !src.locked
+ user << "The controls are now [src.locked ? "locked." : "unlocked."]"
else
- user << "\red Access denied."
- return
-
-
- if(istype(W, /obj/item/weapon/card/emag) && !emagged)
- locked = 0
- emagged = 1
- user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
- return
-
- ..()
+ src.locked = 0 //just in case it somehow gets locked
+ user << "\red The controls can only be locked when the [src] is online"
+ else
+ user << "\red Access denied."
return
- power_change()
- ..()
- update_icon()
+ if(istype(W, /obj/item/weapon/card/emag) && !emagged)
+ locked = 0
+ emagged = 1
+ user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.")
return
+
+ ..()
+ return
+
+
+/obj/machinery/emitter/power_change()
+ ..()
+ update_icon()
+ return
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 5f2a62253e..c8003d6c06 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -33,318 +33,318 @@ field_generator power level display
var/clean_up = 0
- update_icon()
- overlays = null
- if(!active)
- if(warming_up)
- overlays += "+a[warming_up]"
- if(fields.len)
- overlays += "+on"
- // Power level indicator
- // Scale % power to % num_power_levels and truncate value
- var/level = round(num_power_levels * power / field_generator_max_power)
- // Clamp between 0 and num_power_levels for out of range power values
- level = between(0, level, num_power_levels)
- if(level)
- overlays += "+p[level]"
+/obj/machinery/field_generator/update_icon()
+ overlays = null
+ if(!active)
+ if(warming_up)
+ overlays += "+a[warming_up]"
+ if(fields.len)
+ overlays += "+on"
+ // Power level indicator
+ // Scale % power to % num_power_levels and truncate value
+ var/level = round(num_power_levels * power / field_generator_max_power)
+ // Clamp between 0 and num_power_levels for out of range power values
+ level = between(0, level, num_power_levels)
+ if(level)
+ overlays += "+p[level]"
- return
+ return
- New()
- ..()
- fields = list()
- connected_gens = list()
- return
+/obj/machinery/field_generator/New()
+ ..()
+ fields = list()
+ connected_gens = list()
+ return
- process()
- if(Varedit_start == 1)
- if(active == 0)
- active = 1
- state = 2
- power = field_generator_max_power
- anchored = 1
- warming_up = 3
- start_fields()
- update_icon()
- Varedit_start = 0
-
- if(src.active == 2)
- calc_power()
- update_icon()
- return
-
-
- attack_hand(mob/user as mob)
- if(state == 2)
- if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
- if(src.active >= 1)
- user << "You are unable to turn off the [src.name] once it is online."
- return 1
- else
- user.visible_message("[user.name] turns on the [src.name]", \
- "You turn on the [src.name].", \
- "You hear heavy droning")
- turn_on()
- investigate_log("activated by [user.key].","singulo")
-
- src.add_fingerprint(user)
- else
- user << "The [src] needs to be firmly secured to the floor first."
- return
-
-
- attackby(obj/item/W, mob/user)
- if(active)
- user << "The [src] needs to be off."
- return
- else if(istype(W, /obj/item/weapon/wrench))
- switch(state)
- if(0)
- state = 1
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secures [src.name] to the floor.", \
- "You secure the external reinforcing bolts to the floor.", \
- "You hear ratchet")
- src.anchored = 1
- if(1)
- state = 0
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
- "You undo the external reinforcing bolts.", \
- "You hear ratchet")
- src.anchored = 0
- if(2)
- user << "\red The [src.name] needs to be unwelded from the floor."
- return
- else if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- switch(state)
- if(0)
- user << "\red The [src.name] needs to be wrenched to the floor."
- return
- if(1)
- if (WT.remove_fuel(0,user))
- playsound(src.loc, 'Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
- "You start to weld the [src] to the floor.", \
- "You hear welding")
- if (do_after(user,20))
- if(!src || !WT.isOn()) return
- state = 2
- user << "You weld the field generator to the floor."
- else
- return
- if(2)
- if (WT.remove_fuel(0,user))
- playsound(src.loc, 'Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
- "You start to cut the [src] free from the floor.", \
- "You hear welding")
- if (do_after(user,20))
- if(!src || !WT.isOn()) return
- state = 1
- user << "You cut the [src] free from the floor."
- else
- return
- else
- ..()
- return
-
-
- emp_act()
- return 0
-
-
- blob_act()
- if(active)
- return 0
- else
- ..()
-
-
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.flag != "bullet")
- power += Proj.damage
- update_icon()
- return 0
-
-
- Del()
- src.cleanup()
- ..()
-
-
- proc
- turn_off()
- active = 0
- spawn(1)
- src.cleanup()
- update_icon()
-
- turn_on()
+/obj/machinery/field_generator/process()
+ if(Varedit_start == 1)
+ if(active == 0)
active = 1
- warming_up = 1
- spawn(1)
- while (warming_up<3 && active)
- sleep(50)
- warming_up++
- update_icon()
- if(warming_up >= 3)
- start_fields()
+ state = 2
+ power = field_generator_max_power
+ anchored = 1
+ warming_up = 3
+ start_fields()
update_icon()
+ Varedit_start = 0
-
+ if(src.active == 2)
calc_power()
- if(Varpower)
- return 1
+ update_icon()
+ return
- update_icon()
- if(src.power > field_generator_max_power)
- src.power = field_generator_max_power
- var/power_draw = 2
- for (var/obj/machinery/containment_field/F in fields)
- if (isnull(F))
- continue
- power_draw++
- if(draw_power(round(power_draw/2,1)))
+/obj/machinery/field_generator/attack_hand(mob/user as mob)
+ if(state == 2)
+ if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
+ if(src.active >= 1)
+ user << "You are unable to turn off the [src.name] once it is online."
return 1
else
- for(var/mob/M in viewers(src))
- M.show_message("\red The [src.name] shuts down!")
- turn_off()
- investigate_log("ran out of power and deactivated","singulo")
- src.power = 0
- return 0
+ user.visible_message("[user.name] turns on the [src.name]", \
+ "You turn on the [src.name].", \
+ "You hear heavy droning")
+ turn_on()
+ investigate_log("activated by [user.key].","singulo")
+
+ src.add_fingerprint(user)
+ else
+ user << "The [src] needs to be firmly secured to the floor first."
+ return
+
+
+/obj/machinery/field_generator/attackby(obj/item/W, mob/user)
+ if(active)
+ user << "The [src] needs to be off."
+ return
+ else if(istype(W, /obj/item/weapon/wrench))
+ switch(state)
+ if(0)
+ state = 1
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
+ "You secure the external reinforcing bolts to the floor.", \
+ "You hear ratchet")
+ src.anchored = 1
+ if(1)
+ state = 0
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ "You undo the external reinforcing bolts.", \
+ "You hear ratchet")
+ src.anchored = 0
+ if(2)
+ user << "\red The [src.name] needs to be unwelded from the floor."
+ return
+ else if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ switch(state)
+ if(0)
+ user << "\red The [src.name] needs to be wrenched to the floor."
+ return
+ if(1)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ "You start to weld the [src] to the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 2
+ user << "You weld the field generator to the floor."
+ else
+ return
+ if(2)
+ if (WT.remove_fuel(0,user))
+ playsound(src.loc, 'Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ "You start to cut the [src] free from the floor.", \
+ "You hear welding")
+ if (do_after(user,20))
+ if(!src || !WT.isOn()) return
+ state = 1
+ user << "You cut the [src] free from the floor."
+ else
+ return
+ else
+ ..()
+ return
+
+
+/obj/machinery/field_generator/emp_act()
+ return 0
+
+
+/obj/machinery/field_generator/blob_act()
+ if(active)
+ return 0
+ else
+ ..()
+
+
+/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.flag != "bullet")
+ power += Proj.damage
+ update_icon()
+ return 0
+
+
+/obj/machinery/field_generator/Del()
+ src.cleanup()
+ ..()
+
+
+
+/obj/machinery/field_generator/proc/turn_off()
+ active = 0
+ spawn(1)
+ src.cleanup()
+ update_icon()
+
+/obj/machinery/field_generator/proc/turn_on()
+ active = 1
+ warming_up = 1
+ spawn(1)
+ while (warming_up<3 && active)
+ sleep(50)
+ warming_up++
+ update_icon()
+ if(warming_up >= 3)
+ start_fields()
+ update_icon()
+
+
+/obj/machinery/field_generator/proc/calc_power()
+ if(Varpower)
+ return 1
+
+ update_icon()
+ if(src.power > field_generator_max_power)
+ src.power = field_generator_max_power
+
+ var/power_draw = 2
+ for (var/obj/machinery/containment_field/F in fields)
+ if (isnull(F))
+ continue
+ power_draw++
+ if(draw_power(round(power_draw/2,1)))
+ return 1
+ else
+ for(var/mob/M in viewers(src))
+ M.show_message("\red The [src.name] shuts down!")
+ turn_off()
+ investigate_log("ran out of power and deactivated","singulo")
+ src.power = 0
+ return 0
//This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport
- draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null)
- if(Varpower)
- return 1
- if((G && G == src) || (failsafe >= 8))//Loopin, set fail
- return 0
- else
- failsafe++
- if(src.power >= draw)//We have enough power
- src.power -= draw
- return 1
- else//Need more power
- draw -= src.power
- src.power = 0
- for(var/obj/machinery/field_generator/FG in connected_gens)
- if(isnull(FG))
- continue
- if(FG == last)//We just asked you
- continue
- if(G)//Another gen is askin for power and we dont have it
- if(FG.draw_power(draw,failsafe,G,src))//Can you take the load
- return 1
- else
- return 0
- else//We are askin another for power
- if(FG.draw_power(draw,failsafe,src,src))
- return 1
- else
- return 0
-
-
- start_fields()
- if(!src.state == 2 || !anchored)
- turn_off()
- return
- spawn(1)
- setup_field(1)
- spawn(2)
- setup_field(2)
- spawn(3)
- setup_field(4)
- spawn(4)
- setup_field(8)
- src.active = 2
-
-
- setup_field(var/NSEW)
- var/turf/T = src.loc
- var/obj/machinery/field_generator/G
- var/steps = 0
- if(!NSEW)//Make sure its ran right
- return
- for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
- T = get_step(T, NSEW)
- if(T.density)//We cant shoot a field though this
+/obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null)
+ if(Varpower)
+ return 1
+ if((G && G == src) || (failsafe >= 8))//Loopin, set fail
+ return 0
+ else
+ failsafe++
+ if(src.power >= draw)//We have enough power
+ src.power -= draw
+ return 1
+ else//Need more power
+ draw -= src.power
+ src.power = 0
+ for(var/obj/machinery/field_generator/FG in connected_gens)
+ if(isnull(FG))
+ continue
+ if(FG == last)//We just asked you
+ continue
+ if(G)//Another gen is askin for power and we dont have it
+ if(FG.draw_power(draw,failsafe,G,src))//Can you take the load
+ return 1
+ else
+ return 0
+ else//We are askin another for power
+ if(FG.draw_power(draw,failsafe,src,src))
+ return 1
+ else
return 0
- for(var/atom/A in T.contents)
- if(ismob(A))
- continue
- if(!istype(A,/obj/machinery/field_generator))
- if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density))
- return 0
- steps += 1
- G = locate(/obj/machinery/field_generator) in T
- if(!isnull(G))
- steps -= 1
- if(!G.active)
- return 0
- break
- if(isnull(G))
- return
- T = src.loc
- for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
- var/field_dir = get_dir(T,get_step(G.loc, NSEW))
- T = get_step(T, NSEW)
- if(!locate(/obj/machinery/containment_field) in T)
- var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field()
- CF.set_master(src,G)
- fields += CF
- G.fields += CF
- CF.loc = T
- CF.dir = field_dir
- var/listcheck = 0
- for(var/obj/machinery/field_generator/FG in connected_gens)
- if (isnull(FG))
- continue
- if(FG == G)
- listcheck = 1
- break
- if(!listcheck)
- connected_gens.Add(G)
- listcheck = 0
- for(var/obj/machinery/field_generator/FG2 in G.connected_gens)
- if (isnull(FG2))
- continue
- if(FG2 == src)
- listcheck = 1
- break
- if(!listcheck)
- G.connected_gens.Add(src)
- cleanup()
- clean_up = 1
- for (var/obj/machinery/containment_field/F in fields)
- if (isnull(F))
- continue
- del(F)
- fields = list()
- for(var/obj/machinery/field_generator/FG in connected_gens)
- if (isnull(FG))
- continue
- FG.connected_gens.Remove(src)
- connected_gens.Remove(FG)
- connected_gens = list()
- clean_up = 0
+/obj/machinery/field_generator/proc/start_fields()
+ if(!src.state == 2 || !anchored)
+ turn_off()
+ return
+ spawn(1)
+ setup_field(1)
+ spawn(2)
+ setup_field(2)
+ spawn(3)
+ setup_field(4)
+ spawn(4)
+ setup_field(8)
+ src.active = 2
- //This is here to help fight the "hurr durr, release singulo cos nobody will notice before the
- //singulo eats the evidence". It's not fool-proof but better than nothing.
- //I want to avoid using global variables.
- spawn(1)
- var/temp = 1 //stops spam
- for(var/obj/machinery/singularity/O in world)
- if(O.last_warning && temp)
- if((world.time - O.last_warning) > 50) //to stop message-spam
- temp = 0
- message_admins("A singulo exists and a containment field has failed.",1)
- investigate_log("has failed whilst a singulo exists.","singulo")
- O.last_warning = world.time
+
+/obj/machinery/field_generator/proc/setup_field(var/NSEW)
+ var/turf/T = src.loc
+ var/obj/machinery/field_generator/G
+ var/steps = 0
+ if(!NSEW)//Make sure its ran right
+ return
+ for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
+ T = get_step(T, NSEW)
+ if(T.density)//We cant shoot a field though this
+ return 0
+ for(var/atom/A in T.contents)
+ if(ismob(A))
+ continue
+ if(!istype(A,/obj/machinery/field_generator))
+ if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density))
+ return 0
+ steps += 1
+ G = locate(/obj/machinery/field_generator) in T
+ if(!isnull(G))
+ steps -= 1
+ if(!G.active)
+ return 0
+ break
+ if(isnull(G))
+ return
+ T = src.loc
+ for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
+ var/field_dir = get_dir(T,get_step(G.loc, NSEW))
+ T = get_step(T, NSEW)
+ if(!locate(/obj/machinery/containment_field) in T)
+ var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field()
+ CF.set_master(src,G)
+ fields += CF
+ G.fields += CF
+ CF.loc = T
+ CF.dir = field_dir
+ var/listcheck = 0
+ for(var/obj/machinery/field_generator/FG in connected_gens)
+ if (isnull(FG))
+ continue
+ if(FG == G)
+ listcheck = 1
+ break
+ if(!listcheck)
+ connected_gens.Add(G)
+ listcheck = 0
+ for(var/obj/machinery/field_generator/FG2 in G.connected_gens)
+ if (isnull(FG2))
+ continue
+ if(FG2 == src)
+ listcheck = 1
+ break
+ if(!listcheck)
+ G.connected_gens.Add(src)
+
+
+/obj/machinery/field_generator/proc/cleanup()
+ clean_up = 1
+ for (var/obj/machinery/containment_field/F in fields)
+ if (isnull(F))
+ continue
+ del(F)
+ fields = list()
+ for(var/obj/machinery/field_generator/FG in connected_gens)
+ if (isnull(FG))
+ continue
+ FG.connected_gens.Remove(src)
+ connected_gens.Remove(FG)
+ connected_gens = list()
+ clean_up = 0
+
+ //This is here to help fight the "hurr durr, release singulo cos nobody will notice before the
+ //singulo eats the evidence". It's not fool-proof but better than nothing.
+ //I want to avoid using global variables.
+ spawn(1)
+ var/temp = 1 //stops spam
+ for(var/obj/machinery/singularity/O in world)
+ if(O.last_warning && temp)
+ if((world.time - O.last_warning) > 50) //to stop message-spam
+ temp = 0
+ message_admins("A singulo exists and a containment field has failed.",1)
+ investigate_log("has failed whilst a singulo exists.","singulo")
+ O.last_warning = world.time
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index cb8e51d792..eb9c7756a1 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -10,66 +10,66 @@
var/movement_range = 10
var/energy = 10
- weak
- movement_range = 8
- energy = 5
+/obj/effect/accelerated_particle/weak
+ movement_range = 8
+ energy = 5
- strong
- movement_range = 15
- energy = 15
+/obj/effect/accelerated_particle/strong
+ movement_range = 15
+ energy = 15
- New(loc, dir = 2)
- src.loc = loc
- src.dir = dir
- if(movement_range > 20)
- movement_range = 20
- spawn(0)
- move(1)
- return
+/obj/effect/accelerated_particle/New(loc, dir = 2)
+ src.loc = loc
+ src.dir = dir
+ if(movement_range > 20)
+ movement_range = 20
+ spawn(0)
+ move(1)
+ return
- Bump(atom/A)
- if (A)
- if(ismob(A))
- toxmob(A)
- if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/)))
- A:energy += energy
- return
-
-
- Bumped(atom/A)
+/obj/effect/accelerated_particle/Bump(atom/A)
+ if (A)
if(ismob(A))
- Bump(A)
- return
+ toxmob(A)
+ if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/)))
+ A:energy += energy
+ return
- ex_act(severity)
- del(src)
- return
+/obj/effect/accelerated_particle/Bumped(atom/A)
+ if(ismob(A))
+ Bump(A)
+ return
- proc
- toxmob(var/mob/living/M)
- var/radiation = (energy*2)
+/obj/effect/accelerated_particle/ex_act(severity)
+ del(src)
+ return
+
+
+
+/obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M)
+ var/radiation = (energy*2)
/* if(istype(M,/mob/living/carbon/human))
- if(M:wear_suit) //TODO: check for radiation protection
- radiation = round(radiation/2,1)
- if(istype(M,/mob/living/carbon/monkey))
- if(M:wear_suit) //TODO: check for radiation protection
- radiation = round(radiation/2,1)*/
- M.apply_effect((radiation*3),IRRADIATE,0)
- M.updatehealth()
- //M << "\red You feel odd."
- return
+ if(M:wear_suit) //TODO: check for radiation protection
+ radiation = round(radiation/2,1)
+ if(istype(M,/mob/living/carbon/monkey))
+ if(M:wear_suit) //TODO: check for radiation protection
+ radiation = round(radiation/2,1)*/
+ M.apply_effect((radiation*3),IRRADIATE,0)
+ M.updatehealth()
+ //M << "\red You feel odd."
+ return
- move(var/lag)
- if(!step(src,dir))
- src.loc = get_step(src,dir)
- movement_range--
- if(movement_range <= 0)
- del(src)
- else
- sleep(lag)
- move(lag)
+/obj/effect/accelerated_particle/proc/move(var/lag)
+ if(!step(src,dir))
+ src.loc = get_step(src,dir)
+ movement_range--
+ if(movement_range <= 0)
+ del(src)
+ else
+ sleep(lag)
+ move(lag)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 327363433f..d54ffb2f9e 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -71,212 +71,187 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
var/strength = null
var/desc_holder = null
- end_cap
- name = "Alpha Particle Generation Array"
- desc_holder = "This is where Alpha particles are generated from \[REDACTED\]"
- icon_state = "end_cap"
- reference = "end_cap"
+/obj/structure/particle_accelerator/end_cap
+ name = "Alpha Particle Generation Array"
+ desc_holder = "This is where Alpha particles are generated from \[REDACTED\]"
+ icon_state = "end_cap"
+ reference = "end_cap"
-/* update_icon()
- switch(construction_state)
- if(0)
- icon_state="[reference]"
- if(1)
- icon_state="[reference]"
- if(2)
- icon_state="[reference]w"
- if(3)
- if(powered)
- switch(strength)
- if(0)
- icon_state="[reference]p0"
- if(1)
- icon_state="[reference]p1"
- if(2)
- icon_state="[reference]p2"
- else
- icon_state="[reference]p"
- else
- icon_state="[reference]c"
+/obj/structure/particle_accelerator/update_icon()
+ ..()
+ return
+
+
+/obj/structure/particle_accelerator/verb/rotate()
+ set name = "Rotate Clockwise"
+ set category = "Object"
+ set src in oview(1)
+
+ if (src.anchored || usr:stat)
+ usr << "It is fastened to the floor!"
+ return 0
+ src.dir = turn(src.dir, 270)
+ return 1
+
+/obj/structure/particle_accelerator/verb/rotateccw()
+ set name = "Rotate Counter Clockwise"
+ set category = "Object"
+ set src in oview(1)
+
+ if (src.anchored || usr:stat)
+ usr << "It is fastened to the floor!"
+ return 0
+ src.dir = turn(src.dir, 90)
+ return 1
+
+/obj/structure/particle_accelerator/examine()
+ switch(src.construction_state)
+ if(0)
+ src.desc = text("A [name], looks like it's not attached to the flooring")
+ if(1)
+ src.desc = text("A [name], it is missing some cables")
+ if(2)
+ src.desc = text("A [name], the panel is open")
+ if(3)
+ src.desc = text("The [name] is assembled")
+ if(powered)
+ src.desc = src.desc_holder
+ ..()
+ return
+
+
+/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user)
+ if(istool(W))
+ if(src.process_tool_hit(W,user))
return
-*/
+ ..()
+ return
- update_icon()
- ..()
+
+/obj/structure/particle_accelerator/Move()
+ ..()
+ if(master && master.active)
+ master.toggle_power()
+ investigate_log("was moved whilst active; it powered down.","singulo")
+
+/obj/structure/particle_accelerator/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
return
-
-
- verb/rotate()
- set name = "Rotate Clockwise"
- set category = "Object"
- set src in oview(1)
-
- if (src.anchored || usr:stat)
- usr << "It is fastened to the floor!"
- return 0
- src.dir = turn(src.dir, 270)
- return 1
-
- verb/rotateccw()
- set name = "Rotate Counter Clockwise"
- set category = "Object"
- set src in oview(1)
-
- if (src.anchored || usr:stat)
- usr << "It is fastened to the floor!"
- return 0
- src.dir = turn(src.dir, 90)
- return 1
-
- examine()
- switch(src.construction_state)
- if(0)
- src.desc = text("A [name], looks like it's not attached to the flooring")
- if(1)
- src.desc = text("A [name], it is missing some cables")
- if(2)
- src.desc = text("A [name], the panel is open")
- if(3)
- src.desc = text("The [name] is assembled")
- if(powered)
- src.desc = src.desc_holder
- ..()
- return
-
-
- attackby(obj/item/W, mob/user)
- if(istool(W))
- if(src.process_tool_hit(W,user))
- return
- ..()
- return
-
-
- Move()
- ..()
- if(master && master.active)
- master.toggle_power()
- investigate_log("was moved whilst active; it powered down.","singulo")
-
- ex_act(severity)
- switch(severity)
- if(1.0)
+ if(2.0)
+ if (prob(50))
del(src)
return
- if(2.0)
- if (prob(50))
- del(src)
- return
- if(3.0)
- if (prob(25))
- del(src)
- return
+ if(3.0)
+ if (prob(25))
+ del(src)
+ return
+ else
+ return
+
+
+/obj/structure/particle_accelerator/blob_act()
+ if(prob(50))
+ del(src)
+ return
+
+
+/obj/structure/particle_accelerator/meteorhit()
+ if(prob(50))
+ del(src)
+ return
+
+/obj/structure/particle_accelerator/update_icon()
+ switch(construction_state)
+ if(0,1)
+ icon_state="[reference]"
+ if(2)
+ icon_state="[reference]w"
+ if(3)
+ if(powered)
+ icon_state="[reference]p[strength]"
else
- return
+ icon_state="[reference]c"
+ return
+
+/obj/structure/particle_accelerator/proc/update_state()
+ if(master)
+ master.update_state()
+ return 0
- blob_act()
- if(prob(50))
- del(src)
- return
+/obj/structure/particle_accelerator/proc/report_ready(var/obj/O)
+ if(O && (O == master))
+ if(construction_state >= 3)
+ return 1
+ return 0
- meteorhit()
- if(prob(50))
- del(src)
- return
-
- update_icon()
- switch(construction_state)
- if(0,1)
- icon_state="[reference]"
- if(2)
- icon_state="[reference]w"
- if(3)
- if(powered)
- icon_state="[reference]p[strength]"
- else
- icon_state="[reference]c"
- return
-
- proc
- update_state()
- if(master)
- master.update_state()
- return 0
+/obj/structure/particle_accelerator/proc/report_master()
+ if(master)
+ return master
+ return 0
- report_ready(var/obj/O)
- if(O && (O == master))
- if(construction_state >= 3)
- return 1
- return 0
+/obj/structure/particle_accelerator/proc/connect_master(var/obj/O)
+ if(O && istype(O,/obj/machinery/particle_accelerator/control_box))
+ if(O.dir == src.dir)
+ master = O
+ return 1
+ return 0
- report_master()
- if(master)
- return master
- return 0
+/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user)
+ if(!(O) || !(user))
+ return 0
+ if(!ismob(user) || !isobj(O))
+ return 0
+ var/temp_state = src.construction_state
-
- connect_master(var/obj/O)
- if(O && istype(O,/obj/machinery/particle_accelerator/control_box))
- if(O.dir == src.dir)
- master = O
- return 1
- return 0
-
-
- process_tool_hit(var/obj/O, var/mob/user)
- if(!(O) || !(user))
- return 0
- if(!ismob(user) || !isobj(O))
- return 0
- var/temp_state = src.construction_state
-
- switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
- if(0)
- if(iswrench(O))
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- src.anchored = 1
- user.visible_message("[user.name] secures the [src.name] to the floor.", \
- "You secure the external bolts.")
- temp_state++
- if(1)
- if(iswrench(O))
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- src.anchored = 0
- user.visible_message("[user.name] detaches the [src.name] from the floor.", \
- "You remove the external bolts.")
- temp_state--
- else if(iscoil(O))
- if(O:use(1,user))
- user.visible_message("[user.name] adds wires to the [src.name].", \
- "You add some wires.")
- temp_state++
- if(2)
- if(iswirecutter(O))//TODO:Shock user if its on?
- user.visible_message("[user.name] removes some wires from the [src.name].", \
- "You remove some wires.")
- temp_state--
- else if(isscrewdriver(O))
- user.visible_message("[user.name] closes the [src.name]'s access panel.", \
- "You close the access panel.")
- temp_state++
- if(3)
- if(isscrewdriver(O))
- user.visible_message("[user.name] opens the [src.name]'s access panel.", \
- "You open the access panel.")
- temp_state--
- if(temp_state == src.construction_state)//Nothing changed
- return 0
- else
- src.construction_state = temp_state
- if(src.construction_state < 3)//Was taken apart, update state
- update_state()
- update_icon()
- return 1
- return 0
+ switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
+ if(0)
+ if(iswrench(O))
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ src.anchored = 1
+ user.visible_message("[user.name] secures the [src.name] to the floor.", \
+ "You secure the external bolts.")
+ temp_state++
+ if(1)
+ if(iswrench(O))
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ src.anchored = 0
+ user.visible_message("[user.name] detaches the [src.name] from the floor.", \
+ "You remove the external bolts.")
+ temp_state--
+ else if(iscoil(O))
+ if(O:use(1,user))
+ user.visible_message("[user.name] adds wires to the [src.name].", \
+ "You add some wires.")
+ temp_state++
+ if(2)
+ if(iswirecutter(O))//TODO:Shock user if its on?
+ user.visible_message("[user.name] removes some wires from the [src.name].", \
+ "You remove some wires.")
+ temp_state--
+ else if(isscrewdriver(O))
+ user.visible_message("[user.name] closes the [src.name]'s access panel.", \
+ "You close the access panel.")
+ temp_state++
+ if(3)
+ if(isscrewdriver(O))
+ user.visible_message("[user.name] opens the [src.name]'s access panel.", \
+ "You open the access panel.")
+ temp_state--
+ if(temp_state == src.construction_state)//Nothing changed
+ return 0
+ else
+ src.construction_state = temp_state
+ if(src.construction_state < 3)//Was taken apart, update state
+ update_state()
+ update_icon()
+ return 1
+ return 0
@@ -298,138 +273,138 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
var/desc_holder = null
- verb/rotate()
- set name = "Rotate Clockwise"
- set category = "Object"
- set src in oview(1)
+/obj/machinery/particle_accelerator/verb/rotate()
+ set name = "Rotate Clockwise"
+ set category = "Object"
+ set src in oview(1)
- if (src.anchored || usr:stat)
- usr << "It is fastened to the floor!"
- return 0
- src.dir = turn(src.dir, 270)
- return 1
+ if (src.anchored || usr:stat)
+ usr << "It is fastened to the floor!"
+ return 0
+ src.dir = turn(src.dir, 270)
+ return 1
- verb/rotateccw()
- set name = "Rotate Counter-Clockwise"
- set category = "Object"
- set src in oview(1)
+/obj/machinery/particle_accelerator/verb/rotateccw()
+ set name = "Rotate Counter-Clockwise"
+ set category = "Object"
+ set src in oview(1)
- if (src.anchored || usr:stat)
- usr << "It is fastened to the floor!"
- return 0
- src.dir = turn(src.dir, 90)
- return 1
+ if (src.anchored || usr:stat)
+ usr << "It is fastened to the floor!"
+ return 0
+ src.dir = turn(src.dir, 90)
+ return 1
- update_icon()
- return
+/obj/machinery/particle_accelerator/update_icon()
+ return
- examine()
- switch(src.construction_state)
- if(0)
- src.desc = text("A [name], looks like it's not attached to the flooring")
- if(1)
- src.desc = text("A [name], it is missing some cables")
- if(2)
- src.desc = text("A [name], the panel is open")
- if(3)
- src.desc = text("The [name] is assembled")
- if(powered)
- src.desc = src.desc_holder
- ..()
- return
+/obj/machinery/particle_accelerator/examine()
+ switch(src.construction_state)
+ if(0)
+ src.desc = text("A [name], looks like it's not attached to the flooring")
+ if(1)
+ src.desc = text("A [name], it is missing some cables")
+ if(2)
+ src.desc = text("A [name], the panel is open")
+ if(3)
+ src.desc = text("The [name] is assembled")
+ if(powered)
+ src.desc = src.desc_holder
+ ..()
+ return
- attackby(obj/item/W, mob/user)
- if(istool(W))
- if(src.process_tool_hit(W,user))
- return
- ..()
- return
+/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user)
+ if(istool(W))
+ if(src.process_tool_hit(W,user))
+ return
+ ..()
+ return
- ex_act(severity)
- switch(severity)
- if(1.0)
+/obj/machinery/particle_accelerator/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if (prob(50))
del(src)
return
- if(2.0)
- if (prob(50))
- del(src)
- return
- if(3.0)
- if (prob(25))
- del(src)
- return
- else
- return
+ if(3.0)
+ if (prob(25))
+ del(src)
+ return
+ else
+ return
- blob_act()
- if(prob(50))
- del(src)
- return
+/obj/machinery/particle_accelerator/blob_act()
+ if(prob(50))
+ del(src)
+ return
- meteorhit()
- if(prob(50))
- del(src)
- return
-
- proc
- update_state()
- return 0
+/obj/machinery/particle_accelerator/meteorhit()
+ if(prob(50))
+ del(src)
+ return
- process_tool_hit(var/obj/O, var/mob/user)
- if(!(O) || !(user))
- return 0
- if(!ismob(user) || !isobj(O))
- return 0
- var/temp_state = src.construction_state
- switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
- if(0)
- if(iswrench(O))
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- src.anchored = 1
- user.visible_message("[user.name] secures the [src.name] to the floor.", \
- "You secure the external bolts.")
- temp_state++
- if(1)
- if(iswrench(O))
- playsound(src.loc, 'Ratchet.ogg', 75, 1)
- src.anchored = 0
- user.visible_message("[user.name] detaches the [src.name] from the floor.", \
- "You remove the external bolts.")
- temp_state--
- else if(iscoil(O))
- if(O:use(1))
- user.visible_message("[user.name] adds wires to the [src.name].", \
- "You add some wires.")
- temp_state++
- if(2)
- if(iswirecutter(O))//TODO:Shock user if its on?
- user.visible_message("[user.name] removes some wires from the [src.name].", \
- "You remove some wires.")
- temp_state--
- else if(isscrewdriver(O))
- user.visible_message("[user.name] closes the [src.name]'s access panel.", \
- "You close the access panel.")
- temp_state++
- if(3)
- if(isscrewdriver(O))
- user.visible_message("[user.name] opens the [src.name]'s access panel.", \
- "You open the access panel.")
- temp_state--
- active = 0
- if(temp_state == src.construction_state)//Nothing changed
- return 0
- else
- if(src.construction_state < 3)//Was taken apart, update state
- update_state()
- if(use_power)
- use_power = 0
- src.construction_state = temp_state
- if(src.construction_state >= 3)
- use_power = 1
- update_icon()
- return 1
- return 0
+/obj/machinery/particle_accelerator/proc/update_state()
+ return 0
+
+
+/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user)
+ if(!(O) || !(user))
+ return 0
+ if(!ismob(user) || !isobj(O))
+ return 0
+ var/temp_state = src.construction_state
+ switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
+ if(0)
+ if(iswrench(O))
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ src.anchored = 1
+ user.visible_message("[user.name] secures the [src.name] to the floor.", \
+ "You secure the external bolts.")
+ temp_state++
+ if(1)
+ if(iswrench(O))
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ src.anchored = 0
+ user.visible_message("[user.name] detaches the [src.name] from the floor.", \
+ "You remove the external bolts.")
+ temp_state--
+ else if(iscoil(O))
+ if(O:use(1))
+ user.visible_message("[user.name] adds wires to the [src.name].", \
+ "You add some wires.")
+ temp_state++
+ if(2)
+ if(iswirecutter(O))//TODO:Shock user if its on?
+ user.visible_message("[user.name] removes some wires from the [src.name].", \
+ "You remove some wires.")
+ temp_state--
+ else if(isscrewdriver(O))
+ user.visible_message("[user.name] closes the [src.name]'s access panel.", \
+ "You close the access panel.")
+ temp_state++
+ if(3)
+ if(isscrewdriver(O))
+ user.visible_message("[user.name] opens the [src.name]'s access panel.", \
+ "You open the access panel.")
+ temp_state--
+ active = 0
+ if(temp_state == src.construction_state)//Nothing changed
+ return 0
+ else
+ if(src.construction_state < 3)//Was taken apart, update state
+ update_state()
+ if(use_power)
+ use_power = 0
+ src.construction_state = temp_state
+ if(src.construction_state >= 3)
+ use_power = 1
+ update_icon()
+ return 1
+ return 0
diff --git a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm
index 39e5dec3e5..8d8e23e996 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm
@@ -5,6 +5,6 @@
icon_state = "fuel_chamber"
reference = "fuel_chamber"
- update_icon()
- ..()
- return
\ No newline at end of file
+/obj/structure/particle_accelerator/fuel_chamber/update_icon()
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index d42e1c2d68..f805ffbfe8 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -14,217 +14,215 @@
construction_state = 0
active = 0
dir = 1
- var
- list/obj/structure/particle_accelerator/connected_parts
+ var/list/obj/structure/particle_accelerator/connected_parts
+ var/assembled = 0
+ var/parts = null
+
+/obj/machinery/particle_accelerator/control_box/New()
+ connected_parts = list()
+ ..()
+
+
+/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob)
+ if(construction_state >= 3)
+ interact(user)
+
+/obj/machinery/particle_accelerator/control_box/update_state()
+ if(construction_state < 3)
+ use_power = 0
assembled = 0
- parts = null
-
- New()
+ active = 0
+ for(var/obj/structure/particle_accelerator/part in connected_parts)
+ part.strength = null
+ part.powered = 0
+ part.update_icon()
connected_parts = list()
- ..()
-
-
- attack_hand(mob/user as mob)
- if(construction_state >= 3)
- interact(user)
-
- update_state()
- if(construction_state < 3)
- use_power = 0
- assembled = 0
- active = 0
- for(var/obj/structure/particle_accelerator/part in connected_parts)
- part.strength = null
- part.powered = 0
- part.update_icon()
- connected_parts = list()
- return
- if(!part_scan())
- use_power = 1
- active = 0
- connected_parts = list()
-
return
+ if(!part_scan())
+ use_power = 1
+ active = 0
+ connected_parts = list()
- update_icon()
- if(active)
- icon_state = "[reference]p1"
+ return
+
+/obj/machinery/particle_accelerator/control_box/update_icon()
+ if(active)
+ icon_state = "[reference]p1"
+ else
+ if(use_power)
+ if(assembled)
+ icon_state = "[reference]p"
+ else
+ icon_state = "u[reference]p"
else
- if(use_power)
- if(assembled)
- icon_state = "[reference]p"
+ switch(construction_state)
+ if(0)
+ icon_state = "[reference]"
+ if(1)
+ icon_state = "[reference]"
+ if(2)
+ icon_state = "[reference]w"
else
- icon_state = "u[reference]p"
- else
- switch(construction_state)
- if(0)
- icon_state = "[reference]"
- if(1)
- icon_state = "[reference]"
- if(2)
- icon_state = "[reference]w"
- else
- icon_state = "[reference]c"
+ icon_state = "[reference]c"
+ return
+
+/obj/machinery/particle_accelerator/control_box/Topic(href, href_list)
+ ..()
+ //Ignore input if we are broken, !silicon guy cant touch us, or nonai controlling from super far away
+ if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon)) || (get_dist(src, usr) > 8 && !istype(usr, /mob/living/silicon/ai)))
+ usr.machine = null
+ usr << browse(null, "window=pacontrol")
return
- Topic(href, href_list)
- ..()
- //Ignore input if we are broken, !silicon guy cant touch us, or nonai controlling from super far away
- if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon)) || (get_dist(src, usr) > 8 && !istype(usr, /mob/living/silicon/ai)))
- usr.machine = null
- usr << browse(null, "window=pacontrol")
- return
+ if( href_list["close"] )
+ usr << browse(null, "window=pacontrol")
+ usr.machine = null
+ return
+ if(href_list["togglep"])
+ src.toggle_power()
+ investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo")
+ else if(href_list["scan"])
+ src.part_scan()
+ else if(href_list["strengthup"])
+ strength++
+ if(strength > 2)
+ strength = 2
+ else
+ investigate_log("increased to [strength] by [usr.key]","singulo")
+ for(var/obj/structure/particle_accelerator/part in connected_parts)
+ part.strength = strength
+ part.update_icon()
- if( href_list["close"] )
- usr << browse(null, "window=pacontrol")
- usr.machine = null
- return
- if(href_list["togglep"])
+ else if(href_list["strengthdown"])
+ strength--
+ if(strength < 0)
+ strength = 0
+ else
+ investigate_log("decreased to [strength] by [usr.key]","singulo")
+ for(var/obj/structure/particle_accelerator/part in connected_parts)
+ part.strength = strength
+ part.update_icon()
+ src.updateDialog()
+ src.update_icon()
+ return
+
+
+/obj/machinery/particle_accelerator/control_box/power_change()
+ ..()
+ if(stat & NOPOWER)
+ active = 0
+ use_power = 0
+ else if(!stat && construction_state == 3)
+ use_power = 1
+ return
+
+
+/obj/machinery/particle_accelerator/control_box/process()
+ if(src.active)
+ //a part is missing!
+ if( length(connected_parts) < 6 )
+ investigate_log("lost a connected part; It powered down.","singulo")
src.toggle_power()
- investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo")
- else if(href_list["scan"])
- src.part_scan()
- else if(href_list["strengthup"])
- strength++
- if(strength > 2)
- strength = 2
- else
- investigate_log("increased to [strength] by [usr.key]","singulo")
- for(var/obj/structure/particle_accelerator/part in connected_parts)
- part.strength = strength
- part.update_icon()
-
- else if(href_list["strengthdown"])
- strength--
- if(strength < 0)
- strength = 0
- else
- investigate_log("decreased to [strength] by [usr.key]","singulo")
- for(var/obj/structure/particle_accelerator/part in connected_parts)
- part.strength = strength
- part.update_icon()
- src.updateDialog()
- src.update_icon()
- return
+ return
+ //emit some particles
+ for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts)
+ if(PE)
+ PE.emit_particle(src.strength)
+ return
- power_change()
- ..()
- if(stat & NOPOWER)
- active = 0
- use_power = 0
- else if(!stat && construction_state == 3)
- use_power = 1
- return
+/obj/machinery/particle_accelerator/control_box/proc/part_scan()
+ for(var/obj/structure/particle_accelerator/fuel_chamber/F in orange(1,src))
+ src.dir = F.dir
+ connected_parts = list()
+ var/tally = 0
+ var/ldir = turn(dir,-90)
+ var/rdir = turn(dir,90)
+ var/odir = turn(dir,180)
+ var/turf/T = src.loc
+ T = get_step(T,rdir)
+ if(check_part(T,/obj/structure/particle_accelerator/fuel_chamber))
+ tally++
+ T = get_step(T,odir)
+ if(check_part(T,/obj/structure/particle_accelerator/end_cap))
+ tally++
+ T = get_step(T,dir)
+ T = get_step(T,dir)
+ if(check_part(T,/obj/structure/particle_accelerator/power_box))
+ tally++
+ T = get_step(T,dir)
+ if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/center))
+ tally++
+ T = get_step(T,ldir)
+ if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/left))
+ tally++
+ T = get_step(T,rdir)
+ T = get_step(T,rdir)
+ if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/right))
+ tally++
+ if(tally >= 6)
+ assembled = 1
+ return 1
+ else
+ assembled = 0
+ return 0
- process()
- if(src.active)
- //a part is missing!
- if( length(connected_parts) < 6 )
- investigate_log("lost a connected part; It powered down.","singulo")
- src.toggle_power()
- return
- //emit some particles
- for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts)
- if(PE)
- PE.emit_particle(src.strength)
- return
-
-
- proc
- part_scan()
- for(var/obj/structure/particle_accelerator/fuel_chamber/F in orange(1,src))
- src.dir = F.dir
- connected_parts = list()
- var/tally = 0
- var/ldir = turn(dir,-90)
- var/rdir = turn(dir,90)
- var/odir = turn(dir,180)
- var/turf/T = src.loc
- T = get_step(T,rdir)
- if(check_part(T,/obj/structure/particle_accelerator/fuel_chamber))
- tally++
- T = get_step(T,odir)
- if(check_part(T,/obj/structure/particle_accelerator/end_cap))
- tally++
- T = get_step(T,dir)
- T = get_step(T,dir)
- if(check_part(T,/obj/structure/particle_accelerator/power_box))
- tally++
- T = get_step(T,dir)
- if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/center))
- tally++
- T = get_step(T,ldir)
- if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/left))
- tally++
- T = get_step(T,rdir)
- T = get_step(T,rdir)
- if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/right))
- tally++
- if(tally >= 6)
- assembled = 1
+/obj/machinery/particle_accelerator/control_box/proc/check_part(var/turf/T, var/type)
+ if(!(T)||!(type))
+ return 0
+ var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T
+ if(istype(PA, type))
+ if(PA.connect_master(src))
+ if(PA.report_ready(src))
+ src.connected_parts.Add(PA)
return 1
- else
- assembled = 0
- return 0
+ return 0
- check_part(var/turf/T, var/type)
- if(!(T)||!(type))
- return 0
- var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T
- if(istype(PA, type))
- if(PA.connect_master(src))
- if(PA.report_ready(src))
- src.connected_parts.Add(PA)
- return 1
- return 0
+/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
+ src.active = !src.active
+ if(src.active)
+ src.use_power = 2
+ for(var/obj/structure/particle_accelerator/part in connected_parts)
+ part.strength = src.strength
+ part.powered = 1
+ part.update_icon()
+ else
+ src.use_power = 1
+ for(var/obj/structure/particle_accelerator/part in connected_parts)
+ part.strength = null
+ part.powered = 0
+ part.update_icon()
+ return 1
- toggle_power()
- src.active = !src.active
- if(src.active)
- src.use_power = 2
- for(var/obj/structure/particle_accelerator/part in connected_parts)
- part.strength = src.strength
- part.powered = 1
- part.update_icon()
- else
- src.use_power = 1
- for(var/obj/structure/particle_accelerator/part in connected_parts)
- part.strength = null
- part.powered = 0
- part.update_icon()
- return 1
+/obj/machinery/particle_accelerator/control_box/proc/interact(mob/user)
+ if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
+ if(!istype(user, /mob/living/silicon))
+ user.machine = null
+ user << browse(null, "window=pacontrol")
+ return
+ user.machine = src
+ var/dat = ""
+ dat += "Particle Accelerator Control Panel
"
+ dat += "Close
"
+ dat += "Status:
"
+ if(!assembled)
+ dat += "Unable to detect all parts!
"
+ dat += "Run Scan
"
+ else
+ dat += "All parts in place.
"
+ dat += "Power:"
+ if(active)
+ dat += "On
"
+ else
+ dat += "Off
"
+ dat += "Toggle Power
"
+ dat += "Particle Strength: [src.strength] "
+ dat += "--|++
"
- interact(mob/user)
- if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
- if(!istype(user, /mob/living/silicon))
- user.machine = null
- user << browse(null, "window=pacontrol")
- return
- user.machine = src
-
- var/dat = ""
- dat += "Particle Accelerator Control Panel
"
- dat += "Close
"
- dat += "Status:
"
- if(!assembled)
- dat += "Unable to detect all parts!
"
- dat += "Run Scan
"
- else
- dat += "All parts in place.
"
- dat += "Power:"
- if(active)
- dat += "On
"
- else
- dat += "Off
"
- dat += "Toggle Power
"
- dat += "Particle Strength: [src.strength] "
- dat += "--|++
"
-
- user << browse(dat, "window=pacontrol;size=420x500")
- onclose(user, "pacontrol")
- return
\ No newline at end of file
+ user << browse(dat, "window=pacontrol;size=420x500")
+ onclose(user, "pacontrol")
+ return
\ No newline at end of file
diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
index a9570faf58..f91b92a55e 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
@@ -8,43 +8,42 @@
var/fire_delay = 50
var/last_shot = 0
- center
- icon_state = "emitter_center"
- reference = "emitter_center"
+/obj/structure/particle_accelerator/particle_emitter/center
+ icon_state = "emitter_center"
+ reference = "emitter_center"
- left
- icon_state = "emitter_left"
- reference = "emitter_left"
+/obj/structure/particle_accelerator/particle_emitter/left
+ icon_state = "emitter_left"
+ reference = "emitter_left"
- right
- icon_state = "emitter_right"
- reference = "emitter_right"
+/obj/structure/particle_accelerator/particle_emitter/right
+ icon_state = "emitter_right"
+ reference = "emitter_right"
- update_icon()
- ..()
- return
+/obj/structure/particle_accelerator/particle_emitter/update_icon()
+ ..()
+ return
- proc
- set_delay(var/delay)
- if(delay && delay >= 0)
- src.fire_delay = delay
- return 1
- return 0
+/obj/structure/particle_accelerator/particle_emitter/proc/set_delay(var/delay)
+ if(delay && delay >= 0)
+ src.fire_delay = delay
+ return 1
+ return 0
- emit_particle(var/strength = 0)
- if((src.last_shot + src.fire_delay) <= world.time)
- src.last_shot = world.time
- var/obj/effect/accelerated_particle/A = null
- var/turf/T = get_step(src,dir)
- switch(strength)
- if(0)
- A = new/obj/effect/accelerated_particle/weak(T, dir)
- if(1)
- A = new/obj/effect/accelerated_particle(T, dir)
- if(2)
- A = new/obj/effect/accelerated_particle/strong(T, dir)
- if(A)
- A.dir = src.dir
- return 1
- return 0
+/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0)
+ if((src.last_shot + src.fire_delay) <= world.time)
+ src.last_shot = world.time
+ var/obj/effect/accelerated_particle/A = null
+ var/turf/T = get_step(src,dir)
+ switch(strength)
+ if(0)
+ A = new/obj/effect/accelerated_particle/weak(T, dir)
+ if(1)
+ A = new/obj/effect/accelerated_particle(T, dir)
+ if(2)
+ A = new/obj/effect/accelerated_particle/strong(T, dir)
+ if(A)
+ A.dir = src.dir
+ return 1
+ return 0
diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm
index 9a768212de..e6deff37dd 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_power.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm
@@ -5,6 +5,6 @@
icon_state = "power_box"
reference = "power_box"
- update_icon()
- ..()
- return
+/obj/structure/particle_accelerator/power_box/update_icon()
+ ..()
+ return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index b23c354626..9523818ac3 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -32,507 +32,508 @@ var/global/list/uneatable = list(
var/teleport_del = 0
var/last_warning
- New(loc, var/starting_energy = 50, var/temp = 0)
- //CARN: admin-alert for chuckle-fuckery.
- last_warning = world.time
- var/count = 0
- for(var/obj/machinery/containment_field/CF in world)
- count = 1
+/obj/machinery/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
+ //CARN: admin-alert for chuckle-fuckery.
+ last_warning = world.time
+ var/count = 0
+ for(var/obj/machinery/containment_field/CF in world)
+ count = 1
+ break
+ if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1)
+ investigate_log("was created. [count?"":"No containment fields were active"]","singulo")
+
+ src.energy = starting_energy
+ if(temp)
+ spawn(temp)
+ del(src)
+ ..()
+ for(var/obj/machinery/singularity_beacon/singubeacon in world)
+ if(singubeacon.active)
+ target = singubeacon
break
- if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1)
- investigate_log("was created. [count?"":"No containment fields were active"]","singulo")
-
- src.energy = starting_energy
- if(temp)
- spawn(temp)
- del(src)
- ..()
- for(var/obj/machinery/singularity_beacon/singubeacon in world)
- if(singubeacon.active)
- target = singubeacon
- break
- return
+ return
- Del()
- //Could have it do something bad when this happens, explode/implode or something
- ..()
+/obj/machinery/singularity/Del()
+ //Could have it do something bad when this happens, explode/implode or something
+ ..()
- attack_hand(mob/user as mob)
- consume(user)
- return 1
+/obj/machinery/singularity/attack_hand(mob/user as mob)
+ consume(user)
+ return 1
- blob_act(severity)
- return
+/obj/machinery/singularity/blob_act(severity)
+ return
- ex_act(severity)
- switch(severity)
- if(1.0)
- if(prob(25))
- del(src)
- return
- else
- energy += 50
- if(2.0 to 3.0)
- energy += round((rand(20,60)/2),1)
- return
- return
-
-
- Bump(atom/A)
- consume(A)
- return
-
-
- Bumped(atom/A)
- consume(A)
- return
-
-
- process()
- eat()
- dissipate()
- check_energy()
- if(current_size >= 3)
- move()
- if(current_size <= 7)
- pulse()
- if(current_size >= 5)
- if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
- event()
- return
-
-
- attack_ai() //to prevent ais from gibbing themselves when they click on one.
- return
-
-
- proc
- dissipate()
- if(!dissipate)
- return
- if(dissipate_track >= dissipate_delay)
- src.energy -= dissipate_strength
- dissipate_track = 0
- else
- dissipate_track++
-
-
- expand(var/force_size = 0)
- var/temp_allowed_size = src.allowed_size
- if(force_size)
- temp_allowed_size = force_size
- switch(temp_allowed_size)
- if(1)
- current_size = 1
- icon = 'icons/obj/singularity.dmi'
- icon_state = "singularity_s1"
- pixel_x = 0
- pixel_y = 0
- grav_pull = 4
- consume_range = 0
- dissipate_delay = 10
- dissipate_track = 0
- dissipate_strength = 1
- if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them
- current_size = 3
- icon = 'icons/effects/96x96.dmi'
- icon_state = "singularity_s3"
- pixel_x = -32
- pixel_y = -32
- grav_pull = 6
- consume_range = 1
- dissipate_delay = 5
- dissipate_track = 0
- dissipate_strength = 5
- if(5)
- if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2)))
- current_size = 5
- icon = 'icons/effects/160x160.dmi'
- icon_state = "singularity_s5"
- pixel_x = -64
- pixel_y = -64
- grav_pull = 8
- consume_range = 2
- dissipate_delay = 4
- dissipate_track = 0
- dissipate_strength = 20
- if(7)
- if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3)))
- current_size = 7
- icon = 'icons/effects/224x224.dmi'
- icon_state = "singularity_s7"
- pixel_x = -96
- pixel_y = -96
- grav_pull = 10
- consume_range = 3
- dissipate_delay = 10
- dissipate_track = 0
- dissipate_strength = 10
- if(9)//this one also lacks a check for gens because it eats everything
- current_size = 9
- icon = 'icons/effects/288x288.dmi'
- icon_state = "singularity_s9"
- pixel_x = -128
- pixel_y = -128
- grav_pull = 10
- consume_range = 4
- dissipate = 0 //It cant go smaller due to e loss
- if(current_size == allowed_size)
- investigate_log("grew to size [current_size]","singulo")
- return 1
- else if(current_size < (--temp_allowed_size))
- expand(temp_allowed_size)
- else
- return 0
-
-
- check_energy()
- if(energy <= 0)
- del(src)
- return 0
- switch(energy)//Some of these numbers might need to be changed up later -Mport
- if(1 to 199)
- allowed_size = 1
- if(200 to 499)
- allowed_size = 3
- if(500 to 999)
- allowed_size = 5
- if(1000 to 1999)
- allowed_size = 7
- if(2000 to INFINITY)
- allowed_size = 9
- if(current_size != allowed_size)
- expand()
- return 1
-
-
- eat()
- set background = 1
- if(defer_powernet_rebuild != 2)
- defer_powernet_rebuild = 1
- for(var/atom/movable/X in orange(consume_range,src))
- consume(X)
- for(var/turf/X in orange(consume_range,src))
- consume(X)
- for(var/atom/movable/X in orange(grav_pull,src))
- if(is_type_in_list(X, uneatable)) continue
- if(((X) &&(!X:anchored) && (!istype(X,/mob/living/carbon/human)))|| (src.current_size >= 9))
- step_towards(X,src)
- else if(istype(X,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = X
- if(istype(H.shoes,/obj/item/clothing/shoes/magboots))
- var/obj/item/clothing/shoes/magboots/M = H.shoes
- if(M.magpulse)
- continue
- step_towards(H,src)
- if(defer_powernet_rebuild != 2)
- defer_powernet_rebuild = 0
- return
-
-
- consume(var/atom/A)
- var/gain = 0
- if(is_type_in_list(A, uneatable))
- return 0
- if (istype(A,/mob/living))//Mobs get gibbed
- gain = 20
- if(istype(A,/mob/living/carbon/human))
- if(A:mind)
- if((A:mind:assigned_role == "Station Engineer") || (A:mind:assigned_role == "Chief Engineer") )
- gain = 100
- spawn()
- A:gib()
- sleep(1)
- else if(istype(A,/obj/))
-
- if (istype(A,/obj/item/weapon/storage/backpack/holding))
- var/dist = max((current_size - 2),1)
- explosion(src.loc,(dist),(dist*2),(dist*4))
- return
-
- if(istype(A, /obj/machinery/singularity))//Welp now you did it
- var/obj/machinery/singularity/S = A
- src.energy += (S.energy/2)//Absorb most of it
- del(S)
- var/dist = max((current_size - 2),1)
- explosion(src.loc,(dist),(dist*2),(dist*4))
- return//Quits here, the obj should be gone, hell we might be
-
- if((teleport_del) && (!istype(A, /obj/machinery)))//Going to see if it does not lag less to tele items over to Z 2
- var/obj/O = A
- O.x = 2
- O.y = 2
- O.z = 2
- else
- A:ex_act(1.0)
- if(A) del(A)
- gain = 2
- else if(isturf(A))
- var/turf/T = A
- if(T.intact)
- for(var/obj/O in T.contents)
- if(O.level != 1)
- continue
- if(O.invisibility == 101)
- src.consume(O)
- A:ReplaceWithSpace()
- gain = 2
- src.energy += gain
- return
-
-
- move(var/movement_dir = 0)
- if(!move_self)
- return 0
-
- if(target && prob(60))
- movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
- else if(!(movement_dir in cardinal))
- movement_dir = pick(NORTH, SOUTH, EAST, WEST)
-
- if(movement_dir == last_failed_movement)
- var/list/L = new/list(NORTH, SOUTH, EAST, WEST)
- L.Remove(last_failed_movement)
- movement_dir = pick(L)
-
- if(current_size >= 9)//The superlarge one does not care about things in its way
- spawn(0)
- step(src, movement_dir)
- spawn(1)
- step(src, movement_dir)
- return 1
- else if(check_turfs_in(movement_dir))
- last_failed_movement = 0//Reset this because we moved
- spawn(0)
- step(src, movement_dir)
- return 1
- else
- last_failed_movement = movement_dir
- return 0
-
-
- check_turfs_in(var/direction = 0, var/step = 0)
- if(!direction)
- return 0
- var/steps = 0
- if(!step)
- switch(current_size)
- if(1)
- steps = 1
- if(3)
- steps = 3//Yes this is right
- if(5)
- steps = 3
- if(7)
- steps = 4
- if(9)
- steps = 5
- else
- steps = step
- var/list/turfs = list()
- var/turf/T = src.loc
- for(var/i = 1 to steps)
- T = get_step(T,direction)
- if(!isturf(T))
- return 0
- turfs.Add(T)
- var/dir2 = 0
- var/dir3 = 0
- switch(direction)
- if(NORTH||SOUTH)
- dir2 = 4
- dir3 = 8
- if(EAST||WEST)
- dir2 = 1
- dir3 = 2
- var/turf/T2 = T
- for(var/j = 1 to steps)
- T2 = get_step(T2,dir2)
- if(!isturf(T2))
- return 0
- turfs.Add(T2)
- for(var/k = 1 to steps)
- T = get_step(T,dir3)
- if(!isturf(T))
- return 0
- turfs.Add(T)
- for(var/turf/T3 in turfs)
- if(isnull(T3))
- continue
- if(!can_move(T3))
- return 0
- return 1
-
-
- can_move(var/turf/T)
- if(!T)
- return 0
- if((locate(/obj/machinery/containment_field) in T)||(locate(/obj/machinery/shieldwall) in T))
- return 0
- else if(locate(/obj/machinery/field_generator) in T)
- var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T
- if(G && G.active)
- return 0
- else if(locate(/obj/machinery/shieldwallgen) in T)
- var/obj/machinery/shieldwallgen/S = locate(/obj/machinery/shieldwallgen) in T
- if(S && S.active)
- return 0
- return 1
-
-
- event()
- var/numb = pick(1,2,3,4,5,6)
- switch(numb)
- if(1)//EMP
- emp_area()
- if(2,3)//tox damage all carbon mobs in area
- toxmob()
- if(4)//Stun mobs who lack optic scanners
- mezzer()
- else
- return 0
- return 1
-
-
- toxmob()
- var/toxrange = 10
- var/toxdamage = 4
- var/radiation = 15
- var/radiationmin = 3
- if (src.energy>200)
- toxdamage = round(((src.energy-150)/50)*4,1)
- radiation = round(((src.energy-150)/50)*5,1)
- radiationmin = round((radiation/5),1)//
- for(var/mob/living/M in view(toxrange, src.loc))
- if(istype(M,/mob/living/))
- M.apply_effect(rand(radiationmin,radiation), IRRADIATE)
- toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad")))
- M.apply_effect(toxdamage, TOX)
- return
-
-
- mezzer()
- for(var/mob/living/carbon/M in oviewers(8, src))
- if(istype(M,/mob/living/carbon/human))
- if(istype(M:glasses,/obj/item/clothing/glasses/meson))
- M << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!"
- return
- M << "\red You look directly into The [src.name] and feel weak."
- M.apply_effect(3, STUN)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] stares blankly at The []!", M, src), 1)
- return
-
-
- emp_area()
- empulse(src, 8, 10)
- return
-
-
- pulse()
- for(var/obj/machinery/power/rad_collector/R in orange(15,src))
- if(istype(R,/obj/machinery/power/rad_collector))
- R.receive_pulse(energy)
- return
-
-
-
- narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
- name = "Tear in the Fabric of Reality"
- desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
- icon = 'icons/obj/magic_terror.dmi'
- pixel_x = -89
- pixel_y = -85
- current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO
- contained = 0 //Are we going to move around?
- dissipate = 0 //Do we lose energy over time?
- move_self = 1 //Do we move on our own?
- grav_pull = 10 //How many tiles out do we pull?
- consume_range = 3 //How many tiles out do we eat
-
- process()
- eat()
- if(!target || prob(5))
- pickcultist()
- move()
+/obj/machinery/singularity/ex_act(severity)
+ switch(severity)
+ if(1.0)
if(prob(25))
- mezzer()
-
- consume(var/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
- if(is_type_in_list(A, uneatable))
- return 0
- if (istype(A,/mob/living))//Mobs get gibbed
- A:gib()
- else if(istype(A,/obj/))
- A:ex_act(1.0)
- if(A) del(A)
- else if(isturf(A))
- var/turf/T = A
- if(T.intact)
- for(var/obj/O in T.contents)
- if(O.level != 1)
- continue
- if(O.invisibility == 101)
- src.consume(O)
- A:ReplaceWithSpace()
- return
-
- ex_act() //No throwing bombs at it either. --NEO
- return
-
- proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
- var/list/cultists = list()
- for(var/datum/mind/cult_nh_mind in ticker.mode.cult)
- if(!cult_nh_mind.current)
- continue
- if(cult_nh_mind.current.stat)
- continue
- cultists += cult_nh_mind.current
- if(cultists.len)
- acquire(pick(cultists))
+ del(src)
return
- //If there was living cultists, it picks one to follow.
- for(var/mob/living/carbon/human/food in living_mob_list)
- if(food.stat)
- continue
- cultists += food
- if(cultists.len)
- acquire(pick(cultists))
- return
- //no living cultists, pick a living human instead.
- for(var/mob/dead/observer/ghost in player_list)
- if(!ghost.client)
- continue
- cultists += ghost
- if(cultists.len)
- acquire(pick(cultists))
- return
- //no living humans, follow a ghost instead.
-
- proc/acquire(var/mob/food)
- target << "\blue NAR-SIE HAS LOST INTEREST IN YOU"
- target = food
- if(ishuman(target))
- target << "\red NAR-SIE HUNGERS FOR YOUR SOUL"
else
- target << "\red NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL"
+ energy += 50
+ if(2.0 to 3.0)
+ energy += round((rand(20,60)/2),1)
+ return
+ return
+/obj/machinery/singularity/Bump(atom/A)
+ consume(A)
+ return
+
+
+/obj/machinery/singularity/Bumped(atom/A)
+ consume(A)
+ return
+
+
+/obj/machinery/singularity/process()
+ eat()
+ dissipate()
+ check_energy()
+ if(current_size >= 3)
+ move()
+ if(current_size <= 7)
+ pulse()
+ if(current_size >= 5)
+ if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
+ event()
+ return
+
+
+/obj/machinery/singularity/attack_ai() //to prevent ais from gibbing themselves when they click on one.
+ return
+
+
+
+/obj/machinery/singularity/proc/dissipate()
+ if(!dissipate)
+ return
+ if(dissipate_track >= dissipate_delay)
+ src.energy -= dissipate_strength
+ dissipate_track = 0
+ else
+ dissipate_track++
+
+
+/obj/machinery/singularity/proc/expand(var/force_size = 0)
+ var/temp_allowed_size = src.allowed_size
+ if(force_size)
+ temp_allowed_size = force_size
+ switch(temp_allowed_size)
+ if(1)
+ current_size = 1
+ icon = 'icons/obj/singularity.dmi'
+ icon_state = "singularity_s1"
+ pixel_x = 0
+ pixel_y = 0
+ grav_pull = 4
+ consume_range = 0
+ dissipate_delay = 10
+ dissipate_track = 0
+ dissipate_strength = 1
+ if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them
+ current_size = 3
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "singularity_s3"
+ pixel_x = -32
+ pixel_y = -32
+ grav_pull = 6
+ consume_range = 1
+ dissipate_delay = 5
+ dissipate_track = 0
+ dissipate_strength = 5
+ if(5)
+ if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2)))
+ current_size = 5
+ icon = 'icons/effects/160x160.dmi'
+ icon_state = "singularity_s5"
+ pixel_x = -64
+ pixel_y = -64
+ grav_pull = 8
+ consume_range = 2
+ dissipate_delay = 4
+ dissipate_track = 0
+ dissipate_strength = 20
+ if(7)
+ if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3)))
+ current_size = 7
+ icon = 'icons/effects/224x224.dmi'
+ icon_state = "singularity_s7"
+ pixel_x = -96
+ pixel_y = -96
+ grav_pull = 10
+ consume_range = 3
+ dissipate_delay = 10
+ dissipate_track = 0
+ dissipate_strength = 10
+ if(9)//this one also lacks a check for gens because it eats everything
+ current_size = 9
+ icon = 'icons/effects/288x288.dmi'
+ icon_state = "singularity_s9"
+ pixel_x = -128
+ pixel_y = -128
+ grav_pull = 10
+ consume_range = 4
+ dissipate = 0 //It cant go smaller due to e loss
+ if(current_size == allowed_size)
+ investigate_log("grew to size [current_size]","singulo")
+ return 1
+ else if(current_size < (--temp_allowed_size))
+ expand(temp_allowed_size)
+ else
+ return 0
+
+
+/obj/machinery/singularity/proc/check_energy()
+ if(energy <= 0)
+ del(src)
+ return 0
+ switch(energy)//Some of these numbers might need to be changed up later -Mport
+ if(1 to 199)
+ allowed_size = 1
+ if(200 to 499)
+ allowed_size = 3
+ if(500 to 999)
+ allowed_size = 5
+ if(1000 to 1999)
+ allowed_size = 7
+ if(2000 to INFINITY)
+ allowed_size = 9
+ if(current_size != allowed_size)
+ expand()
+ return 1
+
+
+/obj/machinery/singularity/proc/eat()
+ set background = 1
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 1
+ for(var/atom/movable/X in orange(consume_range,src))
+ consume(X)
+ for(var/turf/X in orange(consume_range,src))
+ consume(X)
+ for(var/atom/movable/X in orange(grav_pull,src))
+ if(is_type_in_list(X, uneatable)) continue
+ if(((X) &&(!X:anchored) && (!istype(X,/mob/living/carbon/human)))|| (src.current_size >= 9))
+ step_towards(X,src)
+ else if(istype(X,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = X
+ if(istype(H.shoes,/obj/item/clothing/shoes/magboots))
+ var/obj/item/clothing/shoes/magboots/M = H.shoes
+ if(M.magpulse)
+ continue
+ step_towards(H,src)
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 0
+ return
+
+
+/obj/machinery/singularity/proc/consume(var/atom/A)
+ var/gain = 0
+ if(is_type_in_list(A, uneatable))
+ return 0
+ if (istype(A,/mob/living))//Mobs get gibbed
+ gain = 20
+ if(istype(A,/mob/living/carbon/human))
+ if(A:mind)
+ if((A:mind:assigned_role == "Station Engineer") || (A:mind:assigned_role == "Chief Engineer") )
+ gain = 100
+ spawn()
+ A:gib()
+ sleep(1)
+ else if(istype(A,/obj/))
+
+ if (istype(A,/obj/item/weapon/storage/backpack/holding))
+ var/dist = max((current_size - 2),1)
+ explosion(src.loc,(dist),(dist*2),(dist*4))
+ return
+
+ if(istype(A, /obj/machinery/singularity))//Welp now you did it
+ var/obj/machinery/singularity/S = A
+ src.energy += (S.energy/2)//Absorb most of it
+ del(S)
+ var/dist = max((current_size - 2),1)
+ explosion(src.loc,(dist),(dist*2),(dist*4))
+ return//Quits here, the obj should be gone, hell we might be
+
+ if((teleport_del) && (!istype(A, /obj/machinery)))//Going to see if it does not lag less to tele items over to Z 2
+ var/obj/O = A
+ O.x = 2
+ O.y = 2
+ O.z = 2
+ else
+ A:ex_act(1.0)
+ if(A) del(A)
+ gain = 2
+ else if(isturf(A))
+ var/turf/T = A
+ if(T.intact)
+ for(var/obj/O in T.contents)
+ if(O.level != 1)
+ continue
+ if(O.invisibility == 101)
+ src.consume(O)
+ A:ReplaceWithSpace()
+ gain = 2
+ src.energy += gain
+ return
+
+
+/obj/machinery/singularity/proc/move(var/movement_dir = 0)
+ if(!move_self)
+ return 0
+
+ if(target && prob(60))
+ movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
+ else if(!(movement_dir in cardinal))
+ movement_dir = pick(NORTH, SOUTH, EAST, WEST)
+
+ if(movement_dir == last_failed_movement)
+ var/list/L = new/list(NORTH, SOUTH, EAST, WEST)
+ L.Remove(last_failed_movement)
+ movement_dir = pick(L)
+
+ if(current_size >= 9)//The superlarge one does not care about things in its way
+ spawn(0)
+ step(src, movement_dir)
+ spawn(1)
+ step(src, movement_dir)
+ return 1
+ else if(check_turfs_in(movement_dir))
+ last_failed_movement = 0//Reset this because we moved
+ spawn(0)
+ step(src, movement_dir)
+ return 1
+ else
+ last_failed_movement = movement_dir
+ return 0
+
+
+/obj/machinery/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0)
+ if(!direction)
+ return 0
+ var/steps = 0
+ if(!step)
+ switch(current_size)
+ if(1)
+ steps = 1
+ if(3)
+ steps = 3//Yes this is right
+ if(5)
+ steps = 3
+ if(7)
+ steps = 4
+ if(9)
+ steps = 5
+ else
+ steps = step
+ var/list/turfs = list()
+ var/turf/T = src.loc
+ for(var/i = 1 to steps)
+ T = get_step(T,direction)
+ if(!isturf(T))
+ return 0
+ turfs.Add(T)
+ var/dir2 = 0
+ var/dir3 = 0
+ switch(direction)
+ if(NORTH||SOUTH)
+ dir2 = 4
+ dir3 = 8
+ if(EAST||WEST)
+ dir2 = 1
+ dir3 = 2
+ var/turf/T2 = T
+ for(var/j = 1 to steps)
+ T2 = get_step(T2,dir2)
+ if(!isturf(T2))
+ return 0
+ turfs.Add(T2)
+ for(var/k = 1 to steps)
+ T = get_step(T,dir3)
+ if(!isturf(T))
+ return 0
+ turfs.Add(T)
+ for(var/turf/T3 in turfs)
+ if(isnull(T3))
+ continue
+ if(!can_move(T3))
+ return 0
+ return 1
+
+
+/obj/machinery/singularity/proc/can_move(var/turf/T)
+ if(!T)
+ return 0
+ if((locate(/obj/machinery/containment_field) in T)||(locate(/obj/machinery/shieldwall) in T))
+ return 0
+ else if(locate(/obj/machinery/field_generator) in T)
+ var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T
+ if(G && G.active)
+ return 0
+ else if(locate(/obj/machinery/shieldwallgen) in T)
+ var/obj/machinery/shieldwallgen/S = locate(/obj/machinery/shieldwallgen) in T
+ if(S && S.active)
+ return 0
+ return 1
+
+
+/obj/machinery/singularity/proc/event()
+ var/numb = pick(1,2,3,4,5,6)
+ switch(numb)
+ if(1)//EMP
+ emp_area()
+ if(2,3)//tox damage all carbon mobs in area
+ toxmob()
+ if(4)//Stun mobs who lack optic scanners
+ mezzer()
+ else
+ return 0
+ return 1
+
+
+/obj/machinery/singularity/proc/toxmob()
+ var/toxrange = 10
+ var/toxdamage = 4
+ var/radiation = 15
+ var/radiationmin = 3
+ if (src.energy>200)
+ toxdamage = round(((src.energy-150)/50)*4,1)
+ radiation = round(((src.energy-150)/50)*5,1)
+ radiationmin = round((radiation/5),1)//
+ for(var/mob/living/M in view(toxrange, src.loc))
+ if(istype(M,/mob/living/))
+ M.apply_effect(rand(radiationmin,radiation), IRRADIATE)
+ toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad")))
+ M.apply_effect(toxdamage, TOX)
+ return
+
+
+/obj/machinery/singularity/proc/mezzer()
+ for(var/mob/living/carbon/M in oviewers(8, src))
+ if(istype(M,/mob/living/carbon/human))
+ if(istype(M:glasses,/obj/item/clothing/glasses/meson))
+ M << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!"
+ return
+ M << "\red You look directly into The [src.name] and feel weak."
+ M.apply_effect(3, STUN)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] stares blankly at The []!", M, src), 1)
+ return
+
+
+/obj/machinery/singularity/proc/emp_area()
+ empulse(src, 8, 10)
+ return
+
+
+/obj/machinery/singularity/proc/pulse()
+ for(var/obj/machinery/power/rad_collector/R in orange(15,src))
+ if(istype(R,/obj/machinery/power/rad_collector))
+ R.receive_pulse(energy)
+ return
+
+
+
+/obj/machinery/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
+ name = "Tear in the Fabric of Reality"
+ desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
+ icon = 'icons/obj/magic_terror.dmi'
+ pixel_x = -89
+ pixel_y = -85
+ current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO
+ contained = 0 //Are we going to move around?
+ dissipate = 0 //Do we lose energy over time?
+ move_self = 1 //Do we move on our own?
+ grav_pull = 10 //How many tiles out do we pull?
+ consume_range = 3 //How many tiles out do we eat
+
+/obj/machinery/singularity/narsie/process()
+ eat()
+ if(!target || prob(5))
+ pickcultist()
+ move()
+ if(prob(25))
+ mezzer()
+
+/obj/machinery/singularity/narsie/consume(var/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
+ if(is_type_in_list(A, uneatable))
+ return 0
+ if (istype(A,/mob/living))//Mobs get gibbed
+ A:gib()
+ else if(istype(A,/obj/))
+ A:ex_act(1.0)
+ if(A) del(A)
+ else if(isturf(A))
+ var/turf/T = A
+ if(T.intact)
+ for(var/obj/O in T.contents)
+ if(O.level != 1)
+ continue
+ if(O.invisibility == 101)
+ src.consume(O)
+ A:ReplaceWithSpace()
+ return
+
+/obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO
+ return
+
+/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
+ var/list/cultists = list()
+ for(var/datum/mind/cult_nh_mind in ticker.mode.cult)
+ if(!cult_nh_mind.current)
+ continue
+ if(cult_nh_mind.current.stat)
+ continue
+ cultists += cult_nh_mind.current
+ if(cultists.len)
+ acquire(pick(cultists))
+ return
+ //If there was living cultists, it picks one to follow.
+ for(var/mob/living/carbon/human/food in living_mob_list)
+ if(food.stat)
+ continue
+ cultists += food
+ if(cultists.len)
+ acquire(pick(cultists))
+ return
+ //no living cultists, pick a living human instead.
+ for(var/mob/dead/observer/ghost in player_list)
+ if(!ghost.client)
+ continue
+ cultists += ghost
+ if(cultists.len)
+ acquire(pick(cultists))
+ return
+ //no living humans, follow a ghost instead.
+
+/obj/machinery/singularity/narsie/proc/acquire(var/mob/food)
+ target << "\blue NAR-SIE HAS LOST INTEREST IN YOU"
+ target = food
+ if(ishuman(target))
+ target << "\red NAR-SIE HUNGERS FOR YOUR SOUL"
+ else
+ target << "\red NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL"
+
+//Wizard narsie
/obj/machinery/singularity/narsie/wizard
grav_pull = 0
- eat()
- set background = 1
- if(defer_powernet_rebuild != 2)
- defer_powernet_rebuild = 1
- for(var/atom/movable/X in orange(consume_range,src))
- consume(X)
- for(var/turf/X in orange(consume_range,src))
- consume(X)
- if(defer_powernet_rebuild != 2)
- defer_powernet_rebuild = 0
- return
+
+/obj/machinery/singularity/narsie/wizard/eat()
+ set background = 1
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 1
+ for(var/atom/movable/X in orange(consume_range,src))
+ consume(X)
+ for(var/turf/X in orange(consume_range,src))
+ consume(X)
+ if(defer_powernet_rebuild != 2)
+ defer_powernet_rebuild = 0
+ return
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index bb37d0dc41..63f9f9ab3d 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -24,328 +24,328 @@
var/obj/machinery/power/terminal/terminal = null
- New()
- ..()
- spawn(5)
- dir_loop:
- for(var/d in cardinal)
- var/turf/T = get_step(src, d)
- for(var/obj/machinery/power/terminal/term in T)
- if(term && term.dir == turn(d, 180))
- terminal = term
- break dir_loop
- if(!terminal)
- stat |= BROKEN
- return
- terminal.master = src
- updateicon()
- return
+/obj/machinery/power/smes/New()
+ ..()
+ spawn(5)
+ dir_loop:
+ for(var/d in cardinal)
+ var/turf/T = get_step(src, d)
+ for(var/obj/machinery/power/terminal/term in T)
+ if(term && term.dir == turn(d, 180))
+ terminal = term
+ break dir_loop
+ if(!terminal)
+ stat |= BROKEN
+ return
+ terminal.master = src
+ updateicon()
+ return
- proc/updateicon()
- overlays = null
- if(stat & BROKEN) return
+/obj/machinery/power/smes/proc/updateicon()
+ overlays = null
+ if(stat & BROKEN) return
- overlays += image('icons/obj/power.dmi', "smes-op[online]")
+ overlays += image('icons/obj/power.dmi', "smes-op[online]")
- if(charging)
- overlays += image('icons/obj/power.dmi', "smes-oc1")
- else
- if(chargemode)
- overlays += image('icons/obj/power.dmi', "smes-oc0")
+ if(charging)
+ overlays += image('icons/obj/power.dmi', "smes-oc1")
+ else
+ if(chargemode)
+ overlays += image('icons/obj/power.dmi', "smes-oc0")
- var/clevel = chargedisplay()
- if(clevel>0)
- overlays += image('icons/obj/power.dmi', "smes-og[clevel]")
- return
+ var/clevel = chargedisplay()
+ if(clevel>0)
+ overlays += image('icons/obj/power.dmi', "smes-og[clevel]")
+ return
- proc/chargedisplay()
- return round(5.5*charge/capacity)
+/obj/machinery/power/smes/proc/chargedisplay()
+ return round(5.5*charge/capacity)
#define SMESRATE 0.05 // rate of internal charge to external power
- process()
+/obj/machinery/power/smes/process()
- if(stat & BROKEN) return
+ if(stat & BROKEN) return
- //store machine state to see if we need to update the icon overlays
- var/last_disp = chargedisplay()
- var/last_chrg = charging
- var/last_onln = online
+ //store machine state to see if we need to update the icon overlays
+ var/last_disp = chargedisplay()
+ var/last_chrg = charging
+ var/last_onln = online
- if(terminal)
- var/excess = terminal.surplus()
+ if(terminal)
+ var/excess = terminal.surplus()
- if(charging)
- if(excess >= 0) // if there's power available, try to charge
+ if(charging)
+ if(excess >= 0) // if there's power available, try to charge
- var/load = min((capacity-charge)/SMESRATE, chargelevel) // charge at set rate, limited to spare capacity
+ var/load = min((capacity-charge)/SMESRATE, chargelevel) // charge at set rate, limited to spare capacity
- charge += load * SMESRATE // increase the charge
+ charge += load * SMESRATE // increase the charge
- add_load(load) // add the load to the terminal side network
+ add_load(load) // add the load to the terminal side network
- else // if not enough capcity
- charging = 0 // stop charging
- chargecount = 0
+ else // if not enough capcity
+ charging = 0 // stop charging
+ chargecount = 0
- else
- if(chargemode)
- if(chargecount > rand(3,6))
- charging = 1
- chargecount = 0
-
- if(excess > chargelevel)
- chargecount++
- else
- chargecount = 0
- else
+ else
+ if(chargemode)
+ if(chargecount > rand(3,6))
+ charging = 1
chargecount = 0
- if(online) // if outputting
- lastout = min( charge/SMESRATE, output) //limit output to that stored
+ if(excess > chargelevel)
+ chargecount++
+ else
+ chargecount = 0
+ else
+ chargecount = 0
- charge -= lastout*SMESRATE // reduce the storage (may be recovered in /restore() if excessive)
+ if(online) // if outputting
+ lastout = min( charge/SMESRATE, output) //limit output to that stored
- add_avail(lastout) // add output to powernet (smes side)
+ charge -= lastout*SMESRATE // reduce the storage (may be recovered in /restore() if excessive)
- if(charge < 0.0001)
- online = 0 // stop output if charge falls to zero
+ add_avail(lastout) // add output to powernet (smes side)
- // only update icon if state changed
- if(last_disp != chargedisplay() || last_chrg != charging || last_onln != online)
- updateicon()
+ if(charge < 0.0001)
+ online = 0 // stop output if charge falls to zero
- for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
- src.interact(M)
- AutoUpdateAI(src)
- return
+ // only update icon if state changed
+ if(last_disp != chargedisplay() || last_chrg != charging || last_onln != online)
+ updateicon()
+
+ for(var/mob/M in viewers(1, src))
+ if ((M.client && M.machine == src))
+ src.interact(M)
+ AutoUpdateAI(src)
+ return
// called after all power processes are finished
// restores charge level to smes if there was excess this ptick
- proc/restore()
- if(stat & BROKEN)
- return
-
- if(!online)
- loaddemand = 0
- return
-
- var/excess = powernet.netexcess // this was how much wasn't used on the network last ptick, minus any removed by other SMESes
-
- excess = min(lastout, excess) // clamp it to how much was actually output by this SMES last ptick
-
- excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen)
-
- // now recharge this amount
-
- var/clev = chargedisplay()
-
- charge += excess * SMESRATE
- powernet.netexcess -= excess // remove the excess from the powernet, so later SMESes don't try to use it
-
- loaddemand = lastout-excess
-
- if(clev != chargedisplay() )
- updateicon()
+/obj/machinery/power/smes/proc/restore()
+ if(stat & BROKEN)
return
-
- add_load(var/amount)
- if(terminal && terminal.powernet)
- terminal.powernet.newload += amount
-
-
- attack_ai(mob/user)
- add_fingerprint(user)
- if(stat & BROKEN) return
- interact(user)
-
-
- attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & BROKEN) return
-
- if(ishuman(user))
- if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
- call(/obj/item/clothing/gloves/space_ninja/proc/drain)("SMES",src,user:wear_suit)
- return
- interact(user)
-
-
- proc/interact(mob/user)
- if(get_dist(src, user) > 1 && !istype(user, /mob/living/silicon/ai))
- user.machine = null
- user << browse(null, "window=smes")
- return
-
- user.machine = src
-
- var/t = "SMES Power Storage Unit [n_tag? "([n_tag])" : null]
"
-
- t += "Stored capacity : [round(100.0*charge/capacity, 0.1)]%
"
-
- t += "Input: [charging ? "Charging" : "Not Charging"] [chargemode ? "Auto Off" : "Auto Off "]
"
-
-
- t += "Input level: M - - - [add_lspace(chargelevel,5)] + + + M
"
-
- t += "
"
-
- t += "Output: [online ? "Online Offline" : "Online Offline "]
"
-
- t += "Output level: M - - - [add_lspace(output,5)] + + + M
"
-
- t += "Output load: [round(loaddemand)] W
"
-
- t += "
Close"
-
- t += ""
- user << browse(t, "window=smes;size=460x300")
- onclose(user, "smes")
+ if(!online)
+ loaddemand = 0
return
+ var/excess = powernet.netexcess // this was how much wasn't used on the network last ptick, minus any removed by other SMESes
- Topic(href, href_list)
- ..()
+ excess = min(lastout, excess) // clamp it to how much was actually output by this SMES last ptick
- if (usr.stat || usr.restrained() )
+ excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen)
+
+ // now recharge this amount
+
+ var/clev = chargedisplay()
+
+ charge += excess * SMESRATE
+ powernet.netexcess -= excess // remove the excess from the powernet, so later SMESes don't try to use it
+
+ loaddemand = lastout-excess
+
+ if(clev != chargedisplay() )
+ updateicon()
+ return
+
+
+/obj/machinery/power/smes/add_load(var/amount)
+ if(terminal && terminal.powernet)
+ terminal.powernet.newload += amount
+
+
+/obj/machinery/power/smes/attack_ai(mob/user)
+ add_fingerprint(user)
+ if(stat & BROKEN) return
+ interact(user)
+
+
+/obj/machinery/power/smes/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(stat & BROKEN) return
+
+ if(ishuman(user))
+ if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
+ call(/obj/item/clothing/gloves/space_ninja/proc/drain)("SMES",src,user:wear_suit)
return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- if(!istype(usr, /mob/living/silicon/ai))
- usr << "\red You don't have the dexterity to do this!"
- return
-
- //world << "[href] ; [href_list[href]]"
-
- if (( usr.machine==src && ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
+ interact(user)
- if( href_list["close"] )
- usr << browse(null, "window=smes")
- usr.machine = null
- return
+/obj/machinery/power/smes/proc/interact(mob/user)
+ if(get_dist(src, user) > 1 && !istype(user, /mob/living/silicon/ai))
+ user.machine = null
+ user << browse(null, "window=smes")
+ return
- else if( href_list["cmode"] )
- chargemode = !chargemode
- if(!chargemode)
- charging = 0
- updateicon()
+ user.machine = src
- else if( href_list["online"] )
- online = !online
- updateicon()
- else if( href_list["input"] )
+ var/t = "SMES Power Storage Unit [n_tag? "([n_tag])" : null]
"
- var/i = text2num(href_list["input"])
+ t += "Stored capacity : [round(100.0*charge/capacity, 0.1)]%
"
- var/d = 0
- switch(i)
- if(-4)
- chargelevel = 0
- if(4)
- chargelevel = SMESMAXCHARGELEVEL //30000
+ t += "Input: [charging ? "Charging" : "Not Charging"] [chargemode ? "Auto Off" : "Auto Off "]
"
- if(1)
- d = 100
- if(-1)
- d = -100
- if(2)
- d = 1000
- if(-2)
- d = -1000
- if(3)
- d = 10000
- if(-3)
- d = -10000
- chargelevel += d
- chargelevel = max(0, min(SMESMAXCHARGELEVEL, chargelevel)) // clamp to range
+ t += "Input level: M - - - [add_lspace(chargelevel,5)] + + + M
"
- else if( href_list["output"] )
+ t += "
"
- var/i = text2num(href_list["output"])
+ t += "Output: [online ? "Online Offline" : "Online Offline "]
"
- var/d = 0
- switch(i)
- if(-4)
- output = 0
- if(4)
- output = SMESMAXOUTPUT //30000
+ t += "Output level: M - - - [add_lspace(output,5)] + + + M
"
- if(1)
- d = 100
- if(-1)
- d = -100
- if(2)
- d = 1000
- if(-2)
- d = -1000
- if(3)
- d = 10000
- if(-3)
- d = -10000
+ t += "Output load: [round(loaddemand)] W
"
- output += d
- output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range
+ t += "
Close"
- investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo")
- src.updateUsrDialog()
+ t += ""
+ user << browse(t, "window=smes;size=460x300")
+ onclose(user, "smes")
+ return
- else
+
+/obj/machinery/power/smes/Topic(href, href_list)
+ ..()
+
+ if (usr.stat || usr.restrained() )
+ return
+ if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if(!istype(usr, /mob/living/silicon/ai))
+ usr << "\red You don't have the dexterity to do this!"
+ return
+
+//world << "[href] ; [href_list[href]]"
+
+ if (( usr.machine==src && ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
+
+
+ if( href_list["close"] )
usr << browse(null, "window=smes")
usr.machine = null
- return
+ return
+
+ else if( href_list["cmode"] )
+ chargemode = !chargemode
+ if(!chargemode)
+ charging = 0
+ updateicon()
+
+ else if( href_list["online"] )
+ online = !online
+ updateicon()
+ else if( href_list["input"] )
+
+ var/i = text2num(href_list["input"])
+
+ var/d = 0
+ switch(i)
+ if(-4)
+ chargelevel = 0
+ if(4)
+ chargelevel = SMESMAXCHARGELEVEL //30000
+
+ if(1)
+ d = 100
+ if(-1)
+ d = -100
+ if(2)
+ d = 1000
+ if(-2)
+ d = -1000
+ if(3)
+ d = 10000
+ if(-3)
+ d = -10000
+
+ chargelevel += d
+ chargelevel = max(0, min(SMESMAXCHARGELEVEL, chargelevel)) // clamp to range
+
+ else if( href_list["output"] )
+
+ var/i = text2num(href_list["output"])
+
+ var/d = 0
+ switch(i)
+ if(-4)
+ output = 0
+ if(4)
+ output = SMESMAXOUTPUT //30000
+
+ if(1)
+ d = 100
+ if(-1)
+ d = -100
+ if(2)
+ d = 1000
+ if(-2)
+ d = -1000
+ if(3)
+ d = 10000
+ if(-3)
+ d = -10000
+
+ output += d
+ output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range
+
+ investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo")
+ src.updateUsrDialog()
+
+ else
+ usr << browse(null, "window=smes")
+ usr.machine = null
+ return
- proc/ion_act()
- if(src.z == 1)
- if(prob(1)) //explosion
- world << "\red SMES explosion in [src.loc.loc]"
- for(var/mob/M in viewers(src))
- M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2)
- sleep(10*pick(4,5,6,7,10,14))
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
- smoke.set_up(3, 0, src.loc)
- smoke.attach(src)
- smoke.start()
- explosion(src.loc, -1, 0, 1, 3, 0)
- del(src)
- return
- if(prob(15)) //Power drain
- world << "\red SMES power drain in [src.loc.loc]"
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- if(prob(50))
- emp_act(1)
- else
- emp_act(2)
- if(prob(5)) //smoke only
- world << "\red SMES smoke in [src.loc.loc]"
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
- smoke.set_up(3, 0, src.loc)
- smoke.attach(src)
- smoke.start()
+/obj/machinery/power/smes/proc/ion_act()
+ if(src.z == 1)
+ if(prob(1)) //explosion
+ world << "\red SMES explosion in [src.loc.loc]"
+ for(var/mob/M in viewers(src))
+ M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2)
+ sleep(10*pick(4,5,6,7,10,14))
+ var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ smoke.set_up(3, 0, src.loc)
+ smoke.attach(src)
+ smoke.start()
+ explosion(src.loc, -1, 0, 1, 3, 0)
+ del(src)
+ return
+ if(prob(15)) //Power drain
+ world << "\red SMES power drain in [src.loc.loc]"
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ if(prob(50))
+ emp_act(1)
+ else
+ emp_act(2)
+ if(prob(5)) //smoke only
+ world << "\red SMES smoke in [src.loc.loc]"
+ var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ smoke.set_up(3, 0, src.loc)
+ smoke.attach(src)
+ smoke.start()
- emp_act(severity)
- online = 0
- charging = 0
- output = 0
- charge -= 1e6/severity
- if (charge < 0)
- charge = 0
- spawn(100)
- output = initial(output)
- charging = initial(charging)
- online = initial(online)
- ..()
+/obj/machinery/power/smes/emp_act(severity)
+ online = 0
+ charging = 0
+ output = 0
+ charge -= 1e6/severity
+ if (charge < 0)
+ charge = 0
+ spawn(100)
+ output = initial(output)
+ charging = initial(charging)
+ online = initial(online)
+ ..()
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 505862b3bd..2a4fa39123 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -20,129 +20,124 @@
var/ndir = SOUTH
var/turn_angle = 0
var/obj/machinery/power/solar_control/control = null
- proc
- healthcheck()
+
+
+/obj/machinery/power/solar/New()
+ ..()
+ spawn(10)
updateicon()
update_solar_exposure()
- broken()
+ if(powernet)
+ for(var/obj/machinery/power/solar_control/SC in powernet.nodes)
+ if(SC.id == id)
+ control = SC
- New()
- ..()
- spawn(10)
- updateicon()
- update_solar_exposure()
- if(powernet)
- for(var/obj/machinery/power/solar_control/SC in powernet.nodes)
- if(SC.id == id)
- control = SC
-
-
- attackby(obj/item/weapon/W, mob/user)
- ..()
- if (W)
- src.add_fingerprint(user)
- src.health -= W.force
- src.healthcheck()
- return
-
-
- blob_act()
- src.health--
+/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user)
+ ..()
+ if (W)
+ src.add_fingerprint(user)
+ src.health -= W.force
src.healthcheck()
return
- healthcheck()
- if (src.health <= 0)
- if(!(stat & BROKEN))
- broken()
- else
- new /obj/item/weapon/shard(src.loc)
- new /obj/item/weapon/shard(src.loc)
- del(src)
- return
- return
+/obj/machinery/power/solar/blob_act()
+ src.health--
+ src.healthcheck()
+ return
- updateicon()
- overlays = null
- if(stat & BROKEN)
- overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)
- else
- overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)
- src.dir = angle2dir(adir)
- return
-
-
- update_solar_exposure()
- if(!sun)
- return
- if(obscured)
- sunfrac = 0
- return
- var/p_angle = abs((360+adir)%360 - (360+sun.angle)%360)
- if(p_angle > 90) // if facing more than 90deg from sun, zero output
- sunfrac = 0
- return
- sunfrac = cos(p_angle) ** 2
-
-
- process()
- if(stat & BROKEN) return
- if(!control) return
- if(obscured) return
-
- var/sgen = SOLARGENRATE * sunfrac
- add_avail(sgen)
- if(powernet && control)
- if(control in powernet.nodes) //this line right here...
- control.gen += sgen
-
- if(adir != ndir)
- spawn(10+rand(0,15))
- adir = (360+adir+dd_range(-10,10,ndir-adir))%360
- updateicon()
- update_solar_exposure()
-
-
- broken()
- stat |= BROKEN
- updateicon()
- return
-
-
- meteorhit()
- if(stat & !BROKEN)
+/obj/machinery/power/solar/proc/healthcheck()
+ if (src.health <= 0)
+ if(!(stat & BROKEN))
broken()
else
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/shard(src.loc)
del(src)
+ return
+ return
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- if(prob(15))
- new /obj/item/weapon/shard( src.loc )
- return
- if(2.0)
- if (prob(25))
- new /obj/item/weapon/shard( src.loc )
- del(src)
- return
- if (prob(50))
- broken()
- if(3.0)
- if (prob(25))
- broken()
+/obj/machinery/power/solar/proc/updateicon()
+ overlays = null
+ if(stat & BROKEN)
+ overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)
+ else
+ overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)
+ src.dir = angle2dir(adir)
+ return
+
+
+/obj/machinery/power/solar/proc/update_solar_exposure()
+ if(!sun)
return
+ if(obscured)
+ sunfrac = 0
+ return
+ var/p_angle = abs((360+adir)%360 - (360+sun.angle)%360)
+ if(p_angle > 90) // if facing more than 90deg from sun, zero output
+ sunfrac = 0
+ return
+ sunfrac = cos(p_angle) ** 2
- blob_act()
- if(prob(75))
- broken()
- src.density = 0
+/obj/machinery/power/solar/process()
+ if(stat & BROKEN) return
+ if(!control) return
+ if(obscured) return
+
+ var/sgen = SOLARGENRATE * sunfrac
+ add_avail(sgen)
+ if(powernet && control)
+ if(control in powernet.nodes) //this line right here...
+ control.gen += sgen
+
+ if(adir != ndir)
+ spawn(10+rand(0,15))
+ adir = (360+adir+dd_range(-10,10,ndir-adir))%360
+ updateicon()
+ update_solar_exposure()
+
+
+/obj/machinery/power/solar/proc/broken()
+ stat |= BROKEN
+ updateicon()
+ return
+
+
+/obj/machinery/power/solar/meteorhit()
+ if(stat & !BROKEN)
+ broken()
+ else
+ del(src)
+
+
+/obj/machinery/power/solar/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ if(prob(15))
+ new /obj/item/weapon/shard( src.loc )
+ return
+ if(2.0)
+ if (prob(25))
+ new /obj/item/weapon/shard( src.loc )
+ del(src)
+ return
+ if (prob(50))
+ broken()
+ if(3.0)
+ if (prob(25))
+ broken()
+ return
+
+
+/obj/machinery/power/solar/blob_act()
+ if(prob(75))
+ broken()
+ src.density = 0
/obj/machinery/power/solar/fake/process()
diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm
index 992aad1087..30b16f2f2e 100644
--- a/code/modules/power/switch.dm
+++ b/code/modules/power/switch.dm
@@ -16,69 +16,69 @@
var/on = 0 //up is off, down is on
var/busy = 0 //set to 1 when you start pulling
- simple
- icon_state = "switch-up"
- icon_state_on = "switch-down"
- icon_state_off = "switch-up"
+/obj/structure/powerswitch/simple
+ icon_state = "switch-up"
+ icon_state_on = "switch-down"
+ icon_state_off = "switch-up"
- examine()
- ..()
- if(on)
- usr << "The switch is in the on position"
- else
- usr << "The switch is in the off position"
+/obj/structure/powerswitch/examine()
+ ..()
+ if(on)
+ usr << "The switch is in the on position"
+ else
+ usr << "The switch is in the off position"
- attack_ai(mob/user)
- user << "\red You're an AI. This is a manual switch. It's not going to work."
+/obj/structure/powerswitch/attack_ai(mob/user)
+ user << "\red You're an AI. This is a manual switch. It's not going to work."
+ return
+
+/obj/structure/powerswitch/attack_hand(mob/user)
+
+ if(busy)
+ user << "\red This switch is already being toggled."
return
- attack_hand(mob/user)
+ ..()
- if(busy)
- user << "\red This switch is already being toggled."
- return
+ busy = 1
+ for(var/mob/O in viewers(user))
+ O.show_message(text("\red [user] started pulling the [src]."), 1)
- ..()
-
- busy = 1
+ if(do_after(user, 50))
+ set_state(!on)
for(var/mob/O in viewers(user))
- O.show_message(text("\red [user] started pulling the [src]."), 1)
+ O.show_message(text("\red [user] flipped the [src] into the [on ? "on": "off"] position."), 1)
+ busy = 0
- if(do_after(user, 50))
- set_state(!on)
- for(var/mob/O in viewers(user))
- O.show_message(text("\red [user] flipped the [src] into the [on ? "on": "off"] position."), 1)
- busy = 0
+/obj/structure/powerswitch/proc/set_state(var/state)
+ on = state
+ if(on)
+ icon_state = icon_state_on
+ var/list/connection_dirs = list()
+ for(var/direction in list(1,2,4,8,5,6,9,10))
+ for(var/obj/structure/cable/C in get_step(src,direction))
+ if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180))
+ connection_dirs += direction
+ break
- proc/set_state(var/state)
- on = state
- if(on)
- icon_state = icon_state_on
- var/list/connection_dirs = list()
- for(var/direction in list(1,2,4,8,5,6,9,10))
- for(var/obj/structure/cable/C in get_step(src,direction))
- if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180))
- connection_dirs += direction
- break
+ for(var/direction in connection_dirs)
+ var/obj/structure/cable/C = new/obj/structure/cable(src.loc)
+ C.d1 = 0
+ C.d2 = direction
+ C.icon_state = "[C.d1]-[C.d2]"
+ C.power_switch = src
- for(var/direction in connection_dirs)
- var/obj/structure/cable/C = new/obj/structure/cable(src.loc)
- C.d1 = 0
- C.d2 = direction
- C.icon_state = "[C.d1]-[C.d2]"
- C.power_switch = src
+ var/datum/powernet/PN = new()
+ PN.number = powernets.len + 1
+ powernets += PN
+ C.netnum = PN.number
+ PN.cables += C
- var/datum/powernet/PN = new()
- PN.number = powernets.len + 1
- powernets += PN
- C.netnum = PN.number
- PN.cables += C
+ C.mergeConnectedNetworks(C.d2)
+ C.mergeConnectedNetworksOnTurf()
- C.mergeConnectedNetworks(C.d2)
- C.mergeConnectedNetworksOnTurf()
-
- else
- icon_state = icon_state_off
- for(var/obj/structure/cable/C in src.loc)
- del(C)
\ No newline at end of file
+ else
+ icon_state = icon_state_off
+ for(var/obj/structure/cable/C in src.loc)
+ del(C)
\ No newline at end of file
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index b87a8d02cb..f739ba93fd 100644
--- a/code/modules/power/terminal.dm
+++ b/code/modules/power/terminal.dm
@@ -15,18 +15,18 @@
layer = 2.6 // a bit above wires
- New()
- ..()
- var/turf/T = src.loc
- if(level==1) hide(T.intact)
- return
+/obj/machinery/power/terminal/New()
+ ..()
+ var/turf/T = src.loc
+ if(level==1) hide(T.intact)
+ return
- hide(var/i)
- if(i)
- invisibility = 101
- icon_state = "term-f"
- else
- invisibility = 0
- icon_state = "term"
+/obj/machinery/power/terminal/hide(var/i)
+ if(i)
+ invisibility = 101
+ icon_state = "term-f"
+ else
+ invisibility = 0
+ icon_state = "term"
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 0f237a8624..9c9f1398a3 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -15,36 +15,36 @@
var/sun_angle = 0 // sun angle as set by sun datum
- // called by datum/sun/calc_position() as sun's angle changes
- proc/set_angle(var/angle)
- sun_angle = angle
+// called by datum/sun/calc_position() as sun's angle changes
+/obj/machinery/power/tracker/proc/set_angle(var/angle)
+ sun_angle = angle
- //set icon dir to show sun illumination
- dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST
+ //set icon dir to show sun illumination
+ dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST
- // check we can draw power
- if(stat & NOPOWER)
- return
+ // check we can draw power
+ if(stat & NOPOWER)
+ return
- // find all solar controls and update them
- // currently, just update all controllers in world
- // ***TODO: better communication system using network
- if(powernet)
- for(var/obj/machinery/power/solar_control/C in powernet.nodes)
- C.tracker_update(angle)
+ // find all solar controls and update them
+ // currently, just update all controllers in world
+ // ***TODO: better communication system using network
+ if(powernet)
+ for(var/obj/machinery/power/solar_control/C in powernet.nodes)
+ C.tracker_update(angle)
- // timed process
- // make sure we can draw power from the powernet
- process()
- var/avail = surplus()
+// timed process
+// make sure we can draw power from the powernet
+/obj/machinery/power/tracker/process()
+ var/avail = surplus()
- if(avail > 500)
- add_load(500)
- stat &= ~NOPOWER
- else
- stat |= NOPOWER
+ if(avail > 500)
+ add_load(500)
+ stat &= ~NOPOWER
+ else
+ stat |= NOPOWER
- // override power change to do nothing since we don't care about area power
- power_change()
- return
\ No newline at end of file
+// override power change to do nothing since we don't care about area power
+/obj/machinery/power/tracker/power_change()
+ return
\ No newline at end of file
diff --git a/icons/effects/ss13_dark_alpha7.dmi b/icons/effects/ss13_dark_alpha7.dmi
index be73b47a31..6954df1ad5 100644
Binary files a/icons/effects/ss13_dark_alpha7.dmi and b/icons/effects/ss13_dark_alpha7.dmi differ
diff --git a/maps/tgstation 3.0.0.dmm b/maps/tgstation 3.0.0.dmm
index 85a9482296..925e4f2c2b 100644
--- a/maps/tgstation 3.0.0.dmm
+++ b/maps/tgstation 3.0.0.dmm
@@ -14,197 +14,236 @@
"an" = (/turf/simulated/floor,/area/lawoffice)
"ao" = (/turf/simulated/wall,/area/storage/eva)
"ap" = (/turf/simulated/floor,/area/storage/eva)
-"aq" = (/turf/simulated/shuttle/wall{tag = "icon-pwall (NORTH)"; icon_state = "pwall"; dir = 1},/area)
-"ar" = (/turf/simulated/shuttle/floor,/area)
-"as" = (/turf/simulated/wall,/area/security/detectives_office)
-"at" = (/turf/simulated/wall,/area/quartermaster/qm)
-"au" = (/turf/simulated/wall,/area/quartermaster/storage)
-"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area)
-"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area)
-"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area)
-"ay" = (/turf/simulated/floor,/area/security/detectives_office)
-"az" = (/turf/simulated/floor,/area/quartermaster/qm)
-"aA" = (/turf/simulated/floor,/area/quartermaster/storage)
-"aB" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area)
-"aC" = (/turf/simulated/wall,/area/storage/primary)
-"aD" = (/turf/simulated/floor/plating,/area/storage/primary)
-"aE" = (/turf/simulated/floor/plating,/area/security/detectives_office)
-"aF" = (/turf/simulated/floor,/area/storage/primary)
-"aG" = (/turf/simulated/wall,/area/quartermaster/miningdock)
-"aH" = (/turf/simulated/floor/plating,/area/quartermaster/storage)
-"aI" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor2"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/plating,/area)
-"aJ" = (/turf/simulated/floor,/area/quartermaster/miningdock)
-"aK" = (/turf/simulated/floor/plating,/area/quartermaster/miningdock)
-"aL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area)
-"aM" = (/turf/simulated/wall,/area/janitor)
-"aN" = (/turf/simulated/wall,/area/storage/art)
-"aO" = (/turf/simulated/floor,/area/janitor)
-"aP" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/turf/simulated/shuttle/plating,/area)
-"aQ" = (/turf/simulated/floor,/area/storage/art)
-"aR" = (/turf/simulated/floor/plating,/area/janitor)
-"aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area)
-"aT" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "wall_floor"; tag = ""},/area)
-"aU" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "wall_floor"; tag = ""},/area)
-"aV" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area)
-"aW" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area)
-"aX" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area)
-"aY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating,/area)
-"aZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area)
-"ba" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area)
-"bb" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area)
-"bc" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area)
-"bd" = (/turf/simulated/wall,/area/crew_quarters/sleep_female)
-"be" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_female)
-"bf" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_female)
-"bg" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_female)
-"bh" = (/turf/simulated/wall,/area/crew_quarters/captain)
-"bi" = (/turf/simulated/floor/plating,/area/crew_quarters/captain)
-"bj" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain)
-"bk" = (/turf/simulated/wall,/area/bridge)
-"bl" = (/turf/simulated/floor,/area/crew_quarters/sleep_female)
-"bm" = (/turf/simulated/floor,/area/bridge)
-"bn" = (/turf/simulated/floor/plating,/area/bridge)
-"bo" = (/turf/simulated/floor/plating/airless,/area)
-"bp" = (/turf/simulated/wall,/area/storage/emergency)
-"bq" = (/turf/simulated/floor,/area/storage/emergency)
-"br" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/sleep_female)
-"bs" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_female)
-"bt" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area)
-"bu" = (/turf/simulated/floor{icon_state = "wood"},/area/bridge)
-"bv" = (/turf/simulated/wall,/area/security/main)
-"bw" = (/turf/simulated/wall,/area/security/brig)
-"bx" = (/turf/simulated/floor,/area/security/main)
-"by" = (/turf/simulated/floor,/area/security/brig)
-"bz" = (/turf/simulated/wall,/area/security/warden)
-"bA" = (/turf/simulated/wall,/area/engine/engineering)
-"bB" = (/turf/simulated/wall,/area/engine/chiefs_office)
-"bC" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden)
-"bD" = (/turf/simulated/floor,/area/engine/engineering)
-"bE" = (/turf/simulated/floor,/area/engine/chiefs_office)
-"bF" = (/turf/simulated/wall,/area/crew_quarters/bar)
-"bG" = (/turf/simulated/floor/plating,/area/crew_quarters/bar)
-"bH" = (/turf/simulated/wall,/area/crew_quarters/kitchen)
-"bI" = (/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
-"bJ" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar)
-"bK" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen)
-"bL" = (/turf/simulated/floor/plating,/area/engine/engineering)
-"bM" = (/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"bN" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/kitchen)
-"bO" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"bP" = (/obj/structure/lattice,/turf/space,/area)
-"bQ" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/turf/space,/area)
-"bR" = (/obj/item/weapon/wirecutters,/turf/space,/area)
-"bS" = (/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
-"bT" = (/turf/simulated/wall,/area/crew_quarters/heads)
-"bU" = (/turf/simulated/floor,/area/crew_quarters/heads)
-"bV" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/obj/item/weapon/crowbar,/turf/space,/area)
-"bW" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"bX" = (/obj/machinery/the_singularitygen{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"bY" = (/obj/item/weapon/weldingtool,/turf/space,/area)
-"bZ" = (/turf/simulated/floor{icon_state = "dark"},/area/security/main)
-"ca" = (/turf/simulated/floor/plating,/area/security/main)
-"cb" = (/turf/simulated/wall,/area/security/hos)
-"cc" = (/turf/simulated/floor{icon_state = "wood"},/area/security/hos)
-"cd" = (/turf/simulated/wall,/area/security/nuke_storage)
-"ce" = (/turf/simulated/floor{icon_state = "dark"},/area/security/nuke_storage)
-"cf" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/theatre)
-"cg" = (/turf/simulated/wall,/area/bridge/meeting_room)
-"ch" = (/turf/simulated/floor,/area/bridge/meeting_room)
-"ci" = (/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
-"cj" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod1/station)
-"ck" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
-"cl" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/space,/area/shuttle/escape_pod1/station)
-"cm" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station)
-"cn" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
-"co" = (/turf/simulated/wall,/area/crew_quarters/theatre)
-"cp" = (/turf/simulated/floor/plating,/area/bridge/meeting_room)
-"cq" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
-"cr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/escape_pod1/station)
-"cs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station)
-"ct" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod1/station)
-"cu" = (/turf/simulated/wall,/area/hydroponics)
-"cv" = (/turf/simulated/floor/grass,/area/hydroponics)
-"cw" = (/turf/simulated/wall,/area/crew_quarters/sleep_male)
-"cx" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/sleep_male)
-"cy" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_male)
-"cz" = (/turf/simulated/floor,/area/hydroponics)
-"cA" = (/turf/simulated/floor,/area/crew_quarters/sleep_male)
-"cB" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_male)
-"cC" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_male)
-"cD" = (/turf/simulated/wall,/area/library)
-"cE" = (/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/library)
-"cF" = (/turf/simulated/wall,/area/assembly/assembly_line)
-"cG" = (/turf/simulated/floor/plating,/area/assembly/assembly_line)
-"cH" = (/turf/simulated/floor,/area/assembly/assembly_line)
-"cI" = (/turf/simulated/wall,/area/medical/chemistry)
-"cJ" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
-"cK" = (/turf/simulated/wall,/area/medical/cryo)
-"cL" = (/turf/simulated/wall,/area/medical/morgue)
-"cM" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
-"cN" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_male)
-"cO" = (/turf/simulated/floor{icon_state = "wood"},/area/library)
-"cP" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/assembly_line)
-"cQ" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/assembly/assembly_line)
-"cR" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
-"cS" = (/turf/simulated/floor{icon_state = "white"},/area/medical/cryo)
-"cT" = (/turf/simulated/floor/plating,/area/library)
-"cU" = (/turf/simulated/wall,/area/medical/genetics)
-"cV" = (/turf/simulated/wall,/area/medical/patients_rooms)
-"cW" = (/turf/simulated/floor/plating,/area/medical/medbay)
-"cX" = (/turf/simulated/wall,/area/medical/medbay)
-"cY" = (/turf/simulated/floor/plating,/area/medical/cryo)
-"cZ" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics)
-"da" = (/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms)
-"db" = (/turf/simulated/floor{icon_state = "white"},/area/medical/morgue)
-"dc" = (/turf/simulated/floor/plating,/area/medical/genetics)
-"dd" = (/turf/simulated/wall,/area/medical/exam_room)
-"de" = (/turf/simulated/floor{icon_state = "white"},/area/medical/exam_room)
-"df" = (/turf/simulated/wall,/area/toxins/lab)
-"dg" = (/turf/simulated/wall,/area/crew_quarters/hor)
-"dh" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
-"di" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor)
-"dj" = (/turf/simulated/wall,/area/medical/cmo)
-"dk" = (/turf/simulated/floor/plating,/area/medical/cmo)
-"dl" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"dm" = (/turf/simulated/wall,/area/medical/surgery)
-"dn" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
-"do" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"dp" = (/turf/simulated/wall,/area/medical/virology)
-"dq" = (/turf/simulated/wall,/area/turret_protected/ai)
-"dr" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"ds" = (/turf/simulated/floor/plating,/area/medical/surgery)
-"dt" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"du" = (/turf/simulated/floor/plating,/area/medical/virology)
-"dv" = (/turf/simulated/floor/plating,/area/toxins/lab)
-"dw" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/lab)
-"dx" = (/turf/simulated/wall,/area/toxins/xenobiology)
-"dy" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/xenobiology)
-"dz" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"dA" = (/turf/space,/area/toxins/test_area)
-"dB" = (/turf/simulated/wall/r_wall,/area/atmos)
-"dC" = (/turf/simulated/floor/engine,/area/atmos)
-"dD" = (/turf/simulated/wall,/area/toxins/mixing)
-"dE" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing)
-"dF" = (/turf/simulated/wall,/area/atmos)
-"dG" = (/turf/simulated/floor,/area/atmos)
-"dH" = (/turf/simulated/floor/plating,/area/atmos)
-"dI" = (/turf/simulated/floor/plating,/area/toxins/mixing)
-"dJ" = (/turf/simulated/floor,/area/toxins/lab)
-"dK" = (/turf/simulated/wall,/area/toxins/storage)
-"dL" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/storage)
-"dM" = (/turf/simulated/wall,/area/toxins/server)
-"dN" = (/turf/simulated/floor/bluegrid,/area/toxins/server)
-"dO" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/storage)
-"dP" = (/turf/simulated/wall/r_wall,/area/chapel/main)
-"dQ" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/main)
-"dR" = (/turf/simulated/wall,/area/chapel/main)
-"dS" = (/turf/simulated/floor/plating,/area/chapel/main)
-"dT" = (/turf/simulated/wall,/area/crew_quarters/locker)
-"dU" = (/turf/simulated/floor,/area/crew_quarters/locker)
-"dV" = (/turf/simulated/floor{icon_state = "bar"},/area)
-"dW" = (/turf/simulated/wall,/area/chapel/office)
-"dX" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/office)
-"dY" = (/turf/space,/area/shuttle/escape/station)
+"aq" = (/obj/item/weapon/paper{name = "atmos room for cargo"},/turf/simulated/floor/plating,/area)
+"ar" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor/plating,/area)
+"as" = (/turf/simulated/shuttle/wall{tag = "icon-pwall (NORTH)"; icon_state = "pwall"; dir = 1},/area)
+"at" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 6},/turf/simulated/floor,/area)
+"au" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 4},/turf/simulated/floor/plating,/area)
+"av" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 9},/turf/simulated/floor/plating,/area)
+"aw" = (/turf/simulated/shuttle/floor,/area)
+"ax" = (/obj/item/weapon/paper{name = "atmos room for mining"},/turf/simulated/floor/plating,/area)
+"ay" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor,/area)
+"az" = (/turf/simulated/wall,/area/security/detectives_office)
+"aA" = (/turf/simulated/wall,/area/quartermaster/qm)
+"aB" = (/turf/simulated/wall,/area/quartermaster/storage)
+"aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area)
+"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area)
+"aE" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area)
+"aF" = (/turf/simulated/floor,/area/security/detectives_office)
+"aG" = (/turf/simulated/floor,/area/quartermaster/qm)
+"aH" = (/turf/simulated/floor,/area/quartermaster/storage)
+"aI" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area)
+"aJ" = (/turf/simulated/wall,/area/storage/primary)
+"aK" = (/turf/simulated/floor/plating,/area/storage/primary)
+"aL" = (/turf/simulated/floor/plating,/area/security/detectives_office)
+"aM" = (/turf/simulated/floor,/area/storage/primary)
+"aN" = (/turf/simulated/wall,/area/quartermaster/miningdock)
+"aO" = (/turf/simulated/floor/plating,/area/quartermaster/storage)
+"aP" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor2"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/plating,/area)
+"aQ" = (/turf/simulated/floor,/area/quartermaster/miningdock)
+"aR" = (/turf/simulated/floor/plating,/area/quartermaster/miningdock)
+"aS" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 5},/turf/simulated/floor/plating,/area)
+"aT" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 10},/turf/simulated/floor/plating,/area)
+"aU" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area)
+"aV" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 4},/turf/simulated/floor,/area)
+"aW" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden,/turf/simulated/floor,/area)
+"aX" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 10},/turf/simulated/floor,/area)
+"aY" = (/turf/simulated/wall,/area/janitor)
+"aZ" = (/turf/simulated/wall,/area/storage/art)
+"ba" = (/turf/simulated/floor,/area/janitor)
+"bb" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/turf/simulated/shuttle/plating,/area)
+"bc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor,/area)
+"bd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area)
+"be" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor,/area)
+"bf" = (/turf/simulated/floor,/area/storage/art)
+"bg" = (/turf/simulated/floor/plating,/area/janitor)
+"bh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area)
+"bi" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area)
+"bj" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "wall_floor"; tag = ""},/area)
+"bk" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "wall_floor"; tag = ""},/area)
+"bl" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area)
+"bm" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area)
+"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area)
+"bo" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating,/area)
+"bp" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area)
+"bq" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area)
+"br" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area)
+"bs" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area)
+"bt" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 9},/turf/simulated/floor,/area)
+"bu" = (/obj/item/weapon/paper{name = "atmos room for bridge"},/turf/simulated/floor/plating,/area)
+"bv" = (/turf/simulated/wall,/area/crew_quarters/sleep_female)
+"bw" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_female)
+"bx" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 5},/turf/simulated/floor,/area)
+"by" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{dir = 4},/turf/simulated/floor,/area)
+"bz" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_female)
+"bA" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_female)
+"bB" = (/turf/simulated/wall,/area/crew_quarters/captain)
+"bC" = (/turf/simulated/floor/plating,/area/crew_quarters/captain)
+"bD" = (/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bE" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor,/area)
+"bF" = (/turf/simulated/wall,/area/bridge)
+"bG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area)
+"bH" = (/turf/simulated/floor,/area/crew_quarters/sleep_female)
+"bI" = (/turf/simulated/floor,/area/bridge)
+"bJ" = (/turf/simulated/floor/plating,/area/bridge)
+"bK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor,/area)
+"bL" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area)
+"bM" = (/turf/simulated/floor/plating/airless,/area)
+"bN" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{dir = 1},/turf/simulated/floor,/area)
+"bO" = (/turf/simulated/wall,/area/storage/emergency)
+"bP" = (/turf/simulated/floor,/area/storage/emergency)
+"bQ" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep_female)
+"bR" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_female)
+"bS" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area)
+"bT" = (/turf/simulated/floor/wood,/area/bridge)
+"bU" = (/turf/simulated/wall,/area/security/main)
+"bV" = (/obj/item/weapon/paper{name = "atmos room for security"},/turf/simulated/floor/plating,/area/security/main)
+"bW" = (/turf/simulated/floor/plating,/area/security/main)
+"bX" = (/turf/simulated/wall,/area/security/brig)
+"bY" = (/turf/simulated/floor/plating,/area/security/brig)
+"bZ" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{dir = 8},/turf/simulated/floor,/area)
+"ca" = (/turf/simulated/wall,/area/security/warden)
+"cb" = (/turf/simulated/floor,/area/security/main)
+"cc" = (/turf/simulated/wall,/area/engine/engineering)
+"cd" = (/turf/simulated/wall,/area/engine/chiefs_office)
+"ce" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden)
+"cf" = (/turf/simulated/floor,/area/engine/engineering)
+"cg" = (/turf/simulated/floor,/area/engine/chiefs_office)
+"ch" = (/turf/simulated/wall,/area/crew_quarters/bar)
+"ci" = (/turf/simulated/floor/plating,/area/crew_quarters/bar)
+"cj" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor/plating,/area/crew_quarters/bar)
+"ck" = (/turf/simulated/wall,/area/crew_quarters/kitchen)
+"cl" = (/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
+"cm" = (/turf/simulated/floor,/area/security/brig)
+"cn" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"co" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen)
+"cp" = (/obj/item/weapon/paper{name = "atmos room for crew quarters"},/turf/simulated/floor/plating,/area/crew_quarters/bar)
+"cq" = (/turf/simulated/floor/plating,/area/engine/engineering)
+"cr" = (/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"cs" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/kitchen)
+"ct" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"cu" = (/obj/structure/lattice,/turf/space,/area)
+"cv" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/turf/space,/area)
+"cw" = (/obj/item/weapon/wirecutters,/turf/space,/area)
+"cx" = (/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
+"cy" = (/turf/simulated/wall,/area/crew_quarters/heads)
+"cz" = (/turf/simulated/floor,/area/crew_quarters/heads)
+"cA" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/obj/item/weapon/crowbar,/turf/space,/area)
+"cB" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"cC" = (/obj/machinery/the_singularitygen{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"cD" = (/obj/item/weapon/weldingtool,/turf/space,/area)
+"cE" = (/turf/simulated/floor{icon_state = "dark"},/area/security/main)
+"cF" = (/turf/simulated/wall,/area/security/hos)
+"cG" = (/turf/simulated/floor/wood,/area/security/hos)
+"cH" = (/turf/simulated/wall,/area/security/nuke_storage)
+"cI" = (/turf/simulated/floor{icon_state = "dark"},/area/security/nuke_storage)
+"cJ" = (/turf/simulated/floor/wood,/area/crew_quarters/theatre)
+"cK" = (/turf/simulated/wall,/area/bridge/meeting_room)
+"cL" = (/turf/simulated/floor,/area/bridge/meeting_room)
+"cM" = (/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
+"cN" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod1/station)
+"cO" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
+"cP" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/space,/area/shuttle/escape_pod1/station)
+"cQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station)
+"cR" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
+"cS" = (/turf/simulated/wall,/area/crew_quarters/theatre)
+"cT" = (/turf/simulated/floor/plating,/area/bridge/meeting_room)
+"cU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station)
+"cV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/escape_pod1/station)
+"cW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station)
+"cX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod1/station)
+"cY" = (/turf/simulated/wall,/area/hydroponics)
+"cZ" = (/turf/simulated/floor/grass,/area/hydroponics)
+"da" = (/turf/simulated/wall,/area/crew_quarters/sleep_male)
+"db" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep_male)
+"dc" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_male)
+"dd" = (/turf/simulated/floor,/area/hydroponics)
+"de" = (/turf/simulated/floor,/area/crew_quarters/sleep_male)
+"df" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 6},/turf/simulated/floor/plating,/area)
+"dg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/turf/simulated/floor,/area)
+"dh" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_male)
+"di" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_male)
+"dj" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area)
+"dk" = (/turf/simulated/wall,/area/library)
+"dl" = (/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/library)
+"dm" = (/turf/simulated/wall,/area/assembly/assembly_line)
+"dn" = (/turf/simulated/floor/plating,/area/assembly/assembly_line)
+"do" = (/turf/simulated/floor,/area/assembly/assembly_line)
+"dp" = (/turf/simulated/wall,/area/medical/chemistry)
+"dq" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"dr" = (/turf/simulated/wall,/area/medical/cryo)
+"ds" = (/turf/simulated/wall,/area/medical/morgue)
+"dt" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
+"du" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_male)
+"dv" = (/turf/simulated/floor/wood,/area/library)
+"dw" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/assembly_line)
+"dx" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/assembly/assembly_line)
+"dy" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
+"dz" = (/turf/simulated/floor{icon_state = "white"},/area/medical/cryo)
+"dA" = (/turf/simulated/floor/plating,/area/library)
+"dB" = (/turf/simulated/wall,/area/medical/genetics)
+"dC" = (/turf/simulated/wall,/area/medical/patients_rooms)
+"dD" = (/turf/simulated/floor/plating,/area/medical/medbay)
+"dE" = (/turf/simulated/wall,/area/medical/medbay)
+"dF" = (/turf/simulated/floor/plating,/area/medical/cryo)
+"dG" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics)
+"dH" = (/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms)
+"dI" = (/turf/simulated/floor{icon_state = "white"},/area/medical/morgue)
+"dJ" = (/obj/item/weapon/paper{name = "atmos room for medbay"},/turf/simulated/floor/plating,/area)
+"dK" = (/turf/simulated/floor/plating,/area/medical/genetics)
+"dL" = (/turf/simulated/wall,/area/medical/exam_room)
+"dM" = (/turf/simulated/floor{icon_state = "white"},/area/medical/exam_room)
+"dN" = (/turf/simulated/wall,/area/toxins/lab)
+"dO" = (/turf/simulated/wall,/area/crew_quarters/hor)
+"dP" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
+"dQ" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor)
+"dR" = (/obj/item/weapon/paper{name = "atmos room for science wing"},/turf/simulated/floor/plating,/area)
+"dS" = (/turf/simulated/wall,/area/medical/cmo)
+"dT" = (/turf/simulated/floor/plating,/area/medical/cmo)
+"dU" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"dV" = (/turf/simulated/wall,/area/medical/surgery)
+"dW" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
+"dX" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"dY" = (/turf/simulated/wall,/area/medical/virology)
+"dZ" = (/turf/simulated/wall,/area/turret_protected/ai)
+"ea" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
+"eb" = (/turf/simulated/floor/plating,/area/medical/surgery)
+"ec" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"ed" = (/turf/simulated/floor/plating,/area/medical/virology)
+"ee" = (/turf/simulated/floor/plating,/area/toxins/lab)
+"ef" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/lab)
+"eg" = (/turf/simulated/wall,/area/toxins/xenobiology)
+"eh" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/xenobiology)
+"ei" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"ej" = (/turf/space,/area/toxins/test_area)
+"ek" = (/turf/simulated/wall/r_wall,/area/atmos)
+"el" = (/turf/simulated/floor/engine,/area/atmos)
+"em" = (/turf/simulated/wall,/area/toxins/mixing)
+"en" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing)
+"eo" = (/turf/simulated/wall,/area/atmos)
+"ep" = (/turf/simulated/floor/plating,/area/atmos)
+"eq" = (/turf/simulated/floor,/area/atmos)
+"er" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible{dir = 4},/turf/simulated/floor/plating,/area/atmos)
+"es" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible{dir = 4},/turf/simulated/floor,/area/atmos)
+"et" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating,/area/atmos)
+"eu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor,/area/atmos)
+"ev" = (/turf/simulated/floor/plating,/area/toxins/mixing)
+"ew" = (/turf/simulated/floor,/area/toxins/lab)
+"ex" = (/turf/simulated/wall,/area/toxins/storage)
+"ey" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/storage)
+"ez" = (/turf/simulated/wall,/area/toxins/server)
+"eA" = (/turf/simulated/floor/bluegrid,/area/toxins/server)
+"eB" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/storage)
+"eC" = (/turf/simulated/wall/r_wall,/area/chapel/main)
+"eD" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/main)
+"eE" = (/turf/simulated/wall,/area/chapel/main)
+"eF" = (/turf/simulated/floor/plating,/area/chapel/main)
+"eG" = (/turf/simulated/wall,/area/crew_quarters/locker)
+"eH" = (/turf/simulated/floor,/area/crew_quarters/locker)
+"eI" = (/turf/simulated/floor{icon_state = "bar"},/area)
+"eJ" = (/turf/simulated/wall,/area/chapel/office)
+"eK" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/office)
+"eL" = (/turf/space,/area/shuttle/escape/station)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -294,142 +333,142 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeahajajajajajajajadadadafagagafagagafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaeaeaeaeaeahajajajajajajahadadadagagagagagagafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeakakakakakakakakakakakadadadalalalalalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeakamamamamamamamamamakadadadalananananananalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoaoaoaoapaoaoaoaoaeaeakamamamamamamamamamakadadadanananananananalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamamadadadalananananananalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeamamamamamamamamamamakadadadalalalalanalalalacacacacacacacacacacacacacaqaqaqaqaqaqaqacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamakadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaearararararararaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakakakamamamamamamamakadadadacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacaqaqaqaqaqaqaqacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeaeaeasasasasasasasasasadadadatatatatatatatauauauauauauauauauauauauauauavawawawawawaxacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeacacacacaaacacaeaeaoapapapapapapapaoaeaeaeaeasayayayayayayayasadadadatazazazazazazauaAaAaAaAaAaAaAaAaAaAaAaAauaBarararararaBacaeaeaCaCaCaCaCaDaDaDaDaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeacacacaeaeaeaoapapapapapapapaoaeaeaeaeasayayayayayayayaEadadadatazazazazazazauaAaAaAaAaAaAaAaAaAaAauauauaBarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaeaeaeaeaeaeaeaeaeaeaeaoapapapapapapapaoaeaeaeaeayayayayayayayayayadadadatazazazazazazaAaAaAaAaAaAaAaAaAaAaAaHaHaHaIarararararaBacaeaeaDaFaFaFaFaFaFaFaFaFaFaFaFaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaJaJaJaJaJaGaKaGaGaeaeaeaeaeaeaeaeaoapapapapapapapaoaeaeaeaeasayayayayayayayaEadadadatazazazazazazauaAaAaAaAaAaAaAaAaAaAaHaHaHaLarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJaJaJaJaGacacacacacacacacaoaoapapapapaoaoaoacaeaeaeasayayayayayayayasadadadatatatazazatatauaAaAaAaAaAaAaAaAaAaAauauauaBarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJaJaJaJaGadadadadadadadadadadadadadadadacaeacaeaeaeaMaMaMaMaMaMaMaMaMadadadadadadadadadadauaAaAaAaAaAaAaAaAaAaAaHaHaHaLarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaDaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaJaJaJaJaJaJaJaJaJaJaJaGadadadadadadadadadadadadadadadaNaNaNaNaeaeaMaOaOaOaOaOaOaOaMadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAaHaHaHaParararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaGaJaJaJaJaJaJaJaJaJaJaJaGadadadadadadadadadadadadadadadaNaQaQaNaeaeaMaOaOaOaOaOaOaOaRadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAauauauaBarararararaBacacacaCaCaDaFaDaDaDaDaDaDaFaDaCaCacacacacacacacacacacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaJaJaJaJaJaJaJaJaJaJaGaGaJaGaGadadadaNaNaNaNaNaNaNaNaNadadadaQaQaQaNaeaeaOaOaOaOaOaOaOaOaOadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAaAaAauaSaTarararaUaVacadadadadadadadadadadadadadadadadadadadadadadadadadacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaGaJaJaJaJaJaJaJaGadadadacadadadaNaQaQaQaQaQaQaQaNadadadaNaQaQaNaeaeaMaOaOaOaOaOaOaOaRadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAaAaAauaWaXaYaYaYaXaZacadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaJaJaJaJaJaJaJaGadadadadadadadaNaQaQaQaQaQaQaQaNadadadaNaQaQaNaeaeaMaRaOaOaOaOaOaOaMadadadacacadadadadadauaAaAaAaAaAaAaAaAaAaAaAaAauaababbbbbbbcaaacadadadadadadadadadadadadadadadadadadadadadadadadadacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJadadadadadadadaNaQaQaQaQaQaQaQaNadadadaNaNaNaNaeaeaMaMaMaMaMaMaMaMaMadadadacacadadadadadauauauauauauauauauauauauauauacacacacacacacacadadadbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbebdbdadadadacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJadadadadadadadaQaQaQaQaNaNaNaNaNadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadbdbfbfbdbfbfbdbfbfbdbfbfbdbgbgbgbgbgbdadadadacaeaeacaabhbhbibibhbibibhbhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJadadadadadadadaNaQaQaQaNadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadbdbfbfbdbfbfbdbfbfbdbfbfbdbgbgbgbgbgbdadadadacaeaeacaabhbjbjbjbjbjbjbjbhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaGadadadadadadadaNaQaQaQaNadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadbdbfbdbdbfbdbdbfbdbdbfbdbdbgbgbgbgbgbdadadadacaeaeacaabibjbjbjbjbjbjbjbhbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaGadadadacadadadaNaQaQaQaNadadadacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacadadadbdblblblblblblblblblblblblblblblblblbdadadadacaeaeacaabibjbjbjbjbjbjbjbhbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaNaQaNaNadadadaNaNaNaNaNadadacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadblblblblblblblblblblblblblblblblblblbladadadacaeaeacaabibjbjbjbjbjbjbjbjbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacboacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadblblblblblblblblblblblblblblblblblblbladadadacaeaeacaabibjbjbjbjbjbjbjbhbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacboacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbdblblblblblblblblblblblblblblblblblbdadadadacaeaeacaabhbjbjbjbjbjbjbjbhbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbqbpbpbdbrbdbdbdbrbdbdbdbdbsbdbdbdadadadacaeaeacaabhbhbhbhbhbhbhbhbhbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaNaNaNaNaNacacacacacacacadadadacaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaacadadadbpbqbqbqbpbrbrbrbdbrbrbrbdbsbsbsbdbsbdadadadacaeaeacaabkbubububkbubububkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbqbqbqbpbrbrbrbdbrbrbrbdbsbsbsbsbsbdadadadacaeaeacaabkbubububkbubububkbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbpbpbpbdbdbdbdbdbdbdbdbdbebdbdbdbdadadadacaeaeacaabkbkbubkbkbkbubkbkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadacaeaeacaabnbmbmbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzbzbzbzbzbzbzbzbzbzbzbzbzbzbzbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbAbAbAbAaaaaaaaaaaaabBbBbBbBbBbBbBbBaaaaaaaaaaaaaaaaaaaaacadadadacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadadaeaeaeacaabnbmbmbmbmbmbmbmbmbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzbCbCbCbCbCbCbCbzbCbCbCbCbCbzbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbDbDbDbDbDbDbDbDbDbAbAbAbAbAbAbAbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbFbFbFbFbGbFbFbFbHbHbHbHbHbHbHbIbHbHbHadadadacaeaeacaabkbkbubkbkbkbubkbkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzbCbCbCbCbCbCbCbzbCbCbCbCbCbCbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAbDbDbDbDbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbJbJbJbHbKbKbKbKbKbKbKbKbKbHadadadacaeaeacaabkbubububkbubububkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbvbvbzbCbCbCbCbCbCbCbCbCbCbCbCbCbCbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbJbJbJbHbKbKbKbKbKbKbKbKbKbHadadadacaeaeacaabkbubububkbubububkbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbxbvbxbxbxbzbCbCbCbCbCbCbCbzbCbCbCbCbCbCbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAbDbDbDbDbDbAbAbAbDbDbDbDbDbAbDbDbDbDbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbJbJbJbJbJbJbJbJbHbKbKbKbKbKbKbKbKbKbKadadadacaeaeacaabkbkbkbkbkbkbkbkbkbmbmbkbkbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbxbvbxbxbxbzbCbCbCbCbCbCbCbzbCbCbCbCbCbzbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAbAbAbLbLbLbAbMbAbLbLbLbAbAbAbDbDbDbDbAbBbBbEbEbBbBbBaaaaaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbHbHbHbHbHbHbHbKbKbKbKbKbKbHadadadacaeaeacaaaaaaaaaaaaaabkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbxbvbvbvbxbvbvbvbzbzbzbzbzbzbzbzbCbCbCbzbzbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbAbAbAaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbHbNbNbNbNbNbHbKbKbKbKbKbKbHadadadacacaeacacacacacacacacbkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbxbxbxbvbxbxbxbxbxbxbxbxbxbvbxbxbxbxbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaaaacacacadadadbFbJbJbJbJbHbNbNbNbNbNbNbKbKbKbKbKbKbHadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbMbMbMbMaaaabObPaabPbObPbQbPbOaaaabMbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaacacaeaeadadadbFbFbJbFbFbHbNbNbNbNbNbHbKbKbKbKbKbKbHadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnbnbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacacacaaaaaaaaaaaaaabAbMbMbMbMaaaabPbPaaaaaabRaabPbQaaaabAbAbAbAbDbAbAbAbDbDbDbDbDbDbAaaaaaabtaaboaeaeacadadadbSbSbSbSbSbHbHbHbHbHbHbHbHbHbHbKbHbHbHadadadacacbTbTbUbTbTbTbTbTbTbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbxbxbxbvbxbxbxbxbxbxbxbxbxbvbxbxbxbxbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadaeaeacaaaaaaaaaaaabAbAbMbMbMbMaaaabPbQbPbPbPbPbPaaaaaaaabLbLbDbDbDbDbDbAbAbDbDbDbDbDbAacacacacacacacacacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadbTbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbvbvbvbxbxbvbvbvbvbvbvbvbvbvbxbxbxbxbxbxbxbxbxbxbxadadadadadadadacaeacacaaaaaaaaaabAbMbMbMbAbAaaaaaaaabPbMbMbMbPbVbQaaaabLbLbDbDbDbDbDbDbAbDbDbDbDbDbAadadadadadadadadacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacadbUbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbvaaaabvbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxadadadadadadadacaeboboaabtaaaaaabAbMbMbMbAbMaaaabObQbPbWbXbMbPaabOaaaabLbLbDbDbDbDbDbDbDbDbDbDbDbDbDadadadadadadadadadadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacadbTbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbvaaaabvbxbxbxbxbvbxbxbxbxbxbxbxbxbxbxbxadadadadadadadacaeacacaaaaaaaaaabAbMbMbMbAbAaaaabPbYbPbMbMbMbPaaaaaaaabLbLbDbDbDbDbDbDbAbDbDbDbDbDbAadadadadadadadadacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacadbTbUbUbUbUbUbUbUbUbmbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbZbZbvbvaabvbvbvbvbvbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadaeaeacaaaaaaaaaaaabAbAbMbMbMbMaaaaaaaabPbPbPbPbPaaaaaaaabLbLbDbDbDbDbDbAbAbDbDbDbDbDbAacacacacacacacacacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadbTbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbZbZbZbZbvaabvbZbZbZbZbvbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacacacaaaaaaaaaaaaaabAbMbMbMbMaaaabPaaaaaaaaaaaabPbQaaaabAbAbAbAbDbAbAbAbDbDbDbDbDbDbAaaaaaabtaaboaeaeacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacacbTbTbUbTbTbTbTbTbTbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbZbZbZbZcaaacabZbZbZbZbZbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbMbMbMbMaaaabObPbQbPbObPbQbPbOaaaabMbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaacacaeaeadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnbnbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbZbZbZbZbvaabvbZbZbZbZbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaaaacacacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvaabvbvbvbvbvbvcbcbcccccccbcbbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbAbAbAaaaaaaaaaaaaaaaaacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacacacacacacacacacacacbkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbcccccccccccbbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAbAbAbLbLbLbAbMbAbLbLbLbAbAbAbDbDbDbDbAbLbLbLbAbAbAbAaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScfcfcfcfcfcfcfcfcfbSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaabkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbccccccccccccbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAbDbDbDbDbDbAbAbAbDbDbDbDbDbAbDbDbDbDbAbLbLbLbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScfcfcfcfcfcfcfcfcfbSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaacgcgcgchcgcgcgcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececiccccccccccccbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAcjckclbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScfcfcfcfcfcfcfcfcfbSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaacgchchchchchchcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbccccccccccccbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAbDbDbDbDbAcmcncmbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScococococococococobSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaacgchchchchchchcpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbcccccccccccbbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbDbDbDbDbDbDbDbDbDbAbAbAbAbAbAbAbAcmcqcmbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaacgchchchchchchcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcdcdcdcdcdcbcbcccccccbcbbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbAbAbAbAaaaaaaaaaaaaaacrcsctaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadadcucucucucucucucucucucucgcgcgcgcgcgcgcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbpbpbpcwcwcwcwcwcwcwcwcwcwcwcwcwcwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbqbqbqbpcxcxcxcwcxcxcxcwcycycycycycwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQadadadacaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaacadadadbpbqbqbqbpcxcxcxcwcxcxcxcwcycycycwcycwadadadcuczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbqbpbpcwcxcwcwcwcxcwcwcwcwcycwcwcwadadadczczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaNaQaQaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacboacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadcwcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcwadadadczczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaNaNaNaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacboacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAadadadcuczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacacadadadacacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacadadadcwcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaeacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcwcBcwcwcBcwcwcBcwcwcBcwcwcCcCcCcCcCcwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcwcBcBcwcBcBcwcBcBcwcBcBcwcCcCcCcCcCcwadadadcucucucucucucucucucucucucucucuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaeacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcwcBcBcwcBcBcwcBcBcwcBcBcwcCcCcCcCcCcwadadadacaaaaaaaacDcEcEcEcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaecFcFcFcFcFcFadadcFcFcFcFcFcFcFcFcGcHcHcGcFcFcFcFadadadcIcIcIadadadcIcIcIcJcJcJcJcJcKcKcKcKcKcKcLcLcLcMcLcLacacaeacacaccwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcNcwcwcwcDcOcDcDcDcDcDcDcDcEcEcEcDcDcDcDcDcDcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcFcFcFcPcPcPcPcFcPcPcFcQcQcQcQcHcHcHcHcHcHcHcHcHcFadadadadcIcRcIcRcRcRcIcRcIcJcJcJcJcJcKcScScScScScLcMcMcMcMcMacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaecDcOcOcOcOcOcOcOcOcDcEcEcEcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcFcQcQcQcQcHcHcHcHcHcHcHcHcHcGadadadadcIcRcRcRcRcRcRcRcRcJcJcJcJcJcScScScScScScLcMcMcMcMcMacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaecTcOcOcOcOcOcOcOcOcEcEcEcEcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcFcQcQcQcQcFcHcHcHcHcHcHcHcHcHadadadadcIcRcRcRcRcRcRcRcIcJcJcJcJcJcKcScScScScScLcMcMcMcMcMcUcUcUcUcUcUcUcUcUcUcUcUcUcVcVcVcVcVcVcVcVcVcVcVcDcOcOcOcOcOcOcOcOcDcDcDcDcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcFcQcQcQcQcFcHcHcHcHcHcHcHcHcHadadadadcIcRcRcRcRcRcRcRcIcWcWcXcJcJcKcKcYcScYcKcLcMcMcMcMcMcUcZcZcZcZcZcZcZcZcZcZcZcUdadadacVdadadacVdadadacDcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcQcQcQcQcQcFcHcHcHcHcHcHcHcHcGadadadadcIcRcRcRcRcRcRcRcIcJcJcXcJcJcJcJcJcJcJcJcLcMcMcMcMcMcZcZcZcZcZcZcZcZcZcZcZcZcUdadadacVdadadacVdadadacDcOcOcOcOcOcOcOcOcOcOcOcOcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcQcQcQcQcQcFcHcHcHcHcHcHcHcHcFadadadadcIcRcRcRcRcRcRcRcIcJcJcJcJcJcJcJcJcJcJcJdbcMcMcMcMcMcUcZcZcZcZcZcZcZcUcUcUcUcUcVdacVcVcVdacVcVcVdacVcDcOcOcOcOcOcOcOcOcOcOcOcOcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcFcFcFcFcFcFcFcFcFcFcFcFcGcGcFcFcFcFcFcFcGcFcFcFcFcFadadadcIcIcIcIcIcIcIcIcIcXcXcXcJcJcJcJcJcJcJcJcLcMcMcMcMcMcUcZcZcZcZcZcZcZcUcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcOcOcOcOcOcOcOcOcOcOcOcOcOcDcDcDcDcDcDcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadacaeaeacaeaeaecXcJcJcJcXcJcJcJcJcJcJcJcJcLcMcMcMcMcMcUcZcZcZcZcZcZcZcUcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcOcOcOcOcOcOcOcOcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadadaeaeaeaeaeaeaecXcJcJcJcJcJcJcJcJcJcJcJcJcLcLcLcLcLcLcUcUcUdccZdccUcUcUcJcJdddddededdddcVdacVcVcVdacVcDcDcDcTcDcDcDcDcDcDcDcDcDcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeaedfdfdfdfdfdfdfdfdfdfdfdfdgdgdgdgdgdgdgdgdgdgdgdgadadadacaeaeacaeaeaecXcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJdddededededddadadacVdadadaacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedfdhdhdhdhdhdhdhdhdhdhdhdgdididididididididididgadadadacaeaeacacacaccXcJcJcJcXcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJdddededededddadadacVdadadaacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedfdhdhdhdhdhdhdhdhdhdhdhdgdididididididididididgadadadacaeaeacaeaeaecXcJcJcJcXcXcJcXdjdkdkdkdldkdkdkdkdjdmdndmdmdmdmdmdmdmdmdodmdddededededddpdpdpdpdpdpdpdpaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaeaedfdfdfdfdfdfdfdfdfdfdhdhdqdqdrdqdqdididididididiadadadacaeaeaeaeaeaecXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododmdodododddddddddddddtdtdtdudtdtdtdpaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaedvdfdwdwdwdwdwdwdwdfdhdhdqdqdrdqdqdididididididiadadadacaeaeacaeaeaecXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododododododpdtdtdtdtdudtdtdtdudtdtdtdpaeaeacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaedvdfdwdwdwdwdwdwdwdfdhdhdqdqdrdqdqdididididididgadadadacaeaeacacacaccXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododmdodododpdtdtdtdtdudtdtdtdudtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdxdxdxdxdxdxdydydydydwdwdwdfdhdhdqdqdqdqdqdididididididgadadadacaeaeaeaeaeaecXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododmdpdtdpdpdtdtdtdtdududtdudududtdudpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdydydydydwdwdwdfdhdhdqdqdqdqdqdididgdgdgdgdgadadadacaeaeaeaeaeaecXcXcXcXcXcXcXcXdjdjdjdjdjdjdjdjdjdjdndndsdodododododmdtdtdtdpdtdtdtdtdtdtdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdzdzdzdzdhdhdhdfdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadadaNaNaNaNaNaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacdmdmdmdmdmdmdmdmdmdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdzdzdzdzdzdzdzdzdzdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadadaNaQaQaQaNaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedpdtdtdtdpdtdtdtdtdtdudududtdudududpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdzdzdzdzdzdzdzdzdzdhdhdhdhdhdhdhdhdhdhdhdfdfdfadadadaQaQaQaQaNaeaedBdBdBdBdBdBdBdBdBdBdBdBdBacacaeaeaeaeaeaeaeaeaeaeaedpdpdpdpdpdtdtdtdtdtdudtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdzdzdzdzdzdzdzdzdxdhdhdhdhdhdhdhdhdhdhdhdhdhdhadadadaNaQaQaQaNaeaedBdCdBdCdBdCdBdCdBdCdBdCdBaaacacacacacacacacacacaeaeaeaeaeaedpdpdpdpdpdpdpdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdzdzdzdzdzdzdzdxdhdhdhdhdhdhdhdhdhdhdhdhdhdhadadadaNaNaNaNaNaeaedBdCdBdCdBdCdBdCdBdCdBdCdBaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaedpdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdzdzdzdzdzdzdzdxdhdhdhdhdhdhdhdhdhdhdhdfdfdfadadadacaeaeaeaeaeaedBdCdBdCdBdCdBdCdBdCdBdCdBaaaaaaaaaaaaaaaaaaaaacacacacacaeaeaeaeaeaeaeaedpdpdpdpdpdpdpdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadadacaeaeaeaeaeaedBdBdBdBdBdBdBdBdBdBdBdBdBaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaedDdEdEdEdEdEdEdEdfdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadaddFdFdFdFdFdFdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaedDdEdEdEdEdEdEdEdDdDdfdhdhdfdfdfdfdfdhdhdfdfdfadadaddFdGdGdGdGdFdGdFdHdFdHdFdHdFdHdFdHdFdHdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeaeacacacdDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdfadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdfadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqararaqaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdfdfadadaddFdGdGdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqararaqaaaadIdIdIdIdIdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdJadadaddFdFdFdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdFdFdHdHdHdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqararaqaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdJadadaddGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdfdfadadaddGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacdDdDdDdDdDdDdEdEdEdEdEdDdKdLdLdfdhdhdhdhdhdhdfadadaddFdFdFdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaedMdNdNdNdNdNdNdNdKdOdOdfdhdhdhdhdhdhdfadadaddFdGdGdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaedMdNdNdNdNdNdNdNdKdOdOdfdfdfdwdfdfdfdfadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdPdPdPdPdPdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdPdQdQdQdPdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddFdGdGdGdGdFdGdGdGdGdGdGdGdPdQdQdQdPdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddRdRdRdRdRdRdRdRdRdRdRdRdRdPdPdQdPdPdFdHdHdHdHdHdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadFdFdFdFdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdMdMdMdMdMdMdMdKdKdKdKdKdKdKdKdKdKdKadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacacacacaeaedTdTdTdTdTdTdTacacacacadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaacaeaedTdUdUdUdUdUdTdVdVdVdVadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadFdFdFdFdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedTdUdUdUdUdUdTdVdVdVdVadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedTdUdUdUdUdUdTdVdVdVdVadadaddRdRdSdSdRdSdSdRdSdSdRdRdRdRdQdRdRdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedTdTdTdUdTdTdTdVdVdVdVadadadacaaaaaaaaaaaaaaaaaaaadWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaedVdVdVdVdVdVdVdVdVdVadadadacaaaaaaaaaaaaaaaaaaaadWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacdVdVdVdVdVdVdVdVdVdVadadadacaaaaaaaaaaaaaaaaaaaadWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacdVdVdVdVdVdVdVdVdVdVadadadacacaeaeacaeaeacaeaeacdWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadaddWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadaddWdWdWdWdWdWdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeakamamamamamamamamamakadadadalananananananalacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoaoaoaoapaoaoaoaoaeaeakamamamamamamamamamakadadadanananananananalaeaqaeacaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamamadadadalananananananalaearaeacaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaacaeaeaoapapapapapapapaoaeaeamamamamamamamamamamakadadadalalalalanalalalacaracacacaeacacacacacacacasasasasasasasacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeacacacacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamakadadatauauauauauauauauauavaeaeaeaeaeaeaeaeaeaeaeawawawawawawawaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxaeacaeaeacaeaeaoapapapapapapapaoaeaeakakakamamamamamamamakadadayacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacasasasasasasasacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaraeacaeaeaeaeaeaoapapapapapapapaoaeaeaeaeazazazazazazazazazadadayaAaAaAaAaAaAaAaBaBaBaBaBaBaBaBaBaBaBaBaBaBaCaDaDaDaDaDaEacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeacaracacaeacacaeaeaoapapapapapapapaoaeaeaeaeazaFaFaFaFaFaFaFazadadayaAaGaGaGaGaGaGaBaHaHaHaHaHaHaHaHaHaHaHaHaBaIawawawawawaIacaeaeaJaJaJaJaJaKaKaKaKaJaJaJaJaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaearaeacacacaeaeaeaoapapapapapapapaoaeaeaeaeazaFaFaFaFaFaFaFaLadadayaAaGaGaGaGaGaGaBaHaHaHaHaHaHaHaHaHaHaBaBaBaIawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaNaNaNaeaeaearaeaeaeaeaeaeaeaoapapapapapapapaoaeaeaeaeaFaFaFaFaFaFaFaFaFadadayaAaGaGaGaGaGaGaHaHaHaHaHaHaHaHaHaHaHaOaOaOaPawawawawawaIacaeaeaKaMaMaMaMaMaMaMaMaMaMaMaMaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaQaQaQaQaQaNaRaNaNaSauauauauaTaeaeaoapapapapapapapaoaeaeaeaeazaFaFaFaFaFaFaFaLadadayaAaGaGaGaGaGaGaBaHaHaHaHaHaHaHaHaHaHaOaOaOaUawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQaQaQaQaNacacacacacaracacaoaoapapapapaoaoaoacaeaeaeazaFaFaFaFaFaFaFazadadayaAaAaAaGaGaAaAaBaHaHaHaHaHaHaHaHaHaHaBaBaBaIawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQaQaQaQaNataVaVaVaVaWaVaVaVaVaVaVaVaVaXacaeacaeaeaeaYaYaYaYaYaYaYaYaYadadayadadadadadadadaBaHaHaHaHaHaHaHaHaHaHaOaOaOaUawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaKaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaQaQaQaQaQaQaQaQaQaQaQaNayadadadadadadadadadadadadadayaZaZaZaZaeaeaYbababababababaaYadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaOaOaObbawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNaQaQaQaQaQaQaQaQaQaQaQaNayadbcbdbdbdbdbdbdbdbdbdbeadayaZbfbfaZaeaeaYbabababababababgadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaBaBaBaIawawawawawaIacacacaJaJaKaMaKaKaKaKaKaKaMaKaJaJacacacacacacacacacacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaQaQaQaQaQaQaQaQaQaQaNaNaQaNaNayadbhaZaZaZaZaZaZaZaZaZbhadaybfbfbfaZaeaebababababababababaadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaBbibjawawawbkblacadadadadadadadadadadadadadadadadadadadadadadadadadacaeacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNaQaQaQaQaQaQaQaNadadadacayadbhaZbfbfbfbfbfbfbfaZbhadayaZbfbfaZaeaeaYbabababababababgadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaBbmbnbobobobnbpacadadadadadadadadadadadadadadadadadadadadadadadadatauaTacaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaQaQaQaQaQaQaQaNadadadadayadbhaZbfbfbfbfbfbfbfaZbhadayaZbfbfaZaeaeaYbgbabababababaaYadadayacacadadadadadaBaHaHaHaHaHaHaHaHaHaHaHaHaBaabqbrbrbrbsaaacadadataVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVbtacaracaebuaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadayadbhaZbfbfbfbfbfbfbfaZbhadayaZaZaZaZaeacaYaYaYaYaYaYaYaYaYadadayacacadadadadadaBaBaBaBaBaBaBaBaBaBaBaBaBaBacacacacacacacacadadaybvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbwbvbvadadadacaSauauaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadayadbhbfbfbfbfaZaZaZaZaZbhadbxaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaWaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVbybvbzbzbvbzbzbvbzbzbvbzbzbvbAbAbAbAbAbvadadadacaeacacacbBbBbCbCbBbCbCbBbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadayadbhaZbfbfbfaZadadadadbhadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaybvbzbzbvbzbzbvbzbzbvbzbzbvbAbAbAbAbAbvadadadacaeaeacaabBbDbDbDbDbDbDbDbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadadayadbhaZbfbfbfaZadadbcbdbEbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbeadaybvbzbvbvbzbvbvbzbvbvbzbvbvbAbAbAbAbAbvadadadacaeaeacaabCbDbDbDbDbDbDbDbBbFbFbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadacayadbhaZbfbfbfaZadbcbGacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacbhadaybvbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbvadadadacaeaeacaabCbDbDbDbDbDbDbDbBbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaNaNaNaNaNaZbfaZaZayadbhaZaZaZaZaZadbhacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHadadadacaeaeacaabCbDbDbDbDbDbDbDbDbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfbfbfbfbfaZayadbKbdbdbdbdbdbdbLacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbMacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHadadadacaeaeacaabCbDbDbDbDbDbDbDbBbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfbfbfbfbfbfayadadadadadadadadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbMacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybvbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbvadadadacaeaeacaabBbDbDbDbDbDbDbDbBbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfbfbfbfbfaZbxbNaVaVaVaVaVaXadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObPbObObvbQbvbvbvbQbvbvbvbvbRbvbvbvadadadacaeacacacbBbBbBbBbBbBbBbBbBbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaZaZaZaZaZaZaZaZacaracacacacacayadbhacaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaacbhadaybObPbPbPbObQbQbQbvbQbQbQbvbRbRbRbvbRbvadadadacaeaeaeaebFbTbTbTbFbTbTbTbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaearacaeaeaeacayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObPbPbPbObQbQbQbvbQbQbQbvbRbRbRbRbRbvadadadacaeacaeaebFbTbTbTbFbTbTbTbFbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbVbWbWbXbYbYbYbYayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObObObObvbvbvbvbvbvbvbvbvbwbvbvbvbvadadadacaeacacacbFbFbTbFbFbFbTbFbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbXbYbYbYbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadbZauauauauauauauaTaeaeaeaeaeaeaeaeaeaeaeadadadacaeaeacaabJbIbIbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacbcbcbbYbYbYbYbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaaaaaacdcdcdcdcdcdcdcdaaaaaaaaaaaaaaaaaaaaacbhadayacaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeacadadadaeaeaeacaabJbIbIbIbIbIbIbIbIbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacecececececececacecececececacbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccccccccccccfcfcfcfcfcfcfcfcfcccccccccccccccccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaychchchcichchchcjckckckckckckckclckckckadadadacaeaeacaabFbFbTbFbFbFbTbFbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacecececececececacececececececbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccfcfcfcfcccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaychcncncncnchcicjckcococococococococockadadadacaeaeacaabFbTbTbTbFbTbTbTbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbUbUcacececececececececececececececbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaychcncncncnchcpcickcococococococococockadadadacaeaeacaabFbTbTbTbFbTbTbTbFbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbcbbUcbcbcbcacecececececececacececececececbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqcccccfcfcfcfcfcccccccfcfcfcfcfcccfcfcfcfcccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaycncncncncnchcicickcocococococococococoadadadacaeaeacaabFbFbFbFbFbFbFbFbFbIbIbFbFbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbcbbUcbcbcbcacecececececececacecececececacbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqcccccccqcqcqcccrcccqcqcqcccccccfcfcfcfcccdcdcgcgcdcdcdaaaaaaaaaaaaaaaaaaaaacbhadaychcncncncnckckckckckckckcocococococockadadadacaeaeacaaaaaaaaaaaaaabFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUcbbUbUbUcbbUbUbUcacacacacacacacacecececacacbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqccaaaaaaaaaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfccccccaaaaaaaaaaaaaaaaacbhadaychcncncncnckcscscscscsckcocococococockadadadacacaeacacacacacacacacbFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUcbcbcbbUcbcbcbcbcbcbcbcbcbbUcbcbcbcbbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqccccaaaaaaaaaaaaaaaaaaaaaaaaaacccccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaaaacacacbhadaychcncncncnckcscscscscscscocococococockadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccrcrcrcraaaactcuaacuctcucvcuctaaaacrcccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaacacaeaebhadaychchcnchchckcscscscscsckcocococococockadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJbJbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacacacaaaaaaaaaaaaaacccrcrcrcraaaacucuaaaaaacwaacucvaaaacccccccccfcccccccfcfcfcfcfcfccaaaaaabSaabMaeaeacbhadaycxcxcxcxcxckckckckckckckckckckcockckckadadadacaccycyczcycycycycycybFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUcbcbcbbUcbcbcbcbcbcbcbcbcbbUcbcbcbcbbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhaeaeacaaaaaaaaaaaacccccrcrcrcraaaacucvcucucucucuaaaaaaaacqcqcfcfcfcfcfcccccfcfcfcfcfccacacacacacacacacacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadcyczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbUbUbUcbcbbUbUbUbUbUbUbUbUbUcbcbcbcbcbcbcbcbcbcbcbadadadadayadbhacaeacacaaaaaaaaaacccrcrcrccccaaaaaaaacucrcrcrcucAcvaaaacqcqcfcfcfcfcfcfcccfcfcfcfcfccadadadadadadadadacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacadczczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbbUaaaabUcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbadadadadayadbhacaebMbMaabSaaaaaacccrcrcrcccraaaactcvcucBcCcrcuaactaaaacqcqcfcfcfcfcfcfcfcfcfcfcfcfcfadadadadadadadadadbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacadcyczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbbUaaaabUcbcbcbcbbUcbcbcbcbcbcbcbcbcbcbcbadadadadayadbhacaeacacaaaaaaaaaacccrcrcrccccaaaacucDcucrcrcrcuaaaaaaaacqcqcfcfcfcfcfcfcccfcfcfcfcfccadadadadadadadadacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacadcyczczczczczczczczbIbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUcEcEbUbUaabUbUbUbUbUbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhaeaeacaaaaaaaaaaaacccccrcrcrcraaaaaaaacucucucucuaaaaaaaacqcqcfcfcfcfcfcccccfcfcfcfcfccacacacacacacacacacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadcyczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcEcEcEcEbUaabUcEcEcEcEbUcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacacacaaaaaaaaaaaaaacccrcrcrcraaaacuaaaaaaaaaaaacucvaaaacccccccccfcccccccfcfcfcfcfcfccaaaaaabSaabMaeaeacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacaccycyczcycycycycycybFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcEcEcEcEbWaabWcEcEcEcEcEcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccrcrcrcraaaactcucvcuctcucvcuctaaaacrcccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaacacaeaebhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJbJbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcEcEcEcEbUaabUcEcEcEcEbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqccccaaaaaaaaaaaaaaaaaaaaaaaaaacccccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaaaacacacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUaabUbUbUbUbUbUcFcFcGcGcGcFcFcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqccaaaaaaaaaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfccccccaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacacacacacacacacacacacbFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcFcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqcccccccqcqcqcccrcccqcqcqcccccccfcfcfcfcccqcqcqccccccccaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcJcJcJcJcJcJcJcJcJcxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaabFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcGcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqcccccfcfcfcfcfcccccccfcfcfcfcfcccfcfcfcfcccqcqcqccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcJcJcJcJcJcJcJcJcJcxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaacKcKcKcLcKcKcKcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcMcGcGcGcGcGcGcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccNcOcPccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcJcJcJcJcJcJcJcJcJcxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaacKcLcLcLcLcLcLcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcGcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccfcfcfcfcccQcRcQccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcScScScScScScScScScxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaacKcLcLcLcLcLcLcTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcFcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccccccccccccfcfcfcfcfcfcfcfcfcccccccccccccccccQcUcQccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadayadadadadadadadadadadadadadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaacKcLcLcLcLcLcLcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcHcHcHcHcHcFcFcGcGcGcFcFcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaaaaaaaacVcWcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadayadadadadadadadadadadadadadadadadadadadadadadcYcYcYcYcYcYcYcYcYcYcYcKcKcKcKcKcKcKcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadayadadadadadadadadadadadadadadadadadadadadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbUbUbUbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObObObOdadadadadadadadadadadadadadaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObPbPbPbOdbdbdbdadbdbdbdadcdcdcdcdcdaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfayadbhacaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaacbhadaybObPbPbPbOdbdbdbdadbdbdbdadcdcdcdadcdaadadadcYddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObPbObOdadbdadadadbdadadadadcdadadaadadadddddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaZbfbfaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbMacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaydadedededededededededededededededededaadadadddddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaZaZaZaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbMacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaydededededededededededededededededededeadadadcYddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaedfauauauaubyadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaydededededededededededededededededededeadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacacacacayadbhacacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacbhadaydadedededededededededededededededededaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacaeaeacayadbKbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbddgbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbGadaydadhdadadhdadadhdadadhdadadidididididaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearaeaeaeacayadadadadadadadadadadadadadadadadadadadadadadbhadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaydadhdhdadhdhdadhdhdadhdhdadidididididaadadadcYcYcYcYcYcYcYcYcYcYcYcYcYcYcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacaeaeacbxaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVdjaVbNaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVbtdadhdhdadhdhdadhdhdadhdhdadidididididaadadadacaaaaaaaadkdldldldkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacaeaedmdmdmdmdmdmadaddmdmdmdmdmdmdmdmdndododndmdmdmdmbhadaydpdpdpadadaddpdpdpdqdqdqdqdqdrdrdrdrdrdrdsdsdsdtdsdsacacaeacacacdadadadadadadadadadadadadadadadudadadadkdvdkdkdkdkdkdkdkdldldldkdkdkdkdkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdmdmdmdwdwdwdwdmdwdwdmdxdxdxdxdodododododododododmadbhadaydpdydpdydydydpdydpdqdqdqdqdqdrdzdzdzdzdzdsdtdtdtdtdtacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedkdvdvdvdvdvdvdvdvdkdldldldkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdmdxdxdxdxdodododododododododnadbhadaydpdydydydydydydydydqdqdqdqdqdzdzdzdzdzdzdsdtdtdtdtdtacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedAdvdvdvdvdvdvdvdvdldldldldkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdmdxdxdxdxdmdododododododododoadbhadaydpdydydydydydydydpdqdqdqdqdqdrdzdzdzdzdzdsdtdtdtdtdtdBdBdBdBdBdBdBdBdBdBdBdBdBdCdCdCdCdCdCdCdCdCdCdCdkdvdvdvdvdvdvdvdvdkdkdkdkdkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdmdxdxdxdxdmdododododododododoadbhadaydpdydydydydydydydpdDdDdEdqdqdrdrdFdzdFdrdsdtdtdtdtdtdBdGdGdGdGdGdGdGdGdGdGdGdBdHdHdHdCdHdHdHdCdHdHdHdkdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdxdxdxdxdxdmdododododododododnadbhadaydpdydydydydydydydpdqdqdEdqdqdqdqdqdqdqdqdsdtdtdtdtdtdGdGdGdGdGdGdGdGdGdGdGdGdBdHdHdHdCdHdHdHdCdHdHdHdkdvdvdvdvdvdvdvdvdvdvdvdvdkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeardmdwdwdwdwdwdwdwdwdwdwdxdxdxdxdxdmdododododododododmadbhadaydpdydydydydydydydpdqdqdqdqdqdqdqdqdqdqdqdIdtdtdtdtdtdBdGdGdGdGdGdGdGdBdBdBdBdBdCdHdCdCdCdHdCdCdCdHdCdkdvdvdvdvdvdvdvdvdvdvdvdvdkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeardmdmdmdmdmdmdmdmdmdmdmdmdmdndndmdmdmdmdmdmdndmdmdmdmdmbhadaydpdpdpdpdpdpdpdpdpdEdEdEdqdqdqdqdqdqdqdqdsdtdtdtdtdtdBdGdGdGdGdGdGdGdBdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdvdvdvdvdvdvdvdvdvdvdvdvdvdkdkdkdkdkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaSauauaTaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaebhadayacaeaeacaedJaedEdqdqdqdEdqdqdqdqdqdqdqdqdsdtdtdtdtdtdBdGdGdGdGdGdGdGdBdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdvdvdvdvdvdvdvdvdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacbhadbZauauauauauaeaedEdqdqdqdqdqdqdqdqdqdqdqdqdsdsdsdsdsdsdBdBdBdKdGdKdBdBdBdqdqdLdLdMdMdLdLdCdHdCdCdCdHdCdkdkdkdAdkdkdkdkdkdkdkdkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaeardNdNdNdNdNdNdNdNdNdNdNdNdOdOdOdOdOdOdOdOdOdOdOdObhadayacaeaeacaeaeaedEdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdLdMdMdMdMdLdHdHdHdCdHdHdHacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeacaeardNdPdPdPdPdPdPdPdPdPdPdPdOdQdQdQdQdQdQdQdQdQdQdObhadayacaeaeacacacacdEdqdqdqdEdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdLdMdMdMdMdLdHdHdHdCdHdHdHacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaedRaeauauauavdNdPdPdPdPdPdPdPdPdPdPdPdOdQdQdQdQdQdQdQdQdQdQdObhadayacaeaeacaeaeaedEdqdqdqdEdEdqdEdSdTdTdTdUdTdTdTdTdSdVdWdVdVdVdVdVdVdVdVdXdVdLdMdMdMdMdLdYdYdYdYdYdYdYdYaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaeaedNdNdNdNdNdNdNdNdNdNdPdPdZdZeadZdZdQdQdQdQdQdQdQbhadayacaeaeaeaeaeaedEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdVdXdXdXdLdLdLdLdLdLecececedecececdYaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeeedNefefefefefefefdNdPdPdZdZeadZdZdQdQdQdQdQdQdQbhadayacaeaeacaeaeaedEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdXdXdXdXdYececececedecececedecececdYaeaeacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeeedNefefefefefefefdNdPdPdZdZeadZdZdQdQdQdQdQdQdObhadayacaeaeacacacacdEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdVdXdXdXdYececececedecececedecececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegegegegegegegehehehehefefefdNdPdPdZdZdZdZdZdQdQdQdQdQdQdObhadayacaeaeaeaeaeaedEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdVdYecdYdYececececededecedededeceddYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegehehehehefefefdNdPdPdZdZdZdZdZdQdQdOdOdOdOdObhadayacaeaeaeaeaeaedEdEdEdEdEdEdEdEdSdSdSdSdSdSdSdSdSdSdWdWebdXdXdXdXdXdVecececdYececececececececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegeieieieidPdPdPdNdPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayaZaZaZaZaZaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacdVdVdVdVdVdVdVdVdVececececececececececececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieieieieieieieieieieidPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayaZbfbfbfaZaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedYecececdYecececececedededecedededdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieieieieieieieieieieidPdPdPdPdPdPdPdPdPdPdPdNdNdNbhadaybfbfbfbfaZaeaeekekekekekekekekekekekekekacacaeaeaeaeaeaeaeaeaeaeaedYdYdYdYdYecececececedececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieieieieieieieieieiegdPdPdPdPdPdPdPdPdPdPdPdPdPdPbhadayaZbfbfbfaZaeaeekelekelekelekelekelekelekaaacacacacacacacacacacaeaeaeaeaeaedYdYdYdYdYdYdYececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegeieieieieieieiegdPdPdPdPdPdPdPdPdPdPdPdPdPdPbhadayaZaZaZaZaZaeaeekelekelekelekelekelekelekaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaedYececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegeieieieieieieiegdPdPdPdPdPdPdPdPdPdPdPdNdNdNbhadayacaeaeaeaeaeaeekelekelekelekelekelekelekaaaaaaaaaaaaaaaaaaaaacacacacacaeaeaeaeaeaeaeaedYdYdYdYdYdYdYdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegegegegegegegegegegegegegegegdPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayaeaeaeaeaeaeaeekekekekekekekekekekekekekaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeemenenenenenenendNdPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayeoeoeoepeoeoeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeemenenenenenenenememdNdPdPdNdNdNdNdNdPdPdNdNdNbhadayeoeqeqeqeqeoeqeoepeoepeoepeoepeoepeoepeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeaeacacacemenenenenenenenenenenenenenendNdPdPdPdPdPdPdNbhadbxeresesesesereseqeqeqeqeqeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdPdNbKbdbdeteueueueueteueqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawawasaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdNdNadadadeoeqeqeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawawasaaaaevevevevevenenenenenenenenenendNdPdPdPdPdPdPewadadadeoeoeoeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqeoeoepepepeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawawasaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdPewadadadeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdNdNadadadeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacememememememenenenenenemexeyeydNdPdPdPdPdPdPdNadadadeoeoeoeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeezeAeAeAeAeAeAeAexeBeBdNdPdPdPdPdPdPdNadadadeoeqeqeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeezeAeAeAeAeAeAeAexeBeBdNdNdNefdNdNdNdNadadadepeqeqeqeqepeqeqeqeqeqeqeqeCeCeCeCeCeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadepeqeqeqeqepeqeqeqeqeqeqeqeCeDeDeDeCeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeoeqeqeqeqeoeqeqeqeqeqeqeqeCeDeDeDeCeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeEeEeEeEeEeEeEeEeEeEeEeEeEeCeCeDeCeCeoepepepepepeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeoeoeoeoeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezezezezezezezezexexexexexexexexexexexadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacacacacaeaeeGeGeGeGeGeGeGacacacacadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaacaeaeeGeHeHeHeHeHeGeIeIeIeIadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeoeoeoeoeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeeGeHeHeHeHeHeGeIeIeIeIadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeeGeHeHeHeHeHeGeIeIeIeIadadadeEeEeFeFeEeFeFeEeFeFeEeEeEeEeDeEeEeEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeeGeGeGeHeGeGeGeIeIeIeIadadadacaaaaaaaaaaaaaaaaaaaaeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeeIeIeIeIeIeIeIeIeIeIadadadacaaaaaaaaaaaaaaaaaaaaeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaceIeIeIeIeIeIeIeIeIeIadadadacaaaaaaaaaaaaaaaaaaaaeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaceIeIeIeIeIeIeIeIeIeIadadadacacaeaeacaeaeacaeaeaceJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadeJeJeJeJeJeJeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaeaeacaeaeacacadacaeaeaeacadacacacaeaeacaeaeacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadacaaaaaaacadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadacaaaaaaacadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa