--[[ English is the standard language that you should base your ID's off of. If something isn't found in your language file then it will fall back to English. Valid languages (from gmod's menu): bg cs da de el en en-PT es-ES et fi fr ga-IE he hr hu it ja ko lt nl no pl pt-BR pt-PT ru sk sv-SE th tr uk vi zh-CN zh-TW You MUST use one of the above when using translate.AddLanguage ]] --[[ RULES FOR TRANSLATORS!! * Only translate formally. Do not translate with slang, improper grammar, spelling, etc. * Do not translate proper things. For example, do not translate Zombie Survival (the name of the game). Do translate "survive the zombies". For names of weapons, you would translate only the "Handgun" part of 'Peashooter' Handgun (and the quotes if your language doesn't use ' as quotes) For names of classes, you would translate Bloated Zombie to whatever the word for Bloated and Zombie are. But you wouldn't translate Pukepus or Bonemesh. * Comment out things that you have not yet translated in your language file. It will then fall back to this file instead of potentially using out of date wording in yours. ]] translate.AddLanguage("en", "English") -- Various gamemode stuff LANGUAGE.minute_points_added = "No damage received for a whole minute! Added %d points." LANGUAGE.infliction_reached_class_unlocked = "%d%% infliction has been reached! %s unlocked!" LANGUAGE.infliction_reached = "%d%% of humans have died!" LANGUAGE.x_unlocked = "%s unlocked!" LANGUAGE.disconnect_killed = "%s was disconnect killed by %s." LANGUAGE.nail_removed_by = "%s removed a nail belonging to %s." LANGUAGE.banned_for_life_warning = "You're banned for life so you can't purchase anything!" LANGUAGE.need_to_be_near_arsenal_crate = "You need to be near an Arsenal Crate to purchase items!" LANGUAGE.cant_purchase_right_now = "You can't purchase anything right now." LANGUAGE.dont_have_enough_points = "You don't have enough points." LANGUAGE.prepare_yourself = "Prepare yourself..." LANGUAGE.purchased_x_for_y_points = "Purchased %s for %d points!" LANGUAGE.give_time_before_suicide = "Give others time to spawn before suiciding." LANGUAGE.no_spare_ammo_to_give = "No spare ammo to give!" LANGUAGE.no_person_in_range = "No person in range!" LANGUAGE.that_life = "That life..." LANGUAGE.x_damage_to_barricades = "%d damage to barricades" LANGUAGE.x_damage_to_humans = "%d damage to humans" LANGUAGE.x_brains_eaten = "%d brains eaten" LANGUAGE.press_jump_to_free_roam = "Press JUMP to free roam" LANGUAGE.press_rmb_to_cycle_targets = "Press RMB to cycle targets" LANGUAGE.press_lmb_to_spawn_on_them = "Press LMB to spawn on them" LANGUAGE.press_lmb_to_spawn = "Press LMB to spawn" LANGUAGE.press_reload_to_spawn_at_normal_point = "Press RELOAD to spawn at a normal spawn point" LANGUAGE.press_walk_to_spawn_as_x = "Press WALK to spawn as a %s" LANGUAGE.observing_x = "Observing %s (%d)" LANGUAGE.waiting_for_next_wave = "Waiting for the next wave to begin..." LANGUAGE.impossible = "Impossible." LANGUAGE.trying_to_put_nails_in_glass = "Trying to put nails in glass is a silly thing to do." LANGUAGE.boss_class_select = "You will be %s the next time you're a boss zombie." LANGUAGE.person_has_weapon = "They already have that weapon." LANGUAGE.cant_do_that_in_classic_mode = "You can't do that in Classic Mode." LANGUAGE.cant_use_x_in_classic_mode = "You can't use %s in Classic Mode." LANGUAGE.cant_use_x_in_zombie_escape = "You can't use %s in Zombie Escape." LANGUAGE.no_class_switch_in_this_mode = "The current mode doesn't allow you to switch classes." LANGUAGE.press_sprint_to_get_up = "Press SPRINT to get up" LANGUAGE.zombie_escape = "Zombie Escape!" LANGUAGE.nothing_for_this_ammo = "You don't have anything that uses this type of ammo." LANGUAGE.you_decide_to_leave_some = "You decide to leave some for your team." LANGUAGE.you_cant_purchase_now = "You can't purchase items right now." LANGUAGE.no_ammo_here = "There's no ammo here right now." LANGUAGE.you_redeemed = "You have redeemed!" LANGUAGE.kill_the_last_human = "Kill the last human!" LANGUAGE.kick_the_last_human = "Kick the last human!" LANGUAGE.you_are_the_last_human = "YOU ARE THE LAST HUMAN!" LANGUAGE.x_zombies_out_to_get_you = "%d ZOMBIES ARE OUT TO GET YOU!" LANGUAGE.x_pants_out_to_get_you = "%d PANTS ARE OUT TO GET YOU!" LANGUAGE.you_have_died = "You have died." LANGUAGE.you_were_killed_by_x = "You were killed by %s" LANGUAGE.you_were_kicked_by_x = "You were kicked in the shins by %s" LANGUAGE.arsenal_upgraded = "Arsenal Upgraded" LANGUAGE.final_wave = "THE FINAL WAVE HAS BEGUN!" LANGUAGE.final_wave_sub = "ALL classes unlocked and the chance for redemption has ended!" LANGUAGE.wave_x_has_begun = "Wave %d has begun!" LANGUAGE.x_unlocked = "%s unlocked!" LANGUAGE.wave_x_is_over = "Wave %d is over!" LANGUAGE.wave_x_is_over_sub = "The Undead have stopped rising and the Points Shop is %d%% off." LANGUAGE.you_are_x = "You are %s!" LANGUAGE.x_has_risen_as_y = "%s has risen as %s!!" LANGUAGE.x_has_risen = "%s has risen!" LANGUAGE.cant_use_worth_anymore = "You can't use the Worth menu any more!" LANGUAGE.class_not_unlocked_will_be_unlocked_x = "That class is not unlocked yet. It will be unlocked at the start of wave %d." LANGUAGE.you_are_already_a_x = "You are already a %s." LANGUAGE.you_will_spawn_as_a_x = "You will spawn as a %s." LANGUAGE.crafting_successful = "Crafting successful!" LANGUAGE.x_crafted_y = "%s crafted %s." LANGUAGE.escape_from_the_zombies = "Escape from the zombies!" LANGUAGE.too_close_to_another_nail = "Too close to another nail." LANGUAGE.object_too_damaged_to_be_used = "That object is too damaged to be used anymore." LANGUAGE.thanks_for_being_a_fan_of_zs = "Thanks for being a fan of Zombie Survival!" LANGUAGE.cant_remove_nails_of_superior_player = "You can't remove the nails of a player doing so much better than you." LANGUAGE.x_turned_on_noclip = "%s turned on noclip." LANGUAGE.x_turned_off_noclip = "%s turned off noclip." LANGUAGE.unlocked_on_wave_x = "Unlocked on wave %d" LANGUAGE.brains_eaten_x = "Brains eaten: %s" LANGUAGE.points_x = "Points: %s" LANGUAGE.next_wave_in_x = "Next wave in %s" LANGUAGE.wave_ends_in_x = "Wave ends in %s" LANGUAGE.wave_x_of_y = "Wave %d of %d" LANGUAGE.zombie_invasion_in_x = "Zombie invasion in %s" LANGUAGE.intermission = "Intermission" LANGUAGE.press_f2_for_the_points_shop = "Press F2 for the Points Shop!" LANGUAGE.breath = "Breath" LANGUAGE.zombie_volunteers = "Zombie Volunteers" LANGUAGE.x_discount_for_buying_between_waves = "%d%% discount for buying between waves!" LANGUAGE.number_of_initial_zombies_this_game = "Number of initial zombies this game (%d%%): %d" LANGUAGE.humans_closest_to_spawns_are_zombies = "The humans closest to the zombie spawns will start as zombies." LANGUAGE.waiting_for_players = "Waiting for players..." LANGUAGE.requires_x_people = "Requires %d people" LANGUAGE.packing_others_object = "Packing other person's object" LANGUAGE.packing = "Packing" LANGUAGE.ze_humans_are_frozen_until_x = "Humans are frozen until %d seconds before the round starts." LANGUAGE.loading = "Loading..." LANGUAGE.next_round_in_x = "Next round in: %s" LANGUAGE.warning = "Warning!" LANGUAGE.ok_and_no_reminder = "OK and don't pop this message up anymore" LANGUAGE.classic_mode_warning = "This server is running Zombie Survival in 'Classic Mode'\nClassic Mode is a setting which greatly alters gameplay. Things that are changed:\n* No selection of zombie classes. Everyone uses the Classic Zombie class\n* No barricading tools such as nailing or turrets\n* More but faster waves\n\nThis is NOT original Zombie Survival!\n\n-- Servers which run classic mode will display CLASSIC MODE in the bottom left of the screen --" LANGUAGE.classic_mode = "CLASSIC MODE" LANGUAGE.resist_x = "Resist: %d%%" LANGUAGE.right_click_to_hammer_nail = "Right click to hammer in a nail." LANGUAGE.nails_x = "Nails: %d" LANGUAGE.resupply_box = "Resupply Box" LANGUAGE.purchase_now = "Purchase now!" LANGUAGE.integrity_x = "Integrity: %d%%" LANGUAGE.empty = "EMPTY" LANGUAGE.manual_control = "MANUAL CONTROL" LANGUAGE.arsenal_crate = "Arsenal Crate" LANGUAGE.not_enough_room_for_a_nest = "Not enough room here for a nest!" LANGUAGE.too_close_to_another_nest = "Too close to another nest!" LANGUAGE.nest_created = "Nest created! Finish building to enable spawning here." LANGUAGE.nest_built_by_x = "A Flesh Creeper nest has been built by %s and is now a spawn point." LANGUAGE.nest_destroyed = "A Flesh Creeper nest has been destroyed." LANGUAGE.wait_x_seconds_before_making_a_new_nest = "You must wait %d more seconds before creating a new nest." LANGUAGE.too_close_to_a_human = "Too close to a human!" LANGUAGE.too_close_to_a_spawn = "Too close to a zombie spawn!" --LANGUAGE.nest_already_being_built = "This nest is already being built by someone else!" LANGUAGE.x_has_built_this_nest_and_is_still_around = "%s has built this nest and is still around, so you can't demolish it." LANGUAGE.no_other_nests = "You can't destroy a nest if only one remains." -- Sigils point objectives LANGUAGE.sigil_destroyed = "The Undead have destroyed a Sigil!" LANGUAGE.sigil_destroyed_only_one_remain_h = "Only one remains! If it falls then there is no hope of escape!" LANGUAGE.sigil_destroyed_only_one_remain_z = "Only one remains!" LANGUAGE.sigil_destroyed_x_remain = "%d Sigils remaining." LANGUAGE.last_sigil_destroyed_all_is_lost = "The Undead have destroyed the last Sigil." LANGUAGE.last_sigil_destroyed_all_is_lost2 = "There is no hope of escape." LANGUAGE.prop_obj_exit_h = "Escape!" LANGUAGE.prop_obj_exit_z = "Stop them!" -- Message beacon messages LANGUAGE.message_beacon_1 = "Meet up here" LANGUAGE.message_beacon_2 = "Need defense here" LANGUAGE.message_beacon_3 = "Need turrets here" LANGUAGE.message_beacon_4 = "Need arsenal crates here" LANGUAGE.message_beacon_5 = "Need medics here" LANGUAGE.message_beacon_6 = "Ammunition box here" LANGUAGE.message_beacon_7 = "Arsenal crate here" LANGUAGE.message_beacon_8 = "Need force fields here" LANGUAGE.message_beacon_9 = "Need explosives here" LANGUAGE.message_beacon_10 = "Zombies come from here" LANGUAGE.message_beacon_11 = "Do not enter!!" LANGUAGE.message_beacon_12 = "Don't go out" LANGUAGE.message_beacon_13 = "Defend this area" LANGUAGE.message_beacon_14 = "Defend this spot" LANGUAGE.message_beacon_15 = "Medics here" LANGUAGE.message_beacon_16 = "Buy from my crate" LANGUAGE.message_beacon_17 = "Barricade here" LANGUAGE.message_beacon_18 = "Don't barricade here" LANGUAGE.message_beacon_19 = "Don't let zombies in here" LANGUAGE.message_beacon_20 = "This will break" LANGUAGE.message_beacon_21 = "This place is dangerous!" LANGUAGE.message_beacon_22 = "Beware of poison!" LANGUAGE.message_beacon_23 = "Zombies are breaking through here!" LANGUAGE.message_beacon_24 = "Zombies are coming. Build a barricade!" LANGUAGE.message_beacon_25 = "Plan B here" -- Class names LANGUAGE.class_zombie = "Zombie" LANGUAGE.class_poison_zombie = "Poison Zombie" LANGUAGE.class_fast_zombie = "Fast Zombie" LANGUAGE.class_bloated_zombie = "Bloated Zombie" LANGUAGE.class_classic_zombie = "Classic Zombie" LANGUAGE.class_super_zombie = "Super Zombie" LANGUAGE.class_fresh_dead = "Fresh Dead" LANGUAGE.class_ghoul = "Ghoul" LANGUAGE.class_headcrab = "Headcrab" LANGUAGE.class_fast_headcrab = "Fast Headcrab" LANGUAGE.class_poison_headcrab = "Poison Headcrab" LANGUAGE.class_the_tickle_monster = "The Tickle Monster" LANGUAGE.class_nightmare = "Nightmare" LANGUAGE.class_pukepus = "Pukepus" LANGUAGE.class_bonemesh = "Bonemesh" LANGUAGE.class_crow = "Crow" LANGUAGE.class_wilowisp = "Wil O' Wisp" LANGUAGE.class_zombie_torso = "Zombie Torso" LANGUAGE.class_zombie_legs = "Zombie Legs" LANGUAGE.class_wraith = "Wraith" LANGUAGE.class_fast_zombie_legs = "Fast Zombie Legs" LANGUAGE.class_chem_zombie = "Chem Zombie" LANGUAGE.class_shade = "Shade" LANGUAGE.class_butcher = "The Butcher" LANGUAGE.class_flesh_creeper = "Flesh Creeper" LANGUAGE.class_gore_child = "Gore Child" LANGUAGE.class_giga_gore_child = "Giga Gore Child" -- Class descriptions LANGUAGE.description_zombie = "The basic zombie is very durable and has powerful claws.\nIt's hard to keep down, especially if not shot in the head." LANGUAGE.description_poison_zombie = "This mutated zombie is not only extremely durable but has abnormal strength.\nIts body is extremely toxic and will even tear out and toss its own flesh at things too far away to hit." LANGUAGE.description_fast_zombie = "This boney cadaver is much faster than other zombies.\nThey aren't much of a threat by themselves but can reach nearly any area by climbing with their razor sharp claws\nThey also have no problem hunting down weak or hurt humans." LANGUAGE.description_bloated_zombie = "Their body is comprised of volatile, toxic chemicals.\nAlthough they move slower, they can take slightly more of a beating." LANGUAGE.description_ghoul = "This zombie has highly toxic flesh.\nIt's slightly weaker than other zombies but makes up for it with its poison attacks.\nIts claws can debilitate a human for a short time and it will eject poison through its wounds if hit with enough damage." LANGUAGE.description_headcrab = "Headcrabs are what caused the initial infection.\nNo one knows where they truely came from.\nTheir method of attack is lunging with the sharp beaks on their belly." LANGUAGE.description_fast_headcrab = "The male headcrab is considerably faster but less beefy than the female.\nEither way, it's equally as annoying and deadly in groups." LANGUAGE.description_poison_headcrab = "This Headcrab is full of deadly nuerotoxins.\nOne bite is usually enough to kill an adult human.\nIt also has the ability to spit a less potent version of its poisons.\nThe spit is just as deadly if its victim is hit in the face." LANGUAGE.description_the_tickle_monster = "Said to be the monster that hides in your closet at night to drag you from your bed.\nThe Tickle Monster's almost elastic arms make it extremely hard to outrun and they also make it an ideal barricade destroyer." LANGUAGE.description_nightmare = "An extremely rare mutation gives the Nightmare its abnormal abilities.\nStronger than the every day zombie in almost every way, the Nightmare is a force to be reckoned with.\nOne swipe of its claws is enough to put down almost any person." LANGUAGE.description_pukepus = "The rotting body of the Puke Pus is comprised entirely of organs used for the generation of poison.\nIts capable of vomiting gallons of poison puke at a time making it extremely dangerous." LANGUAGE.description_bonemesh = "Disfigured and mangled, the Bonemesh is capable of tossing blood bombs.\nEach bomb is comprised of bones and flesh that damages humans while giving precious food to other zombies." LANGUAGE.description_crow = "Carrion Crows are more of a pest than they were before the infection.\nThey feed on infected flesh and become 'carriers' for the undead.\nWhy would you ever make this class not hidden?\nWhat is wrong with you?" LANGUAGE.description_wilowisp = "Sometimes referred to as spirits of the dead." LANGUAGE.description_zombie_torso = "You shouldn't even be seeing this." LANGUAGE.description_zombie_legs = "You shouldn't even be seeing this." LANGUAGE.description_wraith = "A zombie or an apparition?\nNot much is known about it besides the fact that it uses its\nunique stealth ability and sharp claws to cut things to ribbons." LANGUAGE.description_fast_zombie_legs = "You shouldn't even be seeing this." LANGUAGE.description_chem_zombie = "The Chem Zombie body is comprised of volatile, toxic chemicals.\nIt has no other means of attack besides being killed in hopes of blowing up next to any nearby humans." LANGUAGE.description_shade = "By creating a strong magnetic field around itself, all bullets and melee attacks are rendered useless against it.\nFor some reason the Shade is vulnerable to bright lights." LANGUAGE.description_butcher = "A crazed, undead butcher. It isn't very tough but anyone unlucky enough to be near it will most likely be torn to shreds." LANGUAGE.description_flesh_creeper = "Flesh Creepers possess the ability to create nests.\nFrom these nests, other zombified creatures emerge.\nThe way this works is unknown but it is imperitive to destroy any nests or creepers." LANGUAGE.description_gore_child = "Once zombified, an unborn child becomes infected as well.\nPossessing no special abilities, their strength comes from their numbers." LANGUAGE.description_giga_gore_child = "The result of a Gore Child which has been left unchecked for too long.\nA horror to behold, their massive body is the result of zombified stem cells.\nThey also become a host for Gore Children which can always be found in tow with it." -- Class control schemes LANGUAGE.controls_zombie = "> PRIMARY: Claws\n> SECONDARY: Scream\n> RELOAD: Moan\n> SPRINT: Feign death\n> ON FATAL HIT IN LEGS: Revive / Transform" LANGUAGE.controls_poison_zombie = "> PRIMARY: Claws\n> SECONDARY: Flesh toss\n> RELOAD: Scream" LANGUAGE.controls_fast_zombie = "> PRIMARY: Claws\n> SECONDARY: Lunge / Climb (next to wall)\n> RELOAD: Scream" LANGUAGE.controls_bloated_zombie = "> PRIMARY: Claws\n> SECONDARY: Moan\n> SPRINT: Feign death\n> ON DEATH: Poison Gibs" LANGUAGE.controls_ghoul = "> PRIMARY: Poison claws\n> SECONDARY: Flesh toss\n> SPRINT: Feign death\n> RELOAD: Scream\n> ON HIT HUMAN: Slow\n> ON HIT BY HUMAN: Poison ejection" LANGUAGE.controls_headcrab = "> PRIMARY: Lunge attack\n> RELOAD: Burrow" LANGUAGE.controls_fast_headcrab = "> PRIMARY: Lunge attack" LANGUAGE.controls_poison_headcrab = "> PRIMARY: Lunge attack\n> SECONDARY: Spit poison\n> ON HIT HUMAN: Deadly poison\n> ON HIT POISON IN EYES: Blind\n> RELOAD: Scream" LANGUAGE.controls_the_tickle_monster = "> PRIMARY: Elastic claws\n> SECONDARY: Moan" LANGUAGE.controls_nightmare = "> PRIMARY: Death touch\n> SECONDARY: Moan" LANGUAGE.controls_pukepus = "> PRIMARY: Puke" LANGUAGE.controls_bonemesh = "> PRIMARY: Claws\n> SECONDARY: Toss blood bomb" LANGUAGE.controls_wraith = "> PRIMARY: Claws\n> SECONDARY: Scream\n> INVISIBILITY BASED ON MOVEMENT AND VIEW DISTANCE" LANGUAGE.controls_chem_zombie = "> ON DEATH: Poison Bomb" LANGUAGE.controls_shade = "> PRIMARY: Lift\n> SECONDARY: Throw" LANGUAGE.controls_butcher = "> PRIMARY: Chop" LANGUAGE.controls_flesh_creeper = "> PRIMARY: Head Smash\n> SECONDARY: Nest" LANGUAGE.controls_gore_child = "> PRIMARY: Claws" LANGUAGE.controls_giga_gore_child = "> PRIMARY: Smash\n> SECONDARY: Throw Gore Child" -- The help file... Quite big! I wouldn't blame you if you didn't translate this part. LANGUAGE.help_cat_introduction = "Introduction" LANGUAGE.help_cat_survival = "Survival" LANGUAGE.help_cat_barricading = "Barricading" LANGUAGE.help_cat_upgrades = "Upgrades" LANGUAGE.help_cat_being_a_zombie = "Being a Zombie" LANGUAGE.help_cont_introduction = [[

Welcome to Zombie Survival, the (zombie) survival simulator. ZS allows you to fight zombie attacks, create barricades, and even be part of the undead horde.

There are two teams: the survivors and the zombies. The humans win if they survive every wave. Some levels have special objectives to be completed, which may be optional or required to win. If a human is killed then they'll come back as a zombie, which makes it even more difficult for the remaining humans.

The goal for the zombies is to kill all of the humans, making them all zombies and causing everyone to lose the round. Alternatively, a zombie can kill four humans to be redeemed. This allows them a second chance at survival and victory. Remember, the only way to win a round is to be a human when the round ends. Zombies can't technically win the game; zombies can only make everyone else lose!

A certain amount of people are chosen (or volunteer) for being the starting zombies. This amount is displayed at the bottom of your screen before the round starts.

Use the buttons up top to get help on more specific things.

Tips for this section:

]] LANGUAGE.help_cont_survival = [[

Tips for this section:

]] LANGUAGE.help_cont_barricading = [[

Barricading is an extremely important part of survival. It may seem like the undead aren't a threat early on but eventually they'll be powerful enough to kill your entire team in a few seconds.

The only thing keeping the zombies out is a well-built and well-maintained barricade.

There are a couple of tools that give you the ability to set this up. The one most useful tool is the hammer and nails. This allows you to nail down props which then must have the nails destroyed in order for the zombies to get to you. Position the prop you want to nail by pressing USE on it to pick it up. You can hold SPRINT while holding it to lock it in place. Then take your hammer and right click where you want the nail to go. It's a good idea to nail the prop to a sturdy object such as a wall instead of other props. Remember, when a prop is nailed it will forward the damage it takes to the nails themselves. You can repair nails by hitting them with the hammer but eventually they'll become too damaged to repair anymore. You can hold SHIFT with the hammer out to get a view of every single nail deployed on your screen as well as the owner. If you think a nail is in a bad place or you'd like to reposition a prop, you can remove nails by pointing at it and pressing RELOAD. Be warned, if you take a nail that doesn't belong to you then you will be given a point penalty. One more thing to remember: nails take less damage when they're nailed to bigger props. The bigger the size of the prop, the less damage its nails take and the other way around.

One other tool is the 'Aegis' Barricade Kit. This quick-deploying tool allows you to place boards on any surface or deploy them between two walls. It doesn't even need props. To use it, you need to position a board in a spot that is legal. The ghost will turn from red to green to let you know. Deploy a board by pressing PRIMARY ATTACK. Rotate the board by using SECONDARY ATTACK and RELOAD. It uses boards for ammunition so boards you have from the Board Pack work as extra ammunition! You can pack up boards you've deployed by pressing SPRINT while pointing at it.

Another tool worth noting is the Turret. This tosses bullets at any zombie that gets in the way of its laser. Its only downside is that it requires ammunition. You can refill ammunition by pressing USE on it. This will give you bonus points for helping the team. To deploy the turret, position it in a way so that the ghost is green. It must be on a solid surface (no props!). Rotate the turret with SECONDARY ATTACK and RELOAD. If you mess up, you can always pack the turret back up by pressing SPRINT while pointing at it. Remember, the turret will only fire at zombies that cross its tracking beam.

Tips for this section:

]] LANGUAGE.help_cont_upgrades = [[

Points are obtained through killing zombies, healing team mates, and building defenses. You can then exchange points in the Points Shop which is available during wave breaks. Try to make your purchases at Arsenal Crates for a hefty discount!

Tips for this section:

]] LANGUAGE.help_cont_being_a_zombie = [[

Tips for this section:

]] -- Place any custom stuff below here...