DEADSOFTWARE

mapdef cleanup; renamed some fields; mapdef.txt is RC0 now
authorKetmar Dark <ketmar@ketmar.no-ip.org>
Wed, 6 Sep 2017 20:23:41 +0000 (23:23 +0300)
committerKetmar Dark <ketmar@ketmar.no-ip.org>
Wed, 6 Sep 2017 20:24:09 +0000 (23:24 +0300)
13 files changed:
src/game/g_game.pas
src/game/g_main.pas
src/game/g_monsters.pas
src/game/g_panel.pas
src/mapdef/mapdef.txt
src/shared/MAPDEF.pas
src/shared/hashtable.pas
src/shared/mapdef.inc
src/shared/mapdef_help.inc
src/shared/mapdef_impl.inc
src/shared/xdynrec.pas
src/shared/xparser.pas
src/tools/mapgen.dpr

index 3be96517735e7b8f12b98fe79a453dadde11c3e2..7f77a41a3194d89279f537bdd2d656cc92030b85 100644 (file)
@@ -5231,7 +5231,7 @@ begin
               g_Console_Add('player left the map');
               gExitByTrigger := True;
               //g_Game_ExitLevel(gTriggers[a].Data.MapName);
-              g_Game_ExitLevel(gTriggers[a].trigData.trigMapName);
+              g_Game_ExitLevel(gTriggers[a].trigData.trigMap);
               break;
             end;
           end;
@@ -6101,7 +6101,7 @@ begin
             begin
               gExitByTrigger := True;
               //gNextMap := gTriggers[a].Data.MapName;
-              gNextMap := gTriggers[a].trigData.trigMapName;
+              gNextMap := gTriggers[a].trigData.trigMap;
               Break;
             end;
         // Èùåì ñëåäóþùóþ êàðòó â WAD ôàéëå
index 06e5ace8c04ede683e71ac4445ba8e019cc8df49..f3e38724fb0183a50c394b9ceafff886dfc70f4c 100644 (file)
@@ -303,7 +303,7 @@ begin
         begin
           gExitByTrigger := True;
           //g_Game_ExitLevel(gTriggers[a].Data.MapName);
-          g_Game_ExitLevel(gTriggers[a].trigData.trigMapName);
+          g_Game_ExitLevel(gTriggers[a].trigData.trigMap);
           Break;
         end;
     goto Cheated;
index accdcb7ee23d5892e4f0fc39ebdfbe52ec3509ea..d982204b256927b22a1f2c24666397c5739d7a87 100644 (file)
@@ -38,12 +38,14 @@ const
   MONSTATE_REVIVE = 10;
   MONSTATE_RUNOUT = 11;
 
+{ in mapdef now
   BH_NORMAL   = 0;
   BH_KILLER   = 1;
   BH_MANIAC   = 2;
   BH_INSANE   = 3;
   BH_CANNIBAL = 4;
   BH_GOOD     = 5;
+}
 
 type
   TMonster = Class (TObject)
index 6f45fc2cf45a9cd567b86c4c734cfdfe043faf9e..55190ae2b7dd52d5847d2599501dd457f2b4796b 100644 (file)
@@ -872,7 +872,7 @@ begin
     if (mOldMovingActive <> mMovingActive) then mNeedSend := true;
     mOldMovingActive := mMovingActive;
 
-    if g_Game_IsServer and g_Game_IsNet then
+    if not g_Game_IsClient then
     begin
       if actMoveTrig then g_Triggers_Press(mEndPosTrig, ACTIVATE_CUSTOM);
       if actSizeTrig then g_Triggers_Press(mEndSizeTrig, ACTIVATE_CUSTOM);
index 591eadbc4ec71a5754428347ccd1940cda449d15..ed2f95d74f709b412fe5d864aec61204f6be759c 100644 (file)
@@ -4,7 +4,7 @@
 
 // notes:
 //   field without offset is not in binary format
-//   fields with `omitdefault` won't be written when they contain default values
+//   fields with `writedefault` won't be written when they contain default values
 //   fields with `internal` won't be written to any file ever (and won't be read)
 //   `ubyte` is unsigned byte, and `byte` is signed byte
 //   all strings are in utf-8
 
 ////////////////////////////////////////////////////////////////////////////////
 // main blocks
-TMapHeaderRec_1 is "map" size 452 bytes header binblock 7 {
-  //_ is "version" type uint minvalue 1 maxvalue 1;
-  MapName is "name" type char[32] offset 0;
-  MapAuthor is "author" type char[32] offset 32 default "" omitdefault;
-  MapDescription is "description" type char[256] offset 64 default "" omitdefault;
-  MusicName is "music" type char[64] offset 320 default 'Standart.wad:D2DMUS\ПРОСТОТА' omitdefault;
-  SkyName is "sky" type char[64] offset 384 default 'Standart.wad:D2DSKY\RSKY1' omitdefault;
-  //Width is "width" type ushort offset 448;
-  //Height is "height" type ushort offset 450;
-  Size is "size" type size offset 448 as wh;
-  // not in binary
-  Title is "title" type string default ""  omitdefault;
-}
-
-TTextureRec_1 is "texture" size 65 bytes binblock 1 {
-  Resource is "path" type char[64] offset 0;
-  Anim is "animated" type bool offset 64 default false omitdefault;
-  // internals
-  TexIdx is "texidx" type uint internal;
-}
-
-TPanelRec_1 is "panel" size 18 bytes binblock 2 {
-  //X is "x" type int offset 0;
-  //Y is "y" type int offset 4;
-  Pos is "position" type point offset 0 as xy;
-  //Width is "width" type ushort offset 8;
-  //Height is "height" type ushort offset 10;
-  Size is "size" type size offset 8 as wh as wh;
-  TextureNum is "texture" type ushort offset 12 texture;
-  PanelType is "type" type ushort offset 14 bitset unique PanelType;
-  Alpha is "alpha" type ubyte offset 16 default 0 omitdefault;
-  Flags is "flags" type ubyte offset 17 bitset PanelFlag default PANEL_FLAG_NONE omitdefault;
+"map" size 452 bytes header binblock 7 {
+  "name" type char[32] offset 0 writedefault;
+  "author" type char[32] offset 32 default "";
+  "description" type char[256] offset 64 default "";
+  "music" type char[64] offset 320 default 'Standart.wad:D2DMUS\ПРОСТОТА';
+  "sky" type char[64] offset 384 default 'Standart.wad:D2DSKY\RSKY1';
+  "size" type size offset 448 as wh writedefault;
+}
+
+"texture" size 65 bytes binblock 1 {
+  "path" type char[64] offset 0 writedefault;
+  "animated" type bool offset 64 default false;
+}
+
+"panel" size 18 bytes binblock 2 {
+  "position" type point offset 0 as xy writedefault;
+  "size" type size offset 8 as wh as wh writedefault;
+  "texture" type ushort offset 12 texture writedefault;
+  "type" type ushort offset 14 bitset unique PanelType writedefault;
+  "alpha" type ubyte offset 16 default 0;
+  "flags" type ubyte offset 17 bitset PanelFlag default PANEL_FLAG_NONE;
   // moving platform options, not in binary
-  MoveSpeed is "move_speed" type point default (0 0) omitdefault;
-  SizeSpeed is "size_speed" type point default (0 0) omitdefault; // alas, `size` cannot be negative
-  MoveStart is "move_start" type point default (0 0) omitdefault;
-  MoveEnd is "move_end" type point default (0 0) omitdefault;
-  SizeEnd is "size_end" type size default (0 0) omitdefault;
-  MoveActive is "move_active" type bool default false omitdefault;
-  MoveOnce is "move_once" type bool default false omitdefault;
-  EndPosTrigger is "end_pos_trigger" type int trigger default null omitdefault;
-  EndSizeTrigger is "end_size_trigger" type int trigger default null omitdefault;
-  // not in binary
-  //Id is "id" type string default "" omitdefault;
-  // internals
-  PanIdx is "panidx" type uint internal;
-}
-
-TItemRec_1 is "item" size 10 bytes binblock 3 {
-  //X is "x" type int offset 0;
-  //Y is "y" type int offset 4;
-  Pos is "position" type point offset 0 as xy;
-  ItemType is "type" type ubyte offset 8 enum Item;
-  Options is "options" type ubyte offset 9 bitset ItemOption default ITEM_OPTION_NONE omitdefault;
-  // not in binary
-  //Id is "id" type string default "" omitdefault;
-  // internals
-  ItemIdx is "itemidx" type uint internal;
-}
-
-TMonsterRec_1 is "monster" size 10 bytes binblock 5 {
-  //X is "x" type int offset 0;
-  //Y is "y" type int offset 4;
-  Pos is "position" type point offset 0 as xy;
-  MonsterType is "type" type ubyte offset 8 enum Monster;
-  Direction is "direction" type ubyte offset 9 enum DirType default DIR_LEFT omitdefault;
-  // not in binary
-  //Id is "id" type string default "" omitdefault;
-  // internals
-  MonsIdx is "monsidx" type uint internal;
-}
-
-TAreaRec_1 is "area" size 10 bytes binblock 4 {
-  //X is "x" type int offset 0;
-  //Y is "y" type int offset 4;
-  Pos is "position" type point offset 0 as xy;
-  AreaType is "type" type ubyte offset 8 enum AreaType;
-  Direction is "direction" type ubyte offset 9 enum DirType default DIR_LEFT omitdefault;
-  // not in binary
-  //Id is "id" type string default "" omitdefault;
-  // internals
-  AreaIdx is "areaidx" type uint internal;
-}
-
-TTriggerRec_1 is "trigger" size 148 bytes binblock 6 {
-  //X is "x" type int offset 0;
-  //Y is "y" type int offset 4;
-  Pos is "position" type point offset 0 as xy;
-  //Width is "width" type ushort offset 8;
-  //Height is "height" type ushort offset 10;
-  Size is "size" type size offset 8 as wh;
-  Enabled is "enabled" type bool offset 12 default true omitdefault;
-  TexturePanel is "texturepanel" type int offset 13 panel default null omitdefault;
-  TriggerType is "type" type ubyte offset 17 enum TriggerType;
-  ActivateType is "activatetype" type ubyte offset 18 bitset ActivateType;
-  Keys is "keys" type ubyte offset 19 bitset Key default KEY_NONE omitdefault;
+  "move_speed" type point default (0 0);
+  "size_speed" type point default (0 0); // alas, `size` cannot be negative
+  "move_start" type point default (0 0);
+  "move_end" type point default (0 0);
+  "size_end" type size default (0 0);
+  "move_active" type bool default false;
+  "move_once" type bool default false;
+  "end_pos_trigger" trigger default null;
+  "end_size_trigger" trigger default null;
+}
+
+"item" size 10 bytes binblock 3 {
+  "position" type point offset 0 as xy writedefault;
+  "type" type ubyte offset 8 enum Item writedefault;
+  "options" type ubyte offset 9 bitset ItemOption default ITEM_OPTION_NONE;
+}
+
+"monster" size 10 bytes binblock 5 {
+  "position" type point offset 0 as xy writedefault;
+  "type" type ubyte offset 8 enum Monster writedefault;
+  "direction" type ubyte offset 9 enum DirType default DIR_LEFT;
+}
+
+"area" size 10 bytes binblock 4 {
+  "position" type point offset 0 as xy writedefault;
+  "type" type ubyte offset 8 enum AreaType writedefault;
+  "direction" type ubyte offset 9 enum DirType default DIR_LEFT;
+}
+
+"trigger" size 148 bytes binblock 6 {
+  "position" type point offset 0 as xy writedefault;
+  "size" type size offset 8 as wh writedefault;
+  "enabled" type bool offset 12 default true;
+  "texture_panel" type int offset 13 panel default null;
+  "type" type ubyte offset 17 enum TriggerType writedefault;
+  "activate_type" type ubyte offset 18 bitset ActivateType;
+  "keys" type ubyte offset 19 bitset Key default KEY_NONE;
   //WARNING: "trigdata" MUST be defined before "type", and "type" MUST be named "type" (for now, can be changed later)
-  DATA is "triggerdata" type trigdata[128] offset 20; // the only special nested structure
-  // not in binary
-  //Id is "id" type string default "" omitdefault;
-  // internals
-  TrigIdx is "trigidx" type uint internal;
+  "triggerdata" type trigdata[128] offset 20; // the only special nested structure
 }
 
 
 ////////////////////////////////////////////////////////////////////////////////
-/*
-enum {
-  TEXTURE_NAME_WATER = '_water_0',
-  TEXTURE_NAME_ACID1 = '_water_1',
-  TEXTURE_NAME_ACID2 = '_water_2',
-}
-*/
-
+// special texture identifiers, used to generate pascal sources
 enum TextureSpecial {
   TEXTURE_SPECIAL_WATER = -1,
   TEXTURE_SPECIAL_ACID1 = -2,
@@ -301,6 +253,17 @@ enum Monster {
   MONSTER_BARREL, // 18
   MONSTER_ROBO, // 19
   MONSTER_MAN, // 20
+  // aliases (fixme: it should be `MONSTER_ZOMBIE = MONSTER_ZOMBY`!)
+  MONSTER_ZOMBIE = 3,
+}
+
+enum MonsterBehaviour {
+  BH_NORMAL, // 0
+  BH_KILLER, // 1
+  BH_MANIAC, // 2
+  BH_INSANE, // 3
+  BH_CANNIBAL, // 4
+  BH_GOOD, // 5
 }
 
 enum TriggerShot {
@@ -360,6 +323,32 @@ enum TriggerEffectPos {
   TRIGGER_EFFECT_POS_AREA, // 1
 }
 
+enum TriggerMusicAction {
+  TRIGGER_MUSIC_ACTION_STOP, // 0
+  TRIGGER_MUSIC_ACTION_PLAY, // 1; unpause or restart
+}
+
+enum TriggerScoreAction {
+  TRIGGER_SCORE_ACTION_ADD, // 0
+  TRIGGER_SCORE_ACTION_SUB, // 1
+  TRIGGER_SCORE_ACTION_WIN, // 2
+  TRIGGER_SCORE_ACTION_LOOSE, // 3
+}
+
+enum TriggerMessageDest {
+  TRIGGER_MESSAGE_DEST_ME, // 0
+  TRIGGER_MESSAGE_DEST_MY_TEAM, // 1
+  TRIGGER_MESSAGE_DEST_ENEMY_TEAM, // 2
+  TRIGGER_MESSAGE_DEST_RED_TEAM, // 3
+  TRIGGER_MESSAGE_DEST_BLUE_TEAM, // 4
+  TRIGGER_MESSAGE_DEST_EVERYONE, // 5
+}
+
+enum TriggerMessageKind {
+  TRIGGER_MESSAGE_KIND_CHAT, // 0
+  TRIGGER_MESSAGE_KIND_GAME, // 1
+}
+
 bitset ActivateType {
   ACTIVATE_NONE = 0, // 0
   ACTIVATE_PLAYERCOLLIDE, // 1
@@ -384,144 +373,147 @@ bitset Key {
 ////////////////////////////////////////////////////////////////////////////////
 // various triggers
 TriggerData for TRIGGER_EXIT {
-  MapName is "map" type char[16] offset 0;
+  "map" type char[16] offset 0 writedefault;
 }
 
 TriggerData for TRIGGER_TELEPORT {
-  TargetPoint is "target" type point offset 0;
-  d2d_teleport is "d2d" type bool offset 8 default false omitdefault;
-  silent_teleport is "silent" type bool offset 9 default false omitdefault;
-  TlpDir is "direction" type ubyte offset 10 enum DirType default DIR_LEFT omitdefault;
+  "target" type point offset 0 writedefault;
+  "d2d" type bool offset 8 default false;
+  "silent" type bool offset 9 default false;
+  "direction" type ubyte offset 10 enum DirType default DIR_LEFT;
 }
 
 TriggerData for (TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT) {
-  PanelID is "panelid" type int offset 0 panel;
-  NoSound is "silent" type bool offset 4 default false omitdefault;
-  d2d_doors is "d2d" type bool offset 5 default false omitdefault;
+  "panelid" type int offset 0 panel writedefault;
+  "silent" type bool offset 4 default false;
+  "d2d" type bool offset 5 default false;
 }
 
 TriggerData for (TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF) {
-  //tX is "tx" type int offset 0;
-  //tY is "ty" type int offset 4;
-  Pos is "position" type point offset 0 as txy default (0 0);
-  //tWidth is "width" type ushort offset 8;
-  //tHeight is "height" type ushort offset 10;
-  Size is "size" type size offset 8 as twh default (0 0);
-  Wait is "wait" type ushort offset 12 default 0;
-  Count is "count" type ushort offset 14 default 0;
-  MonsterID is "monsterid" type int offset 16 monster as monsterid default null;
-  ExtRandom is "extrandom" type bool offset 20 default false;
+  "position" type point offset 0 as txy default (0 0) writedefault;
+  "size" type size offset 8 as twh default (0 0);
+  "wait" type ushort offset 12 default 0;
+  "count" alias pressCount type ushort offset 14 default 0;
+  "monsterid" type int offset 16 monster as monsterid default null;
+  "ext_random" type bool offset 20 default false;
   // this one is for moving platforms
-  PanelId is "panelid" type int panel default null omitdefault;
+  "panelid" panel default null;
+}
+
+enum TriggerScoreTeam {
+  TRIGGER_SCORE_TEAM_MINE_RED, // 0
+  TRIGGER_SCORE_TEAM_MINE_BLUE, // 1
+  TRIGGER_SCORE_TEAM_FORCE_RED, // 2
+  TRIGGER_SCORE_TEAM_FORCE_BLUE, // 3
 }
 
 TriggerData for TRIGGER_SECRET {
 }
 
 TriggerData for TRIGGER_TEXTURE {
-  ActivateOnce is "activateonce" type bool offset 0;
-  AnimOnce is "animateonce" type bool offset 1;
+  "activate_once" type bool offset 0 default false writedefault;
+  "animate_once" type bool offset 1 default false writedefault;
 }
 
 TriggerData for TRIGGER_SOUND {
-  SoundName is "soundname" type char[64] offset 0;
-  Volume is "volume" type ubyte offset 64;
-  Pan is "pan" type ubyte offset 65;
-  Local is "local" type bool offset 66;
-  PlayCount is "playcount" type ubyte offset 67;
-  SoundSwitch is "soundswitch" type bool offset 68;
+  "sound_name" type char[64] offset 0 writedefault;
+  "volume" type ubyte offset 64 default 0 writedefault; //??? default ???
+  "pan" type ubyte offset 65 default 0;
+  "local" type bool offset 66 default true; //??? default ???
+  "play_count" type ubyte offset 67 default 1;
+  "sound_switch" type bool offset 68 default false; //??? default ???
 }
 
 TriggerData for TRIGGER_SPAWNMONSTER {
-  MonPos is "position" type point offset 0;
-  MonType is "type" type ubyte offset 8;
-  MonHealth is "health" type int offset 12;
-  MonDir is "direction" type ubyte offset 16 enum DirType;
-  MonActive is "active" type bool offset 17;
-  MonCount is "count" type int offset 20;
-  MonEffect is "effect" type ubyte offset 24;
-  MonMax is "max" type ushort offset 26;
-  MonDelay is "delay" type ushort offset 28;
-  MonBehav is "behaviour" type ubyte offset 30;
+  "position" type point offset 0 as txy writedefault;
+  "type" alias spawnMonsType type ubyte offset 8 enum Monster default MONSTER_IMP writedefault;
+  "health" type int offset 12 writedefault;
+  "direction" type ubyte offset 16 enum DirType default DIR_LEFT writedefault;
+  "active" type bool offset 17 default true;
+  "count" alias monsCount type int offset 20 default 1 writedefault;
+  "effect" type ubyte offset 24 enum EffectAction default EFFECT_NONE writedefault;
+  "max" type ushort offset 26 default 1 writedefault;
+  "delay" type ushort offset 28 default 1000 writedefault;
+  "behaviour" type ubyte offset 30 enum MonsterBehaviour default BH_NORMAL;
 }
 
 TriggerData for TRIGGER_SPAWNITEM {
-  ItemPos is "position" type point offset 0;
-  ItemType is "type" type ubyte offset 8;
-  ItemFalls is "gravity" type bool offset 9;
-  ItemOnlyDM is "dmonly" type bool offset 10;
-  ItemCount is "count" type int offset 12;
-  ItemEffect is "effect" type ubyte offset 16;
-  ItemMax is "max" type ushort offset 18;
-  ItemDelay is "delay" type ushort offset 20;
+  "position" type point offset 0 as txy writedefault;
+  "type" alias spawnItemType type ubyte offset 8 enum Item default ITEM_NONE writedefault;
+  "gravity" type bool offset 9 default true;
+  "dmonly" type bool offset 10 default false;
+  "count" alias itemCount type int offset 12 default 1;
+  "effect" type ubyte offset 16 enum EffectAction default EFFECT_NONE writedefault;
+  "max" type ushort offset 18 default 1;
+  "delay" type ushort offset 20 default 1000 writedefault;
 }
 
 TriggerData for TRIGGER_MUSIC {
-  MusicName is "name" type char[64] offset 0;
-  MusicAction is "action" type ubyte offset 64;
+  "name" alias musicName type char[64] offset 0 writedefault;
+  "action" alias musicAction type ubyte offset 64 enum TriggerMusicAction writedefault;
 }
 
 TriggerData for TRIGGER_PUSH {
-  PushAngle is "angle" type ushort offset 0;
-  PushForce is "force" type ubyte offset 2;
-  ResetVel is "resetvelocity" type bool offset 3;
+  "angle" type ushort offset 0 writedefault;
+  "force" type ubyte offset 2 writedefault;
+  "reset_velocity" type bool offset 3 default false writedefault;
 }
 
 TriggerData for TRIGGER_SCORE {
-  ScoreAction is "action" type ubyte offset 0;
-  ScoreCount is "count" type ubyte offset 1;
-  ScoreTeam is "team" type ubyte offset 2;
-  ScoreCon is "console" type bool offset 3;
-  ScoreMsg is "message" type bool offset 4;
+  "action" alias scoreAction type ubyte offset 0 enum TriggerScoreAction default TRIGGER_SCORE_ACTION_ADD writedefault;
+  "count" alias scoreCount type ubyte offset 1 default 1 writedefault;
+  "team" alias scoreTeam type ubyte offset 2 enum TriggerScoreTeam writedefault;
+  "console" alias scoreCon type bool offset 3 default false writedefault;
+  "message" alias scoreMsg type bool offset 4 default true writedefault;
 }
 
 TriggerData for TRIGGER_MESSAGE {
-  MessageKind is "kind" type ubyte offset 0;
-  MessageSendTo is "sendto" type ubyte offset 1;
-  MessageText is "text" type char[100] offset 2;
-  MessageTime is "time" type ushort offset 102;
+  "kind" type ubyte offset 0 enum TriggerMessageKind default TRIGGER_MESSAGE_KIND_GAME writedefault;
+  "dest" alias msgDest type ubyte enum TriggerMessageDest offset 1;
+  "text" type char[100] offset 2 writedefault;
+  "time" alias msgTime type ushort offset 102 writedefault;
 }
 
 TriggerData for TRIGGER_DAMAGE {
-  DamageValue is "amount" type ushort offset 0;
-  DamageInterval is "interval" type ushort offset 2;
+  "amount" type ushort offset 0 writedefault;
+  "interval" type ushort offset 2 writedefault;
 }
 
 TriggerData for TRIGGER_HEALTH {
-  HealValue is "amount" type ushort offset 0;
-  HealInterval is "interval" type ushort offset 2;
-  HealMax is "max" type bool offset 4;
-  HealSilent is "silent" type bool offset 5;
+  "amount" type ushort offset 0 writedefault;
+  "interval" type ushort offset 2 writedefault;
+  "max" alias healMax type bool offset 4 writedefault;
+  "silent" type bool offset 5 writedefault;
 }
 
 TriggerData for TRIGGER_SHOT {
-  ShotPos is "position" type point offset 0;
-  ShotType is "type" type ubyte offset 8 enum TriggerShot;
-  ShotTarget is "target" type ubyte offset 9 enum TriggerShotTarget;
-  ShotSound is "silent" type negbool offset 10; // negbool!
-  ShotAim is "aim" type byte offset 11;
-  ShotPanelID is "panelid" type int offset 12;
-  ShotIntSight is "sight" type ushort offset 16;
-  ShotAngle is "angle" type ushort offset 18;
-  ShotWait is "wait" type ushort offset 20;
-  ShotAccuracy is "accuracy" type ushort offset 22;
-  ShotAmmo is "ammo" type ushort offset 24;
-  ShotIntReload is "reload" type ushort offset 26;
+  "position" type point offset 0 as txy writedefault;
+  "type" alias shotType type ubyte offset 8 enum TriggerShot writedefault;
+  "target" alias shotTarget type ubyte offset 9 enum TriggerShotTarget writedefault;
+  "quiet" type negbool offset 10; // negbool!
+  "aim" type byte offset 11 enum TriggerShotAim default TRIGGER_SHOT_AIM_DEFAULT;
+  "panelid" type int offset 12 panel default null writedefault;
+  "sight" type ushort offset 16;
+  "angle" type ushort offset 18;
+  "wait" type ushort offset 20;
+  "accuracy" type ushort offset 22;
+  "ammo" type ushort offset 24;
+  "reload" type ushort offset 26;
 }
 
 TriggerData for TRIGGER_EFFECT {
-  FXCount is "count" type ubyte offset 0;
-  FXType is "type" type ubyte offset 1;
-  FXSubType is "subtype" type ubyte offset 2;
-  FXColorR is "colorr" type ubyte offset 3;
-  FXColorG is "colorg" type ubyte offset 4;
-  FXColorB is "colorb" type ubyte offset 5;
-  FXPos is "position" type ubyte offset 6;
-  FXWait is "wait" type ushort offset 8;
-  FXVelX is "velx" type byte offset 10;
-  FXVelY is "vely" type byte offset 11;
-  FXSpreadL is "spreadl" type ubyte offset 12;
-  FXSpreadR is "spreadr" type ubyte offset 13;
-  FXSpreadU is "spreadu" type ubyte offset 14;
-  FXSpreadD is "spreadd" type ubyte offset 15;
+  "count" alias FXCount type ubyte offset 0 writedefault;
+  "type" alias FXType type ubyte offset 1 enum TriggerEffect default TRIGGER_EFFECT_PARTICLE writedefault;
+  "subtype" alias FXSubType type ubyte offset 2 enum TriggerEffectType default TRIGGER_EFFECT_SPARK writedefault;
+  "red" alias FXRed type ubyte offset 3 writedefault;
+  "green" alias FXGreen type ubyte offset 4 writedefault;
+  "blue" alias FXBlue type ubyte offset 5 writedefault;
+  "pos" alias FXPos type ubyte offset 6 enum TriggerEffectPos default TRIGGER_EFFECT_POS_CENTER writedefault;
+  "wait" type ushort offset 8 writedefault;
+  "vel_x" type byte offset 10 writedefault;
+  "vel_y" type byte offset 11 writedefault;
+  "spread_l" type ubyte offset 12 writedefault;
+  "spread_r" type ubyte offset 13 writedefault;
+  "spread_u" type ubyte offset 14 writedefault;
+  "spread_d" type ubyte offset 15 writedefault;
 }
index 2e7ec96e8310ed7c6aa719e8729e5828068246ea..4f4a3cdd0859e2d07c7c9bef845684be16b5cd8f 100644 (file)
@@ -371,11 +371,11 @@ function TDynRecordHelper.Direction (): Byte; inline; begin result := Byte(getFi
 function TDynRecordHelper.AreaType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.Enabled (): Boolean; inline; begin result := (getFieldWithType('enabled', TDynField.TType.TBool).ival <> 0); end;
 function TDynRecordHelper.TriggerType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.ActivateType (): Byte; inline; begin result := Byte(getFieldWithType('activatetype', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.ActivateType (): Byte; inline; begin result := Byte(getFieldWithType('activate_type', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.Keys (): Byte; inline; begin result := Byte(getFieldWithType('keys', TDynField.TType.TUByte).ival); end;
 
 function TDynRecordHelper.getPanelId (): Integer; inline; begin result := getFieldWithType('panelid', TDynField.TType.TInt).recrefIndex; end;
-function TDynRecordHelper.getTexturePanel (): Integer; begin result := getFieldWithType('texturepanel', TDynField.TType.TInt).recrefIndex; end;
+function TDynRecordHelper.getTexturePanel (): Integer; begin result := getFieldWithType('texture_panel', TDynField.TType.TInt).recrefIndex; end;
 
 {$INCLUDE mapdef_impl.inc}
 
index ea71555c68ff7a6d4c4fa2db980990e96f41d8e0..8aaa522a45bae64530243a8fa031f42b4b035b4f 100644 (file)
@@ -161,9 +161,11 @@ type
 type
   THashIntInt = specialize THashBase<Integer, Integer>;
   THashStrInt = specialize THashBase<AnsiString, Integer>;
+  THashStrStr = specialize THashBase<AnsiString, AnsiString>;
 
 function hashNewIntInt (): THashIntInt;
 function hashNewStrInt (): THashStrInt;
+function hashNewStrStr (): THashStrStr;
 
 
 function u32Hash (a: LongWord): LongWord; inline;
@@ -176,6 +178,8 @@ function nextPOT (x: LongWord): LongWord; inline;
 // for integer keys
 function hiiequ (constref a, b: Integer): Boolean;
 function hiihash (constref k: Integer): LongWord;
+function hsiequ (constref a, b: AnsiString): Boolean;
+function hsihash (constref k: AnsiString): LongWord;
 
 
 implementation
@@ -238,6 +242,12 @@ begin
 end;
 
 
+function hashNewStrStr (): THashStrStr;
+begin
+  result := THashStrStr.Create(hsihash, hsiequ);
+end;
+
+
 // ////////////////////////////////////////////////////////////////////////// //
 {$PUSH}
 {$RANGECHECKS OFF}
index c4ab9848657502190c5eb86bd968c83c52efcde6..3000a298ea22a5ea1b73d2283e0583434a7d6dfa 100644 (file)
@@ -168,6 +168,16 @@ const
   MONSTER_BARREL = 18;
   MONSTER_ROBO = 19;
   MONSTER_MAN = 20;
+  MONSTER_ZOMBIE = 3;
+
+// MonsterBehaviour
+const
+  BH_NORMAL = 0;
+  BH_KILLER = 1;
+  BH_MANIAC = 2;
+  BH_INSANE = 3;
+  BH_CANNIBAL = 4;
+  BH_GOOD = 5;
 
 // TriggerShot
 const
@@ -225,6 +235,32 @@ const
   TRIGGER_EFFECT_POS_CENTER = 0;
   TRIGGER_EFFECT_POS_AREA = 1;
 
+// TriggerMusicAction
+const
+  TRIGGER_MUSIC_ACTION_STOP = 0;
+  TRIGGER_MUSIC_ACTION_PLAY = 1;
+
+// TriggerScoreAction
+const
+  TRIGGER_SCORE_ACTION_ADD = 0;
+  TRIGGER_SCORE_ACTION_SUB = 1;
+  TRIGGER_SCORE_ACTION_WIN = 2;
+  TRIGGER_SCORE_ACTION_LOOSE = 3;
+
+// TriggerMessageDest
+const
+  TRIGGER_MESSAGE_DEST_ME = 0;
+  TRIGGER_MESSAGE_DEST_MY_TEAM = 1;
+  TRIGGER_MESSAGE_DEST_ENEMY_TEAM = 2;
+  TRIGGER_MESSAGE_DEST_RED_TEAM = 3;
+  TRIGGER_MESSAGE_DEST_BLUE_TEAM = 4;
+  TRIGGER_MESSAGE_DEST_EVERYONE = 5;
+
+// TriggerMessageKind
+const
+  TRIGGER_MESSAGE_KIND_CHAT = 0;
+  TRIGGER_MESSAGE_KIND_GAME = 1;
+
 // ActivateType
 const
   ACTIVATE_NONE = 0;
@@ -245,6 +281,13 @@ const
   KEY_REDTEAM = 8;
   KEY_BLUETEAM = 16;
 
+// TriggerScoreTeam
+const
+  TRIGGER_SCORE_TEAM_MINE_RED = 0;
+  TRIGGER_SCORE_TEAM_MINE_BLUE = 1;
+  TRIGGER_SCORE_TEAM_FORCE_RED = 2;
+  TRIGGER_SCORE_TEAM_FORCE_BLUE = 3;
+
 
 const defaultMapDef: AnsiString = ''+
   #47#47#32#121#101#115#44#32#116#104#105#115#32#102#105#108#101#32#115#101+
@@ -263,13 +306,13 @@ const defaultMapDef: AnsiString = ''+
   #101#115#58#10#47#47#32#32#32#102#105#101#108#100#32#119#105#116#104#111#117+
   #116#32#111#102#102#115#101#116#32#105#115#32#110#111#116#32#105#110#32#98+
   #105#110#97#114#121#32#102#111#114#109#97#116#10#47#47#32#32#32#102#105#101+
-  #108#100#115#32#119#105#116#104#32#96#111#109#105#116#100#101#102#97#117#108+
-  #116#96#32#119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110#32+
-  #119#104#101#110#32#116#104#101#121#32#99#111#110#116#97#105#110#32#100#101+
-  #102#97#117#108#116#32#118#97#108#117#101#115#10#47#47#32#32#32#102#105#101+
-  #108#100#115#32#119#105#116#104#32#96#105#110#116#101#114#110#97#108#96#32+
-  #119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110#32#116#111#32+
-  #97#110#121#32#102#105#108#101#32#101#118#101#114#32#40#97#110#100#32#119+
+  #108#100#115#32#119#105#116#104#32#96#119#114#105#116#101#100#101#102#97#117+
+  #108#116#96#32#119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110+
+  #32#119#104#101#110#32#116#104#101#121#32#99#111#110#116#97#105#110#32#100+
+  #101#102#97#117#108#116#32#118#97#108#117#101#115#10#47#47#32#32#32#102#105+
+  #101#108#100#115#32#119#105#116#104#32#96#105#110#116#101#114#110#97#108#96+
+  #32#119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110#32#116#111+
+  #32#97#110#121#32#102#105#108#101#32#101#118#101#114#32#40#97#110#100#32#119+
   #111#110#39#116#32#98#101#32#114#101#97#100#41#10#47#47#32#32#32#96#117#98+
   #121#116#101#96#32#105#115#32#117#110#115#105#103#110#101#100#32#98#121#116+
   #101#44#32#97#110#100#32#96#98#121#116#101#96#32#105#115#32#115#105#103#110+
@@ -300,711 +343,689 @@ const defaultMapDef: AnsiString = ''+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47#32#109#97#105#110+
-  #32#98#108#111#99#107#115#10#84#77#97#112#72#101#97#100#101#114#82#101#99#95+
-  #49#32#105#115#32#34#109#97#112#34#32#115#105#122#101#32#52#53#50#32#98#121+
-  #116#101#115#32#104#101#97#100#101#114#32#98#105#110#98#108#111#99#107#32#55+
-  #32#123#10#32#32#47#47#95#32#105#115#32#34#118#101#114#115#105#111#110#34#32+
-  #116#121#112#101#32#117#105#110#116#32#109#105#110#118#97#108#117#101#32#49+
-  #32#109#97#120#118#97#108#117#101#32#49#59#10#32#32#77#97#112#78#97#109#101+
-  #32#105#115#32#34#110#97#109#101#34#32#116#121#112#101#32#99#104#97#114#91+
-  #51#50#93#32#111#102#102#115#101#116#32#48#59#10#32#32#77#97#112#65#117#116+
-  #104#111#114#32#105#115#32#34#97#117#116#104#111#114#34#32#116#121#112#101+
-  #32#99#104#97#114#91#51#50#93#32#111#102#102#115#101#116#32#51#50#32#100#101+
-  #102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116+
-  #59#10#32#32#77#97#112#68#101#115#99#114#105#112#116#105#111#110#32#105#115+
-  #32#34#100#101#115#99#114#105#112#116#105#111#110#34#32#116#121#112#101#32+
-  #99#104#97#114#91#50#53#54#93#32#111#102#102#115#101#116#32#54#52#32#100#101+
-  #102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116+
-  #59#10#32#32#77#117#115#105#99#78#97#109#101#32#105#115#32#34#109#117#115+
-  #105#99#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93#32#111#102#102+
-  #115#101#116#32#51#50#48#32#100#101#102#97#117#108#116#32#39#83#116#97#110+
-  #100#97#114#116#46#119#97#100#58#68#50#68#77#85#83#92#208#159#208#160#208+
-  #158#208#161#208#162#208#158#208#162#208#144#39#32#111#109#105#116#100#101+
-  #102#97#117#108#116#59#10#32#32#83#107#121#78#97#109#101#32#105#115#32#34+
-  #115#107#121#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93#32#111#102+
-  #102#115#101#116#32#51#56#52#32#100#101#102#97#117#108#116#32#39#83#116#97+
-  #110#100#97#114#116#46#119#97#100#58#68#50#68#83#75#89#92#82#83#75#89#49#39+
-  #32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#87#105#100+
-  #116#104#32#105#115#32#34#119#105#100#116#104#34#32#116#121#112#101#32#117+
-  #115#104#111#114#116#32#111#102#102#115#101#116#32#52#52#56#59#10#32#32#47+
-  #47#72#101#105#103#104#116#32#105#115#32#34#104#101#105#103#104#116#34#32+
-  #116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#52+
-  #53#48#59#10#32#32#83#105#122#101#32#105#115#32#34#115#105#122#101#34#32#116+
-  #121#112#101#32#115#105#122#101#32#111#102#102#115#101#116#32#52#52#56#32#97+
-  #115#32#119#104#59#10#32#32#47#47#32#110#111#116#32#105#110#32#98#105#110#97+
-  #114#121#10#32#32#84#105#116#108#101#32#105#115#32#34#116#105#116#108#101#34+
-  #32#116#121#112#101#32#115#116#114#105#110#103#32#100#101#102#97#117#108#116+
-  #32#34#34#32#32#111#109#105#116#100#101#102#97#117#108#116#59#10#125#10#10+
-  #84#84#101#120#116#117#114#101#82#101#99#95#49#32#105#115#32#34#116#101#120+
+  #32#98#108#111#99#107#115#10#34#109#97#112#34#32#115#105#122#101#32#52#53#50+
+  #32#98#121#116#101#115#32#104#101#97#100#101#114#32#98#105#110#98#108#111#99+
+  #107#32#55#32#123#10#32#32#34#110#97#109#101#34#32#116#121#112#101#32#99#104+
+  #97#114#91#51#50#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101+
+  #100#101#102#97#117#108#116#59#10#32#32#34#97#117#116#104#111#114#34#32#116+
+  #121#112#101#32#99#104#97#114#91#51#50#93#32#111#102#102#115#101#116#32#51+
+  #50#32#100#101#102#97#117#108#116#32#34#34#59#10#32#32#34#100#101#115#99#114+
+  #105#112#116#105#111#110#34#32#116#121#112#101#32#99#104#97#114#91#50#53#54+
+  #93#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97#117#108#116#32#34+
+  #34#59#10#32#32#34#109#117#115#105#99#34#32#116#121#112#101#32#99#104#97#114+
+  #91#54#52#93#32#111#102#102#115#101#116#32#51#50#48#32#100#101#102#97#117+
+  #108#116#32#39#83#116#97#110#100#97#114#116#46#119#97#100#58#68#50#68#77#85+
+  #83#92#208#159#208#160#208#158#208#161#208#162#208#158#208#162#208#144#39#59+
+  #10#32#32#34#115#107#121#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93+
+  #32#111#102#102#115#101#116#32#51#56#52#32#100#101#102#97#117#108#116#32#39+
+  #83#116#97#110#100#97#114#116#46#119#97#100#58#68#50#68#83#75#89#92#82#83#75+
+  #89#49#39#59#10#32#32#34#115#105#122#101#34#32#116#121#112#101#32#115#105+
+  #122#101#32#111#102#102#115#101#116#32#52#52#56#32#97#115#32#119#104#32#119+
+  #114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#34#116#101#120+
   #116#117#114#101#34#32#115#105#122#101#32#54#53#32#98#121#116#101#115#32#98+
-  #105#110#98#108#111#99#107#32#49#32#123#10#32#32#82#101#115#111#117#114#99+
-  #101#32#105#115#32#34#112#97#116#104#34#32#116#121#112#101#32#99#104#97#114+
-  #91#54#52#93#32#111#102#102#115#101#116#32#48#59#10#32#32#65#110#105#109#32+
-  #105#115#32#34#97#110#105#109#97#116#101#100#34#32#116#121#112#101#32#98#111+
-  #111#108#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97#117#108#116+
-  #32#102#97#108#115#101#32#111#109#105#116#100#101#102#97#117#108#116#59#10+
-  #32#32#47#47#32#105#110#116#101#114#110#97#108#115#10#32#32#84#101#120#73+
-  #100#120#32#105#115#32#34#116#101#120#105#100#120#34#32#116#121#112#101#32+
-  #117#105#110#116#32#105#110#116#101#114#110#97#108#59#10#125#10#10#84#80#97+
-  #110#101#108#82#101#99#95#49#32#105#115#32#34#112#97#110#101#108#34#32#115+
-  #105#122#101#32#49#56#32#98#121#116#101#115#32#98#105#110#98#108#111#99#107+
-  #32#50#32#123#10#32#32#47#47#88#32#105#115#32#34#120#34#32#116#121#112#101+
-  #32#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32#32#47#47#89#32#105+
-  #115#32#34#121#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101+
-  #116#32#52#59#10#32#32#80#111#115#32#105#115#32#34#112#111#115#105#116#105+
-  #111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115#101+
-  #116#32#48#32#97#115#32#120#121#59#10#32#32#47#47#87#105#100#116#104#32#105+
-  #115#32#34#119#105#100#116#104#34#32#116#121#112#101#32#117#115#104#111#114+
-  #116#32#111#102#102#115#101#116#32#56#59#10#32#32#47#47#72#101#105#103#104+
-  #116#32#105#115#32#34#104#101#105#103#104#116#34#32#116#121#112#101#32#117+
-  #115#104#111#114#116#32#111#102#102#115#101#116#32#49#48#59#10#32#32#83#105+
-  #122#101#32#105#115#32#34#115#105#122#101#34#32#116#121#112#101#32#115#105+
-  #122#101#32#111#102#102#115#101#116#32#56#32#97#115#32#119#104#32#97#115#32+
-  #119#104#59#10#32#32#84#101#120#116#117#114#101#78#117#109#32#105#115#32#34+
-  #116#101#120#116#117#114#101#34#32#116#121#112#101#32#117#115#104#111#114+
-  #116#32#111#102#102#115#101#116#32#49#50#32#116#101#120#116#117#114#101#59+
-  #10#32#32#80#97#110#101#108#84#121#112#101#32#105#115#32#34#116#121#112#101+
-  #34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116+
-  #32#49#52#32#98#105#116#115#101#116#32#117#110#105#113#117#101#32#80#97#110+
-  #101#108#84#121#112#101#59#10#32#32#65#108#112#104#97#32#105#115#32#34#97+
-  #108#112#104#97#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#49#54#32#100#101#102#97#117#108#116#32#48#32#111#109#105#116+
-  #100#101#102#97#117#108#116#59#10#32#32#70#108#97#103#115#32#105#115#32#34+
-  #102#108#97#103#115#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
-  #102#115#101#116#32#49#55#32#98#105#116#115#101#116#32#80#97#110#101#108#70+
-  #108#97#103#32#100#101#102#97#117#108#116#32#80#65#78#69#76#95#70#76#65#71+
-  #95#78#79#78#69#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47+
-  #47#32#109#111#118#105#110#103#32#112#108#97#116#102#111#114#109#32#111#112+
-  #116#105#111#110#115#44#32#110#111#116#32#105#110#32#98#105#110#97#114#121+
-  #10#32#32#77#111#118#101#83#112#101#101#100#32#105#115#32#34#109#111#118#101+
-  #95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105#110#116#32#100+
-  #101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102#97+
-  #117#108#116#59#10#32#32#83#105#122#101#83#112#101#101#100#32#105#115#32#34+
-  #115#105#122#101#95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105+
-  #110#116#32#100#101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116+
-  #100#101#102#97#117#108#116#59#32#47#47#32#97#108#97#115#44#32#96#115#105+
-  #122#101#96#32#99#97#110#110#111#116#32#98#101#32#110#101#103#97#116#105#118+
-  #101#10#32#32#77#111#118#101#83#116#97#114#116#32#105#115#32#34#109#111#118+
-  #101#95#115#116#97#114#116#34#32#116#121#112#101#32#112#111#105#110#116#32+
-  #100#101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102+
-  #97#117#108#116#59#10#32#32#77#111#118#101#69#110#100#32#105#115#32#34#109+
-  #111#118#101#95#101#110#100#34#32#116#121#112#101#32#112#111#105#110#116#32+
-  #100#101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102+
-  #97#117#108#116#59#10#32#32#83#105#122#101#69#110#100#32#105#115#32#34#115+
-  #105#122#101#95#101#110#100#34#32#116#121#112#101#32#115#105#122#101#32#100+
-  #101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102#97+
-  #117#108#116#59#10#32#32#77#111#118#101#65#99#116#105#118#101#32#105#115#32+
-  #34#109#111#118#101#95#97#99#116#105#118#101#34#32#116#121#112#101#32#98#111+
-  #111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101#32#111#109#105+
-  #116#100#101#102#97#117#108#116#59#10#32#32#77#111#118#101#79#110#99#101#32+
-  #105#115#32#34#109#111#118#101#95#111#110#99#101#34#32#116#121#112#101#32#98+
-  #111#111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101#32#111#109+
-  #105#116#100#101#102#97#117#108#116#59#10#32#32#69#110#100#80#111#115#84#114+
-  #105#103#103#101#114#32#105#115#32#34#101#110#100#95#112#111#115#95#116#114+
-  #105#103#103#101#114#34#32#116#121#112#101#32#105#110#116#32#116#114#105#103+
-  #103#101#114#32#100#101#102#97#117#108#116#32#110#117#108#108#32#111#109#105+
-  #116#100#101#102#97#117#108#116#59#10#32#32#69#110#100#83#105#122#101#84#114+
-  #105#103#103#101#114#32#105#115#32#34#101#110#100#95#115#105#122#101#95#116+
-  #114#105#103#103#101#114#34#32#116#121#112#101#32#105#110#116#32#116#114#105+
-  #103#103#101#114#32#100#101#102#97#117#108#116#32#110#117#108#108#32#111#109+
-  #105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#32#110#111#116#32#105+
-  #110#32#98#105#110#97#114#121#10#32#32#47#47#73#100#32#105#115#32#34#105#100+
-  #34#32#116#121#112#101#32#115#116#114#105#110#103#32#100#101#102#97#117#108+
-  #116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47+
-  #47#32#105#110#116#101#114#110#97#108#115#10#32#32#80#97#110#73#100#120#32+
-  #105#115#32#34#112#97#110#105#100#120#34#32#116#121#112#101#32#117#105#110+
-  #116#32#105#110#116#101#114#110#97#108#59#10#125#10#10#84#73#116#101#109#82+
-  #101#99#95#49#32#105#115#32#34#105#116#101#109#34#32#115#105#122#101#32#49+
-  #48#32#98#121#116#101#115#32#98#105#110#98#108#111#99#107#32#51#32#123#10#32+
-  #32#47#47#88#32#105#115#32#34#120#34#32#116#121#112#101#32#105#110#116#32+
-  #111#102#102#115#101#116#32#48#59#10#32#32#47#47#89#32#105#115#32#34#121#34+
-  #32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#52#59#10#32+
-  #32#80#111#115#32#105#115#32#34#112#111#115#105#116#105#111#110#34#32#116+
-  #121#112#101#32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97+
-  #115#32#120#121#59#10#32#32#73#116#101#109#84#121#112#101#32#105#115#32#34+
-  #116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#56#32#101#110#117#109#32#73#116#101#109#59#10#32#32#79#112+
-  #116#105#111#110#115#32#105#115#32#34#111#112#116#105#111#110#115#34#32#116+
-  #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#57#32#98+
-  #105#116#115#101#116#32#73#116#101#109#79#112#116#105#111#110#32#100#101#102+
-  #97#117#108#116#32#73#84#69#77#95#79#80#84#73#79#78#95#78#79#78#69#32#111+
-  #109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#32#110#111#116#32+
-  #105#110#32#98#105#110#97#114#121#10#32#32#47#47#73#100#32#105#115#32#34#105+
-  #100#34#32#116#121#112#101#32#115#116#114#105#110#103#32#100#101#102#97#117+
-  #108#116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32+
-  #47#47#32#105#110#116#101#114#110#97#108#115#10#32#32#73#116#101#109#73#100+
-  #120#32#105#115#32#34#105#116#101#109#105#100#120#34#32#116#121#112#101#32+
-  #117#105#110#116#32#105#110#116#101#114#110#97#108#59#10#125#10#10#84#77#111+
-  #110#115#116#101#114#82#101#99#95#49#32#105#115#32#34#109#111#110#115#116+
-  #101#114#34#32#115#105#122#101#32#49#48#32#98#121#116#101#115#32#98#105#110+
-  #98#108#111#99#107#32#53#32#123#10#32#32#47#47#88#32#105#115#32#34#120#34#32+
-  #116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32#32+
-  #47#47#89#32#105#115#32#34#121#34#32#116#121#112#101#32#105#110#116#32#111+
-  #102#102#115#101#116#32#52#59#10#32#32#80#111#115#32#105#115#32#34#112#111+
-  #115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111+
-  #102#102#115#101#116#32#48#32#97#115#32#120#121#59#10#32#32#77#111#110#115+
-  #116#101#114#84#121#112#101#32#105#115#32#34#116#121#112#101#34#32#116#121+
-  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110+
-  #117#109#32#77#111#110#115#116#101#114#59#10#32#32#68#105#114#101#99#116#105+
-  #111#110#32#105#115#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121+
+  #105#110#98#108#111#99#107#32#49#32#123#10#32#32#34#112#97#116#104#34#32#116+
+  #121#112#101#32#99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48+
+  #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#97#110#105+
+  #109#97#116#101#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102+
+  #115#101#116#32#54#52#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59+
+  #10#125#10#10#34#112#97#110#101#108#34#32#115#105#122#101#32#49#56#32#98#121+
+  #116#101#115#32#98#105#110#98#108#111#99#107#32#50#32#123#10#32#32#34#112+
+  #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+
+  #111#102#102#115#101#116#32#48#32#97#115#32#120#121#32#119#114#105#116#101+
+  #100#101#102#97#117#108#116#59#10#32#32#34#115#105#122#101#34#32#116#121#112+
+  #101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32#119+
+  #104#32#97#115#32#119#104#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#32#32#34#116#101#120#116#117#114#101#34#32#116#121#112#101#32#117#115+
+  #104#111#114#116#32#111#102#102#115#101#116#32#49#50#32#116#101#120#116#117+
+  #114#101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34+
+  #116#121#112#101#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
+  #102#115#101#116#32#49#52#32#98#105#116#115#101#116#32#117#110#105#113#117+
+  #101#32#80#97#110#101#108#84#121#112#101#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#97#108#112#104#97#34#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#32#100#101#102#97+
+  #117#108#116#32#48#59#10#32#32#34#102#108#97#103#115#34#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#55#32#98#105#116#115+
+  #101#116#32#80#97#110#101#108#70#108#97#103#32#100#101#102#97#117#108#116#32+
+  #80#65#78#69#76#95#70#76#65#71#95#78#79#78#69#59#10#32#32#47#47#32#109#111+
+  #118#105#110#103#32#112#108#97#116#102#111#114#109#32#111#112#116#105#111+
+  #110#115#44#32#110#111#116#32#105#110#32#98#105#110#97#114#121#10#32#32#34+
+  #109#111#118#101#95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105+
+  #110#116#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#34#115+
+  #105#122#101#95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105#110+
+  #116#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#32#47#47#32#97#108+
+  #97#115#44#32#96#115#105#122#101#96#32#99#97#110#110#111#116#32#98#101#32+
+  #110#101#103#97#116#105#118#101#10#32#32#34#109#111#118#101#95#115#116#97+
+  #114#116#34#32#116#121#112#101#32#112#111#105#110#116#32#100#101#102#97#117+
+  #108#116#32#40#48#32#48#41#59#10#32#32#34#109#111#118#101#95#101#110#100#34+
+  #32#116#121#112#101#32#112#111#105#110#116#32#100#101#102#97#117#108#116#32+
+  #40#48#32#48#41#59#10#32#32#34#115#105#122#101#95#101#110#100#34#32#116#121+
+  #112#101#32#115#105#122#101#32#100#101#102#97#117#108#116#32#40#48#32#48#41+
+  #59#10#32#32#34#109#111#118#101#95#97#99#116#105#118#101#34#32#116#121#112+
+  #101#32#98#111#111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101+
+  #59#10#32#32#34#109#111#118#101#95#111#110#99#101#34#32#116#121#112#101#32+
+  #98#111#111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32+
+  #32#34#101#110#100#95#112#111#115#95#116#114#105#103#103#101#114#34#32#116+
+  #114#105#103#103#101#114#32#100#101#102#97#117#108#116#32#110#117#108#108#59+
+  #10#32#32#34#101#110#100#95#115#105#122#101#95#116#114#105#103#103#101#114+
+  #34#32#116#114#105#103#103#101#114#32#100#101#102#97#117#108#116#32#110#117+
+  #108#108#59#10#125#10#10#34#105#116#101#109#34#32#115#105#122#101#32#49#48+
+  #32#98#121#116#101#115#32#98#105#110#98#108#111#99#107#32#51#32#123#10#32#32+
+  #34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110+
+  #116#32#111#102#102#115#101#116#32#48#32#97#115#32#120#121#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#116+
+  #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101+
+  #110#117#109#32#73#116#101#109#32#119#114#105#116#101#100#101#102#97#117#108+
+  #116#59#10#32#32#34#111#112#116#105#111#110#115#34#32#116#121#112#101#32#117+
+  #98#121#116#101#32#111#102#102#115#101#116#32#57#32#98#105#116#115#101#116+
+  #32#73#116#101#109#79#112#116#105#111#110#32#100#101#102#97#117#108#116#32+
+  #73#84#69#77#95#79#80#84#73#79#78#95#78#79#78#69#59#10#125#10#10#34#109#111+
+  #110#115#116#101#114#34#32#115#105#122#101#32#49#48#32#98#121#116#101#115#32+
+  #98#105#110#98#108#111#99#107#32#53#32#123#10#32#32#34#112#111#115#105#116+
+  #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+
+  #101#116#32#48#32#97#115#32#120#121#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#116#121#112#101#34#32#116#121#112#101#32#117#98+
+  #121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109#32#77#111+
+  #110#115#116#101#114#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101#32#117#98+
+  #121#116#101#32#111#102#102#115#101#116#32#57#32#101#110#117#109#32#68#105+
+  #114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73#82#95#76#69#70#84+
+  #59#10#125#10#10#34#97#114#101#97#34#32#115#105#122#101#32#49#48#32#98#121+
+  #116#101#115#32#98#105#110#98#108#111#99#107#32#52#32#123#10#32#32#34#112+
+  #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+
+  #111#102#102#115#101#116#32#48#32#97#115#32#120#121#32#119#114#105#116#101+
+  #100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#116#121#112+
+  #101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117+
+  #109#32#65#114#101#97#84#121#112#101#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121+
   #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#57#32#101#110+
   #117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73+
-  #82#95#76#69#70#84#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32+
-  #47#47#32#110#111#116#32#105#110#32#98#105#110#97#114#121#10#32#32#47#47#73+
-  #100#32#105#115#32#34#105#100#34#32#116#121#112#101#32#115#116#114#105#110+
-  #103#32#100#101#102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102+
-  #97#117#108#116#59#10#32#32#47#47#32#105#110#116#101#114#110#97#108#115#10+
-  #32#32#77#111#110#115#73#100#120#32#105#115#32#34#109#111#110#115#105#100+
-  #120#34#32#116#121#112#101#32#117#105#110#116#32#105#110#116#101#114#110#97+
-  #108#59#10#125#10#10#84#65#114#101#97#82#101#99#95#49#32#105#115#32#34#97+
-  #114#101#97#34#32#115#105#122#101#32#49#48#32#98#121#116#101#115#32#98#105+
-  #110#98#108#111#99#107#32#52#32#123#10#32#32#47#47#88#32#105#115#32#34#120+
-  #34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#59#10+
-  #32#32#47#47#89#32#105#115#32#34#121#34#32#116#121#112#101#32#105#110#116#32+
-  #111#102#102#115#101#116#32#52#59#10#32#32#80#111#115#32#105#115#32#34#112+
-  #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+
-  #111#102#102#115#101#116#32#48#32#97#115#32#120#121#59#10#32#32#65#114#101+
-  #97#84#121#112#101#32#105#115#32#34#116#121#112#101#34#32#116#121#112#101#32+
-  #117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109#32+
-  #65#114#101#97#84#121#112#101#59#10#32#32#68#105#114#101#99#116#105#111#110+
-  #32#105#115#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101+
-  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#57#32#101#110#117#109+
-  #32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73#82#95+
-  #76#69#70#84#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47+
-  #32#110#111#116#32#105#110#32#98#105#110#97#114#121#10#32#32#47#47#73#100#32+
-  #105#115#32#34#105#100#34#32#116#121#112#101#32#115#116#114#105#110#103#32+
-  #100#101#102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102#97#117+
-  #108#116#59#10#32#32#47#47#32#105#110#116#101#114#110#97#108#115#10#32#32#65+
-  #114#101#97#73#100#120#32#105#115#32#34#97#114#101#97#105#100#120#34#32#116+
-  #121#112#101#32#117#105#110#116#32#105#110#116#101#114#110#97#108#59#10#125+
-  #10#10#84#84#114#105#103#103#101#114#82#101#99#95#49#32#105#115#32#34#116+
-  #114#105#103#103#101#114#34#32#115#105#122#101#32#49#52#56#32#98#121#116#101+
-  #115#32#98#105#110#98#108#111#99#107#32#54#32#123#10#32#32#47#47#88#32#105+
-  #115#32#34#120#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101+
-  #116#32#48#59#10#32#32#47#47#89#32#105#115#32#34#121#34#32#116#121#112#101+
-  #32#105#110#116#32#111#102#102#115#101#116#32#52#59#10#32#32#80#111#115#32+
-  #105#115#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112+
-  #111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#120#121#59#10+
-  #32#32#47#47#87#105#100#116#104#32#105#115#32#34#119#105#100#116#104#34#32+
-  #116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#56+
-  #59#10#32#32#47#47#72#101#105#103#104#116#32#105#115#32#34#104#101#105#103+
-  #104#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
-  #101#116#32#49#48#59#10#32#32#83#105#122#101#32#105#115#32#34#115#105#122+
-  #101#34#32#116#121#112#101#32#115#105#122#101#32#111#102#102#115#101#116#32+
-  #56#32#97#115#32#119#104#59#10#32#32#69#110#97#98#108#101#100#32#105#115#32+
-  #34#101#110#97#98#108#101#100#34#32#116#121#112#101#32#98#111#111#108#32#111+
-  #102#102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#116#114#117+
-  #101#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#84#101#120+
-  #116#117#114#101#80#97#110#101#108#32#105#115#32#34#116#101#120#116#117#114+
-  #101#112#97#110#101#108#34#32#116#121#112#101#32#105#110#116#32#111#102#102+
-  #115#101#116#32#49#51#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32+
-  #110#117#108#108#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32+
-  #84#114#105#103#103#101#114#84#121#112#101#32#105#115#32#34#116#121#112#101+
-  #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
-  #49#55#32#101#110#117#109#32#84#114#105#103#103#101#114#84#121#112#101#59#10+
-  #32#32#65#99#116#105#118#97#116#101#84#121#112#101#32#105#115#32#34#97#99+
-  #116#105#118#97#116#101#116#121#112#101#34#32#116#121#112#101#32#117#98#121+
-  #116#101#32#111#102#102#115#101#116#32#49#56#32#98#105#116#115#101#116#32#65+
-  #99#116#105#118#97#116#101#84#121#112#101#59#10#32#32#75#101#121#115#32#105+
-  #115#32#34#107#101#121#115#34#32#116#121#112#101#32#117#98#121#116#101#32+
-  #111#102#102#115#101#116#32#49#57#32#98#105#116#115#101#116#32#75#101#121#32+
-  #100#101#102#97#117#108#116#32#75#69#89#95#78#79#78#69#32#111#109#105#116+
-  #100#101#102#97#117#108#116#59#10#32#32#47#47#87#65#82#78#73#78#71#58#32#34+
-  #116#114#105#103#100#97#116#97#34#32#77#85#83#84#32#98#101#32#100#101#102+
-  #105#110#101#100#32#98#101#102#111#114#101#32#34#116#121#112#101#34#44#32#97+
-  #110#100#32#34#116#121#112#101#34#32#77#85#83#84#32#98#101#32#110#97#109#101+
-  #100#32#34#116#121#112#101#34#32#40#102#111#114#32#110#111#119#44#32#99#97+
-  #110#32#98#101#32#99#104#97#110#103#101#100#32#108#97#116#101#114#41#10#32+
-  #32#68#65#84#65#32#105#115#32#34#116#114#105#103#103#101#114#100#97#116#97+
-  #34#32#116#121#112#101#32#116#114#105#103#100#97#116#97#91#49#50#56#93#32+
-  #111#102#102#115#101#116#32#50#48#59#32#47#47#32#116#104#101#32#111#110#108+
-  #121#32#115#112#101#99#105#97#108#32#110#101#115#116#101#100#32#115#116#114+
-  #117#99#116#117#114#101#10#32#32#47#47#32#110#111#116#32#105#110#32#98#105+
-  #110#97#114#121#10#32#32#47#47#73#100#32#105#115#32#34#105#100#34#32#116#121+
-  #112#101#32#115#116#114#105#110#103#32#100#101#102#97#117#108#116#32#34#34+
-  #32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#32#105#110+
-  #116#101#114#110#97#108#115#10#32#32#84#114#105#103#73#100#120#32#105#115#32+
-  #34#116#114#105#103#105#100#120#34#32#116#121#112#101#32#117#105#110#116#32+
-  #105#110#116#101#114#110#97#108#59#10#125#10#10#10#47#47#47#47#47#47#47#47+
+  #82#95#76#69#70#84#59#10#125#10#10#34#116#114#105#103#103#101#114#34#32#115+
+  #105#122#101#32#49#52#56#32#98#121#116#101#115#32#98#105#110#98#108#111#99+
+  #107#32#54#32#123#10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121+
+  #112#101#32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115+
+  #32#120#121#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34+
+  #115#105#122#101#34#32#116#121#112#101#32#115#105#122#101#32#111#102#102#115+
+  #101#116#32#56#32#97#115#32#119#104#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#101#110#97#98#108#101#100#34#32#116#121#112#101+
+  #32#98#111#111#108#32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117+
+  #108#116#32#116#114#117#101#59#10#32#32#34#116#101#120#116#117#114#101#95+
+  #112#97#110#101#108#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115+
+  #101#116#32#49#51#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110+
+  #117#108#108#59#10#32#32#34#116#121#112#101#34#32#116#121#112#101#32#117#98+
+  #121#116#101#32#111#102#102#115#101#116#32#49#55#32#101#110#117#109#32#84+
+  #114#105#103#103#101#114#84#121#112#101#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#97#99#116#105#118#97#116#101#95#116#121#112+
+  #101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+
+  #32#49#56#32#98#105#116#115#101#116#32#65#99#116#105#118#97#116#101#84#121+
+  #112#101#59#10#32#32#34#107#101#121#115#34#32#116#121#112#101#32#117#98#121+
+  #116#101#32#111#102#102#115#101#116#32#49#57#32#98#105#116#115#101#116#32#75+
+  #101#121#32#100#101#102#97#117#108#116#32#75#69#89#95#78#79#78#69#59#10#32+
+  #32#47#47#87#65#82#78#73#78#71#58#32#34#116#114#105#103#100#97#116#97#34#32+
+  #77#85#83#84#32#98#101#32#100#101#102#105#110#101#100#32#98#101#102#111#114+
+  #101#32#34#116#121#112#101#34#44#32#97#110#100#32#34#116#121#112#101#34#32+
+  #77#85#83#84#32#98#101#32#110#97#109#101#100#32#34#116#121#112#101#34#32#40+
+  #102#111#114#32#110#111#119#44#32#99#97#110#32#98#101#32#99#104#97#110#103+
+  #101#100#32#108#97#116#101#114#41#10#32#32#34#116#114#105#103#103#101#114+
+  #100#97#116#97#34#32#116#121#112#101#32#116#114#105#103#100#97#116#97#91#49+
+  #50#56#93#32#111#102#102#115#101#116#32#50#48#59#32#47#47#32#116#104#101#32+
+  #111#110#108#121#32#115#112#101#99#105#97#108#32#110#101#115#116#101#100#32+
+  #115#116#114#117#99#116#117#114#101#10#125#10#10#10#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
-  #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#42+
-  #10#101#110#117#109#32#123#10#32#32#84#69#88#84#85#82#69#95#78#65#77#69#95+
-  #87#65#84#69#82#32#61#32#39#95#119#97#116#101#114#95#48#39#44#10#32#32#84#69+
-  #88#84#85#82#69#95#78#65#77#69#95#65#67#73#68#49#32#61#32#39#95#119#97#116+
-  #101#114#95#49#39#44#10#32#32#84#69#88#84#85#82#69#95#78#65#77#69#95#65#67+
-  #73#68#50#32#61#32#39#95#119#97#116#101#114#95#50#39#44#10#125#10#42#47#10+
-  #10#101#110#117#109#32#84#101#120#116#117#114#101#83#112#101#99#105#97#108+
-  #32#123#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73#65#76#95#87#65#84#69+
-  #82#32#61#32#45#49#44#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73#65#76+
-  #95#65#67#73#68#49#32#61#32#45#50#44#10#32#32#84#69#88#84#85#82#69#95#83#80+
-  #69#67#73#65#76#95#65#67#73#68#50#32#61#32#45#51#44#10#32#32#84#69#88#84#85+
-  #82#69#95#78#79#78#69#32#61#32#45#52#44#10#125#10#10#47#47#32#100#105#114+
-  #101#99#116#105#111#110#115#10#101#110#117#109#32#68#105#114#84#121#112#101+
-  #32#123#10#32#32#68#73#82#95#76#69#70#84#44#32#47#47#32#48#10#32#32#68#73#82+
-  #95#82#73#71#72#84#44#32#47#47#32#49#10#32#32#68#73#82#95#83#79#77#69#84#72+
-  #73#78#71#50#44#32#47#47#32#50#10#125#10#10#47#47#32#116#114#105#103#103#101+
-  #114#115#10#101#110#117#109#32#84#114#105#103#103#101#114#84#121#112#101#32+
-  #123#10#32#32#84#82#73#71#71#69#82#95#78#79#78#69#44#32#47#47#32#48#10#32#32+
-  #84#82#73#71#71#69#82#95#69#88#73#84#44#32#47#47#32#49#10#32#32#84#82#73#71+
-  #71#69#82#95#84#69#76#69#80#79#82#84#44#32#47#47#32#50#10#32#32#84#82#73#71+
-  #71#69#82#95#79#80#69#78#68#79#79#82#44#32#47#47#32#51#10#32#32#84#82#73#71+
-  #71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#52#10#32#32#84#82#73+
-  #71#71#69#82#95#68#79#79#82#44#32#47#47#32#53#10#32#32#84#82#73#71#71#69#82+
-  #95#68#79#79#82#53#44#32#47#47#32#54#10#32#32#84#82#73#71#71#69#82#95#67#76+
-  #79#83#69#84#82#65#80#44#32#47#47#32#55#10#32#32#84#82#73#71#71#69#82#95#84+
-  #82#65#80#44#32#47#47#32#56#10#32#32#84#82#73#71#71#69#82#95#80#82#69#83#83+
-  #44#32#47#47#32#57#10#32#32#84#82#73#71#71#69#82#95#83#69#67#82#69#84#44#32+
-  #47#47#32#49#48#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#47+
-  #47#32#49#49#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#68#79#87#78#44#32+
-  #47#47#32#49#50#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#44#32#47#47#32+
-  #49#51#10#32#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#44#32#47#47#32+
-  #49#52#10#32#32#84#82#73#71#71#69#82#95#79#78#44#32#47#47#32#49#53#10#32#32+
-  #84#82#73#71#71#69#82#95#79#70#70#44#32#47#47#32#49#54#10#32#32#84#82#73#71+
-  #71#69#82#95#79#78#79#70#70#44#32#47#47#32#49#55#10#32#32#84#82#73#71#71#69+
-  #82#95#83#79#85#78#68#44#32#47#47#32#49#56#10#32#32#84#82#73#71#71#69#82#95+
-  #83#80#65#87#78#77#79#78#83#84#69#82#44#32#47#47#32#49#57#10#32#32#84#82#73+
-  #71#71#69#82#95#83#80#65#87#78#73#84#69#77#44#32#47#47#32#50#48#10#32#32#84+
-  #82#73#71#71#69#82#95#77#85#83#73#67#44#32#47#47#32#50#49#10#32#32#84#82#73+
-  #71#71#69#82#95#80#85#83#72#44#32#47#47#32#50#50#10#32#32#84#82#73#71#71#69+
-  #82#95#83#67#79#82#69#44#32#47#47#32#50#51#10#32#32#84#82#73#71#71#69#82#95+
-  #77#69#83#83#65#71#69#44#32#47#47#32#50#52#10#32#32#84#82#73#71#71#69#82#95+
-  #68#65#77#65#71#69#44#32#47#47#32#50#53#10#32#32#84#82#73#71#71#69#82#95#72+
-  #69#65#76#84#72#44#32#47#47#32#50#54#10#32#32#84#82#73#71#71#69#82#95#83#72+
-  #79#84#44#32#47#47#32#50#55#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67+
-  #84#44#32#47#47#32#50#56#10#32#32#84#82#73#71#71#69#82#95#83#67#82#73#80#84+
-  #44#32#47#47#32#50#57#10#32#32#47#47#10#32#32#84#82#73#71#71#69#82#95#77#65+
-  #88#32#61#32#77#65#88#44#10#125#10#10#47#47#32#34#97#115#32#88#88#88#34#32+
-  #109#101#97#110#115#32#34#103#101#110#101#114#97#116#101#32#116#104#105#115+
-  #32#105#100#101#110#116#105#102#105#101#114#32#102#111#114#32#112#97#115#99+
-  #97#108#32#115#111#117#114#99#101#115#10#98#105#116#115#101#116#32#80#97#110+
-  #101#108#84#121#112#101#32#123#10#32#32#80#65#78#69#76#95#78#79#78#69#32#61+
-  #32#48#44#32#47#47#32#48#10#32#32#80#65#78#69#76#95#87#65#76#76#44#32#47#47+
-  #32#49#10#32#32#80#65#78#69#76#95#66#65#67#75#44#32#47#47#32#50#10#32#32#80+
-  #65#78#69#76#95#70#79#82#69#44#32#47#47#32#52#10#32#32#80#65#78#69#76#95#87+
-  #65#84#69#82#44#32#47#47#32#56#10#32#32#80#65#78#69#76#95#65#67#73#68#49#44+
-  #32#47#47#32#49#54#10#32#32#80#65#78#69#76#95#65#67#73#68#50#44#32#47#47#32+
-  #51#50#10#32#32#80#65#78#69#76#95#83#84#69#80#44#32#47#47#32#54#52#10#32#32+
-  #80#65#78#69#76#95#76#73#70#84#85#80#44#32#47#47#32#49#50#56#10#32#32#80#65+
-  #78#69#76#95#76#73#70#84#68#79#87#78#44#32#47#47#32#50#53#54#10#32#32#80#65+
-  #78#69#76#95#79#80#69#78#68#79#79#82#44#32#47#47#32#53#49#50#10#32#32#80#65+
-  #78#69#76#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#49#48#50#52#10#32#32+
-  #80#65#78#69#76#95#66#76#79#67#75#77#79#78#44#32#47#47#32#50#48#52#56#10#32+
-  #32#80#65#78#69#76#95#76#73#70#84#76#69#70#84#44#32#47#47#32#52#48#57#54#10+
-  #32#32#80#65#78#69#76#95#76#73#70#84#82#73#71#72#84#44#32#47#47#32#56#49#57+
-  #50#10#125#10#10#98#105#116#115#101#116#32#80#97#110#101#108#70#108#97#103+
-  #32#123#10#32#32#80#65#78#69#76#95#70#76#65#71#95#78#79#78#69#32#61#32#48#44+
-  #32#47#47#32#48#10#32#32#80#65#78#69#76#95#70#76#65#71#95#66#76#69#78#68#73+
-  #78#71#44#32#47#47#32#49#10#32#32#80#65#78#69#76#95#70#76#65#71#95#72#73#68+
-  #69#44#32#47#47#32#50#10#32#32#80#65#78#69#76#95#70#76#65#71#95#87#65#84#69+
-  #82#84#69#88#84#85#82#69#83#44#32#47#47#32#52#10#125#10#10#101#110#117#109+
-  #32#69#102#102#101#99#116#65#99#116#105#111#110#32#123#10#32#32#69#70#70#69+
-  #67#84#95#78#79#78#69#44#32#47#47#32#48#10#32#32#69#70#70#69#67#84#95#84#69+
-  #76#69#80#79#82#84#44#32#47#47#32#49#10#32#32#69#70#70#69#67#84#95#82#69#83+
-  #80#65#87#78#44#32#47#47#32#50#10#32#32#69#70#70#69#67#84#95#70#73#82#69#44+
-  #32#47#47#32#51#10#125#10#10#101#110#117#109#32#73#116#101#109#32#123#10#32+
-  #32#73#84#69#77#95#78#79#78#69#44#32#47#47#32#48#10#32#32#73#84#69#77#95#77+
-  #69#68#75#73#84#95#83#77#65#76#76#44#32#47#47#32#49#10#32#32#73#84#69#77#95+
-  #77#69#68#75#73#84#95#76#65#82#71#69#44#32#47#47#32#50#10#32#32#73#84#69#77+
-  #95#77#69#68#75#73#84#95#66#76#65#67#75#44#32#47#47#32#51#10#32#32#73#84#69+
-  #77#95#65#82#77#79#82#95#71#82#69#69#78#44#32#47#47#32#52#10#32#32#73#84#69+
-  #77#95#65#82#77#79#82#95#66#76#85#69#44#32#47#47#32#53#10#32#32#73#84#69#77+
-  #95#83#80#72#69#82#69#95#66#76#85#69#44#32#47#47#32#54#10#32#32#73#84#69#77+
-  #95#83#80#72#69#82#69#95#87#72#73#84#69#44#32#47#47#32#55#10#32#32#73#84#69+
-  #77#95#83#85#73#84#44#32#47#47#32#56#10#32#32#73#84#69#77#95#79#88#89#71#69+
-  #78#44#32#47#47#32#57#10#32#32#73#84#69#77#95#73#78#86#85#76#44#32#47#47#32+
-  #49#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#65#87#44#32#47#47#32+
-  #49#49#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72#79#84#71#85#78#49+
-  #44#32#47#47#32#49#50#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72#79+
-  #84#71#85#78#50#44#32#47#47#32#49#51#10#32#32#73#84#69#77#95#87#69#65#80#79+
-  #78#95#67#72#65#73#78#71#85#78#44#32#47#47#32#49#52#10#32#32#73#84#69#77#95+
-  #87#69#65#80#79#78#95#82#79#67#75#69#84#76#65#85#78#67#72#69#82#44#32#47#47+
-  #32#49#53#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#80#76#65#83#77#65#44+
-  #32#47#47#32#49#54#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#66#70#71#44+
-  #32#47#47#32#49#55#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#85#80#69+
-  #82#80#85#76#69#77#69#84#44#32#47#47#32#49#56#10#32#32#73#84#69#77#95#65#77+
-  #77#79#95#66#85#76#76#69#84#83#44#32#47#47#32#49#57#10#32#32#73#84#69#77#95+
-  #65#77#77#79#95#66#85#76#76#69#84#83#95#66#79#88#44#32#47#47#32#50#48#10#32+
-  #32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#44#32#47#47#32#50#49#10+
-  #32#32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#95#66#79#88#44#32#47+
-  #47#32#50#50#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84#44#32+
-  #47#47#32#50#51#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84#95+
-  #66#79#88#44#32#47#47#32#50#52#10#32#32#73#84#69#77#95#65#77#77#79#95#67#69+
-  #76#76#44#32#47#47#32#50#53#10#32#32#73#84#69#77#95#65#77#77#79#95#67#69#76+
-  #76#95#66#73#71#44#32#47#47#32#50#54#10#32#32#73#84#69#77#95#65#77#77#79#95+
-  #66#65#67#75#80#65#67#75#44#32#47#47#32#50#55#10#32#32#73#84#69#77#95#75#69+
-  #89#95#82#69#68#44#32#47#47#32#50#56#10#32#32#73#84#69#77#95#75#69#89#95#71+
-  #82#69#69#78#44#32#47#47#32#50#57#10#32#32#73#84#69#77#95#75#69#89#95#66#76+
-  #85#69#44#32#47#47#32#51#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#75+
-  #65#83#84#69#84#44#32#47#47#32#51#49#10#32#32#73#84#69#77#95#87#69#65#80#79+
-  #78#95#80#73#83#84#79#76#44#32#47#47#32#51#50#10#32#32#73#84#69#77#95#66#79+
-  #84#84#76#69#44#32#47#47#32#51#51#10#32#32#73#84#69#77#95#72#69#76#77#69#84+
-  #44#32#47#47#32#51#52#10#32#32#73#84#69#77#95#74#69#84#80#65#67#75#44#32#47+
-  #47#32#51#53#10#32#32#73#84#69#77#95#73#78#86#73#83#44#32#47#47#32#51#54#10+
-  #32#32#73#84#69#77#95#87#69#65#80#79#78#95#70#76#65#77#69#84#72#82#79#87#69+
-  #82#44#32#47#47#32#51#55#10#32#32#73#84#69#77#95#65#77#77#79#95#70#85#69#76+
-  #67#65#78#44#32#47#47#32#51#56#10#32#32#47#47#10#32#32#73#84#69#77#95#77#65+
-  #88#32#61#32#77#65#88#44#32#47#47#32#115#116#111#114#101#32#116#104#101#32+
-  #108#97#115#116#32#105#116#101#109#39#115#32#105#100#32#105#110#32#104#101+
-  #114#101#32#117#115#101#32#116#104#105#115#32#105#110#32#102#111#114#32#108+
-  #111#111#112#115#10#125#10#10#98#105#116#115#101#116#32#73#116#101#109#79+
-  #112#116#105#111#110#32#123#10#32#32#73#84#69#77#95#79#80#84#73#79#78#95#78+
-  #79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#73#84#69#77#95#79#80#84#73+
-  #79#78#95#79#78#76#89#68#77#44#32#47#47#32#49#10#32#32#73#84#69#77#95#79#80+
-  #84#73#79#78#95#70#65#76#76#44#32#47#47#32#50#10#125#10#10#101#110#117#109+
-  #32#65#114#101#97#84#121#112#101#32#123#10#32#32#65#82#69#65#95#78#79#78#69+
-  #44#32#47#47#32#48#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73#78#84+
-  #49#44#32#47#47#32#49#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73#78+
-  #84#50#44#32#47#47#32#50#10#32#32#65#82#69#65#95#68#77#80#79#73#78#84#44#32+
-  #47#47#32#51#10#32#32#65#82#69#65#95#82#69#68#70#76#65#71#44#32#47#47#32#52+
-  #10#32#32#65#82#69#65#95#66#76#85#69#70#76#65#71#44#32#47#47#32#53#10#32#32+
-  #65#82#69#65#95#68#79#77#70#76#65#71#44#32#47#47#32#54#10#32#32#65#82#69#65+
-  #95#82#69#68#84#69#65#77#80#79#73#78#84#44#32#47#47#32#55#10#32#32#65#82#69+
-  #65#95#66#76#85#69#84#69#65#77#80#79#73#78#84#44#32#47#47#32#56#10#125#10#10+
-  #101#110#117#109#32#77#111#110#115#116#101#114#32#123#10#32#32#77#79#78#83+
-  #84#69#82#95#78#79#78#69#44#32#47#47#32#48#10#32#32#77#79#78#83#84#69#82#95+
-  #68#69#77#79#78#44#32#47#47#32#49#10#32#32#77#79#78#83#84#69#82#95#73#77#80+
-  #44#32#47#47#32#50#10#32#32#77#79#78#83#84#69#82#95#90#79#77#66#89#44#32#47+
-  #47#32#51#10#32#32#77#79#78#83#84#69#82#95#83#69#82#71#44#32#47#47#32#52#10+
-  #32#32#77#79#78#83#84#69#82#95#67#89#66#69#82#44#32#47#47#32#53#10#32#32#77+
-  #79#78#83#84#69#82#95#67#71#85#78#44#32#47#47#32#54#10#32#32#77#79#78#83#84+
-  #69#82#95#66#65#82#79#78#44#32#47#47#32#55#10#32#32#77#79#78#83#84#69#82#95+
-  #75#78#73#71#72#84#44#32#47#47#32#56#10#32#32#77#79#78#83#84#69#82#95#67#65+
-  #67#79#44#32#47#47#32#57#10#32#32#77#79#78#83#84#69#82#95#83#79#85#76#44#32+
-  #47#47#32#49#48#10#32#32#77#79#78#83#84#69#82#95#80#65#73#78#44#32#47#47#32+
-  #49#49#10#32#32#77#79#78#83#84#69#82#95#83#80#73#68#69#82#44#32#47#47#32#49+
-  #50#10#32#32#77#79#78#83#84#69#82#95#66#83#80#44#32#47#47#32#49#51#10#32#32+
-  #77#79#78#83#84#69#82#95#77#65#78#67#85#66#44#32#47#47#32#49#52#10#32#32#77+
-  #79#78#83#84#69#82#95#83#75#69#76#44#32#47#47#32#49#53#10#32#32#77#79#78#83+
-  #84#69#82#95#86#73#76#69#44#32#47#47#32#49#54#10#32#32#77#79#78#83#84#69#82+
-  #95#70#73#83#72#44#32#47#47#32#49#55#10#32#32#77#79#78#83#84#69#82#95#66#65+
-  #82#82#69#76#44#32#47#47#32#49#56#10#32#32#77#79#78#83#84#69#82#95#82#79#66+
-  #79#44#32#47#47#32#49#57#10#32#32#77#79#78#83#84#69#82#95#77#65#78#44#32#47+
-  #47#32#50#48#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#83+
-  #104#111#116#32#123#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#80#73#83+
-  #84#79#76#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+
-  #66#85#76#76#69#84#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#72+
-  #79#84#95#83#72#79#84#71#85#78#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69+
-  #82#95#83#72#79#84#95#83#83#71#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69+
-  #82#95#83#72#79#84#95#73#77#80#44#32#47#47#32#52#10#32#32#84#82#73#71#71#69+
-  #82#95#83#72#79#84#95#80#76#65#83#77#65#44#32#47#47#32#53#10#32#32#84#82#73+
-  #71#71#69#82#95#83#72#79#84#95#83#80#73#68#69#82#44#32#47#47#32#54#10#32#32+
-  #84#82#73#71#71#69#82#95#83#72#79#84#95#67#65#67#79#44#32#47#47#32#55#10#32+
-  #32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#65#82#79#78#44#32#47#47#32#56+
-  #10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#77#65#78#67#85#66#44#32#47+
-  #47#32#57#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#82#69#86#44#32#47+
-  #47#32#49#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#82#79#67#75#69+
-  #84#44#32#47#47#32#49#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#66+
-  #70#71#44#32#47#47#32#49#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+
-  #69#88#80#76#44#32#47#47#32#49#51#10#32#32#84#82#73#71#71#69#82#95#83#72#79+
-  #84#95#66#70#71#69#88#80#76#44#32#47#47#32#49#52#10#32#32#47#47#10#32#32#84+
-  #82#73#71#71#69#82#95#83#72#79#84#95#77#65#88#32#61#32#77#65#88#44#10#125#10+
-  #10#101#110#117#109#32#84#114#105#103#103#101#114#83#104#111#116#84#97#114+
-  #103#101#116#32#123#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82+
-  #71#69#84#95#78#79#78#69#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95+
-  #83#72#79#84#95#84#65#82#71#69#84#95#77#79#78#44#32#47#47#32#49#10#32#32#84+
-  #82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#80#76#82#44#32#47+
-  #47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84+
-  #95#82#69#68#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84+
-  #95#84#65#82#71#69#84#95#66#76#85#69#44#32#47#47#32#52#10#32#32#84#82#73#71+
-  #71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#77#79#78#80#76#82#44#32#47+
-  #47#32#53#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84+
-  #95#80#76#82#77#79#78#44#32#47#47#32#54#10#125#10#10#101#110#117#109#32#84+
-  #114#105#103#103#101#114#83#104#111#116#65#105#109#32#123#10#32#32#84#82#73+
-  #71#71#69#82#95#83#72#79#84#95#65#73#77#95#68#69#70#65#85#76#84#44#32#47#47+
-  #32#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#65#76#76+
-  #77#65#80#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+
-  #65#73#77#95#84#82#65#67#69#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82+
-  #95#83#72#79#84#95#65#73#77#95#84#82#65#67#69#65#76#76#44#32#47#47#32#51#10+
-  #125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#69#102#102#101#99+
-  #116#32#123#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#80#65#82+
-  #84#73#67#76#69#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#69#70#70+
-  #69#67#84#95#65#78#73#77#65#84#73#79#78#44#32#47#47#32#49#10#125#10#10#101+
-  #110#117#109#32#84#114#105#103#103#101#114#69#102#102#101#99#116#84#121#112+
-  #101#32#123#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#83#76#73+
-  #81#85#73#68#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69+
-  #67#84#95#76#76#73#81#85#73#68#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69+
-  #82#95#69#70#70#69#67#84#95#68#76#73#81#85#73#68#44#32#47#47#32#50#10#32#32+
-  #84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#66#76#79#79#68#44#32#47#47#32+
-  #51#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#83#80#65#82#75#44+
-  #32#47#47#32#52#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#66#85+
-  #66#66#76#69#44#32#47#47#32#53#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69+
-  #67#84#95#77#65#88#32#61#32#77#65#88#44#10#125#10#10#101#110#117#109#32#84+
-  #114#105#103#103#101#114#69#102#102#101#99#116#80#111#115#32#123#10#32#32#84+
-  #82#73#71#71#69#82#95#69#70#70#69#67#84#95#80#79#83#95#67#69#78#84#69#82#44+
-  #32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#80#79+
-  #83#95#65#82#69#65#44#32#47#47#32#49#10#125#10#10#98#105#116#115#101#116#32+
-  #65#99#116#105#118#97#116#101#84#121#112#101#32#123#10#32#32#65#67#84#73#86+
-  #65#84#69#95#78#79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#65#67#84#73+
-  #86#65#84#69#95#80#76#65#89#69#82#67#79#76#76#73#68#69#44#32#47#47#32#49#10+
-  #32#32#65#67#84#73#86#65#84#69#95#77#79#78#83#84#69#82#67#79#76#76#73#68#69+
-  #44#32#47#47#32#50#10#32#32#65#67#84#73#86#65#84#69#95#80#76#65#89#69#82#80+
-  #82#69#83#83#44#32#47#47#32#52#10#32#32#65#67#84#73#86#65#84#69#95#77#79#78+
-  #83#84#69#82#80#82#69#83#83#44#32#47#47#32#56#10#32#32#65#67#84#73#86#65#84+
-  #69#95#83#72#79#84#44#32#47#47#32#49#54#10#32#32#65#67#84#73#86#65#84#69#95+
-  #78#79#77#79#78#83#84#69#82#44#32#47#47#32#51#50#10#32#32#65#67#84#73#86#65+
-  #84#69#95#67#85#83#84#79#77#32#61#32#50#53#53#44#32#47#47#32#110#111#116#101+
-  #32#116#104#97#116#32#34#100#105#114#101#99#116#32#97#115#115#105#103#110#34+
-  #32#102#105#101#108#100#32#100#111#101#115#110#39#116#32#97#102#102#101#99+
-  #116#32#98#105#116#32#99#111#117#110#116#101#114#10#125#10#10#98#105#116#115+
-  #101#116#32#75#101#121#32#123#10#32#32#75#69#89#95#78#79#78#69#32#61#32#48+
-  #44#32#47#47#32#48#10#32#32#75#69#89#95#82#69#68#44#32#47#47#32#49#10#32#32+
-  #75#69#89#95#71#82#69#69#78#44#32#47#47#32#50#10#32#32#75#69#89#95#66#76#85+
-  #69#44#32#47#47#32#52#10#32#32#75#69#89#95#82#69#68#84#69#65#77#44#32#47#47+
-  #32#56#10#32#32#75#69#89#95#66#76#85#69#84#69#65#77#44#32#47#47#32#49#54#10+
-  #125#10#10#10#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
+  #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47+
+  #32#115#112#101#99#105#97#108#32#116#101#120#116#117#114#101#32#105#100#101+
+  #110#116#105#102#105#101#114#115#44#32#117#115#101#100#32#116#111#32#103#101+
+  #110#101#114#97#116#101#32#112#97#115#99#97#108#32#115#111#117#114#99#101+
+  #115#10#101#110#117#109#32#84#101#120#116#117#114#101#83#112#101#99#105#97+
+  #108#32#123#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73#65#76#95#87#65+
+  #84#69#82#32#61#32#45#49#44#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73+
+  #65#76#95#65#67#73#68#49#32#61#32#45#50#44#10#32#32#84#69#88#84#85#82#69#95+
+  #83#80#69#67#73#65#76#95#65#67#73#68#50#32#61#32#45#51#44#10#32#32#84#69#88+
+  #84#85#82#69#95#78#79#78#69#32#61#32#45#52#44#10#125#10#10#47#47#32#100#105+
+  #114#101#99#116#105#111#110#115#10#101#110#117#109#32#68#105#114#84#121#112+
+  #101#32#123#10#32#32#68#73#82#95#76#69#70#84#44#32#47#47#32#48#10#32#32#68+
+  #73#82#95#82#73#71#72#84#44#32#47#47#32#49#10#32#32#68#73#82#95#83#79#77#69+
+  #84#72#73#78#71#50#44#32#47#47#32#50#10#125#10#10#47#47#32#116#114#105#103+
+  #103#101#114#115#10#101#110#117#109#32#84#114#105#103#103#101#114#84#121#112+
+  #101#32#123#10#32#32#84#82#73#71#71#69#82#95#78#79#78#69#44#32#47#47#32#48+
+  #10#32#32#84#82#73#71#71#69#82#95#69#88#73#84#44#32#47#47#32#49#10#32#32#84+
+  #82#73#71#71#69#82#95#84#69#76#69#80#79#82#84#44#32#47#47#32#50#10#32#32#84+
+  #82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32#47#47#32#51#10#32#32#84+
+  #82#73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#52#10#32#32+
+  #84#82#73#71#71#69#82#95#68#79#79#82#44#32#47#47#32#53#10#32#32#84#82#73#71+
+  #71#69#82#95#68#79#79#82#53#44#32#47#47#32#54#10#32#32#84#82#73#71#71#69#82+
+  #95#67#76#79#83#69#84#82#65#80#44#32#47#47#32#55#10#32#32#84#82#73#71#71#69+
+  #82#95#84#82#65#80#44#32#47#47#32#56#10#32#32#84#82#73#71#71#69#82#95#80#82+
+  #69#83#83#44#32#47#47#32#57#10#32#32#84#82#73#71#71#69#82#95#83#69#67#82#69+
+  #84#44#32#47#47#32#49#48#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80+
+  #44#32#47#47#32#49#49#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#68#79#87+
+  #78#44#32#47#47#32#49#50#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#44#32+
+  #47#47#32#49#51#10#32#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#44#32+
+  #47#47#32#49#52#10#32#32#84#82#73#71#71#69#82#95#79#78#44#32#47#47#32#49#53+
+  #10#32#32#84#82#73#71#71#69#82#95#79#70#70#44#32#47#47#32#49#54#10#32#32#84+
+  #82#73#71#71#69#82#95#79#78#79#70#70#44#32#47#47#32#49#55#10#32#32#84#82#73+
+  #71#71#69#82#95#83#79#85#78#68#44#32#47#47#32#49#56#10#32#32#84#82#73#71#71+
+  #69#82#95#83#80#65#87#78#77#79#78#83#84#69#82#44#32#47#47#32#49#57#10#32#32+
+  #84#82#73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#44#32#47#47#32#50#48#10+
+  #32#32#84#82#73#71#71#69#82#95#77#85#83#73#67#44#32#47#47#32#50#49#10#32#32+
+  #84#82#73#71#71#69#82#95#80#85#83#72#44#32#47#47#32#50#50#10#32#32#84#82#73+
+  #71#71#69#82#95#83#67#79#82#69#44#32#47#47#32#50#51#10#32#32#84#82#73#71#71+
+  #69#82#95#77#69#83#83#65#71#69#44#32#47#47#32#50#52#10#32#32#84#82#73#71#71+
+  #69#82#95#68#65#77#65#71#69#44#32#47#47#32#50#53#10#32#32#84#82#73#71#71#69+
+  #82#95#72#69#65#76#84#72#44#32#47#47#32#50#54#10#32#32#84#82#73#71#71#69#82+
+  #95#83#72#79#84#44#32#47#47#32#50#55#10#32#32#84#82#73#71#71#69#82#95#69#70+
+  #70#69#67#84#44#32#47#47#32#50#56#10#32#32#84#82#73#71#71#69#82#95#83#67#82+
+  #73#80#84#44#32#47#47#32#50#57#10#32#32#47#47#10#32#32#84#82#73#71#71#69#82+
+  #95#77#65#88#32#61#32#77#65#88#44#10#125#10#10#47#47#32#34#97#115#32#88#88+
+  #88#34#32#109#101#97#110#115#32#34#103#101#110#101#114#97#116#101#32#116#104+
+  #105#115#32#105#100#101#110#116#105#102#105#101#114#32#102#111#114#32#112#97+
+  #115#99#97#108#32#115#111#117#114#99#101#115#10#98#105#116#115#101#116#32#80+
+  #97#110#101#108#84#121#112#101#32#123#10#32#32#80#65#78#69#76#95#78#79#78#69+
+  #32#61#32#48#44#32#47#47#32#48#10#32#32#80#65#78#69#76#95#87#65#76#76#44#32+
+  #47#47#32#49#10#32#32#80#65#78#69#76#95#66#65#67#75#44#32#47#47#32#50#10#32+
+  #32#80#65#78#69#76#95#70#79#82#69#44#32#47#47#32#52#10#32#32#80#65#78#69#76+
+  #95#87#65#84#69#82#44#32#47#47#32#56#10#32#32#80#65#78#69#76#95#65#67#73#68+
+  #49#44#32#47#47#32#49#54#10#32#32#80#65#78#69#76#95#65#67#73#68#50#44#32#47+
+  #47#32#51#50#10#32#32#80#65#78#69#76#95#83#84#69#80#44#32#47#47#32#54#52#10+
+  #32#32#80#65#78#69#76#95#76#73#70#84#85#80#44#32#47#47#32#49#50#56#10#32#32+
+  #80#65#78#69#76#95#76#73#70#84#68#79#87#78#44#32#47#47#32#50#53#54#10#32#32+
+  #80#65#78#69#76#95#79#80#69#78#68#79#79#82#44#32#47#47#32#53#49#50#10#32#32+
+  #80#65#78#69#76#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#49#48#50#52#10+
+  #32#32#80#65#78#69#76#95#66#76#79#67#75#77#79#78#44#32#47#47#32#50#48#52#56+
+  #10#32#32#80#65#78#69#76#95#76#73#70#84#76#69#70#84#44#32#47#47#32#52#48#57+
+  #54#10#32#32#80#65#78#69#76#95#76#73#70#84#82#73#71#72#84#44#32#47#47#32#56+
+  #49#57#50#10#125#10#10#98#105#116#115#101#116#32#80#97#110#101#108#70#108#97+
+  #103#32#123#10#32#32#80#65#78#69#76#95#70#76#65#71#95#78#79#78#69#32#61#32+
+  #48#44#32#47#47#32#48#10#32#32#80#65#78#69#76#95#70#76#65#71#95#66#76#69#78+
+  #68#73#78#71#44#32#47#47#32#49#10#32#32#80#65#78#69#76#95#70#76#65#71#95#72+
+  #73#68#69#44#32#47#47#32#50#10#32#32#80#65#78#69#76#95#70#76#65#71#95#87#65+
+  #84#69#82#84#69#88#84#85#82#69#83#44#32#47#47#32#52#10#125#10#10#101#110#117+
+  #109#32#69#102#102#101#99#116#65#99#116#105#111#110#32#123#10#32#32#69#70#70+
+  #69#67#84#95#78#79#78#69#44#32#47#47#32#48#10#32#32#69#70#70#69#67#84#95#84+
+  #69#76#69#80#79#82#84#44#32#47#47#32#49#10#32#32#69#70#70#69#67#84#95#82#69+
+  #83#80#65#87#78#44#32#47#47#32#50#10#32#32#69#70#70#69#67#84#95#70#73#82#69+
+  #44#32#47#47#32#51#10#125#10#10#101#110#117#109#32#73#116#101#109#32#123#10+
+  #32#32#73#84#69#77#95#78#79#78#69#44#32#47#47#32#48#10#32#32#73#84#69#77#95+
+  #77#69#68#75#73#84#95#83#77#65#76#76#44#32#47#47#32#49#10#32#32#73#84#69#77+
+  #95#77#69#68#75#73#84#95#76#65#82#71#69#44#32#47#47#32#50#10#32#32#73#84#69+
+  #77#95#77#69#68#75#73#84#95#66#76#65#67#75#44#32#47#47#32#51#10#32#32#73#84+
+  #69#77#95#65#82#77#79#82#95#71#82#69#69#78#44#32#47#47#32#52#10#32#32#73#84+
+  #69#77#95#65#82#77#79#82#95#66#76#85#69#44#32#47#47#32#53#10#32#32#73#84#69+
+  #77#95#83#80#72#69#82#69#95#66#76#85#69#44#32#47#47#32#54#10#32#32#73#84#69+
+  #77#95#83#80#72#69#82#69#95#87#72#73#84#69#44#32#47#47#32#55#10#32#32#73#84+
+  #69#77#95#83#85#73#84#44#32#47#47#32#56#10#32#32#73#84#69#77#95#79#88#89#71+
+  #69#78#44#32#47#47#32#57#10#32#32#73#84#69#77#95#73#78#86#85#76#44#32#47#47+
+  #32#49#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#65#87#44#32#47#47+
+  #32#49#49#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72#79#84#71#85#78+
+  #49#44#32#47#47#32#49#50#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72+
+  #79#84#71#85#78#50#44#32#47#47#32#49#51#10#32#32#73#84#69#77#95#87#69#65#80+
+  #79#78#95#67#72#65#73#78#71#85#78#44#32#47#47#32#49#52#10#32#32#73#84#69#77+
+  #95#87#69#65#80#79#78#95#82#79#67#75#69#84#76#65#85#78#67#72#69#82#44#32#47+
+  #47#32#49#53#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#80#76#65#83#77#65+
+  #44#32#47#47#32#49#54#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#66#70#71+
+  #44#32#47#47#32#49#55#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#85#80+
+  #69#82#80#85#76#69#77#69#84#44#32#47#47#32#49#56#10#32#32#73#84#69#77#95#65+
+  #77#77#79#95#66#85#76#76#69#84#83#44#32#47#47#32#49#57#10#32#32#73#84#69#77+
+  #95#65#77#77#79#95#66#85#76#76#69#84#83#95#66#79#88#44#32#47#47#32#50#48#10+
+  #32#32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#44#32#47#47#32#50#49+
+  #10#32#32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#95#66#79#88#44#32+
+  #47#47#32#50#50#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84#44+
+  #32#47#47#32#50#51#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84+
+  #95#66#79#88#44#32#47#47#32#50#52#10#32#32#73#84#69#77#95#65#77#77#79#95#67+
+  #69#76#76#44#32#47#47#32#50#53#10#32#32#73#84#69#77#95#65#77#77#79#95#67#69+
+  #76#76#95#66#73#71#44#32#47#47#32#50#54#10#32#32#73#84#69#77#95#65#77#77#79+
+  #95#66#65#67#75#80#65#67#75#44#32#47#47#32#50#55#10#32#32#73#84#69#77#95#75+
+  #69#89#95#82#69#68#44#32#47#47#32#50#56#10#32#32#73#84#69#77#95#75#69#89#95+
+  #71#82#69#69#78#44#32#47#47#32#50#57#10#32#32#73#84#69#77#95#75#69#89#95#66+
+  #76#85#69#44#32#47#47#32#51#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95+
+  #75#65#83#84#69#84#44#32#47#47#32#51#49#10#32#32#73#84#69#77#95#87#69#65#80+
+  #79#78#95#80#73#83#84#79#76#44#32#47#47#32#51#50#10#32#32#73#84#69#77#95#66+
+  #79#84#84#76#69#44#32#47#47#32#51#51#10#32#32#73#84#69#77#95#72#69#76#77#69+
+  #84#44#32#47#47#32#51#52#10#32#32#73#84#69#77#95#74#69#84#80#65#67#75#44#32+
+  #47#47#32#51#53#10#32#32#73#84#69#77#95#73#78#86#73#83#44#32#47#47#32#51#54+
+  #10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#70#76#65#77#69#84#72#82#79#87+
+  #69#82#44#32#47#47#32#51#55#10#32#32#73#84#69#77#95#65#77#77#79#95#70#85#69+
+  #76#67#65#78#44#32#47#47#32#51#56#10#32#32#47#47#10#32#32#73#84#69#77#95#77+
+  #65#88#32#61#32#77#65#88#44#32#47#47#32#115#116#111#114#101#32#116#104#101+
+  #32#108#97#115#116#32#105#116#101#109#39#115#32#105#100#32#105#110#32#104+
+  #101#114#101#32#117#115#101#32#116#104#105#115#32#105#110#32#102#111#114#32+
+  #108#111#111#112#115#10#125#10#10#98#105#116#115#101#116#32#73#116#101#109+
+  #79#112#116#105#111#110#32#123#10#32#32#73#84#69#77#95#79#80#84#73#79#78#95+
+  #78#79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#73#84#69#77#95#79#80#84+
+  #73#79#78#95#79#78#76#89#68#77#44#32#47#47#32#49#10#32#32#73#84#69#77#95#79+
+  #80#84#73#79#78#95#70#65#76#76#44#32#47#47#32#50#10#125#10#10#101#110#117+
+  #109#32#65#114#101#97#84#121#112#101#32#123#10#32#32#65#82#69#65#95#78#79#78+
+  #69#44#32#47#47#32#48#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73#78+
+  #84#49#44#32#47#47#32#49#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73+
+  #78#84#50#44#32#47#47#32#50#10#32#32#65#82#69#65#95#68#77#80#79#73#78#84#44+
+  #32#47#47#32#51#10#32#32#65#82#69#65#95#82#69#68#70#76#65#71#44#32#47#47#32+
+  #52#10#32#32#65#82#69#65#95#66#76#85#69#70#76#65#71#44#32#47#47#32#53#10#32+
+  #32#65#82#69#65#95#68#79#77#70#76#65#71#44#32#47#47#32#54#10#32#32#65#82#69+
+  #65#95#82#69#68#84#69#65#77#80#79#73#78#84#44#32#47#47#32#55#10#32#32#65#82+
+  #69#65#95#66#76#85#69#84#69#65#77#80#79#73#78#84#44#32#47#47#32#56#10#125#10+
+  #10#101#110#117#109#32#77#111#110#115#116#101#114#32#123#10#32#32#77#79#78+
+  #83#84#69#82#95#78#79#78#69#44#32#47#47#32#48#10#32#32#77#79#78#83#84#69#82+
+  #95#68#69#77#79#78#44#32#47#47#32#49#10#32#32#77#79#78#83#84#69#82#95#73#77+
+  #80#44#32#47#47#32#50#10#32#32#77#79#78#83#84#69#82#95#90#79#77#66#89#44#32+
+  #47#47#32#51#10#32#32#77#79#78#83#84#69#82#95#83#69#82#71#44#32#47#47#32#52+
+  #10#32#32#77#79#78#83#84#69#82#95#67#89#66#69#82#44#32#47#47#32#53#10#32#32+
+  #77#79#78#83#84#69#82#95#67#71#85#78#44#32#47#47#32#54#10#32#32#77#79#78#83+
+  #84#69#82#95#66#65#82#79#78#44#32#47#47#32#55#10#32#32#77#79#78#83#84#69#82+
+  #95#75#78#73#71#72#84#44#32#47#47#32#56#10#32#32#77#79#78#83#84#69#82#95#67+
+  #65#67#79#44#32#47#47#32#57#10#32#32#77#79#78#83#84#69#82#95#83#79#85#76#44+
+  #32#47#47#32#49#48#10#32#32#77#79#78#83#84#69#82#95#80#65#73#78#44#32#47#47+
+  #32#49#49#10#32#32#77#79#78#83#84#69#82#95#83#80#73#68#69#82#44#32#47#47#32+
+  #49#50#10#32#32#77#79#78#83#84#69#82#95#66#83#80#44#32#47#47#32#49#51#10#32+
+  #32#77#79#78#83#84#69#82#95#77#65#78#67#85#66#44#32#47#47#32#49#52#10#32#32+
+  #77#79#78#83#84#69#82#95#83#75#69#76#44#32#47#47#32#49#53#10#32#32#77#79#78+
+  #83#84#69#82#95#86#73#76#69#44#32#47#47#32#49#54#10#32#32#77#79#78#83#84#69+
+  #82#95#70#73#83#72#44#32#47#47#32#49#55#10#32#32#77#79#78#83#84#69#82#95#66+
+  #65#82#82#69#76#44#32#47#47#32#49#56#10#32#32#77#79#78#83#84#69#82#95#82#79+
+  #66#79#44#32#47#47#32#49#57#10#32#32#77#79#78#83#84#69#82#95#77#65#78#44#32+
+  #47#47#32#50#48#10#32#32#47#47#32#97#108#105#97#115#101#115#32#40#102#105+
+  #120#109#101#58#32#105#116#32#115#104#111#117#108#100#32#98#101#32#96#77#79+
+  #78#83#84#69#82#95#90#79#77#66#73#69#32#61#32#77#79#78#83#84#69#82#95#90#79+
+  #77#66#89#96#33#41#10#32#32#77#79#78#83#84#69#82#95#90#79#77#66#73#69#32#61+
+  #32#51#44#10#125#10#10#101#110#117#109#32#77#111#110#115#116#101#114#66#101+
+  #104#97#118#105#111#117#114#32#123#10#32#32#66#72#95#78#79#82#77#65#76#44#32+
+  #47#47#32#48#10#32#32#66#72#95#75#73#76#76#69#82#44#32#47#47#32#49#10#32#32+
+  #66#72#95#77#65#78#73#65#67#44#32#47#47#32#50#10#32#32#66#72#95#73#78#83#65+
+  #78#69#44#32#47#47#32#51#10#32#32#66#72#95#67#65#78#78#73#66#65#76#44#32#47+
+  #47#32#52#10#32#32#66#72#95#71#79#79#68#44#32#47#47#32#53#10#125#10#10#101+
+  #110#117#109#32#84#114#105#103#103#101#114#83#104#111#116#32#123#10#32#32#84+
+  #82#73#71#71#69#82#95#83#72#79#84#95#80#73#83#84#79#76#44#32#47#47#32#48#10+
+  #32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#85#76#76#69#84#44#32#47#47+
+  #32#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#83#72#79#84#71#85#78+
+  #44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#83#83#71+
+  #44#32#47#47#32#51#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#73#77#80+
+  #44#32#47#47#32#52#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#80#76#65+
+  #83#77#65#44#32#47#47#32#53#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+
+  #83#80#73#68#69#82#44#32#47#47#32#54#10#32#32#84#82#73#71#71#69#82#95#83#72+
+  #79#84#95#67#65#67#79#44#32#47#47#32#55#10#32#32#84#82#73#71#71#69#82#95#83+
+  #72#79#84#95#66#65#82#79#78#44#32#47#47#32#56#10#32#32#84#82#73#71#71#69#82+
+  #95#83#72#79#84#95#77#65#78#67#85#66#44#32#47#47#32#57#10#32#32#84#82#73#71+
+  #71#69#82#95#83#72#79#84#95#82#69#86#44#32#47#47#32#49#48#10#32#32#84#82#73+
+  #71#71#69#82#95#83#72#79#84#95#82#79#67#75#69#84#44#32#47#47#32#49#49#10#32+
+  #32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#70#71#44#32#47#47#32#49#50#10+
+  #32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#69#88#80#76#44#32#47#47#32#49+
+  #51#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#70#71#69#88#80#76#44+
+  #32#47#47#32#49#52#10#32#32#47#47#10#32#32#84#82#73#71#71#69#82#95#83#72#79+
+  #84#95#77#65#88#32#61#32#77#65#88#44#10#125#10#10#101#110#117#109#32#84#114+
+  #105#103#103#101#114#83#104#111#116#84#97#114#103#101#116#32#123#10#32#32#84+
+  #82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#78#79#78#69#44#32+
+  #47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69+
+  #84#95#77#79#78#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79+
+  #84#95#84#65#82#71#69#84#95#80#76#82#44#32#47#47#32#50#10#32#32#84#82#73#71+
+  #71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#82#69#68#44#32#47#47#32#51+
+  #10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#66#76+
+  #85#69#44#32#47#47#32#52#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84+
+  #65#82#71#69#84#95#77#79#78#80#76#82#44#32#47#47#32#53#10#32#32#84#82#73#71+
+  #71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#80#76#82#77#79#78#44#32#47+
+  #47#32#54#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#83#104+
+  #111#116#65#105#109#32#123#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+
+  #65#73#77#95#68#69#70#65#85#76#84#44#32#47#47#32#48#10#32#32#84#82#73#71#71+
+  #69#82#95#83#72#79#84#95#65#73#77#95#65#76#76#77#65#80#44#32#47#47#32#49#10+
+  #32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#84#82#65#67#69#44+
+  #32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95+
+  #84#82#65#67#69#65#76#76#44#32#47#47#32#51#10#125#10#10#101#110#117#109#32+
+  #84#114#105#103#103#101#114#69#102#102#101#99#116#32#123#10#32#32#84#82#73+
+  #71#71#69#82#95#69#70#70#69#67#84#95#80#65#82#84#73#67#76#69#44#32#47#47#32+
+  #48#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#65#78#73#77#65#84+
+  #73#79#78#44#32#47#47#32#49#10#125#10#10#101#110#117#109#32#84#114#105#103+
+  #103#101#114#69#102#102#101#99#116#84#121#112#101#32#123#10#32#32#84#82#73+
+  #71#71#69#82#95#69#70#70#69#67#84#95#83#76#73#81#85#73#68#44#32#47#47#32#48+
+  #10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#76#76#73#81#85#73#68+
+  #44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#68+
+  #76#73#81#85#73#68#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#69#70+
+  #70#69#67#84#95#66#76#79#79#68#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69+
+  #82#95#69#70#70#69#67#84#95#83#80#65#82#75#44#32#47#47#32#52#10#32#32#84#82+
+  #73#71#71#69#82#95#69#70#70#69#67#84#95#66#85#66#66#76#69#44#32#47#47#32#53+
+  #10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#77#65#88#32#61#32#77+
+  #65#88#44#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#69#102+
+  #102#101#99#116#80#111#115#32#123#10#32#32#84#82#73#71#71#69#82#95#69#70#70+
+  #69#67#84#95#80#79#83#95#67#69#78#84#69#82#44#32#47#47#32#48#10#32#32#84#82+
+  #73#71#71#69#82#95#69#70#70#69#67#84#95#80#79#83#95#65#82#69#65#44#32#47#47+
+  #32#49#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#77#117#115+
+  #105#99#65#99#116#105#111#110#32#123#10#32#32#84#82#73#71#71#69#82#95#77#85+
+  #83#73#67#95#65#67#84#73#79#78#95#83#84#79#80#44#32#47#47#32#48#10#32#32#84+
+  #82#73#71#71#69#82#95#77#85#83#73#67#95#65#67#84#73#79#78#95#80#76#65#89#44+
+  #32#47#47#32#49#59#32#117#110#112#97#117#115#101#32#111#114#32#114#101#115+
+  #116#97#114#116#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114+
+  #83#99#111#114#101#65#99#116#105#111#110#32#123#10#32#32#84#82#73#71#71#69+
+  #82#95#83#67#79#82#69#95#65#67#84#73#79#78#95#65#68#68#44#32#47#47#32#48#10+
+  #32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65#67#84#73#79#78#95#83#85+
+  #66#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65+
+  #67#84#73#79#78#95#87#73#78#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82+
+  #95#83#67#79#82#69#95#65#67#84#73#79#78#95#76#79#79#83#69#44#32#47#47#32#51+
+  #10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#77#101#115#115+
+  #97#103#101#68#101#115#116#32#123#10#32#32#84#82#73#71#71#69#82#95#77#69#83+
+  #83#65#71#69#95#68#69#83#84#95#77#69#44#32#47#47#32#48#10#32#32#84#82#73#71+
+  #71#69#82#95#77#69#83#83#65#71#69#95#68#69#83#84#95#77#89#95#84#69#65#77#44+
+  #32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#68+
+  #69#83#84#95#69#78#69#77#89#95#84#69#65#77#44#32#47#47#32#50#10#32#32#84#82+
+  #73#71#71#69#82#95#77#69#83#83#65#71#69#95#68#69#83#84#95#82#69#68#95#84#69+
+  #65#77#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69#82#95#77#69#83#83#65#71+
+  #69#95#68#69#83#84#95#66#76#85#69#95#84#69#65#77#44#32#47#47#32#52#10#32#32+
+  #84#82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#68#69#83#84#95#69#86#69#82+
+  #89#79#78#69#44#32#47#47#32#53#10#125#10#10#101#110#117#109#32#84#114#105+
+  #103#103#101#114#77#101#115#115#97#103#101#75#105#110#100#32#123#10#32#32#84+
+  #82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#75#73#78#68#95#67#72#65#84#44+
+  #32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#75+
+  #73#78#68#95#71#65#77#69#44#32#47#47#32#49#10#125#10#10#98#105#116#115#101+
+  #116#32#65#99#116#105#118#97#116#101#84#121#112#101#32#123#10#32#32#65#67#84+
+  #73#86#65#84#69#95#78#79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#65#67+
+  #84#73#86#65#84#69#95#80#76#65#89#69#82#67#79#76#76#73#68#69#44#32#47#47#32+
+  #49#10#32#32#65#67#84#73#86#65#84#69#95#77#79#78#83#84#69#82#67#79#76#76#73+
+  #68#69#44#32#47#47#32#50#10#32#32#65#67#84#73#86#65#84#69#95#80#76#65#89#69+
+  #82#80#82#69#83#83#44#32#47#47#32#52#10#32#32#65#67#84#73#86#65#84#69#95#77+
+  #79#78#83#84#69#82#80#82#69#83#83#44#32#47#47#32#56#10#32#32#65#67#84#73#86+
+  #65#84#69#95#83#72#79#84#44#32#47#47#32#49#54#10#32#32#65#67#84#73#86#65#84+
+  #69#95#78#79#77#79#78#83#84#69#82#44#32#47#47#32#51#50#10#32#32#65#67#84#73+
+  #86#65#84#69#95#67#85#83#84#79#77#32#61#32#50#53#53#44#32#47#47#32#110#111+
+  #116#101#32#116#104#97#116#32#34#100#105#114#101#99#116#32#97#115#115#105+
+  #103#110#34#32#102#105#101#108#100#32#100#111#101#115#110#39#116#32#97#102+
+  #102#101#99#116#32#98#105#116#32#99#111#117#110#116#101#114#10#125#10#10#98+
+  #105#116#115#101#116#32#75#101#121#32#123#10#32#32#75#69#89#95#78#79#78#69+
+  #32#61#32#48#44#32#47#47#32#48#10#32#32#75#69#89#95#82#69#68#44#32#47#47#32+
+  #49#10#32#32#75#69#89#95#71#82#69#69#78#44#32#47#47#32#50#10#32#32#75#69#89+
+  #95#66#76#85#69#44#32#47#47#32#52#10#32#32#75#69#89#95#82#69#68#84#69#65#77+
+  #44#32#47#47#32#56#10#32#32#75#69#89#95#66#76#85#69#84#69#65#77#44#32#47#47+
+  #32#49#54#10#125#10#10#10#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
   #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+
-  #47#47#47#47#47#47#47#47#47#10#47#47#32#118#97#114#105#111#117#115#32#116+
-  #114#105#103#103#101#114#115#10#84#114#105#103#103#101#114#68#97#116#97#32+
-  #102#111#114#32#84#82#73#71#71#69#82#95#69#88#73#84#32#123#10#32#32#77#97+
-  #112#78#97#109#101#32#105#115#32#34#109#97#112#34#32#116#121#112#101#32#99+
-  #104#97#114#91#49#54#93#32#111#102#102#115#101#116#32#48#59#10#125#10#10#84+
+  #47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47#32#118#97#114#105#111#117+
+  #115#32#116#114#105#103#103#101#114#115#10#84#114#105#103#103#101#114#68#97+
+  #116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#69#88#73#84#32#123#10#32+
+  #32#34#109#97#112#34#32#116#121#112#101#32#99#104#97#114#91#49#54#93#32#111+
+  #102#102#115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+
+  #84#82#73#71#71#69#82#95#84#69#76#69#80#79#82#84#32#123#10#32#32#34#116#97+
+  #114#103#101#116#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102+
+  #115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#100#50#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102+
+  #115#101#116#32#56#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10+
+  #32#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32+
+  #111#102#102#115#101#116#32#57#32#100#101#102#97#117#108#116#32#102#97#108+
+  #115#101#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112+
+  #101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#48#32#101#110+
+  #117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73+
+  #82#95#76#69#70#84#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97+
+  #32#102#111#114#32#40#84#82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32+
+  #84#82#73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#84#82#73#71#71#69+
+  #82#95#68#79#79#82#44#32#84#82#73#71#71#69#82#95#68#79#79#82#53#44#32#84#82+
+  #73#71#71#69#82#95#67#76#79#83#69#84#82#65#80#44#32#84#82#73#71#71#69#82#95+
+  #84#82#65#80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#84#82#73+
+  #71#71#69#82#95#76#73#70#84#68#79#87#78#44#32#84#82#73#71#71#69#82#95#76#73+
+  #70#84#41#32#123#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121#112+
+  #101#32#105#110#116#32#111#102#102#115#101#116#32#48#32#112#97#110#101#108+
+  #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#105+
+  #108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+
+  #101#116#32#52#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32+
+  #32#34#100#50#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+
+  #101#116#32#53#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#125+
+  #10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#40#84#82#73+
+  #71#71#69#82#95#80#82#69#83#83#44#32#84#82#73#71#71#69#82#95#79#78#44#32#84+
+  #82#73#71#71#69#82#95#79#70#70#44#32#84#82#73#71#71#69#82#95#79#78#79#70#70+
+  #41#32#123#10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101+
+  #32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#116+
+  #120#121#32#100#101#102#97#117#108#116#32#40#48#32#48#41#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#115#105#122#101#34#32#116#121+
+  #112#101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32+
+  #116#119#104#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#34+
+  #119#97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
+  #102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34+
+  #99#111#117#110#116#34#32#97#108#105#97#115#32#112#114#101#115#115#67#111+
+  #117#110#116#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+
+  #115#101#116#32#49#52#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34#109+
+  #111#110#115#116#101#114#105#100#34#32#116#121#112#101#32#105#110#116#32#111+
+  #102#102#115#101#116#32#49#54#32#109#111#110#115#116#101#114#32#97#115#32+
+  #109#111#110#115#116#101#114#105#100#32#100#101#102#97#117#108#116#32#110+
+  #117#108#108#59#10#32#32#34#101#120#116#95#114#97#110#100#111#109#34#32#116+
+  #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#50#48#32#100+
+  #101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32#47#47#32#116#104+
+  #105#115#32#111#110#101#32#105#115#32#102#111#114#32#109#111#118#105#110#103+
+  #32#112#108#97#116#102#111#114#109#115#10#32#32#34#112#97#110#101#108#105+
+  #100#34#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110#117#108+
+  #108#59#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#83#99#111+
+  #114#101#84#101#97#109#32#123#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82+
+  #69#95#84#69#65#77#95#77#73#78#69#95#82#69#68#44#32#47#47#32#48#10#32#32#84+
+  #82#73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#77#73#78#69#95#66#76+
+  #85#69#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95+
+  #84#69#65#77#95#70#79#82#67#69#95#82#69#68#44#32#47#47#32#50#10#32#32#84#82+
+  #73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#70#79#82#67#69#95#66#76+
+  #85#69#44#32#47#47#32#51#10#125#10#10#84#114#105#103#103#101#114#68#97#116+
+  #97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#69#67#82#69#84#32#123#10+
+  #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+
+  #73#71#71#69#82#95#84#69#88#84#85#82#69#32#123#10#32#32#34#97#99#116#105#118+
+  #97#116#101#95#111#110#99#101#34#32#116#121#112#101#32#98#111#111#108#32#111+
+  #102#102#115#101#116#32#48#32#100#101#102#97#117#108#116#32#102#97#108#115+
+  #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#97#110+
+  #105#109#97#116#101#95#111#110#99#101#34#32#116#121#112#101#32#98#111#111+
+  #108#32#111#102#102#115#101#116#32#49#32#100#101#102#97#117#108#116#32#102+
+  #97#108#115#101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125+
+  #10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71+
+  #71#69#82#95#83#79#85#78#68#32#123#10#32#32#34#115#111#117#110#100#95#110#97+
+  #109#101#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93#32#111#102#102+
+  #115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#118#111#108#117#109#101#34#32#116#121#112#101#32#117#98#121#116+
+  #101#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97#117#108#116#32#48+
+  #32#119#114#105#116#101#100#101#102#97#117#108#116#59#32#47#47#63#63#63#32+
+  #100#101#102#97#117#108#116#32#63#63#63#10#32#32#34#112#97#110#34#32#116#121+
+  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#53#32#100+
+  #101#102#97#117#108#116#32#48#59#10#32#32#34#108#111#99#97#108#34#32#116#121+
+  #112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#54#54#32#100#101+
+  #102#97#117#108#116#32#116#114#117#101#59#32#47#47#63#63#63#32#100#101#102+
+  #97#117#108#116#32#63#63#63#10#32#32#34#112#108#97#121#95#99#111#117#110#116+
+  #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
+  #54#55#32#100#101#102#97#117#108#116#32#49#59#10#32#32#34#115#111#117#110+
+  #100#95#115#119#105#116#99#104#34#32#116#121#112#101#32#98#111#111#108#32+
+  #111#102#102#115#101#116#32#54#56#32#100#101#102#97#117#108#116#32#102#97+
+  #108#115#101#59#32#47#47#63#63#63#32#100#101#102#97#117#108#116#32#63#63#63+
+  #10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84+
+  #82#73#71#71#69#82#95#83#80#65#87#78#77#79#78#83#84#69#82#32#123#10#32#32#34+
+  #112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110+
+  #116#32#111#102#102#115#101#116#32#48#32#97#115#32#116#120#121#32#119#114+
+  #105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32+
+  #97#108#105#97#115#32#115#112#97#119#110#77#111#110#115#84#121#112#101#32+
+  #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32+
+  #101#110#117#109#32#77#111#110#115#116#101#114#32#100#101#102#97#117#108#116+
+  #32#77#79#78#83#84#69#82#95#73#77#80#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#104#101#97#108#116#104#34#32#116#121#112#101#32+
+  #105#110#116#32#111#102#102#115#101#116#32#49#50#32#119#114#105#116#101#100+
+  #101#102#97#117#108#116#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34+
+  #32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49+
+  #54#32#101#110#117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117+
+  #108#116#32#68#73#82#95#76#69#70#84#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#97#99#116#105#118#101#34#32#116#121#112#101#32+
+  #98#111#111#108#32#111#102#102#115#101#116#32#49#55#32#100#101#102#97#117+
+  #108#116#32#116#114#117#101#59#10#32#32#34#99#111#117#110#116#34#32#97#108+
+  #105#97#115#32#109#111#110#115#67#111#117#110#116#32#116#121#112#101#32#105+
+  #110#116#32#111#102#102#115#101#116#32#50#48#32#100#101#102#97#117#108#116+
+  #32#49#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#101+
+  #102#102#101#99#116#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
+  #102#115#101#116#32#50#52#32#101#110#117#109#32#69#102#102#101#99#116#65#99+
+  #116#105#111#110#32#100#101#102#97#117#108#116#32#69#70#70#69#67#84#95#78#79+
+  #78#69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#109+
+  #97#120#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
+  #101#116#32#50#54#32#100#101#102#97#117#108#116#32#49#32#119#114#105#116#101+
+  #100#101#102#97#117#108#116#59#10#32#32#34#100#101#108#97#121#34#32#116#121+
+  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#56#32+
+  #100#101#102#97#117#108#116#32#49#48#48#48#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#98#101#104#97#118#105#111#117#114#34#32+
+  #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#51#48+
+  #32#101#110#117#109#32#77#111#110#115#116#101#114#66#101#104#97#118#105#111+
+  #117#114#32#100#101#102#97#117#108#116#32#66#72#95#78#79#82#77#65#76#59#10+
+  #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+
+  #73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#32#123#10#32#32#34#112#111#115+
+  #105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102+
+  #102#115#101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116#101#100+
+  #101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105#97+
+  #115#32#115#112#97#119#110#73#116#101#109#84#121#112#101#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109+
+  #32#73#116#101#109#32#100#101#102#97#117#108#116#32#73#84#69#77#95#78#79#78+
+  #69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#103#114+
+  #97#118#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102+
+  #115#101#116#32#57#32#100#101#102#97#117#108#116#32#116#114#117#101#59#10#32+
+  #32#34#100#109#111#110#108#121#34#32#116#121#112#101#32#98#111#111#108#32+
+  #111#102#102#115#101#116#32#49#48#32#100#101#102#97#117#108#116#32#102#97+
+  #108#115#101#59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97#115#32+
+  #105#116#101#109#67#111#117#110#116#32#116#121#112#101#32#105#110#116#32#111+
+  #102#102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#49#59#10#32+
+  #32#34#101#102#102#101#99#116#34#32#116#121#112#101#32#117#98#121#116#101#32+
+  #111#102#102#115#101#116#32#49#54#32#101#110#117#109#32#69#102#102#101#99+
+  #116#65#99#116#105#111#110#32#100#101#102#97#117#108#116#32#69#70#70#69#67+
+  #84#95#78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#109#97#120#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111+
+  #102#102#115#101#116#32#49#56#32#100#101#102#97#117#108#116#32#49#59#10#32+
+  #32#34#100#101#108#97#121#34#32#116#121#112#101#32#117#115#104#111#114#116+
+  #32#111#102#102#115#101#116#32#50#48#32#100#101#102#97#117#108#116#32#49#48+
+  #48#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+
   #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+
-  #95#84#69#76#69#80#79#82#84#32#123#10#32#32#84#97#114#103#101#116#80#111#105+
-  #110#116#32#105#115#32#34#116#97#114#103#101#116#34#32#116#121#112#101#32+
-  #112#111#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32#32#100#50#100+
-  #95#116#101#108#101#112#111#114#116#32#105#115#32#34#100#50#100#34#32#116+
-  #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#56#32#100#101+
-  #102#97#117#108#116#32#102#97#108#115#101#32#111#109#105#116#100#101#102#97+
-  #117#108#116#59#10#32#32#115#105#108#101#110#116#95#116#101#108#101#112#111+
-  #114#116#32#105#115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32+
-  #98#111#111#108#32#111#102#102#115#101#116#32#57#32#100#101#102#97#117#108+
-  #116#32#102#97#108#115#101#32#111#109#105#116#100#101#102#97#117#108#116#59+
-  #10#32#32#84#108#112#68#105#114#32#105#115#32#34#100#105#114#101#99#116#105+
-  #111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101+
-  #116#32#49#48#32#101#110#117#109#32#68#105#114#84#121#112#101#32#100#101#102+
-  #97#117#108#116#32#68#73#82#95#76#69#70#84#32#111#109#105#116#100#101#102#97+
-  #117#108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
-  #111#114#32#40#84#82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32#84#82+
-  #73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#84#82#73#71#71#69#82#95+
-  #68#79#79#82#44#32#84#82#73#71#71#69#82#95#68#79#79#82#53#44#32#84#82#73#71+
-  #71#69#82#95#67#76#79#83#69#84#82#65#80#44#32#84#82#73#71#71#69#82#95#84#82+
-  #65#80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#84#82#73#71#71+
-  #69#82#95#76#73#70#84#68#79#87#78#44#32#84#82#73#71#71#69#82#95#76#73#70#84+
-  #41#32#123#10#32#32#80#97#110#101#108#73#68#32#105#115#32#34#112#97#110#101+
-  #108#105#100#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116+
-  #32#48#32#112#97#110#101#108#59#10#32#32#78#111#83#111#117#110#100#32#105+
-  #115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108+
-  #32#111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116#32#102#97+
-  #108#115#101#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#100+
-  #50#100#95#100#111#111#114#115#32#105#115#32#34#100#50#100#34#32#116#121#112+
-  #101#32#98#111#111#108#32#111#102#102#115#101#116#32#53#32#100#101#102#97+
-  #117#108#116#32#102#97#108#115#101#32#111#109#105#116#100#101#102#97#117#108+
-  #116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114+
-  #32#40#84#82#73#71#71#69#82#95#80#82#69#83#83#44#32#84#82#73#71#71#69#82#95+
-  #79#78#44#32#84#82#73#71#71#69#82#95#79#70#70#44#32#84#82#73#71#71#69#82#95+
-  #79#78#79#70#70#41#32#123#10#32#32#47#47#116#88#32#105#115#32#34#116#120#34+
-  #32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32+
-  #32#47#47#116#89#32#105#115#32#34#116#121#34#32#116#121#112#101#32#105#110+
-  #116#32#111#102#102#115#101#116#32#52#59#10#32#32#80#111#115#32#105#115#32+
-  #34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110+
-  #116#32#111#102#102#115#101#116#32#48#32#97#115#32#116#120#121#32#100#101+
-  #102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#47#47#116#87#105#100#116+
-  #104#32#105#115#32#34#119#105#100#116#104#34#32#116#121#112#101#32#117#115+
-  #104#111#114#116#32#111#102#102#115#101#116#32#56#59#10#32#32#47#47#116#72+
-  #101#105#103#104#116#32#105#115#32#34#104#101#105#103#104#116#34#32#116#121+
-  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#48#59+
-  #10#32#32#83#105#122#101#32#105#115#32#34#115#105#122#101#34#32#116#121#112+
-  #101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32#116+
-  #119#104#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#87#97+
-  #105#116#32#105#115#32#34#119#97#105#116#34#32#116#121#112#101#32#117#115+
-  #104#111#114#116#32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117+
-  #108#116#32#48#59#10#32#32#67#111#117#110#116#32#105#115#32#34#99#111#117+
-  #110#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
-  #101#116#32#49#52#32#100#101#102#97#117#108#116#32#48#59#10#32#32#77#111#110+
-  #115#116#101#114#73#68#32#105#115#32#34#109#111#110#115#116#101#114#105#100+
-  #34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#49#54#32+
-  #109#111#110#115#116#101#114#32#97#115#32#109#111#110#115#116#101#114#105+
-  #100#32#100#101#102#97#117#108#116#32#110#117#108#108#59#10#32#32#69#120#116+
-  #82#97#110#100#111#109#32#105#115#32#34#101#120#116#114#97#110#100#111#109+
-  #34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#50#48+
-  #32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32#47#47#32+
-  #116#104#105#115#32#111#110#101#32#105#115#32#102#111#114#32#109#111#118#105+
-  #110#103#32#112#108#97#116#102#111#114#109#115#10#32#32#80#97#110#101#108#73+
-  #100#32#105#115#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32+
-  #105#110#116#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110#117+
-  #108#108#32#111#109#105#116#100#101#102#97#117#108#116#59#10#125#10#10#84+
+  #95#77#85#83#73#67#32#123#10#32#32#34#110#97#109#101#34#32#97#108#105#97#115+
+  #32#109#117#115#105#99#78#97#109#101#32#116#121#112#101#32#99#104#97#114#91+
+  #54#52#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#97#99#116#105#111#110#34#32#97#108#105#97+
+  #115#32#109#117#115#105#99#65#99#116#105#111#110#32#116#121#112#101#32#117+
+  #98#121#116#101#32#111#102#102#115#101#116#32#54#52#32#101#110#117#109#32#84+
+  #114#105#103#103#101#114#77#117#115#105#99#65#99#116#105#111#110#32#119#114+
+  #105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84#114#105#103#103+
+  #101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#80#85#83#72+
+  #32#123#10#32#32#34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104+
+  #111#114#116#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#102#111#114#99#101#34#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#114#101#115#101#116#95#118+
+  #101#108#111#99#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32#111+
+  #102#102#115#101#116#32#51#32#100#101#102#97#117#108#116#32#102#97#108#115+
+  #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+
   #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+
-  #95#83#69#67#82#69#84#32#123#10#125#10#10#84#114#105#103#103#101#114#68#97+
-  #116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#32+
-  #123#10#32#32#65#99#116#105#118#97#116#101#79#110#99#101#32#105#115#32#34#97+
-  #99#116#105#118#97#116#101#111#110#99#101#34#32#116#121#112#101#32#98#111+
-  #111#108#32#111#102#102#115#101#116#32#48#59#10#32#32#65#110#105#109#79#110+
-  #99#101#32#105#115#32#34#97#110#105#109#97#116#101#111#110#99#101#34#32#116+
-  #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#59#10#125#10+
-  #10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71+
-  #69#82#95#83#79#85#78#68#32#123#10#32#32#83#111#117#110#100#78#97#109#101#32+
-  #105#115#32#34#115#111#117#110#100#110#97#109#101#34#32#116#121#112#101#32+
-  #99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48#59#10#32#32#86+
-  #111#108#117#109#101#32#105#115#32#34#118#111#108#117#109#101#34#32#116#121+
-  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#52#59#10#32+
-  #32#80#97#110#32#105#115#32#34#112#97#110#34#32#116#121#112#101#32#117#98+
-  #121#116#101#32#111#102#102#115#101#116#32#54#53#59#10#32#32#76#111#99#97+
-  #108#32#105#115#32#34#108#111#99#97#108#34#32#116#121#112#101#32#98#111#111+
-  #108#32#111#102#102#115#101#116#32#54#54#59#10#32#32#80#108#97#121#67#111+
-  #117#110#116#32#105#115#32#34#112#108#97#121#99#111#117#110#116#34#32#116+
-  #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#55#59#10+
-  #32#32#83#111#117#110#100#83#119#105#116#99#104#32#105#115#32#34#115#111#117+
-  #110#100#115#119#105#116#99#104#34#32#116#121#112#101#32#98#111#111#108#32+
-  #111#102#102#115#101#116#32#54#56#59#10#125#10#10#84#114#105#103#103#101#114+
-  #68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#77#79+
-  #78#83#84#69#82#32#123#10#32#32#77#111#110#80#111#115#32#105#115#32#34#112+
-  #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+
-  #111#102#102#115#101#116#32#48#59#10#32#32#77#111#110#84#121#112#101#32#105+
-  #115#32#34#116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32+
-  #111#102#102#115#101#116#32#56#59#10#32#32#77#111#110#72#101#97#108#116#104+
-  #32#105#115#32#34#104#101#97#108#116#104#34#32#116#121#112#101#32#105#110+
-  #116#32#111#102#102#115#101#116#32#49#50#59#10#32#32#77#111#110#68#105#114+
-  #32#105#115#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101+
-  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#32#101#110#117+
-  #109#32#68#105#114#84#121#112#101#59#10#32#32#77#111#110#65#99#116#105#118+
-  #101#32#105#115#32#34#97#99#116#105#118#101#34#32#116#121#112#101#32#98#111+
-  #111#108#32#111#102#102#115#101#116#32#49#55#59#10#32#32#77#111#110#67#111+
-  #117#110#116#32#105#115#32#34#99#111#117#110#116#34#32#116#121#112#101#32+
-  #105#110#116#32#111#102#102#115#101#116#32#50#48#59#10#32#32#77#111#110#69+
-  #102#102#101#99#116#32#105#115#32#34#101#102#102#101#99#116#34#32#116#121+
-  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#52#59#10#32+
-  #32#77#111#110#77#97#120#32#105#115#32#34#109#97#120#34#32#116#121#112#101+
-  #32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#54#59#10#32#32+
-  #77#111#110#68#101#108#97#121#32#105#115#32#34#100#101#108#97#121#34#32#116+
-  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#56+
-  #59#10#32#32#77#111#110#66#101#104#97#118#32#105#115#32#34#98#101#104#97#118+
-  #105#111#117#114#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#51#48#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116+
-  #97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#32+
-  #123#10#32#32#73#116#101#109#80#111#115#32#105#115#32#34#112#111#115#105#116+
-  #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+
-  #101#116#32#48#59#10#32#32#73#116#101#109#84#121#112#101#32#105#115#32#34+
-  #116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#56#59#10#32#32#73#116#101#109#70#97#108#108#115#32#105#115+
-  #32#34#103#114#97#118#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32+
-  #111#102#102#115#101#116#32#57#59#10#32#32#73#116#101#109#79#110#108#121#68+
-  #77#32#105#115#32#34#100#109#111#110#108#121#34#32#116#121#112#101#32#98#111+
-  #111#108#32#111#102#102#115#101#116#32#49#48#59#10#32#32#73#116#101#109#67+
-  #111#117#110#116#32#105#115#32#34#99#111#117#110#116#34#32#116#121#112#101+
-  #32#105#110#116#32#111#102#102#115#101#116#32#49#50#59#10#32#32#73#116#101+
-  #109#69#102#102#101#99#116#32#105#115#32#34#101#102#102#101#99#116#34#32#116+
-  #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#59#10+
-  #32#32#73#116#101#109#77#97#120#32#105#115#32#34#109#97#120#34#32#116#121+
-  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#56#59+
-  #10#32#32#73#116#101#109#68#101#108#97#121#32#105#115#32#34#100#101#108#97+
-  #121#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101+
-  #116#32#50#48#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
-  #111#114#32#84#82#73#71#71#69#82#95#77#85#83#73#67#32#123#10#32#32#77#117+
-  #115#105#99#78#97#109#101#32#105#115#32#34#110#97#109#101#34#32#116#121#112+
-  #101#32#99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48#59#10#32+
-  #32#77#117#115#105#99#65#99#116#105#111#110#32#105#115#32#34#97#99#116#105+
-  #111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101+
-  #116#32#54#52#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+
-  #111#114#32#84#82#73#71#71#69#82#95#80#85#83#72#32#123#10#32#32#80#117#115+
-  #104#65#110#103#108#101#32#105#115#32#34#97#110#103#108#101#34#32#116#121+
-  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#48#59#10+
-  #32#32#80#117#115#104#70#111#114#99#101#32#105#115#32#34#102#111#114#99#101+
-  #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
-  #50#59#10#32#32#82#101#115#101#116#86#101#108#32#105#115#32#34#114#101#115+
-  #101#116#118#101#108#111#99#105#116#121#34#32#116#121#112#101#32#98#111#111+
-  #108#32#111#102#102#115#101#116#32#51#59#10#125#10#10#84#114#105#103#103#101+
-  #114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#67#79#82#69+
-  #32#123#10#32#32#83#99#111#114#101#65#99#116#105#111#110#32#105#115#32#34#97+
-  #99#116#105#111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
-  #102#115#101#116#32#48#59#10#32#32#83#99#111#114#101#67#111#117#110#116#32+
-  #105#115#32#34#99#111#117#110#116#34#32#116#121#112#101#32#117#98#121#116+
-  #101#32#111#102#102#115#101#116#32#49#59#10#32#32#83#99#111#114#101#84#101+
-  #97#109#32#105#115#32#34#116#101#97#109#34#32#116#121#112#101#32#117#98#121+
-  #116#101#32#111#102#102#115#101#116#32#50#59#10#32#32#83#99#111#114#101#67+
-  #111#110#32#105#115#32#34#99#111#110#115#111#108#101#34#32#116#121#112#101+
-  #32#98#111#111#108#32#111#102#102#115#101#116#32#51#59#10#32#32#83#99#111+
-  #114#101#77#115#103#32#105#115#32#34#109#101#115#115#97#103#101#34#32#116+
-  #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#52#59#10#125#10+
-  #10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71+
-  #69#82#95#77#69#83#83#65#71#69#32#123#10#32#32#77#101#115#115#97#103#101#75+
-  #105#110#100#32#105#115#32#34#107#105#110#100#34#32#116#121#112#101#32#117+
-  #98#121#116#101#32#111#102#102#115#101#116#32#48#59#10#32#32#77#101#115#115+
-  #97#103#101#83#101#110#100#84#111#32#105#115#32#34#115#101#110#100#116#111+
-  #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+
-  #49#59#10#32#32#77#101#115#115#97#103#101#84#101#120#116#32#105#115#32#34+
-  #116#101#120#116#34#32#116#121#112#101#32#99#104#97#114#91#49#48#48#93#32+
-  #111#102#102#115#101#116#32#50#59#10#32#32#77#101#115#115#97#103#101#84#105+
-  #109#101#32#105#115#32#34#116#105#109#101#34#32#116#121#112#101#32#117#115+
-  #104#111#114#116#32#111#102#102#115#101#116#32#49#48#50#59#10#125#10#10#84+
+  #95#83#67#79#82#69#32#123#10#32#32#34#97#99#116#105#111#110#34#32#97#108#105+
+  #97#115#32#115#99#111#114#101#65#99#116#105#111#110#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#101#110#117#109#32+
+  #84#114#105#103#103#101#114#83#99#111#114#101#65#99#116#105#111#110#32#100+
+  #101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65#67+
+  #84#73#79#78#95#65#68#68#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97#115#32#115#99#111#114+
+  #101#67#111#117#110#116#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
+  #102#115#101#116#32#49#32#100#101#102#97#117#108#116#32#49#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#101#97#109#34#32#97+
+  #108#105#97#115#32#115#99#111#114#101#84#101#97#109#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#101#110#117#109#32+
+  #84#114#105#103#103#101#114#83#99#111#114#101#84#101#97#109#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#99#111#110#115#111#108+
+  #101#34#32#97#108#105#97#115#32#115#99#111#114#101#67#111#110#32#116#121#112+
+  #101#32#98#111#111#108#32#111#102#102#115#101#116#32#51#32#100#101#102#97+
+  #117#108#116#32#102#97#108#115#101#32#119#114#105#116#101#100#101#102#97#117+
+  #108#116#59#10#32#32#34#109#101#115#115#97#103#101#34#32#97#108#105#97#115+
+  #32#115#99#111#114#101#77#115#103#32#116#121#112#101#32#98#111#111#108#32+
+  #111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116#32#116#114#117+
+  #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+
   #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+
-  #95#68#65#77#65#71#69#32#123#10#32#32#68#97#109#97#103#101#86#97#108#117#101+
-  #32#105#115#32#34#97#109#111#117#110#116#34#32#116#121#112#101#32#117#115+
-  #104#111#114#116#32#111#102#102#115#101#116#32#48#59#10#32#32#68#97#109#97+
-  #103#101#73#110#116#101#114#118#97#108#32#105#115#32#34#105#110#116#101#114+
-  #118#97#108#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+
-  #115#101#116#32#50#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97+
-  #32#102#111#114#32#84#82#73#71#71#69#82#95#72#69#65#76#84#72#32#123#10#32#32+
-  #72#101#97#108#86#97#108#117#101#32#105#115#32#34#97#109#111#117#110#116#34+
-  #32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32+
-  #48#59#10#32#32#72#101#97#108#73#110#116#101#114#118#97#108#32#105#115#32#34+
-  #105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117#115#104#111#114+
-  #116#32#111#102#102#115#101#116#32#50#59#10#32#32#72#101#97#108#77#97#120#32+
-  #105#115#32#34#109#97#120#34#32#116#121#112#101#32#98#111#111#108#32#111#102+
-  #102#115#101#116#32#52#59#10#32#32#72#101#97#108#83#105#108#101#110#116#32+
-  #105#115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111+
-  #108#32#111#102#102#115#101#116#32#53#59#10#125#10#10#84#114#105#103#103#101+
-  #114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#72#79#84#32+
-  #123#10#32#32#83#104#111#116#80#111#115#32#105#115#32#34#112#111#115#105#116+
+  #95#77#69#83#83#65#71#69#32#123#10#32#32#34#107#105#110#100#34#32#116#121+
+  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#101#110+
+  #117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103#101#75#105#110+
+  #100#32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#77#69#83#83#65+
+  #71#69#95#75#73#78#68#95#71#65#77#69#32#119#114#105#116#101#100#101#102#97+
+  #117#108#116#59#10#32#32#34#100#101#115#116#34#32#97#108#105#97#115#32#109+
+  #115#103#68#101#115#116#32#116#121#112#101#32#117#98#121#116#101#32#101#110+
+  #117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103#101#68#101#115+
+  #116#32#111#102#102#115#101#116#32#49#59#10#32#32#34#116#101#120#116#34#32+
+  #116#121#112#101#32#99#104#97#114#91#49#48#48#93#32#111#102#102#115#101#116+
+  #32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116+
+  #105#109#101#34#32#97#108#105#97#115#32#109#115#103#84#105#109#101#32#116+
+  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#48+
+  #50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84#114+
+  #105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95+
+  #68#65#77#65#71#69#32#123#10#32#32#34#97#109#111#117#110#116#34#32#116#121+
+  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#48#32#119+
+  #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#105#110#116#101+
+  #114#118#97#108#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
+  #102#115#101#116#32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59+
+  #10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84+
+  #82#73#71#71#69#82#95#72#69#65#76#84#72#32#123#10#32#32#34#97#109#111#117+
+  #110#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
+  #101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
+  #34#105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117#115#104#111+
+  #114#116#32#111#102#102#115#101#116#32#50#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#109#97#120#34#32#97#108#105#97#115#32#104#101+
+  #97#108#77#97#120#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+
+  #101#116#32#52#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
+  #34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111+
+  #102#102#115#101#116#32#53#32#119#114#105#116#101#100#101#102#97#117#108#116+
+  #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+
+  #84#82#73#71#71#69#82#95#83#72#79#84#32#123#10#32#32#34#112#111#115#105#116+
   #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+
-  #101#116#32#48#59#10#32#32#83#104#111#116#84#121#112#101#32#105#115#32#34+
-  #116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
-  #115#101#116#32#56#32#101#110#117#109#32#84#114#105#103#103#101#114#83#104+
-  #111#116#59#10#32#32#83#104#111#116#84#97#114#103#101#116#32#105#115#32#34+
-  #116#97#114#103#101#116#34#32#116#121#112#101#32#117#98#121#116#101#32#111+
-  #102#102#115#101#116#32#57#32#101#110#117#109#32#84#114#105#103#103#101#114+
-  #83#104#111#116#84#97#114#103#101#116#59#10#32#32#83#104#111#116#83#111#117+
-  #110#100#32#105#115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32+
-  #110#101#103#98#111#111#108#32#111#102#102#115#101#116#32#49#48#59#32#47#47+
-  #32#110#101#103#98#111#111#108#33#10#32#32#83#104#111#116#65#105#109#32#105+
-  #115#32#34#97#105#109#34#32#116#121#112#101#32#98#121#116#101#32#111#102#102+
-  #115#101#116#32#49#49#59#10#32#32#83#104#111#116#80#97#110#101#108#73#68#32+
-  #105#115#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32#105#110+
-  #116#32#111#102#102#115#101#116#32#49#50#59#10#32#32#83#104#111#116#73#110+
-  #116#83#105#103#104#116#32#105#115#32#34#115#105#103#104#116#34#32#116#121+
-  #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#54#59+
-  #10#32#32#83#104#111#116#65#110#103#108#101#32#105#115#32#34#97#110#103#108+
-  #101#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101+
-  #116#32#49#56#59#10#32#32#83#104#111#116#87#97#105#116#32#105#115#32#34#119+
-  #97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+
-  #115#101#116#32#50#48#59#10#32#32#83#104#111#116#65#99#99#117#114#97#99#121+
-  #32#105#115#32#34#97#99#99#117#114#97#99#121#34#32#116#121#112#101#32#117+
-  #115#104#111#114#116#32#111#102#102#115#101#116#32#50#50#59#10#32#32#83#104+
-  #111#116#65#109#109#111#32#105#115#32#34#97#109#109#111#34#32#116#121#112+
-  #101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#52#59#10#32+
-  #32#83#104#111#116#73#110#116#82#101#108#111#97#100#32#105#115#32#34#114#101+
-  #108#111#97#100#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+
-  #102#115#101#116#32#50#54#59#10#125#10#10#84#114#105#103#103#101#114#68#97+
-  #116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#32#123+
-  #10#32#32#70#88#67#111#117#110#116#32#105#115#32#34#99#111#117#110#116#34#32+
-  #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#59+
-  #10#32#32#70#88#84#121#112#101#32#105#115#32#34#116#121#112#101#34#32#116+
-  #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#59#10#32+
-  #32#70#88#83#117#98#84#121#112#101#32#105#115#32#34#115#117#98#116#121#112+
-  #101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+
-  #32#50#59#10#32#32#70#88#67#111#108#111#114#82#32#105#115#32#34#99#111#108+
-  #111#114#114#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115+
-  #101#116#32#51#59#10#32#32#70#88#67#111#108#111#114#71#32#105#115#32#34#99+
-  #111#108#111#114#103#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
-  #102#115#101#116#32#52#59#10#32#32#70#88#67#111#108#111#114#66#32#105#115#32+
-  #34#99#111#108#111#114#98#34#32#116#121#112#101#32#117#98#121#116#101#32#111+
-  #102#102#115#101#116#32#53#59#10#32#32#70#88#80#111#115#32#105#115#32#34#112+
-  #111#115#105#116#105#111#110#34#32#116#121#112#101#32#117#98#121#116#101#32+
-  #111#102#102#115#101#116#32#54#59#10#32#32#70#88#87#97#105#116#32#105#115#32+
-  #34#119#97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111+
-  #102#102#115#101#116#32#56#59#10#32#32#70#88#86#101#108#88#32#105#115#32#34+
-  #118#101#108#120#34#32#116#121#112#101#32#98#121#116#101#32#111#102#102#115+
-  #101#116#32#49#48#59#10#32#32#70#88#86#101#108#89#32#105#115#32#34#118#101+
-  #108#121#34#32#116#121#112#101#32#98#121#116#101#32#111#102#102#115#101#116+
-  #32#49#49#59#10#32#32#70#88#83#112#114#101#97#100#76#32#105#115#32#34#115+
-  #112#114#101#97#100#108#34#32#116#121#112#101#32#117#98#121#116#101#32#111+
-  #102#102#115#101#116#32#49#50#59#10#32#32#70#88#83#112#114#101#97#100#82#32+
-  #105#115#32#34#115#112#114#101#97#100#114#34#32#116#121#112#101#32#117#98+
-  #121#116#101#32#111#102#102#115#101#116#32#49#51#59#10#32#32#70#88#83#112+
-  #114#101#97#100#85#32#105#115#32#34#115#112#114#101#97#100#117#34#32#116#121+
-  #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#52#59#10#32+
-  #32#70#88#83#112#114#101#97#100#68#32#105#115#32#34#115#112#114#101#97#100+
-  #100#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+
-  #32#49#53#59#10#125#10
+  #101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116#101#100#101#102+
+  #97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105#97#115#32+
+  #115#104#111#116#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32+
+  #111#102#102#115#101#116#32#56#32#101#110#117#109#32#84#114#105#103#103#101+
+  #114#83#104#111#116#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+
+  #32#32#34#116#97#114#103#101#116#34#32#97#108#105#97#115#32#115#104#111#116+
+  #84#97#114#103#101#116#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
+  #102#115#101#116#32#57#32#101#110#117#109#32#84#114#105#103#103#101#114#83+
+  #104#111#116#84#97#114#103#101#116#32#119#114#105#116#101#100#101#102#97#117+
+  #108#116#59#10#32#32#34#113#117#105#101#116#34#32#116#121#112#101#32#110#101+
+  #103#98#111#111#108#32#111#102#102#115#101#116#32#49#48#59#32#47#47#32#110+
+  #101#103#98#111#111#108#33#10#32#32#34#97#105#109#34#32#116#121#112#101#32+
+  #98#121#116#101#32#111#102#102#115#101#116#32#49#49#32#101#110#117#109#32#84+
+  #114#105#103#103#101#114#83#104#111#116#65#105#109#32#100#101#102#97#117#108+
+  #116#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#68#69#70#65#85#76+
+  #84#59#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32#105+
+  #110#116#32#111#102#102#115#101#116#32#49#50#32#112#97#110#101#108#32#100+
+  #101#102#97#117#108#116#32#110#117#108#108#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#115#105#103#104#116#34#32#116#121#112#101+
+  #32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#54#59#10#32#32+
+  #34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104#111#114#116#32+
+  #111#102#102#115#101#116#32#49#56#59#10#32#32#34#119#97#105#116#34#32#116+
+  #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#48+
+  #59#10#32#32#34#97#99#99#117#114#97#99#121#34#32#116#121#112#101#32#117#115+
+  #104#111#114#116#32#111#102#102#115#101#116#32#50#50#59#10#32#32#34#97#109+
+  #109#111#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+
+  #101#116#32#50#52#59#10#32#32#34#114#101#108#111#97#100#34#32#116#121#112+
+  #101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#54#59#10+
+  #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+
+  #73#71#71#69#82#95#69#70#70#69#67#84#32#123#10#32#32#34#99#111#117#110#116+
+  #34#32#97#108#105#97#115#32#70#88#67#111#117#110#116#32#116#121#112#101#32+
+  #117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101+
+  #100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105+
+  #97#115#32#70#88#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32+
+  #111#102#102#115#101#116#32#49#32#101#110#117#109#32#84#114#105#103#103#101+
+  #114#69#102#102#101#99#116#32#100#101#102#97#117#108#116#32#84#82#73#71#71+
+  #69#82#95#69#70#70#69#67#84#95#80#65#82#84#73#67#76#69#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#115#117#98#116#121#112#101#34+
+  #32#97#108#105#97#115#32#70#88#83#117#98#84#121#112#101#32#116#121#112#101+
+  #32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#101#110#117#109+
+  #32#84#114#105#103#103#101#114#69#102#102#101#99#116#84#121#112#101#32#100+
+  #101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#83+
+  #80#65#82#75#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+
+  #34#114#101#100#34#32#97#108#105#97#115#32#70#88#82#101#100#32#116#121#112+
+  #101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#51#32#119#114#105+
+  #116#101#100#101#102#97#117#108#116#59#10#32#32#34#103#114#101#101#110#34#32+
+  #97#108#105#97#115#32#70#88#71#114#101#101#110#32#116#121#112#101#32#117#98+
+  #121#116#101#32#111#102#102#115#101#116#32#52#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#98#108#117#101#34#32#97#108#105#97#115#32+
+  #70#88#66#108#117#101#32#116#121#112#101#32#117#98#121#116#101#32#111#102+
+  #102#115#101#116#32#53#32#119#114#105#116#101#100#101#102#97#117#108#116#59+
+  #10#32#32#34#112#111#115#34#32#97#108#105#97#115#32#70#88#80#111#115#32#116+
+  #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#32#101+
+  #110#117#109#32#84#114#105#103#103#101#114#69#102#102#101#99#116#80#111#115+
+  #32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84+
+  #95#80#79#83#95#67#69#78#84#69#82#32#119#114#105#116#101#100#101#102#97#117+
+  #108#116#59#10#32#32#34#119#97#105#116#34#32#116#121#112#101#32#117#115#104+
+  #111#114#116#32#111#102#102#115#101#116#32#56#32#119#114#105#116#101#100#101+
+  #102#97#117#108#116#59#10#32#32#34#118#101#108#95#120#34#32#116#121#112#101+
+  #32#98#121#116#101#32#111#102#102#115#101#116#32#49#48#32#119#114#105#116+
+  #101#100#101#102#97#117#108#116#59#10#32#32#34#118#101#108#95#121#34#32#116+
+  #121#112#101#32#98#121#116#101#32#111#102#102#115#101#116#32#49#49#32#119+
+  #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#112#114#101+
+  #97#100#95#108#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+
+  #115#101#116#32#49#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59+
+  #10#32#32#34#115#112#114#101#97#100#95#114#34#32#116#121#112#101#32#117#98+
+  #121#116#101#32#111#102#102#115#101#116#32#49#51#32#119#114#105#116#101#100+
+  #101#102#97#117#108#116#59#10#32#32#34#115#112#114#101#97#100#95#117#34#32+
+  #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#52+
+  #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#112+
+  #114#101#97#100#95#100#34#32#116#121#112#101#32#117#98#121#116#101#32#111+
+  #102#102#115#101#116#32#49#53#32#119#114#105#116#101#100#101#102#97#117#108+
+  #116#59#10#125#10
 ;
\ No newline at end of file
index efd7623fb842b3d8eca2bcb4756d9a9878ba418d..3e8dfecb92e18678c0d4ecf44e8ce630f685d0c6 100644 (file)
 // *** WARNING! ***
 //   regenerate this part directly from "mapdef.txt" with 'mapgen', NEVER manually change anything here!
 
-function trigMapName (): AnsiString; inline;
-function trigTargetPoint (): TDFPoint; inline;
-function trigd2d_teleport (): Boolean; inline;
-function trigsilent_teleport (): Boolean; inline;
-function trigTlpDir (): Byte; inline;
-function trigNoSound (): Boolean; inline;
-function trigd2d_doors (): Boolean; inline;
+
+// TRIGGER_EXIT
+function trigMap (): AnsiString; inline;
+
+// TRIGGER_TELEPORT
+function trigTarget (): TDFPoint; inline;
+function trigD2d (): Boolean; inline;
+function trigSilent (): Boolean; inline;
+function trigDirection (): Byte; inline;
+
+// TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT
+
+// TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF
 function trigTX (): LongInt; inline;
 function trigTY (): LongInt; inline;
 function trigTWidth (): Word; inline;
 function trigTHeight (): Word; inline;
 function trigWait (): Word; inline;
-function trigCount (): Word; inline;
+function trigPressCount (): Word; inline;
 function trigExtRandom (): Boolean; inline;
+
+// TRIGGER_SECRET
+
+// TRIGGER_TEXTURE
 function trigActivateOnce (): Boolean; inline;
-function trigAnimOnce (): Boolean; inline;
+function trigAnimateOnce (): Boolean; inline;
+
+// TRIGGER_SOUND
 function trigSoundName (): AnsiString; inline;
 function trigVolume (): Byte; inline;
 function trigPan (): Byte; inline;
 function trigLocal (): Boolean; inline;
 function trigPlayCount (): Byte; inline;
 function trigSoundSwitch (): Boolean; inline;
-function trigMonPos (): TDFPoint; inline;
-function trigMonType (): Byte; inline;
-function trigMonHealth (): LongInt; inline;
-function trigMonDir (): Byte; inline;
-function trigMonActive (): Boolean; inline;
-function trigMonCount (): LongInt; inline;
-function trigMonEffect (): Byte; inline;
-function trigMonMax (): Word; inline;
-function trigMonDelay (): Word; inline;
-function trigMonBehav (): Byte; inline;
-function trigItemPos (): TDFPoint; inline;
-function trigItemType (): Byte; inline;
-function trigItemFalls (): Boolean; inline;
-function trigItemOnlyDM (): Boolean; inline;
+
+// TRIGGER_SPAWNMONSTER
+function trigSpawnMonsType (): Byte; inline;
+function trigHealth (): LongInt; inline;
+function trigActive (): Boolean; inline;
+function trigMonsCount (): LongInt; inline;
+function trigEffect (): Byte; inline;
+function trigMax (): Word; inline;
+function trigDelay (): Word; inline;
+function trigBehaviour (): Byte; inline;
+
+// TRIGGER_SPAWNITEM
+function trigSpawnItemType (): Byte; inline;
+function trigGravity (): Boolean; inline;
+function trigDmonly (): Boolean; inline;
 function trigItemCount (): LongInt; inline;
-function trigItemEffect (): Byte; inline;
-function trigItemMax (): Word; inline;
-function trigItemDelay (): Word; inline;
+
+// TRIGGER_MUSIC
 function trigMusicName (): AnsiString; inline;
 function trigMusicAction (): Byte; inline;
-function trigPushAngle (): Word; inline;
-function trigPushForce (): Byte; inline;
-function trigResetVel (): Boolean; inline;
+
+// TRIGGER_PUSH
+function trigAngle (): Word; inline;
+function trigForce (): Byte; inline;
+function trigResetVelocity (): Boolean; inline;
+
+// TRIGGER_SCORE
 function trigScoreAction (): Byte; inline;
 function trigScoreCount (): Byte; inline;
 function trigScoreTeam (): Byte; inline;
 function trigScoreCon (): Boolean; inline;
 function trigScoreMsg (): Boolean; inline;
-function trigMessageKind (): Byte; inline;
-function trigMessageSendTo (): Byte; inline;
-function trigMessageText (): AnsiString; inline;
-function trigMessageTime (): Word; inline;
-function trigDamageValue (): Word; inline;
-function trigDamageInterval (): Word; inline;
-function trigHealValue (): Word; inline;
-function trigHealInterval (): Word; inline;
+
+// TRIGGER_MESSAGE
+function trigKind (): Byte; inline;
+function trigMsgDest (): Byte; inline;
+function trigText (): AnsiString; inline;
+function trigMsgTime (): Word; inline;
+
+// TRIGGER_DAMAGE
+function trigAmount (): Word; inline;
+function trigInterval (): Word; inline;
+
+// TRIGGER_HEALTH
 function trigHealMax (): Boolean; inline;
-function trigHealSilent (): Boolean; inline;
-function trigShotPos (): TDFPoint; inline;
+
+// TRIGGER_SHOT
 function trigShotType (): Byte; inline;
 function trigShotTarget (): Byte; inline;
-function trigShotSound (): Boolean; inline;
-function trigShotAim (): SmallInt; inline;
-function trigShotIntSight (): Word; inline;
-function trigShotAngle (): Word; inline;
-function trigShotWait (): Word; inline;
-function trigShotAccuracy (): Word; inline;
-function trigShotAmmo (): Word; inline;
-function trigShotIntReload (): Word; inline;
+function trigQuiet (): Boolean; inline;
+function trigAim (): SmallInt; inline;
+function trigSight (): Word; inline;
+function trigAccuracy (): Word; inline;
+function trigAmmo (): Word; inline;
+function trigReload (): Word; inline;
+
+// TRIGGER_EFFECT
 function trigFXCount (): Byte; inline;
 function trigFXType (): Byte; inline;
 function trigFXSubType (): Byte; inline;
-function trigFXColorR (): Byte; inline;
-function trigFXColorG (): Byte; inline;
-function trigFXColorB (): Byte; inline;
+function trigFXRed (): Byte; inline;
+function trigFXGreen (): Byte; inline;
+function trigFXBlue (): Byte; inline;
 function trigFXPos (): Byte; inline;
-function trigFXWait (): Word; inline;
-function trigFXVelX (): SmallInt; inline;
-function trigFXVelY (): SmallInt; inline;
-function trigFXSpreadL (): Byte; inline;
-function trigFXSpreadR (): Byte; inline;
-function trigFXSpreadU (): Byte; inline;
-function trigFXSpreadD (): Byte; inline;
+function trigVelX (): SmallInt; inline;
+function trigVelY (): SmallInt; inline;
+function trigSpreadL (): Byte; inline;
+function trigSpreadR (): Byte; inline;
+function trigSpreadU (): Byte; inline;
+function trigSpreadD (): Byte; inline;
index f491dbf3686c71e138fcc8ac56b40e36e3746189..25281132013dedf705dcb5e17e123749fd983254 100644 (file)
@@ -4,17 +4,15 @@
 // trigger helpers
 
 // TRIGGER_EXIT
-function TDynRecordHelper.trigMapName (): AnsiString; inline; begin result := utf2win(getFieldWithType('map', TDynField.TType.TChar).sval); end;
+function TDynRecordHelper.trigMap (): AnsiString; inline; begin result := utf2win(getFieldWithType('map', TDynField.TType.TChar).sval); end;
 
 // TRIGGER_TELEPORT
-function TDynRecordHelper.trigTargetPoint (): TDFPoint; inline; begin result := getPointField('target'); end;
-function TDynRecordHelper.trigd2d_teleport (): Boolean; inline; begin result := (getFieldWithType('d2d', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigsilent_teleport (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getFieldWithType('direction', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigTarget (): TDFPoint; inline; begin result := getPointField('target'); end;
+function TDynRecordHelper.trigD2d (): Boolean; inline; begin result := (getFieldWithType('d2d', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigSilent (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigDirection (): Byte; inline; begin result := Byte(getFieldWithType('direction', TDynField.TType.TUByte).ival); end;
 
 // TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT
-function TDynRecordHelper.trigNoSound (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigd2d_doors (): Boolean; inline; begin result := (getFieldWithType('d2d', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF
 function TDynRecordHelper.trigTX (): LongInt; inline; begin result := LongInt(getFieldWithType('position', TDynField.TType.TPoint).ival); end;
@@ -22,53 +20,47 @@ function TDynRecordHelper.trigTY (): LongInt; inline; begin result := LongInt(ge
 function TDynRecordHelper.trigTWidth (): Word; inline; begin result := Word(getFieldWithType('size', TDynField.TType.TSize).ival); end;
 function TDynRecordHelper.trigTHeight (): Word; inline; begin result := Word(getFieldWithType('size', TDynField.TType.TSize).ival2); end;
 function TDynRecordHelper.trigWait (): Word; inline; begin result := Word(getFieldWithType('wait', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigCount (): Word; inline; begin result := Word(getFieldWithType('count', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigExtRandom (): Boolean; inline; begin result := (getFieldWithType('extrandom', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigPressCount (): Word; inline; begin result := Word(getFieldWithType('count', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigExtRandom (): Boolean; inline; begin result := (getFieldWithType('ext_random', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_SECRET
 
 // TRIGGER_TEXTURE
-function TDynRecordHelper.trigActivateOnce (): Boolean; inline; begin result := (getFieldWithType('activateonce', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigAnimOnce (): Boolean; inline; begin result := (getFieldWithType('animateonce', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigActivateOnce (): Boolean; inline; begin result := (getFieldWithType('activate_once', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigAnimateOnce (): Boolean; inline; begin result := (getFieldWithType('animate_once', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_SOUND
-function TDynRecordHelper.trigSoundName (): AnsiString; inline; begin result := utf2win(getFieldWithType('soundname', TDynField.TType.TChar).sval); end;
+function TDynRecordHelper.trigSoundName (): AnsiString; inline; begin result := utf2win(getFieldWithType('sound_name', TDynField.TType.TChar).sval); end;
 function TDynRecordHelper.trigVolume (): Byte; inline; begin result := Byte(getFieldWithType('volume', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.trigPan (): Byte; inline; begin result := Byte(getFieldWithType('pan', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.trigLocal (): Boolean; inline; begin result := (getFieldWithType('local', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigPlayCount (): Byte; inline; begin result := Byte(getFieldWithType('playcount', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigSoundSwitch (): Boolean; inline; begin result := (getFieldWithType('soundswitch', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigPlayCount (): Byte; inline; begin result := Byte(getFieldWithType('play_count', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigSoundSwitch (): Boolean; inline; begin result := (getFieldWithType('sound_switch', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_SPAWNMONSTER
-function TDynRecordHelper.trigMonPos (): TDFPoint; inline; begin result := getPointField('position'); end;
-function TDynRecordHelper.trigMonType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigMonHealth (): LongInt; inline; begin result := LongInt(getFieldWithType('health', TDynField.TType.TInt).ival); end;
-function TDynRecordHelper.trigMonDir (): Byte; inline; begin result := Byte(getFieldWithType('direction', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigMonActive (): Boolean; inline; begin result := (getFieldWithType('active', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigMonCount (): LongInt; inline; begin result := LongInt(getFieldWithType('count', TDynField.TType.TInt).ival); end;
-function TDynRecordHelper.trigMonEffect (): Byte; inline; begin result := Byte(getFieldWithType('effect', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigMonMax (): Word; inline; begin result := Word(getFieldWithType('max', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigMonDelay (): Word; inline; begin result := Word(getFieldWithType('delay', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigMonBehav (): Byte; inline; begin result := Byte(getFieldWithType('behaviour', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigSpawnMonsType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigHealth (): LongInt; inline; begin result := LongInt(getFieldWithType('health', TDynField.TType.TInt).ival); end;
+function TDynRecordHelper.trigActive (): Boolean; inline; begin result := (getFieldWithType('active', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigMonsCount (): LongInt; inline; begin result := LongInt(getFieldWithType('count', TDynField.TType.TInt).ival); end;
+function TDynRecordHelper.trigEffect (): Byte; inline; begin result := Byte(getFieldWithType('effect', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigMax (): Word; inline; begin result := Word(getFieldWithType('max', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigDelay (): Word; inline; begin result := Word(getFieldWithType('delay', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigBehaviour (): Byte; inline; begin result := Byte(getFieldWithType('behaviour', TDynField.TType.TUByte).ival); end;
 
 // TRIGGER_SPAWNITEM
-function TDynRecordHelper.trigItemPos (): TDFPoint; inline; begin result := getPointField('position'); end;
-function TDynRecordHelper.trigItemType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigItemFalls (): Boolean; inline; begin result := (getFieldWithType('gravity', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigItemOnlyDM (): Boolean; inline; begin result := (getFieldWithType('dmonly', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigSpawnItemType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigGravity (): Boolean; inline; begin result := (getFieldWithType('gravity', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigDmonly (): Boolean; inline; begin result := (getFieldWithType('dmonly', TDynField.TType.TBool).ival <> 0); end;
 function TDynRecordHelper.trigItemCount (): LongInt; inline; begin result := LongInt(getFieldWithType('count', TDynField.TType.TInt).ival); end;
-function TDynRecordHelper.trigItemEffect (): Byte; inline; begin result := Byte(getFieldWithType('effect', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigItemMax (): Word; inline; begin result := Word(getFieldWithType('max', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigItemDelay (): Word; inline; begin result := Word(getFieldWithType('delay', TDynField.TType.TUShort).ival); end;
 
 // TRIGGER_MUSIC
 function TDynRecordHelper.trigMusicName (): AnsiString; inline; begin result := utf2win(getFieldWithType('name', TDynField.TType.TChar).sval); end;
 function TDynRecordHelper.trigMusicAction (): Byte; inline; begin result := Byte(getFieldWithType('action', TDynField.TType.TUByte).ival); end;
 
 // TRIGGER_PUSH
-function TDynRecordHelper.trigPushAngle (): Word; inline; begin result := Word(getFieldWithType('angle', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigPushForce (): Byte; inline; begin result := Byte(getFieldWithType('force', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigResetVel (): Boolean; inline; begin result := (getFieldWithType('resetvelocity', TDynField.TType.TBool).ival <> 0); end;
+function TDynRecordHelper.trigAngle (): Word; inline; begin result := Word(getFieldWithType('angle', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigForce (): Byte; inline; begin result := Byte(getFieldWithType('force', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigResetVelocity (): Boolean; inline; begin result := (getFieldWithType('reset_velocity', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_SCORE
 function TDynRecordHelper.trigScoreAction (): Byte; inline; begin result := Byte(getFieldWithType('action', TDynField.TType.TUByte).ival); end;
@@ -78,46 +70,39 @@ function TDynRecordHelper.trigScoreCon (): Boolean; inline; begin result := (get
 function TDynRecordHelper.trigScoreMsg (): Boolean; inline; begin result := (getFieldWithType('message', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_MESSAGE
-function TDynRecordHelper.trigMessageKind (): Byte; inline; begin result := Byte(getFieldWithType('kind', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigMessageSendTo (): Byte; inline; begin result := Byte(getFieldWithType('sendto', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigMessageText (): AnsiString; inline; begin result := utf2win(getFieldWithType('text', TDynField.TType.TChar).sval); end;
-function TDynRecordHelper.trigMessageTime (): Word; inline; begin result := Word(getFieldWithType('time', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigKind (): Byte; inline; begin result := Byte(getFieldWithType('kind', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigMsgDest (): Byte; inline; begin result := Byte(getFieldWithType('dest', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigText (): AnsiString; inline; begin result := utf2win(getFieldWithType('text', TDynField.TType.TChar).sval); end;
+function TDynRecordHelper.trigMsgTime (): Word; inline; begin result := Word(getFieldWithType('time', TDynField.TType.TUShort).ival); end;
 
 // TRIGGER_DAMAGE
-function TDynRecordHelper.trigDamageValue (): Word; inline; begin result := Word(getFieldWithType('amount', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigDamageInterval (): Word; inline; begin result := Word(getFieldWithType('interval', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigAmount (): Word; inline; begin result := Word(getFieldWithType('amount', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigInterval (): Word; inline; begin result := Word(getFieldWithType('interval', TDynField.TType.TUShort).ival); end;
 
 // TRIGGER_HEALTH
-function TDynRecordHelper.trigHealValue (): Word; inline; begin result := Word(getFieldWithType('amount', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigHealInterval (): Word; inline; begin result := Word(getFieldWithType('interval', TDynField.TType.TUShort).ival); end;
 function TDynRecordHelper.trigHealMax (): Boolean; inline; begin result := (getFieldWithType('max', TDynField.TType.TBool).ival <> 0); end;
-function TDynRecordHelper.trigHealSilent (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end;
 
 // TRIGGER_SHOT
-function TDynRecordHelper.trigShotPos (): TDFPoint; inline; begin result := getPointField('position'); end;
 function TDynRecordHelper.trigShotType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.trigShotTarget (): Byte; inline; begin result := Byte(getFieldWithType('target', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigShotSound (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival = 0); end;
-function TDynRecordHelper.trigShotAim (): SmallInt; inline; begin result := ShortInt(getFieldWithType('aim', TDynField.TType.TByte).ival); end;
-function TDynRecordHelper.trigShotIntSight (): Word; inline; begin result := Word(getFieldWithType('sight', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigShotAngle (): Word; inline; begin result := Word(getFieldWithType('angle', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigShotWait (): Word; inline; begin result := Word(getFieldWithType('wait', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigShotAccuracy (): Word; inline; begin result := Word(getFieldWithType('accuracy', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigShotAmmo (): Word; inline; begin result := Word(getFieldWithType('ammo', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigShotIntReload (): Word; inline; begin result := Word(getFieldWithType('reload', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigQuiet (): Boolean; inline; begin result := (getFieldWithType('quiet', TDynField.TType.TBool).ival = 0); end;
+function TDynRecordHelper.trigAim (): SmallInt; inline; begin result := ShortInt(getFieldWithType('aim', TDynField.TType.TByte).ival); end;
+function TDynRecordHelper.trigSight (): Word; inline; begin result := Word(getFieldWithType('sight', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigAccuracy (): Word; inline; begin result := Word(getFieldWithType('accuracy', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigAmmo (): Word; inline; begin result := Word(getFieldWithType('ammo', TDynField.TType.TUShort).ival); end;
+function TDynRecordHelper.trigReload (): Word; inline; begin result := Word(getFieldWithType('reload', TDynField.TType.TUShort).ival); end;
 
 // TRIGGER_EFFECT
 function TDynRecordHelper.trigFXCount (): Byte; inline; begin result := Byte(getFieldWithType('count', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.trigFXType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end;
 function TDynRecordHelper.trigFXSubType (): Byte; inline; begin result := Byte(getFieldWithType('subtype', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXColorR (): Byte; inline; begin result := Byte(getFieldWithType('colorr', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXColorG (): Byte; inline; begin result := Byte(getFieldWithType('colorg', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXColorB (): Byte; inline; begin result := Byte(getFieldWithType('colorb', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXPos (): Byte; inline; begin result := Byte(getFieldWithType('position', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXWait (): Word; inline; begin result := Word(getFieldWithType('wait', TDynField.TType.TUShort).ival); end;
-function TDynRecordHelper.trigFXVelX (): SmallInt; inline; begin result := ShortInt(getFieldWithType('velx', TDynField.TType.TByte).ival); end;
-function TDynRecordHelper.trigFXVelY (): SmallInt; inline; begin result := ShortInt(getFieldWithType('vely', TDynField.TType.TByte).ival); end;
-function TDynRecordHelper.trigFXSpreadL (): Byte; inline; begin result := Byte(getFieldWithType('spreadl', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXSpreadR (): Byte; inline; begin result := Byte(getFieldWithType('spreadr', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXSpreadU (): Byte; inline; begin result := Byte(getFieldWithType('spreadu', TDynField.TType.TUByte).ival); end;
-function TDynRecordHelper.trigFXSpreadD (): Byte; inline; begin result := Byte(getFieldWithType('spreadd', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigFXRed (): Byte; inline; begin result := Byte(getFieldWithType('red', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigFXGreen (): Byte; inline; begin result := Byte(getFieldWithType('green', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigFXBlue (): Byte; inline; begin result := Byte(getFieldWithType('blue', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigFXPos (): Byte; inline; begin result := Byte(getFieldWithType('pos', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigVelX (): SmallInt; inline; begin result := ShortInt(getFieldWithType('vel_x', TDynField.TType.TByte).ival); end;
+function TDynRecordHelper.trigVelY (): SmallInt; inline; begin result := ShortInt(getFieldWithType('vel_y', TDynField.TType.TByte).ival); end;
+function TDynRecordHelper.trigSpreadL (): Byte; inline; begin result := Byte(getFieldWithType('spread_l', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigSpreadR (): Byte; inline; begin result := Byte(getFieldWithType('spread_r', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigSpreadU (): Byte; inline; begin result := Byte(getFieldWithType('spread_u', TDynField.TType.TUByte).ival); end;
+function TDynRecordHelper.trigSpreadD (): Byte; inline; begin result := Byte(getFieldWithType('spread_d', TDynField.TType.TUByte).ival); end;
index fe9c5616f346c30fe79c9ba24b19193763a9e9c2..3bce723917354b4ad0e119cf92edcba521f42e2d 100644 (file)
@@ -44,17 +44,16 @@ type
       // TSize: pair of UShorts
       // TList: actually, array of records
       // TTrigData: array of mMaxDim bytes, but internally a record (mRecRef)
-      // arrays of chars are pascal shortstrings (with counter in the first byte)
+      // in binary: arrays of chars are pascal shortstrings (with counter in the first byte)
 
   private
     type
       TEBS = (TNone, TRec, TEnum, TBitSet);
 
   private
-    mOwner: TDynRecord;
-    mPasName: AnsiString;
-    mName: AnsiString;
-    mType: TType;
+    mOwner: TDynRecord; // owner record
+    mName: AnsiString; // field name
+    mType: TType; // field type
     mIVal: Integer; // for all integer types
     mIVal2: Integer; // for point and size
     mSVal: AnsiString; // string; for byte and char arrays
@@ -67,7 +66,7 @@ type
     mAsT: Boolean; // for points and sizes, use separate fields, names starts with `t`
     mDefined: Boolean;
     mHasDefault: Boolean;
-    mOmitDef: Boolean;
+    mWriteDef: Boolean;
     mInternal: Boolean;
     mNegBool: Boolean;
     mBitSetUnique: Boolean; // bitset can contain only one value
@@ -88,6 +87,9 @@ type
     mTagInt: Integer;
     mTagPtr: Pointer;
 
+    // for pasgen
+    mAlias: AnsiString;
+
   private
     procedure cleanup ();
 
@@ -120,8 +122,10 @@ type
 
     class function getTypeName (t: TType): AnsiString;
 
+    // build "alias name" for pascal code
+    function palias (firstUp: Boolean=false): AnsiString;
+
     function definition (): AnsiString;
-    function pasdef (): AnsiString;
 
     function clone (newOwner: TDynRecord=nil; registerIn: TDynRecord=nil): TDynField;
 
@@ -139,7 +143,6 @@ type
     function GetEnumerator (): TDynRecList.TEnumerator; inline;
 
   public
-    property pasname: AnsiString read mPasName;
     property name: AnsiString read mName;
     property baseType: TType read mType;
     property negbool: Boolean read mNegBool;
@@ -175,7 +178,6 @@ type
   private
     mOwner: TDynMapDef;
     mId: AnsiString;
-    mPasName: AnsiString;
     mName: AnsiString;
     mSize: Integer;
     mFields: TDynFieldList;
@@ -224,7 +226,6 @@ type
     destructor Destroy (); override;
 
     function definition (): AnsiString;
-    function pasdef (): AnsiString;
 
     function clone (registerIn: TDynRecord): TDynRecord;
 
@@ -242,16 +243,11 @@ type
     // number of records of the given instance
     function instanceCount (const typename: AnsiString): Integer;
 
-    //procedure setUserField (const fldname: AnsiString; v: LongInt);
-    //procedure setUserField (const fldname: AnsiString; v: AnsiString);
-    //procedure setUserField (const fldname: AnsiString; v: Boolean);
-
     function getUserVar (const aname: AnsiString): Variant;
     procedure setUserVar (const aname: AnsiString; val: Variant);
 
   public
     property id: AnsiString read mId; // for map parser
-    property pasname: AnsiString read mPasName;
     property name: AnsiString read mName; // record name
     property size: Integer read mSize; // size in bytes
     //property fields: TDynFieldList read mFields;
@@ -331,7 +327,6 @@ type
     function findTrigFor (const aname: AnsiString): TDynRecord;
     function findEBSType (const aname: AnsiString): TDynEBS;
 
-    function pasdef (): AnsiString;
     function pasdefconst (): AnsiString;
 
     // creates new header record
@@ -486,7 +481,7 @@ begin
   mAsT := false;
   mHasDefault := false;
   mDefined := false;
-  mOmitDef := false;
+  mWriteDef := false;
   mInternal := true;
   mDefUnparsed := '';
   mDefSVal := '';
@@ -502,6 +497,7 @@ begin
   mRecRefId := '';
   mTagInt := 0;
   mTagPtr := nil;
+  mAlias := '';
 end;
 
 
@@ -512,7 +508,6 @@ begin
   result := TDynField.Create(mName, mType);
   result.mOwner := mOwner;
   if (newOwner <> nil) then result.mOwner := newOwner else result.mOwner := mOwner;
-  result.mPasName := mPasName;
   result.mName := mName;
   result.mType := mType;
   result.mIVal := mIVal;
@@ -531,7 +526,7 @@ begin
   result.mAsT := mAsT;
   result.mDefined := mDefined;
   result.mHasDefault := mHasDefault;
-  result.mOmitDef := mOmitDef;
+  result.mWriteDef := mWriteDef;
   result.mInternal := mInternal;
   result.mNegBool := mNegBool;
   result.mBitSetUnique := mBitSetUnique;
@@ -547,6 +542,30 @@ begin
   result.mRecRefId := mRecRefId;
   result.mTagInt := mTagInt;
   result.mTagPtr := mTagPtr;
+  result.mAlias := mAlias;
+end;
+
+
+function TDynField.palias (firstUp: Boolean=false): AnsiString;
+var
+  nextUp: Boolean;
+  ch: AnsiChar;
+begin
+  if (Length(mAlias) > 0) then
+  begin
+    if firstUp then result := UpCase1251(mAlias[1])+Copy(mAlias, 2, Length(mAlias)-1) else result := mAlias;
+  end
+  else
+  begin
+    result := '';
+    nextUp := firstUp;
+    for ch in mName do
+    begin
+      if (ch = '_') then begin nextUp := true; continue; end;
+      if nextUp then result += UpCase1251(ch) else result += ch;
+      nextUp := false;
+    end;
+  end;
 end;
 
 
@@ -838,8 +857,9 @@ end;
 
 function TDynField.definition (): AnsiString;
 begin
-  result := mPasName+' is '+quoteStr(mName)+' type ';
+  result := quoteStr(mName)+' type ';
   result += getTypeName(mType);
+  if (Length(mAlias) > 0) then result += ' alias '+mAlias;
   if (mMaxDim >= 0) then result += Format('[%d]', [mMaxDim]);
   if (mBinOfs >= 0) then result += Format(' offset %d', [mBinOfs]);
   case mEBS of
@@ -855,49 +875,20 @@ begin
          if (mType = TType.TPoint) then begin if (mAsT) then result += ' as txy' else result += ' as xy'; end
     else if (mType = TType.TSize) then begin if (mAsT) then result += ' as twh' else result += ' as wh'; end;
   end;
-  if mOmitDef then result += ' omitdefault';
+  if mWriteDef then result += ' writedefault';
   if mInternal then result += ' internal';
 end;
 
 
-function TDynField.pasdef (): AnsiString;
-begin
-  result := mPasName+': ';
-  case mType of
-    TType.TBool: result += 'Boolean;';
-    TType.TChar: if (mMaxDim > 0) then result += formatstrf('Char%d;', [mMaxDim]) else result += 'Char;';
-    TType.TByte: result += 'ShortInt;';
-    TType.TUByte: result += 'Byte;';
-    TType.TShort: result += 'SmallInt;';
-    TType.TUShort: result += 'Word;';
-    TType.TInt: result += 'LongInt;';
-    TType.TUInt: result += 'LongWord;';
-    TType.TString: result += 'AnsiString;';
-    TType.TPoint:
-           if mAsT then result := 'tX, tY: Integer;'
-      else if mSepPosSize then result := 'X, Y: Integer;'
-      else result += 'TDFPoint;';
-    TType.TSize:
-           if mAsT then result := 'tWidth, tHeight: Word;'
-      else if mSepPosSize then result := 'Width, Height: Word;'
-      else result += 'TSize;';
-    TType.TList: assert(false);
-    TType.TTrigData: result += formatstrf('Byte%d;', [mMaxDim]);
-    else raise Exception.Create('ketmar forgot to handle some field type');
-  end;
-end;
-
-
 procedure TDynField.parseDef (pr: TTextParser);
 var
   fldname: AnsiString;
   fldtype: AnsiString;
   fldofs: Integer;
   fldrecname: AnsiString;
-  fldpasname: AnsiString;
   asxy, aswh, ast: Boolean;
   ainternal: Boolean;
-  omitdef: Boolean;
+  writedef: Boolean;
   defstr: AnsiString;
   defint, defint2: Integer;
   hasdefStr: Boolean;
@@ -908,8 +899,8 @@ var
   unique: Boolean;
   asmonid: Boolean;
   defech: AnsiChar;
+  xalias: AnsiString;
 begin
-  fldpasname := '';
   fldname := '';
   fldtype := '';
   fldofs := -1;
@@ -918,7 +909,7 @@ begin
   aswh := false;
   ast := false;
   ainternal := false;
-  omitdef := false;
+  writedef := false;
   defstr := '';
   defint := 0;
   defint2 := 0;
@@ -929,25 +920,36 @@ begin
   asmonid := false;
   lmaxdim := -1;
   lebs := TDynField.TEBS.TNone;
+  xalias := '';
 
-  fldpasname := pr.expectId(); // pascal field name
   // field name
-  pr.expectId('is');
-  fldname := pr.expectStr();
-  // field type
-  pr.expectId('type');
-  fldtype := pr.expectId();
-
-  // fixed-size array?
-  if pr.eatDelim('[') then
-  begin
-    lmaxdim := pr.expectInt();
-    if (lmaxdim < 1) then raise Exception.Create(Format('invalid field ''%s'' array size', [fldname]));
-    pr.expectDelim(']');
-  end;
+  fldname := pr.expectStrOrId();
 
   while (pr.tokType <> pr.TTSemi) do
   begin
+    if pr.eatId('type') then
+    begin
+      if (Length(fldtype) > 0) then raise Exception.Create(Format('duplicate type definition for field ''%s''', [fldname]));
+      // field type
+      fldtype := pr.expectId();
+      // fixed-size array?
+      if pr.eatDelim('[') then
+      begin
+        lmaxdim := pr.expectInt();
+        // arbitrary limits
+        if (lmaxdim < 1) or (lmaxdim > 32768) then raise Exception.Create(Format('invalid field ''%s'' array size', [fldname]));
+        pr.expectDelim(']');
+      end;
+      continue;
+    end;
+
+    if pr.eatId('alias') then
+    begin
+      if (Length(xalias) > 0) then raise Exception.Create(Format('duplicate alias definition for field ''%s''', [fldname]));
+      xalias := pr.expectId();
+      continue;
+    end;
+
     if pr.eatId('offset') then
     begin
       if (fldofs >= 0) then raise Exception.Create(Format('duplicate field ''%s'' offset', [fldname]));
@@ -1017,9 +1019,9 @@ begin
       continue;
     end;
 
-    if pr.eatId('omitdefault') then
+    if pr.eatId('writedefault') then
     begin
-      omitdef := true;
+      writedef := true;
       continue;
     end;
 
@@ -1029,6 +1031,7 @@ begin
       continue;
     end;
 
+    // record type, no special modifiers
     if (pr.tokType <> pr.TTId) then raise Exception.Create(Format('field ''%s'' has something unexpected in definition', [fldname]));
 
     if (Length(fldrecname) <> 0) then raise Exception.Create(Format('field ''%s'' already typed as ''%s''', [fldname, fldrecname]));
@@ -1053,16 +1056,41 @@ begin
   else if (fldtype = 'point') then mType := TType.TPoint
   else if (fldtype = 'size') then mType := TType.TSize
   else if (fldtype = 'trigdata') then mType := TType.TTrigData
-  else raise Exception.Create(Format('field ''%s'' has invalid type ''%s''', [fldname, fldtype]));
+  else
+  begin
+    // record types defaults to int
+    if (Length(fldrecname) > 0) then
+    begin
+      mType := TType.TInt;
+    end
+    else
+    begin
+      if (Length(fldtype) = 0) then raise Exception.Create(Format('field ''%s'' has no type', [fldname]))
+      else raise Exception.Create(Format('field ''%s'' has invalid type ''%s''', [fldname, fldtype]));
+    end;
+  end;
 
+  // check for valid arrays
   if (lmaxdim > 0) and (mType <> TType.TChar) and (mType <> TType.TTrigData) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be array', [fldname, fldtype]));
+
+  // check for valid trigdata or record type
   if (mType = TType.TTrigData) then
   begin
-    if (lmaxdim < 1) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be array', [fldname, fldtype]));
-    if (Length(fldrecname) > 0) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot have another type', [fldname, fldtype]));
+    // trigdata
+    if (lmaxdim < 1) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be non-array', [fldname, 'trigdata']));
+    if (Length(fldrecname) > 0) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot have another type', [fldname, 'trigdata']));
     lebs := TDynField.TEBS.TRec;
+  end
+  else if (Length(fldrecname) > 0) then
+  begin
+    // record
+    if not (mType in [TType.TByte, TType.TUByte, TType.TShort, TType.TUShort, TType.TInt, TType.TUInt]) then
+    begin
+      raise Exception.Create(Format('field ''%s'' of record type ''%s'' cannot have type ''%s''', [fldname, fldrecname, fldtype]));
+    end;
   end;
 
+  // setup default value
        if hasdefStr then self.mDefUnparsed := quoteStr(defstr)
   else if hasdefId then self.mDefUnparsed := defstr
   else if hasdefInt then
@@ -1073,7 +1101,6 @@ begin
   end;
 
   self.mHasDefault := (hasdefStr or hasdefId or hasdefInt);
-  self.mPasName := fldpasname;
   self.mEBS := lebs;
   self.mEBSTypeName := fldrecname;
   self.mBitSetUnique := unique;
@@ -1082,8 +1109,9 @@ begin
   self.mBinOfs := fldofs;
   self.mSepPosSize := (asxy or aswh);
   self.mAsT := ast;
-  self.mOmitDef := omitdef;
+  self.mWriteDef := writedef;
   self.mInternal := ainternal;
+  self.mAlias := xalias;
 end;
 
 
@@ -2009,7 +2037,6 @@ begin
   result := TDynRecord.Create();
   result.mOwner := mOwner;
   result.mId := mId;
-  result.mPasName := mPasName;
   result.mName := mName;
   result.mSize := mSize;
   result.mHeader := mHeader;
@@ -2197,9 +2224,7 @@ begin
   end
   else
   begin
-    mPasName := pr.expectId(); // pascal record name
-    pr.expectId('is');
-    mName := pr.expectStr();
+    mName := pr.expectStrOrId();
     while (pr.tokType <> pr.TTBegin) do
     begin
       if pr.eatId('header') then begin mHeader := true; continue; end;
@@ -2240,30 +2265,6 @@ begin
 end;
 
 
-function TDynRecord.pasdef (): AnsiString;
-var
-  fld: TDynField;
-begin
-  if isTrigData then
-  begin
-    assert(false);
-    result := '';
-  end
-  else
-  begin
-    // record
-    result := '  '+mPasName+' = packed record'#10;
-  end;
-  for fld in mFields do
-  begin
-    if fld.mInternal then continue;
-    if (fld.mBinOfs < 0) then continue;
-    result += '    '+fld.pasdef+#10;
-  end;
-  result += '  end;'#10;
-end;
-
-
 function TDynRecord.definition (): AnsiString;
 var
   f: Integer;
@@ -2290,7 +2291,7 @@ begin
   else
   begin
     // record
-    result := mPasName+' is '+quoteStr(mName);
+    result := quoteStr(mName);
     if (mSize >= 0) then result += Format(' size %d bytes', [mSize]);
     if mHeader then result += ' header';
   end;
@@ -2588,7 +2589,7 @@ begin
         continue;
       end;
       if fld.mInternal then continue;
-      if fld.mOmitDef and fld.isDefaultValue then continue;
+      if (not fld.mWriteDef) and fld.isDefaultValue then continue;
       wr.putIndent();
       fld.writeTo(wr);
     end;
@@ -3078,37 +3079,41 @@ begin
   while true do
   begin
     if not pr.skipBlanks() then break;
-    if (pr.tokType <> pr.TTId) then raise Exception.Create('identifier expected');
 
-    if (pr.tokStr = 'enum') or (pr.tokStr = 'bitset') then
+    if (pr.tokType = pr.TTId) then
     begin
-      eb := TDynEBS.Create(pr);
-      if (findEBSType(eb.name) <> nil) then
+      // enum or bitset
+      if (pr.tokStr = 'enum') or (pr.tokStr = 'bitset') then
       begin
-        eb.Free();
-        raise Exception.Create(Format('duplicate enum/bitset ''%s''', [eb.name]));
+        eb := TDynEBS.Create(pr);
+        if (findEBSType(eb.name) <> nil) then
+        begin
+          eb.Free();
+          raise Exception.Create(Format('duplicate enum/bitset ''%s''', [eb.name]));
+        end;
+        eb.mOwner := self;
+        ebsTypes.append(eb);
+        //writeln(eb.definition); writeln;
+        continue;
       end;
-      eb.mOwner := self;
-      ebsTypes.append(eb);
-      //writeln(eb.definition); writeln;
-      continue;
-    end;
 
-    if (pr.tokStr = 'TriggerData') then
-    begin
-      rec := TDynRecord.Create(pr);
-      for f := 0 to High(rec.mTrigTypes) do
+      // triggerdata
+      if (pr.tokStr = 'TriggerData') then
       begin
-        if (findTrigFor(rec.mTrigTypes[f]) <> nil) then
+        rec := TDynRecord.Create(pr);
+        for f := 0 to High(rec.mTrigTypes) do
         begin
-          rec.Free();
-          raise Exception.Create(Format('duplicate trigdata ''%s''', [rec.mTrigTypes[f]]));
+          if (findTrigFor(rec.mTrigTypes[f]) <> nil) then
+          begin
+            rec.Free();
+            raise Exception.Create(Format('duplicate trigdata ''%s''', [rec.mTrigTypes[f]]));
+          end;
         end;
+        rec.mOwner := self;
+        trigTypes.append(rec);
+        //writeln(dr.definition); writeln;
+        continue;
       end;
-      rec.mOwner := self;
-      trigTypes.append(rec);
-      //writeln(dr.definition); writeln;
-      continue;
     end;
 
     rec := TDynRecord.Create(pr);
@@ -3147,7 +3152,6 @@ end;
 function TDynMapDef.parseMap (pr: TTextParser): TDynRecord;
 var
   res: TDynRecord = nil;
-  //fo: TextFile;
 begin
   result := nil;
   try
@@ -3159,17 +3163,6 @@ begin
     res := nil;
   finally
     res.Free();
-  {
-  except on e: Exception do
-    begin
-      //TMP:segfaults!
-      AssignFile(fo, 'z.log');
-      Rewrite(fo);
-      DumpExceptionBackTrace(fo);
-      CloseFile(fo);
-      res.Free();
-    end;
-  }
   end;
 end;
 
@@ -3191,53 +3184,6 @@ begin
 end;
 
 
-function TDynMapDef.pasdef (): AnsiString;
-var
-  ebs: TDynEBS;
-  rec: TDynRecord;
-  fld: TDynField;
-  needComma: Boolean;
-  tn: AnsiString;
-begin
-  result := '';
-  result += '// ////////////////////////////////////////////////////////////////////////// //'#10;
-  result += '// enums and bitsets'#10;
-  for ebs in ebsTypes do result += #10+ebs.pasdef();
-  result += #10#10'// ////////////////////////////////////////////////////////////////////////// //'#10;
-  result += '// records'#10'type'#10;
-  for rec in recTypes do
-  begin
-    if (rec.mSize < 1) then continue;
-    result += rec.pasdef();
-    result += #10;
-  end;
-  result += #10#10'// ////////////////////////////////////////////////////////////////////////// //'#10;
-  result += '// triggerdata'#10'type'#10;
-  result += '  TTriggerData = record'#10;
-  result += '    case Byte of'#10;
-  result += '      0: (Default: Byte128);'#10;
-  for rec in trigTypes do
-  begin
-    result += '      ';
-    needComma := false;
-    for tn in rec.mTrigTypes do
-    begin
-      if needComma then result += ', ' else needComma := true;
-      result += tn;
-    end;
-    result += ': ('#10;
-    for fld in rec.mFields do
-    begin
-      if fld.mInternal then continue;
-      if (fld.mBinOfs < 0) then continue;
-      result += '        '+fld.pasdef+#10;
-    end;
-    result += '      );'#10;
-  end;
-  result += '  end;'#10;
-end;
-
-
 function TDynMapDef.pasdefconst (): AnsiString;
 var
   ebs: TDynEBS;
index 76ac3c0165483ef90d4066904540d1eef5b7a2dd..01c49b4bb1bb4e4360dd8e4c1057686e15b7c5ff 100644 (file)
@@ -75,6 +75,8 @@ type
     function expectStr (allowEmpty: Boolean=false): AnsiString;
     function expectInt (): Integer;
 
+    function expectStrOrId (allowEmpty: Boolean=false): AnsiString;
+
     procedure expectTT (ttype: Integer);
     function eatTT (ttype: Integer): Boolean;
 
@@ -544,6 +546,21 @@ begin
 end;
 
 
+function TTextParser.expectStrOrId (allowEmpty: Boolean=false): AnsiString;
+begin
+  case mTokType of
+    TTStr:
+      if (not allowEmpty) and (Length(mTokStr) = 0) then raise Exception.Create('non-empty string expected');
+    TTId:
+      begin end;
+    else
+      raise Exception.Create('string or identifier expected');
+  end;
+  result := mTokStr;
+  skipToken();
+end;
+
+
 function TTextParser.expectInt (): Integer;
 begin
   if (mTokType <> TTInt) then raise Exception.Create('string expected');
index c53aa4eb9ee22b74608b8e0d873f53c3d7df9db3..27c718306e114e612f526d1aa0831983a32952bb 100644 (file)
@@ -16,6 +16,9 @@ uses
 
 
 // ////////////////////////////////////////////////////////////////////////// //
+type
+  THashStrFld = specialize THashBase<AnsiString, TDynField>;
+
 var
   pr: TTextParser;
   dfmapdef: TDynMapDef;
@@ -28,7 +31,11 @@ var
   needComma: Boolean;
   trec: TDynRecord;
   fld: TDynField;
+  palias: AnsiString;
+  fldknown: THashStrFld = nil; // key: palias; value: prev field
+  knownfld: TDynField;
 begin
+  fldknown := THashStrFld.Create(hsihash, hsiequ);
   //writeln(getFilenamePath(ParamStr(0)), '|');
 
   e_InitWritelnDriver();
@@ -55,7 +62,7 @@ begin
     dfmapdef := TDynMapDef.Create(pr);
   except on e: Exception do
     begin
-      writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message);
+      writeln('ERROR at (', pr.tokLine, ',', pr.tokCol, '): ', e.message);
       Halt(1);
     end;
   end;
@@ -92,14 +99,18 @@ function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getF
   begin
     // header comment
     write(foimpl, #10'// ');
+    write(fohlp, #10'// ');
     needComma := false;
     trec := dfmapdef.trigType[tidx];
     for nidx := 0 to trec.forTrigCount-1 do
     begin
+      if needComma then write(fohlp, ', ');
       if needComma then write(foimpl, ', ') else needComma := true;
+      write(fohlp, trec.forTrigAt[nidx]);
       write(foimpl, trec.forTrigAt[nidx]);
     end;
     write(foimpl, #10);
+    write(fohlp, #10);
     // fields
     for fidx := 0 to trec.count-1 do
     begin
@@ -109,13 +120,26 @@ function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getF
       // HACK!
       if (fld.name = 'panelid') or (fld.name = 'monsterid') then
       begin
-        writeln('skipping ', fld.pasname, ' <', fld.name, '>');
+        writeln('skipping <', fld.name, '>');
+        continue;
+      end;
+      palias := fld.palias(true);
+      // check for known aliases
+      //writeln('<', palias, '> : <', toLowerCase1251(palias), '>');
+      knownfld := nil;
+      if fldknown.get(toLowerCase1251(palias), knownfld) then
+      begin
+        if (fld.name <> knownfld.name) then raise Exception.Create(formatstrf('field ''%s'' of record ''%s'' conflicts with other field ''%s''', [fld.name, trec.name, knownfld.name]));
+        if (fld.baseType <> knownfld.baseType) then raise Exception.Create(formatstrf('field ''%s'' of record ''%s'' conflicts with other field ''%s'' by type', [fld.name, trec.name, knownfld.name]));
+        writeln('skipped duplicate field ''', fld.name, '''');
         continue;
       end;
+      fldknown.put(toLowerCase1251(palias), fld);
+      // write it
       if (fld.baseType <> TDynField.TType.TPoint) and (fld.baseType <> TDynField.TType.TSize) then
       begin
-        write(foimpl, 'function TDynRecordHelper.trig', fld.pasname, ' (): ');
-        write(fohlp, 'function trig', fld.pasname, ' (): ');
+        write(foimpl, 'function TDynRecordHelper.trig', palias, ' (): ');
+        write(fohlp, 'function trig', palias, ' (): ');
       end;
       case fld.baseType of
         TDynField.TType.TBool:
@@ -182,8 +206,8 @@ function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getF
             end
             else
             begin
-              write(fohlp, 'function trig', fld.pasname, ' (): TDFPoint; inline;'#10);
-              write(foimpl, 'function TDynRecordHelper.trig', fld.pasname, ' (): TDFPoint; inline; begin result := getPointField(''', fld.name, '''); end;'#10);
+              write(fohlp, 'function trig', palias, ' (): TDFPoint; inline;'#10);
+              write(foimpl, 'function TDynRecordHelper.trig', palias, ' (): TDFPoint; inline; begin result := getPointField(''', fld.name, '''); end;'#10);
             end;
           end;
         TDynField.TType.TSize: